diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1cae4f957..00ecf23ad 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,13 +9,13 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: '1.25.x' + go-version: '1.26.x' cache: true cache-dependency-path: go.sum - uses: golangci/golangci-lint-action@v7 with: - version: v2.6.1 + version: v2.11.4 - name: Checking Format and Testing run: make check @@ -47,13 +47,13 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: '1.25.x' + go-version: '1.26.x' cache: true cache-dependency-path: go.sum - uses: golangci/golangci-lint-action@v7 with: - version: v2.6.1 + version: v2.11.4 - name: Checking Format and Testing run: make check @@ -68,7 +68,7 @@ jobs: - uses: actions/setup-go@v5 with: - go-version: '1.25.x' + go-version: '1.26.x' cache: true cache-dependency-path: go.sum diff --git a/Makefile b/Makefile index 452b5ee0e..91c9ca9cc 100644 --- a/Makefile +++ b/Makefile @@ -55,11 +55,7 @@ check-windows: lint test-windows ## Run linters and tests on windows lint: ## Run linters. Use make install-linters first golangci-lint version - ${OPTS} golangci-lint run -c .golangci.yml ./cmd/... - ${OPTS} golangci-lint run -c .golangci.yml ./pkg/... - ${OPTS} golangci-lint run -c .golangci.yml ./internal/... ${OPTS} golangci-lint run -c .golangci.yml ./... - ${OPTS} golangci-lint run -c .golangci.yml . vendorcheck: ## Run vendorcheck GO111MODULE=off vendorcheck ./... diff --git a/README.md b/README.md index f4534b820..cbecadde8 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ The connection between a `dmsg.Client` and `dmsg.Server` is called a `dmsg.Sessi made with [goda](https://github.com/loov/goda) ``` -goda graph github.com/skycoin/dmsg/... | dot -Tsvg -o docs/dmsg-goda-graph.svg +go run github.com/loov/goda@latest graph github.com/skycoin/dmsg/... | dot -Tsvg -o docs/dmsg-goda-graph.svg ``` ![Dependency Graph](docs/dmsg-goda-graph.svg "github.com/skycoin/dmsg Dependency Graph") diff --git a/cmd/conf/commands/root.go b/cmd/conf/commands/root.go index ad1a6492e..bf6e5d1bd 100644 --- a/cmd/conf/commands/root.go +++ b/cmd/conf/commands/root.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) // RootCmd is the root command @@ -28,7 +29,5 @@ var RootCmd = &cobra.Command{ // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dial/commands/dial.go b/cmd/dial/commands/dial.go index f7e6b13ae..1e538c6cc 100644 --- a/cmd/dial/commands/dial.go +++ b/cmd/dial/commands/dial.go @@ -4,10 +4,7 @@ package commands import ( "context" "fmt" - "log" "net/http" - "os" - "path/filepath" "strconv" "strings" "time" @@ -20,10 +17,9 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/spf13/cobra" - "github.com/skycoin/dmsg/internal/cli" - "github.com/skycoin/dmsg/internal/flags" "github.com/skycoin/dmsg/pkg/disc" "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -35,7 +31,7 @@ var ( ) func init() { - flags.InitFlags(RootCmd) + dmsgclient.InitFlags(RootCmd) RootCmd.Flags().StringVarP(&logLvl, "loglvl", "l", "info", "[ debug | warn | error | fatal | panic | trace | info ]\033[0m\n\r") RootCmd.Flags().IntVarP(&waitTime, "wait", "w", 0, "wait time in seconds before disconnecting\n\r\033[0m") RootCmd.Flags().VarP(&sk, "sk", "s", "a random key is generated if unspecified\n\r\033[0m") @@ -43,9 +39,7 @@ func init() { // RootCmd contains the root dmsgcurl command var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG Dial network test utility", Long: calvin.AsciiFont("dmsgdial") + ` DMSG Dial network test utility @@ -126,15 +120,15 @@ Default mode of operation is dmsghttp: defer cancel() var dmsgClients []*dmsg.Client - if flags.UseDC { + if dmsgclient.UseDC { dlog.Debug("Starting DMSG direct clients.") for _, server := range dmsg.Prod.DmsgServers { - if len(dmsgClients) >= flags.DmsgSessions { + if len(dmsgClients) >= dmsgclient.DmsgSessions { break } dest := dpk.String() - dmsgDC, closeFn, err := cli.StartDmsgDirectWithServers(ctx, dlog, pk, sk, "", []*disc.Entry{&server}, flags.DmsgSessions, dest) + dmsgDC, closeFn, err := dmsgclient.StartDmsgDirectWithServers(ctx, dlog, pk, sk, "", []*disc.Entry{&server}, dmsgclient.DmsgSessions, dest) if err != nil { dlog.WithError(err).Error("Failed to start DMSG direct client. Skipping server...") continue @@ -144,7 +138,7 @@ Default mode of operation is dmsghttp: dmsgClients = append(dmsgClients, dmsgDC) } } else { - dmsgC, closeDmsg, err := cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) + dmsgC, closeDmsg, err := dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) if err != nil { dlog.WithError(err).Error("Error connecting to dmsg network") return @@ -186,7 +180,5 @@ Default mode of operation is dmsghttp: // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsg-discovery/commands/dmsg-discovery.go b/cmd/dmsg-discovery/commands/dmsg-discovery.go index 59feede0d..06409dab2 100644 --- a/cmd/dmsg-discovery/commands/dmsg-discovery.go +++ b/cmd/dmsg-discovery/commands/dmsg-discovery.go @@ -3,7 +3,6 @@ package commands import ( "context" - "encoding/json" "errors" "fmt" "log" @@ -11,7 +10,6 @@ import ( "net/http" "net/http/pprof" "os" - "path/filepath" "strings" "time" @@ -23,14 +21,14 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/metricsutil" "github.com/spf13/cobra" - "github.com/tidwall/pretty" - "github.com/skycoin/dmsg/internal/discmetrics" - "github.com/skycoin/dmsg/internal/dmsg-discovery/api" - "github.com/skycoin/dmsg/internal/dmsg-discovery/store" "github.com/skycoin/dmsg/pkg/direct" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/disc/metrics" + "github.com/skycoin/dmsg/pkg/discovery/api" + "github.com/skycoin/dmsg/pkg/discovery/store" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsghttp" ) @@ -54,188 +52,6 @@ var ( pprofAddr string ) -// exampleJSON marshals v to indented JSON with color, returning empty string on error -func exampleJSON(v interface{}) string { - b, err := json.MarshalIndent(v, " ", " ") - if err != nil { - return "" - } - return string(pretty.Color(b, nil)) -} - -// generateExamples creates example responses from actual struct types -func generateExamples() string { - // Use actual build info with fallbacks - bi := buildinfo.Get() - version := bi.Version - if version == "" || version == "unknown" { - version = "v1.3.29" - } - commit := bi.Commit - if commit == "" || commit == "unknown" { - commit = "abc1234" - } - date := bi.Date - if date == "" || date == "unknown" { - date = "2024-01-15T10:30:00Z" - } - - // Use actual DMSG servers from embedded deployment config - var serverEntries []disc.Entry - var serverPKs []string - if len(dmsg.Prod.DmsgServers) > 0 { - // Use up to 2 real servers for examples - limit := 2 - if len(dmsg.Prod.DmsgServers) < limit { - limit = len(dmsg.Prod.DmsgServers) - } - for i := 0; i < limit; i++ { - serverEntries = append(serverEntries, dmsg.Prod.DmsgServers[i]) - serverPKs = append(serverPKs, dmsg.Prod.DmsgServers[i].Static.Hex()) - } - } - - // Fallback example PKs if no servers available - exClientPK := "02a49bc0aa1b5b78f638e9189be4c5d699e6d1358472d8a47f4c20daacd672d7e5" - exClientPK2 := "024ec47420176680816e0406250e7156465e4531f5b26057c9f6297bb0303558c7" - - // GET /health - use first real server PK if available - dmsgAddrPK := exClientPK - if len(serverPKs) > 0 { - dmsgAddrPK = serverPKs[0] - } - healthExample := map[string]interface{}{ - "build_info": map[string]interface{}{ - "version": version, - "commit": commit, - "date": date, - }, - "started_at": "2024-01-15T10:00:00Z", - "dmsg_address": dmsgAddrPK + ":80", - "dmsg_servers": serverPKs, - } - - // disc.Entry (client) - use real server PKs for delegated_servers - delegatedServers := serverPKs - if len(delegatedServers) == 0 { - delegatedServers = []string{"03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e"} - } - clientEntryExample := map[string]interface{}{ - "version": "1.0", - "sequence": 1, - "timestamp": 1705315200, - "static": exClientPK, - "client": map[string]interface{}{ - "delegated_servers": delegatedServers, - }, - } - - // POST response - disc.HTTPMessage - entrySetExample := map[string]interface{}{ - "code": 200, - "message": "wrote a new entry", - } - entryUpdatedExample := map[string]interface{}{ - "code": 200, - "message": "wrote new entry iteration", - } - entryDeletedExample := map[string]interface{}{ - "code": 200, - "message": "deleted entry", - } - - // GET /dmsg-discovery/servers/clients - map[server_pk][]client_pk - clientsByServerExample := make(map[string][]string) - if len(serverPKs) > 0 { - clientsByServerExample[serverPKs[0]] = []string{exClientPK, exClientPK2} - } else { - clientsByServerExample["03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e"] = []string{exClientPK, exClientPK2} - } - - // GET /dmsg-discovery/server/{pk}/clients - []client_pk - clientsForServerExample := []string{exClientPK, exClientPK2} - - // Use real server entries if available, otherwise use fallback - var serverEntryForExample interface{} - var serverEntriesForList []interface{} - if len(serverEntries) > 0 { - serverEntryForExample = serverEntries[0] - for _, entry := range serverEntries { - serverEntriesForList = append(serverEntriesForList, entry) - } - } else { - // Fallback server entry - serverEntryForExample = map[string]interface{}{ - "version": "1.0", - "sequence": 1, - "timestamp": 1705315200, - "static": "03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e", - "server": map[string]interface{}{ - "address": "192.168.1.100:8081", - "available_streams": 100, - "max_streams": 200, - "server_type": "official", - }, - } - serverEntriesForList = []interface{}{serverEntryForExample} - } - - // Arrays for list endpoints - entriesExample := append([]interface{}{clientEntryExample}, serverEntriesForList...) - visorEntriesExample := []interface{}{clientEntryExample} - - return fmt.Sprintf(` -Response Examples: - -GET /health -%s - -GET /dmsg-discovery/entry/{pk} (client entry) -%s - -GET /dmsg-discovery/entry/{pk} (server entry) -%s - -POST /dmsg-discovery/entry/ (new entry) -%s - -POST /dmsg-discovery/entry/ (update entry) -%s - -DEL /dmsg-discovery/entry -%s - -GET /dmsg-discovery/entries (all client and server entries) -%s - -GET /dmsg-discovery/visorEntries (client entries only) -%s - -GET /dmsg-discovery/available_servers (servers with available_streams > 0) -%s - -GET /dmsg-discovery/all_servers (all server entries) -%s - -GET /dmsg-discovery/servers/clients -%s - -GET /dmsg-discovery/server/{pk}/clients -%s`, - exampleJSON(healthExample), - exampleJSON(clientEntryExample), - exampleJSON(serverEntryForExample), - exampleJSON(entrySetExample), - exampleJSON(entryUpdatedExample), - exampleJSON(entryDeletedExample), - exampleJSON(entriesExample), - exampleJSON(visorEntriesExample), - exampleJSON(serverEntriesForList), - exampleJSON(serverEntriesForList), - exampleJSON(clientsByServerExample), - exampleJSON(clientsForServerExample)) -} - func init() { sf.Init(RootCmd, "dmsg_disc", "") @@ -256,9 +72,7 @@ func init() { // RootCmd contains commands for dmsg-discovery var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG Discovery Server", Long: ` ┌┬┐┌┬┐┌─┐┌─┐ ┌┬┐┬┌─┐┌─┐┌─┐┬ ┬┌─┐┬─┐┬ ┬ @@ -342,11 +156,11 @@ Example: defer cancel() db := prepareDB(ctx, log) - var m discmetrics.Metrics + var m metrics.Metrics if sf.MetricsAddr == "" { - m = discmetrics.NewEmpty() + m = metrics.NewEmpty() } else { - m = discmetrics.NewVictoriaMetrics() + m = metrics.NewVictoriaMetrics() } var dmsgAddr string @@ -421,9 +235,7 @@ Example: // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal(err) - } + dmsgclient.Execute(RootCmd) } func prepareDB(ctx context.Context, log *logging.Logger) store.Storer { diff --git a/cmd/dmsg-discovery/commands/examples.go b/cmd/dmsg-discovery/commands/examples.go new file mode 100644 index 000000000..9e21a208b --- /dev/null +++ b/cmd/dmsg-discovery/commands/examples.go @@ -0,0 +1,195 @@ +// Package commands cmd/dmsg-discovery/commands/examples.go +package commands + +import ( + "encoding/json" + "fmt" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" + "github.com/tidwall/pretty" + + "github.com/skycoin/dmsg/pkg/disc" + dmsg "github.com/skycoin/dmsg/pkg/dmsg" +) + +// exampleJSON marshals v to indented JSON with color, returning empty string on error +func exampleJSON(v interface{}) string { + b, err := json.MarshalIndent(v, " ", " ") + if err != nil { + return "" + } + return string(pretty.Color(b, nil)) +} + +// generateExamples creates example responses from actual struct types +func generateExamples() string { + // Use actual build info with fallbacks + bi := buildinfo.Get() + version := bi.Version + if version == "" || version == "unknown" { + version = "v1.3.29" + } + commit := bi.Commit + if commit == "" || commit == "unknown" { + commit = "abc1234" + } + date := bi.Date + if date == "" || date == "unknown" { + date = "2024-01-15T10:30:00Z" + } + + // Use actual DMSG servers from embedded deployment config + var serverEntries []disc.Entry + var serverPKs []string + if len(dmsg.Prod.DmsgServers) > 0 { + // Use up to 2 real servers for examples + limit := 2 + if len(dmsg.Prod.DmsgServers) < limit { + limit = len(dmsg.Prod.DmsgServers) + } + for i := 0; i < limit; i++ { + serverEntries = append(serverEntries, dmsg.Prod.DmsgServers[i]) + serverPKs = append(serverPKs, dmsg.Prod.DmsgServers[i].Static.Hex()) + } + } + + // Fallback example PKs if no servers available + exClientPK := "02a49bc0aa1b5b78f638e9189be4c5d699e6d1358472d8a47f4c20daacd672d7e5" + exClientPK2 := "024ec47420176680816e0406250e7156465e4531f5b26057c9f6297bb0303558c7" + + // GET /health - use first real server PK if available + dmsgAddrPK := exClientPK + if len(serverPKs) > 0 { + dmsgAddrPK = serverPKs[0] + } + healthExample := map[string]interface{}{ + "build_info": map[string]interface{}{ + "version": version, + "commit": commit, + "date": date, + }, + "started_at": "2024-01-15T10:00:00Z", + "dmsg_address": dmsgAddrPK + ":80", + "dmsg_servers": serverPKs, + } + + // disc.Entry (client) - use real server PKs for delegated_servers + delegatedServers := serverPKs + if len(delegatedServers) == 0 { + delegatedServers = []string{"03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e"} + } + clientEntryExample := map[string]interface{}{ + "version": "1.0", + "sequence": 1, + "timestamp": 1705315200, + "static": exClientPK, + "client": map[string]interface{}{ + "delegated_servers": delegatedServers, + }, + } + + // POST response - disc.HTTPMessage + entrySetExample := map[string]interface{}{ + "code": 200, + "message": "wrote a new entry", + } + entryUpdatedExample := map[string]interface{}{ + "code": 200, + "message": "wrote new entry iteration", + } + entryDeletedExample := map[string]interface{}{ + "code": 200, + "message": "deleted entry", + } + + // GET /dmsg-discovery/servers/clients - map[server_pk][]client_pk + clientsByServerExample := make(map[string][]string) + if len(serverPKs) > 0 { + clientsByServerExample[serverPKs[0]] = []string{exClientPK, exClientPK2} + } else { + clientsByServerExample["03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e"] = []string{exClientPK, exClientPK2} + } + + // GET /dmsg-discovery/server/{pk}/clients - []client_pk + clientsForServerExample := []string{exClientPK, exClientPK2} + + // Use real server entries if available, otherwise use fallback + var serverEntryForExample interface{} + var serverEntriesForList []interface{} + if len(serverEntries) > 0 { + serverEntryForExample = serverEntries[0] + for _, entry := range serverEntries { + serverEntriesForList = append(serverEntriesForList, entry) + } + } else { + // Fallback server entry + serverEntryForExample = map[string]interface{}{ + "version": "1.0", + "sequence": 1, + "timestamp": 1705315200, + "static": "03b160fa44bac22cae9f7eb1311f1648aaab962e1e55d8d9a22a9586ded871eb5e", + "server": map[string]interface{}{ + "address": "192.168.1.100:8081", + "available_streams": 100, + "max_streams": 200, + "server_type": "official", + }, + } + serverEntriesForList = []interface{}{serverEntryForExample} + } + + // Arrays for list endpoints + entriesExample := append([]interface{}{clientEntryExample}, serverEntriesForList...) + visorEntriesExample := []interface{}{clientEntryExample} + + return fmt.Sprintf(` +Response Examples: + +GET /health +%s + +GET /dmsg-discovery/entry/{pk} (client entry) +%s + +GET /dmsg-discovery/entry/{pk} (server entry) +%s + +POST /dmsg-discovery/entry/ (new entry) +%s + +POST /dmsg-discovery/entry/ (update entry) +%s + +DEL /dmsg-discovery/entry +%s + +GET /dmsg-discovery/entries (all client and server entries) +%s + +GET /dmsg-discovery/visorEntries (client entries only) +%s + +GET /dmsg-discovery/available_servers (servers with available_streams > 0) +%s + +GET /dmsg-discovery/all_servers (all server entries) +%s + +GET /dmsg-discovery/servers/clients +%s + +GET /dmsg-discovery/server/{pk}/clients +%s`, + exampleJSON(healthExample), + exampleJSON(clientEntryExample), + exampleJSON(serverEntryForExample), + exampleJSON(entrySetExample), + exampleJSON(entryUpdatedExample), + exampleJSON(entryDeletedExample), + exampleJSON(entriesExample), + exampleJSON(visorEntriesExample), + exampleJSON(serverEntriesForList), + exampleJSON(serverEntriesForList), + exampleJSON(clientsByServerExample), + exampleJSON(clientsForServerExample)) +} diff --git a/cmd/dmsg-server/commands/root.go b/cmd/dmsg-server/commands/root.go index 1baacb0b3..2af212dc6 100644 --- a/cmd/dmsg-server/commands/root.go +++ b/cmd/dmsg-server/commands/root.go @@ -2,17 +2,12 @@ package commands import ( - "fmt" - "log" - "os" - "path/filepath" - "strings" - "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" "github.com/spf13/cobra" "github.com/skycoin/dmsg/cmd/dmsg-server/commands/config" "github.com/skycoin/dmsg/cmd/dmsg-server/commands/start" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) func init() { @@ -25,9 +20,7 @@ func init() { // RootCmd contains the root dmsg-server command var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG Server", Long: ` ┌┬┐┌┬┐┌─┐┌─┐ ┌─┐┌─┐┬─┐┬ ┬┌─┐┬─┐ @@ -50,7 +43,5 @@ Example: // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsg-server/commands/start/root.go b/cmd/dmsg-server/commands/start/root.go index e9261f4c2..f48f49bcf 100644 --- a/cmd/dmsg-server/commands/start/root.go +++ b/cmd/dmsg-server/commands/start/root.go @@ -21,10 +21,10 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/metricsutil" "github.com/spf13/cobra" - "github.com/skycoin/dmsg/internal/dmsg-server/api" - "github.com/skycoin/dmsg/internal/servermetrics" "github.com/skycoin/dmsg/pkg/disc" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsg/metrics" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsgserver" ) @@ -109,11 +109,11 @@ var RootCmd = &cobra.Command{ conf.HTTPAddress = ":" + httpPort } - var m servermetrics.Metrics + var m metrics.Metrics if sf.MetricsAddr == "" { - m = servermetrics.NewEmpty() + m = metrics.NewEmpty() } else { - m = servermetrics.NewVictoriaMetrics() + m = metrics.NewVictoriaMetrics() } metricsutil.ServeHTTPMetrics(log, sf.MetricsAddr) @@ -124,7 +124,7 @@ var RootCmd = &cobra.Command{ r.Use(middleware.Logger) r.Use(middleware.Recoverer) - api := api.New(r, log, m) + srvAPI := dmsgserver.NewServerAPI(r, log, m) srvConf := dmsg.ServerConfig{ MaxSessions: conf.MaxSessions, @@ -134,16 +134,16 @@ var RootCmd = &cobra.Command{ srv := dmsg.NewServer(conf.PubKey, conf.SecKey, disc.NewHTTP(conf.Discovery, &http.Client{}, log), &srvConf, m) srv.SetLogger(log) - api.SetDmsgServer(srv) - defer func() { log.WithError(api.Close()).Info("Closed server.") }() + srvAPI.SetDmsgServer(srv) + defer func() { log.WithError(srvAPI.Close()).Info("Closed server.") }() ctx, cancel := cmdutil.SignalContext(context.Background(), log) defer cancel() - go api.RunBackgroundTasks(ctx) + go srvAPI.RunBackgroundTasks(ctx) log.WithField("addr", conf.HTTPAddress).Info("Serving server API...") go func() { - if err := api.ListenAndServe(conf.LocalAddress, conf.PublicAddress, conf.HTTPAddress); err != nil { + if err := srvAPI.ListenAndServe(conf.LocalAddress, conf.PublicAddress, conf.HTTPAddress); err != nil { log.Errorf("Serve: %v", err) cancel() } @@ -155,9 +155,7 @@ var RootCmd = &cobra.Command{ // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } func configNotFound() (io.ReadCloser, error) { diff --git a/cmd/dmsg-socks5/commands/dmsg-socks5.go b/cmd/dmsg-socks5/commands/dmsg-socks5.go index 0fb2ea04a..9b86e10a9 100644 --- a/cmd/dmsg-socks5/commands/dmsg-socks5.go +++ b/cmd/dmsg-socks5/commands/dmsg-socks5.go @@ -4,10 +4,8 @@ package commands import ( "context" "fmt" - "log" "net/http" "os" - "path/filepath" "strings" "time" @@ -19,8 +17,8 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/spf13/cobra" - "github.com/skycoin/dmsg/internal/cli" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -40,9 +38,7 @@ var ( // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } func init() { RootCmd.AddCommand( @@ -75,9 +71,7 @@ func init() { // RootCmd contains the root command var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG socks5 proxy server & client", Long: calvin.AsciiFont("dmsg-socks") + ` DMSG socks5 proxy server & client`, @@ -137,7 +131,7 @@ var serveCmd = &cobra.Command{ defer cancel() //TODO: implement whitelist logic - dmsgC, closeDmsg, err := cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) + dmsgC, closeDmsg, err := dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) if err != nil { dlog.WithError(err).Fatal("Error connecting to dmsg network") @@ -235,7 +229,7 @@ var proxyCmd = &cobra.Command{ ctx, cancel := cmdutil.SignalContext(context.Background(), dlog) defer cancel() - dmsgC, closeDmsg, err := cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) + dmsgC, closeDmsg, err := dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) if err != nil { dlog.WithError(err).Fatal("Error connecting to dmsg network") diff --git a/cmd/dmsg/commands/root.go b/cmd/dmsg/commands/root.go index 556f4a7cc..560bf2f06 100644 --- a/cmd/dmsg/commands/root.go +++ b/cmd/dmsg/commands/root.go @@ -3,10 +3,6 @@ package commands import ( "fmt" - "log" - "os" - "path/filepath" - "strings" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin" @@ -24,6 +20,7 @@ import ( dph "github.com/skycoin/dmsg/cmd/dmsgpty-host/commands" dpu "github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands" dw "github.com/skycoin/dmsg/cmd/dmsgweb/commands" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -87,9 +84,7 @@ func modifySubcommands(cmd *cobra.Command) { // RootCmd contains all binaries which may be separately compiled as subcommands var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG services & utilities", Long: func() (ret string) { ret = calvin.AsciiFont("dmsg") @@ -125,7 +120,5 @@ DMSG pseudoterminal (pty)`, // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsgcurl/commands/dmsgcurl.go b/cmd/dmsgcurl/commands/dmsgcurl.go index a2f6d9dfe..cf3366ad5 100644 --- a/cmd/dmsgcurl/commands/dmsgcurl.go +++ b/cmd/dmsgcurl/commands/dmsgcurl.go @@ -7,7 +7,6 @@ import ( "fmt" "io" "io/fs" - "log" "net" "net/http" "net/url" @@ -25,10 +24,9 @@ import ( "github.com/spf13/cobra" "golang.org/x/net/proxy" - "github.com/skycoin/dmsg/internal/cli" - "github.com/skycoin/dmsg/internal/flags" "github.com/skycoin/dmsg/pkg/disc" "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsghttp" ) @@ -50,7 +48,7 @@ var ( func init() { RootCmd.Flags().SortFlags = false - flags.InitFlags(RootCmd) + dmsgclient.InitFlags(RootCmd) RootCmd.Flags().StringVarP(&proxyAddr, "proxy", "p", proxyAddr, "connect to DMSG via proxy (i.e. '127.0.0.1:1080')") RootCmd.Flags().StringVarP(&logLvl, "loglvl", "l", "fatal", "[ debug | warn | error | fatal | panic | trace | info ]\033[0m\n\r") RootCmd.Flags().StringVarP(&dmsgcurlData, "data", "d", "", "dmsghttp POST data") @@ -83,8 +81,8 @@ var RootCmd = &cobra.Command{ } } - if flags.DmsgHTTPPath != "" { - dmsg.DmsghttpJSON, err = os.ReadFile(flags.DmsgHTTPPath) //nolint + if dmsgclient.DmsgHTTPPath != "" { + dmsg.DmsghttpJSON, err = os.ReadFile(dmsgclient.DmsgHTTPPath) //nolint if err != nil { dlog.WithError(err).Fatal("Failed to read specified dmsghttp-config") } @@ -169,16 +167,16 @@ func handleRequest(ctx context.Context, pk cipher.PubKey, sk cipher.SecKey, http defer func() { closeAndCleanFile(file, err) }() var httpC http.Client - if flags.UseDC { + if dmsgclient.UseDC { var dmsgClients []*dmsg.Client dlog.Debug("Starting DMSG direct clients.") for _, server := range dmsg.Prod.DmsgServers { - if len(dmsgClients) >= flags.DmsgSessions { + if len(dmsgClients) >= dmsgclient.DmsgSessions { break } - dmsgDC, closeFn, err := cli.StartDmsgDirectWithServers(ctx, dlog, pk, sk, "", []*disc.Entry{&server}, flags.DmsgSessions, dmsg.ExtractPKFromDmsgAddr(parsedURL.String())) + dmsgDC, closeFn, err := dmsgclient.StartDmsgDirectWithServers(ctx, dlog, pk, sk, "", []*disc.Entry{&server}, dmsgclient.DmsgSessions, dmsg.ExtractPKFromDmsgAddr(parsedURL.String())) if err != nil { dlog.WithError(err).Error("Failed to start DMSG direct client. Skipping server...") continue @@ -194,10 +192,10 @@ func handleRequest(ctx context.Context, pk cipher.PubKey, sk cipher.SecKey, http // Build HTTP client with fallback round tripper httpC = http.Client{ - Transport: cli.NewFallbackRoundTripper(ctx, dmsgClients), + Transport: dmsgclient.NewFallbackRoundTripper(ctx, dmsgClients), } } else { - dmsgC, closeDmsg, err := cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, parsedURL.String()) + dmsgC, closeDmsg, err := dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, parsedURL.String()) if err != nil || dmsgC == nil { dlog.WithError(err).Debug("Error initializing DMSG client") return curlError{ @@ -391,9 +389,5 @@ func (pw *progressWriter) Write(p []byte) (int, error) { // Execute executes the RootCmd func Execute() { - if err := RootCmd.Execute(); err != nil { - // WHY WON'T THIS PRINT?? - dlog.WithError(err).Debug("An error occurred\n") - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsghttp/commands/dmsghttp.go b/cmd/dmsghttp/commands/dmsghttp.go index 8843291ad..a2ff3c05f 100644 --- a/cmd/dmsghttp/commands/dmsghttp.go +++ b/cmd/dmsghttp/commands/dmsghttp.go @@ -4,12 +4,9 @@ package commands import ( "context" "fmt" - "log" "net" "net/http" "os" - "path/filepath" - "strings" "sync" "time" @@ -22,9 +19,8 @@ import ( "github.com/spf13/cobra" "golang.org/x/net/proxy" - "github.com/skycoin/dmsg/internal/cli" - "github.com/skycoin/dmsg/internal/flags" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -42,7 +38,7 @@ var ( func init() { RootCmd.Flags().SortFlags = false - flags.InitFlags(RootCmd) + dmsgclient.InitFlags(RootCmd) RootCmd.Flags().StringVarP(&proxyAddr, "proxy", "p", proxyAddr, "connect to DMSG via proxy (i.e. '127.0.0.1:1080')") RootCmd.Flags().StringVarP(&logLvl, "loglvl", "l", "debug", "[ debug | warn | error | fatal | panic | trace | info ]\033[0m\n\r") RootCmd.Flags().StringVarP(&serveDir, "dir", "r", ".", "local dir to serve via dmsghttp\033[0m\n\r") @@ -57,9 +53,7 @@ func init() { // RootCmd contains the root dmsghttp command var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG http file server", Long: calvin.AsciiFont("dmsghttp") + ` DMSG http file server`, @@ -78,7 +72,7 @@ func server() { wg := new(sync.WaitGroup) wg.Add(1) - err = flags.InitConfig() + err = dmsgclient.InitConfig() if err != nil { dlog.WithError(err).Fatal("Failed to read specified dmsghttp-config") } @@ -127,7 +121,7 @@ func server() { var dmsgC *dmsg.Client var closeDmsg func() - dmsgC, closeDmsg, err = cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") + dmsgC, closeDmsg, err = dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") if err != nil { dlog.WithError(err).Error("Error connecting to dmsg network") return @@ -314,9 +308,5 @@ const ( // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - // WHY WON'T THIS PRINT?? - dlog.WithError(err).Debug("An error occurred\n") - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsgip/commands/dmsgip.go b/cmd/dmsgip/commands/dmsgip.go index 40cf01009..b52b9a354 100644 --- a/cmd/dmsgip/commands/dmsgip.go +++ b/cmd/dmsgip/commands/dmsgip.go @@ -4,11 +4,8 @@ package commands import ( "context" "fmt" - "log" "net/http" "os" - "path/filepath" - "strings" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin" @@ -18,8 +15,8 @@ import ( "github.com/spf13/cobra" "golang.org/x/net/proxy" - "github.com/skycoin/dmsg/internal/cli" "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -51,9 +48,7 @@ func init() { // RootCmd contains the root dmsgcurl command var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG IP utility", Long: calvin.AsciiFont("dmsgip") + ` DMSG IP utility`, @@ -116,7 +111,7 @@ var RootCmd = &cobra.Command{ ctx = context.WithValue(context.Background(), "socks5_proxy", proxyAddr) //nolint } - dmsgC, closeDmsg, err := cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) + dmsgC, closeDmsg, err := dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, pk.String()) if err != nil { dlog.WithError(err).Debug("Error connecting to dmsg network") @@ -135,7 +130,5 @@ var RootCmd = &cobra.Command{ // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsgpty-cli/commands/root.go b/cmd/dmsgpty-cli/commands/root.go index cef9e9a12..7d47b6866 100644 --- a/cmd/dmsgpty-cli/commands/root.go +++ b/cmd/dmsgpty-cli/commands/root.go @@ -4,11 +4,8 @@ package commands import ( "context" "encoding/json" - "fmt" "log" "os" - "path/filepath" - "strings" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin" @@ -16,6 +13,7 @@ import ( "github.com/spf13/cobra" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + dmsgcli "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsgpty" ) @@ -43,9 +41,7 @@ func init() { // RootCmd contains commands for dmsgpty-cli; which interacts with the dmsgpty-host instance (i.e. skywire-visor) var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgcli.ExecName(), Short: "DMSG pseudoterminal command line interface", Long: calvin.AsciiFont("dmsgpty-cli") + ` DMSG pseudoterminal command line interface`, @@ -121,7 +117,5 @@ var RootCmd = &cobra.Command{ // Execute executes the root command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal(err) - } + dmsgcli.Execute(RootCmd) } diff --git a/cmd/dmsgpty-host/commands/confgen.go b/cmd/dmsgpty-host/commands/confgen.go index ba0c1e7d1..4c21b92af 100644 --- a/cmd/dmsgpty-host/commands/confgen.go +++ b/cmd/dmsgpty-host/commands/confgen.go @@ -3,10 +3,10 @@ package commands import ( "fmt" + "os" "github.com/spf13/cobra" - "github.com/skycoin/dmsg/internal/fsutil" "github.com/skycoin/dmsg/pkg/dmsgpty" ) @@ -39,12 +39,10 @@ var confgenCmd = &cobra.Command{ return dmsgpty.WriteConfig(conf, confPath) } - exists, err := fsutil.Exists(confPath) - if err != nil { - return fmt.Errorf("failed to check if config file exists: %w", err) - } - if exists { + if _, err := os.Stat(confPath); err == nil { return fmt.Errorf("config file %s already exists", confPath) + } else if !os.IsNotExist(err) { + return fmt.Errorf("failed to check if config file exists: %w", err) } return dmsgpty.WriteConfig(conf, confPath) diff --git a/cmd/dmsgpty-host/commands/root.go b/cmd/dmsgpty-host/commands/root.go index 7b81fd26c..cc2c8a3f8 100644 --- a/cmd/dmsgpty-host/commands/root.go +++ b/cmd/dmsgpty-host/commands/root.go @@ -8,7 +8,6 @@ import ( "net" "net/http" "os" - "path/filepath" "strconv" "strings" "sync" @@ -24,6 +23,7 @@ import ( "github.com/skycoin/dmsg/pkg/disc" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsgpty" ) @@ -72,9 +72,7 @@ func init() { // RootCmd contains commands for dmsgpty-host var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG host for pseudoterminal command line interface", Long: calvin.AsciiFont("dmsgpty-host") + ` DMSG host for pseudoterminal (pty) command line interface`, @@ -160,9 +158,7 @@ var RootCmd = &cobra.Command{ // Execute executes the root command. func Execute() { - if err := RootCmd.Execute(); err != nil { - os.Exit(1) - } + dmsgclient.Execute(RootCmd) } func configFromJSON(conf dmsgpty.Config) (dmsgpty.Config, error) { diff --git a/cmd/dmsgpty-ui/commands/dmsgpty-ui.go b/cmd/dmsgpty-ui/commands/dmsgpty-ui.go index 665944339..531f7f742 100644 --- a/cmd/dmsgpty-ui/commands/dmsgpty-ui.go +++ b/cmd/dmsgpty-ui/commands/dmsgpty-ui.go @@ -2,18 +2,15 @@ package commands import ( - "fmt" "log" "net/http" - "os" - "path/filepath" - "strings" "time" "github.com/sirupsen/logrus" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo" "github.com/spf13/cobra" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsgpty" ) @@ -34,9 +31,7 @@ func init() { // RootCmd contains commands to start a dmsgpty-ui server for a dmsgpty-host var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG pseudoterminal GUI", Long: ` ┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┬ ┬┬ @@ -71,7 +66,5 @@ var RootCmd = &cobra.Command{ // Execute executes the root command. func Execute() { - if err := RootCmd.Execute(); err != nil { - os.Exit(1) - } + dmsgclient.Execute(RootCmd) } diff --git a/cmd/dmsgweb/commands/dmsgweb.go b/cmd/dmsgweb/commands/dmsgweb.go index c4605ac7a..8d80abac7 100644 --- a/cmd/dmsgweb/commands/dmsgweb.go +++ b/cmd/dmsgweb/commands/dmsgweb.go @@ -8,7 +8,6 @@ import ( "net" "net/http" "os" - "path/filepath" "regexp" "strconv" "strings" @@ -24,10 +23,10 @@ import ( "github.com/spf13/cobra" "golang.org/x/net/proxy" - "github.com/skycoin/dmsg/internal/cli" - "github.com/skycoin/dmsg/internal/flags" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsghttp" + "github.com/skycoin/dmsg/pkg/ioutil" ) type customResolver struct{} @@ -64,7 +63,7 @@ func init() { } pk, _ = sk.PubKey() //nolint - flags.InitFlags(RootCmd) + dmsgclient.InitFlags(RootCmd) RootCmd.Flags().StringVarP(&filterDomainSuffix, "filter", "f", ".dmsg", "domain suffix to filter\033[0m\n\r") RootCmd.Flags().UintVarP(&proxyPort, "socks", "q", proxyPort, "port to serve the socks5 proxy\033[0m\n\r") RootCmd.Flags().StringVarP(&addProxy, "addproxy", "r", addProxy, "configure additional socks5 proxy for dmsgweb (i.e. 127.0.0.1:1080)\033[0m\n\r") @@ -80,9 +79,7 @@ func init() { // RootCmd contains the root command for dmsgweb var RootCmd = &cobra.Command{ - Use: func() string { - return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] - }(), + Use: dmsgclient.ExecName(), Short: "DMSG resolving proxy & browser client", Long: ` ┌┬┐┌┬┐┌─┐┌─┐┬ ┬┌─┐┌┐ @@ -113,15 +110,15 @@ dmsgweb conf file detected: ` + dwcfg } dlog = logging.MustGetLogger("dmsgweb") - err = flags.InitConfig() + err = dmsgclient.InitConfig() if err != nil { dlog.WithError(err).Fatal("Failed to read specified dmsghttp-config") } - if flags.DmsgDiscURL == "" { + if dmsgclient.DmsgDiscURL == "" { dlog.Fatal("Dmsg Discovery Server URL not specified") } - if flags.DmsgDiscURL == "" { + if dmsgclient.DmsgDiscAddr == "" { dlog.Fatal("Dmsg Discovery Server dmsg address not specified") } @@ -222,7 +219,7 @@ dmsgweb conf file detected: ` + dwcfg ctx = context.WithValue(ctx, "socks5_proxy", proxyAddr) //nolint } - dmsgC, closeDmsg, err = cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") + dmsgC, closeDmsg, err = dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") if err != nil { dlog.WithError(err).Error("Error connecting to dmsg network") return @@ -271,12 +268,13 @@ dmsgweb conf file detected: ` + dwcfg wg.Add(1) go func() { + defer wg.Done() + defer server.Close() //nolint:errcheck dlog.Debug("Serving SOCKS5 proxy on " + socksAddr) err := server.ListenAndServe("tcp", socksAddr) if err != nil { dlog.WithError(err).Fatal("Failed to start SOCKS5 server") } - defer server.Close() //nolint dlog.Debug("Stopped serving SOCKS5 proxy on " + socksAddr) }() } @@ -316,7 +314,7 @@ func proxyTCPConn(n int) { if err != nil { dlog.WithError(err).Fatal(fmt.Sprintf("Failed to start TCP listener on port: %v", thiswebport)) } - defer listener.Close() //nolint + defer ioutil.CloseQuietly(listener, dlog) dlog.Debug("Serving TCP on 127.0.0.1:", thiswebport) if dmsgC == nil { dlog.Fatal("dmsgC is nil") @@ -330,7 +328,7 @@ func proxyTCPConn(n int) { } go func(conn net.Conn, n int, dmsgC *dmsg.Client) { - defer conn.Close() //nolint + defer ioutil.CloseQuietly(conn, dlog) dp, ok := safecast.To[uint16](dmsgPorts[n]) if !ok { dlog.Fatal("uint16 overflow when converting dmsg port") @@ -342,7 +340,7 @@ func proxyTCPConn(n int) { return } - defer dmsgConn.Close() //nolint + defer ioutil.CloseQuietly(dmsgConn, dlog) var wg sync.WaitGroup wg.Add(2) @@ -416,7 +414,7 @@ func proxyHTTPConn(n int) { dlog.WithError(err).Warn("Failed to connect to HTTP server") return } - defer resp.Body.Close() //nolint + defer ioutil.CloseQuietly(resp.Body, dlog) for header, values := range resp.Header { for _, value := range values { @@ -432,6 +430,7 @@ func proxyHTTPConn(n int) { }) wg.Add(1) go func() { + defer wg.Done() var thiswebport uint if n == -1 { thiswebport = webPort[0] @@ -441,7 +440,6 @@ func proxyHTTPConn(n int) { dlog.Debug(fmt.Sprintf("Serving http on: http://127.0.0.1:%v", thiswebport)) r.Run(":" + fmt.Sprintf("%v", thiswebport)) //nolint dlog.Debug(fmt.Sprintf("Stopped serving http on: http://127.0.0.1:%v", thiswebport)) - wg.Done() }() } diff --git a/cmd/dmsgweb/commands/dmsgwebsrv.go b/cmd/dmsgweb/commands/dmsgwebsrv.go index 4599f1ba1..18d94c5ca 100644 --- a/cmd/dmsgweb/commands/dmsgwebsrv.go +++ b/cmd/dmsgweb/commands/dmsgwebsrv.go @@ -20,8 +20,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/net/proxy" - "github.com/skycoin/dmsg/internal/cli" - "github.com/skycoin/dmsg/internal/flags" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) const dwsenv = "DMSGWEBSRV" @@ -42,7 +41,7 @@ func init() { pk, _ = sk.PubKey() //nolint RootCmd.AddCommand(srvCmd) - flags.InitFlags(srvCmd) + dmsgclient.InitFlags(srvCmd) srvCmd.Flags().UintSliceVarP(&localPort, "lport", "p", localPort, "local application interface port(s)\033[0m\n\r") srvCmd.Flags().UintSliceVarP(&dmsgPort, "dport", "d", dmsgPort, "DMSG port(s) to serve\033[0m\n\r") srvCmd.Flags().StringSliceVarP(&wl, "wl", "w", wl, "whitelisted keys for DMSG authenticated routes"+func() string { @@ -84,7 +83,7 @@ var srvCmd = &cobra.Command{ } dlog = logging.MustGetLogger("dmsgwebsrv") - err = flags.InitConfig() + err = dmsgclient.InitConfig() if err != nil { dlog.WithError(err).Fatal("Failed to read specified dmsghttp-config") } @@ -133,7 +132,7 @@ func server() { ctx = context.WithValue(ctx, "socks5_proxy", proxyAddr) //nolint } - dmsgC, closeDmsg, err = cli.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") + dmsgC, closeDmsg, err = dmsgclient.InitDmsgWithFlags(ctx, dlog, pk, sk, httpClient, "") if err != nil { dlog.WithError(err).Error("Error connecting to dmsg network") return @@ -173,7 +172,12 @@ func proxyHTTPConnections(ctx context.Context, localPort uint, listener net.List authRoute.Any("/*path", func(c *gin.Context) { targetURL := fmt.Sprintf("http://127.0.0.1:%d%s?%s", localPort, c.Request.URL.Path, c.Request.URL.RawQuery) proxy := httputil.ReverseProxy{Director: func(req *http.Request) { - req.URL, _ = url.Parse(targetURL) //nolint + parsed, err := url.Parse(targetURL) + if err != nil { + dlog.Errorf("failed to parse target URL %q: %v", targetURL, err) + return + } + req.URL = parsed req.Host = req.URL.Host }} proxy.ServeHTTP(c.Writer, c.Request) @@ -189,7 +193,7 @@ func proxyHTTPConnections(ctx context.Context, localPort uint, listener net.List } // Graceful shutdown on context cancellation - go func() { + go func() { //nolint:gosec <-ctx.Done() if err := server.Shutdown(context.Background()); err != nil { dlog.Errorf("HTTP server shutdown error: %v", err) @@ -278,6 +282,9 @@ func proxyTCPConnections(ctx context.Context, localPort uint, listener net.Liste if err2 != nil { dlog.WithError(err2).Warn("Error on io.Copy(localConn, dmsgConn)") } + // Close both to unblock the goroutine + dmsgConn.Close() //nolint + localConn.Close() //nolint connMutex.Lock() delete(activeConns, dmsgConn) diff --git a/cmd/dmsgweb/commands/root.go b/cmd/dmsgweb/commands/root.go index e901cab74..3d1d24da4 100644 --- a/cmd/dmsgweb/commands/root.go +++ b/cmd/dmsgweb/commands/root.go @@ -21,6 +21,7 @@ import ( "golang.org/x/net/proxy" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -55,9 +56,7 @@ var ( // Execute executes root CLI command. func Execute() { - if err := RootCmd.Execute(); err != nil { - log.Fatal("Failed to execute command: ", err) - } + dmsgclient.Execute(RootCmd) } func printEnvs(envfile string) { diff --git a/docker/images/dmsg-client/Dockerfile b/docker/images/dmsg-client/Dockerfile index deafe6a15..06f2207b1 100644 --- a/docker/images/dmsg-client/Dockerfile +++ b/docker/images/dmsg-client/Dockerfile @@ -1,5 +1,5 @@ # Builder -ARG base_image=golang:1.25-alpine +ARG base_image=golang:1.26-alpine FROM ${base_image} AS builder ARG CGO_ENABLED=0 diff --git a/docker/images/dmsg-discovery/Dockerfile b/docker/images/dmsg-discovery/Dockerfile index 11fd30221..08ec11c04 100755 --- a/docker/images/dmsg-discovery/Dockerfile +++ b/docker/images/dmsg-discovery/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.25-alpine AS builder +FROM golang:1.26-alpine AS builder ARG CGO_ENABLED=0 ENV CGO_ENABLED=${CGO_ENABLED} \ diff --git a/docker/images/dmsg-server/Dockerfile b/docker/images/dmsg-server/Dockerfile index e4b1c68fe..017b9920a 100755 --- a/docker/images/dmsg-server/Dockerfile +++ b/docker/images/dmsg-server/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.25-alpine AS builder +FROM golang:1.26-alpine AS builder ARG CGO_ENABLED=0 ENV CGO_ENABLED=${CGO_ENABLED} \ diff --git a/docs/dmsg-goda-graph.svg b/docs/dmsg-goda-graph.svg index 21c222abb..4047bfb18 100644 --- a/docs/dmsg-goda-graph.svg +++ b/docs/dmsg-goda-graph.svg @@ -1,909 +1,907 @@ - - - + + G - + github.com/skycoin/dmsg - -github.com/skycoin/dmsg -12 / 253B + +github.com/skycoin/dmsg +12 / 253B github.com/skycoin/dmsg/cmd/dmsg/commands - - -github.com/skycoin/dmsg/cmd/dmsg/commands -145 / 4.0KB + + +github.com/skycoin/dmsg/cmd/dmsg/commands +138 / 3.8KB github.com/skycoin/dmsg:e->github.com/skycoin/dmsg/cmd/dmsg/commands - - + + github.com/skycoin/dmsg/cmd/conf - -github.com/skycoin/dmsg/cmd/conf -12 / 261B + +github.com/skycoin/dmsg/cmd/conf +12 / 261B github.com/skycoin/dmsg/cmd/conf/commands - - -github.com/skycoin/dmsg/cmd/conf/commands -29 / 0.8KB + + +github.com/skycoin/dmsg/cmd/conf/commands +28 / 0.8KB github.com/skycoin/dmsg/cmd/conf:e->github.com/skycoin/dmsg/cmd/conf/commands - - + + - + github.com/skycoin/dmsg/pkg/dmsg - - -github.com/skycoin/dmsg/pkg/dmsg -2510 / 72.7KB + + +github.com/skycoin/dmsg/pkg/dmsg +2607 / 75.8KB github.com/skycoin/dmsg/cmd/conf/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/pkg/dmsgclient + + +github.com/skycoin/dmsg/pkg/dmsgclient +534 / 20.8KB + + + + + +github.com/skycoin/dmsg/cmd/conf/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/cmd/dial - -github.com/skycoin/dmsg/cmd/dial -12 / 261B + +github.com/skycoin/dmsg/cmd/dial +12 / 261B github.com/skycoin/dmsg/cmd/dial/commands - - -github.com/skycoin/dmsg/cmd/dial/commands -170 / 6.1KB + + +github.com/skycoin/dmsg/cmd/dial/commands +162 / 5.8KB - -github.com/skycoin/dmsg/cmd/dial:e->github.com/skycoin/dmsg/cmd/dial/commands - - - - - -github.com/skycoin/dmsg/internal/cli - - -github.com/skycoin/dmsg/internal/cli -439 / 17.2KB - - - - -github.com/skycoin/dmsg/cmd/dial/commands:e->github.com/skycoin/dmsg/internal/cli - - - - - -github.com/skycoin/dmsg/internal/flags - - -github.com/skycoin/dmsg/internal/flags -45 / 1.7KB - - - - - -github.com/skycoin/dmsg/cmd/dial/commands:e->github.com/skycoin/dmsg/internal/flags - - +github.com/skycoin/dmsg/cmd/dial:e->github.com/skycoin/dmsg/cmd/dial/commands + + - + github.com/skycoin/dmsg/pkg/disc - - -github.com/skycoin/dmsg/pkg/disc -749 / 23.9KB + + +github.com/skycoin/dmsg/pkg/disc +856 / 27.1KB - + github.com/skycoin/dmsg/cmd/dial/commands:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/cmd/dial/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dial/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/cmd/dmsg - -github.com/skycoin/dmsg/cmd/dmsg -12 / 262B + +github.com/skycoin/dmsg/cmd/dmsg +12 / 262B github.com/skycoin/dmsg/cmd/dmsg:e->github.com/skycoin/dmsg/cmd/dmsg/commands - - + + github.com/skycoin/dmsg/cmd/dmsg-discovery - -github.com/skycoin/dmsg/cmd/dmsg-discovery -12 / 291B + +github.com/skycoin/dmsg/cmd/dmsg-discovery +12 / 291B github.com/skycoin/dmsg/cmd/dmsg-discovery/commands - - -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands -293 / 10.3KB + + +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands +464 / 16.1KB github.com/skycoin/dmsg/cmd/dmsg-discovery:e->github.com/skycoin/dmsg/cmd/dmsg-discovery/commands - - + + - - -github.com/skycoin/dmsg/internal/discmetrics - - -github.com/skycoin/dmsg/internal/discmetrics -44 / 1.5KB + + +github.com/skycoin/dmsg/pkg/direct + + +github.com/skycoin/dmsg/pkg/direct +186 / 5.7KB - + -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/internal/discmetrics - - - - - -github.com/skycoin/dmsg/internal/dmsg-discovery/api - - -github.com/skycoin/dmsg/internal/dmsg-discovery/api -470 / 15.9KB - - +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/direct + + - + -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/internal/dmsg-discovery/api - - +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/disc + + - - -github.com/skycoin/dmsg/internal/dmsg-discovery/store - - -github.com/skycoin/dmsg/internal/dmsg-discovery/store -464 / 14.8KB + + +github.com/skycoin/dmsg/pkg/disc/metrics + + +github.com/skycoin/dmsg/pkg/disc/metrics +44 / 1.5KB - + -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/internal/dmsg-discovery/store - - +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/disc/metrics + + - - -github.com/skycoin/dmsg/pkg/direct - - -github.com/skycoin/dmsg/pkg/direct -157 / 4.8KB + + +github.com/skycoin/dmsg/pkg/discovery/api + + +github.com/skycoin/dmsg/pkg/discovery/api +536 / 17.8KB - + -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/direct - - +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/discovery/api + + - + + +github.com/skycoin/dmsg/pkg/discovery/store + + +github.com/skycoin/dmsg/pkg/discovery/store +512 / 16.2KB + + + + -github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/disc - - +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/discovery/store + + github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/pkg/dmsghttp - - -github.com/skycoin/dmsg/pkg/dmsghttp -181 / 5.2KB + + +github.com/skycoin/dmsg/pkg/dmsghttp +199 / 5.7KB - + github.com/skycoin/dmsg/cmd/dmsg-discovery/commands:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + github.com/skycoin/dmsg/cmd/dmsg-server - -github.com/skycoin/dmsg/cmd/dmsg-server -12 / 282B + +github.com/skycoin/dmsg/cmd/dmsg-server +12 / 282B github.com/skycoin/dmsg/cmd/dmsg-server/commands - - -github.com/skycoin/dmsg/cmd/dmsg-server/commands -44 / 1.4KB + + +github.com/skycoin/dmsg/cmd/dmsg-server/commands +39 / 1.3KB - + github.com/skycoin/dmsg/cmd/dmsg-server:e->github.com/skycoin/dmsg/cmd/dmsg-server/commands - - + + github.com/skycoin/dmsg/cmd/dmsg-server/commands/config - -github.com/skycoin/dmsg/cmd/dmsg-server/commands/config -54 / 1.5KB + +github.com/skycoin/dmsg/cmd/dmsg-server/commands/config +54 / 1.5KB - + github.com/skycoin/dmsg/cmd/dmsg-server/commands:e->github.com/skycoin/dmsg/cmd/dmsg-server/commands/config - - + + github.com/skycoin/dmsg/cmd/dmsg-server/commands/start - - -github.com/skycoin/dmsg/cmd/dmsg-server/commands/start -139 / 4.7KB + + +github.com/skycoin/dmsg/cmd/dmsg-server/commands/start +137 / 4.7KB - + github.com/skycoin/dmsg/cmd/dmsg-server/commands:e->github.com/skycoin/dmsg/cmd/dmsg-server/commands/start - - + + + + + +github.com/skycoin/dmsg/cmd/dmsg-server/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/pkg/dmsgserver - - -github.com/skycoin/dmsg/pkg/dmsgserver -59 / 1.9KB + + +github.com/skycoin/dmsg/pkg/dmsgserver +287 / 9.0KB - -github.com/skycoin/dmsg/cmd/dmsg-server/commands/config:e->github.com/skycoin/dmsg/pkg/dmsgserver - - - - - -github.com/skycoin/dmsg/internal/dmsg-server/api - - -github.com/skycoin/dmsg/internal/dmsg-server/api -231 / 7.1KB - - - - - -github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/internal/dmsg-server/api - - - - - -github.com/skycoin/dmsg/internal/servermetrics - - -github.com/skycoin/dmsg/internal/servermetrics -111 / 4.0KB - - - - -github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/internal/servermetrics - - +github.com/skycoin/dmsg/cmd/dmsg-server/commands/config:e->github.com/skycoin/dmsg/pkg/dmsgserver + + github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/pkg/disc - - + + github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - + + +github.com/skycoin/dmsg/pkg/dmsg/metrics + + +github.com/skycoin/dmsg/pkg/dmsg/metrics +111 / 3.9KB + + + + +github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/pkg/dmsg/metrics + + + + + +github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/pkg/dmsgclient + + + + + github.com/skycoin/dmsg/cmd/dmsg-server/commands/start:e->github.com/skycoin/dmsg/pkg/dmsgserver - - + + github.com/skycoin/dmsg/cmd/dmsg-socks5 - -github.com/skycoin/dmsg/cmd/dmsg-socks5 -12 / 282B + +github.com/skycoin/dmsg/cmd/dmsg-socks5 +12 / 282B github.com/skycoin/dmsg/cmd/dmsg-socks5/commands - - -github.com/skycoin/dmsg/cmd/dmsg-socks5/commands -249 / 8.2KB + + +github.com/skycoin/dmsg/cmd/dmsg-socks5/commands +243 / 8.0KB - + github.com/skycoin/dmsg/cmd/dmsg-socks5:e->github.com/skycoin/dmsg/cmd/dmsg-socks5/commands - - - - - -github.com/skycoin/dmsg/cmd/dmsg-socks5/commands:e->github.com/skycoin/dmsg/internal/cli - - + + - + github.com/skycoin/dmsg/cmd/dmsg-socks5/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsg-socks5/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/conf/commands - - + + - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dial/commands - - + + - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsg-discovery/commands - - + + - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsg-server/commands - - + + - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsg-socks5/commands - - + + github.com/skycoin/dmsg/cmd/dmsgcurl/commands - - -github.com/skycoin/dmsg/cmd/dmsgcurl/commands -393 / 12.8KB + + +github.com/skycoin/dmsg/cmd/dmsgcurl/commands +392 / 12.7KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgcurl/commands - - + + github.com/skycoin/dmsg/cmd/dmsghttp/commands - - -github.com/skycoin/dmsg/cmd/dmsghttp/commands -286 / 8.0KB + + +github.com/skycoin/dmsg/cmd/dmsghttp/commands +276 / 7.6KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsghttp/commands - - + + github.com/skycoin/dmsg/cmd/dmsgip/commands - - -github.com/skycoin/dmsg/cmd/dmsgip/commands -124 / 4.1KB + + +github.com/skycoin/dmsg/cmd/dmsgip/commands +117 / 3.9KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgip/commands - - + + github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands - - -github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands -195 / 5.6KB + + +github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands +189 / 5.5KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands - - + + github.com/skycoin/dmsg/cmd/dmsgpty-host/commands - - -github.com/skycoin/dmsg/cmd/dmsgpty-host/commands -328 / 10.1KB + + +github.com/skycoin/dmsg/cmd/dmsgpty-host/commands +322 / 9.9KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgpty-host/commands - - + + github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands - - -github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands -67 / 2.2KB + + +github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands +60 / 2.1KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands - - + + github.com/skycoin/dmsg/cmd/dmsgweb/commands - - -github.com/skycoin/dmsg/cmd/dmsgweb/commands -1084 / 33.9KB + + +github.com/skycoin/dmsg/cmd/dmsgweb/commands +1079 / 33.7KB - + github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/cmd/dmsgweb/commands - - + + + + + +github.com/skycoin/dmsg/cmd/dmsg/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/cmd/dmsgcurl - -github.com/skycoin/dmsg/cmd/dmsgcurl -12 / 273B + +github.com/skycoin/dmsg/cmd/dmsgcurl +12 / 273B - + github.com/skycoin/dmsg/cmd/dmsgcurl:e->github.com/skycoin/dmsg/cmd/dmsgcurl/commands - - - - - -github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/internal/cli - - - - - -github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/internal/flags - - + + - + github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/cmd/dmsgcurl/commands:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + github.com/skycoin/dmsg/cmd/dmsghttp - -github.com/skycoin/dmsg/cmd/dmsghttp -12 / 285B + +github.com/skycoin/dmsg/cmd/dmsghttp +12 / 285B - -github.com/skycoin/dmsg/cmd/dmsghttp:e->github.com/skycoin/dmsg/cmd/dmsghttp/commands - - - - - -github.com/skycoin/dmsg/cmd/dmsghttp/commands:e->github.com/skycoin/dmsg/internal/cli - - - - -github.com/skycoin/dmsg/cmd/dmsghttp/commands:e->github.com/skycoin/dmsg/internal/flags - - +github.com/skycoin/dmsg/cmd/dmsghttp:e->github.com/skycoin/dmsg/cmd/dmsghttp/commands + + github.com/skycoin/dmsg/cmd/dmsghttp/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsghttp/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/cmd/dmsgip - -github.com/skycoin/dmsg/cmd/dmsgip -12 / 271B + +github.com/skycoin/dmsg/cmd/dmsgip +12 / 271B - -github.com/skycoin/dmsg/cmd/dmsgip:e->github.com/skycoin/dmsg/cmd/dmsgip/commands - - - - -github.com/skycoin/dmsg/cmd/dmsgip/commands:e->github.com/skycoin/dmsg/internal/cli - - +github.com/skycoin/dmsg/cmd/dmsgip:e->github.com/skycoin/dmsg/cmd/dmsgip/commands + + github.com/skycoin/dmsg/cmd/dmsgip/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgip/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/cmd/dmsgpty-cli - -github.com/skycoin/dmsg/cmd/dmsgpty-cli -12 / 282B + +github.com/skycoin/dmsg/cmd/dmsgpty-cli +12 / 282B - + github.com/skycoin/dmsg/cmd/dmsgpty-cli:e->github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands - - + + - + github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/pkg/dmsgpty - - -github.com/skycoin/dmsg/pkg/dmsgpty -3747 / 248.6KB + + +github.com/skycoin/dmsg/pkg/dmsgpty +1840 / 50.2KB - + github.com/skycoin/dmsg/cmd/dmsgpty-cli/commands:e->github.com/skycoin/dmsg/pkg/dmsgpty - - + + github.com/skycoin/dmsg/cmd/dmsgpty-host - -github.com/skycoin/dmsg/cmd/dmsgpty-host -12 / 285B + +github.com/skycoin/dmsg/cmd/dmsgpty-host +12 / 285B - + github.com/skycoin/dmsg/cmd/dmsgpty-host:e->github.com/skycoin/dmsg/cmd/dmsgpty-host/commands - - - - - -github.com/skycoin/dmsg/internal/fsutil - - -github.com/skycoin/dmsg/internal/fsutil -16 / 296B - - - - - -github.com/skycoin/dmsg/cmd/dmsgpty-host/commands:e->github.com/skycoin/dmsg/internal/fsutil - - + + - + github.com/skycoin/dmsg/cmd/dmsgpty-host/commands:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/cmd/dmsgpty-host/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgpty-host/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/cmd/dmsgpty-host/commands:e->github.com/skycoin/dmsg/pkg/dmsgpty - - + + github.com/skycoin/dmsg/cmd/dmsgpty-ui - -github.com/skycoin/dmsg/cmd/dmsgpty-ui -12 / 279B + +github.com/skycoin/dmsg/cmd/dmsgpty-ui +12 / 279B - + github.com/skycoin/dmsg/cmd/dmsgpty-ui:e->github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/cmd/dmsgpty-ui/commands:e->github.com/skycoin/dmsg/pkg/dmsgpty - - + + github.com/skycoin/dmsg/cmd/dmsgweb - -github.com/skycoin/dmsg/cmd/dmsgweb -12 / 270B + +github.com/skycoin/dmsg/cmd/dmsgweb +12 / 270B - + github.com/skycoin/dmsg/cmd/dmsgweb:e->github.com/skycoin/dmsg/cmd/dmsgweb/commands - - - - - -github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/internal/cli - - - - - -github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/internal/flags - - + + - + github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + + + + +github.com/skycoin/dmsg/pkg/ioutil + + +github.com/skycoin/dmsg/pkg/ioutil +38 / 1.1KB + + + + + +github.com/skycoin/dmsg/cmd/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/ioutil + + github.com/skycoin/dmsg/examples/basics - -github.com/skycoin/dmsg/examples/basics -111 / 3.5KB + +github.com/skycoin/dmsg/examples/basics +111 / 3.5KB - + github.com/skycoin/dmsg/examples/basics:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/basics:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/dmsgcurl/dmsg-example-http-server - -github.com/skycoin/dmsg/examples/dmsgcurl/dmsg-example-http-server -80 / 2.1KB + +github.com/skycoin/dmsg/examples/dmsgcurl/dmsg-example-http-server +80 / 2.1KB - + github.com/skycoin/dmsg/examples/dmsgcurl/dmsg-example-http-server:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/dmsgcurl/dmsg-example-http-server:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/dmsgcurl/gen-keys - -github.com/skycoin/dmsg/examples/dmsgcurl/gen-keys -10 / 215B + +github.com/skycoin/dmsg/examples/dmsgcurl/gen-keys +10 / 215B @@ -911,81 +909,81 @@ github.com/skycoin/dmsg/examples/dmsghttp - -github.com/skycoin/dmsg/examples/dmsghttp -133 / 4.3KB + +github.com/skycoin/dmsg/examples/dmsghttp +133 / 4.3KB - + github.com/skycoin/dmsg/examples/dmsghttp:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/dmsghttp:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/dmsghttp-client - -github.com/skycoin/dmsg/examples/dmsghttp-client -46 / 1.3KB + +github.com/skycoin/dmsg/examples/dmsghttp-client +46 / 1.3KB - - -github.com/skycoin/dmsg/examples/dmsghttp-client:e->github.com/skycoin/dmsg/internal/cli - - - - + github.com/skycoin/dmsg/examples/dmsghttp-client:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/examples/dmsghttp-client:e->github.com/skycoin/dmsg/pkg/dmsgclient + + - + github.com/skycoin/dmsg/examples/dmsghttp-client:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + github.com/skycoin/dmsg/examples/dmsgtcp - -github.com/skycoin/dmsg/examples/dmsgtcp -144 / 4.5KB + +github.com/skycoin/dmsg/examples/dmsgtcp +144 / 4.5KB - - -github.com/skycoin/dmsg/examples/dmsgtcp:e->github.com/skycoin/dmsg/internal/cli - - - - + github.com/skycoin/dmsg/examples/dmsgtcp:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/examples/dmsgtcp:e->github.com/skycoin/dmsg/pkg/dmsgclient + + github.com/skycoin/dmsg/examples/dmsgweb - -github.com/skycoin/dmsg/examples/dmsgweb -39 / 1.5KB + +github.com/skycoin/dmsg/examples/dmsgweb +39 / 1.5KB @@ -993,43 +991,43 @@ github.com/skycoin/dmsg/examples/dmsgweb/commands - -github.com/skycoin/dmsg/examples/dmsgweb/commands -342 / 10.4KB + +github.com/skycoin/dmsg/examples/dmsgweb/commands +342 / 10.4KB - + github.com/skycoin/dmsg/examples/dmsgweb:e->github.com/skycoin/dmsg/examples/dmsgweb/commands - - + + - + github.com/skycoin/dmsg/examples/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - + github.com/skycoin/dmsg/examples/dmsgweb/commands:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + github.com/skycoin/dmsg/examples/gen-keys - -github.com/skycoin/dmsg/examples/gen-keys -10 / 211B + +github.com/skycoin/dmsg/examples/gen-keys +10 / 211B @@ -1037,9 +1035,9 @@ github.com/skycoin/dmsg/examples/http - -github.com/skycoin/dmsg/examples/http -30 / 0.7KB + +github.com/skycoin/dmsg/examples/http +30 / 0.7KB @@ -1047,31 +1045,31 @@ github.com/skycoin/dmsg/examples/proxified - -github.com/skycoin/dmsg/examples/proxified -97 / 3.3KB + +github.com/skycoin/dmsg/examples/proxified +97 / 3.3KB - + github.com/skycoin/dmsg/examples/proxified:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/proxified:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/tcp - -github.com/skycoin/dmsg/examples/tcp -37 / 0.8KB + +github.com/skycoin/dmsg/examples/tcp +37 / 0.8KB @@ -1079,31 +1077,31 @@ github.com/skycoin/dmsg/examples/tcp-multi-proxy-dmsg - -github.com/skycoin/dmsg/examples/tcp-multi-proxy-dmsg -146 / 4.7KB + +github.com/skycoin/dmsg/examples/tcp-multi-proxy-dmsg +146 / 4.7KB - + github.com/skycoin/dmsg/examples/tcp-multi-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/tcp-multi-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/tcp-proxy - -github.com/skycoin/dmsg/examples/tcp-proxy -73 / 1.8KB + +github.com/skycoin/dmsg/examples/tcp-proxy +73 / 1.8KB @@ -1111,289 +1109,273 @@ github.com/skycoin/dmsg/examples/tcp-proxy-dmsg - -github.com/skycoin/dmsg/examples/tcp-proxy-dmsg -219 / 7.1KB + +github.com/skycoin/dmsg/examples/tcp-proxy-dmsg +219 / 7.1KB - + github.com/skycoin/dmsg/examples/tcp-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/tcp-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/dmsg - - + + github.com/skycoin/dmsg/examples/tcp-reverse-proxy-dmsg - -github.com/skycoin/dmsg/examples/tcp-reverse-proxy-dmsg -222 / 7.0KB + +github.com/skycoin/dmsg/examples/tcp-reverse-proxy-dmsg +222 / 7.0KB - + github.com/skycoin/dmsg/examples/tcp-reverse-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/examples/tcp-reverse-proxy-dmsg:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - - -github.com/skycoin/dmsg/internal/cli:e->github.com/skycoin/dmsg/internal/flags - - + + +github.com/skycoin/dmsg/internal/e2e + + +github.com/skycoin/dmsg/internal/e2e +0 / 0B + - - -github.com/skycoin/dmsg/internal/cli:e->github.com/skycoin/dmsg/pkg/direct - - - - -github.com/skycoin/dmsg/internal/cli:e->github.com/skycoin/dmsg/pkg/disc - - + + +github.com/skycoin/dmsg/internal/e2e/testserver + + +github.com/skycoin/dmsg/internal/e2e/testserver +43 / 1.2KB + + - + -github.com/skycoin/dmsg/internal/cli:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/direct:e->github.com/skycoin/dmsg/pkg/disc + + - + -github.com/skycoin/dmsg/internal/cli:e->github.com/skycoin/dmsg/pkg/dmsghttp - - +github.com/skycoin/dmsg/pkg/direct:e->github.com/skycoin/dmsg/pkg/dmsg + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/api:e->github.com/skycoin/dmsg/internal/discmetrics - - +github.com/skycoin/dmsg/pkg/discovery/api:e->github.com/skycoin/dmsg/pkg/disc + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/api:e->github.com/skycoin/dmsg/internal/dmsg-discovery/store - - +github.com/skycoin/dmsg/pkg/discovery/api:e->github.com/skycoin/dmsg/pkg/disc/metrics + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/api:e->github.com/skycoin/dmsg/pkg/disc - - +github.com/skycoin/dmsg/pkg/discovery/api:e->github.com/skycoin/dmsg/pkg/discovery/store + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/api:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/discovery/api:e->github.com/skycoin/dmsg/pkg/dmsg + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/store:e->github.com/skycoin/dmsg/pkg/disc - - +github.com/skycoin/dmsg/pkg/discovery/store:e->github.com/skycoin/dmsg/pkg/disc + + - + -github.com/skycoin/dmsg/internal/dmsg-discovery/store:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/discovery/store:e->github.com/skycoin/dmsg/pkg/dmsg + + - + -github.com/skycoin/dmsg/internal/dmsg-server/api:e->github.com/skycoin/dmsg/internal/servermetrics - - +github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/pkg/disc + + - + -github.com/skycoin/dmsg/internal/dmsg-server/api:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/pkg/dmsg/metrics + + - - -github.com/skycoin/dmsg/internal/e2e - - -github.com/skycoin/dmsg/internal/e2e -0 / 0B - - - - - -github.com/skycoin/dmsg/internal/e2e/testserver - - -github.com/skycoin/dmsg/internal/e2e/testserver -43 / 1.2KB + + +github.com/skycoin/dmsg/pkg/noise + + +github.com/skycoin/dmsg/pkg/noise +702 / 19.5KB - + -github.com/skycoin/dmsg/internal/flags:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/pkg/noise + + - + -github.com/skycoin/dmsg/pkg/direct:e->github.com/skycoin/dmsg/pkg/disc - - +github.com/skycoin/dmsg/pkg/dmsgclient:e->github.com/skycoin/dmsg/pkg/direct + + - + -github.com/skycoin/dmsg/pkg/direct:e->github.com/skycoin/dmsg/pkg/dmsg - - +github.com/skycoin/dmsg/pkg/dmsgclient:e->github.com/skycoin/dmsg/pkg/disc + + - + -github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/internal/servermetrics - - +github.com/skycoin/dmsg/pkg/dmsgclient:e->github.com/skycoin/dmsg/pkg/dmsg + + - + -github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/pkg/disc - - +github.com/skycoin/dmsg/pkg/dmsgclient:e->github.com/skycoin/dmsg/pkg/dmsghttp + + - - -github.com/skycoin/dmsg/pkg/noise - - -github.com/skycoin/dmsg/pkg/noise -668 / 18.4KB - - - - + -github.com/skycoin/dmsg/pkg/dmsg:e->github.com/skycoin/dmsg/pkg/noise - - +github.com/skycoin/dmsg/pkg/dmsgclient:e->github.com/skycoin/dmsg/pkg/ioutil + + - + github.com/skycoin/dmsg/pkg/dmsgctrl - - -github.com/skycoin/dmsg/pkg/dmsgctrl -145 / 3.2KB + + +github.com/skycoin/dmsg/pkg/dmsgctrl +179 / 4.0KB + + +github.com/skycoin/dmsg/pkg/dmsgctrl:e->github.com/skycoin/dmsg/pkg/dmsg + + + - + github.com/skycoin/dmsg/pkg/dmsgcurl - - -github.com/skycoin/dmsg/pkg/dmsgcurl -341 / 9.8KB + + +github.com/skycoin/dmsg/pkg/dmsgcurl +346 / 10.0KB - + github.com/skycoin/dmsg/pkg/dmsgcurl:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/pkg/dmsgcurl:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - + github.com/skycoin/dmsg/pkg/dmsgcurl:e->github.com/skycoin/dmsg/pkg/dmsghttp - - + + - + github.com/skycoin/dmsg/pkg/dmsghttp:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/pkg/dmsghttp:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - + github.com/skycoin/dmsg/pkg/dmsgpty:e->github.com/skycoin/dmsg/pkg/dmsg - - + + - + github.com/skycoin/dmsg/pkg/dmsgserver:e->github.com/skycoin/dmsg/pkg/dmsg - - + + + + + +github.com/skycoin/dmsg/pkg/dmsgserver:e->github.com/skycoin/dmsg/pkg/dmsg/metrics + + - + github.com/skycoin/dmsg/pkg/dmsgtest - - -github.com/skycoin/dmsg/pkg/dmsgtest -211 / 6.1KB + + +github.com/skycoin/dmsg/pkg/dmsgtest +211 / 6.1KB - + github.com/skycoin/dmsg/pkg/dmsgtest:e->github.com/skycoin/dmsg/pkg/disc - - + + - + github.com/skycoin/dmsg/pkg/dmsgtest:e->github.com/skycoin/dmsg/pkg/dmsg - - - - - -github.com/skycoin/dmsg/pkg/ioutil - - -github.com/skycoin/dmsg/pkg/ioutil -23 / 0.7KB - - + + - + github.com/skycoin/dmsg/pkg/noise:e->github.com/skycoin/dmsg/pkg/ioutil - - + + diff --git a/examples/dmsghttp-client/dmsghttp-client.go b/examples/dmsghttp-client/dmsghttp-client.go index 05efc83b8..9c3119ab3 100644 --- a/examples/dmsghttp-client/dmsghttp-client.go +++ b/examples/dmsghttp-client/dmsghttp-client.go @@ -11,8 +11,8 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" - "github.com/skycoin/dmsg/internal/cli" "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" "github.com/skycoin/dmsg/pkg/dmsghttp" ) @@ -25,7 +25,7 @@ func main() { } pk, sk := cipher.GenerateKeyPair() ctx := context.Background() - dmsgClient, closeDmsg, err := cli.StartDmsg(ctx, dLog, pk, sk, &http.Client{}, dmsgDisc, 1) + dmsgClient, closeDmsg, err := dmsgclient.StartDmsg(ctx, dLog, pk, sk, &http.Client{}, dmsgDisc, 1) if err != nil { dLog.Fatalf("Failed to start DMSG client: %v", err) } diff --git a/examples/dmsgtcp/dmsgtcp.go b/examples/dmsgtcp/dmsgtcp.go index 1a0592f22..0e0632272 100644 --- a/examples/dmsgtcp/dmsgtcp.go +++ b/examples/dmsgtcp/dmsgtcp.go @@ -17,8 +17,8 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/spf13/cobra" - "github.com/skycoin/dmsg/internal/cli" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsgclient" ) var ( @@ -60,7 +60,7 @@ var RootCmd = &cobra.Command{ } // Initialize the DMSG client - dmsgC, closeDmsg, err := cli.StartDmsg(ctx, log, pk, sk, &http.Client{}, dmsgDisc, 1) + dmsgC, closeDmsg, err := dmsgclient.StartDmsg(ctx, log, pk, sk, &http.Client{}, dmsgDisc, 1) if err != nil { log.WithError(err).Fatal("failed to start dmsg") } diff --git a/go.mod b/go.mod index d611dad80..9ff1dbe79 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module github.com/skycoin/dmsg -go 1.25.6 +go 1.26.1 require ( github.com/ActiveState/termtest/conpty v0.5.0 - github.com/VictoriaMetrics/metrics v1.41.2 + github.com/VictoriaMetrics/metrics v1.42.0 github.com/bitfield/script v0.24.1 github.com/chen3feng/safecast v0.0.0-20220908170618-81b2ecd47937 github.com/coder/websocket v1.8.14 @@ -19,25 +19,25 @@ require ( github.com/pires/go-proxyproto v0.11.0 github.com/sirupsen/logrus v1.9.4 github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 - github.com/skycoin/skycoin v0.28.3 - github.com/skycoin/skywire v1.3.35-0.20260222235451-f11c46808634 + github.com/skycoin/skycoin v0.28.5-alpha1.0.20260323015226-90b668188f85 + github.com/skycoin/skywire v1.3.37 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.11.1 - golang.org/x/net v0.51.0 - golang.org/x/sys v0.41.0 - golang.org/x/term v0.40.0 + golang.org/x/net v0.52.0 + golang.org/x/sys v0.42.0 + golang.org/x/term v0.41.0 ) require ( github.com/docker/docker v28.5.2+incompatible github.com/tidwall/pretty v1.2.1 - github.com/xtaci/smux v1.5.56 + github.com/xtaci/smux v1.5.57 ) require ( github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/gopkg v0.1.4 // indirect github.com/bytedance/sonic v1.15.0 // indirect github.com/bytedance/sonic/loader v0.5.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -50,7 +50,7 @@ require ( github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect - github.com/fatih/color v1.18.0 // indirect + github.com/fatih/color v1.19.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/gin-contrib/sse v1.1.0 // indirect @@ -59,7 +59,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.30.1 // indirect - github.com/goccy/go-json v0.10.5 // indirect + github.com/goccy/go-json v0.10.6 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/itchyny/gojq v0.12.18 // indirect @@ -96,14 +96,13 @@ require ( go.opentelemetry.io/otel/sdk v1.39.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect go.opentelemetry.io/otel/trace v1.39.0 // indirect - golang.org/x/arch v0.24.0 // indirect - golang.org/x/crypto v0.48.0 // indirect - golang.org/x/text v0.34.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d // indirect + golang.org/x/arch v0.25.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/text v0.35.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.2 // indirect - mvdan.cc/sh/v3 v3.12.0 // indirect + mvdan.cc/sh/v3 v3.13.0 // indirect ) // IT IS FORBIDDEN TO USE REPLACE DIRECTIVES diff --git a/go.sum b/go.sum index a6bac0e88..507835333 100644 --- a/go.sum +++ b/go.sum @@ -5,12 +5,12 @@ github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEK github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/VictoriaMetrics/metrics v1.41.2 h1:pLQ4Mw9TqXFq3ZsZVJkz88JHpjL9LY5NHTY3v2gBNAw= -github.com/VictoriaMetrics/metrics v1.41.2/go.mod h1:xDM82ULLYCYdFRgQ2JBxi8Uf1+8En1So9YUwlGTOqTc= +github.com/VictoriaMetrics/metrics v1.42.0 h1:t/OGs3BjMUYhxw/h83Z28qAss8DuA4QEVwO4NwJ9hZc= +github.com/VictoriaMetrics/metrics v1.42.0/go.mod h1:xDM82ULLYCYdFRgQ2JBxi8Uf1+8En1So9YUwlGTOqTc= github.com/bitfield/script v0.24.1 h1:D4ZWu72qWL/at0rXFF+9xgs17VwyrpT6PkkBTdEz9xU= github.com/bitfield/script v0.24.1/go.mod h1:fv+6x4OzVsRs6qAlc7wiGq8fq1b5orhtQdtW0dwjUHI= -github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= -github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= +github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= @@ -53,8 +53,8 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= -github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= @@ -84,8 +84,8 @@ github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7 github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU= +github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -170,10 +170,10 @@ github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 h1:1Nc5EBY6pjfw1kwW0duwyG+7WliWz5u9kgk1h5MnLuA= github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:UXghlricA7J3aRD/k7p/zBObQfmBawwCxIVPVjz2Q3o= -github.com/skycoin/skycoin v0.28.3 h1:lakAtKaT1T0jKcIynov0oK/jfeUPrDR9M+kqwl+GjPs= -github.com/skycoin/skycoin v0.28.3/go.mod h1:FxRzVp/LzhrJXdPSDxVr1AUTp0v36PwwPNTvEVxrVpI= -github.com/skycoin/skywire v1.3.35-0.20260222235451-f11c46808634 h1:RkIZqoeTr2z00NUc0ruJgac1jaAZm7+Po3BiVc29VEY= -github.com/skycoin/skywire v1.3.35-0.20260222235451-f11c46808634/go.mod h1:5+Wk6fNmovhPwoPkptN4Kxh2lvsVcpoH3SOrytminYg= +github.com/skycoin/skycoin v0.28.5-alpha1.0.20260323015226-90b668188f85 h1:IiU8PjIzg/BlTpSXXgq1pVCEbKnDfGMnUAqgwwjNt4s= +github.com/skycoin/skycoin v0.28.5-alpha1.0.20260323015226-90b668188f85/go.mod h1:tgVxjBBV4/OxVBDrcpsVK0q/awGxqBjwTUPDBMh9ZcA= +github.com/skycoin/skywire v1.3.37 h1:LIgOrj6PqdH6RAOWsD8TSI/vTyp7kUYE2Ale6pkvjJw= +github.com/skycoin/skywire v1.3.37/go.mod h1:k3TA1edIXR96Jtec5XYVy7EGHQlZL524pCPYRTzBBok= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= @@ -202,8 +202,8 @@ github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G github.com/valyala/fastrand v1.1.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ= github.com/valyala/histogram v1.2.0 h1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ= github.com/valyala/histogram v1.2.0/go.mod h1:Hb4kBwb4UxsaNbbbh+RRz8ZR6pdodR57tzWUS3BUzXY= -github.com/xtaci/smux v1.5.56 h1:Eyv/dUULmkGZZNucLUisnkzJ/4UQ5YZTschhugFBM0U= -github.com/xtaci/smux v1.5.56/go.mod h1:IGQ9QYrBphmb/4aTnLEcJby0TNr3NV+OslIOMrX825Q= +github.com/xtaci/smux v1.5.57 h1:N72VbGoSYxgcm6mPOYX0QzEZNVD3UI/JlVvAtXF+WrY= +github.com/xtaci/smux v1.5.57/go.mod h1:IGQ9QYrBphmb/4aTnLEcJby0TNr3NV+OslIOMrX825Q= go.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE= go.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= @@ -229,34 +229,34 @@ go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzK go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/arch v0.24.0 h1:qlJ3M9upxvFfwRM51tTg3Yl+8CP9vCC1E7vlFpgv99Y= -golang.org/x/arch v0.24.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= -golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/arch v0.25.0 h1:qnk6Ksugpi5Bz32947rkUgDt9/s5qvqDPl/gBKdMJLE= +golang.org/x/arch v0.25.0/go.mod h1:0X+GdSIP+kL5wPmpK7sdkEVTt2XoYP0cSjQSbZBwOi8= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200428200454-593003d681fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= -golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= -golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= -golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= -google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 h1:ndE4FoJqsIceKP2oYSnUZqhTdYufCYYkqwtFzfrhI7w= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -270,5 +270,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -mvdan.cc/sh/v3 v3.12.0 h1:ejKUR7ONP5bb+UGHGEG/k9V5+pRVIyD+LsZz7o8KHrI= -mvdan.cc/sh/v3 v3.12.0/go.mod h1:Se6Cj17eYSn+sNooLZiEUnNNmNxg0imoYlTu4CyaGyg= +mvdan.cc/sh/v3 v3.13.0 h1:dSfq/MVsY4w0Vsi6Lbs0IcQquMVqLdKLESAOZjuHdLg= +mvdan.cc/sh/v3 v3.13.0/go.mod h1:KV1GByGPc/Ho0X1E6Uz9euhsIQEj4hwyKnodLlFLoDM= diff --git a/internal/fsutil/fsutil.go b/internal/fsutil/fsutil.go deleted file mode 100644 index 71e0f4ef1..000000000 --- a/internal/fsutil/fsutil.go +++ /dev/null @@ -1,19 +0,0 @@ -// Package fsutil internal/fsutil/fsutil.go - -package fsutil - -import ( - "os" -) - -// Exists checks if file exists at `path`. -func Exists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} diff --git a/pkg/disc/client.go b/pkg/disc/client.go index a8160d221..b7d18461a 100644 --- a/pkg/disc/client.go +++ b/pkg/disc/client.go @@ -17,14 +17,24 @@ import ( var json = jsoniter.ConfigFastest -// APIClient implements dmsg discovery API client. -type APIClient interface { +// EntryReader provides read-only access to discovery entries. +type EntryReader interface { Entry(context.Context, cipher.PubKey) (*Entry, error) + AvailableServers(context.Context) ([]*Entry, error) + AllServers(context.Context) ([]*Entry, error) +} + +// EntryWriter provides write access to discovery entries. +type EntryWriter interface { PostEntry(context.Context, *Entry) error PutEntry(context.Context, cipher.SecKey, *Entry) error DelEntry(context.Context, *Entry) error - AvailableServers(context.Context) ([]*Entry, error) - AllServers(context.Context) ([]*Entry, error) +} + +// APIClient implements dmsg discovery API client. +type APIClient interface { + EntryReader + EntryWriter AllEntries(ctx context.Context) ([]string, error) AllClientsByServer(ctx context.Context) (map[string][]*Entry, error) ClientsByServer(ctx context.Context, serverPK cipher.PubKey) ([]*Entry, error) diff --git a/pkg/disc/client_test.go b/pkg/disc/client_test.go new file mode 100644 index 000000000..294b559f0 --- /dev/null +++ b/pkg/disc/client_test.go @@ -0,0 +1,980 @@ +package disc_test + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/dmsg/pkg/disc" +) + +// --- Mock client Entry/PostEntry/PutEntry/DelEntry lifecycle --- + +func TestMockClientEntryLifecycle(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk, sk := cipher.GenerateKeyPair() + + // Entry should not exist yet. + _, err := mock.Entry(ctx, pk) + require.Error(t, err, "entry should not exist before being posted") + + // Create and post a server entry. + entry := disc.NewServerEntry(pk, 0, "localhost:9090", 10) + require.NoError(t, entry.Sign(sk)) + require.NoError(t, mock.PostEntry(ctx, entry)) + + // Retrieve and verify. + got, err := mock.Entry(ctx, pk) + require.NoError(t, err) + assert.Equal(t, pk, got.Static) + assert.Equal(t, "localhost:9090", got.Server.Address) + + // Update via PutEntry. + entry.Server.Address = "remotehost:9091" + require.NoError(t, mock.PutEntry(ctx, sk, entry)) + + got2, err := mock.Entry(ctx, pk) + require.NoError(t, err) + assert.Equal(t, "remotehost:9091", got2.Server.Address) + assert.Greater(t, got2.Sequence, got.Sequence) + + // Delete entry. + require.NoError(t, mock.DelEntry(ctx, entry)) + + _, err = mock.Entry(ctx, pk) + require.Error(t, err, "entry should be gone after deletion") +} + +func TestMockClientPostEntryValidatesIteration(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk, sk := cipher.GenerateKeyPair() + + // Post initial entry at sequence 0. + entry := disc.NewServerEntry(pk, 0, "addr:1234", 5) + require.NoError(t, entry.Sign(sk)) + require.NoError(t, mock.PostEntry(ctx, entry)) + + // Posting again with same sequence should fail (wrong sequence). + entry2 := disc.NewServerEntry(pk, 0, "addr:1234", 5) + require.NoError(t, entry2.Sign(sk)) + err := mock.PostEntry(ctx, entry2) + require.Error(t, err) +} + +func TestMockClientPutEntryWrongKey(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk, sk := cipher.GenerateKeyPair() + _, wrongSk := cipher.GenerateKeyPair() + + entry := disc.NewServerEntry(pk, 0, "addr:5555", 2) + require.NoError(t, entry.Sign(sk)) + require.NoError(t, mock.PostEntry(ctx, entry)) + + // PutEntry with wrong secret key should fail. + entry.Server.Address = "addr:6666" + err := mock.PutEntry(ctx, wrongSk, entry) + require.Error(t, err) +} + +func TestMockClientDelEntryNonExistent(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk, _ := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1111", 1) + + // Deleting non-existent entry should not error (mock behavior). + require.NoError(t, mock.DelEntry(ctx, entry)) +} + +// --- AvailableServers / AllServers with mock --- + +func TestMockAvailableServersEmpty(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + servers, err := mock.AvailableServers(ctx) + require.NoError(t, err) + assert.Empty(t, servers) +} + +func TestMockAvailableServersOnlyReturnsServerEntries(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + // Add a client entry. + clientPK, clientSK := cipher.GenerateKeyPair() + serverPK, serverSK := cipher.GenerateKeyPair() + + clientEntry := disc.NewClientEntry(clientPK, 0, []cipher.PubKey{serverPK}) + require.NoError(t, clientEntry.Sign(clientSK)) + require.NoError(t, mock.PostEntry(ctx, clientEntry)) + + // Add a server entry. + serverEntry := disc.NewServerEntry(serverPK, 0, "server:8080", 10) + require.NoError(t, serverEntry.Sign(serverSK)) + require.NoError(t, mock.PostEntry(ctx, serverEntry)) + + servers, err := mock.AvailableServers(ctx) + require.NoError(t, err) + require.Len(t, servers, 1) + assert.Equal(t, serverPK, servers[0].Static) +} + +func TestMockAllServersReturnsServerEntries(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk1, sk1 := cipher.GenerateKeyPair() + pk2, sk2 := cipher.GenerateKeyPair() + + e1 := disc.NewServerEntry(pk1, 0, "s1:1111", 5) + require.NoError(t, e1.Sign(sk1)) + require.NoError(t, mock.PostEntry(ctx, e1)) + + e2 := disc.NewServerEntry(pk2, 0, "s2:2222", 3) + require.NoError(t, e2.Sign(sk2)) + require.NoError(t, mock.PostEntry(ctx, e2)) + + servers, err := mock.AllServers(ctx) + require.NoError(t, err) + assert.Len(t, servers, 2) +} + +// --- AllEntries --- + +func TestMockAllEntries(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + pk1, sk1 := cipher.GenerateKeyPair() + pk2, sk2 := cipher.GenerateKeyPair() + + e1 := disc.NewServerEntry(pk1, 0, "a:1", 1) + require.NoError(t, e1.Sign(sk1)) + require.NoError(t, mock.PostEntry(ctx, e1)) + + e2 := disc.NewClientEntry(pk2, 0, []cipher.PubKey{pk1}) + require.NoError(t, e2.Sign(sk2)) + require.NoError(t, mock.PostEntry(ctx, e2)) + + entries, err := mock.AllEntries(ctx) + require.NoError(t, err) + assert.Len(t, entries, 2) + + hexes := map[string]bool{pk1.Hex(): true, pk2.Hex(): true} + for _, h := range entries { + assert.True(t, hexes[h], "unexpected hex key in AllEntries") + } +} + +// --- AllClientsByServer --- + +func TestMockAllClientsByServer(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + serverPK, serverSK := cipher.GenerateKeyPair() + serverEntry := disc.NewServerEntry(serverPK, 0, "srv:1000", 10) + require.NoError(t, serverEntry.Sign(serverSK)) + require.NoError(t, mock.PostEntry(ctx, serverEntry)) + + clientPK1, clientSK1 := cipher.GenerateKeyPair() + clientPK2, clientSK2 := cipher.GenerateKeyPair() + + c1 := disc.NewClientEntry(clientPK1, 0, []cipher.PubKey{serverPK}) + require.NoError(t, c1.Sign(clientSK1)) + require.NoError(t, mock.PostEntry(ctx, c1)) + + c2 := disc.NewClientEntry(clientPK2, 0, []cipher.PubKey{serverPK}) + require.NoError(t, c2.Sign(clientSK2)) + require.NoError(t, mock.PostEntry(ctx, c2)) + + result, err := mock.AllClientsByServer(ctx) + require.NoError(t, err) + assert.Len(t, result[serverPK.Hex()], 2) +} + +// --- ClientsByServer --- + +func TestMockClientsByServer(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(0) + + serverPK1, serverSK1 := cipher.GenerateKeyPair() + serverPK2, serverSK2 := cipher.GenerateKeyPair() + + s1 := disc.NewServerEntry(serverPK1, 0, "s1:1", 5) + require.NoError(t, s1.Sign(serverSK1)) + require.NoError(t, mock.PostEntry(ctx, s1)) + + s2 := disc.NewServerEntry(serverPK2, 0, "s2:2", 5) + require.NoError(t, s2.Sign(serverSK2)) + require.NoError(t, mock.PostEntry(ctx, s2)) + + clientPK, clientSK := cipher.GenerateKeyPair() + c := disc.NewClientEntry(clientPK, 0, []cipher.PubKey{serverPK1}) + require.NoError(t, c.Sign(clientSK)) + require.NoError(t, mock.PostEntry(ctx, c)) + + // Should find client under serverPK1. + clients, err := mock.ClientsByServer(ctx, serverPK1) + require.NoError(t, err) + assert.Len(t, clients, 1) + assert.Equal(t, clientPK, clients[0].Static) + + // Should find no clients under serverPK2. + clients2, err := mock.ClientsByServer(ctx, serverPK2) + require.NoError(t, err) + assert.Empty(t, clients2) +} + +// --- HTTPMessage String() --- + +func TestHTTPMessageString(t *testing.T) { + msg := disc.HTTPMessage{Code: http.StatusOK, Message: "wrote a new entry"} + assert.Equal(t, "status code: 200. message: wrote a new entry", msg.String()) + + msg2 := disc.HTTPMessage{Code: http.StatusNotFound, Message: "entry of public key is not found"} + assert.Equal(t, "status code: 404. message: entry of public key is not found", msg2.String()) + + msg3 := disc.HTTPMessage{Code: 0, Message: ""} + assert.Equal(t, "status code: 0. message: ", msg3.String()) +} + +func TestExposedHTTPMessages(t *testing.T) { + assert.Equal(t, http.StatusOK, disc.MsgEntrySet.Code) + assert.Equal(t, "wrote a new entry", disc.MsgEntrySet.Message) + + assert.Equal(t, http.StatusOK, disc.MsgEntryUpdated.Code) + assert.Equal(t, "wrote new entry iteration", disc.MsgEntryUpdated.Message) + + assert.Equal(t, http.StatusOK, disc.MsgEntryDeleted.Code) + assert.Equal(t, "deleted entry", disc.MsgEntryDeleted.Message) +} + +// --- NewHTTP constructor --- + +func TestNewHTTPCreatesValidClient(t *testing.T) { + log := logging.MustGetLogger("disc_test") + client := disc.NewHTTP("http://localhost:9999", &http.Client{}, log) + require.NotNil(t, client) + + // Verify it implements APIClient by attempting a call that will fail with connection refused. + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + t.Cleanup(cancel) + + _, err := client.Entry(ctx, cipher.PubKey{}) + require.Error(t, err, "should fail because server is not running") +} + +func TestNewHTTPWithNilHTTPClient(t *testing.T) { + log := logging.MustGetLogger("disc_test") + // Passing nil http.Client -- NewHTTP stores it; calls will panic/error at request time. + client := disc.NewHTTP("http://localhost:9999", nil, log) + require.NotNil(t, client) +} + +// --- Entry Copy function --- + +func TestCopyServerEntry(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + src := disc.NewServerEntry(pk, 5, "addr:8080", 20) + require.NoError(t, src.Sign(sk)) + + dst := &disc.Entry{} + disc.Copy(dst, src) + + assert.Equal(t, src.Static, dst.Static) + assert.Equal(t, src.Version, dst.Version) + assert.Equal(t, src.Sequence, dst.Sequence) + assert.Equal(t, src.Timestamp, dst.Timestamp) + assert.Equal(t, src.Signature, dst.Signature) + require.NotNil(t, dst.Server) + assert.Equal(t, src.Server.Address, dst.Server.Address) + assert.Equal(t, src.Server.AvailableSessions, dst.Server.AvailableSessions) + assert.Nil(t, dst.Client) + + // Verify deep copy -- mutating dst should not affect src. + dst.Server.Address = "changed" + assert.NotEqual(t, src.Server.Address, dst.Server.Address) +} + +func TestCopyClientEntry(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + serverPK, _ := cipher.GenerateKeyPair() + src := disc.NewClientEntry(pk, 3, []cipher.PubKey{serverPK}) + require.NoError(t, src.Sign(sk)) + + dst := &disc.Entry{} + disc.Copy(dst, src) + + assert.Equal(t, src.Static, dst.Static) + require.NotNil(t, dst.Client) + require.Len(t, dst.Client.DelegatedServers, 1) + assert.Equal(t, serverPK, dst.Client.DelegatedServers[0]) + assert.Nil(t, dst.Server) + + // Verify deep copy of DelegatedServers slice. + dst.Client.DelegatedServers[0] = cipher.PubKey{} + assert.NotEqual(t, src.Client.DelegatedServers[0], dst.Client.DelegatedServers[0]) +} + +func TestCopyNilFields(t *testing.T) { + // Copy from empty to populated should clear dst fields. + src := &disc.Entry{} + dst := &disc.Entry{ + Client: &disc.Client{DelegatedServers: []cipher.PubKey{{}}}, + Server: &disc.Server{Address: "x"}, + } + disc.Copy(dst, src) + assert.Nil(t, dst.Client) + assert.Nil(t, dst.Server) +} + +// --- Error variables are distinct --- + +func TestErrorVariablesAreDistinct(t *testing.T) { + errs := []error{ + disc.ErrKeyNotFound, + disc.ErrNoAvailableServers, + disc.ErrUnexpected, + disc.ErrUnauthorized, + disc.ErrBadInput, + disc.ErrValidationNonZeroSequence, + disc.ErrValidationNilEphemerals, + disc.ErrValidationNilKeys, + disc.ErrValidationNonNilEphemerals, + disc.ErrValidationNoSignature, + disc.ErrValidationNoVersion, + disc.ErrValidationNoClientOrServer, + disc.ErrValidationWrongSequence, + disc.ErrValidationWrongTime, + disc.ErrValidationOutdatedTime, + disc.ErrValidationServerAddress, + disc.ErrValidationEmptyServerAddress, + disc.ErrUnauthorizedNetworkMonitor, + } + + // All errors must be non-nil and have distinct messages. + seen := make(map[string]bool, len(errs)) + for _, e := range errs { + require.NotNil(t, e) + msg := e.Error() + assert.False(t, seen[msg], "duplicate error message: %s", msg) + seen[msg] = true + } +} + +// --- EntryValidationError --- + +func TestEntryValidationErrorString(t *testing.T) { + err := disc.NewEntryValidationError("test cause") + assert.Equal(t, "entry validation error: test cause", err.Error()) +} + +// --- Entry and Server/Client String() methods --- + +func TestEntryString(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + serverPK, _ := cipher.GenerateKeyPair() + + t.Run("server entry string", func(t *testing.T) { + entry := disc.NewServerEntry(pk, 0, "addr:1234", 5) + require.NoError(t, entry.Sign(sk)) + s := entry.String() + assert.Contains(t, s, "registered as server") + assert.Contains(t, s, "addr:1234") + }) + + t.Run("client entry string", func(t *testing.T) { + entry := disc.NewClientEntry(pk, 0, []cipher.PubKey{serverPK}) + require.NoError(t, entry.Sign(sk)) + s := entry.String() + assert.Contains(t, s, "registered as client") + assert.Contains(t, s, "delegated servers") + }) +} + +// --- NewClientEntry / NewServerEntry construction --- + +func TestNewClientEntryFields(t *testing.T) { + pk, _ := cipher.GenerateKeyPair() + serverPK, _ := cipher.GenerateKeyPair() + + entry := disc.NewClientEntry(pk, 7, []cipher.PubKey{serverPK}) + assert.Equal(t, pk, entry.Static) + assert.Equal(t, uint64(7), entry.Sequence) + require.NotNil(t, entry.Client) + assert.Len(t, entry.Client.DelegatedServers, 1) + assert.Nil(t, entry.Server) + assert.NotEmpty(t, entry.Version) + assert.NotZero(t, entry.Timestamp) +} + +func TestNewServerEntryFields(t *testing.T) { + pk, _ := cipher.GenerateKeyPair() + + entry := disc.NewServerEntry(pk, 3, "myaddr:5555", 42) + assert.Equal(t, pk, entry.Static) + assert.Equal(t, uint64(3), entry.Sequence) + require.NotNil(t, entry.Server) + assert.Equal(t, "myaddr:5555", entry.Server.Address) + assert.Equal(t, 42, entry.Server.AvailableSessions) + assert.Nil(t, entry.Client) + assert.NotEmpty(t, entry.Version) + assert.NotZero(t, entry.Timestamp) +} + +// --- Validate edge cases --- + +func TestValidateNoVersion(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + entry.Version = "" + require.NoError(t, entry.Sign(sk)) + + err := entry.Validate(false) + assert.ErrorIs(t, err, disc.ErrValidationNoVersion) +} + +func TestValidateNoSignature(t *testing.T) { + pk, _ := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + // Don't sign. + err := entry.Validate(false) + assert.ErrorIs(t, err, disc.ErrValidationNoSignature) +} + +func TestValidateNoClientOrServer(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := &disc.Entry{ + Version: "0.0.1", + Static: pk, + Timestamp: time.Now().UnixNano(), + } + require.NoError(t, entry.Sign(sk)) + err := entry.Validate(false) + assert.ErrorIs(t, err, disc.ErrValidationNoClientOrServer) +} + +func TestValidateEmptyServerAddress(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "", 1) + require.NoError(t, entry.Sign(sk)) + err := entry.Validate(false) + assert.ErrorIs(t, err, disc.ErrValidationEmptyServerAddress) +} + +func TestValidateTimestampOutdated(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + entry.Timestamp = time.Now().Add(-10 * time.Minute).UnixNano() + require.NoError(t, entry.Sign(sk)) + err := entry.Validate(true) + assert.ErrorIs(t, err, disc.ErrValidationOutdatedTime) +} + +func TestValidateTimestampFuture(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + entry.Timestamp = time.Now().Add(10 * time.Minute).UnixNano() + require.NoError(t, entry.Sign(sk)) + err := entry.Validate(true) + assert.ErrorIs(t, err, disc.ErrValidationOutdatedTime) +} + +func TestValidateTimestampSkipped(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + // Old timestamp but validateTimestamp=false should pass. + entry.Timestamp = time.Now().Add(-10 * time.Minute).UnixNano() + require.NoError(t, entry.Sign(sk)) + err := entry.Validate(false) + assert.NoError(t, err) +} + +// --- Sign / VerifySignature --- + +func TestSignAndVerify(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + + require.NoError(t, entry.Sign(sk)) + assert.NotEmpty(t, entry.Signature) + assert.NoError(t, entry.VerifySignature()) +} + +func TestVerifySignatureWrongKey(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + _, sk2 := cipher.GenerateKeyPair() + + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk2)) // signed with wrong key + err := entry.VerifySignature() + assert.Error(t, err) + + _ = sk // use sk to avoid lint +} + +func TestVerifySignatureTampered(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + // Tamper with entry after signing. + entry.Server.Address = "tampered" + err := entry.VerifySignature() + assert.Error(t, err) +} + +// --- ValidateIteration --- + +func TestValidateIterationSuccess(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + e1 := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, e1.Sign(sk)) + + e2 := disc.NewServerEntry(pk, 1, "addr:1", 1) + e2.Timestamp = e1.Timestamp + 1 + require.NoError(t, e2.Sign(sk)) + + assert.NoError(t, e1.ValidateIteration(e2)) +} + +func TestValidateIterationWrongSeq(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + e1 := disc.NewServerEntry(pk, 5, "addr:1", 1) + require.NoError(t, e1.Sign(sk)) + + e2 := disc.NewServerEntry(pk, 3, "addr:1", 1) + require.NoError(t, e2.Sign(sk)) + + err := e1.ValidateIteration(e2) + assert.ErrorIs(t, err, disc.ErrValidationWrongSequence) +} + +func TestValidateIterationWrongTimestamp(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + e1 := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, e1.Sign(sk)) + + e2 := disc.NewServerEntry(pk, 1, "addr:1", 1) + e2.Timestamp = e1.Timestamp - 1000 + require.NoError(t, e2.Sign(sk)) + + err := e1.ValidateIteration(e2) + assert.ErrorIs(t, err, disc.ErrValidationWrongTime) +} + +// --- Mock with timeout --- + +func TestMockClientWithTimeout(t *testing.T) { + ctx := context.Background() + mock := disc.NewMock(200 * time.Millisecond) + + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + require.NoError(t, mock.PostEntry(ctx, entry)) + + // Entry should exist immediately. + _, err := mock.Entry(ctx, pk) + require.NoError(t, err) + + // After timeout, entry should be removed. + time.Sleep(400 * time.Millisecond) + _, err = mock.Entry(ctx, pk) + require.Error(t, err, "entry should have been removed after timeout") +} + +// --- NilKeys validation --- + +func TestValidateNilKeys(t *testing.T) { + entry := &disc.Entry{ + Version: "0.0.1", + Signature: "something", + Client: &disc.Client{}, + } + err := entry.Validate(false) + assert.ErrorIs(t, err, disc.ErrValidationNilKeys) +} + +// =========================================================================== +// httpClient tests using httptest +// =========================================================================== + +// helper: create a test server + httpClient pair +func newTestHTTPClient(t *testing.T, handler http.Handler) disc.APIClient { + t.Helper() + srv := httptest.NewServer(handler) + t.Cleanup(srv.Close) + log := logging.MustGetLogger("disc_http_test") + return disc.NewHTTP(srv.URL, srv.Client(), log) +} + +func TestHTTPClientEntry_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:9090", 5) + require.NoError(t, entry.Sign(sk)) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodGet, r.Method) + assert.Contains(t, r.URL.Path, "/dmsg-discovery/entry/") + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(entry) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + got, err := client.Entry(context.Background(), pk) + require.NoError(t, err) + assert.Equal(t, pk, got.Static) + assert.Equal(t, "addr:9090", got.Server.Address) +} + +func TestHTTPClientEntry_NotFound(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusNotFound) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusNotFound, + Message: disc.ErrKeyNotFound.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.Entry(context.Background(), cipher.PubKey{}) + require.Error(t, err) + assert.Equal(t, disc.ErrKeyNotFound, err) +} + +func TestHTTPClientEntry_UnknownErrorBecomesUnexpected(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusInternalServerError, + Message: "some unknown error", + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.Entry(context.Background(), cipher.PubKey{}) + require.Error(t, err) + assert.Equal(t, disc.ErrUnexpected, err) +} + +func TestHTTPClientPostEntry_Success(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodPost, r.Method) + assert.Equal(t, "/dmsg-discovery/entry/", r.URL.Path) + w.WriteHeader(http.StatusOK) + }) + + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + client := newTestHTTPClient(t, handler) + err := client.PostEntry(context.Background(), entry) + require.NoError(t, err) +} + +func TestHTTPClientPostEntry_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusUnprocessableEntity) + body, _ := json.Marshal(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusUnprocessableEntity, + Message: disc.ErrValidationWrongSequence.Error(), + }) + w.Write(body) //nolint:errcheck,gosec + }) + + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + client := newTestHTTPClient(t, handler) + err := client.PostEntry(context.Background(), entry) + require.Error(t, err) + assert.Equal(t, disc.ErrValidationWrongSequence, err) +} + +func TestHTTPClientDelEntry_Success(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodDelete, r.Method) + assert.Equal(t, "/dmsg-discovery/entry", r.URL.Path) + w.WriteHeader(http.StatusOK) + }) + + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + client := newTestHTTPClient(t, handler) + err := client.DelEntry(context.Background(), entry) + require.NoError(t, err) +} + +func TestHTTPClientDelEntry_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusUnauthorized) + body, _ := json.Marshal(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusUnauthorized, + Message: disc.ErrUnauthorized.Error(), + }) + w.Write(body) //nolint:errcheck,gosec + }) + + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + client := newTestHTTPClient(t, handler) + err := client.DelEntry(context.Background(), entry) + require.Error(t, err) + assert.Equal(t, disc.ErrUnauthorized, err) +} + +func TestHTTPClientAvailableServers_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:8080", 10) + require.NoError(t, entry.Sign(sk)) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/dmsg-discovery/available_servers", r.URL.Path) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode([]*disc.Entry{entry}) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + servers, err := client.AvailableServers(context.Background()) + require.NoError(t, err) + require.Len(t, servers, 1) + assert.Equal(t, pk, servers[0].Static) +} + +func TestHTTPClientAvailableServers_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusInternalServerError, + Message: disc.ErrNoAvailableServers.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.AvailableServers(context.Background()) + require.Error(t, err) + assert.Equal(t, disc.ErrNoAvailableServers, err) +} + +func TestHTTPClientAllServers_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:8080", 10) + require.NoError(t, entry.Sign(sk)) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/dmsg-discovery/all_servers", r.URL.Path) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode([]*disc.Entry{entry}) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + servers, err := client.AllServers(context.Background()) + require.NoError(t, err) + require.Len(t, servers, 1) +} + +func TestHTTPClientAllServers_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusInternalServerError, + Message: disc.ErrUnexpected.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.AllServers(context.Background()) + require.Error(t, err) + assert.Equal(t, disc.ErrUnexpected, err) +} + +func TestHTTPClientAllEntries_Success(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/dmsg-discovery/entries", r.URL.Path) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode([]string{"abc123", "def456"}) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + entries, err := client.AllEntries(context.Background()) + require.NoError(t, err) + assert.Len(t, entries, 2) +} + +func TestHTTPClientAllEntries_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusInternalServerError, + Message: disc.ErrBadInput.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.AllEntries(context.Background()) + require.Error(t, err) + assert.Equal(t, disc.ErrBadInput, err) +} + +func TestHTTPClientAllClientsByServer_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + serverPK, _ := cipher.GenerateKeyPair() + entry := disc.NewClientEntry(pk, 0, []cipher.PubKey{serverPK}) + require.NoError(t, entry.Sign(sk)) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/dmsg-discovery/servers/clients", r.URL.Path) + w.Header().Set("Content-Type", "application/json") + result := map[string][]*disc.Entry{ + serverPK.Hex(): {entry}, + } + json.NewEncoder(w).Encode(result) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + result, err := client.AllClientsByServer(context.Background()) + require.NoError(t, err) + assert.Len(t, result[serverPK.Hex()], 1) +} + +func TestHTTPClientAllClientsByServer_Error(t *testing.T) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusInternalServerError, + Message: disc.ErrUnexpected.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.AllClientsByServer(context.Background()) + require.Error(t, err) + assert.Equal(t, disc.ErrUnexpected, err) +} + +func TestHTTPClientClientsByServer_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + serverPK, _ := cipher.GenerateKeyPair() + entry := disc.NewClientEntry(pk, 0, []cipher.PubKey{serverPK}) + require.NoError(t, entry.Sign(sk)) + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + expectedPath := fmt.Sprintf("/dmsg-discovery/server/%s/clients", serverPK.Hex()) + assert.Equal(t, expectedPath, r.URL.Path) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode([]*disc.Entry{entry}) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + entries, err := client.ClientsByServer(context.Background(), serverPK) + require.NoError(t, err) + require.Len(t, entries, 1) + assert.Equal(t, pk, entries[0].Static) +} + +func TestHTTPClientClientsByServer_Error(t *testing.T) { + serverPK, _ := cipher.GenerateKeyPair() + + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusNotFound) + json.NewEncoder(w).Encode(disc.HTTPMessage{ //nolint:errcheck,gosec + Code: http.StatusNotFound, + Message: disc.ErrKeyNotFound.Error(), + }) + }) + + client := newTestHTTPClient(t, handler) + _, err := client.ClientsByServer(context.Background(), serverPK) + require.Error(t, err) + assert.Equal(t, disc.ErrKeyNotFound, err) +} + +func TestHTTPClientPutEntry_Success(t *testing.T) { + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + + // PutEntry calls PostEntry internally. The server just returns OK. + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + w.WriteHeader(http.StatusOK) + return + } + // GET for Entry lookup (shouldn't be needed if PostEntry succeeds) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(entry) //nolint:errcheck,gosec + }) + + client := newTestHTTPClient(t, handler) + err := client.PutEntry(context.Background(), sk, entry) + require.NoError(t, err) + assert.Equal(t, uint64(1), entry.Sequence) +} + +func TestHTTPClientEntry_ConnectionRefused(t *testing.T) { + log := logging.MustGetLogger("disc_http_test") + // Use a URL that will fail to connect. + client := disc.NewHTTP("http://127.0.0.1:1", &http.Client{Timeout: 100 * time.Millisecond}, log) + _, err := client.Entry(context.Background(), cipher.PubKey{}) + require.Error(t, err) +} + +func TestHTTPClientPostEntry_ConnectionRefused(t *testing.T) { + log := logging.MustGetLogger("disc_http_test") + client := disc.NewHTTP("http://127.0.0.1:1", &http.Client{Timeout: 100 * time.Millisecond}, log) + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + err := client.PostEntry(context.Background(), entry) + require.Error(t, err) +} + +func TestHTTPClientDelEntry_ConnectionRefused(t *testing.T) { + log := logging.MustGetLogger("disc_http_test") + client := disc.NewHTTP("http://127.0.0.1:1", &http.Client{Timeout: 100 * time.Millisecond}, log) + pk, sk := cipher.GenerateKeyPair() + entry := disc.NewServerEntry(pk, 0, "addr:1", 1) + require.NoError(t, entry.Sign(sk)) + err := client.DelEntry(context.Background(), entry) + require.Error(t, err) +} + +func TestHTTPClientAvailableServers_ConnectionRefused(t *testing.T) { + log := logging.MustGetLogger("disc_http_test") + client := disc.NewHTTP("http://127.0.0.1:1", &http.Client{Timeout: 100 * time.Millisecond}, log) + _, err := client.AvailableServers(context.Background()) + require.Error(t, err) +} + +func TestHTTPClientAllServers_ConnectionRefused(t *testing.T) { + log := logging.MustGetLogger("disc_http_test") + client := disc.NewHTTP("http://127.0.0.1:1", &http.Client{Timeout: 100 * time.Millisecond}, log) + _, err := client.AllServers(context.Background()) + require.Error(t, err) +} diff --git a/internal/discmetrics/empty.go b/pkg/disc/metrics/empty.go similarity index 81% rename from internal/discmetrics/empty.go rename to pkg/disc/metrics/empty.go index e9fdd479f..da019b107 100644 --- a/internal/discmetrics/empty.go +++ b/pkg/disc/metrics/empty.go @@ -1,5 +1,5 @@ -// Package discmetrics internal/discmetrics/empty.go -package discmetrics +// Package metrics pkg/disc/metrics/empty.go +package metrics // NewEmpty constructs new empty metrics. func NewEmpty() Empty { diff --git a/internal/discmetrics/metrics.go b/pkg/disc/metrics/metrics.go similarity index 65% rename from internal/discmetrics/metrics.go rename to pkg/disc/metrics/metrics.go index d28f3d278..e7880ebcb 100644 --- a/internal/discmetrics/metrics.go +++ b/pkg/disc/metrics/metrics.go @@ -1,5 +1,5 @@ -// Package discmetrics internal/discmetrics/metrics.go -package discmetrics +// Package metrics pkg/disc/metrics/metrics.go +package metrics // Metrics collects metrics for metrics tracking system. type Metrics interface { diff --git a/internal/discmetrics/victoria_metrics.go b/pkg/disc/metrics/victoria_metrics.go similarity index 91% rename from internal/discmetrics/victoria_metrics.go rename to pkg/disc/metrics/victoria_metrics.go index 854afadb4..8b9046bfe 100644 --- a/internal/discmetrics/victoria_metrics.go +++ b/pkg/disc/metrics/victoria_metrics.go @@ -1,5 +1,5 @@ -// Package discmetrics internal/discmetrics/victoria_metrics.go -package discmetrics +// Package metrics pkg/disc/metrics/victoria_metrics.go +package metrics import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/metricsutil" diff --git a/internal/dmsg-discovery/api/api.go b/pkg/discovery/api/api.go similarity index 97% rename from internal/dmsg-discovery/api/api.go rename to pkg/discovery/api/api.go index c1d69a673..7edccada5 100644 --- a/internal/dmsg-discovery/api/api.go +++ b/pkg/discovery/api/api.go @@ -1,4 +1,4 @@ -// Package api internal/dmsg-discovery/api/api.go +// Package api pkg/discovery/api/api.go package api import ( @@ -19,9 +19,9 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/metricsutil" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/networkmonitor" - "github.com/skycoin/dmsg/internal/discmetrics" - "github.com/skycoin/dmsg/internal/dmsg-discovery/store" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/disc/metrics" + "github.com/skycoin/dmsg/pkg/discovery/store" "github.com/skycoin/dmsg/pkg/dmsg" ) @@ -37,7 +37,7 @@ const maxGetAvailableServersResult = 512 // API represents the api of the dmsg-discovery service` type API struct { http.Handler - metrics discmetrics.Metrics + metrics metrics.Metrics db store.Storer reqsInFlightCountMiddleware *metricsutil.RequestsInFlightCountMiddleware testMode bool @@ -50,7 +50,7 @@ type API struct { } // New returns a new API object, which can be started as a server -func New(log logrus.FieldLogger, db store.Storer, m discmetrics.Metrics, testMode, enableLoadTesting, enableMetrics bool, dmsgAddr, authPassphrase string) *API { +func New(log logrus.FieldLogger, db store.Storer, m metrics.Metrics, testMode, enableLoadTesting, enableMetrics bool, dmsgAddr, authPassphrase string) *API { if log == nil { log = logging.MustGetLogger("dmsg_disc") } diff --git a/internal/dmsg-discovery/api/entries_endpoint_test.go b/pkg/discovery/api/entries_endpoint_test.go similarity index 96% rename from internal/dmsg-discovery/api/entries_endpoint_test.go rename to pkg/discovery/api/entries_endpoint_test.go index bce1d0b2f..79f703a61 100644 --- a/internal/dmsg-discovery/api/entries_endpoint_test.go +++ b/pkg/discovery/api/entries_endpoint_test.go @@ -1,4 +1,4 @@ -// Package api internal/dmsg-discovery/api/entries_endpoint_test.go +// Package api pkg/discovery/api/entries_endpoint_test.go package api import ( @@ -14,9 +14,9 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/stretchr/testify/require" - "github.com/skycoin/dmsg/internal/discmetrics" - store2 "github.com/skycoin/dmsg/internal/dmsg-discovery/store" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/disc/metrics" + store2 "github.com/skycoin/dmsg/pkg/discovery/store" ) func TestEntriesEndpoint(t *testing.T) { @@ -183,7 +183,7 @@ func TestEntriesEndpoint(t *testing.T) { tc.storerPreHook(t, dbMock, &tc.entry) } - api := New(nil, dbMock, discmetrics.NewEmpty(), true, false, true, "", "") + api := New(nil, dbMock, metrics.NewEmpty(), true, false, true, "", "") req, err := http.NewRequest(tc.method, tc.endpoint, bytes.NewBufferString(tc.httpBody)) require.NoError(t, err) diff --git a/internal/dmsg-discovery/api/error_handler.go b/pkg/discovery/api/error_handler.go similarity index 95% rename from internal/dmsg-discovery/api/error_handler.go rename to pkg/discovery/api/error_handler.go index 6ab202230..d41959bad 100644 --- a/internal/dmsg-discovery/api/error_handler.go +++ b/pkg/discovery/api/error_handler.go @@ -1,4 +1,4 @@ -// Package api internal/dmsg-discovery/api/error_handler.go +// Package api pkg/discovery/api/error_handler.go package api import ( diff --git a/internal/dmsg-discovery/api/error_handler_test.go b/pkg/discovery/api/error_handler_test.go similarity index 81% rename from internal/dmsg-discovery/api/error_handler_test.go rename to pkg/discovery/api/error_handler_test.go index 9bcb03517..50343f9af 100644 --- a/internal/dmsg-discovery/api/error_handler_test.go +++ b/pkg/discovery/api/error_handler_test.go @@ -1,4 +1,4 @@ -// Package api internal/dmsg-discovery/api/error_handler_test.go +// Package api pkg/discovery/api/error_handler_test.go package api import ( @@ -9,9 +9,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/skycoin/dmsg/internal/discmetrics" - "github.com/skycoin/dmsg/internal/dmsg-discovery/store" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/disc/metrics" + "github.com/skycoin/dmsg/pkg/discovery/store" ) var errHandlerTestCases = []struct { @@ -35,7 +35,7 @@ func TestErrorHandler(t *testing.T) { tc := tc t.Run(tc.err.Error(), func(t *testing.T) { w := httptest.NewRecorder() - api := New(nil, store.NewMock(), discmetrics.NewEmpty(), true, false, true, "", "") + api := New(nil, store.NewMock(), metrics.NewEmpty(), true, false, true, "", "") api.handleError(w, &http.Request{}, tc.err) msg := new(disc.HTTPMessage) diff --git a/internal/dmsg-discovery/api/get_available_servers_test.go b/pkg/discovery/api/get_available_servers_test.go similarity index 94% rename from internal/dmsg-discovery/api/get_available_servers_test.go rename to pkg/discovery/api/get_available_servers_test.go index 1f814058e..c185822c8 100644 --- a/internal/dmsg-discovery/api/get_available_servers_test.go +++ b/pkg/discovery/api/get_available_servers_test.go @@ -1,4 +1,4 @@ -// Package api internal/dmsg-discovery/api/get_available_servers_test.go +// Package api pkg/discovery/api/get_available_servers_test.go package api import ( @@ -13,9 +13,9 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/stretchr/testify/require" - "github.com/skycoin/dmsg/internal/discmetrics" - store2 "github.com/skycoin/dmsg/internal/dmsg-discovery/store" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/disc/metrics" + store2 "github.com/skycoin/dmsg/pkg/discovery/store" ) func TestGetAvailableServers(t *testing.T) { @@ -117,7 +117,7 @@ func TestGetAvailableServers(t *testing.T) { t.Run(tc.name, func(t *testing.T) { db, entries := tc.databaseAndEntries(t) - api := New(nil, db, discmetrics.NewEmpty(), true, false, true, "", "") + api := New(nil, db, metrics.NewEmpty(), true, false, true, "", "") req, err := http.NewRequest(tc.method, tc.endpoint, nil) require.NoError(t, err) diff --git a/internal/dmsg-discovery/store/redis.go b/pkg/discovery/store/redis.go similarity index 99% rename from internal/dmsg-discovery/store/redis.go rename to pkg/discovery/store/redis.go index a115d4118..a18c50cc6 100644 --- a/internal/dmsg-discovery/store/redis.go +++ b/pkg/discovery/store/redis.go @@ -1,4 +1,4 @@ -// Package store internal/dmsg-discovery/store/redis.go +// Package store pkg/discovery/store/redis.go package store import ( diff --git a/internal/dmsg-discovery/store/redis_test.go b/pkg/discovery/store/redis_test.go similarity index 98% rename from internal/dmsg-discovery/store/redis_test.go rename to pkg/discovery/store/redis_test.go index cba0a6960..f5627586a 100644 --- a/internal/dmsg-discovery/store/redis_test.go +++ b/pkg/discovery/store/redis_test.go @@ -1,7 +1,7 @@ //go:build !no_ci // +build !no_ci -// Package store internal/dmsg-discovery/store/redis_test.go +// Package store pkg/discovery/store/redis_test.go package store import ( diff --git a/internal/dmsg-discovery/store/storer.go b/pkg/discovery/store/storer.go similarity index 88% rename from internal/dmsg-discovery/store/storer.go rename to pkg/discovery/store/storer.go index b0685b41d..775c9a8be 100644 --- a/internal/dmsg-discovery/store/storer.go +++ b/pkg/discovery/store/storer.go @@ -1,4 +1,4 @@ -// Package store internal/dmsg-discovery/store/storer.go +// Package store pkg/discovery/store/storer.go package store import ( @@ -19,9 +19,8 @@ var ( ErrTooFewArgs = errors.New("too few args") ) -// Storer is an interface which allows to implement different kinds of stores -// and choose which one to use in the server -type Storer interface { +// EntryStore provides basic CRUD for discovery entries. +type EntryStore interface { // Entry obtains a single dmsg instance entry. Entry(ctx context.Context, staticPubKey cipher.PubKey) (*disc.Entry, error) @@ -31,19 +30,22 @@ type Storer interface { // DelEntry delete's an entry. DelEntry(ctx context.Context, staticPubKey cipher.PubKey) error +} +// ServerLister provides server enumeration. +type ServerLister interface { // AvailableServers discovers available dmsg servers. AvailableServers(ctx context.Context, maxCount int) ([]*disc.Entry, error) // AllServers discovers available dmsg servers. AllServers(ctx context.Context) ([]*disc.Entry, error) +} +// EntryEnumerator provides bulk entry access. +type EntryEnumerator interface { // CountEntries returns numbers of servers and clients. CountEntries(ctx context.Context) (int64, int64, error) - // RemoveOldServerEntries check and remove old server entries that left on redis because of unexpected server shutdown - RemoveOldServerEntries(ctx context.Context) error - // AllEntries returns all clients PKs. AllEntries(ctx context.Context) ([]string, error) @@ -54,6 +56,17 @@ type Storer interface { AllClientEntries(ctx context.Context) ([]*disc.Entry, error) } +// Storer is an interface which allows to implement different kinds of stores +// and choose which one to use in the server +type Storer interface { + EntryStore + ServerLister + EntryEnumerator + + // RemoveOldServerEntries check and remove old server entries that left on redis because of unexpected server shutdown + RemoveOldServerEntries(ctx context.Context) error +} + // Config configures the Store object. type Config struct { URL string // database URI diff --git a/internal/dmsg-discovery/store/testing.go b/pkg/discovery/store/testing.go similarity index 99% rename from internal/dmsg-discovery/store/testing.go rename to pkg/discovery/store/testing.go index 7e5095be3..d4655ee47 100644 --- a/internal/dmsg-discovery/store/testing.go +++ b/pkg/discovery/store/testing.go @@ -1,4 +1,4 @@ -// Package store internal/dmsg-discovery/store/testing.go +// Package store pkg/discovery/store/testing.go package store import ( diff --git a/pkg/dmsg/client.go b/pkg/dmsg/client.go index 18396ba0d..dbadadffa 100644 --- a/pkg/dmsg/client.go +++ b/pkg/dmsg/client.go @@ -5,19 +5,13 @@ import ( "context" crand "crypto/rand" "encoding/binary" - "errors" - "fmt" "math/rand" - "net" "sync" "time" - "github.com/hashicorp/yamux" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/netutil" - "github.com/xtaci/smux" - "golang.org/x/net/proxy" "github.com/skycoin/dmsg/pkg/disc" ) @@ -152,6 +146,7 @@ func (ce *Client) Serve(ctx context.Context) { defer cancel() setupNodeTicker := time.NewTicker(1 * time.Minute) + defer setupNodeTicker.Stop() go func(ctx context.Context) { select { @@ -186,6 +181,7 @@ func (ce *Client) Serve(ctx context.Context) { for ind, entry := range entries { if dmsgServer, ok := ctx.Value("dmsgServer").(string); ok && entry.Static.Hex() == dmsgServer { entries = entries[ind : ind+1] + break } } } else if ctx.Value("setupNode") != nil { @@ -232,9 +228,9 @@ func (ce *Client) Serve(ctx context.Context) { if err != nil { ce.log.WithError(err).Warn("Initial post entry failed") } else { - ce.log.WithError(err).Info("Initial post entry successed") + ce.log.Info("Initial post entry succeeded") + needInitialPost = false } - needInitialPost = false } for n, entry := range entries { @@ -276,7 +272,10 @@ func (ce *Client) Serve(ctx context.Context) { if n == (len(entries) - 1) { if !isClosed(ce.done) { ce.sesMx.Lock() - ce.errCh <- err + select { + case ce.errCh <- err: + default: + } ce.sesMx.Unlock() } } @@ -354,142 +353,6 @@ func (ce *Client) Close() error { return err } -// Listen listens on a given dmsg port. -func (ce *Client) Listen(port uint16) (*Listener, error) { - lis := newListener(ce.porter, Addr{PK: ce.pk, Port: port}) - ok, doneFn := ce.porter.Reserve(port, lis) - if !ok { - lis.close() - return nil, ErrPortOccupied - } - lis.addCloseCallback(doneFn) - return lis, nil -} - -// Dial wraps DialStream to output net.Conn instead of *Stream. -func (ce *Client) Dial(ctx context.Context, addr Addr) (net.Conn, error) { - return ce.DialStream(ctx, addr) -} - -// DialStream dials to a remote client entity with the given address. -func (ce *Client) DialStream(ctx context.Context, addr Addr) (*Stream, error) { - entry, err := getClientEntry(ctx, ce.dc, addr.PK) - if err != nil { - return nil, err - } - - // Range client's delegated servers. - // Try existing sessions first, falling back to next server on failure. - for _, srvPK := range entry.Client.DelegatedServers { - if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { - stream, err := dSes.DialStream(addr) - if err != nil { - ce.log.WithError(err).WithField("server", srvPK). - Debug("DialStream failed via existing session, trying next server") - continue - } - return stream, nil - } - } - - // Range client's delegated servers. - // Attempt to connect to a delegated server. - for _, srvPK := range entry.Client.DelegatedServers { - dSes, err := ce.EnsureAndObtainSession(ctx, srvPK) - if err != nil { - continue - } - stream, err := dSes.DialStream(addr) - if err != nil { - ce.log.WithError(err).WithField("server", srvPK). - Debug("DialStream failed via new session, trying next server") - continue - } - return stream, nil - } - - return nil, ErrCannotConnectToDelegated -} - -// LookupIP dails to dmsg servers for public IP of the client. -func (ce *Client) LookupIP(ctx context.Context, servers []cipher.PubKey) (myIP net.IP, err error) { - - cancellabelCtx, cancel := context.WithCancel(ctx) - defer cancel() - - if servers == nil { - entries, err := ce.discoverServers(cancellabelCtx, true) - if err != nil { - return nil, err - } - for _, entry := range entries { - servers = append(servers, entry.Static) - } - } - - // Range client's delegated servers. - // See if we are already connected to a delegated server. - for _, srvPK := range servers { - if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { - ip, err := dSes.LookupIP(Addr{PK: dSes.RemotePK(), Port: 1}) - if err != nil { - ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to dial server for IP.") - continue - } - - // If the client is test client then ignore Public IP check - if ce.conf.ClientType == "test" { - return ip, nil - } - - // Check if the IP is public, if not try other servers - if !netutil.IsPublicIP(ip) { - ce.log.WithField("server_pk", srvPK).WithField("ip", ip.String()).Warn("Received non-public IP address from dmsg server, trying other servers.") - continue - } - return ip, nil - } - } - - // Range client's delegated servers. - // Attempt to connect to a delegated server. - // And Close it after getting the IP. - for _, srvPK := range servers { - dSes, err := ce.EnsureAndObtainSession(ctx, srvPK) - if err != nil { - continue - } - ip, err := dSes.LookupIP(Addr{PK: dSes.RemotePK(), Port: 1}) - if err != nil { - ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to dial server for IP.") - continue - } - err = dSes.Close() - if err != nil { - ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to close session") - } - - // If the client is test client then ignore Public IP check - if ce.conf.ClientType == "test" { - return ip, nil - } - - // Check if the IP is public, if not try other servers - if !netutil.IsPublicIP(ip) { - ce.log.WithField("server_pk", srvPK).WithField("ip", ip.String()).Warn("Received non-public IP address from dmsg server, trying other servers.") - continue - } - return ip, nil - } - - return nil, ErrCannotConnectToDelegated -} - -// Session obtains an established session. -func (ce *Client) Session(pk cipher.PubKey) (ClientSession, bool) { - return ce.clientSession(ce.porter, pk) -} - // AllSessions obtains all established sessions. func (ce *Client) AllSessions() []ClientSession { return ce.allClientSessions(ce.porter) @@ -507,197 +370,6 @@ func (ce *Client) ConnectedServers() []string { return addrs } -// EnsureAndObtainSession attempts to obtain a session. -// If the session does not exist, we will attempt to establish one. -// It returns an error if the session does not exist AND cannot be established. -func (ce *Client) EnsureAndObtainSession(ctx context.Context, srvPK cipher.PubKey) (ClientSession, error) { - ce.sesMx.Lock() - defer ce.sesMx.Unlock() - - if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { - return dSes, nil - } - - srvEntry, err := getServerEntry(ctx, ce.dc, srvPK) - if err != nil { - return ClientSession{}, err - } - return ce.dialSession(ctx, srvEntry) -} - -// EnsureSession ensures the existence of a session. -// It returns an error if the session does not exist AND cannot be established. -func (ce *Client) EnsureSession(ctx context.Context, entry *disc.Entry) error { - ce.sesMx.Lock() - defer ce.sesMx.Unlock() - - // If session with server of pk already exists, skip. - if _, ok := ce.clientSession(ce.porter, entry.Static); ok { - ce.log.WithField("remote_pk", entry.Static).Debug("Session already exists...") - return nil - } - entry.Protocol = ce.conf.Protocol - // Dial session. - _, err := ce.dialSession(ctx, entry) - return err -} - -// It is expected that the session is created and served before the context cancels, otherwise an error will be returned. -// NOTE: This should not be called directly as it may lead to session duplicates. -// Only `ensureSession` or `EnsureAndObtainSession` should call this function. -func (ce *Client) dialSession(ctx context.Context, entry *disc.Entry) (cs ClientSession, err error) { - ce.log.WithField("remote_pk", entry.Static).Debug("Dialing session...") - - const network = "tcp" - var conn net.Conn - - // Trigger dial callback. - if err := ce.conf.Callbacks.OnSessionDial(network, entry.Server.Address); err != nil { - return ClientSession{}, fmt.Errorf("session dial is rejected by callback: %w", err) - } - defer func() { - if err != nil { - // Trigger disconnect callback when dial fails. - ce.conf.Callbacks.OnSessionDisconnect(network, entry.Server.Address, err) - } - }() - - proxyAddr, ok := ctx.Value("socks5_proxy").(string) - if ok && proxyAddr != "" { - socksDialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct) - if err != nil { - return ClientSession{}, fmt.Errorf("failed to create SOCKS5 dialer: %w", err) - } - conn, err = socksDialer.Dial(network, entry.Server.Address) - if err != nil { - return ClientSession{}, fmt.Errorf("failed to dial through SOCKS5 proxy: %w", err) - } - } else { - conn, err = net.Dial(network, entry.Server.Address) - if err != nil { - return ClientSession{}, fmt.Errorf("failed to dial: %w", err) - } - } - - dSes, err := makeClientSession(&ce.EntityCommon, ce.porter, conn, entry.Static) - if err != nil { - return ClientSession{}, err - } - if entry.Protocol == "smux" { - dSes.sm.smux, err = smux.Client(conn, smux.DefaultConfig()) - if err != nil { - return ClientSession{}, err - } - ce.log.Infof("smux stream session initial for %s", dSes.RemotePK().String()) - } else { - dSes.sm.yamux, err = yamux.Client(conn, yamux.DefaultConfig()) - if err != nil { - return ClientSession{}, err - } - ce.log.Infof("yamux stream session initial for %s", dSes.RemotePK().String()) - } - - if !ce.setSession(ctx, dSes.SessionCommon) { - _ = dSes.Close() //nolint:errcheck - return ClientSession{}, errors.New("session already exists") - } - - go func() { - defer func() { - if r := recover(); r != nil { - ce.log.Warnf("recovered panic in session serve goroutine: %v", r) - } - }() - ce.log.WithField("remote_pk", dSes.RemotePK()).Debug("Serving session.") - err := dSes.serve() - if !isClosed(ce.done) { - ce.sesMx.Lock() - select { - case ce.errCh <- fmt.Errorf("failed to serve dialed session to %s: %v", dSes.RemotePK(), err): - default: - } - ce.sesMx.Unlock() - ce.delSession(ctx, dSes.RemotePK()) - } - - // Trigger disconnect callback. - ce.conf.Callbacks.OnSessionDisconnect(network, entry.Server.Address, err) - }() - - return dSes, nil -} - -// AllStreams returns all the streams of the current client. -func (ce *Client) AllStreams() (out []*Stream) { - fn := func(port uint16, pv netutil.PorterValue) (next bool) { //nolint - if str, ok := pv.Value.(*Stream); ok { - out = append(out, str) - return true - } - - for _, v := range pv.Children { - if str, ok := v.(*Stream); ok { - out = append(out, str) - } - } - return true - } - - ce.porter.RangePortValuesAndChildren(fn) - return out -} - -// AllEntries returns all the entries registered in discovery -func (ce *Client) AllEntries(ctx context.Context) (entries []string, err error) { - err = netutil.NewDefaultRetrier(ce.log).Do(ctx, func() error { - entries, err = ce.dc.AllEntries(ctx) - return err - }) - return entries, err -} - -// AllVisorEntries returns all the entries registered in discovery that are visor -func (ce *Client) AllVisorEntries(ctx context.Context) (entries []string, err error) { - err = netutil.NewDefaultRetrier(ce.log).Do(ctx, func() error { - entries, err = ce.dc.AllEntries(ctx) - return err - }) - return entries, err -} - -// ConnectedServersPK return keys of all connected dmsg servers -func (ce *Client) ConnectedServersPK() []string { - sessions := ce.allClientSessions(ce.porter) - addrs := make([]string, len(sessions)) - for i, s := range sessions { - addrs[i] = s.RemotePK().String() - } - return addrs -} - -// ConnectionsSummary associates connected clients, and the servers that connect such clients. -// Key: Client PK, Value: Slice of Server PKs -type ConnectionsSummary map[cipher.PubKey][]cipher.PubKey - -// ConnectionsSummary returns a summary of all connected clients, and the associated servers that connect them. -func (ce *Client) ConnectionsSummary() ConnectionsSummary { - streams := ce.AllStreams() - out := make(ConnectionsSummary, len(streams)) - - for _, s := range streams { - cPK := s.RawRemoteAddr().PK - sPK := s.ServerPK() - - sPKs, ok := out[cPK] - if ok && hasPK(sPKs, sPK) { - continue - } - out[cPK] = append(sPKs, sPK) - } - - return out -} - func (ce *Client) serveWait() { bo := ce.bo diff --git a/pkg/dmsg/client_dial.go b/pkg/dmsg/client_dial.go new file mode 100644 index 000000000..947b5c1e2 --- /dev/null +++ b/pkg/dmsg/client_dial.go @@ -0,0 +1,212 @@ +// Package dmsg pkg/dmsg/client_dial.go +package dmsg + +import ( + "context" + "net" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/netutil" +) + +// Listen listens on a given dmsg port. +func (ce *Client) Listen(port uint16) (*Listener, error) { + lis := newListener(ce.porter, Addr{PK: ce.pk, Port: port}) + ok, doneFn := ce.porter.Reserve(port, lis) + if !ok { + lis.close() + return nil, ErrPortOccupied + } + lis.addCloseCallback(doneFn) + return lis, nil +} + +// Dial wraps DialStream to output net.Conn instead of *Stream. +func (ce *Client) Dial(ctx context.Context, addr Addr) (net.Conn, error) { + return ce.DialStream(ctx, addr) +} + +// DialStream dials to a remote client entity with the given address. +func (ce *Client) DialStream(ctx context.Context, addr Addr) (*Stream, error) { + entry, err := getClientEntry(ctx, ce.dc, addr.PK) + if err != nil { + return nil, err + } + + // Range client's delegated servers. + // Try existing sessions first, falling back to next server on failure. + for _, srvPK := range entry.Client.DelegatedServers { + if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { + stream, err := dSes.DialStream(addr) + if err != nil { + ce.log.WithError(err).WithField("server", srvPK). + Debug("DialStream failed via existing session, trying next server") + continue + } + return stream, nil + } + } + + // Range client's delegated servers. + // Attempt to connect to a delegated server. + for _, srvPK := range entry.Client.DelegatedServers { + dSes, err := ce.EnsureAndObtainSession(ctx, srvPK) + if err != nil { + continue + } + stream, err := dSes.DialStream(addr) + if err != nil { + ce.log.WithError(err).WithField("server", srvPK). + Debug("DialStream failed via new session, trying next server") + continue + } + return stream, nil + } + + return nil, ErrCannotConnectToDelegated +} + +// LookupIP dails to dmsg servers for public IP of the client. +func (ce *Client) LookupIP(ctx context.Context, servers []cipher.PubKey) (myIP net.IP, err error) { + + cancellabelCtx, cancel := context.WithCancel(ctx) + defer cancel() + + if servers == nil { + entries, err := ce.discoverServers(cancellabelCtx, true) + if err != nil { + return nil, err + } + for _, entry := range entries { + servers = append(servers, entry.Static) + } + } + + // Range client's delegated servers. + // See if we are already connected to a delegated server. + for _, srvPK := range servers { + if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { + ip, err := dSes.LookupIP(Addr{PK: dSes.RemotePK(), Port: 1}) + if err != nil { + ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to dial server for IP.") + continue + } + + // If the client is test client then ignore Public IP check + if ce.conf.ClientType == "test" { + return ip, nil + } + + // Check if the IP is public, if not try other servers + if !netutil.IsPublicIP(ip) { + ce.log.WithField("server_pk", srvPK).WithField("ip", ip.String()).Warn("Received non-public IP address from dmsg server, trying other servers.") + continue + } + return ip, nil + } + } + + // Range client's delegated servers. + // Attempt to connect to a delegated server. + // And Close it after getting the IP. + for _, srvPK := range servers { + dSes, err := ce.EnsureAndObtainSession(ctx, srvPK) + if err != nil { + continue + } + ip, err := dSes.LookupIP(Addr{PK: dSes.RemotePK(), Port: 1}) + if err != nil { + ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to dial server for IP.") + continue + } + err = dSes.Close() + if err != nil { + ce.log.WithError(err).WithField("server_pk", srvPK).Warn("Failed to close session") + } + + // If the client is test client then ignore Public IP check + if ce.conf.ClientType == "test" { + return ip, nil + } + + // Check if the IP is public, if not try other servers + if !netutil.IsPublicIP(ip) { + ce.log.WithField("server_pk", srvPK).WithField("ip", ip.String()).Warn("Received non-public IP address from dmsg server, trying other servers.") + continue + } + return ip, nil + } + + return nil, ErrCannotConnectToDelegated +} + +// AllStreams returns all the streams of the current client. +func (ce *Client) AllStreams() (out []*Stream) { + fn := func(port uint16, pv netutil.PorterValue) (next bool) { //nolint + if str, ok := pv.Value.(*Stream); ok { + out = append(out, str) + return true + } + + for _, v := range pv.Children { + if str, ok := v.(*Stream); ok { + out = append(out, str) + } + } + return true + } + + ce.porter.RangePortValuesAndChildren(fn) + return out +} + +// AllEntries returns all the entries registered in discovery +func (ce *Client) AllEntries(ctx context.Context) (entries []string, err error) { + err = netutil.NewDefaultRetrier(ce.log).Do(ctx, func() error { + entries, err = ce.dc.AllEntries(ctx) + return err + }) + return entries, err +} + +// AllVisorEntries returns all the entries registered in discovery that are visor +func (ce *Client) AllVisorEntries(ctx context.Context) (entries []string, err error) { + err = netutil.NewDefaultRetrier(ce.log).Do(ctx, func() error { + entries, err = ce.dc.AllEntries(ctx) + return err + }) + return entries, err +} + +// ConnectedServersPK return keys of all connected dmsg servers +func (ce *Client) ConnectedServersPK() []string { + sessions := ce.allClientSessions(ce.porter) + addrs := make([]string, len(sessions)) + for i, s := range sessions { + addrs[i] = s.RemotePK().String() + } + return addrs +} + +// ConnectionsSummary associates connected clients, and the servers that connect such clients. +// Key: Client PK, Value: Slice of Server PKs +type ConnectionsSummary map[cipher.PubKey][]cipher.PubKey + +// ConnectionsSummary returns a summary of all connected clients, and the associated servers that connect them. +func (ce *Client) ConnectionsSummary() ConnectionsSummary { + streams := ce.AllStreams() + out := make(ConnectionsSummary, len(streams)) + + for _, s := range streams { + cPK := s.RawRemoteAddr().PK + sPK := s.ServerPK() + + sPKs, ok := out[cPK] + if ok && hasPK(sPKs, sPK) { + continue + } + out[cPK] = append(sPKs, sPK) + } + + return out +} diff --git a/pkg/dmsg/client_sessions.go b/pkg/dmsg/client_sessions.go new file mode 100644 index 000000000..de5534385 --- /dev/null +++ b/pkg/dmsg/client_sessions.go @@ -0,0 +1,144 @@ +// Package dmsg pkg/dmsg/client_sessions.go +package dmsg + +import ( + "context" + "errors" + "fmt" + "net" + + "github.com/hashicorp/yamux" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/xtaci/smux" + "golang.org/x/net/proxy" + + "github.com/skycoin/dmsg/pkg/disc" +) + +// EnsureAndObtainSession attempts to obtain a session. +// If the session does not exist, we will attempt to establish one. +// It returns an error if the session does not exist AND cannot be established. +func (ce *Client) EnsureAndObtainSession(ctx context.Context, srvPK cipher.PubKey) (ClientSession, error) { + ce.sesMx.Lock() + defer ce.sesMx.Unlock() + + if dSes, ok := ce.clientSession(ce.porter, srvPK); ok { + return dSes, nil + } + + srvEntry, err := getServerEntry(ctx, ce.dc, srvPK) + if err != nil { + return ClientSession{}, err + } + return ce.dialSession(ctx, srvEntry) +} + +// EnsureSession ensures the existence of a session. +// It returns an error if the session does not exist AND cannot be established. +func (ce *Client) EnsureSession(ctx context.Context, entry *disc.Entry) error { + ce.sesMx.Lock() + defer ce.sesMx.Unlock() + + // If session with server of pk already exists, skip. + if _, ok := ce.clientSession(ce.porter, entry.Static); ok { + ce.log.WithField("remote_pk", entry.Static).Debug("Session already exists...") + return nil + } + entry.Protocol = ce.conf.Protocol + // Dial session. + _, err := ce.dialSession(ctx, entry) + return err +} + +// It is expected that the session is created and served before the context cancels, otherwise an error will be returned. +// NOTE: This should not be called directly as it may lead to session duplicates. +// Only `ensureSession` or `EnsureAndObtainSession` should call this function. +func (ce *Client) dialSession(ctx context.Context, entry *disc.Entry) (cs ClientSession, err error) { + ce.log.WithField("remote_pk", entry.Static).Debug("Dialing session...") + + const network = "tcp" + var conn net.Conn + + // Trigger dial callback. + if err := ce.conf.Callbacks.OnSessionDial(network, entry.Server.Address); err != nil { + return ClientSession{}, fmt.Errorf("session dial is rejected by callback: %w", err) + } + defer func() { + if err != nil { + // Trigger disconnect callback when dial fails. + ce.conf.Callbacks.OnSessionDisconnect(network, entry.Server.Address, err) + } + }() + + proxyAddr, ok := ctx.Value("socks5_proxy").(string) + if ok && proxyAddr != "" { + socksDialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct) + if err != nil { + return ClientSession{}, fmt.Errorf("failed to create SOCKS5 dialer: %w", err) + } + conn, err = socksDialer.Dial(network, entry.Server.Address) + if err != nil { + return ClientSession{}, fmt.Errorf("failed to dial through SOCKS5 proxy: %w", err) + } + } else { + conn, err = net.Dial(network, entry.Server.Address) + if err != nil { + return ClientSession{}, fmt.Errorf("failed to dial: %w", err) + } + } + + dSes, err := makeClientSession(&ce.EntityCommon, ce.porter, conn, entry.Static) + if err != nil { + conn.Close() //nolint:errcheck,gosec + return ClientSession{}, err + } + if entry.Protocol == "smux" { + dSes.sm.smux, err = smux.Client(conn, smux.DefaultConfig()) + if err != nil { + conn.Close() //nolint:errcheck,gosec + return ClientSession{}, err + } + ce.log.Infof("smux stream session initial for %s", dSes.RemotePK().String()) + } else { + dSes.sm.yamux, err = yamux.Client(conn, yamux.DefaultConfig()) + if err != nil { + conn.Close() //nolint:errcheck,gosec + return ClientSession{}, err + } + ce.log.Infof("yamux stream session initial for %s", dSes.RemotePK().String()) + } + + if !ce.setSession(ctx, dSes.SessionCommon) { + _ = dSes.Close() //nolint:errcheck + return ClientSession{}, errors.New("session already exists") + } + + go func() { + defer func() { + if r := recover(); r != nil { + ce.log.Warnf("recovered panic in session serve goroutine: %v", r) + } + }() + ce.log.WithField("remote_pk", dSes.RemotePK()).Debug("Serving session.") + err := dSes.serve() + if !isClosed(ce.done) { + ce.sesMx.Lock() + select { + case ce.errCh <- fmt.Errorf("failed to serve dialed session to %s: %v", dSes.RemotePK(), err): + default: + } + ce.sesMx.Unlock() + ce.delSession(ctx, dSes.RemotePK()) + } + + // Trigger disconnect callback. + ce.conf.Callbacks.OnSessionDisconnect(network, entry.Server.Address, err) + }() + + return dSes, nil +} + +// Session obtains an established session. +func (ce *Client) Session(pk cipher.PubKey) (ClientSession, bool) { + return ce.clientSession(ce.porter, pk) +} diff --git a/pkg/dmsg/const.go b/pkg/dmsg/const.go index 065cfd7c3..331818eb6 100644 --- a/pkg/dmsg/const.go +++ b/pkg/dmsg/const.go @@ -4,6 +4,7 @@ package dmsg import ( "crypto/rand" "encoding/json" + "fmt" "log" "math/big" "regexp" @@ -93,7 +94,10 @@ func InitConfig() error { if err != nil { return err } - Prod.DmsgServers = shuffleServers(Prod.DmsgServers) + Prod.DmsgServers, err = shuffleServers(Prod.DmsgServers) + if err != nil { + return err + } err = json.Unmarshal(envServices.Test, &Test) if err != nil { return err @@ -101,15 +105,15 @@ func InitConfig() error { return nil } -func shuffleServers(in []disc.Entry) []disc.Entry { +func shuffleServers(in []disc.Entry) ([]disc.Entry, error) { n := len(in) for i := n - 1; i > 0; i-- { jBig, err := rand.Int(rand.Reader, big.NewInt(int64(i+1))) if err != nil { - panic(err) + return nil, fmt.Errorf("shuffleServers: %w", err) } j := int(jBig.Int64()) in[i], in[j] = in[j], in[i] } - return in + return in, nil } diff --git a/pkg/dmsg/entity_common.go b/pkg/dmsg/entity_common.go index 4c40c43a1..348a251ea 100644 --- a/pkg/dmsg/entity_common.go +++ b/pkg/dmsg/entity_common.go @@ -4,6 +4,7 @@ package dmsg import ( "context" "errors" + "fmt" "sync" "sync/atomic" "time" @@ -236,6 +237,9 @@ func (c *EntityCommon) initilizeClientEntry(ctx context.Context, clientType stri c.sessionsMx.Lock() srvPKs := make([]cipher.PubKey, 0, len(c.sessions)) + for pk := range c.sessions { + srvPKs = append(srvPKs, pk) + } c.sessionsMx.Unlock() _, err = c.dc.Entry(ctx, c.pk) @@ -352,7 +356,7 @@ func (c *EntityCommon) delEntry(ctx context.Context) (err error) { func getServerEntry(ctx context.Context, dc disc.APIClient, srvPK cipher.PubKey) (*disc.Entry, error) { entry, err := dc.Entry(ctx, srvPK) if err != nil { - return nil, ErrDiscEntryNotFound + return nil, fmt.Errorf("%w: %v", ErrDiscEntryNotFound, err) } if entry.Server == nil { return nil, ErrDiscEntryIsNotServer @@ -363,7 +367,7 @@ func getServerEntry(ctx context.Context, dc disc.APIClient, srvPK cipher.PubKey) func getClientEntry(ctx context.Context, dc disc.APIClient, clientPK cipher.PubKey) (*disc.Entry, error) { entry, err := dc.Entry(ctx, clientPK) if err != nil { - return nil, ErrDiscEntryNotFound + return nil, fmt.Errorf("%w: %v", ErrDiscEntryNotFound, err) } if entry.Client == nil { return nil, ErrDiscEntryIsNotClient diff --git a/pkg/dmsg/listener.go b/pkg/dmsg/listener.go index 24d01ce72..520183a00 100644 --- a/pkg/dmsg/listener.go +++ b/pkg/dmsg/listener.go @@ -111,7 +111,8 @@ func (l *Listener) close() (closed bool) { close(l.done) for { select { - case <-l.accept: + case stream := <-l.accept: + stream.Close() //nolint:errcheck,gosec default: close(l.accept) return diff --git a/internal/servermetrics/delta.go b/pkg/dmsg/metrics/delta.go similarity index 70% rename from internal/servermetrics/delta.go rename to pkg/dmsg/metrics/delta.go index 051012558..090cbca06 100644 --- a/internal/servermetrics/delta.go +++ b/pkg/dmsg/metrics/delta.go @@ -1,5 +1,5 @@ -// Package servermetrics internal/servermetrics/delta.go -package servermetrics +// Package metrics pkg/dmsg/metrics/delta.go +package metrics // DeltaType represents a change in metrics gauge. type DeltaType int diff --git a/internal/servermetrics/empty.go b/pkg/dmsg/metrics/empty.go similarity index 88% rename from internal/servermetrics/empty.go rename to pkg/dmsg/metrics/empty.go index b871d0717..d947e3538 100644 --- a/internal/servermetrics/empty.go +++ b/pkg/dmsg/metrics/empty.go @@ -1,5 +1,5 @@ -// Package servermetrics internal/servermetrics/empty.go -package servermetrics +// Package metrics pkg/dmsg/metrics/empty.go +package metrics // NewEmpty constructs new empty metrics. func NewEmpty() Empty { diff --git a/internal/servermetrics/metrics.go b/pkg/dmsg/metrics/metrics.go similarity index 74% rename from internal/servermetrics/metrics.go rename to pkg/dmsg/metrics/metrics.go index 23685270b..bd023e5dc 100644 --- a/internal/servermetrics/metrics.go +++ b/pkg/dmsg/metrics/metrics.go @@ -1,5 +1,5 @@ -// Package servermetrics internal/servermetrics/metrics.go -package servermetrics +// Package metrics pkg/dmsg/metrics/metrics.go +package metrics // Metrics collects metrics for metrics tracking system. type Metrics interface { diff --git a/internal/servermetrics/victoria_metrics.go b/pkg/dmsg/metrics/victoria_metrics.go similarity index 93% rename from internal/servermetrics/victoria_metrics.go rename to pkg/dmsg/metrics/victoria_metrics.go index b02f8673c..4548961b1 100644 --- a/internal/servermetrics/victoria_metrics.go +++ b/pkg/dmsg/metrics/victoria_metrics.go @@ -1,8 +1,8 @@ -// Package servermetrics internal/servermetrics/victoria_metrics.go -package servermetrics +// Package metrics pkg/dmsg/metrics/victoria_metrics.go +package metrics import ( - "fmt" + "log" "github.com/VictoriaMetrics/metrics" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/metricsutil" @@ -62,7 +62,7 @@ func (m *VictoriaMetrics) RecordSession(delta DeltaType) { case -1: m.activeSessions.Dec() default: - panic(fmt.Errorf("invalid delta: %d", delta)) + log.Printf("RecordSession: invalid delta: %d", delta) } } @@ -77,6 +77,6 @@ func (m *VictoriaMetrics) RecordStream(delta DeltaType) { case -1: m.activeStreams.Dec() default: - panic(fmt.Errorf("invalid delta: %d", delta)) + log.Printf("RecordStream: invalid delta: %d", delta) } } diff --git a/pkg/dmsg/server.go b/pkg/dmsg/server.go index f69f56381..eef196baa 100644 --- a/pkg/dmsg/server.go +++ b/pkg/dmsg/server.go @@ -13,8 +13,8 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/netutil" "github.com/xtaci/smux" - "github.com/skycoin/dmsg/internal/servermetrics" "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/dmsg/metrics" ) // ServerConfig configues the Server @@ -36,7 +36,7 @@ func DefaultServerConfig() *ServerConfig { type Server struct { EntityCommon - m servermetrics.Metrics + m metrics.Metrics ready chan struct{} // Closed once dmsg.Server is serving. readyOnce sync.Once @@ -56,12 +56,12 @@ type Server struct { } // NewServer creates a new dmsg server entity. -func NewServer(pk cipher.PubKey, sk cipher.SecKey, dc disc.APIClient, conf *ServerConfig, m servermetrics.Metrics) *Server { +func NewServer(pk cipher.PubKey, sk cipher.SecKey, dc disc.APIClient, conf *ServerConfig, m metrics.Metrics) *Server { if conf == nil { conf = DefaultServerConfig() } if m == nil { - m = servermetrics.NewEmpty() + m = metrics.NewEmpty() } log := logging.MustGetLogger("dmsg_server") @@ -100,16 +100,16 @@ func (s *Server) Close() error { if s == nil { return nil } - var err error + var closeErr error s.once.Do(func() { close(s.done) s.wg.Wait() - err = s.delEntry(context.Background()) - if err != nil { + closeErr = s.delEntry(context.Background()) + if closeErr != nil { s.log.Warn("Cannot delete entry from db.") } }) - return nil + return closeErr } // Serve serves the server. @@ -247,6 +247,7 @@ func (s *Server) handleSession(conn net.Conn) { dSes.sm.smux, err = smux.Server(conn, smux.DefaultConfig()) if err != nil { dSes.sm.mutx.Unlock() + conn.Close() //nolint:errcheck,gosec cancel() return } @@ -256,6 +257,7 @@ func (s *Server) handleSession(conn net.Conn) { dSes.sm.yamux, err = yamux.Server(conn, yamux.DefaultConfig()) if err != nil { dSes.sm.mutx.Unlock() + conn.Close() //nolint:errcheck,gosec cancel() return } diff --git a/pkg/dmsg/server_session.go b/pkg/dmsg/server_session.go index ef2556baa..b2565578d 100644 --- a/pkg/dmsg/server_session.go +++ b/pkg/dmsg/server_session.go @@ -11,22 +11,22 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/netutil" "github.com/xtaci/smux" - "github.com/skycoin/dmsg/internal/servermetrics" + "github.com/skycoin/dmsg/pkg/dmsg/metrics" "github.com/skycoin/dmsg/pkg/noise" ) // ServerSession represents a session from the perspective of a dmsg server. type ServerSession struct { *SessionCommon - m servermetrics.Metrics + m metrics.Metrics } -func makeServerSession(m servermetrics.Metrics, entity *EntityCommon, conn net.Conn) (ServerSession, error) { +func makeServerSession(m metrics.Metrics, entity *EntityCommon, conn net.Conn) (ServerSession, error) { var sSes ServerSession sSes.SessionCommon = new(SessionCommon) sSes.nMap = make(noise.NonceMap) if err := sSes.SessionCommon.initServer(entity, conn); err != nil { - m.RecordSession(servermetrics.DeltaFailed) // record failed connection + m.RecordSession(metrics.DeltaFailed) // record failed connection return sSes, err } sSes.m = m @@ -43,8 +43,8 @@ func (ss *ServerSession) Close() error { // Serve serves the session. func (ss *ServerSession) Serve() { - ss.m.RecordSession(servermetrics.DeltaConnect) // record successful connection - defer ss.m.RecordSession(servermetrics.DeltaDisconnect) // record disconnection + ss.m.RecordSession(metrics.DeltaConnect) // record successful connection + defer ss.m.RecordSession(metrics.DeltaDisconnect) // record disconnection if ss.sm.smux != nil { for { sStr, err := ss.sm.smux.AcceptStream() @@ -123,7 +123,7 @@ func (ss *ServerSession) serveStream(log logrus.FieldLogger, yStr io.ReadWriteCl // Read request. req, err := readRequest() if err != nil { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return err } @@ -137,7 +137,7 @@ func (ss *ServerSession) serveStream(log logrus.FieldLogger, yStr io.ReadWriteCl ip, err := addrToIP(addr) if err != nil { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return err } @@ -146,10 +146,14 @@ func (ss *ServerSession) serveStream(log logrus.FieldLogger, yStr io.ReadWriteCl Accepted: true, IP: ip, } - obj := MakeSignedStreamResponse(&resp, ss.entity.LocalSK()) + obj, err := MakeSignedStreamResponse(&resp, ss.entity.LocalSK()) + if err != nil { + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream + return err + } if err := ss.writeObject(yStr, obj); err != nil { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return err } log.Debug("Wrote IP stream response.") @@ -159,7 +163,7 @@ func (ss *ServerSession) serveStream(log logrus.FieldLogger, yStr io.ReadWriteCl // Obtain next session. ss2, ok := ss.entity.serverSession(req.DstAddr.PK) if !ok { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return ErrReqNoNextSession } log.Debug("Obtained next session.") @@ -167,22 +171,22 @@ func (ss *ServerSession) serveStream(log logrus.FieldLogger, yStr io.ReadWriteCl // Forward request and obtain/check response. yStr2, resp, err := ss2.forwardRequest(req) if err != nil { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return err } log.Debug("Forwarded stream request.") // Forward response. if err := ss.writeObject(yStr, resp); err != nil { - ss.m.RecordStream(servermetrics.DeltaFailed) // record failed stream + ss.m.RecordStream(metrics.DeltaFailed) // record failed stream return err } log.Debug("Forwarded stream response.") // Serve stream. log.Info("Serving stream.") - ss.m.RecordStream(servermetrics.DeltaConnect) // record successful stream - defer ss.m.RecordStream(servermetrics.DeltaDisconnect) // record disconnection + ss.m.RecordStream(metrics.DeltaConnect) // record successful stream + defer ss.m.RecordStream(metrics.DeltaDisconnect) // record disconnection return netutil.CopyReadWriteCloser(yStr, yStr2) } diff --git a/pkg/dmsg/stream.go b/pkg/dmsg/stream.go index 4cc872ac9..d6a2927ae 100644 --- a/pkg/dmsg/stream.go +++ b/pkg/dmsg/stream.go @@ -102,7 +102,10 @@ func (s *Stream) writeRequest(rAddr Addr) (req StreamRequest, err error) { DstAddr: s.rAddr, NoiseMsg: nsMsg, } - obj := MakeSignedStreamRequest(&req, s.ses.localSK()) + obj, err := MakeSignedStreamRequest(&req, s.ses.localSK()) + if err != nil { + return req, err + } // Write request. if s.sStr != nil { @@ -131,7 +134,10 @@ func (s *Stream) writeIPRequest(rAddr Addr) (req StreamRequest, err error) { DstAddr: s.rAddr, IPinfo: true, } - obj := MakeSignedStreamRequest(&req, s.ses.localSK()) + obj, err := MakeSignedStreamRequest(&req, s.ses.localSK()) + if err != nil { + return req, err + } // Write request. if s.sStr != nil { @@ -196,7 +202,10 @@ func (s *Stream) writeResponse(reqHash cipher.SHA256) error { Accepted: true, NoiseMsg: nsMsg, } - obj := MakeSignedStreamResponse(&resp, s.ses.localSK()) + obj, err := MakeSignedStreamResponse(&resp, s.ses.localSK()) + if err != nil { + return err + } if s.sStr != nil { if err := s.ses.writeObject(s.sStr, obj); err != nil { diff --git a/pkg/dmsg/types.go b/pkg/dmsg/types.go index d98ed2911..d3839c8ac 100644 --- a/pkg/dmsg/types.go +++ b/pkg/dmsg/types.go @@ -102,21 +102,33 @@ const sigLen = len(cipher.Sig{}) type SignedObject []byte // MakeSignedStreamRequest encodes and signs a StreamRequest into a SignedObject format. -func MakeSignedStreamRequest(req *StreamRequest, sk cipher.SecKey) SignedObject { - obj := encodeGob(req) - sig := SignBytes(obj, sk) +func MakeSignedStreamRequest(req *StreamRequest, sk cipher.SecKey) (SignedObject, error) { + obj, err := encodeGob(req) + if err != nil { + return nil, fmt.Errorf("dmsg: encode stream request: %w", err) + } + sig, err := SignBytes(obj, sk) + if err != nil { + return nil, err + } signedObj := append(sig[:], obj...) req.raw = signedObj - return signedObj + return signedObj, nil } // MakeSignedStreamResponse encodes and signs a StreamResponse into a SignedObject format. -func MakeSignedStreamResponse(resp *StreamResponse, sk cipher.SecKey) SignedObject { - obj := encodeGob(resp) - sig := SignBytes(obj, sk) +func MakeSignedStreamResponse(resp *StreamResponse, sk cipher.SecKey) (SignedObject, error) { + obj, err := encodeGob(resp) + if err != nil { + return nil, fmt.Errorf("dmsg: encode stream response: %w", err) + } + sig, err := SignBytes(obj, sk) + if err != nil { + return nil, err + } signedObj := append(sig[:], obj...) resp.raw = signedObj - return signedObj + return signedObj, nil } // Valid returns true if the SignedObject has a valid length. @@ -237,10 +249,10 @@ func (resp StreamResponse) Verify(req StreamRequest) error { } // SignBytes signs the provided bytes with the given secret key. -func SignBytes(b []byte, sk cipher.SecKey) cipher.Sig { +func SignBytes(b []byte, sk cipher.SecKey) (cipher.Sig, error) { sig, err := cipher.SignPayload(b, sk) if err != nil { - panic(fmt.Errorf("dmsg: unexpected error occurred during StreamDialObject.Sign(): %v", err)) + return cipher.Sig{}, fmt.Errorf("dmsg: error during sign: %w", err) } - return sig + return sig, nil } diff --git a/pkg/dmsg/util.go b/pkg/dmsg/util.go index 125df9d20..a37466078 100644 --- a/pkg/dmsg/util.go +++ b/pkg/dmsg/util.go @@ -25,12 +25,12 @@ func isClosed(done chan struct{}) bool { /* Gob IO */ -func encodeGob(v interface{}) []byte { +func encodeGob(v interface{}) ([]byte, error) { var b bytes.Buffer if err := gob.NewEncoder(&b).Encode(v); err != nil { - panic(err) + return nil, err } - return b.Bytes() + return b.Bytes(), nil } func decodeGob(v interface{}, b []byte) error { diff --git a/pkg/dmsgclient/cli.go b/pkg/dmsgclient/cli.go new file mode 100644 index 000000000..f9ebfb9bb --- /dev/null +++ b/pkg/dmsgclient/cli.go @@ -0,0 +1,250 @@ +// Package dmsgclient pkg/dmsgclient/cli.go +package dmsgclient + +import ( + "context" + "fmt" + "io" + "log" + "net/http" + "os" + "path/filepath" + "strings" + "time" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" + "github.com/spf13/cobra" + + "github.com/skycoin/dmsg/pkg/direct" + "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsghttp" + "github.com/skycoin/dmsg/pkg/ioutil" +) + +// ExecName returns the name of the currently running executable, +// suitable for use as cobra.Command.Use. +func ExecName() string { + return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0] +} + +// Execute runs the given cobra command and exits on error. +func Execute(cmd *cobra.Command) { + if err := cmd.Execute(); err != nil { + log.Fatal("Failed to execute command: ", err) + } +} + +/* +Default mode of operation is dmsghttp: +* Start dmsg-direct client ; connect directly to a dmsg server +* HTTP client is configured with a dmsg HTTP transport provided by the dmsg-direct client +* HTTP client is used to make HTTP GET request to '/health' of dmsg discovery dmsg address +* If the dmsg-discovery is unreachable via the configured http client: + - Shuffle dmsg servers + - Re-make dmsg direct clent + - Reconfigure HTTP client with dmsg HTTP transport provided by the dmsg-direct client + - Fetch '/health' from dmsg discovery dmsg address [:] + - Repeat the previous 4 steps on error / until no error + +* Start dmsghttp client +* Connect to dmsg client address (if specified) + +'-Z' flag: use plain http to connect to dmsg-discovery +* HTTP client is used to make HTTP GET request to '/health' of dmsg discovery URL +* Start dmsg client +* Connect to dmsg client address (if specified) + +'-B' flag: use dmsg direct client +* Start dmsg-direct client +* Connect to dmsg client address (if specified) +*/ + +// InitDmsgWithFlags starts dmsg with flags from the flags package +func InitDmsgWithFlags(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, httpClient *http.Client, destination string) (dmsgC *dmsg.Client, stop func(), err error) { + if UseDC { + return StartDmsgDirect(ctx, dlog, pk, sk, "", DmsgSessions, dmsg.ExtractPKFromDmsgAddr(destination)) + } + if UseHTTP { + resp, err := httpClient.Get(DmsgDiscURL + "/health") + if err != nil { + dlog.WithError(err).Fatal("Error connecting to dmsg-discovery with http client") + } + defer ioutil.CloseQuietly(resp.Body, dlog) + + body, err := io.ReadAll(resp.Body) + if err != nil { + dlog.WithError(err).Error("Failed to read response body from discovery") + } else { + dlog.Infof("Received response from dmsg-discovery server %s/health:\n%s", DmsgDiscURL, string(body)) + } + + // Use direct client with synthetic entries for discovery server and all dmsg servers + // This allows dialing the discovery server which doesn't register itself + return StartDmsgWithDirectClient(ctx, dlog, pk, sk, DmsgSessions) + } + + // Default dmsghttp mode + var dmsgHTTP *http.Client + var dmsgClients []*dmsg.Client + var closeFns []func() + + dlog.Debug("Starting DMSG direct clients.") + for _, server := range dmsg.Prod.DmsgServers { + if len(dmsgClients) >= DmsgSessions { + break + } + + dmsgDC, closeFn, err := StartDmsgDirectWithServers(ctx, dlog, pk, sk, DmsgDiscAddr, []*disc.Entry{&server}, DmsgSessions, dmsg.ExtractPKFromDmsgAddr(DmsgDiscAddr)) + if err != nil { + dlog.WithError(err).Error("Failed to start DMSG direct client. Skipping server...") + continue + } + + dmsgClients = append(dmsgClients, dmsgDC) + closeFns = append(closeFns, closeFn) + } + + if len(dmsgClients) == 0 { + dlog.Fatal("Failed to start any DMSG direct clients.") + } + + // Build HTTP client with fallback round tripper + dmsgHTTP = &http.Client{ + Transport: NewFallbackRoundTripper(ctx, dmsgClients), + } + + dlog.Debug("Checking discovery /health using DMSG HTTP client.") + resp, err := dmsgHTTP.Get(DmsgDiscAddr + "/health") + if err != nil { + for _, fn := range closeFns { + fn() + } + dlog.WithError(err).Fatal("All DMSG transports failed to reach discovery /health") + } + defer ioutil.CloseQuietly(resp.Body, dlog) + + body, err := io.ReadAll(resp.Body) + if err != nil { + dlog.WithError(err).Error("Failed to read discovery /health response body") + } else { + dlog.Infof("Received response from dmsg-discovery server %s/health:\n%s", DmsgDiscAddr, string(body)) + } + + return StartDmsgWithSyntheticDiscovery(ctx, dlog, pk, sk, dmsgHTTP, DmsgDiscAddr, DmsgSessions) +} + +// StartDmsg starts dmsg returns a dmsg client for the given dmsg discovery +func StartDmsg(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, httpClient *http.Client, dmsgDisc string, dmsgSessions int) (dmsgC *dmsg.Client, stop func(), err error) { + if dlog == nil { + return nil, nil, fmt.Errorf("nil logger") + } + + dmsgC = dmsg.NewClient(pk, sk, disc.NewHTTP(dmsgDisc, httpClient, dlog), &dmsg.Config{MinSessions: dmsgSessions}) + dlog.Debug("Created dmsg client.") + + go dmsgC.Serve(ctx) + dlog.Debug("dmsgclient.Serve(ctx)") + + stop = func() { + err := dmsgC.Close() + dlog.WithError(err).Debug("Disconnected from dmsg network.\n") + log.Println() + } + dlog.WithField("dmsg_disc", dmsgDisc).Debug("Connecting to dmsg network...\n") + dlog.WithField("client public_key", pk.String()).Debug("\n") + select { + case <-ctx.Done(): + stop() + return nil, nil, ctx.Err() + + case <-dmsgC.Ready(): + dlog.Debug("Dmsg network ready.") + return dmsgC, stop, nil + } +} + +// StartDmsgDirect starts dmsg returns a dmsg direct client +func StartDmsgDirect(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, dmsgDiscAddr string, dmsgSessions int, destination string) (*dmsg.Client, func(), error) { + if len(dmsg.Prod.DmsgServers) == 0 { + return nil, nil, fmt.Errorf("no DMSG servers configured") + } + + serverPtrs := make([]*disc.Entry, len(dmsg.Prod.DmsgServers)) + for i := range dmsg.Prod.DmsgServers { + serverPtrs[i] = &dmsg.Prod.DmsgServers[i] + } + + return StartDmsgDirectWithServers(ctx, dlog, pk, sk, dmsgDiscAddr, serverPtrs, dmsgSessions, destination) +} + +// StartDmsgDirectWithServers starts a DMSG client using the provided set of DMSG servers. +// It attempts to connect and validate discovery access via the full server set. +func StartDmsgDirectWithServers(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, dmsgDiscAddr string, dmsgServers []*disc.Entry, dmsgSessions int, destination string) (dmsgC *dmsg.Client, stop func(), err error) { + + if len(dmsgServers) == 0 { + return nil, nil, fmt.Errorf("no DMSG servers provided") + } + + // Fix `dmsg error 102 - entry is not of client in discovery` error + destinationPk := cipher.PubKey{} + if err = destinationPk.UnmarshalText([]byte(destination)); err != nil { + return nil, nil, fmt.Errorf("destination address (pk) is wrong") + } + + // Build direct client with all provided servers + var keys cipher.PubKeys + keys = append(keys, pk) + entries := direct.GetAllEntries(keys, dmsgServers) + dClient := direct.NewClient(entries, dlog) + + // Post client entry with all delegated servers + var delegatedServers []cipher.PubKey + for _, srv := range dmsgServers { + delegatedServers = append(delegatedServers, srv.Static) + } + clientEntry := &disc.Entry{ + Client: &disc.Client{ + DelegatedServers: delegatedServers, + }, + Static: destinationPk, + } + if err := dClient.PostEntry(ctx, clientEntry); err != nil { + return nil, nil, fmt.Errorf("failed to post client entry: %w", err) + } + + // Configure and start DMSG client + dmsgConfig := dmsg.DefaultConfig() + dmsgConfig.MinSessions = dmsgSessions + + dmsgC, stop, err = direct.StartDmsg(ctx, dlog, pk, sk, dClient, dmsgConfig) + if err != nil { + return nil, nil, fmt.Errorf("failed to start DMSG client: %w", err) + } + if dmsgDiscAddr != "" { + // Validate that we can access discovery over DMSG + // Retry with exponential backoff to handle session initialization timing + dmsgHTTP := &http.Client{Transport: dmsghttp.MakeHTTPTransport(ctx, dmsgC)} + var resp *http.Response + maxRetries := 5 + for i := 0; i < maxRetries; i++ { + resp, err = dmsgHTTP.Get(dmsgDiscAddr + "/health") + if err == nil { + resp.Body.Close() //nolint + break + } + if i < maxRetries-1 { + backoff := time.Duration(200*(i+1)) * time.Millisecond + dlog.WithError(err).Debugf("Failed to reach discovery, retrying in %v (attempt %d/%d)", backoff, i+1, maxRetries) + time.Sleep(backoff) + } + } + if err != nil { + stop() // Cleanup if validation fails + return nil, nil, fmt.Errorf("failed to reach discovery server via DMSG: %w", err) + } + } + + return dmsgC, stop, nil +} diff --git a/internal/cli/cli.go b/pkg/dmsgclient/cli_fallback.go similarity index 57% rename from internal/cli/cli.go rename to pkg/dmsgclient/cli_fallback.go index d10310e5b..9c5edcbd8 100644 --- a/internal/cli/cli.go +++ b/pkg/dmsgclient/cli_fallback.go @@ -1,5 +1,5 @@ -// Package cli internal/cli/go -package cli +// Package dmsgclient pkg/dmsgclient/cli_fallback.go +package dmsgclient import ( "bytes" @@ -8,116 +8,16 @@ import ( "io" "log" "net/http" - "time" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" - "github.com/skycoin/dmsg/internal/flags" "github.com/skycoin/dmsg/pkg/direct" "github.com/skycoin/dmsg/pkg/disc" "github.com/skycoin/dmsg/pkg/dmsg" "github.com/skycoin/dmsg/pkg/dmsghttp" ) -/* -Default mode of operation is dmsghttp: -* Start dmsg-direct client ; connect directly to a dmsg server -* HTTP client is configured with a dmsg HTTP transport provided by the dmsg-direct client -* HTTP client is used to make HTTP GET request to '/health' of dmsg discovery dmsg address -* If the dmsg-discovery is unreachable via the configured http client: - - Shuffle dmsg servers - - Re-make dmsg direct clent - - Reconfigure HTTP client with dmsg HTTP transport provided by the dmsg-direct client - - Fetch '/health' from dmsg discovery dmsg address [:] - - Repeat the previous 4 steps on error / until no error -* Start dmsghttp client -* Connect to dmsg client address (if specified) - -'-Z' flag: use plain http to connect to dmsg-discovery -* HTTP client is used to make HTTP GET request to '/health' of dmsg discovery URL -* Start dmsg client -* Connect to dmsg client address (if specified) - -'-B' flag: use dmsg direct client -* Start dmsg-direct client -* Connect to dmsg client address (if specified) -*/ - -// InitDmsgWithFlags starts dmsg with flags from the flags package -func InitDmsgWithFlags(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, httpClient *http.Client, destination string) (dmsgC *dmsg.Client, stop func(), err error) { - if flags.UseDC { - return StartDmsgDirect(ctx, dlog, pk, sk, "", flags.DmsgSessions, dmsg.ExtractPKFromDmsgAddr(destination)) - } - if flags.UseHTTP { - resp, err := httpClient.Get(flags.DmsgDiscURL + "/health") - if err != nil { - dlog.WithError(err).Fatal("Error connecting to dmsg-discovery with http client") - } - defer resp.Body.Close() //nolint - - body, err := io.ReadAll(resp.Body) - if err != nil { - dlog.WithError(err).Error("Failed to read response body from discovery") - } else { - dlog.Infof("Received response from dmsg-discovery server %s/health:\n%s", flags.DmsgDiscURL, string(body)) - } - - // Use direct client with synthetic entries for discovery server and all dmsg servers - // This allows dialing the discovery server which doesn't register itself - return StartDmsgWithDirectClient(ctx, dlog, pk, sk, flags.DmsgSessions) - } - - // Default dmsghttp mode - var dmsgHTTP *http.Client - var dmsgClients []*dmsg.Client - var closeFns []func() - - dlog.Debug("Starting DMSG direct clients.") - for _, server := range dmsg.Prod.DmsgServers { - if len(dmsgClients) >= flags.DmsgSessions { - break - } - - dmsgDC, closeFn, err := StartDmsgDirectWithServers(ctx, dlog, pk, sk, flags.DmsgDiscAddr, []*disc.Entry{&server}, flags.DmsgSessions, dmsg.ExtractPKFromDmsgAddr(flags.DmsgDiscAddr)) - if err != nil { - dlog.WithError(err).Error("Failed to start DMSG direct client. Skipping server...") - continue - } - - dmsgClients = append(dmsgClients, dmsgDC) - closeFns = append(closeFns, closeFn) - } - - if len(dmsgClients) == 0 { - dlog.Fatal("Failed to start any DMSG direct clients.") - } - - // Build HTTP client with fallback round tripper - dmsgHTTP = &http.Client{ - Transport: NewFallbackRoundTripper(ctx, dmsgClients), - } - - dlog.Debug("Checking discovery /health using DMSG HTTP client.") - resp, err := dmsgHTTP.Get(flags.DmsgDiscAddr + "/health") - if err != nil { - for _, fn := range closeFns { - fn() - } - dlog.WithError(err).Fatal("All DMSG transports failed to reach discovery /health") - } - defer resp.Body.Close() //nolint - - body, err := io.ReadAll(resp.Body) - if err != nil { - dlog.WithError(err).Error("Failed to read discovery /health response body") - } else { - dlog.Infof("Received response from dmsg-discovery server %s/health:\n%s", flags.DmsgDiscAddr, string(body)) - } - - return StartDmsgWithSyntheticDiscovery(ctx, dlog, pk, sk, dmsgHTTP, flags.DmsgDiscAddr, flags.DmsgSessions) -} - // StartDmsgWithSyntheticDiscovery starts dmsg with a synthetic discovery entry for the discovery server itself func StartDmsgWithSyntheticDiscovery(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, httpClient *http.Client, dmsgDisc string, dmsgSessions int) (dmsgC *dmsg.Client, stop func(), err error) { if dlog == nil { @@ -173,120 +73,6 @@ func StartDmsgWithSyntheticDiscovery(ctx context.Context, dlog *logging.Logger, } } -// StartDmsg starts dmsg returns a dmsg client for the given dmsg discovery -func StartDmsg(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, httpClient *http.Client, dmsgDisc string, dmsgSessions int) (dmsgC *dmsg.Client, stop func(), err error) { - if dlog == nil { - return nil, nil, fmt.Errorf("nil logger") - } - - dmsgC = dmsg.NewClient(pk, sk, disc.NewHTTP(dmsgDisc, httpClient, dlog), &dmsg.Config{MinSessions: dmsgSessions}) - dlog.Debug("Created dmsg client.") - - go dmsgC.Serve(ctx) - dlog.Debug("dmsgclient.Serve(ctx)") - - stop = func() { - err := dmsgC.Close() - dlog.WithError(err).Debug("Disconnected from dmsg network.\n") - log.Println() - } - dlog.WithField("dmsg_disc", dmsgDisc).Debug("Connecting to dmsg network...\n") - dlog.WithField("client public_key", pk.String()).Debug("\n") - select { - case <-ctx.Done(): - stop() - return nil, nil, ctx.Err() - - case <-dmsgC.Ready(): - dlog.Debug("Dmsg network ready.") - return dmsgC, stop, nil - } -} - -// StartDmsgDirect starts dmsg returns a dmsg direct client -func StartDmsgDirect(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, dmsgDiscAddr string, dmsgSessions int, destination string) (*dmsg.Client, func(), error) { - if len(dmsg.Prod.DmsgServers) == 0 { - return nil, nil, fmt.Errorf("no DMSG servers configured") - } - - serverPtrs := make([]*disc.Entry, len(dmsg.Prod.DmsgServers)) - for i := range dmsg.Prod.DmsgServers { - serverPtrs[i] = &dmsg.Prod.DmsgServers[i] - } - - return StartDmsgDirectWithServers(ctx, dlog, pk, sk, dmsgDiscAddr, serverPtrs, dmsgSessions, destination) -} - -// StartDmsgDirectWithServers starts a DMSG client using the provided set of DMSG servers. -// It attempts to connect and validate discovery access via the full server set. -func StartDmsgDirectWithServers(ctx context.Context, dlog *logging.Logger, pk cipher.PubKey, sk cipher.SecKey, dmsgDiscAddr string, dmsgServers []*disc.Entry, dmsgSessions int, destination string) (dmsgC *dmsg.Client, stop func(), err error) { - - if len(dmsgServers) == 0 { - return nil, nil, fmt.Errorf("no DMSG servers provided") - } - - // Fix `dmsg error 102 - entry is not of client in discovery` error - destinationPk := cipher.PubKey{} - if err = destinationPk.UnmarshalText([]byte(destination)); err != nil { - return nil, nil, fmt.Errorf("destination address (pk) is wrong") - } - - // Build direct client with all provided servers - var keys cipher.PubKeys - keys = append(keys, pk) - entries := direct.GetAllEntries(keys, dmsgServers) - dClient := direct.NewClient(entries, dlog) - - // Post client entry with all delegated servers - var delegatedServers []cipher.PubKey - for _, srv := range dmsgServers { - delegatedServers = append(delegatedServers, srv.Static) - } - clientEntry := &disc.Entry{ - Client: &disc.Client{ - DelegatedServers: delegatedServers, - }, - Static: destinationPk, - } - if err := dClient.PostEntry(ctx, clientEntry); err != nil { - return nil, nil, fmt.Errorf("failed to post client entry: %w", err) - } - - // Configure and start DMSG client - dmsgConfig := dmsg.DefaultConfig() - dmsgConfig.MinSessions = dmsgSessions - - dmsgC, stop, err = direct.StartDmsg(ctx, dlog, pk, sk, dClient, dmsgConfig) - if err != nil { - return nil, nil, fmt.Errorf("failed to start DMSG client: %w", err) - } - if dmsgDiscAddr != "" { - // Validate that we can access discovery over DMSG - // Retry with exponential backoff to handle session initialization timing - dmsgHTTP := &http.Client{Transport: dmsghttp.MakeHTTPTransport(ctx, dmsgC)} - var resp *http.Response - maxRetries := 5 - for i := 0; i < maxRetries; i++ { - resp, err = dmsgHTTP.Get(dmsgDiscAddr + "/health") - if err == nil { - resp.Body.Close() //nolint - break - } - if i < maxRetries-1 { - backoff := time.Duration(200*(i+1)) * time.Millisecond - dlog.WithError(err).Debugf("Failed to reach discovery, retrying in %v (attempt %d/%d)", backoff, i+1, maxRetries) - time.Sleep(backoff) - } - } - if err != nil { - stop() // Cleanup if validation fails - return nil, nil, fmt.Errorf("failed to reach discovery server via DMSG: %w", err) - } - } - - return dmsgC, stop, nil -} - // StartDmsgWithDirectClient starts dmsg with a fallback discovery client // This allows dialing any client including the discovery server which doesn't register itself // It uses direct client for known entries (servers, discovery, local client) and falls back @@ -303,7 +89,7 @@ func StartDmsgWithDirectClient(ctx context.Context, dlog *logging.Logger, pk cip } // Add synthetic entry for discovery server - discPK := dmsg.ExtractPKFromDmsgAddr(flags.DmsgDiscAddr) + discPK := dmsg.ExtractPKFromDmsgAddr(DmsgDiscAddr) if discPK != "" { var discoveryPK cipher.PubKey if err := discoveryPK.UnmarshalText([]byte(discPK)); err == nil { @@ -341,7 +127,7 @@ func StartDmsgWithDirectClient(ctx context.Context, dlog *logging.Logger, pk cip directClient := direct.NewClient(entries, dlog) // Create HTTP discovery client as fallback for unknown entries - httpDiscClient := disc.NewHTTP(flags.DmsgDiscURL, &http.Client{}, dlog) + httpDiscClient := disc.NewHTTP(DmsgDiscURL, &http.Client{}, dlog) // Wrap with fallback client that tries direct first, then HTTP discovery fallbackClient := newFallbackDiscClient(directClient, httpDiscClient, dlog) diff --git a/internal/flags/flags.go b/pkg/dmsgclient/flags.go similarity index 96% rename from internal/flags/flags.go rename to pkg/dmsgclient/flags.go index 2189a8ec2..004764fbe 100644 --- a/internal/flags/flags.go +++ b/pkg/dmsgclient/flags.go @@ -1,5 +1,5 @@ -// Package flags internal/flags/flags.go -package flags +// Package dmsgclient pkg/dmsgclient/flags.go +package dmsgclient import ( "os" diff --git a/pkg/dmsgctrl/serve_listener_test.go b/pkg/dmsgctrl/serve_listener_test.go new file mode 100644 index 000000000..5443dbdaf --- /dev/null +++ b/pkg/dmsgctrl/serve_listener_test.go @@ -0,0 +1,354 @@ +package dmsgctrl_test + +import ( + "context" + "net" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/dmsg/pkg/dmsgctrl" +) + +// TestServeListener_AcceptAndControl verifies that ServeListener accepts +// connections and delivers Controls through the returned channel. +func TestServeListener_AcceptAndControl(t *testing.T) { + l, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + ch := dmsgctrl.ServeListener(l, 4) + + // Dial two connections into the listener. + connA, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + connB, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + + // We should receive two Controls from the channel. + var ctrls []*dmsgctrl.Control + timeout := time.After(2 * time.Second) + for i := 0; i < 2; i++ { + select { + case ctrl, ok := <-ch: + require.True(t, ok, "channel closed unexpectedly") + require.NotNil(t, ctrl) + ctrls = append(ctrls, ctrl) + case <-timeout: + t.Fatal("timed out waiting for Control from channel") + } + } + + assert.Len(t, ctrls, 2) + + // Cleanup. + for _, ctrl := range ctrls { + ctrl.Close() //nolint:errcheck,gosec + } + connA.Close() //nolint:errcheck,gosec + connB.Close() //nolint:errcheck,gosec + l.Close() //nolint:errcheck,gosec +} + +// TestServeListener_ClosesChannelOnListenerClose verifies that the channel +// returned by ServeListener is closed when the underlying listener is closed. +func TestServeListener_ClosesChannelOnListenerClose(t *testing.T) { + l, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + ch := dmsgctrl.ServeListener(l, 4) + + // Close the listener; the goroutine should detect "use of closed" and + // close the channel. + require.NoError(t, l.Close()) + + select { + case _, ok := <-ch: + assert.False(t, ok, "expected channel to be closed") + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for channel to close") + } +} + +// TestServeListener_FullChannelDropsControl verifies that when the control +// channel is full, new Controls are dropped rather than blocking. +func TestServeListener_FullChannelDropsControl(t *testing.T) { + l, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + // Channel length of 1 — second accepted conn should be dropped. + ch := dmsgctrl.ServeListener(l, 1) + + conn1, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + + // Wait for the first Control to land in the channel. + select { + case ctrl := <-ch: + require.NotNil(t, ctrl) + defer ctrl.Close() //nolint:errcheck,gosec + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for first control") + } + + // Dial a second connection — this should be dropped since the channel is + // still full (we already consumed the first, but let's fill it again). + // First, fill the channel again by dialing one more. + conn2, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + + // Wait for the second to arrive. + select { + case ctrl := <-ch: + require.NotNil(t, ctrl) + defer ctrl.Close() //nolint:errcheck,gosec + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for second control") + } + + // Now the channel is empty but has cap 1. Fill it without consuming. + conn3, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + time.Sleep(200 * time.Millisecond) // let it land + + // This fourth conn should be dropped. + conn4, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + time.Sleep(200 * time.Millisecond) // let it be processed + + // Drain one — we should get exactly one more (the third). + select { + case ctrl := <-ch: + require.NotNil(t, ctrl) + defer ctrl.Close() //nolint:errcheck,gosec + case <-time.After(2 * time.Second): + t.Fatal("timed out waiting for third control") + } + + // Cleanup. + conn1.Close() //nolint:errcheck,gosec + conn2.Close() //nolint:errcheck,gosec + conn3.Close() //nolint:errcheck,gosec + conn4.Close() //nolint:errcheck,gosec + l.Close() //nolint:errcheck,gosec +} + +// TestControl_PingPongExchange tests that a ping on one side results in a +// measurable round-trip duration on the same side. +func TestControl_PingPongExchange(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + ctrlB := dmsgctrl.ControlStream(connB) + + t.Cleanup(func() { + ctrlA.Close() //nolint:errcheck,gosec + ctrlB.Close() //nolint:errcheck,gosec + }) + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + dur, err := ctrlA.Ping(ctx) + require.NoError(t, err) + assert.True(t, dur >= 0, "expected non-negative duration, got %v", dur) +} + +// TestControl_PingContextCancel verifies that Ping returns the context error +// when the context is canceled while waiting for a pong. +func TestControl_PingContextCancel(t *testing.T) { + connA, connB := net.Pipe() + defer connB.Close() //nolint:errcheck,gosec + + ctrlA := dmsgctrl.ControlStream(connA) + + // Create a goroutine that reads (consumes the ping byte) but never + // sends a pong back, so ctrlA.Ping will block waiting for pong. + go func() { + buf := make([]byte, 1) + for { + _, err := connB.Read(buf) + if err != nil { + return + } + // Intentionally do not reply with pong. + } + }() + + ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) + defer cancel() + + _, err := ctrlA.Ping(ctx) + assert.ErrorIs(t, err, context.DeadlineExceeded) + + ctrlA.Close() //nolint:errcheck,gosec +} + +// TestControl_Close verifies that Close sets the error and signals Done. +func TestControl_Close(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + ctrlB := dmsgctrl.ControlStream(connB) + + require.NoError(t, ctrlA.Close()) + + // Wait for both sides to finish. + select { + case <-ctrlA.Done(): + case <-time.After(2 * time.Second): + t.Fatal("ctrlA.Done() did not close in time") + } + + select { + case <-ctrlB.Done(): + case <-time.After(2 * time.Second): + t.Fatal("ctrlB.Done() did not close in time") + } + + // Err should report ErrClosed on the side that initiated Close. + assert.ErrorIs(t, ctrlA.Err(), dmsgctrl.ErrClosed) + + // The remote side should have a non-nil error (EOF or similar). + assert.Error(t, ctrlB.Err()) +} + +// TestControl_DoubleClose ensures calling Close twice does not panic and +// returns the original error. +func TestControl_DoubleClose(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + dmsgctrl.ControlStream(connB) //nolint:errcheck,gosec + + err1 := ctrlA.Close() + // Second close: the connection is already closed so conn.Close may + // return an error, but it must not panic. + ctrlA.Close() //nolint:errcheck,gosec + _ = err1 + + // Wait for done. + select { + case <-ctrlA.Done(): + case <-time.After(time.Second): + t.Fatal("ctrlA.Done() did not fire") + } +} + +// TestControl_ErrBeforeDone verifies that Err returns nil when the control +// is still running. +func TestControl_ErrBeforeDone(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + ctrlB := dmsgctrl.ControlStream(connB) + + // Control is still alive — Err should be nil. + assert.Nil(t, ctrlA.Err()) + assert.Nil(t, ctrlB.Err()) + + ctrlA.Close() //nolint:errcheck,gosec + ctrlB.Close() //nolint:errcheck,gosec +} + +// TestControl_DoneChannel tests that the Done channel blocks while the +// control is active and unblocks after Close. +func TestControl_DoneChannel(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + ctrlB := dmsgctrl.ControlStream(connB) + + // Done should block. + select { + case <-ctrlA.Done(): + t.Fatal("Done() should not be closed yet") + default: + // expected + } + + require.NoError(t, ctrlA.Close()) + + select { + case <-ctrlA.Done(): + case <-time.After(time.Second): + t.Fatal("Done() did not close after Close()") + } + + ctrlB.Close() //nolint:errcheck,gosec +} + +// TestControl_Conn verifies that Conn returns the underlying net.Conn. +func TestControl_Conn(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + dmsgctrl.ControlStream(connB) //nolint:errcheck,gosec + + assert.Equal(t, connA, ctrlA.Conn()) + + ctrlA.Close() //nolint:errcheck,gosec +} + +// TestControl_ConcurrentPing tests that multiple goroutines can ping +// simultaneously without races or panics. +func TestControl_ConcurrentPing(t *testing.T) { + // Use TCP so writes don't block synchronously like net.Pipe. + l, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + defer l.Close() //nolint:errcheck,gosec + + var connB net.Conn + accepted := make(chan struct{}) + go func() { + var err error + connB, err = l.Accept() + if err != nil { + return + } + close(accepted) + }() + + connA, err := net.Dial("tcp", l.Addr().String()) + require.NoError(t, err) + <-accepted + + ctrlA := dmsgctrl.ControlStream(connA) + ctrlB := dmsgctrl.ControlStream(connB) + + t.Cleanup(func() { + ctrlA.Close() //nolint:errcheck,gosec + ctrlB.Close() //nolint:errcheck,gosec + }) + + const goroutines = 5 + var wg sync.WaitGroup + wg.Add(goroutines * 2) + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + for i := 0; i < goroutines; i++ { + go func() { + defer wg.Done() + _, _ = ctrlA.Ping(ctx) //nolint:errcheck,gosec + }() + go func() { + defer wg.Done() + _, _ = ctrlB.Ping(ctx) //nolint:errcheck,gosec + }() + } + + wg.Wait() +} + +// TestControl_PingAfterClose verifies that Ping returns an error after the +// control has been closed. +func TestControl_PingAfterClose(t *testing.T) { + connA, connB := net.Pipe() + ctrlA := dmsgctrl.ControlStream(connA) + dmsgctrl.ControlStream(connB) //nolint:errcheck,gosec + + require.NoError(t, ctrlA.Close()) + + <-ctrlA.Done() + + _, err := ctrlA.Ping(context.Background()) + assert.Error(t, err) +} diff --git a/pkg/dmsgcurl/dmsgcurl.go b/pkg/dmsgcurl/dmsgcurl.go index 2d4618100..7faab3682 100644 --- a/pkg/dmsgcurl/dmsgcurl.go +++ b/pkg/dmsgcurl/dmsgcurl.go @@ -60,7 +60,7 @@ func (dg *DmsgCurl) String() string { } j, err := jsonite.Marshal(m) if err != nil { - panic(err) + return fmt.Sprintf("", err) } return string(j) } @@ -195,7 +195,7 @@ func parseOutputFile(name string, urlPath string) (*os.File, error) { // StartDmsg create dsmg client instance func (dg *DmsgCurl) StartDmsg(ctx context.Context, log *logging.Logger, pk cipher.PubKey, sk cipher.SecKey) (dmsgC *dmsg.Client, stop func(), err error) { dmsgC = dmsg.NewClient(pk, sk, disc.NewHTTP(dg.dmsgF.Disc, &http.Client{}, log), &dmsg.Config{MinSessions: dg.dmsgF.Sessions}) - go dmsgC.Serve(context.Background()) + go dmsgC.Serve(ctx) stop = func() { err := dmsgC.Close() diff --git a/pkg/dmsgcurl/url_test.go b/pkg/dmsgcurl/url_test.go new file mode 100644 index 000000000..0ce44e507 --- /dev/null +++ b/pkg/dmsgcurl/url_test.go @@ -0,0 +1,209 @@ +package dmsgcurl_test + +import ( + "bytes" + "context" + "errors" + "flag" + "io" + "strings" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/dmsg/pkg/dmsgcurl" +) + +// A valid 66-char hex public key for testing. +const testPK = "024ec47420176680816e0406250e7156465e4531f5b26057c9f6297bb0303558c7" + +// --------------------------------------------------------------------------- +// URL.Fill tests +// --------------------------------------------------------------------------- + +func TestURL_Fill_Valid(t *testing.T) { + tests := []struct { + name string + url string + }{ + {"with port and path", "dmsg://" + testPK + ":80/some/path"}, + {"without port", "dmsg://" + testPK + "/file.txt"}, + {"http scheme", "http://" + testPK + ":8080/index.html"}, + {"root path", "dmsg://" + testPK + ":443/"}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + var u dmsgcurl.URL + err := u.Fill(tc.url) + assert.NoError(t, err) + assert.NotEmpty(t, u.URL.Host) + }) + } +} + +func TestURL_Fill_MissingScheme(t *testing.T) { + // URL without a scheme - url.Parse may return its own error or Fill detects missing scheme. + var u dmsgcurl.URL + err := u.Fill(testPK + ":80/path") + require.Error(t, err) + + // Also test a path-only URL that url.Parse accepts but has no scheme. + var u2 dmsgcurl.URL + err2 := u2.Fill("//example/path") + require.Error(t, err2) + assert.Contains(t, err2.Error(), "missing a scheme") +} + +func TestURL_Fill_MissingHost(t *testing.T) { + var u dmsgcurl.URL + err := u.Fill("dmsg:///path/only") + require.Error(t, err) + assert.Contains(t, err.Error(), "missing a host") +} + +func TestURL_Fill_InvalidHost(t *testing.T) { + // Host is not a valid public key. + var u dmsgcurl.URL + err := u.Fill("dmsg://not-a-pubkey:80/path") + require.Error(t, err) +} + +func TestURL_Fill_EmptyString(t *testing.T) { + var u dmsgcurl.URL + err := u.Fill("") + require.Error(t, err) +} + +// --------------------------------------------------------------------------- +// ProgressWriter tests +// --------------------------------------------------------------------------- + +func TestProgressWriter_Write_KnownTotal(t *testing.T) { + pw := &dmsgcurl.ProgressWriter{Total: 100} + + n, err := pw.Write(make([]byte, 30)) + assert.NoError(t, err) + assert.Equal(t, 30, n) + assert.Equal(t, int64(30), atomic.LoadInt64(&pw.Current)) + + n, err = pw.Write(make([]byte, 70)) + assert.NoError(t, err) + assert.Equal(t, 70, n) + assert.Equal(t, int64(100), atomic.LoadInt64(&pw.Current)) +} + +func TestProgressWriter_Write_UnknownTotal(t *testing.T) { + pw := &dmsgcurl.ProgressWriter{Total: 0} + + n, err := pw.Write(make([]byte, 42)) + assert.NoError(t, err) + assert.Equal(t, 42, n) + assert.Equal(t, int64(42), atomic.LoadInt64(&pw.Current)) +} + +func TestProgressWriter_Write_EmptySlice(t *testing.T) { + pw := &dmsgcurl.ProgressWriter{Total: 50} + + n, err := pw.Write([]byte{}) + assert.NoError(t, err) + assert.Equal(t, 0, n) + assert.Equal(t, int64(0), atomic.LoadInt64(&pw.Current)) +} + +// --------------------------------------------------------------------------- +// CancellableCopy tests +// --------------------------------------------------------------------------- + +func TestCancellableCopy_Normal(t *testing.T) { + src := io.NopCloser(strings.NewReader("hello world")) + var dst bytes.Buffer + + n, err := dmsgcurl.CancellableCopy(context.Background(), &dst, src, int64(len("hello world"))) + assert.NoError(t, err) + assert.Equal(t, int64(11), n) + assert.Equal(t, "hello world", dst.String()) +} + +func TestCancellableCopy_Canceled(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() // cancel immediately + + src := io.NopCloser(strings.NewReader("data that should not be copied")) + var dst bytes.Buffer + + _, err := dmsgcurl.CancellableCopy(ctx, &dst, src, 30) + require.Error(t, err) + assert.Contains(t, err.Error(), "Canceled") +} + +func TestCancellableCopy_EmptyBody(t *testing.T) { + src := io.NopCloser(strings.NewReader("")) + var dst bytes.Buffer + + n, err := dmsgcurl.CancellableCopy(context.Background(), &dst, src, 0) + assert.NoError(t, err) + assert.Equal(t, int64(0), n) +} + +// --------------------------------------------------------------------------- +// New constructor tests +// --------------------------------------------------------------------------- + +func TestNew_ReturnsNonNil(t *testing.T) { + fs := flag.NewFlagSet("test", flag.ContinueOnError) + fs.SetOutput(io.Discard) + dg := dmsgcurl.New(fs) + require.NotNil(t, dg) +} + +func TestNew_RegistersFlags(t *testing.T) { + fs := flag.NewFlagSet("test", flag.ContinueOnError) + fs.SetOutput(io.Discard) + dmsgcurl.New(fs) //nolint:errcheck + + // Verify some expected flags were registered. + for _, name := range []string{"help", "h", "dmsg-disc", "dmsg-sessions", "O", "t", "w", "U"} { + assert.NotNilf(t, fs.Lookup(name), "expected flag %q to be registered", name) + } +} + +// --------------------------------------------------------------------------- +// DmsgCurl.String() tests +// --------------------------------------------------------------------------- + +func TestString_ContainsFlagGroupNames(t *testing.T) { + fs := flag.NewFlagSet("test", flag.ContinueOnError) + fs.SetOutput(io.Discard) + dg := dmsgcurl.New(fs) + + s := dg.String() + assert.Contains(t, s, "Startup") + assert.Contains(t, s, "Dmsg") + assert.Contains(t, s, "Download") + assert.Contains(t, s, "HTTP") +} + +func TestString_IsValidJSON(t *testing.T) { + fs := flag.NewFlagSet("test", flag.ContinueOnError) + fs.SetOutput(io.Discard) + dg := dmsgcurl.New(fs) + + s := dg.String() + // Quick check: valid JSON starts with '{' and ends with '}'. + assert.True(t, strings.HasPrefix(s, "{")) + assert.True(t, strings.HasSuffix(s, "}")) +} + +// --------------------------------------------------------------------------- +// Error variable tests +// --------------------------------------------------------------------------- + +func TestErr_Variables(t *testing.T) { + assert.True(t, errors.Is(dmsgcurl.ErrNoURLs, dmsgcurl.ErrNoURLs)) + assert.True(t, errors.Is(dmsgcurl.ErrMultipleURLsNotSupported, dmsgcurl.ErrMultipleURLsNotSupported)) + assert.NotEqual(t, dmsgcurl.ErrNoURLs, dmsgcurl.ErrMultipleURLsNotSupported) + assert.Equal(t, "no URLs provided", dmsgcurl.ErrNoURLs.Error()) + assert.Equal(t, "multiple URLs is not yet supported", dmsgcurl.ErrMultipleURLsNotSupported.Error()) +} diff --git a/pkg/dmsghttp/http.go b/pkg/dmsghttp/http.go index 616fca4dc..d457b6a3b 100644 --- a/pkg/dmsghttp/http.go +++ b/pkg/dmsghttp/http.go @@ -34,7 +34,7 @@ func ListenAndServe(ctx context.Context, _ cipher.SecKey, a http.Handler, _ disc } done := make(chan struct{}) - go func() { + go func() { //nolint:gosec select { case <-ctx.Done(): if err := srv.Shutdown(context.Background()); err != nil { diff --git a/pkg/dmsghttp/util_test.go b/pkg/dmsghttp/util_test.go new file mode 100644 index 000000000..fd1166075 --- /dev/null +++ b/pkg/dmsghttp/util_test.go @@ -0,0 +1,507 @@ +// Package dmsghttp_test pkg/dmsghttp/util_test.go +package dmsghttp_test + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/go-chi/chi/v5" + "github.com/sirupsen/logrus" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/net/nettest" + + "github.com/skycoin/dmsg/pkg/disc" + "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsghttp" +) + +func init() { + logrus.SetLevel(logrus.WarnLevel) +} + +// --- MakeHTTPTransport tests --- + +func TestMakeHTTPTransport_ReturnsValidTransport(t *testing.T) { + // Verify MakeHTTPTransport returns a transport that implements http.RoundTripper. + dc := disc.NewMock(0) + + pk, sk := cipher.GenerateKeyPair() + dmsgC := dmsg.NewClient(pk, sk, dc, nil) + defer dmsgC.Close() //nolint:errcheck,gosec + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + transport := dmsghttp.MakeHTTPTransport(ctx, dmsgC) + + // Verify the returned value satisfies http.RoundTripper. + var _ http.RoundTripper = transport +} + +func TestMakeHTTPTransport_RoundTripInvalidHost(t *testing.T) { + // RoundTrip should fail with an invalid host address. + dc := disc.NewMock(0) + + pk, sk := cipher.GenerateKeyPair() + dmsgC := dmsg.NewClient(pk, sk, dc, nil) + defer dmsgC.Close() //nolint:errcheck,gosec + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + transport := dmsghttp.MakeHTTPTransport(ctx, dmsgC) + + req, err := http.NewRequest(http.MethodGet, "http://invalid-host:80/test", nil) + require.NoError(t, err) + + resp, err := transport.RoundTrip(req) + assert.Error(t, err) + assert.Nil(t, resp) + assert.Contains(t, err.Error(), "invalid host address") +} + +func TestMakeHTTPTransport_RoundTripDialFailure(t *testing.T) { + // RoundTrip should fail when dial fails (no servers available). + const maxSessions = 10 + dc := disc.NewMock(0) + + // Create a single server so the client can start. + srvPK, srvSK := cipher.GenerateKeyPair() + srvConf := dmsg.ServerConfig{MaxSessions: maxSessions, UpdateInterval: 0} + srv := dmsg.NewServer(srvPK, srvSK, dc, &srvConf, nil) + lis, err := nettest.NewLocalListener("tcp") + require.NoError(t, err) + go srv.Serve(lis, "") //nolint:errcheck,gosec + defer srv.Close() //nolint:errcheck,gosec + + pk, sk := cipher.GenerateKeyPair() + dmsgC := dmsg.NewClient(pk, sk, dc, &dmsg.Config{MinSessions: 1}) + go dmsgC.Serve(context.Background()) + defer dmsgC.Close() //nolint:errcheck,gosec + <-dmsgC.Ready() + + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + transport := dmsghttp.MakeHTTPTransport(ctx, dmsgC) + + // Use a valid PK format but one that no client is listening on. + fakePK, _ := cipher.GenerateKeyPair() + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("http://%s:80/test", fakePK.String()), nil) + require.NoError(t, err) + req = req.WithContext(ctx) + + resp, err := transport.RoundTrip(req) + assert.Error(t, err) + assert.Nil(t, resp) +} + +func TestMakeHTTPTransport_FullRoundTrip(t *testing.T) { + // End-to-end: client dials to HTTP server over dmsg and gets a response. + const maxSessions = 20 + const dmsgHTTPPort = uint16(80) + + dc := disc.NewMock(0) + + // Start dmsg server. + srvPK, srvSK := cipher.GenerateKeyPair() + srvConf := dmsg.ServerConfig{MaxSessions: maxSessions, UpdateInterval: 0} + srv := dmsg.NewServer(srvPK, srvSK, dc, &srvConf, nil) + lis, err := nettest.NewLocalListener("tcp") + require.NoError(t, err) + go srv.Serve(lis, "") //nolint:errcheck,gosec + t.Cleanup(func() { srv.Close() }) //nolint:errcheck,gosec + <-srv.Ready() + + // Start dmsg client that hosts HTTP server. + hostPK, hostSK := cipher.GenerateKeyPair() + dmsgHost := dmsg.NewClient(hostPK, hostSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgHost.Serve(context.Background()) + t.Cleanup(func() { dmsgHost.Close() }) //nolint:errcheck,gosec + <-dmsgHost.Ready() + + dmsgLis, err := dmsgHost.Listen(dmsgHTTPPort) + require.NoError(t, err) + + r := chi.NewRouter() + r.Get("/hello", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte("world")) //nolint:errcheck,gosec + }) + r.Post("/echo", func(w http.ResponseWriter, r *http.Request) { + data, _ := io.ReadAll(r.Body) //nolint:errcheck,gosec + w.Write(data) //nolint:errcheck,gosec + }) + go http.Serve(dmsgLis, r) //nolint:errcheck,gosec + + // Start dmsg client that runs HTTP client. + clientPK, clientSK := cipher.GenerateKeyPair() + dmsgClient := dmsg.NewClient(clientPK, clientSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgClient.Serve(context.Background()) + t.Cleanup(func() { dmsgClient.Close() }) //nolint:errcheck,gosec + <-dmsgClient.Ready() + + // Allow time for dmsg sessions to stabilize. + time.Sleep(300 * time.Millisecond) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + httpC := http.Client{ + Transport: dmsghttp.MakeHTTPTransport(ctx, dmsgClient), + Timeout: 10 * time.Second, + } + + t.Run("GET_request", func(t *testing.T) { + resp, err := httpC.Get(fmt.Sprintf("http://%s:%d/hello", hostPK.String(), dmsgHTTPPort)) + require.NoError(t, err) + defer resp.Body.Close() //nolint:errcheck,gosec + + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, "world", string(body)) + }) + + t.Run("POST_echo", func(t *testing.T) { + resp, err := httpC.Post( + fmt.Sprintf("http://%s:%d/echo", hostPK.String(), dmsgHTTPPort), + "text/plain", + http.NoBody, + ) + require.NoError(t, err) + defer resp.Body.Close() //nolint:errcheck,gosec + assert.Equal(t, http.StatusOK, resp.StatusCode) + }) +} + +func TestMakeHTTPTransport_DefaultPort(t *testing.T) { + // When no port is specified in the host, default port 80 should be used. + const maxSessions = 20 + + dc := disc.NewMock(0) + + srvPK, srvSK := cipher.GenerateKeyPair() + srvConf := dmsg.ServerConfig{MaxSessions: maxSessions, UpdateInterval: 0} + srv := dmsg.NewServer(srvPK, srvSK, dc, &srvConf, nil) + lis, err := nettest.NewLocalListener("tcp") + require.NoError(t, err) + go srv.Serve(lis, "") //nolint:errcheck,gosec + t.Cleanup(func() { srv.Close() }) //nolint:errcheck,gosec + <-srv.Ready() + + // Host HTTP server on port 80. + hostPK, hostSK := cipher.GenerateKeyPair() + dmsgHost := dmsg.NewClient(hostPK, hostSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgHost.Serve(context.Background()) + t.Cleanup(func() { dmsgHost.Close() }) //nolint:errcheck,gosec + <-dmsgHost.Ready() + + dmsgLis, err := dmsgHost.Listen(80) + require.NoError(t, err) + + r := chi.NewRouter() + r.Get("/", func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte("default-port")) //nolint:errcheck,gosec + }) + go http.Serve(dmsgLis, r) //nolint:errcheck,gosec + + // Client. + clientPK, clientSK := cipher.GenerateKeyPair() + dmsgClient := dmsg.NewClient(clientPK, clientSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgClient.Serve(context.Background()) + t.Cleanup(func() { dmsgClient.Close() }) //nolint:errcheck,gosec + <-dmsgClient.Ready() + + // Allow time for dmsg sessions to stabilize. + time.Sleep(300 * time.Millisecond) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + httpC := http.Client{ + Transport: dmsghttp.MakeHTTPTransport(ctx, dmsgClient), + Timeout: 10 * time.Second, + } + + // URL without port — should default to 80. + resp, err := httpC.Get(fmt.Sprintf("http://%s/", hostPK.String())) + require.NoError(t, err) + defer resp.Body.Close() //nolint:errcheck,gosec + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, "default-port", string(body)) +} + +// --- GetServers tests --- + +// newDiscoveryMockServer creates an httptest.Server that mimics the dmsg-discovery +// AllServers endpoint at /dmsg-discovery/all_servers. +func newDiscoveryMockServer(t *testing.T, entries []*disc.Entry) *httptest.Server { + t.Helper() + mux := http.NewServeMux() + mux.HandleFunc("/dmsg-discovery/all_servers", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(entries); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + }) + srv := httptest.NewServer(mux) + t.Cleanup(srv.Close) + return srv +} + +func TestGetServers_ReturnsServers(t *testing.T) { + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + + entries := []*disc.Entry{ + { + Static: pk1, + Server: &disc.Server{Address: "1.2.3.4:8080", AvailableSessions: 10}, + }, + { + Static: pk2, + Server: &disc.Server{Address: "5.6.7.8:8080", AvailableSessions: 5}, + }, + } + + srv := newDiscoveryMockServer(t, entries) + log := logging.MustGetLogger("test_get_servers") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + result := dmsghttp.GetServers(ctx, srv.URL, "", log) + require.Len(t, result, 2) +} + +func TestGetServers_FiltersServerType(t *testing.T) { + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + pk3, _ := cipher.GenerateKeyPair() + + entries := []*disc.Entry{ + { + Static: pk1, + Server: &disc.Server{Address: "1.2.3.4:8080", AvailableSessions: 10, ServerType: "official"}, + }, + { + Static: pk2, + Server: &disc.Server{Address: "5.6.7.8:8080", AvailableSessions: 5, ServerType: "community"}, + }, + { + Static: pk3, + Server: &disc.Server{Address: "9.10.11.12:8080", AvailableSessions: 3, ServerType: "official"}, + }, + } + + srv := newDiscoveryMockServer(t, entries) + log := logging.MustGetLogger("test_filter") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + t.Run("filter_official", func(t *testing.T) { + result := dmsghttp.GetServers(ctx, srv.URL, "official", log) + require.Len(t, result, 2) + for _, e := range result { + assert.Equal(t, "official", e.Server.ServerType) + } + }) + + t.Run("filter_community", func(t *testing.T) { + result := dmsghttp.GetServers(ctx, srv.URL, "community", log) + require.Len(t, result, 1) + assert.Equal(t, "community", result[0].Server.ServerType) + }) +} + +func TestGetServers_FilterRemovesAllRetries(t *testing.T) { + // When filtering removes all servers, GetServers retries. On context cancellation + // it should return empty. + pk1, _ := cipher.GenerateKeyPair() + + entries := []*disc.Entry{ + { + Static: pk1, + Server: &disc.Server{Address: "1.2.3.4:8080", AvailableSessions: 10, ServerType: "community"}, + }, + } + + srv := newDiscoveryMockServer(t, entries) + log := logging.MustGetLogger("test_filter_none") + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + // Filter for "official" but only "community" servers exist: should retry until context expires. + result := dmsghttp.GetServers(ctx, srv.URL, "official", log) + assert.Empty(t, result) +} + +func TestGetServers_ContextCanceledReturnsEmpty(t *testing.T) { + // If context is canceled before any servers are found, return empty. + log := logging.MustGetLogger("test_ctx_cancel") + + // Use a URL that will fail (no server listening). + ctx, cancel := context.WithCancel(context.Background()) + cancel() // Cancel immediately. + + result := dmsghttp.GetServers(ctx, "http://127.0.0.1:1", "", log) + assert.Empty(t, result) +} + +func TestGetServers_EmptyResponseRetries(t *testing.T) { + // If the discovery returns an empty list, GetServers retries until context is done. + srv := newDiscoveryMockServer(t, []*disc.Entry{}) + log := logging.MustGetLogger("test_empty") + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + result := dmsghttp.GetServers(ctx, srv.URL, "", log) + assert.Empty(t, result) +} + +func TestGetServers_NoFilterReturnsAll(t *testing.T) { + // Empty dmsgServerType string should return all servers without filtering. + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + + entries := []*disc.Entry{ + { + Static: pk1, + Server: &disc.Server{Address: "1.2.3.4:8080", AvailableSessions: 10, ServerType: "official"}, + }, + { + Static: pk2, + Server: &disc.Server{Address: "5.6.7.8:8080", AvailableSessions: 5, ServerType: "community"}, + }, + } + + srv := newDiscoveryMockServer(t, entries) + log := logging.MustGetLogger("test_no_filter") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + result := dmsghttp.GetServers(ctx, srv.URL, "", log) + require.Len(t, result, 2) +} + +// --- ListenAndServe tests --- + +func TestListenAndServe_ServesHTTP(t *testing.T) { + const maxSessions = 20 + const dmsgHTTPPort = uint16(8080) + + dc := disc.NewMock(0) + + // Start dmsg server. + srvPK, srvSK := cipher.GenerateKeyPair() + srvConf := dmsg.ServerConfig{MaxSessions: maxSessions, UpdateInterval: 0} + srv := dmsg.NewServer(srvPK, srvSK, dc, &srvConf, nil) + lis, err := nettest.NewLocalListener("tcp") + require.NoError(t, err) + go srv.Serve(lis, "") //nolint:errcheck,gosec + t.Cleanup(func() { srv.Close() }) //nolint:errcheck,gosec + <-srv.Ready() + + // Host client. + hostPK, hostSK := cipher.GenerateKeyPair() + dmsgHost := dmsg.NewClient(hostPK, hostSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgHost.Serve(context.Background()) + t.Cleanup(func() { dmsgHost.Close() }) //nolint:errcheck,gosec + <-dmsgHost.Ready() + + log := logging.MustGetLogger("test_listen_serve") + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte("listen-and-serve")) //nolint:errcheck,gosec + }) + + errCh := make(chan error, 1) + go func() { + errCh <- dmsghttp.ListenAndServe(ctx, hostSK, handler, dc, dmsgHTTPPort, dmsgHost, log) + }() + + // Give the server a moment to start. + time.Sleep(100 * time.Millisecond) + + // Dial from another client. + clientPK, clientSK := cipher.GenerateKeyPair() + dmsgClient := dmsg.NewClient(clientPK, clientSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgClient.Serve(context.Background()) + t.Cleanup(func() { dmsgClient.Close() }) //nolint:errcheck,gosec + <-dmsgClient.Ready() + + // Allow time for dmsg sessions to stabilize. + time.Sleep(300 * time.Millisecond) + + httpC := http.Client{ + Transport: dmsghttp.MakeHTTPTransport(ctx, dmsgClient), + Timeout: 10 * time.Second, + } + + resp, err := httpC.Get(fmt.Sprintf("http://%s:%d/", hostPK.String(), dmsgHTTPPort)) + require.NoError(t, err) + defer resp.Body.Close() //nolint:errcheck,gosec + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, "listen-and-serve", string(body)) + + // Cancel context to shut down the server. + cancel() +} + +func TestListenAndServe_InvalidPort(t *testing.T) { + // Trying to listen on a port that's already in use should fail. + const maxSessions = 20 + const dmsgHTTPPort = uint16(8081) + + dc := disc.NewMock(0) + + srvPK, srvSK := cipher.GenerateKeyPair() + srvConf := dmsg.ServerConfig{MaxSessions: maxSessions, UpdateInterval: 0} + srv := dmsg.NewServer(srvPK, srvSK, dc, &srvConf, nil) + lis, err := nettest.NewLocalListener("tcp") + require.NoError(t, err) + go srv.Serve(lis, "") //nolint:errcheck,gosec + t.Cleanup(func() { srv.Close() }) //nolint:errcheck,gosec + <-srv.Ready() + + hostPK, hostSK := cipher.GenerateKeyPair() + dmsgHost := dmsg.NewClient(hostPK, hostSK, dc, &dmsg.Config{MinSessions: 1}) + go dmsgHost.Serve(context.Background()) + t.Cleanup(func() { dmsgHost.Close() }) //nolint:errcheck,gosec + <-dmsgHost.Ready() + + log := logging.MustGetLogger("test_invalid_port") + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {}) + + // First listen should succeed. + _, err = dmsgHost.Listen(dmsgHTTPPort) + require.NoError(t, err) + + // Second listen on the same port should fail. + err = dmsghttp.ListenAndServe(ctx, hostSK, handler, dc, dmsgHTTPPort, dmsgHost, log) + assert.Error(t, err) + assert.Contains(t, err.Error(), "dmsg listen") +} diff --git a/pkg/dmsgpty/cli.go b/pkg/dmsgpty/cli.go index f1ad51b40..cfbb543dd 100644 --- a/pkg/dmsgpty/cli.go +++ b/pkg/dmsgpty/cli.go @@ -103,7 +103,7 @@ func (cli *CLI) prepareConn() (net.Conn, error) { conn, err := net.Dial(cli.Net, cli.Addr) if err != nil { - return nil, fmt.Errorf("failed to connect to dmsgpty-host: %v", err) + return nil, fmt.Errorf("failed to connect to dmsgpty-host: %w", err) } return conn, nil } @@ -121,7 +121,7 @@ func (cli *CLI) servePty(ctx context.Context, ptyC *PtyClient, cmd string, args env := cli.captureEnv() if err := ptyC.Start(cmd, env, args...); err != nil { - return fmt.Errorf("failed to start command on pty: %v", err) + return fmt.Errorf("failed to start command on pty: %w", err) } // Window resize loop. diff --git a/pkg/dmsgpty/host.go b/pkg/dmsgpty/host.go index b98813cc8..68040b659 100644 --- a/pkg/dmsgpty/host.go +++ b/pkg/dmsgpty/host.go @@ -237,11 +237,11 @@ func handleProxy(h *Host) handleFunc { // Get query values. var pk cipher.PubKey if err := pk.Set(q.Get("pk")); err != nil { - return fmt.Errorf("invalid query value 'pk': %v", err) + return fmt.Errorf("invalid query value 'pk': %w", err) } var port uint16 if _, err := fmt.Sscan(q.Get("port"), &port); err != nil { - return fmt.Errorf("invalid query value 'port': %v", err) + return fmt.Errorf("invalid query value 'port': %w", err) } // Proxy request. diff --git a/pkg/dmsgpty/term.html.gz b/pkg/dmsgpty/term.html.gz new file mode 100644 index 000000000..dec350ce5 Binary files /dev/null and b/pkg/dmsgpty/term.html.gz differ diff --git a/pkg/dmsgpty/ui.go b/pkg/dmsgpty/ui.go index 09741d070..02ead1bda 100644 --- a/pkg/dmsgpty/ui.go +++ b/pkg/dmsgpty/ui.go @@ -84,7 +84,7 @@ func (ui *UI) writeBanner(w io.Writer, uiAddr string, sID int32) error { ` var b bytes.Buffer if _, err := fmt.Fprintf(&b, format, ui.dialer.AddrString(), uiAddr, sID); err != nil { - panic(err) + return err } for { line, err := b.ReadBytes('\n') diff --git a/pkg/dmsgpty/ui_html.go b/pkg/dmsgpty/ui_html.go index 7231a1e18..c40ef0ffb 100644 --- a/pkg/dmsgpty/ui_html.go +++ b/pkg/dmsgpty/ui_html.go @@ -4,5732 +4,16 @@ package dmsgpty import ( "bytes" "compress/gzip" + _ "embed" "io" ) +//go:embed term.html.gz +var termHTMLGz []byte + // writeTermHTML returns raw, uncompressed file data. -// For modified this hex value, should make changes on term.html file on scripts folder, make gz compress, and -// get its hex value by some tools like http://tomeko.net/online_tools/file_to_hex.php func writeTermHTML(w io.Writer) (int64, error) { - gz, err := gzip.NewReader(bytes.NewBuffer([]byte{ - 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEC, 0xBD, 0xED, 0x7A, 0xDB, 0x38, - 0xD2, 0x20, 0xFA, 0x7B, 0xFB, 0x16, 0xCE, 0x1F, 0x9A, 0xDB, 0xAF, 0x96, 0x88, 0x21, 0x46, 0xF2, - 0x57, 0x12, 0x29, 0x8C, 0xD7, 0xB1, 0x9D, 0x6E, 0x6F, 0x3B, 0x71, 0x1E, 0xDB, 0x3D, 0x3D, 0xBD, - 0x1E, 0x3F, 0x0E, 0x2D, 0x42, 0x16, 0x27, 0x14, 0xA1, 0x21, 0x20, 0x7F, 0x8C, 0xC4, 0xBD, 0x96, - 0xBD, 0x96, 0xBD, 0xB2, 0xF3, 0xE0, 0x93, 0x20, 0x09, 0x52, 0x72, 0xD2, 0xB3, 0xF3, 0x9E, 0x33, - 0xD3, 0x3F, 0x3A, 0x16, 0x08, 0x14, 0x0A, 0x85, 0x42, 0xA1, 0x50, 0x28, 0x54, 0xBD, 0xDD, 0x88, - 0xF0, 0x88, 0x3E, 0xCD, 0x90, 0x33, 0xA1, 0xD3, 0xE4, 0xDD, 0x0F, 0x6F, 0xC5, 0x3F, 0x8E, 0xF3, - 0x76, 0x82, 0xC2, 0x88, 0xFD, 0xE1, 0x38, 0x6F, 0x69, 0x4C, 0x13, 0xF4, 0xEE, 0x12, 0x65, 0xD3, - 0x38, 0x0D, 0x93, 0xB7, 0x2F, 0xC5, 0xEF, 0x1F, 0xC4, 0xC7, 0x8D, 0x6E, 0x97, 0xFF, 0xE1, 0x38, - 0xDD, 0xAE, 0xB3, 0xF1, 0xFC, 0xFF, 0xFE, 0xA0, 0xC6, 0x97, 0x13, 0xE4, 0x3C, 0x52, 0x94, 0x4D, - 0x9D, 0x11, 0x8E, 0x90, 0x43, 0x68, 0x98, 0x51, 0xE2, 0x4C, 0x50, 0x86, 0x7C, 0x27, 0xC2, 0x4E, - 0x8A, 0x9D, 0x29, 0x8E, 0xE2, 0xF1, 0x93, 0x13, 0xC5, 0x19, 0x1A, 0xD1, 0xE4, 0x09, 0x16, 0x6D, - 0x43, 0xE2, 0xD0, 0x09, 0x72, 0xC8, 0x28, 0x8B, 0x67, 0xD4, 0xC9, 0xD0, 0x43, 0x16, 0x53, 0xC4, - 0xCA, 0x62, 0xE2, 0x10, 0x34, 0xA2, 0x31, 0x4E, 0x9D, 0x70, 0x4E, 0xF1, 0x34, 0xA4, 0xF1, 0x28, - 0x4C, 0x92, 0x27, 0xFF, 0x9F, 0x3C, 0xE2, 0x6E, 0xB7, 0xAB, 0xC8, 0x4F, 0xE8, 0x13, 0x9B, 0x0B, - 0x01, 0xF2, 0xE5, 0x0B, 0x87, 0x91, 0xA0, 0x3B, 0x22, 0xA4, 0xCB, 0x29, 0xE0, 0xBC, 0x78, 0xF9, - 0xC3, 0xCB, 0x17, 0x2F, 0x7E, 0x70, 0x5E, 0x38, 0x87, 0x78, 0xF6, 0x94, 0xC5, 0x77, 0x13, 0xEA, - 0x78, 0x23, 0xE0, 0x6C, 0xF5, 0xFA, 0x3B, 0x05, 0xCD, 0xFC, 0xBF, 0x12, 0x36, 0xC0, 0x09, 0xCE, - 0x88, 0xEF, 0x1C, 0x24, 0x89, 0xC3, 0x2B, 0x12, 0x27, 0x43, 0x04, 0x65, 0xF7, 0x28, 0xF2, 0xAD, - 0x00, 0xB6, 0xBA, 0x5B, 0xBD, 0xFE, 0x36, 0x74, 0x0E, 0x27, 0x59, 0x4C, 0x28, 0x9E, 0x4D, 0x50, - 0xE6, 0xFC, 0x0F, 0x34, 0x1E, 0x67, 0xE8, 0xC9, 0xF1, 0x3E, 0x9E, 0x5C, 0x3A, 0xA7, 0xF1, 0x08, - 0xA5, 0x04, 0x01, 0xD6, 0x7A, 0x42, 0xE9, 0x8C, 0x0C, 0x5E, 0xBE, 0xBC, 0x8B, 0xE9, 0x64, 0x7E, - 0xEB, 0x8F, 0xF0, 0xF4, 0xE5, 0x68, 0xF2, 0xD7, 0xBF, 0xBE, 0x94, 0xDD, 0xB3, 0x2A, 0xFF, 0x3D, - 0x11, 0xF5, 0x9D, 0x8F, 0x27, 0x97, 0x3F, 0x38, 0x1C, 0xE9, 0xCF, 0x8C, 0xE7, 0x08, 0x61, 0x13, - 0x10, 0x8B, 0xD9, 0xBC, 0x7D, 0x72, 0xEE, 0xB2, 0x30, 0xA5, 0x28, 0x82, 0xCE, 0x38, 0x43, 0xC8, - 0xC1, 0x63, 0x67, 0x34, 0x09, 0xB3, 0x3B, 0x04, 0x1D, 0x8A, 0x9D, 0x30, 0x7D, 0x72, 0x66, 0x28, - 0x23, 0x38, 0x75, 0xF0, 0x2D, 0x0D, 0xE3, 0x34, 0x4E, 0xEF, 0x9C, 0xD0, 0x19, 0xE1, 0xD9, 0x13, - 0x83, 0x87, 0xC7, 0x72, 0x56, 0xF1, 0x98, 0x3E, 0x84, 0x19, 0x72, 0xC2, 0x34, 0x72, 0x42, 0x42, - 0xF0, 0x28, 0x0E, 0x29, 0x8A, 0x9C, 0x08, 0x8F, 0xE6, 0x53, 0x94, 0xD2, 0x90, 0xCF, 0xF9, 0x38, - 0x4E, 0x10, 0x71, 0x3C, 0xC6, 0x1B, 0xEE, 0x85, 0x6C, 0xE1, 0x02, 0xDE, 0x4F, 0x84, 0xC2, 0x84, - 0x01, 0x8C, 0x53, 0xCE, 0x3A, 0xEA, 0xAB, 0xF3, 0x10, 0xD3, 0x09, 0x9E, 0x33, 0x26, 0x22, 0x34, - 0x8B, 0x39, 0xEB, 0x40, 0x27, 0x4E, 0x47, 0xC9, 0x3C, 0x62, 0x98, 0xA8, 0xCF, 0x49, 0x3C, 0x8D, - 0x65, 0x27, 0xAC, 0xB9, 0x20, 0x37, 0x83, 0x47, 0xB1, 0x33, 0x27, 0x08, 0x72, 0x84, 0xA1, 0x64, - 0x59, 0xE8, 0x4C, 0x11, 0x1F, 0xDF, 0x6C, 0x7E, 0x9B, 0xC4, 0x64, 0x02, 0x9D, 0x28, 0x66, 0xD0, - 0x6F, 0xE7, 0x14, 0x41, 0x87, 0xB0, 0x42, 0x4E, 0x37, 0xC8, 0x46, 0xF3, 0x12, 0x67, 0x0E, 0x41, - 0x09, 0x47, 0x6E, 0x84, 0x67, 0x31, 0x22, 0x62, 0xD0, 0x05, 0x8E, 0xBC, 0x1A, 0xEB, 0x68, 0xC6, - 0x88, 0x4B, 0x25, 0xB9, 0x08, 0x2B, 0x79, 0x98, 0xE0, 0x69, 0x79, 0x3C, 0x31, 0xC7, 0x6A, 0x3C, - 0xCF, 0xD2, 0x98, 0x4C, 0x10, 0x6F, 0x16, 0x61, 0x87, 0x60, 0xDE, 0xEF, 0x5F, 0xD1, 0x88, 0xB2, - 0x12, 0xD6, 0x62, 0x8C, 0x93, 0x04, 0x3F, 0xB0, 0x31, 0x8E, 0x70, 0x1A, 0xC5, 0x6C, 0x68, 0x64, - 0x20, 0x67, 0x91, 0xF1, 0x59, 0x78, 0x8B, 0xEF, 0x11, 0x1F, 0x96, 0xE0, 0xA1, 0x14, 0xD3, 0x78, - 0x24, 0xE8, 0xCF, 0x67, 0x64, 0x56, 0xCC, 0xB4, 0xFC, 0x44, 0x26, 0x61, 0x92, 0x38, 0xB7, 0x48, - 0x92, 0x0F, 0x45, 0x4E, 0x9C, 0x32, 0x68, 0xAC, 0x54, 0x8D, 0x2C, 0x63, 0x68, 0x10, 0x1A, 0xA6, - 0x34, 0x0E, 0x13, 0x67, 0x86, 0x33, 0xDE, 0x6F, 0x75, 0xC4, 0xBE, 0xC2, 0xE3, 0xE7, 0x63, 0xE7, - 0xE2, 0xEC, 0xC3, 0xE5, 0x6F, 0x07, 0xE7, 0xC7, 0xCE, 0xC9, 0x85, 0xF3, 0xF9, 0xFC, 0xEC, 0x4F, - 0x27, 0x47, 0xC7, 0x47, 0x8E, 0x7B, 0x70, 0xE1, 0x9C, 0x5C, 0xB8, 0xD0, 0xF9, 0xED, 0xE4, 0xF2, - 0xE7, 0xB3, 0x5F, 0x2F, 0x9D, 0xDF, 0x0E, 0xCE, 0xCF, 0x0F, 0x3E, 0x5D, 0xFE, 0xEE, 0x9C, 0x7D, - 0x70, 0x0E, 0x3E, 0xFD, 0xEE, 0xFC, 0x72, 0xF2, 0xE9, 0x08, 0x3A, 0xC7, 0x7F, 0xFE, 0x7C, 0x7E, - 0x7C, 0x71, 0xE1, 0x9C, 0x9D, 0x33, 0x68, 0x27, 0x1F, 0x3F, 0x9F, 0x9E, 0x1C, 0x1F, 0x41, 0xE7, - 0xE4, 0xD3, 0xE1, 0xE9, 0xAF, 0x47, 0x27, 0x9F, 0x7E, 0x72, 0xDE, 0xFF, 0x7A, 0xE9, 0x7C, 0x3A, - 0xBB, 0x74, 0x4E, 0x4F, 0x3E, 0x9E, 0x5C, 0x1E, 0x1F, 0x39, 0x97, 0x67, 0xBC, 0x4F, 0x09, 0xED, - 0xE4, 0xF8, 0x82, 0xC1, 0xFB, 0x78, 0x7C, 0x7E, 0xF8, 0xF3, 0xC1, 0xA7, 0xCB, 0x83, 0xF7, 0x27, - 0xA7, 0x27, 0x97, 0xBF, 0x43, 0x06, 0xEB, 0xC3, 0xC9, 0xE5, 0x27, 0x06, 0xF9, 0xC3, 0xD9, 0xB9, - 0x73, 0xE0, 0x7C, 0x3E, 0x38, 0xBF, 0x3C, 0x39, 0xFC, 0xF5, 0xF4, 0xE0, 0xDC, 0xF9, 0xFC, 0xEB, - 0xF9, 0xE7, 0xB3, 0x8B, 0x63, 0xE7, 0xE0, 0xD3, 0x91, 0xF3, 0xE9, 0xEC, 0xD3, 0xC9, 0xA7, 0x0F, - 0xE7, 0x27, 0x9F, 0x7E, 0x3A, 0xFE, 0x78, 0xFC, 0xE9, 0xD2, 0x77, 0x4E, 0x3E, 0x39, 0x9F, 0xCE, - 0x9C, 0xE3, 0x3F, 0x1D, 0x7F, 0xBA, 0x74, 0x2E, 0x7E, 0x3E, 0x38, 0x3D, 0x65, 0xBD, 0x31, 0x70, - 0x07, 0xBF, 0x5E, 0xFE, 0x7C, 0x76, 0xCE, 0x10, 0x75, 0x0E, 0xCF, 0x3E, 0xFF, 0x7E, 0x7E, 0xF2, - 0xD3, 0xCF, 0x97, 0xCE, 0xCF, 0x67, 0xA7, 0x47, 0xC7, 0xE7, 0x17, 0xCE, 0xFB, 0x63, 0xE7, 0xF4, - 0xE4, 0xE0, 0xFD, 0xE9, 0xB1, 0xE8, 0xED, 0xD3, 0xEF, 0xCE, 0xE1, 0xE9, 0xC1, 0xC9, 0x47, 0xE8, - 0x1C, 0x1D, 0x7C, 0x3C, 0xF8, 0xE9, 0x98, 0xB7, 0x3A, 0xBB, 0xFC, 0xF9, 0x98, 0x0F, 0x92, 0xD5, - 0x14, 0x68, 0x3A, 0xBF, 0xFD, 0x7C, 0xCC, 0x4A, 0x59, 0xAF, 0x07, 0x9F, 0x9C, 0x83, 0xC3, 0xCB, - 0x93, 0xB3, 0x4F, 0x6C, 0x3C, 0x87, 0x67, 0x9F, 0x2E, 0xCF, 0x0F, 0x0E, 0x2F, 0xA1, 0x73, 0x79, - 0x76, 0x7E, 0xA9, 0x5B, 0xFF, 0x76, 0x72, 0x71, 0x0C, 0x9D, 0x83, 0xF3, 0x93, 0x0B, 0x46, 0x99, - 0x0F, 0xE7, 0x67, 0x1F, 0xF9, 0x48, 0x19, 0x75, 0xCF, 0x3E, 0xB0, 0x5A, 0x27, 0x9F, 0x58, 0xD3, - 0x4F, 0xC7, 0x02, 0x10, 0xA3, 0x7C, 0x79, 0x82, 0xCE, 0xCE, 0xF9, 0xEF, 0x5F, 0x2F, 0x8E, 0x35, - 0x4C, 0xE7, 0xE8, 0xF8, 0xE0, 0xF4, 0xE4, 0xD3, 0x4F, 0x17, 0xCE, 0xC9, 0xA7, 0xEA, 0x84, 0xAA, - 0x49, 0x3E, 0xCB, 0xE2, 0x3B, 0xB6, 0x4D, 0x25, 0x4F, 0xCE, 0x18, 0x67, 0x5F, 0x51, 0xE4, 0x8C, - 0x33, 0x3C, 0x75, 0x3C, 0xB6, 0xF4, 0x38, 0x57, 0x08, 0x41, 0xF7, 0xDF, 0x4C, 0x96, 0x03, 0x8C, - 0x53, 0x1D, 0xC7, 0xF9, 0x10, 0xDE, 0x66, 0x8C, 0xF5, 0xDE, 0xA3, 0x24, 0x09, 0xB3, 0xE8, 0xBF, - 0x11, 0xE7, 0xAF, 0xE1, 0x7D, 0x28, 0xF7, 0x85, 0x7B, 0xDA, 0xEF, 0xF5, 0x18, 0x4C, 0xE7, 0xAF, - 0x24, 0x89, 0xD3, 0xF9, 0xA3, 0x6C, 0xC4, 0x24, 0xDB, 0xE0, 0xE5, 0xCB, 0x5B, 0xD1, 0xC6, 0xC7, - 0xD9, 0xDD, 0x4B, 0x59, 0xE1, 0xA5, 0xA8, 0x50, 0x13, 0x9C, 0xFD, 0x6A, 0x47, 0xA2, 0x1E, 0x5B, - 0x26, 0x58, 0x62, 0xEF, 0x44, 0x88, 0xC4, 0x77, 0xA9, 0x93, 0xA1, 0x69, 0x18, 0xA7, 0xC4, 0xE7, - 0x1F, 0xA9, 0xDC, 0x81, 0x9D, 0x98, 0x12, 0x94, 0x8C, 0x65, 0xF7, 0x21, 0x71, 0x6E, 0x11, 0x4A, - 0x1D, 0xF4, 0x48, 0x51, 0x1A, 0x89, 0x35, 0x2A, 0x97, 0x8C, 0xDC, 0x11, 0x0F, 0x2F, 0x4E, 0xF8, - 0xAE, 0x48, 0xA0, 0x13, 0x4E, 0x71, 0x7A, 0x27, 0x1A, 0x62, 0xCA, 0x04, 0xF6, 0x18, 0x85, 0x74, - 0x9E, 0x21, 0xC2, 0xC8, 0xF7, 0xF2, 0x07, 0xB5, 0x59, 0x38, 0x47, 0x68, 0x1C, 0xCE, 0x13, 0xEA, - 0xF0, 0xED, 0x85, 0xF0, 0x51, 0x3F, 0x16, 0xA2, 0xFA, 0xE5, 0x0F, 0x3F, 0xF8, 0x02, 0xF4, 0x82, - 0xEF, 0x3C, 0xA3, 0x79, 0x46, 0x70, 0x36, 0x70, 0x28, 0x7A, 0xA4, 0x43, 0x5E, 0x32, 0xC3, 0x84, - 0xCB, 0x80, 0x81, 0x93, 0xA1, 0x24, 0xA4, 0xF1, 0x3D, 0x12, 0xE5, 0x73, 0x82, 0xB2, 0x2E, 0x41, - 0x09, 0x1A, 0xD1, 0x81, 0x93, 0xE2, 0x54, 0x16, 0x77, 0xA7, 0xA4, 0xDB, 0xF4, 0xE9, 0x01, 0xDD, - 0x7E, 0x8D, 0xA9, 0xED, 0x73, 0xAE, 0xD0, 0xF0, 0xC7, 0x78, 0x34, 0x27, 0x50, 0xFE, 0x1A, 0xF0, - 0x5F, 0x12, 0x35, 0x3C, 0xA7, 0x49, 0x9C, 0xA2, 0x5A, 0x13, 0x47, 0xFC, 0xD3, 0x9D, 0xA0, 0x84, - 0x09, 0x40, 0x59, 0xBB, 0x40, 0x3B, 0xBC, 0x25, 0x38, 0x99, 0x53, 0x89, 0x04, 0xC5, 0xB3, 0x81, - 0xD3, 0x13, 0x7F, 0x73, 0x12, 0xB1, 0xFF, 0x84, 0x60, 0xFB, 0x7B, 0x37, 0x4E, 0x23, 0xF4, 0xA8, - 0x64, 0x8E, 0x82, 0x37, 0x9D, 0x13, 0xCA, 0x84, 0xD7, 0x24, 0xBE, 0x63, 0x64, 0xA6, 0x93, 0x50, - 0x88, 0xFA, 0x51, 0x98, 0xDE, 0x87, 0x04, 0x11, 0xB6, 0x73, 0xE0, 0x2C, 0x62, 0x33, 0x80, 0x33, - 0x05, 0xEF, 0xE4, 0xE3, 0x31, 0x97, 0xC3, 0xE1, 0x6C, 0x86, 0xC2, 0xCC, 0x61, 0xBB, 0x03, 0x9E, - 0x49, 0x65, 0xE3, 0xC5, 0x4B, 0xFE, 0xAF, 0xEC, 0x6E, 0xE0, 0xEC, 0x36, 0x0E, 0xA6, 0xCB, 0xA6, - 0x21, 0xCC, 0x50, 0xA8, 0x06, 0x15, 0x46, 0x6C, 0xF3, 0xD1, 0x03, 0xB8, 0xE5, 0xFD, 0xEA, 0x9F, - 0xD3, 0x30, 0xBB, 0x8B, 0x53, 0x63, 0x78, 0xCE, 0x47, 0x26, 0xAA, 0x35, 0x10, 0xB6, 0x5F, 0xC9, - 0xC1, 0x91, 0x51, 0xC6, 0x38, 0x4D, 0x89, 0xFC, 0x30, 0x73, 0x12, 0x34, 0xA6, 0xD0, 0x21, 0xAC, - 0x20, 0xA4, 0x62, 0x80, 0x9C, 0x17, 0xD8, 0x76, 0x9D, 0x62, 0xEA, 0xDC, 0xC7, 0x24, 0xBE, 0x4D, - 0x90, 0xC2, 0xBE, 0x89, 0xBE, 0x78, 0x16, 0x8E, 0x62, 0xFA, 0xA4, 0x91, 0x60, 0x60, 0x07, 0x4E, - 0xF7, 0xCD, 0x9B, 0x37, 0x6F, 0xD0, 0xB4, 0x3E, 0x05, 0x0F, 0x71, 0x44, 0x27, 0xFA, 0xD7, 0x04, - 0xB1, 0xC5, 0xA5, 0x7F, 0x6A, 0x0A, 0x75, 0x77, 0xF5, 0x84, 0x39, 0x9F, 0x33, 0x74, 0x8F, 0x52, - 0xEA, 0x3C, 0x64, 0xE1, 0x6C, 0xC6, 0x76, 0x29, 0x22, 0xC6, 0x70, 0xF2, 0xF1, 0x58, 0x52, 0x9B, - 0x38, 0xE1, 0x1D, 0x5B, 0x6A, 0x62, 0x14, 0x7A, 0xF4, 0x6A, 0x54, 0x38, 0x63, 0x6A, 0xA3, 0x1E, - 0x80, 0x1A, 0xD0, 0xC3, 0x24, 0xA6, 0xA8, 0x4B, 0x66, 0xE1, 0x88, 0xB3, 0x18, 0x03, 0x2F, 0x47, - 0x74, 0x8F, 0xB2, 0x71, 0x82, 0x1F, 0x06, 0xCE, 0x24, 0x8E, 0x22, 0x94, 0x8A, 0xD2, 0x0C, 0x91, - 0xF8, 0xEF, 0x36, 0x66, 0x1C, 0xE1, 0xA9, 0x02, 0xDD, 0xBD, 0x8F, 0xD1, 0x83, 0x9C, 0xBA, 0x97, - 0x2F, 0x9C, 0xCB, 0xB3, 0xA3, 0xB3, 0x81, 0x73, 0x58, 0x7C, 0x2F, 0x70, 0xB8, 0xC3, 0xD4, 0x99, - 0x22, 0x42, 0x50, 0xE4, 0xCC, 0x67, 0x0E, 0xC1, 0x53, 0xF4, 0xC0, 0x54, 0x24, 0x85, 0xDB, 0x6D, - 0x38, 0xFA, 0x7A, 0x97, 0xE1, 0x79, 0x1A, 0x0D, 0x9C, 0xFF, 0xDA, 0xEB, 0x49, 0xF2, 0x8C, 0x70, - 0xC2, 0x96, 0xEA, 0x7F, 0xFD, 0xF0, 0xE1, 0x83, 0x28, 0x88, 0x62, 0x32, 0x4B, 0xC2, 0x27, 0x73, - 0xCD, 0x35, 0x4D, 0x53, 0xE3, 0x68, 0x35, 0xCD, 0xFB, 0xAD, 0xA3, 0xF2, 0xC3, 0x11, 0x13, 0x05, - 0x72, 0x70, 0xBA, 0xE3, 0xDB, 0x04, 0x8F, 0xBE, 0x5A, 0xD8, 0x99, 0x35, 0x61, 0x7B, 0x7A, 0x41, - 0x8C, 0xB3, 0xD4, 0x39, 0xBB, 0x70, 0xFE, 0x2C, 0x54, 0x86, 0x98, 0x29, 0xA8, 0x7F, 0x9B, 0xC7, - 0x19, 0x57, 0x0D, 0x8A, 0xD5, 0xA4, 0x58, 0x15, 0x33, 0xF5, 0x21, 0xCC, 0x8C, 0x05, 0x35, 0x9E, - 0xB3, 0x6D, 0x01, 0xCF, 0xC2, 0xBF, 0xCD, 0x2D, 0x54, 0xEA, 0x2A, 0xD2, 0x68, 0x5A, 0xA9, 0x49, - 0xEC, 0x3E, 0x0D, 0x24, 0xC0, 0x61, 0x49, 0xDE, 0x45, 0x42, 0x4A, 0xB6, 0x13, 0x2D, 0x2B, 0x71, - 0xA7, 0xE0, 0xEC, 0x5E, 0x9D, 0xA7, 0x6F, 0x31, 0xA5, 0x78, 0xCA, 0x7F, 0xD6, 0x08, 0x21, 0xD7, - 0x5D, 0x55, 0x46, 0x15, 0xA2, 0xB5, 0xA9, 0x85, 0x90, 0x36, 0x2B, 0x84, 0x9B, 0x15, 0x25, 0x1B, - 0x44, 0x9C, 0x24, 0x5D, 0x43, 0xAE, 0xF0, 0xB5, 0x1D, 0x27, 0x7C, 0xDD, 0x2A, 0x26, 0xD7, 0xCD, - 0xBA, 0x4C, 0x29, 0xEF, 0x4E, 0x51, 0x48, 0xE6, 0x19, 0xEA, 0xA2, 0x04, 0x31, 0xB5, 0xBA, 0x3A, - 0xF1, 0x71, 0xCA, 0x64, 0x73, 0x57, 0xCE, 0x7F, 0x13, 0xCC, 0x75, 0x05, 0xB3, 0x45, 0x68, 0x70, - 0xF0, 0x4A, 0x3E, 0xA4, 0x38, 0x9B, 0x86, 0x89, 0xB9, 0x6D, 0xA0, 0x34, 0xBC, 0x4D, 0x50, 0x77, - 0x8A, 0xE7, 0x04, 0x75, 0xB9, 0x80, 0x20, 0x05, 0xAF, 0xFD, 0x36, 0x41, 0xA9, 0xC3, 0x3F, 0x39, - 0xF2, 0x13, 0x53, 0x88, 0x45, 0x93, 0xC8, 0xF1, 0xD0, 0x9D, 0xEF, 0xD0, 0xE9, 0xFC, 0x11, 0x40, - 0x87, 0xC9, 0x96, 0x4C, 0x6B, 0xC2, 0x4C, 0x1D, 0x8D, 0xC2, 0x2C, 0x72, 0x66, 0x38, 0x4E, 0x29, - 0xCA, 0x94, 0x44, 0x94, 0xFC, 0x56, 0xE3, 0x9D, 0x02, 0x1D, 0x49, 0x38, 0x5E, 0xA1, 0x2B, 0x5B, - 0xC3, 0xCA, 0x34, 0x94, 0xBF, 0x56, 0xF6, 0x5F, 0x59, 0x6A, 0xC2, 0x1C, 0xE1, 0x64, 0x3E, 0x4D, - 0xE5, 0xC6, 0xE9, 0x9B, 0x3B, 0xE3, 0x4B, 0x76, 0xA4, 0x63, 0x1F, 0x1D, 0xF1, 0x91, 0x49, 0x94, - 0x29, 0x3B, 0x3B, 0x57, 0x10, 0x1D, 0x65, 0x98, 0x90, 0x49, 0x18, 0x67, 0x16, 0xA6, 0x08, 0x47, - 0x23, 0x44, 0xD4, 0x8C, 0x55, 0x51, 0x65, 0xA2, 0x29, 0xBC, 0x43, 0xDF, 0xC2, 0x7D, 0x95, 0x05, - 0x51, 0x16, 0x31, 0x65, 0x41, 0x46, 0xB3, 0x30, 0x25, 0xB3, 0x30, 0x43, 0x29, 0x2D, 0x21, 0x98, - 0xC4, 0xF7, 0xA8, 0x9B, 0xA1, 0x3B, 0x36, 0xAC, 0x75, 0x30, 0xE0, 0x7C, 0x33, 0x7B, 0x2C, 0x6D, - 0x30, 0x7D, 0xF5, 0x5B, 0xB1, 0x90, 0x2E, 0xA8, 0x8B, 0xF7, 0x82, 0xF3, 0xA3, 0x58, 0xE9, 0x45, - 0xC5, 0xB6, 0xE6, 0x9B, 0xDB, 0x75, 0x77, 0x9E, 0x46, 0x28, 0xE3, 0xBC, 0xD9, 0x77, 0x16, 0x7C, - 0xAF, 0xE9, 0x46, 0x68, 0x84, 0xB3, 0x50, 0xA0, 0xA7, 0x3F, 0x0F, 0x9D, 0xBC, 0xDE, 0x64, 0xCB, - 0xD6, 0x24, 0xC2, 0x73, 0xB6, 0xCD, 0xB6, 0xB7, 0xDC, 0xB6, 0xB5, 0x7C, 0x08, 0xEF, 0x9F, 0x56, - 0xB4, 0xDB, 0xB1, 0xF7, 0x48, 0xD9, 0x89, 0xB9, 0xBD, 0xE5, 0xAE, 0xB5, 0x65, 0xC8, 0x8F, 0x92, - 0xA5, 0x96, 0xAA, 0x29, 0x3B, 0xD7, 0x7E, 0x45, 0x74, 0x92, 0xE1, 0xF9, 0xDD, 0x44, 0x52, 0xB1, - 0x06, 0x80, 0x83, 0x96, 0x75, 0x4C, 0xB2, 0x4A, 0xA1, 0xA7, 0xA6, 0x41, 0xB7, 0xE8, 0x8E, 0x70, - 0x4A, 0xC3, 0x38, 0x45, 0x59, 0xFD, 0x9B, 0xB3, 0xF8, 0xE1, 0xBF, 0x68, 0xD6, 0xDA, 0x1B, 0xFE, - 0xF0, 0x5F, 0x6C, 0x5C, 0x62, 0xCC, 0x6D, 0x01, 0x94, 0xB1, 0x00, 0xDB, 0xA1, 0xBA, 0xD9, 0x3C, - 0xD1, 0x2B, 0x51, 0x83, 0x7A, 0xB5, 0xBE, 0xDC, 0x2A, 0x6F, 0x10, 0x72, 0x0D, 0x4B, 0x71, 0x54, - 0x53, 0x15, 0x4C, 0x0C, 0x28, 0x9E, 0x55, 0xBB, 0xDD, 0x6A, 0x56, 0xBF, 0xF3, 0x1F, 0x7E, 0xA8, - 0xDA, 0x88, 0x50, 0x1A, 0xA9, 0xD5, 0xFE, 0xF6, 0xA5, 0xB0, 0x24, 0x09, 0x43, 0x92, 0xB4, 0x2D, - 0xF1, 0x83, 0x4F, 0xD5, 0xB8, 0xF4, 0x57, 0xC3, 0xB6, 0xB4, 0x31, 0x9E, 0xA7, 0x5C, 0x72, 0x78, - 0x08, 0x52, 0xB0, 0x88, 0xC7, 0x9E, 0x8B, 0xB9, 0x59, 0xC0, 0x0D, 0x02, 0xFA, 0x34, 0x43, 0x78, - 0xEC, 0xA0, 0x47, 0xB6, 0x85, 0x93, 0x4E, 0xA7, 0xF6, 0x65, 0x8A, 0xA3, 0x79, 0x82, 0x80, 0xF8, - 0xC7, 0x97, 0xF5, 0x02, 0xEA, 0x81, 0x21, 0x4A, 0x08, 0x72, 0x18, 0x30, 0x05, 0xBE, 0x68, 0x14, - 0xA1, 0x71, 0x9C, 0xA2, 0x4E, 0x47, 0xFC, 0xEB, 0x87, 0xD3, 0x08, 0x88, 0x3F, 0xBD, 0xAB, 0x6B, - 0x48, 0x45, 0xD3, 0xC5, 0x7D, 0x98, 0x39, 0x31, 0x87, 0x34, 0xC6, 0x99, 0xC7, 0x7E, 0x71, 0x7D, - 0x3B, 0x06, 0x8D, 0xE8, 0xED, 0xCB, 0x7F, 0x07, 0x08, 0x5C, 0x91, 0xEB, 0x20, 0xBE, 0x22, 0xD7, - 0x79, 0xEE, 0xB1, 0x53, 0x16, 0xF4, 0xF4, 0x18, 0xC1, 0x22, 0x43, 0x74, 0x9E, 0xA5, 0x9E, 0x07, - 0x82, 0x77, 0x0B, 0x97, 0xED, 0x0C, 0xC2, 0xCA, 0xE3, 0x0E, 0x59, 0x1F, 0x28, 0x58, 0xEC, 0xEC, - 0xEE, 0xBD, 0x1A, 0x30, 0x5A, 0xC0, 0x98, 0x55, 0x39, 0xE3, 0x9D, 0xF9, 0x02, 0xC1, 0xCF, 0x19, - 0x9E, 0xA1, 0x8C, 0x3E, 0x79, 0x14, 0xBA, 0x37, 0x37, 0x88, 0x7C, 0xE4, 0xE3, 0x76, 0xE1, 0xE2, - 0x3E, 0x4C, 0xE6, 0x68, 0xB0, 0xD1, 0xCB, 0x01, 0xA4, 0xFE, 0x81, 0x29, 0x51, 0x3F, 0x86, 0x69, - 0x78, 0x87, 0xB2, 0xE0, 0x1E, 0xC7, 0x91, 0xD3, 0x1B, 0x8E, 0x30, 0x53, 0x4F, 0x49, 0x10, 0x7B, - 0x6F, 0x7A, 0x3B, 0x5B, 0x00, 0x66, 0x41, 0xEC, 0xED, 0xF5, 0xFB, 0x3B, 0x00, 0xA6, 0xAC, 0xEC, - 0xCD, 0xD6, 0x0E, 0x80, 0x38, 0x88, 0xBD, 0xED, 0xBD, 0xDD, 0x3D, 0x00, 0xC3, 0x20, 0xF6, 0x5E, - 0xEF, 0xEC, 0x00, 0x38, 0x09, 0x62, 0x6F, 0x77, 0xF7, 0xCD, 0x1E, 0x80, 0x23, 0x56, 0x6D, 0x6F, - 0xBB, 0x0F, 0x86, 0xA3, 0x24, 0x24, 0xC4, 0x49, 0xE4, 0xA1, 0x91, 0x38, 0xA1, 0x7F, 0x14, 0x93, - 0x19, 0x26, 0x6C, 0x73, 0x5B, 0xF0, 0x7E, 0xB2, 0xF9, 0x88, 0xE2, 0x4C, 0xCC, 0x2B, 0x99, 0xCF, - 0x50, 0xE6, 0x01, 0xC8, 0xD4, 0x2E, 0xFF, 0x46, 0x1D, 0x43, 0x03, 0x24, 0x0B, 0x32, 0x76, 0xEE, - 0xCC, 0x2E, 0xD8, 0x72, 0x18, 0xA1, 0x80, 0xCA, 0x52, 0x26, 0x80, 0xCF, 0xB9, 0xFC, 0x3D, 0x8D, - 0x53, 0x74, 0x88, 0xE7, 0x29, 0x0D, 0x7A, 0xF2, 0x1B, 0x53, 0x0E, 0xC8, 0x25, 0x3E, 0xC4, 0x29, - 0x99, 0x4F, 0x51, 0xC0, 0xA6, 0xCE, 0x2C, 0x3F, 0x48, 0x53, 0x3C, 0x4F, 0x47, 0x28, 0x70, 0x5D, - 0xF9, 0xA1, 0xB4, 0xD1, 0x5C, 0x66, 0x08, 0x9D, 0x63, 0x4C, 0x03, 0x65, 0xAE, 0xF3, 0x47, 0x19, - 0x0A, 0x29, 0x3A, 0x16, 0x5A, 0x86, 0xE7, 0x46, 0xF1, 0xBD, 0x0B, 0xDA, 0x5A, 0xFA, 0x7C, 0xFC, - 0xA7, 0x31, 0xA1, 0x7E, 0x18, 0x45, 0x9E, 0x6B, 0xD9, 0xCD, 0x56, 0x00, 0xA0, 0xE1, 0xED, 0x09, - 0x5B, 0x72, 0x7A, 0x48, 0x19, 0x7E, 0x38, 0x54, 0x62, 0x66, 0x2D, 0xC4, 0xCC, 0x06, 0x3E, 0x41, - 0xF4, 0x80, 0x4A, 0x9B, 0x9E, 0xE7, 0x66, 0x98, 0x31, 0x86, 0x9B, 0xC4, 0x84, 0xDA, 0xAB, 0xAF, - 0x46, 0xBF, 0x4B, 0x33, 0x84, 0xCC, 0xC6, 0x12, 0x07, 0x12, 0x5C, 0x5D, 0xF3, 0x55, 0x91, 0x20, - 0xEA, 0xA0, 0xA0, 0x37, 0x44, 0x6F, 0xCB, 0xB3, 0xEA, 0x67, 0xF8, 0x81, 0x0C, 0xD1, 0xE6, 0x26, - 0xA8, 0x35, 0xBD, 0x42, 0xD7, 0x81, 0x9C, 0x27, 0x3E, 0xAC, 0x83, 0x2A, 0x65, 0x3E, 0xE1, 0x08, - 0x79, 0x56, 0x84, 0x99, 0x02, 0x9E, 0x46, 0x87, 0x93, 0x38, 0x89, 0x3C, 0x1B, 0x5C, 0x30, 0x8C, - 0xC7, 0xF2, 0x03, 0xC5, 0xB3, 0xF7, 0x4C, 0x1D, 0x0F, 0xB3, 0xA7, 0x0F, 0x4C, 0x5D, 0x61, 0xC3, - 0x44, 0x8C, 0xA8, 0x28, 0x78, 0x27, 0x6A, 0x4C, 0xC2, 0x34, 0x4A, 0x50, 0xA9, 0x92, 0x87, 0x60, - 0x4F, 0x75, 0x2C, 0x14, 0x87, 0x6F, 0x82, 0xD1, 0xB7, 0x10, 0xEC, 0xAA, 0x77, 0xCD, 0xA8, 0x7C, - 0xCC, 0xE4, 0xB1, 0x82, 0xE3, 0xB9, 0x5C, 0x93, 0x52, 0xDC, 0xD9, 0x84, 0xB2, 0x0D, 0x5A, 0xAD, - 0xC4, 0x4F, 0x50, 0x7A, 0x47, 0x27, 0xDD, 0xFE, 0xCA, 0x6E, 0x5A, 0x06, 0xA6, 0x7B, 0x42, 0xE3, - 0x0C, 0x91, 0xC9, 0x39, 0x7E, 0x20, 0x47, 0xF1, 0x14, 0xA5, 0x24, 0xC6, 0x29, 0xF1, 0xDA, 0x59, - 0xD9, 0x3A, 0x37, 0x7A, 0xEA, 0x40, 0x69, 0x91, 0x73, 0xC0, 0xE8, 0x96, 0xAF, 0xCE, 0x2C, 0x48, - 0xD1, 0x83, 0x93, 0xFA, 0x97, 0xF1, 0x14, 0xBD, 0x0F, 0x09, 0x8A, 0xF4, 0x07, 0xAF, 0xDA, 0xC4, - 0xBF, 0x8D, 0x53, 0x01, 0x1C, 0x58, 0x30, 0xD5, 0xF8, 0x15, 0x22, 0x63, 0xAD, 0x15, 0x54, 0x54, - 0xAF, 0x2E, 0x08, 0x43, 0xF9, 0xB3, 0xD5, 0x2E, 0xAF, 0xB6, 0x30, 0x8B, 0xC3, 0x2E, 0xFB, 0xEA, - 0x42, 0x37, 0x24, 0x04, 0x65, 0x6C, 0xBF, 0x5C, 0xB1, 0xFC, 0xEB, 0x34, 0x2B, 0xC0, 0x03, 0xB8, - 0x51, 0x59, 0x52, 0xF2, 0xF8, 0x03, 0x98, 0xCE, 0xF2, 0xE0, 0x30, 0xAA, 0x1D, 0x67, 0x19, 0xCE, - 0x3C, 0xF7, 0x30, 0x4C, 0x53, 0x4C, 0xE5, 0xA1, 0xC2, 0x29, 0x75, 0xE5, 0xDC, 0xA2, 0x31, 0xCE, - 0x90, 0xA3, 0xAE, 0xDD, 0x7C, 0x3C, 0x43, 0xA9, 0x0B, 0x86, 0x76, 0xD0, 0x7E, 0x9C, 0x32, 0xC4, - 0x0F, 0xA2, 0xBF, 0x86, 0x23, 0x94, 0x52, 0x4D, 0xAE, 0x70, 0x4C, 0x51, 0x76, 0x8B, 0xEE, 0xE2, - 0xB4, 0x55, 0x92, 0xCA, 0xC1, 0x32, 0x8A, 0x11, 0x6A, 0x99, 0x3F, 0x3D, 0xB3, 0xF6, 0x8A, 0x1A, - 0x1B, 0x9C, 0x9E, 0x73, 0x0B, 0x87, 0xE7, 0x55, 0x16, 0x9A, 0x2C, 0x46, 0x5C, 0xBA, 0x00, 0x00, - 0xD6, 0x80, 0xC3, 0xFA, 0x36, 0xE0, 0x98, 0xFC, 0x82, 0x7C, 0xAE, 0x81, 0x40, 0xE4, 0xA3, 0x34, - 0x5A, 0x07, 0xDA, 0x05, 0x3F, 0xBC, 0x7A, 0x7C, 0xE3, 0xB6, 0xB0, 0xDF, 0x1A, 0x10, 0x0E, 0xFA, - 0xFD, 0xA7, 0xC3, 0x49, 0x98, 0xD5, 0x46, 0xC6, 0x0B, 0xD1, 0x3A, 0x20, 0xD8, 0x36, 0xF8, 0x01, - 0xA1, 0xC8, 0x44, 0xC3, 0x80, 0xE1, 0xFE, 0x25, 0x75, 0xD7, 0xC5, 0xE4, 0x32, 0xBC, 0xAD, 0x21, - 0xC2, 0xCA, 0xD6, 0xC2, 0xE3, 0x17, 0xF4, 0x54, 0x6B, 0xCC, 0xCA, 0x90, 0xFF, 0x15, 0x3D, 0xAD, - 0x03, 0xE0, 0x7D, 0x32, 0xCF, 0xCC, 0x41, 0x8C, 0x12, 0x14, 0x66, 0xA7, 0x9A, 0xFF, 0x9B, 0xE9, - 0x59, 0x52, 0x14, 0x7C, 0x9C, 0x16, 0x22, 0xEA, 0x70, 0x12, 0xA6, 0x77, 0xA8, 0x61, 0x82, 0x4C, - 0x49, 0xA6, 0x41, 0xDF, 0x08, 0x6D, 0xFF, 0x68, 0x96, 0x7D, 0xC4, 0x69, 0x4C, 0xB1, 0x90, 0x46, - 0x13, 0xFF, 0xA2, 0x52, 0xEC, 0x3D, 0xC4, 0x69, 0x84, 0x1F, 0xEC, 0x08, 0x55, 0x61, 0x34, 0xC1, - 0x66, 0x12, 0x43, 0x0B, 0xE5, 0x75, 0x90, 0xAC, 0xF4, 0xE6, 0xF5, 0x20, 0x66, 0x92, 0xA9, 0x50, - 0xB2, 0x8E, 0xF0, 0x54, 0xCB, 0x6E, 0x89, 0x22, 0x74, 0x85, 0x79, 0xD0, 0x85, 0xCF, 0x20, 0x83, - 0xD9, 0x45, 0xE8, 0x53, 0x5C, 0xF4, 0x00, 0x04, 0xA2, 0x0B, 0xAF, 0x07, 0x47, 0x7E, 0x86, 0xA6, - 0xF8, 0x5E, 0x49, 0xD1, 0x0F, 0x19, 0x9E, 0x7E, 0xE6, 0x27, 0x66, 0xE0, 0xAD, 0x16, 0x0A, 0x96, - 0xBD, 0x2A, 0xE8, 0xE5, 0x00, 0x80, 0xBC, 0x61, 0x13, 0xA5, 0x40, 0x68, 0x90, 0x4E, 0x1C, 0x20, - 0x9F, 0x86, 0xD9, 0x1D, 0xA2, 0x90, 0x04, 0x96, 0x7D, 0x35, 0x08, 0x02, 0xBA, 0xDF, 0x1F, 0x34, - 0xEE, 0x88, 0x5B, 0xD7, 0x4C, 0x2B, 0x88, 0xFD, 0xBB, 0xBA, 0xB8, 0x66, 0x07, 0x9C, 0x94, 0x20, - 0xEA, 0x82, 0x20, 0x08, 0x3C, 0x01, 0xC9, 0xED, 0xBB, 0x83, 0x2F, 0x3F, 0x2E, 0x2A, 0xEC, 0x7A, - 0x3B, 0x1F, 0x8F, 0x51, 0xE6, 0xB3, 0x33, 0xA3, 0x02, 0x9C, 0x7F, 0x01, 0x40, 0x68, 0xF2, 0x0C, - 0x3E, 0xF2, 0xF9, 0x19, 0x09, 0x45, 0x97, 0x1C, 0xD5, 0x8D, 0x20, 0x20, 0xEA, 0x2B, 0xD3, 0x91, - 0x32, 0xC8, 0x6B, 0x89, 0x2E, 0xBC, 0x2C, 0x88, 0x61, 0x5A, 0x1F, 0x8B, 0x3F, 0xC3, 0x33, 0xBB, - 0xE2, 0x23, 0x08, 0x2F, 0x36, 0x8A, 0x14, 0x80, 0x81, 0x97, 0x59, 0x5A, 0x93, 0x49, 0x3C, 0xA6, - 0x1E, 0x57, 0xE3, 0x57, 0xC1, 0xC8, 0x00, 0x80, 0xAA, 0xE4, 0xDB, 0x54, 0x92, 0x74, 0x8D, 0xD6, - 0xAD, 0x9A, 0x06, 0x27, 0x85, 0x9A, 0x63, 0xB4, 0x8E, 0x46, 0x38, 0xAC, 0x0F, 0x79, 0x9E, 0x8A, - 0x41, 0x23, 0x2B, 0xD5, 0xD6, 0xD8, 0xCD, 0x10, 0xC8, 0xF9, 0x59, 0xEF, 0xFB, 0xD0, 0x98, 0xCD, - 0xC9, 0xA4, 0x01, 0x07, 0x73, 0x8B, 0x47, 0x20, 0xFF, 0xFF, 0xB6, 0x5E, 0xA8, 0x97, 0x83, 0x30, - 0xE3, 0xB2, 0xAD, 0x88, 0x48, 0x9E, 0xEE, 0xF6, 0x07, 0x76, 0xB5, 0x77, 0xF5, 0xF2, 0x14, 0xF6, - 0x44, 0x0F, 0x40, 0xE4, 0xCF, 0xC4, 0x05, 0x8B, 0xBC, 0x37, 0xE4, 0x45, 0x84, 0xE2, 0xD9, 0xC9, - 0x74, 0x8A, 0xA2, 0x38, 0xA4, 0xFC, 0xF4, 0x1B, 0xDE, 0x85, 0xE2, 0x1C, 0x9D, 0x57, 0xB4, 0x02, - 0xB0, 0x78, 0x1E, 0x3D, 0xBE, 0x8F, 0x81, 0x8D, 0xE3, 0x8F, 0xED, 0x68, 0xC5, 0x26, 0x3C, 0x43, - 0xA9, 0xEC, 0xEE, 0x3F, 0xCD, 0xF9, 0x88, 0x21, 0x6D, 0x61, 0x60, 0x81, 0xE5, 0x3B, 0x34, 0x04, - 0x2B, 0x04, 0x47, 0x83, 0xCC, 0xB2, 0x2C, 0x8A, 0x7F, 0xCE, 0x11, 0x25, 0x6F, 0x27, 0x9A, 0x5E, - 0xE7, 0xAD, 0x07, 0x83, 0xA1, 0x10, 0xDC, 0x0E, 0x6A, 0x3E, 0x50, 0xC7, 0x14, 0x4D, 0x5D, 0xC6, - 0x9E, 0xFA, 0x04, 0xDF, 0xED, 0xD7, 0x30, 0x33, 0x10, 0x43, 0x00, 0xA2, 0xBC, 0xA4, 0x62, 0x2D, - 0x14, 0xFF, 0xD0, 0xA0, 0x37, 0xA4, 0x6F, 0xD1, 0x90, 0x6A, 0x66, 0x30, 0xD5, 0x39, 0xC7, 0xD5, - 0x7C, 0x2E, 0x75, 0xC4, 0x45, 0xA3, 0x61, 0xE4, 0xED, 0x56, 0xBF, 0xD3, 0xF1, 0x6C, 0xB6, 0x11, - 0x35, 0xC1, 0xBD, 0x7D, 0xEB, 0x57, 0xB9, 0x73, 0x6C, 0x04, 0x01, 0xAA, 0x02, 0x50, 0x46, 0x94, - 0xCD, 0x00, 0x81, 0x41, 0xD3, 0x17, 0xC8, 0xB4, 0xCE, 0xC0, 0x6C, 0x6D, 0xC1, 0x6E, 0x73, 0x13, - 0x6E, 0xF5, 0x99, 0x34, 0x68, 0xAA, 0x60, 0x69, 0xEC, 0x53, 0xF4, 0x48, 0x19, 0x27, 0xA2, 0x94, - 0x6E, 0x06, 0xC4, 0xA7, 0x18, 0x7F, 0x9C, 0x8F, 0x26, 0x67, 0x73, 0x3A, 0x9B, 0x53, 0xBE, 0x87, - 0xC5, 0xE4, 0x63, 0x38, 0xEA, 0x74, 0xDA, 0x1A, 0xB6, 0x7F, 0xD5, 0xA4, 0xE9, 0x74, 0x36, 0x6A, - 0xF5, 0xC4, 0x8D, 0x00, 0xE3, 0x9D, 0x4E, 0x87, 0x20, 0xCA, 0xCE, 0xA8, 0x78, 0x4E, 0xA5, 0x4A, - 0xF4, 0xCD, 0x27, 0xBB, 0x1C, 0xC0, 0x1E, 0x53, 0x7C, 0x6A, 0x1A, 0x6F, 0x6D, 0x6A, 0x4D, 0x44, - 0x0B, 0x33, 0x96, 0xDD, 0x26, 0xA6, 0x69, 0xB1, 0x8E, 0xAA, 0x66, 0x62, 0x63, 0x2A, 0xEF, 0x0A, - 0x85, 0x1A, 0x6A, 0xF0, 0xE5, 0x5F, 0x66, 0x0B, 0x86, 0x49, 0x86, 0x93, 0xFC, 0xE5, 0xDC, 0xA7, - 0x88, 0xB0, 0x6D, 0x77, 0xB9, 0xB4, 0x32, 0x94, 0xDC, 0x10, 0xF3, 0xF2, 0x79, 0x8B, 0xE9, 0x74, - 0x8D, 0x67, 0x42, 0x5F, 0x56, 0xE5, 0x76, 0x4F, 0x8B, 0xB0, 0xE4, 0xC0, 0x54, 0xAB, 0xB2, 0x7E, - 0x68, 0xD5, 0xD5, 0x20, 0x09, 0xE2, 0x92, 0xBE, 0xE6, 0x53, 0x7C, 0x41, 0xB3, 0x38, 0xBD, 0xF3, - 0x0A, 0xD9, 0x9D, 0x05, 0x68, 0x98, 0xBD, 0x0D, 0xE8, 0x30, 0xDB, 0xDC, 0x2C, 0x84, 0x43, 0xEC, - 0xF3, 0xEB, 0x20, 0xA6, 0xCE, 0xBD, 0xE7, 0xB0, 0x18, 0x99, 0x2F, 0x55, 0xEB, 0xD8, 0x7F, 0x8A, - 0x62, 0x32, 0xDB, 0xCC, 0xE0, 0x46, 0x0F, 0x40, 0x1A, 0x14, 0x05, 0x9B, 0x7D, 0x60, 0x74, 0x62, - 0xD3, 0xF0, 0xAE, 0xB2, 0xEB, 0x61, 0xCA, 0x66, 0x88, 0x2D, 0x16, 0x89, 0xD7, 0x7E, 0xEA, 0xC7, - 0x69, 0x8A, 0xB2, 0x4B, 0xF4, 0x48, 0x03, 0xF7, 0xFF, 0xFC, 0x6F, 0x77, 0x50, 0x9E, 0x76, 0x04, - 0xAD, 0xA6, 0x06, 0xAD, 0xBB, 0x42, 0x0A, 0xEC, 0x35, 0x08, 0xA2, 0xE2, 0x20, 0x40, 0x80, 0x52, - 0x3C, 0x42, 0xB9, 0x66, 0x99, 0x28, 0x09, 0x47, 0x14, 0x65, 0x5C, 0x64, 0x36, 0xC8, 0xD2, 0x85, - 0x36, 0xA6, 0x95, 0x4F, 0x5C, 0x91, 0xAE, 0xE3, 0x8F, 0x08, 0xF1, 0x47, 0x28, 0x49, 0x7C, 0x71, - 0xB5, 0x05, 0x5A, 0xD7, 0x04, 0xBF, 0x1A, 0xF0, 0xF9, 0xA5, 0x58, 0xA0, 0x35, 0xEC, 0x76, 0xD0, - 0xFC, 0xE2, 0x59, 0x34, 0xC9, 0x67, 0x8F, 0x5F, 0x1A, 0x8F, 0x12, 0x1B, 0x41, 0x95, 0x09, 0x18, - 0xCB, 0xA8, 0x85, 0x5F, 0x52, 0x13, 0x6C, 0xAC, 0xF5, 0x3C, 0x53, 0xA6, 0x4D, 0xBE, 0x5B, 0x77, - 0xDB, 0x3C, 0x6F, 0xDA, 0x0C, 0x16, 0x48, 0x52, 0x43, 0xD0, 0x6D, 0x5D, 0x72, 0x14, 0x94, 0x66, - 0xD4, 0xC8, 0xAD, 0xD3, 0xB9, 0xE8, 0x69, 0x62, 0x54, 0x04, 0xB5, 0xA4, 0xD5, 0x4A, 0x31, 0x6B, - 0x6D, 0xDC, 0x68, 0x5A, 0x07, 0x79, 0xDE, 0x70, 0xDF, 0x90, 0xE4, 0x70, 0x7B, 0xAF, 0xBF, 0xC3, - 0x6F, 0x32, 0x98, 0xBC, 0x54, 0x37, 0x20, 0x4E, 0xCC, 0x28, 0xA0, 0xF7, 0xD8, 0x0C, 0xCD, 0x92, - 0x70, 0x84, 0xBC, 0x97, 0x7F, 0xC9, 0xF6, 0xFF, 0x92, 0xBE, 0xBC, 0x83, 0xEE, 0x5F, 0x32, 0x17, - 0xE4, 0xBA, 0xB6, 0x5C, 0xEC, 0xB2, 0x3E, 0xDD, 0x77, 0xFF, 0x9F, 0xAB, 0xAD, 0x5E, 0xEF, 0x7F, - 0xB9, 0x9B, 0x68, 0x93, 0xFF, 0xD9, 0xFF, 0x5F, 0xEE, 0x00, 0x15, 0xD5, 0xF9, 0x65, 0x03, 0xCC, - 0xC0, 0x02, 0x05, 0xC4, 0x43, 0x01, 0xEB, 0x0B, 0x66, 0x7E, 0x84, 0x46, 0x9F, 0xB3, 0xF8, 0x3E, - 0xA4, 0xE8, 0x23, 0x8E, 0x10, 0xF1, 0x6F, 0xB3, 0x70, 0xF4, 0x15, 0x51, 0x14, 0x7D, 0x0E, 0x89, - 0x28, 0x63, 0xB5, 0x68, 0x16, 0xDF, 0xDD, 0xA1, 0xEC, 0x28, 0xA4, 0x21, 0x57, 0x4F, 0x3C, 0x24, - 0xD6, 0xB8, 0xCF, 0x2F, 0x57, 0x02, 0xD7, 0x2D, 0xBA, 0x49, 0xE5, 0xFD, 0xCC, 0x42, 0x5F, 0xA7, - 0xB0, 0x03, 0x26, 0x57, 0x59, 0xE2, 0xF4, 0xEE, 0x30, 0x89, 0x51, 0x4A, 0xCF, 0xD1, 0x88, 0xE9, - 0xB0, 0x59, 0x80, 0xFC, 0x11, 0x2F, 0xF8, 0x73, 0x97, 0x31, 0xEC, 0x98, 0x76, 0xFB, 0x3D, 0x98, - 0xEA, 0xD2, 0xDF, 0xBB, 0x6C, 0x63, 0x9B, 0x75, 0xFB, 0xBD, 0x61, 0x79, 0x91, 0xB8, 0x5B, 0xBD, - 0xD9, 0xA3, 0x0B, 0x69, 0x99, 0x57, 0x2A, 0xA5, 0x0C, 0x1E, 0xE3, 0x9F, 0x4C, 0x2C, 0x10, 0x59, - 0x4A, 0xF1, 0x8C, 0x15, 0xA6, 0xA5, 0xC2, 0xBF, 0x0B, 0x4D, 0xC5, 0xED, 0xF7, 0x7A, 0x3D, 0x06, - 0x40, 0xEA, 0xDD, 0xF9, 0x37, 0x5C, 0x30, 0xF1, 0xDB, 0xC6, 0xC3, 0x24, 0x1E, 0x7D, 0xFD, 0x99, - 0x2F, 0xAE, 0x2C, 0xA0, 0x3E, 0xDB, 0x70, 0x98, 0x10, 0x3B, 0xC8, 0x50, 0xF8, 0x2B, 0x63, 0xE3, - 0x8F, 0x78, 0x4E, 0xD0, 0x21, 0x77, 0x00, 0x08, 0xA8, 0x3F, 0x63, 0x94, 0x0E, 0xA8, 0x2F, 0x56, - 0x23, 0xA7, 0x3B, 0x27, 0x72, 0x40, 0xFD, 0x11, 0x9E, 0x3D, 0x15, 0x70, 0xE4, 0xDC, 0x30, 0x50, - 0x1F, 0x70, 0xF6, 0x59, 0x36, 0x9B, 0x65, 0x88, 0xED, 0xC6, 0xB2, 0x54, 0xD9, 0x33, 0xE5, 0xA5, - 0x16, 0x6C, 0xFC, 0x1E, 0x43, 0x3B, 0x40, 0x02, 0xCB, 0xDD, 0x96, 0xAF, 0x20, 0xF9, 0xD4, 0xCC, - 0x6E, 0x71, 0x98, 0x45, 0x8C, 0x19, 0x3A, 0x9D, 0x4A, 0x01, 0x13, 0xB7, 0xEC, 0x5F, 0xCF, 0x65, - 0x2B, 0xE7, 0xE5, 0x2C, 0x09, 0xB9, 0x69, 0xD4, 0xD7, 0x3E, 0x10, 0xAC, 0x2F, 0xDB, 0x81, 0x26, - 0x87, 0x16, 0x02, 0x98, 0x7D, 0x33, 0x96, 0x12, 0x87, 0x9E, 0xD2, 0x59, 0x07, 0xD6, 0x30, 0xCA, - 0xBC, 0x2A, 0x4E, 0x77, 0x16, 0x9C, 0x00, 0x87, 0xC8, 0x7A, 0x15, 0xE4, 0xCF, 0xE0, 0x8A, 0x79, - 0x4A, 0xAD, 0x93, 0x5B, 0xC6, 0x10, 0x12, 0xB6, 0xBE, 0x14, 0xBA, 0x30, 0xEB, 0x74, 0x88, 0xD1, - 0xE6, 0x82, 0xD3, 0x80, 0x1F, 0x87, 0xE5, 0xBA, 0x21, 0x65, 0xBA, 0x68, 0x3A, 0x79, 0x20, 0xCF, - 0xE1, 0xAB, 0xAD, 0xED, 0x37, 0xDF, 0x77, 0xD9, 0x79, 0x88, 0x13, 0x9C, 0x71, 0xD5, 0x24, 0x24, - 0xF4, 0x30, 0x1C, 0x4D, 0x50, 0xFD, 0xAA, 0xB3, 0xBF, 0xDB, 0xDB, 0x05, 0x43, 0x6B, 0x5D, 0x6E, - 0xF4, 0x2F, 0xDD, 0x56, 0x6A, 0x25, 0x88, 0x55, 0xE6, 0x06, 0x41, 0xE2, 0x5F, 0x3E, 0xE0, 0x5F, - 0xD0, 0xD3, 0xC7, 0x70, 0xA6, 0x04, 0x21, 0x21, 0xD5, 0x2F, 0x39, 0x41, 0xF4, 0x90, 0x10, 0x35, - 0x8B, 0xBA, 0x1E, 0x63, 0x16, 0x59, 0x98, 0xDF, 0xE9, 0x2A, 0x85, 0x44, 0xD3, 0xF5, 0xEE, 0x44, - 0x3D, 0xC0, 0x01, 0xB1, 0xBE, 0x2B, 0xA0, 0x58, 0x51, 0x15, 0x98, 0xAA, 0x56, 0x05, 0xC7, 0xEB, - 0x6A, 0x80, 0x5C, 0x9D, 0x2B, 0x8F, 0xCB, 0x97, 0x65, 0xC5, 0x78, 0x54, 0x49, 0x9E, 0xE7, 0xF0, - 0xCD, 0xDE, 0x76, 0x5F, 0x0B, 0xEE, 0x6F, 0x91, 0x0F, 0x76, 0xF5, 0xB3, 0x58, 0xAE, 0x4D, 0x15, - 0x34, 0xA7, 0xF9, 0xBE, 0x8F, 0x00, 0xBF, 0x83, 0xA7, 0x7C, 0x7B, 0x96, 0xCA, 0x9E, 0x83, 0xC7, - 0x0E, 0x02, 0xE9, 0x3C, 0x49, 0x82, 0x20, 0xF0, 0x68, 0x20, 0xFE, 0x8A, 0xF7, 0x05, 0xE0, 0x41, - 0x2C, 0x55, 0x76, 0x09, 0x18, 0x2C, 0x97, 0xE2, 0x03, 0x3B, 0x77, 0x2C, 0x97, 0xB4, 0x74, 0x96, - 0x8D, 0x19, 0xFB, 0x6D, 0xEF, 0xED, 0xEE, 0x7D, 0xCF, 0x40, 0x9B, 0xCC, 0xB1, 0xC5, 0x48, 0x1B, - 0x6B, 0x54, 0x17, 0x15, 0x5B, 0xF8, 0xB5, 0x83, 0xB1, 0xF8, 0x22, 0x6C, 0x88, 0xC1, 0x46, 0x5F, - 0x1E, 0x4D, 0x17, 0x11, 0x87, 0x88, 0x06, 0xFC, 0x20, 0x92, 0x2D, 0x97, 0x5E, 0x16, 0x6C, 0xF4, - 0x20, 0xB2, 0xDA, 0x34, 0x04, 0x08, 0x36, 0xAD, 0x39, 0xDC, 0xDB, 0xD9, 0xDB, 0x1D, 0x54, 0xE5, - 0x0D, 0x77, 0x6D, 0xE0, 0xDB, 0xBE, 0xD2, 0x98, 0x6E, 0xA4, 0x7F, 0x08, 0x5A, 0x2E, 0xEB, 0x58, - 0xB2, 0xEA, 0x19, 0x4C, 0x83, 0x30, 0xBB, 0x9B, 0x9B, 0x4A, 0x18, 0xC4, 0x41, 0xFA, 0x76, 0x7B, - 0x9F, 0x0E, 0xE4, 0xEC, 0x90, 0x7D, 0x12, 0x48, 0x8A, 0xDE, 0x21, 0x7A, 0xF6, 0x90, 0x2A, 0x8A, - 0x1E, 0x21, 0xE1, 0x13, 0x82, 0x39, 0x6E, 0x60, 0x40, 0x86, 0x36, 0x97, 0x8F, 0x73, 0x34, 0x66, - 0x42, 0xA2, 0xD3, 0xB1, 0xF8, 0x6F, 0xC8, 0x6F, 0xBE, 0x42, 0x13, 0xE0, 0xA0, 0x5A, 0xA4, 0xF1, - 0x15, 0x7E, 0x20, 0xCA, 0x85, 0x23, 0xD4, 0x7A, 0x77, 0xB7, 0x3F, 0x0C, 0xDF, 0x05, 0xBD, 0x61, - 0xD8, 0xED, 0x02, 0x2F, 0x0B, 0xD0, 0x55, 0x78, 0x0D, 0x3A, 0x1D, 0x0F, 0x07, 0x1E, 0x1B, 0x45, - 0xE6, 0x61, 0x30, 0x48, 0xDF, 0xB1, 0x3F, 0x18, 0x18, 0x0C, 0x06, 0x02, 0x59, 0xB0, 0x5C, 0x62, - 0x6D, 0x20, 0x48, 0xDF, 0x6D, 0x77, 0x3A, 0xB8, 0xD3, 0x69, 0xE2, 0x1B, 0xD6, 0x0E, 0xE2, 0x1C, - 0x66, 0x65, 0xE2, 0xCE, 0xC2, 0x2C, 0x9C, 0x96, 0x29, 0xAB, 0x97, 0xAF, 0x2E, 0xE4, 0xA4, 0xA6, - 0xEC, 0x1F, 0x88, 0x40, 0x9E, 0x0F, 0xBF, 0x81, 0x37, 0x4F, 0xE3, 0xF4, 0x6B, 0x3C, 0x8E, 0x51, - 0xB6, 0x55, 0x16, 0x88, 0x69, 0x10, 0x7B, 0x5B, 0xBB, 0xAF, 0x77, 0x85, 0x9F, 0xC7, 0xEB, 0x9D, - 0xBD, 0x5E, 0xC5, 0xCF, 0x83, 0xBB, 0x7E, 0x70, 0x9E, 0x1B, 0x09, 0xF1, 0xB8, 0x86, 0x87, 0x47, - 0xD5, 0xBF, 0x43, 0x9C, 0xC2, 0x94, 0x3B, 0x07, 0xD2, 0x47, 0xD7, 0xF4, 0xEB, 0xE7, 0x0C, 0xDF, - 0xC7, 0x11, 0xCA, 0x48, 0xE1, 0xB1, 0xC1, 0x8A, 0xB9, 0x34, 0x2E, 0xA0, 0x1B, 0x5F, 0x63, 0xC2, - 0x77, 0xA8, 0xB3, 0x39, 0x65, 0x4C, 0xAE, 0x8E, 0x18, 0x34, 0xBE, 0x47, 0xEC, 0x60, 0x56, 0x58, - 0x5E, 0x70, 0x7A, 0x31, 0xC1, 0x0F, 0x6C, 0xD4, 0xBF, 0x2A, 0xAF, 0xB0, 0xA0, 0x7C, 0xBD, 0xC1, - 0x24, 0x36, 0xF6, 0xF9, 0xF2, 0x38, 0x9E, 0xC6, 0x94, 0x6A, 0x7B, 0x52, 0x63, 0x53, 0x1B, 0x50, - 0x9F, 0xEF, 0xE9, 0xBA, 0xD3, 0x9F, 0xE3, 0x08, 0x7D, 0x63, 0xA7, 0x0D, 0x4D, 0x6D, 0x40, 0xCD, - 0x4E, 0xCB, 0xD7, 0x35, 0x6C, 0xDF, 0x17, 0xE2, 0xE0, 0x20, 0xCB, 0xC2, 0x27, 0xF3, 0xEE, 0xA6, - 0x99, 0xBA, 0xEB, 0xDF, 0xFC, 0x48, 0x18, 0x21, 0xA1, 0x7C, 0x16, 0x84, 0xCA, 0x22, 0xF8, 0x89, - 0xDF, 0xDF, 0xDC, 0x31, 0x36, 0x99, 0x67, 0x19, 0x17, 0x39, 0xE9, 0x57, 0xAF, 0xBA, 0x13, 0x15, - 0x9F, 0x72, 0xD5, 0xD9, 0xA9, 0xC1, 0x05, 0xC6, 0x59, 0xC0, 0xC2, 0x22, 0xDA, 0xB4, 0x5E, 0x96, - 0x78, 0x82, 0x8F, 0x69, 0x60, 0x6B, 0xC1, 0x7D, 0xD8, 0xCE, 0xC6, 0x1E, 0x02, 0xC3, 0x6E, 0x9F, - 0x9D, 0x85, 0x0A, 0xFB, 0x8F, 0x59, 0x8D, 0xCC, 0x92, 0x78, 0x84, 0x3C, 0x0A, 0xFB, 0x4C, 0x32, - 0x86, 0x94, 0x86, 0xA3, 0xC9, 0x25, 0x3E, 0xC2, 0xD3, 0xF2, 0xA6, 0x2B, 0x6F, 0xC6, 0x35, 0x03, - 0x73, 0x57, 0xDE, 0xAA, 0x93, 0x52, 0xD9, 0x75, 0x29, 0xAE, 0x53, 0x76, 0xD2, 0x72, 0x6D, 0x57, - 0xEA, 0x07, 0xBA, 0xBC, 0x83, 0x04, 0x85, 0xF7, 0xEA, 0x06, 0x6F, 0xD1, 0xBC, 0x08, 0xF8, 0x86, - 0x7D, 0x68, 0xD2, 0x3E, 0xB7, 0x5E, 0xE9, 0x3D, 0xB7, 0x7B, 0xB6, 0x87, 0x28, 0x63, 0x93, 0xD0, - 0x56, 0x79, 0xDF, 0x1F, 0xF1, 0x3D, 0x32, 0x7D, 0x30, 0xFE, 0x80, 0x9E, 0x22, 0xFC, 0x90, 0x5A, - 0x7A, 0x3A, 0xC2, 0x0F, 0xE9, 0x1F, 0xDC, 0xD3, 0x7C, 0x66, 0xE9, 0xE7, 0xD7, 0x59, 0xA9, 0x97, - 0xBC, 0x3A, 0x5A, 0xC6, 0x9C, 0xDA, 0x0A, 0x52, 0x59, 0x02, 0x48, 0x39, 0x68, 0xC8, 0x7E, 0x96, - 0xCB, 0x8D, 0x3A, 0x8B, 0xA8, 0x3B, 0xC0, 0x32, 0xC3, 0x2A, 0xC7, 0x4A, 0xA6, 0xF7, 0x14, 0x10, - 0x3D, 0xC5, 0x63, 0x0A, 0x71, 0x0B, 0x38, 0xB6, 0x53, 0x6E, 0x50, 0x05, 0xB5, 0xCE, 0x19, 0xFD, - 0x61, 0x71, 0x69, 0x2A, 0xDE, 0x4D, 0xB0, 0x23, 0x2E, 0x9D, 0x78, 0x55, 0x1B, 0x47, 0xAC, 0x6F, - 0x26, 0x0A, 0xCB, 0x17, 0x0D, 0xE2, 0x2B, 0xC4, 0x6F, 0x4B, 0x4D, 0xD7, 0x36, 0xE9, 0xF6, 0x4A, - 0xA4, 0x83, 0x98, 0x0B, 0xC0, 0x6D, 0x86, 0xC2, 0xAF, 0x2B, 0xAA, 0x75, 0x27, 0xF8, 0x1E, 0x65, - 0xAE, 0xBA, 0x22, 0xCD, 0x0B, 0x12, 0x0A, 0x93, 0xDA, 0x21, 0x4A, 0x92, 0x4E, 0x87, 0xFA, 0x8F, - 0x85, 0x45, 0xB8, 0xF4, 0xCD, 0x7F, 0x64, 0x5F, 0x9F, 0x9A, 0xBE, 0x3E, 0x2D, 0x97, 0x9E, 0x39, - 0x9B, 0x3F, 0xB3, 0xDE, 0x3C, 0x7D, 0xD9, 0x5C, 0xAE, 0x1D, 0x50, 0x3D, 0xB3, 0xA2, 0x9E, 0x39, - 0xAB, 0xC5, 0x46, 0xB2, 0x11, 0x04, 0xC8, 0x7F, 0x02, 0x65, 0xE9, 0x55, 0x5B, 0x61, 0x90, 0x8B, - 0x3E, 0xD9, 0x96, 0x7C, 0xFD, 0x80, 0xB9, 0x34, 0xF3, 0x10, 0xDC, 0xE8, 0xAB, 0x5B, 0x10, 0x43, - 0xE4, 0x99, 0xB2, 0xE7, 0x80, 0x7E, 0x96, 0xF3, 0xEE, 0xD5, 0xEA, 0xF9, 0xAC, 0x02, 0x44, 0x40, - 0x0F, 0xCB, 0xD2, 0xB1, 0xAD, 0x4F, 0x6E, 0x47, 0x2E, 0x15, 0x51, 0xA1, 0xA0, 0xC5, 0x90, 0x0C, - 0xCD, 0x01, 0x2A, 0xC1, 0x77, 0x8E, 0x66, 0x49, 0x8C, 0x98, 0x2E, 0xB2, 0x5C, 0x7A, 0x4A, 0x8D, - 0x56, 0x26, 0x54, 0x6B, 0x55, 0x53, 0x87, 0x8E, 0x97, 0xCB, 0xD8, 0x1F, 0xE3, 0xEC, 0x38, 0x1C, - 0x4D, 0xB8, 0xF7, 0xC7, 0x42, 0x80, 0x40, 0xCB, 0x25, 0x2A, 0x97, 0x23, 0x3E, 0x22, 0x5F, 0x4A, - 0x6D, 0x76, 0x80, 0x36, 0x7F, 0x73, 0x41, 0x95, 0x03, 0x00, 0x5B, 0xFA, 0xE5, 0xC7, 0xAB, 0xE2, - 0xC0, 0x65, 0x6C, 0xF8, 0x6C, 0x96, 0x0A, 0x8D, 0x58, 0x1F, 0x0E, 0xAE, 0x62, 0x98, 0x5E, 0xCB, - 0xB7, 0xD9, 0x55, 0x69, 0x8F, 0x52, 0x9A, 0xC5, 0x88, 0x78, 0x00, 0xD0, 0x7D, 0x3D, 0x6C, 0xB2, - 0xEE, 0xB0, 0x89, 0x3A, 0x5E, 0x88, 0x33, 0x5A, 0x0C, 0x98, 0xA2, 0x98, 0x69, 0x43, 0x19, 0x1A, - 0x7D, 0x35, 0x77, 0xB4, 0x73, 0x44, 0xD8, 0x59, 0x3F, 0x86, 0x08, 0x66, 0x00, 0x0C, 0x52, 0x7F, - 0x26, 0x3E, 0xB0, 0x3A, 0xC4, 0x43, 0xFE, 0x13, 0xF4, 0x68, 0xF0, 0x4E, 0x68, 0xDD, 0xC2, 0x2D, - 0xA0, 0xBA, 0x8E, 0xCB, 0x52, 0x03, 0xCB, 0x43, 0x0E, 0x55, 0x58, 0x50, 0x7F, 0x1A, 0xCE, 0x38, - 0x99, 0xBD, 0x05, 0x1B, 0xE6, 0x00, 0x31, 0xB1, 0x3F, 0x7C, 0xFE, 0xB0, 0x96, 0x4B, 0x71, 0x38, - 0xE5, 0x7A, 0xEA, 0x7A, 0xE3, 0x81, 0x9A, 0x7A, 0xE9, 0xBA, 0xDD, 0xA4, 0x0A, 0xEF, 0xD4, 0x27, - 0xF1, 0xDF, 0x11, 0x30, 0xEE, 0x80, 0xCC, 0x29, 0x52, 0xD6, 0x49, 0xB5, 0xA5, 0xB2, 0x4D, 0xE8, - 0x24, 0xA5, 0x28, 0xE3, 0xC1, 0x13, 0xD2, 0xBB, 0x82, 0x7C, 0x6D, 0xFD, 0x32, 0xBE, 0x6A, 0x6E, - 0x6C, 0xDE, 0x1A, 0x30, 0xF6, 0xBA, 0x40, 0x54, 0xCB, 0x45, 0x12, 0xF4, 0x86, 0xE4, 0x2D, 0xE5, - 0x38, 0x0E, 0x49, 0x21, 0x15, 0xB3, 0x80, 0x9F, 0x5F, 0x3C, 0xC2, 0x85, 0x6F, 0x06, 0xCA, 0xF7, - 0x76, 0x99, 0x92, 0xA3, 0xB4, 0x68, 0x41, 0x82, 0xEC, 0x8A, 0x5E, 0xC3, 0x34, 0x20, 0x82, 0xE9, - 0xB3, 0x30, 0xBD, 0x93, 0xCE, 0x66, 0xFE, 0xD3, 0x5B, 0xB4, 0xCF, 0xF8, 0xA8, 0xF6, 0xE1, 0x11, - 0xE2, 0x72, 0x7D, 0x94, 0x46, 0xFE, 0xD3, 0x3B, 0xB4, 0x6F, 0x51, 0xA7, 0xFD, 0x11, 0x4E, 0xC8, - 0xA0, 0x56, 0xFB, 0xD1, 0x90, 0xF1, 0xE9, 0x10, 0xBD, 0x0D, 0xB0, 0x90, 0xEE, 0xDC, 0xFD, 0x65, - 0x12, 0x12, 0x0F, 0x01, 0xB0, 0xC8, 0xB4, 0xE6, 0xD3, 0xED, 0xC2, 0x3E, 0x18, 0x72, 0x61, 0x9E, - 0xC7, 0xDC, 0xE3, 0x11, 0xF1, 0x43, 0x62, 0x23, 0x07, 0x98, 0xC7, 0x45, 0xB1, 0x11, 0xB5, 0x4C, - 0x84, 0x14, 0xA3, 0xF1, 0x50, 0x53, 0xB1, 0xB9, 0xB2, 0x30, 0x54, 0x88, 0x35, 0x9D, 0xAA, 0x35, - 0x6D, 0xBF, 0x1B, 0xB5, 0xB7, 0x67, 0x83, 0xA3, 0x40, 0xDF, 0xE0, 0x35, 0x77, 0x42, 0x99, 0x84, - 0x4D, 0x83, 0x8D, 0x9E, 0xD8, 0x49, 0xD3, 0x4E, 0x27, 0x2B, 0xEE, 0x7D, 0x32, 0x7F, 0xCC, 0x94, - 0x81, 0xC2, 0xAB, 0xAD, 0x22, 0xB5, 0x85, 0x0C, 0x83, 0x94, 0x2D, 0x36, 0xD4, 0xE9, 0x78, 0x71, - 0xA1, 0x89, 0x89, 0xDD, 0xE5, 0x13, 0x7A, 0x10, 0x52, 0x18, 0x80, 0xBC, 0xB2, 0xC1, 0x54, 0x91, - 0x61, 0x5C, 0xB6, 0x62, 0x21, 0x6C, 0xC4, 0xC0, 0x76, 0x2F, 0xD1, 0x0C, 0xCF, 0xDC, 0xCB, 0xB3, - 0x60, 0x2D, 0x71, 0x20, 0x29, 0xDF, 0x20, 0xEC, 0xD6, 0x27, 0x07, 0x5F, 0x19, 0x8B, 0x46, 0x82, - 0x64, 0x8A, 0xCF, 0x72, 0xC5, 0x16, 0x79, 0x55, 0xDD, 0xD3, 0xD6, 0xA9, 0xA9, 0x2A, 0x61, 0x2D, - 0x83, 0xFA, 0x21, 0xA2, 0xAC, 0xBF, 0xC9, 0xBD, 0x7C, 0x0D, 0x55, 0x4C, 0x17, 0x1A, 0xC0, 0xFE, - 0x70, 0xF5, 0x4C, 0x1F, 0x36, 0xCA, 0xA3, 0x08, 0xEA, 0xE3, 0x78, 0x9E, 0x66, 0xC0, 0x98, 0xDB, - 0xFE, 0x49, 0xBC, 0x86, 0x95, 0x06, 0x0F, 0x7B, 0x0D, 0x8A, 0x1E, 0xA9, 0xBA, 0x6E, 0x36, 0x55, - 0x0A, 0xE3, 0x42, 0x56, 0x8E, 0xC9, 0xD2, 0x89, 0xC6, 0xB3, 0xA4, 0xFD, 0x76, 0x3A, 0xDE, 0x06, - 0xA7, 0xA8, 0xBE, 0x00, 0xAE, 0x76, 0x5A, 0x12, 0x7A, 0xEF, 0x02, 0xD4, 0x88, 0xBF, 0x21, 0xED, - 0xDE, 0x06, 0x6C, 0x9C, 0xC6, 0xA9, 0xF5, 0x94, 0x9D, 0x83, 0x3C, 0x1B, 0xD9, 0xEB, 0x14, 0xB2, - 0x60, 0x09, 0xEA, 0x95, 0x95, 0x5D, 0x8E, 0x1F, 0x77, 0x23, 0xE3, 0xD8, 0xDC, 0x7E, 0x58, 0xCE, - 0x6B, 0x2B, 0xBC, 0x85, 0xEB, 0xCA, 0x48, 0x7C, 0xFF, 0xB9, 0xC0, 0x06, 0xF5, 0x39, 0xBC, 0xD8, - 0xB4, 0x6E, 0x0B, 0x5F, 0x0F, 0x83, 0x3E, 0x36, 0x2E, 0x22, 0x34, 0xA4, 0x28, 0x58, 0x14, 0x8F, - 0xC6, 0xC8, 0x60, 0xA1, 0x1F, 0xDE, 0x0D, 0xB4, 0xE4, 0x50, 0x3A, 0x5E, 0x51, 0x8D, 0xA9, 0x85, - 0xD5, 0x32, 0x5F, 0xB7, 0x84, 0xF2, 0x95, 0x9A, 0xB8, 0x7A, 0x78, 0x36, 0x9C, 0x52, 0xEB, 0x1C, - 0xC6, 0x84, 0x2B, 0xF7, 0x28, 0x1A, 0x6C, 0xF4, 0x72, 0xC3, 0xAE, 0x24, 0x8F, 0x06, 0x25, 0x72, - 0xA1, 0x36, 0x9E, 0xA9, 0x77, 0x15, 0x2C, 0x72, 0x68, 0xB3, 0xBF, 0x31, 0x8D, 0xB2, 0x5E, 0x1B, - 0x2E, 0xCA, 0xE3, 0x5A, 0xDC, 0x21, 0x2A, 0xCC, 0x16, 0xFC, 0x7D, 0x17, 0xA4, 0xDA, 0x7C, 0x58, - 0xB1, 0x62, 0x07, 0x1E, 0xAA, 0xCB, 0x09, 0x53, 0x34, 0x23, 0x25, 0x9A, 0x91, 0x98, 0x92, 0x92, - 0x79, 0xBB, 0xD0, 0x0E, 0x5B, 0x88, 0x44, 0x10, 0x1D, 0x20, 0x89, 0x09, 0x85, 0xF1, 0xD0, 0x2B, - 0x70, 0x68, 0xED, 0xD9, 0x80, 0x2E, 0x7A, 0xB6, 0x2D, 0x67, 0xFE, 0xA5, 0xB9, 0xF7, 0xB2, 0x7B, - 0xD1, 0xFA, 0xED, 0x9A, 0x59, 0xD2, 0xD7, 0x73, 0xDE, 0xE9, 0xD4, 0x0E, 0x33, 0xA8, 0x7E, 0x05, - 0xC0, 0x8F, 0x2F, 0xC5, 0x91, 0x95, 0xE2, 0xBB, 0xBB, 0x04, 0xA9, 0x03, 0x6B, 0xF9, 0x4D, 0xB4, - 0x0B, 0x11, 0x00, 0x20, 0xCF, 0x61, 0xC1, 0xE7, 0xFF, 0xD4, 0x79, 0xD4, 0x68, 0x88, 0x39, 0x54, - 0x07, 0x08, 0x7E, 0x17, 0x37, 0xAC, 0x8D, 0xBD, 0xA1, 0x5F, 0xE3, 0x9A, 0x44, 0xCD, 0xA2, 0x6E, - 0x5A, 0x57, 0x18, 0x1A, 0x80, 0x18, 0xFA, 0x41, 0x0D, 0xF9, 0x4C, 0x7D, 0xCB, 0xEC, 0xC8, 0x03, - 0x61, 0x8F, 0x5B, 0x8B, 0x07, 0xE6, 0x85, 0x4D, 0x74, 0x9D, 0xF9, 0x17, 0x55, 0xC6, 0x71, 0x86, - 0xB4, 0xC9, 0x54, 0x6E, 0xDB, 0x5A, 0x4D, 0xC9, 0xF3, 0x1C, 0xD8, 0x2C, 0x76, 0xA6, 0x9C, 0xAC, - 0x8A, 0x7E, 0x61, 0x80, 0xB4, 0x34, 0xD2, 0xAF, 0x4B, 0x50, 0xF4, 0x27, 0x19, 0x61, 0x42, 0x3D, - 0x3F, 0x40, 0x86, 0x85, 0x52, 0xC8, 0x33, 0xBE, 0x0D, 0xEE, 0xCB, 0xF9, 0xCE, 0xE8, 0x66, 0x7F, - 0xD3, 0xA6, 0xD5, 0x4B, 0x27, 0x73, 0xEE, 0x4D, 0x04, 0x2D, 0x53, 0xB9, 0x6F, 0x93, 0x57, 0x52, - 0x6C, 0x16, 0xC7, 0xC8, 0xDA, 0x36, 0x2F, 0x5F, 0xB8, 0xAC, 0xD1, 0x29, 0x80, 0xB1, 0xA2, 0x85, - 0x5A, 0x3D, 0x15, 0xCF, 0xE8, 0x86, 0x1D, 0x2A, 0x5E, 0x63, 0x3B, 0xD2, 0x64, 0xAE, 0x5A, 0x4D, - 0x72, 0x76, 0x7A, 0x05, 0xB9, 0x21, 0xAC, 0x4B, 0x07, 0x8D, 0xDA, 0x71, 0x7D, 0x5D, 0xBE, 0x6C, - 0xE1, 0x33, 0xCD, 0x37, 0x86, 0x2D, 0x75, 0x3D, 0x66, 0x6C, 0x61, 0x34, 0x2A, 0x9C, 0x45, 0x9E, - 0x2B, 0xDE, 0x84, 0x73, 0x81, 0xE5, 0x25, 0x66, 0x45, 0x20, 0x01, 0x00, 0xA9, 0xCF, 0xAD, 0x6A, - 0x9D, 0x8E, 0xFC, 0x83, 0xD1, 0x5D, 0x69, 0x77, 0x36, 0xCE, 0x2F, 0x3F, 0xA2, 0xE0, 0x8A, 0x96, - 0x7E, 0x43, 0xD1, 0xC2, 0x7A, 0x59, 0xC9, 0xFF, 0xB8, 0x74, 0x0B, 0x21, 0xA7, 0x5B, 0x9D, 0x59, - 0xBB, 0x7D, 0xA8, 0xFE, 0x7E, 0xEA, 0x12, 0xFE, 0x8B, 0x1F, 0x44, 0xE5, 0xBF, 0xA2, 0x4C, 0x4C, - 0x0B, 0x18, 0x7A, 0x54, 0x32, 0xB0, 0xE5, 0x4A, 0x65, 0xA0, 0xBE, 0xD4, 0xEE, 0x3D, 0x80, 0xCF, - 0x46, 0xE6, 0x65, 0x92, 0x41, 0x84, 0x46, 0xF8, 0x7F, 0x93, 0x41, 0xFA, 0x7F, 0x24, 0x83, 0xF4, - 0xBF, 0x9B, 0x41, 0x84, 0x6D, 0xA3, 0x8D, 0x47, 0xF8, 0xE5, 0x01, 0xE3, 0x11, 0xFE, 0x87, 0xC9, - 0x23, 0x55, 0x45, 0xD0, 0xC2, 0x1F, 0x6A, 0x36, 0x5F, 0x34, 0x99, 0x1D, 0x36, 0x51, 0xC5, 0x6C, - 0x41, 0x74, 0x53, 0x3E, 0xE5, 0xAB, 0x1B, 0x0A, 0x0E, 0xC9, 0x82, 0xD6, 0x5E, 0xA8, 0xFF, 0xA8, - 0xB6, 0xD7, 0xF8, 0x6D, 0x90, 0x75, 0x3A, 0xD9, 0xDB, 0x80, 0xE4, 0x2D, 0x47, 0xB3, 0x9A, 0x2F, - 0xD6, 0x21, 0xC6, 0x59, 0x44, 0x0C, 0x77, 0xD2, 0x7A, 0x2F, 0xD6, 0x0F, 0xC2, 0x23, 0x30, 0x1E, - 0x7B, 0xCA, 0x86, 0xB1, 0x78, 0x1C, 0x90, 0xAB, 0xDE, 0x35, 0x7C, 0x1A, 0x90, 0xAB, 0xFE, 0xF5, - 0x4A, 0x21, 0x9A, 0xE7, 0xCD, 0x0B, 0xC7, 0x70, 0x9F, 0x51, 0xB0, 0xFB, 0x03, 0x04, 0x9F, 0xFA, - 0x03, 0x0A, 0x1F, 0xB7, 0x06, 0x31, 0x7C, 0xDA, 0x1A, 0x10, 0xC8, 0xAD, 0x3B, 0x8D, 0x38, 0x8F, - 0xEF, 0x06, 0x59, 0x9E, 0xE7, 0xC3, 0x51, 0x40, 0xBC, 0xAB, 0xCC, 0xEB, 0xC1, 0xD4, 0x3F, 0x79, - 0x6F, 0x56, 0x03, 0xD7, 0x70, 0x54, 0xB9, 0xFE, 0x1D, 0xE5, 0xF0, 0x4D, 0x6F, 0x67, 0xEB, 0x7B, - 0x1C, 0x1D, 0x4A, 0xAE, 0xD7, 0xDC, 0x1F, 0x0B, 0x4F, 0x67, 0xF4, 0x34, 0xBC, 0x45, 0x25, 0x27, - 0xAC, 0xA2, 0xD0, 0xBD, 0xD4, 0x81, 0xE6, 0xD2, 0xD9, 0x9C, 0xBA, 0x35, 0x18, 0xEE, 0x25, 0xC6, - 0xCE, 0x74, 0x3E, 0x9A, 0x38, 0x98, 0x17, 0x88, 0xC8, 0x9B, 0xD2, 0xDD, 0xD0, 0x49, 0xC3, 0xFB, - 0xF8, 0x2E, 0xA4, 0x88, 0x95, 0xB2, 0x29, 0x71, 0xA6, 0x61, 0x3A, 0xE7, 0x01, 0xF9, 0x58, 0x01, - 0x0A, 0x23, 0x37, 0x87, 0xDB, 0xAF, 0xB6, 0x7B, 0xFF, 0xF6, 0x66, 0xF8, 0x17, 0xF1, 0x66, 0x38, - 0x23, 0x23, 0xD3, 0x26, 0x59, 0x77, 0x69, 0xD8, 0xED, 0xF7, 0x85, 0x47, 0x03, 0xF7, 0x6D, 0xE0, - 0xC6, 0xC4, 0xD0, 0xE2, 0xDD, 0x55, 0xBA, 0xDE, 0xB5, 0x7B, 0x29, 0xE0, 0x19, 0x17, 0xC3, 0xD5, - 0x6B, 0x5E, 0x2C, 0x30, 0xD0, 0xF7, 0xBC, 0x79, 0xD9, 0xB0, 0xAF, 0xAF, 0x5E, 0xB4, 0xDF, 0x59, - 0x8B, 0xA8, 0x10, 0x9E, 0xE9, 0xDC, 0xFA, 0xD6, 0xED, 0x0B, 0x63, 0xA4, 0xB6, 0x99, 0x8A, 0x1B, - 0x26, 0x4F, 0xED, 0x9B, 0xCA, 0xA0, 0x77, 0x75, 0x0D, 0x71, 0x60, 0x43, 0xD0, 0xCF, 0xC2, 0x87, - 0x33, 0x51, 0xC2, 0x75, 0x5D, 0xE9, 0xB5, 0x07, 0x43, 0xF9, 0xB4, 0xFE, 0x10, 0x25, 0xC9, 0x51, - 0x48, 0x43, 0x38, 0x0A, 0x78, 0x97, 0x97, 0x59, 0x3C, 0x9D, 0xA2, 0xE8, 0x94, 0x33, 0x8E, 0x27, - 0x28, 0x95, 0x04, 0xDD, 0x3E, 0x8C, 0xD8, 0xFF, 0x6E, 0xEA, 0x06, 0xD8, 0x11, 0x37, 0xC0, 0xC6, - 0x63, 0x8F, 0x5F, 0xA8, 0x47, 0xCB, 0x25, 0xB7, 0xB8, 0x4A, 0x87, 0x61, 0x8F, 0x02, 0x6E, 0x0C, - 0x21, 0x7E, 0x82, 0xC3, 0x88, 0xF5, 0xE5, 0x51, 0x18, 0x02, 0x18, 0xB2, 0x3A, 0xC7, 0x32, 0x9C, - 0xE4, 0x01, 0xA5, 0x19, 0xF1, 0x40, 0xA7, 0x13, 0xFA, 0x2A, 0xC2, 0xA4, 0x3F, 0xCF, 0x92, 0x93, - 0x88, 0x37, 0xED, 0xF6, 0x83, 0x20, 0x88, 0xC0, 0x22, 0x0A, 0x28, 0x4C, 0x82, 0x6A, 0x15, 0x46, - 0x00, 0x1A, 0xA7, 0x73, 0x94, 0xDF, 0xD4, 0xBE, 0x6D, 0x04, 0x41, 0xC2, 0x5F, 0xF0, 0x09, 0xCC, - 0x3A, 0x1D, 0xEF, 0x46, 0x19, 0x77, 0x6F, 0x96, 0x4B, 0x55, 0x48, 0x83, 0x20, 0x18, 0x75, 0xFB, - 0xC5, 0x06, 0x51, 0x3D, 0x2F, 0x95, 0x67, 0x96, 0xD1, 0x88, 0xFD, 0xE4, 0xDE, 0x94, 0x09, 0x68, - 0x38, 0x41, 0xCD, 0xB3, 0x58, 0xEC, 0x12, 0x7A, 0x0B, 0x5D, 0xF0, 0x2D, 0x71, 0xB0, 0x78, 0x1C, - 0x44, 0x9B, 0x7D, 0xF8, 0x34, 0x40, 0x39, 0x44, 0x69, 0xC4, 0x7E, 0xD3, 0x4D, 0x86, 0x0E, 0xDD, - 0xE0, 0x68, 0xEC, 0xF7, 0x06, 0x7D, 0xC0, 0x3F, 0xE7, 0x85, 0xC5, 0x9B, 0x31, 0x80, 0x54, 0x64, - 0xB0, 0xEA, 0x03, 0xFB, 0x61, 0x92, 0xE0, 0x87, 0x4F, 0x38, 0xFD, 0x99, 0xD2, 0xD9, 0xE7, 0x0C, - 0x53, 0xCC, 0x76, 0x00, 0x00, 0x68, 0xF6, 0xA4, 0xF5, 0x72, 0x36, 0xC5, 0xBF, 0x9E, 0x9F, 0x7A, - 0x04, 0x0C, 0xAF, 0x5C, 0x1E, 0x45, 0xD4, 0x85, 0xAE, 0x88, 0x93, 0xEC, 0x5E, 0xFB, 0x32, 0x84, - 0x27, 0xF1, 0x10, 0x93, 0xCD, 0xBC, 0xBD, 0xB6, 0x80, 0xE7, 0xA3, 0x90, 0x8E, 0x26, 0x1E, 0x02, - 0x0B, 0xF6, 0x33, 0x4F, 0x97, 0xCB, 0x4C, 0x9C, 0x76, 0x16, 0x4C, 0x5D, 0x18, 0x10, 0xC8, 0xB7, - 0xEB, 0x41, 0x0C, 0x95, 0x85, 0x51, 0x6D, 0x1F, 0x78, 0x1F, 0x97, 0xAC, 0x8E, 0x4C, 0xEA, 0x4D, - 0xBC, 0x1E, 0xA4, 0x00, 0x72, 0xB5, 0x54, 0x6F, 0x33, 0x42, 0x3F, 0xAB, 0x9C, 0x92, 0x15, 0xF5, - 0x8D, 0x61, 0xF2, 0x56, 0x0D, 0xAA, 0xDA, 0x28, 0x4C, 0x12, 0x0F, 0x43, 0xE9, 0xF2, 0x08, 0xB9, - 0x4E, 0xF3, 0xEC, 0x0E, 0x78, 0xAB, 0xB5, 0x3A, 0xC8, 0x41, 0xCE, 0x16, 0xC0, 0x9A, 0xDC, 0xBB, - 0xEF, 0xD9, 0x59, 0x16, 0x0C, 0x3C, 0xBE, 0x96, 0xD8, 0xAA, 0x02, 0x79, 0x4E, 0x99, 0xFA, 0x9A, - 0x0F, 0xB5, 0xF3, 0xF8, 0x44, 0x07, 0x3A, 0x1A, 0xE1, 0x74, 0x1C, 0x67, 0x53, 0xEF, 0xCB, 0x11, - 0x76, 0x9E, 0xF0, 0xDC, 0x79, 0x08, 0x53, 0xBE, 0x0F, 0x9A, 0xBB, 0xDF, 0x8F, 0x0B, 0x9A, 0xEF, - 0xFF, 0x25, 0xFD, 0x4B, 0xFA, 0xDB, 0xC1, 0xF9, 0xA7, 0x93, 0x4F, 0x3F, 0x0D, 0x9C, 0xCB, 0x49, - 0x4C, 0x1C, 0xB6, 0xD2, 0x9D, 0x11, 0x9E, 0x27, 0x91, 0x33, 0xC3, 0x6C, 0x21, 0xC6, 0x7C, 0x77, - 0xBC, 0x45, 0x4E, 0xC4, 0xE6, 0x2D, 0xC3, 0x73, 0xF2, 0x05, 0x14, 0xE7, 0x37, 0xF1, 0x3A, 0x9C, - 0xC7, 0x7F, 0xF0, 0xF8, 0xFA, 0x40, 0x60, 0xC1, 0xF8, 0x08, 0xF1, 0x22, 0x24, 0x8E, 0xFF, 0x05, - 0x4B, 0xE4, 0xC8, 0x4F, 0xF0, 0x88, 0xAB, 0xA3, 0xFE, 0x24, 0x43, 0xE3, 0x80, 0xF2, 0x65, 0xE6, - 0x30, 0x70, 0x38, 0x41, 0xFE, 0x43, 0x98, 0xA5, 0x9E, 0x7B, 0x36, 0x43, 0x3C, 0x36, 0x36, 0xC7, - 0x85, 0x07, 0xE0, 0x43, 0x91, 0x13, 0x12, 0x47, 0x80, 0x94, 0xD8, 0xA5, 0x98, 0xC7, 0x30, 0xE5, - 0xE7, 0x52, 0x14, 0xB9, 0x20, 0xCF, 0x43, 0xA5, 0xBA, 0xE0, 0xAA, 0xEA, 0x02, 0x33, 0xAF, 0xCF, - 0x4A, 0xCF, 0x4A, 0x02, 0x8E, 0x15, 0x6F, 0xF1, 0xE2, 0xD2, 0x3A, 0x05, 0xD7, 0x4C, 0xCE, 0xD4, - 0x77, 0x86, 0x30, 0x87, 0x7B, 0xFD, 0x37, 0xDB, 0xDF, 0xA3, 0xED, 0x88, 0xA3, 0x7D, 0x11, 0xA3, - 0x44, 0x6B, 0x38, 0xD5, 0x0F, 0xD6, 0xFD, 0x45, 0xED, 0x2E, 0xC2, 0x17, 0xF5, 0x37, 0x4E, 0xF9, - 0x4A, 0x9C, 0xA3, 0xC3, 0x30, 0x49, 0x6E, 0xC3, 0xD1, 0x57, 0xC3, 0x87, 0x88, 0xBF, 0x14, 0x51, - 0xE5, 0x24, 0xB8, 0xBA, 0xCE, 0xF5, 0x6D, 0xB9, 0x7A, 0x57, 0x93, 0xC6, 0xD3, 0x50, 0xA8, 0xBF, - 0xE1, 0xB4, 0xB0, 0xA5, 0x99, 0xDD, 0xF8, 0xA3, 0x30, 0x1D, 0xA1, 0xE4, 0xA0, 0x54, 0xD3, 0xB3, - 0x35, 0xD7, 0x97, 0xEF, 0xA5, 0x52, 0x39, 0x52, 0x90, 0x87, 0x51, 0x74, 0x5E, 0x46, 0xA9, 0xE6, - 0xA9, 0x55, 0x45, 0xB9, 0xF2, 0x0E, 0xBA, 0x0C, 0x58, 0x7B, 0x36, 0x54, 0xFA, 0xB3, 0x0C, 0x21, - 0x43, 0x7F, 0x9B, 0x23, 0x42, 0x2B, 0x63, 0x30, 0xC2, 0x19, 0xF0, 0xF7, 0x52, 0x12, 0x3B, 0x33, - 0x98, 0x43, 0x19, 0x74, 0x6E, 0xBE, 0x28, 0x8B, 0x8D, 0xD7, 0xC1, 0xE2, 0xC5, 0x5C, 0x0C, 0xD5, - 0x60, 0x37, 0x82, 0x00, 0xED, 0xA3, 0x41, 0x0F, 0xD2, 0xA2, 0x80, 0xEE, 0xD3, 0x41, 0xB9, 0x41, - 0xF1, 0xC0, 0x13, 0x3F, 0x5C, 0x30, 0x41, 0x6F, 0x54, 0x2E, 0x95, 0xEF, 0x7F, 0x0C, 0xE9, 0xC4, - 0x9F, 0xC6, 0xA9, 0x57, 0x2E, 0x87, 0x08, 0x0C, 0x90, 0xF1, 0x84, 0x29, 0x8D, 0x2C, 0x10, 0x8E, - 0xD3, 0x48, 0xB6, 0x0F, 0x1F, 0x3D, 0xB3, 0x14, 0x52, 0x30, 0xA0, 0xFF, 0xF7, 0x29, 0x9B, 0x57, - 0x8A, 0x0C, 0xC7, 0x19, 0x1B, 0xDF, 0xC0, 0xC2, 0x8E, 0x59, 0x1A, 0xBB, 0x69, 0xE0, 0x34, 0x06, - 0x65, 0x2B, 0xE6, 0xC4, 0x2E, 0xAB, 0x42, 0xE2, 0xD3, 0x3C, 0xAD, 0x30, 0x24, 0xF1, 0x94, 0x72, - 0x84, 0x82, 0x3A, 0xCD, 0x04, 0xCD, 0xF9, 0x13, 0xBD, 0xFA, 0x84, 0x70, 0x82, 0x56, 0xA6, 0xD7, - 0x78, 0xC4, 0x6C, 0xCE, 0xAF, 0x6D, 0xC6, 0xAC, 0x4B, 0x99, 0xAF, 0x7C, 0xD8, 0x82, 0x6C, 0x6E, - 0x2F, 0x5E, 0x14, 0xEE, 0xED, 0xC8, 0xD1, 0xFE, 0x2B, 0xD5, 0xC5, 0x05, 0x90, 0xD7, 0xD3, 0x18, - 0x5A, 0x64, 0x45, 0x9E, 0xC3, 0xDD, 0xDD, 0x37, 0x7B, 0xDF, 0xF7, 0x94, 0xA2, 0x1A, 0xF6, 0xA4, - 0xFE, 0x90, 0xE2, 0xF5, 0xCE, 0x8E, 0x8A, 0xFB, 0x96, 0x69, 0xAF, 0x60, 0xB2, 0xB6, 0x57, 0xB0, - 0x55, 0x22, 0x4A, 0x5B, 0xC8, 0x11, 0x62, 0x42, 0xFD, 0x73, 0xFC, 0x88, 0x92, 0x73, 0xC6, 0x58, - 0x36, 0x06, 0x8E, 0x2A, 0x75, 0xEA, 0x7E, 0x81, 0xA4, 0xD9, 0x89, 0x55, 0x3E, 0x6A, 0x95, 0x6E, - 0xF1, 0xDC, 0x57, 0x32, 0x37, 0x43, 0xB2, 0x18, 0x6F, 0xAB, 0x45, 0x89, 0x3C, 0xE3, 0x54, 0xDA, - 0xC1, 0x72, 0xA5, 0xE2, 0xD4, 0x30, 0xE7, 0xAE, 0xAD, 0xB2, 0xD4, 0xF4, 0x9D, 0xD5, 0xE0, 0xBC, - 0x72, 0x81, 0x4D, 0x7E, 0xDB, 0x47, 0xD8, 0x44, 0x23, 0x85, 0xCC, 0x7C, 0x16, 0x85, 0x14, 0x1D, - 0xCD, 0x32, 0x0F, 0x80, 0xBC, 0x5E, 0x96, 0x9B, 0x3F, 0xC4, 0xF5, 0xC5, 0xD0, 0x82, 0xB4, 0x71, - 0x1D, 0xA0, 0xA3, 0x1A, 0x20, 0x1E, 0x70, 0x32, 0xC6, 0xE9, 0x47, 0x14, 0xC5, 0xE1, 0x47, 0xA6, - 0x1F, 0xB0, 0xEA, 0xA5, 0xEB, 0x8C, 0xE5, 0x52, 0xBD, 0x3C, 0x38, 0x2D, 0x8F, 0xAC, 0x04, 0x1D, - 0xFC, 0x51, 0xD3, 0xDD, 0x88, 0x94, 0x0D, 0xC4, 0x94, 0x7D, 0xE4, 0xD5, 0xBC, 0x2F, 0x32, 0xB4, - 0x67, 0x98, 0x46, 0x8E, 0x57, 0xC0, 0x18, 0x38, 0x3F, 0x5A, 0xF6, 0xEB, 0x5A, 0xDF, 0x79, 0x34, - 0x9B, 0x3D, 0x82, 0x2F, 0x60, 0x05, 0x0E, 0x7E, 0x18, 0x45, 0xAD, 0x54, 0x90, 0xAF, 0x71, 0x0A, - 0x7E, 0x5A, 0xB4, 0x03, 0x2C, 0x6E, 0x27, 0x4A, 0x4C, 0x59, 0x9B, 0xB9, 0x15, 0x68, 0xAD, 0x3F, - 0x3F, 0x8D, 0xD4, 0x2D, 0xC9, 0xBE, 0xA4, 0xFA, 0xD0, 0xC5, 0xB2, 0x06, 0x94, 0x2E, 0x91, 0x5B, - 0x24, 0x4B, 0x96, 0xC3, 0xED, 0xAD, 0xED, 0xEF, 0x94, 0x57, 0x95, 0x67, 0x80, 0x86, 0x9C, 0xDA, - 0x7A, 0xB3, 0xDB, 0x13, 0xB1, 0x2D, 0xFB, 0x7B, 0xAF, 0x7B, 0x22, 0xB6, 0xE5, 0xF6, 0x5E, 0x7F, - 0x47, 0x5B, 0x08, 0x76, 0xC4, 0x9B, 0x87, 0xDD, 0x9D, 0xED, 0x5D, 0xF1, 0xE8, 0xE1, 0xCD, 0x76, - 0x7F, 0x4B, 0x04, 0xB7, 0x14, 0xD1, 0x30, 0x13, 0x1D, 0x03, 0x33, 0xD2, 0xB1, 0x32, 0x6F, 0x82, - 0xD8, 0xDB, 0xD9, 0xDD, 0x7B, 0x05, 0xE0, 0x9C, 0x41, 0xDE, 0x7A, 0xB3, 0x07, 0xE0, 0x38, 0x88, - 0xBD, 0x57, 0xDB, 0x6F, 0xDE, 0x00, 0x78, 0xAF, 0x5F, 0x53, 0xDC, 0xF1, 0xBF, 0xB6, 0x5F, 0x01, - 0x38, 0x63, 0x50, 0xB6, 0xB6, 0x7B, 0x00, 0x5E, 0xB0, 0xB6, 0xAF, 0xB6, 0x76, 0x01, 0x9C, 0xB2, - 0xBF, 0xB6, 0x5E, 0x03, 0x78, 0xC8, 0xAA, 0xBD, 0xD9, 0xDE, 0x01, 0xF0, 0x96, 0x75, 0xBB, 0xB3, - 0xB7, 0x0B, 0xE0, 0x93, 0xB0, 0x64, 0xEC, 0x00, 0xF8, 0xC0, 0xBF, 0xEE, 0xBD, 0x01, 0xF0, 0x98, - 0xFD, 0xD5, 0xDB, 0xDD, 0x05, 0xF0, 0x94, 0x37, 0x65, 0x65, 0x5F, 0x59, 0xBD, 0x37, 0x3B, 0x7D, - 0x00, 0xCF, 0x59, 0x17, 0xFD, 0xDE, 0x2B, 0x00, 0x8F, 0x58, 0xD9, 0xAB, 0x9D, 0x1D, 0x00, 0x0F, - 0x38, 0xCA, 0xAF, 0x76, 0x00, 0x7C, 0xD4, 0x8F, 0x3D, 0xDE, 0xB3, 0x7A, 0xAF, 0x18, 0x2A, 0x97, - 0xEA, 0xB1, 0xC7, 0x47, 0xD6, 0xED, 0xAB, 0xED, 0x3E, 0x80, 0x67, 0x81, 0x3B, 0x4F, 0x05, 0xE9, - 0x23, 0x77, 0x43, 0x59, 0xA6, 0xC4, 0xA1, 0x61, 0x5F, 0x9E, 0x1D, 0x54, 0xD0, 0x0C, 0x6E, 0x12, - 0x93, 0x9B, 0xC0, 0x89, 0xDE, 0x04, 0x1E, 0xFC, 0x43, 0x9C, 0x21, 0x35, 0x23, 0xE5, 0x6D, 0x20, - 0x58, 0xE4, 0x6A, 0x27, 0x50, 0xEA, 0xE1, 0x6D, 0x86, 0x1F, 0x08, 0x53, 0xA0, 0x25, 0xE7, 0x7C, - 0x45, 0x4F, 0x47, 0xF8, 0x21, 0x15, 0xB6, 0x0B, 0xC3, 0xEC, 0x2E, 0xCB, 0x2F, 0x10, 0x4A, 0x4B, - 0x85, 0x9F, 0x33, 0x44, 0x48, 0xAD, 0xF6, 0x3C, 0x9D, 0x65, 0x78, 0xC4, 0xA3, 0xD9, 0x1F, 0xA1, - 0x30, 0xFA, 0x05, 0x3D, 0x15, 0xDF, 0x70, 0x2A, 0xEC, 0xE9, 0x1F, 0xF1, 0xBD, 0xED, 0x89, 0xC6, - 0xBD, 0xFD, 0x89, 0x46, 0xB5, 0x4D, 0x09, 0x4C, 0xE5, 0x25, 0x08, 0xEB, 0x6E, 0x6D, 0xC0, 0xBA, - 0xB2, 0x68, 0x58, 0x01, 0x25, 0xCE, 0x19, 0xEB, 0x43, 0x33, 0xEB, 0xEB, 0xE6, 0x15, 0x98, 0x17, - 0xEA, 0x15, 0xA6, 0xB8, 0xA8, 0x5C, 0x1F, 0xB8, 0xB5, 0x61, 0x1D, 0x60, 0xA5, 0xBB, 0xCB, 0x98, - 0xF2, 0xA0, 0x25, 0xCF, 0xEA, 0xAA, 0xD6, 0xA8, 0x0C, 0xA8, 0xD2, 0xC5, 0x7B, 0xEE, 0xDD, 0xBD, - 0x2E, 0xEC, 0xA2, 0xB6, 0x6C, 0x5A, 0x81, 0xC6, 0x03, 0xCD, 0xAC, 0x0B, 0xEE, 0x46, 0x44, 0xB0, - 0x7B, 0x46, 0x75, 0x15, 0xFC, 0x4F, 0x7E, 0x78, 0x66, 0xCB, 0xCB, 0xF0, 0xF6, 0xF9, 0x0D, 0x7F, - 0x8B, 0x93, 0x84, 0x9D, 0xD1, 0xD7, 0x6E, 0x42, 0x10, 0x9D, 0xEB, 0x18, 0x64, 0x49, 0x71, 0x81, - 0x50, 0x6E, 0xAF, 0xCE, 0x0A, 0x32, 0x67, 0x12, 0xE3, 0x00, 0x7D, 0x45, 0xC1, 0xAF, 0x3E, 0x4E, - 0xF8, 0xA7, 0x11, 0xF2, 0x6E, 0x8D, 0x5B, 0x08, 0x50, 0x03, 0xEB, 0x5B, 0x1F, 0x04, 0xAD, 0x0F, - 0xFD, 0x7D, 0xF5, 0xE8, 0xAF, 0x4F, 0x82, 0xC5, 0x65, 0x9A, 0x36, 0xE2, 0xAE, 0x0D, 0xF5, 0xC0, - 0x3F, 0xAA, 0xB6, 0x56, 0x60, 0xAD, 0xCD, 0x09, 0xA2, 0xF2, 0x4F, 0xEF, 0xD1, 0x3F, 0xA9, 0xB5, - 0x6D, 0xC2, 0xC8, 0x1E, 0x4B, 0x90, 0xDF, 0x95, 0x48, 0x03, 0x2E, 0x5F, 0xD6, 0xFC, 0xC0, 0xC6, - 0x98, 0xD5, 0x3C, 0xA6, 0x49, 0xF6, 0xE5, 0x37, 0xA3, 0x8D, 0x71, 0x12, 0xED, 0xA0, 0xCE, 0x8D, - 0x88, 0x2C, 0x9E, 0xB4, 0x90, 0xC8, 0xD6, 0xFA, 0xB4, 0xFC, 0x4C, 0x90, 0x17, 0x28, 0x8D, 0x44, - 0xD8, 0xBE, 0x52, 0xC8, 0xC1, 0x19, 0xCE, 0xA8, 0x28, 0x7E, 0x36, 0x8A, 0x04, 0x51, 0x03, 0x56, - 0xC6, 0x7F, 0x3F, 0x13, 0x88, 0xD0, 0xE2, 0x88, 0x34, 0x24, 0x9D, 0x73, 0x6C, 0x4A, 0x81, 0x40, - 0x59, 0x41, 0xB9, 0x52, 0x4B, 0xE0, 0xCB, 0x4A, 0x1F, 0xE2, 0xD9, 0x75, 0x2D, 0x88, 0x27, 0x2B, - 0x95, 0x17, 0x7D, 0xF6, 0xD8, 0x8A, 0xF7, 0xFE, 0x18, 0x67, 0x0F, 0x61, 0x26, 0x1E, 0xF9, 0x82, - 0x06, 0xE0, 0x7A, 0x7B, 0xB1, 0x6C, 0x5C, 0xDF, 0x0C, 0xD5, 0x10, 0xA2, 0x36, 0x09, 0xFD, 0xCD, - 0x70, 0x95, 0x54, 0x6B, 0x12, 0x73, 0xDF, 0x05, 0xF8, 0x32, 0xBC, 0x6D, 0x10, 0x82, 0x0D, 0xF3, - 0x54, 0xBE, 0x6B, 0xB1, 0x04, 0x92, 0xE5, 0xC1, 0xFF, 0x74, 0x1C, 0x59, 0x7E, 0xA1, 0xDA, 0x18, - 0x4E, 0xD6, 0xEB, 0xC1, 0x4B, 0xEB, 0x69, 0x52, 0xF9, 0x7F, 0xA9, 0xF3, 0x0C, 0xA1, 0x78, 0xFA, - 0x0B, 0x7A, 0xE2, 0xA3, 0x51, 0x21, 0x13, 0xA4, 0x5A, 0xDC, 0xE8, 0x1B, 0x66, 0x71, 0x4F, 0x33, - 0xDC, 0xC2, 0x8A, 0xC0, 0x53, 0xAD, 0x4F, 0xD8, 0x4B, 0x90, 0xF4, 0x6B, 0x4C, 0xB9, 0x93, 0x55, - 0x5F, 0x62, 0xCA, 0x62, 0xB1, 0xE9, 0xC9, 0x8A, 0x3C, 0x08, 0x6B, 0xAD, 0x1E, 0x2B, 0x2D, 0x55, - 0xD3, 0x71, 0x6B, 0x6B, 0x55, 0x2B, 0xB3, 0x5D, 0x6B, 0x75, 0x19, 0xDE, 0xDA, 0x1B, 0x15, 0x53, - 0x59, 0x6A, 0xA3, 0x76, 0xAC, 0x7A, 0x23, 0xF5, 0x45, 0x56, 0xB7, 0xAD, 0xB9, 0xC2, 0x38, 0x45, - 0x27, 0x68, 0xAA, 0x5D, 0x8F, 0x0A, 0xFB, 0x0A, 0x15, 0xE1, 0x03, 0x16, 0xDC, 0xA7, 0x1E, 0xC6, - 0x81, 0xEB, 0x0E, 0xC9, 0x43, 0x4C, 0x47, 0x13, 0x8F, 0x8A, 0x77, 0xA3, 0x60, 0x31, 0x0A, 0x09, - 0x72, 0xB6, 0x76, 0xF7, 0x06, 0x28, 0x70, 0xC7, 0x38, 0x43, 0x22, 0xAB, 0x8F, 0xCB, 0x2A, 0xF7, - 0x7B, 0xAE, 0x70, 0x63, 0x1F, 0xCA, 0x4A, 0xAF, 0x58, 0xA5, 0x22, 0xF5, 0x8F, 0xA8, 0xD4, 0xAF, - 0x54, 0x7A, 0xCD, 0x2A, 0x09, 0x3F, 0x0D, 0x51, 0x61, 0x4B, 0x55, 0x90, 0xC9, 0x5B, 0xD8, 0xF7, - 0x30, 0x25, 0x31, 0xFF, 0xBA, 0x33, 0x74, 0x37, 0x25, 0x2E, 0xB9, 0x46, 0x8D, 0x69, 0xE3, 0x12, - 0xB3, 0xDE, 0x40, 0x9D, 0x71, 0x8E, 0x7D, 0x11, 0xC7, 0x81, 0x62, 0x4E, 0x83, 0xF3, 0x9F, 0xDE, - 0x7B, 0x02, 0x0C, 0xE7, 0xA4, 0x3A, 0x19, 0x44, 0x75, 0xE2, 0xB3, 0x3A, 0x57, 0xB2, 0x8B, 0xEB, - 0x41, 0x63, 0x3D, 0x1E, 0x2E, 0x50, 0x98, 0x3F, 0x70, 0xA6, 0xBF, 0xD5, 0x22, 0xE4, 0x7C, 0xF9, - 0x71, 0x81, 0xFD, 0xC3, 0x9E, 0x7F, 0x7C, 0x71, 0x98, 0x5F, 0xFF, 0xB8, 0x88, 0xF3, 0xE1, 0x8F, - 0x0B, 0xAF, 0x07, 0xBF, 0xFA, 0x14, 0x9F, 0xDF, 0xDD, 0x8A, 0x58, 0x58, 0xC0, 0x23, 0x20, 0xE7, - 0xF5, 0xFA, 0x37, 0xC7, 0x17, 0x87, 0x07, 0x9F, 0x8F, 0x8F, 0xFC, 0x8B, 0xCB, 0xFC, 0x0B, 0x30, - 0x09, 0xD5, 0x1F, 0xC4, 0x63, 0x63, 0x00, 0xC0, 0x82, 0x98, 0x48, 0x64, 0xC9, 0x47, 0x4B, 0xF8, - 0x92, 0x46, 0xE5, 0xC1, 0x04, 0xC7, 0x7E, 0x76, 0x77, 0x1B, 0x2A, 0x8A, 0x78, 0xBE, 0xEF, 0x53, - 0x31, 0x1A, 0xFE, 0x62, 0xA3, 0x88, 0xF3, 0x19, 0x07, 0xCA, 0xFC, 0xB1, 0x02, 0xFE, 0x55, 0xDC, - 0x0E, 0x34, 0x37, 0x67, 0xDA, 0x46, 0xCB, 0x0C, 0x11, 0x8A, 0x33, 0xC1, 0xA5, 0x9A, 0xC7, 0xF2, - 0x3C, 0x57, 0x8A, 0x96, 0x38, 0x14, 0x55, 0xF4, 0xAE, 0x56, 0x89, 0xC2, 0xD7, 0x89, 0x10, 0x73, - 0x95, 0x35, 0x22, 0x0A, 0x89, 0x4C, 0x8F, 0x95, 0xCB, 0xE8, 0x3E, 0xC2, 0xBA, 0xA0, 0x32, 0x91, - 0x49, 0xE3, 0x81, 0xFA, 0x29, 0x43, 0x00, 0x2D, 0x64, 0x98, 0x1A, 0x11, 0xE0, 0x9A, 0x1F, 0xAE, - 0xD5, 0xFA, 0x12, 0xE7, 0xF6, 0x73, 0x14, 0xF2, 0x38, 0x31, 0x11, 0x12, 0x5B, 0xA5, 0xF4, 0x74, - 0xD4, 0x01, 0x3A, 0xD0, 0xBE, 0x7E, 0x79, 0x53, 0x0F, 0x04, 0x55, 0x3C, 0xE9, 0x2A, 0xF9, 0x5C, - 0xDA, 0x82, 0x06, 0xAB, 0xD0, 0x51, 0x4C, 0x41, 0xBD, 0xB1, 0x46, 0x95, 0xE2, 0xAD, 0x6C, 0x4E, - 0x9C, 0x00, 0x0C, 0x6A, 0xCE, 0xCC, 0x36, 0xD8, 0x35, 0x79, 0xAA, 0x2F, 0x59, 0x60, 0x0B, 0x42, - 0xCA, 0x92, 0xA1, 0x42, 0x38, 0xCA, 0xF0, 0x39, 0x32, 0x58, 0xB1, 0x24, 0xB2, 0xB9, 0x50, 0xAA, - 0x01, 0xA7, 0x88, 0xD2, 0x91, 0x94, 0x4D, 0xB1, 0x6D, 0x51, 0xA9, 0x15, 0xB5, 0xE9, 0x5E, 0x9D, - 0xA8, 0x10, 0xF2, 0xC2, 0x80, 0x27, 0x14, 0x81, 0x0B, 0xFA, 0x94, 0x20, 0x7D, 0x92, 0x56, 0xC1, - 0xDB, 0x2B, 0x4E, 0x84, 0x22, 0xA2, 0xA6, 0x56, 0xEC, 0x27, 0xF8, 0x41, 0x34, 0xF6, 0x40, 0xF9, - 0xC0, 0x23, 0xB5, 0xC8, 0xFC, 0x56, 0x6C, 0x05, 0xC2, 0x38, 0x58, 0xB9, 0x52, 0x95, 0x7B, 0x96, - 0x62, 0x9B, 0x86, 0x4D, 0x4B, 0x40, 0xA8, 0xD2, 0x48, 0x6E, 0x31, 0x65, 0xBE, 0x53, 0x01, 0xB5, - 0x60, 0x49, 0xF5, 0x34, 0xD8, 0x58, 0x3D, 0xF3, 0x53, 0xBF, 0x24, 0xD2, 0xFF, 0x08, 0x12, 0x9F, - 0xB9, 0x8D, 0x84, 0x54, 0xCE, 0x76, 0x65, 0x5A, 0xCA, 0x0D, 0x52, 0xD2, 0xED, 0x86, 0x3C, 0xA5, - 0x23, 0x35, 0x58, 0xCF, 0x78, 0x17, 0xA2, 0x06, 0xAB, 0x1E, 0x80, 0xC8, 0xA1, 0xC4, 0x44, 0xCC, - 0xC3, 0x49, 0xAA, 0xFC, 0x86, 0xF5, 0x1B, 0x9A, 0x22, 0xD1, 0xDD, 0xCF, 0x3C, 0x07, 0x23, 0xAB, - 0x2B, 0xCA, 0xD2, 0x3B, 0xFD, 0x8C, 0xA4, 0xCC, 0xF5, 0xA5, 0x77, 0x24, 0x72, 0x9A, 0x14, 0xCD, - 0x6E, 0x43, 0x82, 0x36, 0x2B, 0x34, 0x2D, 0xD5, 0x30, 0x9C, 0x50, 0x2A, 0x2F, 0xCB, 0x95, 0x9C, - 0x2C, 0xDF, 0x9C, 0xC8, 0x66, 0x8F, 0x6A, 0x2E, 0x12, 0xD2, 0xED, 0x83, 0x22, 0x2A, 0xF7, 0x9A, - 0xB1, 0xEB, 0xA0, 0x7C, 0x51, 0xF9, 0x5B, 0x1C, 0xD1, 0x89, 0x17, 0x1B, 0x81, 0x12, 0x57, 0x02, - 0xE0, 0x71, 0xD1, 0x5E, 0x64, 0xCA, 0x0F, 0x46, 0x0D, 0xEB, 0xC5, 0x33, 0x11, 0x08, 0x83, 0x78, - 0xED, 0x26, 0xBC, 0xCB, 0x61, 0x99, 0x7B, 0x8D, 0xC8, 0x6B, 0xE1, 0xA6, 0xCB, 0xA3, 0xB1, 0x59, - 0xBE, 0x53, 0x3C, 0x0B, 0x70, 0xF3, 0x67, 0x11, 0xE3, 0x2D, 0x6D, 0xAE, 0x20, 0xE3, 0xBD, 0x91, - 0xE6, 0x1A, 0x6C, 0xFE, 0x7E, 0x5E, 0x59, 0x4B, 0x85, 0x7D, 0xEB, 0xEE, 0xBA, 0xF9, 0x4D, 0x9C, - 0xC6, 0xF4, 0xA7, 0x04, 0xDF, 0x86, 0x89, 0x36, 0x3C, 0xDF, 0xC6, 0x69, 0xF4, 0x0B, 0x7A, 0xD2, - 0x09, 0x34, 0x4C, 0xFD, 0x37, 0x59, 0x15, 0x65, 0x41, 0x07, 0x59, 0x18, 0xE1, 0xD9, 0x93, 0x0B, - 0xB9, 0xEF, 0x3B, 0xFF, 0x30, 0x09, 0x89, 0x36, 0x0F, 0x79, 0x80, 0x47, 0x25, 0x4D, 0xCD, 0x88, - 0x6B, 0x40, 0xBF, 0x57, 0xD3, 0xC1, 0xC1, 0x14, 0x4F, 0xF3, 0xD7, 0xCC, 0x8A, 0xA3, 0x51, 0xF0, - 0x8E, 0x37, 0xAD, 0x46, 0x4D, 0xD3, 0xED, 0xD5, 0x68, 0x6B, 0x02, 0x42, 0xAA, 0x2F, 0xCF, 0x1A, - 0x8E, 0x06, 0xE6, 0xF2, 0x78, 0x69, 0xFC, 0x15, 0xC8, 0xF7, 0x50, 0xC5, 0x80, 0x32, 0xF2, 0x63, - 0xF2, 0x21, 0xCE, 0xD0, 0x18, 0x3F, 0xEE, 0x7F, 0x07, 0x44, 0x23, 0x6C, 0x06, 0x27, 0xF6, 0x16, - 0x7F, 0x60, 0x70, 0x3B, 0xA7, 0x14, 0xA7, 0x92, 0xCA, 0xB5, 0xF8, 0x6D, 0x0D, 0xB4, 0x12, 0xD7, - 0x21, 0xC7, 0x25, 0x9F, 0xFD, 0xEA, 0x64, 0x48, 0xDB, 0x99, 0xF4, 0x2E, 0xAB, 0x46, 0x79, 0x23, - 0xBF, 0xE1, 0x2C, 0xE2, 0xF3, 0x35, 0xF8, 0x2E, 0xD6, 0x49, 0x19, 0x62, 0x53, 0x94, 0xCE, 0xE5, - 0xA0, 0xFE, 0x69, 0xC3, 0xE0, 0xB3, 0x74, 0x1A, 0xA7, 0xF3, 0x47, 0xB9, 0x89, 0x7C, 0xDB, 0x88, - 0xC2, 0xF9, 0xE3, 0x88, 0x81, 0x97, 0xC3, 0xE9, 0xD7, 0xE7, 0xA8, 0x2D, 0x08, 0xDF, 0x3A, 0xE3, - 0x14, 0xA7, 0x3D, 0x63, 0xED, 0x2E, 0xBE, 0x87, 0xD9, 0xBF, 0xA2, 0xA7, 0xF9, 0x4C, 0x20, 0x2B, - 0xE8, 0xF7, 0x15, 0x3D, 0xF1, 0xB7, 0xB5, 0x80, 0x87, 0x98, 0xF8, 0x86, 0x15, 0x50, 0x82, 0x5D, - 0xB0, 0xAB, 0x86, 0xCE, 0x9F, 0xFC, 0xFE, 0x51, 0xF0, 0x67, 0x19, 0x22, 0xA4, 0xD2, 0x01, 0xBF, - 0x1F, 0xF8, 0x63, 0x7A, 0x30, 0xF6, 0x65, 0xEE, 0xE1, 0x57, 0x4A, 0xAD, 0x51, 0xDF, 0xB4, 0xAB, - 0xD5, 0x1B, 0xF2, 0x6C, 0x7C, 0x1B, 0x02, 0x42, 0x0D, 0x34, 0xC7, 0xDA, 0x8A, 0x80, 0xA8, 0xDE, - 0x64, 0x8E, 0xFA, 0x36, 0x14, 0x10, 0x3B, 0xE9, 0xAE, 0x4B, 0x01, 0x94, 0x46, 0xDF, 0x3F, 0x7E, - 0xE9, 0x40, 0x5E, 0x8C, 0x99, 0x17, 0x68, 0x4B, 0x9B, 0x6D, 0x86, 0xC5, 0x7A, 0xD7, 0x09, 0x80, - 0xDA, 0xB0, 0x95, 0x9A, 0x75, 0x51, 0xAE, 0x62, 0xF8, 0x0A, 0x07, 0x18, 0xEE, 0x31, 0xA7, 0x4F, - 0x3A, 0x4C, 0x4B, 0x42, 0xF5, 0x14, 0x4C, 0xDA, 0xD7, 0x5D, 0xE6, 0x12, 0x26, 0x4E, 0xE8, 0x08, - 0x1B, 0x8E, 0xA3, 0xB4, 0x4A, 0x17, 0x0C, 0x11, 0x57, 0xE8, 0xD2, 0x14, 0x8D, 0x28, 0x8A, 0x94, - 0xD6, 0x97, 0xE0, 0xBB, 0x42, 0xA3, 0xBD, 0x9D, 0xDF, 0x15, 0xC0, 0xB8, 0x67, 0x9E, 0xF3, 0x10, - 0x12, 0x67, 0x14, 0x26, 0x09, 0x8A, 0x1C, 0x9C, 0x3A, 0x61, 0xAA, 0x00, 0x8A, 0x64, 0xD9, 0xEC, - 0x6B, 0x8A, 0xA9, 0x23, 0x02, 0x58, 0x89, 0xBC, 0xED, 0x74, 0x82, 0x9C, 0xA3, 0xB3, 0x8F, 0x5A, - 0x5F, 0x55, 0xF7, 0x76, 0x01, 0xF2, 0xF1, 0x43, 0x8A, 0xB2, 0x23, 0xF9, 0xBB, 0xA4, 0xF5, 0x06, - 0xE5, 0xBA, 0x2D, 0x19, 0xB3, 0xD4, 0x80, 0xA2, 0x38, 0x0B, 0xDC, 0x84, 0x66, 0x6E, 0xEB, 0x31, - 0x44, 0x85, 0x51, 0x6E, 0x56, 0xB2, 0x8B, 0x27, 0x4F, 0xD5, 0x3A, 0xE5, 0xA0, 0xD6, 0x34, 0xBC, - 0xE5, 0xE7, 0x67, 0x17, 0xBA, 0x3D, 0x1E, 0x7B, 0xBF, 0x16, 0x64, 0x5D, 0x59, 0xC2, 0xB4, 0xFA, - 0x7A, 0x26, 0x87, 0xA1, 0x46, 0xFC, 0x21, 0x0B, 0xEF, 0xF8, 0x78, 0x94, 0x27, 0x8D, 0x4A, 0x0E, - 0x2D, 0xC7, 0xA9, 0x1B, 0x58, 0x33, 0x85, 0x55, 0x2A, 0xDB, 0x5F, 0x6D, 0xA9, 0x4A, 0x2E, 0x80, - 0xB1, 0x25, 0x0C, 0x7C, 0x05, 0x46, 0x15, 0xB4, 0x38, 0x81, 0xB3, 0x4D, 0x61, 0x3D, 0x54, 0x8A, - 0xFA, 0x76, 0x6C, 0x8C, 0x7C, 0xCB, 0x8D, 0xC3, 0x68, 0x46, 0xB2, 0x80, 0x0E, 0x2C, 0x5B, 0x50, - 0x2B, 0x86, 0xA5, 0x9A, 0x8D, 0xB8, 0x21, 0x54, 0x64, 0x56, 0x13, 0x69, 0xE7, 0x8B, 0xEC, 0x87, - 0xAD, 0xE3, 0xAF, 0x54, 0xB6, 0x77, 0x20, 0xB3, 0xE8, 0xDB, 0x51, 0xAA, 0x8F, 0xBA, 0x02, 0xD3, - 0x3A, 0x7F, 0xE5, 0x3D, 0xB8, 0xBC, 0x4B, 0xD7, 0x31, 0x56, 0x5F, 0xDC, 0x4A, 0xCD, 0x36, 0x74, - 0xBB, 0x8D, 0x8D, 0x6C, 0xF9, 0xE6, 0xC2, 0x5B, 0x94, 0xB8, 0x30, 0x32, 0x1F, 0xDE, 0x08, 0x1D, - 0xE6, 0x70, 0x92, 0xE1, 0x29, 0x3A, 0xBB, 0x90, 0x52, 0xA6, 0x0D, 0xC8, 0x74, 0x9E, 0xD0, 0x98, - 0x1D, 0x25, 0x5C, 0xE8, 0x8E, 0xC3, 0x84, 0xA0, 0x55, 0x3D, 0xCF, 0x29, 0x96, 0x99, 0xEC, 0x5D, - 0xE8, 0xE2, 0xF1, 0x78, 0x9D, 0xFA, 0xE1, 0x2C, 0xA6, 0x61, 0xC2, 0xC3, 0xD1, 0xAF, 0xD1, 0x84, - 0xCC, 0x50, 0x92, 0xF0, 0x30, 0x34, 0x8D, 0x38, 0xD5, 0x52, 0x67, 0x32, 0xCD, 0xFF, 0xBD, 0x70, - 0x2A, 0x78, 0xFE, 0x9D, 0xDF, 0x13, 0x77, 0x5E, 0x28, 0x37, 0xAF, 0xE8, 0x60, 0xE9, 0x3C, 0x49, - 0x36, 0x0C, 0xE3, 0x92, 0x96, 0x94, 0xD2, 0x8C, 0xCB, 0x4E, 0xF3, 0xA0, 0xD3, 0x29, 0x79, 0x90, - 0x96, 0xB2, 0x86, 0xAD, 0xBC, 0x3D, 0xBC, 0xF0, 0x4F, 0x9A, 0xB0, 0xB0, 0x8C, 0xEE, 0xFB, 0xB6, - 0x54, 0x99, 0x6F, 0xA5, 0x96, 0xFE, 0xAD, 0x62, 0xD8, 0xFA, 0xDE, 0x9D, 0xFB, 0x36, 0x99, 0x67, - 0x25, 0x65, 0xC1, 0x66, 0x1B, 0x2A, 0x1C, 0x78, 0xAB, 0xCB, 0xBA, 0xB6, 0xFE, 0xB4, 0x05, 0x4A, - 0x91, 0x65, 0x12, 0x66, 0x17, 0xF1, 0xDF, 0xD1, 0xF3, 0x67, 0x7C, 0xEA, 0x1F, 0x96, 0xDB, 0x56, - 0x36, 0x4B, 0x3B, 0x46, 0xCF, 0x99, 0x4A, 0x2B, 0xF8, 0x0A, 0xC2, 0x3A, 0xB3, 0x92, 0x61, 0x34, - 0x7E, 0xC6, 0x20, 0x3E, 0xFA, 0x97, 0xE6, 0x45, 0xC7, 0xFA, 0xC8, 0x99, 0xCD, 0x2C, 0x28, 0x98, - 0xE4, 0xE5, 0x89, 0x05, 0xFE, 0x07, 0x66, 0xA3, 0x7F, 0x3E, 0x82, 0xA7, 0xFE, 0xA1, 0x15, 0xC4, - 0x33, 0xE9, 0x58, 0x07, 0xD0, 0x8A, 0xA0, 0xF5, 0x95, 0xFF, 0x37, 0xFB, 0x30, 0xCC, 0xA4, 0xD3, - 0x7F, 0xA9, 0x67, 0xB6, 0x14, 0x6D, 0xC7, 0xB2, 0x67, 0x0C, 0xCC, 0x02, 0xB5, 0x62, 0xDC, 0xB3, - 0x5E, 0x71, 0x3E, 0x23, 0x0A, 0x81, 0x68, 0xA0, 0xBD, 0x81, 0xB8, 0xC1, 0xD2, 0x58, 0xD3, 0x96, - 0xEB, 0xD1, 0x32, 0xF0, 0xCC, 0x7E, 0x4F, 0x0A, 0x6B, 0x9A, 0x34, 0xEB, 0xBB, 0x7D, 0xC3, 0xAE, - 0x54, 0xAE, 0xEE, 0x80, 0xC6, 0x67, 0xAE, 0x41, 0xD9, 0xDA, 0x09, 0x75, 0xFD, 0x19, 0xCC, 0x47, - 0xFC, 0xC3, 0x6A, 0x6B, 0xDB, 0xB9, 0xBA, 0x8A, 0xDB, 0xDA, 0xC2, 0xA8, 0xA1, 0x21, 0xB2, 0x68, - 0x18, 0x31, 0x18, 0xD2, 0xEC, 0x69, 0xA1, 0x26, 0x44, 0xDF, 0x65, 0xF2, 0x29, 0x29, 0xE9, 0xAE, - 0xC6, 0x13, 0x1C, 0xDB, 0x94, 0x4C, 0x42, 0x22, 0x27, 0x3C, 0xF3, 0x74, 0xF6, 0x9D, 0x72, 0x15, - 0x82, 0xA8, 0xAE, 0x22, 0xF1, 0xE4, 0x74, 0x29, 0xDA, 0xA9, 0x11, 0x96, 0x83, 0xD9, 0xAE, 0x4D, - 0xD7, 0x43, 0xFF, 0xA3, 0x19, 0xD9, 0x61, 0x7D, 0x8E, 0x37, 0x9B, 0x59, 0x50, 0x90, 0x90, 0x94, - 0xF6, 0xF9, 0x0C, 0x8C, 0x32, 0x5F, 0x71, 0x7F, 0xB1, 0xA3, 0x99, 0x39, 0xEA, 0x10, 0xDC, 0xE8, - 0xC1, 0x3E, 0x68, 0xD0, 0x80, 0x1B, 0x75, 0xEA, 0x67, 0x39, 0xC1, 0x3C, 0xA5, 0x23, 0xD1, 0xF2, - 0x7D, 0x68, 0x1E, 0x38, 0x15, 0x54, 0x9F, 0xE8, 0x0A, 0xE2, 0xA2, 0xA0, 0xC1, 0xD5, 0x44, 0xD5, - 0x6F, 0x38, 0xD0, 0x16, 0x9E, 0x20, 0xA5, 0xF0, 0xCC, 0x55, 0x26, 0xE1, 0x57, 0xE3, 0x45, 0x55, - 0x7D, 0x0B, 0x54, 0xBA, 0xAA, 0xB0, 0x04, 0x0B, 0xAE, 0xC8, 0x05, 0xD3, 0x9D, 0xA7, 0xDE, 0x81, - 0x99, 0x51, 0xA7, 0x78, 0x4E, 0xDF, 0x96, 0x9B, 0xB7, 0x9E, 0xF5, 0xD5, 0x06, 0xB7, 0xA2, 0x15, - 0x54, 0x41, 0x58, 0x5C, 0x8D, 0xEA, 0x30, 0x56, 0x38, 0x1E, 0x3D, 0x23, 0x87, 0xEC, 0xEA, 0x09, - 0xAC, 0x59, 0x1B, 0xBF, 0x79, 0xAB, 0x99, 0xF8, 0x17, 0x56, 0xC3, 0x65, 0x29, 0xAE, 0x8A, 0xC5, - 0xDE, 0x99, 0xD4, 0x9C, 0xEC, 0xD6, 0x59, 0x8E, 0xF6, 0xBE, 0xEA, 0xF6, 0x78, 0x2B, 0x05, 0xAB, - 0xB5, 0x8C, 0x95, 0x60, 0x2C, 0x3C, 0xFB, 0x6A, 0xF4, 0xC3, 0x29, 0x9E, 0xF3, 0x30, 0x5C, 0x64, - 0x3E, 0xE3, 0xC6, 0x3B, 0xD1, 0x46, 0x18, 0xF6, 0x9B, 0xE6, 0xCC, 0xD2, 0x63, 0xC5, 0x01, 0xB5, - 0xEC, 0x22, 0x57, 0xF5, 0x4E, 0x6D, 0xF7, 0x96, 0x6B, 0x1E, 0xCF, 0x39, 0x8A, 0xB2, 0xF0, 0xA1, - 0x71, 0x93, 0x94, 0xF7, 0xE4, 0xE5, 0xCE, 0xA2, 0x72, 0x76, 0x69, 0xC8, 0xB7, 0xD0, 0xF9, 0x54, - 0xE2, 0xC4, 0xF3, 0x0D, 0x3D, 0x03, 0x11, 0x6E, 0x90, 0x96, 0xC2, 0x53, 0x5D, 0xA9, 0x14, 0x37, - 0x2D, 0x95, 0x4B, 0xD5, 0xCA, 0xB9, 0x45, 0x67, 0xD7, 0xAC, 0x9E, 0xB7, 0x64, 0x06, 0x96, 0x26, - 0x34, 0x54, 0xBA, 0x6B, 0xE1, 0x6E, 0x63, 0x74, 0xD7, 0xB8, 0x1E, 0x1A, 0xD8, 0x47, 0xDF, 0xEE, - 0x36, 0x04, 0x27, 0x5F, 0x79, 0x9A, 0xA8, 0x89, 0x6B, 0x57, 0x30, 0x53, 0xE9, 0x5C, 0xD1, 0xDC, - 0x2B, 0xB0, 0xF8, 0x9D, 0x9A, 0xE1, 0xDE, 0x9B, 0xD6, 0x54, 0x69, 0x6B, 0x5A, 0x5F, 0x3D, 0x5B, - 0x67, 0x99, 0x9F, 0xFB, 0xE2, 0xD5, 0x6B, 0xE1, 0x2B, 0xAA, 0xF6, 0xE6, 0x16, 0x95, 0xF2, 0x0F, - 0xB9, 0x2E, 0x6A, 0x20, 0x56, 0x35, 0x16, 0xA7, 0xC1, 0x9D, 0xEC, 0xE0, 0x69, 0xEE, 0xDB, 0x7E, - 0x28, 0x7F, 0xF3, 0xC5, 0x4A, 0x0E, 0xB8, 0xB3, 0xC9, 0x7E, 0x13, 0xEF, 0x46, 0x31, 0x47, 0xD0, - 0x6B, 0x37, 0xFE, 0x89, 0xCC, 0xF5, 0x5D, 0x8E, 0x6B, 0x97, 0xF3, 0x1B, 0x71, 0xD5, 0x95, 0x52, - 0x1D, 0xA6, 0xA8, 0xAD, 0x40, 0xAA, 0x3B, 0x1D, 0x52, 0x71, 0x54, 0xF9, 0x07, 0x38, 0x98, 0x58, - 0xB7, 0xA3, 0x72, 0x24, 0x06, 0x9C, 0x5E, 0xCC, 0xD0, 0x28, 0x1E, 0xC7, 0xA3, 0x92, 0xA3, 0x8C, - 0x5B, 0xC5, 0xAE, 0x7E, 0xF2, 0x5E, 0xE1, 0x68, 0x53, 0x28, 0xED, 0x72, 0xBC, 0xF8, 0x9E, 0x75, - 0x89, 0x1E, 0xCE, 0xE7, 0x09, 0xCA, 0xF8, 0x55, 0xBA, 0x1E, 0x71, 0xE9, 0x93, 0xE2, 0xAC, 0x6F, - 0xDE, 0x93, 0x8E, 0xFC, 0x33, 0x1B, 0xBC, 0x36, 0x55, 0xAA, 0xC2, 0xBF, 0x65, 0xCC, 0x57, 0x91, - 0xAA, 0x3E, 0x30, 0x79, 0x8B, 0xB6, 0xD1, 0x32, 0xBA, 0x4E, 0x47, 0x07, 0x5E, 0xAA, 0x60, 0x24, - 0x8B, 0x4B, 0x28, 0xFD, 0xE7, 0xA5, 0x54, 0x11, 0x13, 0xBD, 0x62, 0x28, 0xF0, 0xA7, 0x28, 0x24, - 0xF3, 0x0C, 0x15, 0x97, 0xF4, 0x42, 0xBC, 0xF5, 0x0A, 0xA5, 0xAB, 0xDB, 0x2F, 0xF6, 0xFE, 0xE2, - 0x92, 0x5F, 0x14, 0xDD, 0xC6, 0x69, 0xC4, 0x57, 0x6D, 0x91, 0x22, 0xB7, 0x38, 0x0E, 0x94, 0x3D, - 0x2D, 0xD7, 0x19, 0xE9, 0xDC, 0x3F, 0xC2, 0xD3, 0xF2, 0xF8, 0x56, 0xA9, 0x28, 0xF6, 0xF1, 0x1B, - 0x8A, 0x4B, 0x6E, 0xE0, 0x58, 0x8A, 0x3A, 0xA7, 0x9C, 0x56, 0x64, 0x0F, 0x43, 0x23, 0x8F, 0x60, - 0x29, 0x7E, 0x55, 0x49, 0x60, 0xFB, 0x77, 0x48, 0x04, 0xC9, 0x13, 0x9E, 0xDF, 0x32, 0x18, 0x14, - 0x57, 0x39, 0x4A, 0x24, 0xE7, 0x17, 0x3A, 0xB1, 0x74, 0x7B, 0xD9, 0xE8, 0xF3, 0x80, 0x1C, 0x04, - 0x66, 0x85, 0x5B, 0x28, 0x63, 0x91, 0x2C, 0x8E, 0xD0, 0xE5, 0xD3, 0x0C, 0x2D, 0x97, 0xA6, 0x2F, - 0xA6, 0x91, 0x2B, 0x63, 0x90, 0x05, 0xDB, 0x5B, 0xC6, 0xDB, 0x67, 0x79, 0xD7, 0x4B, 0xF6, 0x3D, - 0x12, 0x6C, 0xC3, 0xC2, 0x24, 0x58, 0xDC, 0x01, 0x13, 0xFD, 0xE3, 0xED, 0xF6, 0xBE, 0xFA, 0x73, - 0xB0, 0x0D, 0xC0, 0x80, 0x04, 0xFD, 0x4E, 0x01, 0xA0, 0x37, 0xD8, 0x31, 0x7E, 0xF5, 0x07, 0x5B, - 0xC6, 0xAF, 0xAD, 0xC1, 0xB6, 0xE1, 0x41, 0xA9, 0xD3, 0x5C, 0x0C, 0xB2, 0xA0, 0x07, 0x1B, 0xE0, - 0xD7, 0xEA, 0xF3, 0xAD, 0x61, 0x90, 0x05, 0xFD, 0x75, 0x5A, 0x3C, 0x4C, 0x10, 0x4A, 0xDC, 0x81, - 0x4C, 0x64, 0x8F, 0x0A, 0x55, 0x40, 0x04, 0x4C, 0x41, 0x52, 0x8D, 0x43, 0x91, 0x47, 0x41, 0x41, - 0xD2, 0x2C, 0xA0, 0x7E, 0x84, 0x12, 0x1A, 0xFE, 0xFE, 0xB6, 0xB7, 0xDF, 0x1B, 0xB0, 0x9E, 0x76, - 0x2A, 0x1E, 0xB0, 0xAA, 0xAE, 0x0C, 0x0F, 0xBD, 0xE1, 0x15, 0x11, 0x25, 0x2B, 0xF1, 0xEA, 0xDF, - 0xED, 0x00, 0x1E, 0x0F, 0xAD, 0xBA, 0x2B, 0x49, 0x07, 0x2F, 0x23, 0x26, 0xD8, 0x62, 0x84, 0x93, - 0x41, 0xCC, 0xF4, 0x2E, 0x98, 0xE1, 0x87, 0x41, 0xCC, 0xD6, 0x08, 0x7C, 0x1C, 0xC4, 0xFE, 0x23, - 0x7C, 0x1A, 0xC4, 0xFE, 0x13, 0x94, 0x23, 0x24, 0x3C, 0xBE, 0x09, 0x4E, 0x07, 0x19, 0x1C, 0xD1, - 0x2C, 0x19, 0x50, 0x9F, 0xFD, 0xF3, 0x0B, 0x7A, 0x82, 0x61, 0x42, 0x07, 0xD4, 0x0F, 0x13, 0xCA, - 0x7E, 0xF0, 0x1C, 0xC9, 0x03, 0x2A, 0x72, 0x25, 0xFF, 0x82, 0x9E, 0x72, 0x90, 0x2B, 0x4F, 0xDC, - 0x85, 0xA4, 0x3C, 0x7F, 0x17, 0x07, 0x39, 0x91, 0xC4, 0x9F, 0x82, 0xC2, 0x59, 0x78, 0x67, 0xFC, - 0x64, 0xFC, 0xC2, 0x7F, 0xE6, 0x30, 0x2B, 0x5A, 0xA2, 0xE0, 0x9D, 0xC7, 0x53, 0x55, 0x2A, 0x37, - 0x01, 0xA2, 0x5F, 0xF5, 0x6B, 0x3B, 0xB3, 0x35, 0x5F, 0xB9, 0xCE, 0x6D, 0x42, 0x7C, 0xF9, 0x27, - 0x50, 0x7F, 0xB2, 0x8E, 0x95, 0x50, 0x5C, 0x03, 0x88, 0x48, 0xFA, 0x62, 0xB4, 0xD5, 0x1A, 0x00, - 0x8F, 0x28, 0xC1, 0x2F, 0x5A, 0xC5, 0xD8, 0x34, 0xB2, 0xA5, 0xCF, 0xE2, 0x16, 0xB6, 0x18, 0xB2, - 0xC8, 0x02, 0x21, 0x47, 0xD3, 0xE9, 0xB0, 0x06, 0xB9, 0x41, 0x82, 0xD2, 0xE7, 0xE5, 0x92, 0x7F, - 0xCE, 0x87, 0x16, 0xD1, 0x5B, 0x9B, 0x6A, 0x9C, 0xAA, 0x50, 0x38, 0x66, 0xC0, 0x4D, 0xB4, 0xEF, - 0xB9, 0xFC, 0xFE, 0xD4, 0x55, 0xC1, 0x04, 0x5A, 0x82, 0x24, 0xE1, 0xBB, 0x53, 0x74, 0x8F, 0x12, - 0xFD, 0xB4, 0xB6, 0x76, 0x05, 0xFB, 0x3E, 0xE6, 0x79, 0x3C, 0x1D, 0x8A, 0x1D, 0x8E, 0xB2, 0x23, - 0xB4, 0x92, 0x81, 0xDB, 0xA0, 0x14, 0xA1, 0x47, 0x9E, 0x6F, 0x51, 0xE8, 0x44, 0x9E, 0xD6, 0x15, - 0x9E, 0xA3, 0xEF, 0x34, 0xA9, 0xCF, 0x5A, 0x85, 0x02, 0x03, 0xAF, 0x09, 0xDD, 0x5F, 0xD3, 0x5B, - 0x89, 0xF0, 0x38, 0xC3, 0xD3, 0x12, 0xCA, 0xFE, 0x6A, 0xEF, 0xC6, 0x67, 0xA1, 0xA3, 0xB4, 0x2F, - 0x00, 0x5F, 0x77, 0xD0, 0xBE, 0x64, 0x17, 0x06, 0x87, 0x31, 0xAC, 0x25, 0xB1, 0xBB, 0xC1, 0x5B, - 0x59, 0x51, 0x59, 0x33, 0x29, 0xFB, 0x11, 0x98, 0x1F, 0x06, 0xDE, 0xDA, 0x4C, 0x5A, 0x07, 0xC4, - 0xD6, 0x15, 0x80, 0xFD, 0x3D, 0x8E, 0x19, 0x67, 0xD6, 0x06, 0xAC, 0x84, 0x24, 0x83, 0x99, 0xA8, - 0x04, 0x17, 0xB3, 0x90, 0x90, 0xF8, 0x1E, 0x0D, 0x36, 0xFA, 0x39, 0x83, 0xC8, 0x4B, 0x03, 0xF9, - 0xB5, 0x19, 0x25, 0x09, 0x45, 0xD6, 0x2F, 0x1A, 0x0A, 0x34, 0xB6, 0x0A, 0xFA, 0xCC, 0x67, 0xCB, - 0xA5, 0xA7, 0xFF, 0x56, 0xE3, 0x9D, 0xCF, 0xF4, 0x94, 0x7E, 0xF3, 0x22, 0x9F, 0xCF, 0x64, 0x6F, - 0x3B, 0x45, 0x6F, 0x6C, 0xF9, 0x15, 0xFD, 0xB1, 0x5F, 0xAA, 0x47, 0xBE, 0xAC, 0x9F, 0xD1, 0x67, - 0x5D, 0x26, 0x98, 0x3F, 0x44, 0xCF, 0x79, 0xCB, 0x51, 0x41, 0xA5, 0x1C, 0xE0, 0xAB, 0x35, 0x58, - 0xA7, 0xD2, 0x33, 0xCF, 0x3A, 0x75, 0x7F, 0xB8, 0x78, 0xEC, 0xD5, 0xD3, 0xAE, 0x0A, 0xA8, 0xA5, - 0x93, 0xF0, 0x5A, 0xE7, 0x1A, 0x9D, 0x51, 0xA2, 0xB6, 0x0C, 0xC8, 0x04, 0xCF, 0x93, 0xE8, 0x03, - 0xCE, 0x46, 0xC6, 0x99, 0x1C, 0x01, 0x9D, 0xF6, 0xC2, 0x43, 0xC6, 0x14, 0xD5, 0xA4, 0x70, 0xC3, - 0x32, 0x79, 0x86, 0x1C, 0x6F, 0x5D, 0x68, 0xA5, 0x09, 0x2B, 0xCB, 0xF0, 0x6F, 0x38, 0x83, 0x43, - 0xC5, 0xE7, 0x8A, 0xBE, 0x1B, 0x8A, 0xE1, 0x0B, 0x5F, 0x67, 0xE9, 0x89, 0x3B, 0x09, 0xA5, 0x0A, - 0x70, 0x1B, 0x8E, 0xBE, 0x82, 0x72, 0x9A, 0xB6, 0x66, 0x65, 0x41, 0x38, 0x1F, 0x73, 0xC5, 0xA9, - 0xEA, 0x7F, 0xAC, 0xDD, 0xB4, 0x8B, 0xBD, 0xA0, 0xC9, 0xFD, 0x3B, 0x9C, 0xCD, 0x92, 0x58, 0x44, - 0xAC, 0x12, 0x96, 0xCF, 0x5F, 0xD0, 0x13, 0xD9, 0x77, 0xCF, 0xDC, 0x81, 0x7B, 0xE5, 0x82, 0x4D, - 0x0F, 0x15, 0x4A, 0x88, 0x7B, 0xE0, 0x0E, 0xDC, 0xF7, 0xAE, 0x88, 0x7C, 0x47, 0x02, 0xD7, 0xAD, - 0x24, 0xC7, 0xE2, 0x5E, 0xCF, 0xE1, 0x2D, 0xF1, 0x28, 0xE0, 0x39, 0x35, 0xC8, 0x66, 0x10, 0x0F, - 0x4D, 0x25, 0xB9, 0xD5, 0xB5, 0x9C, 0x14, 0x71, 0x80, 0xCD, 0xBD, 0x31, 0x37, 0x01, 0x68, 0x62, - 0x88, 0xC3, 0xDF, 0x6F, 0x8C, 0x9C, 0x1E, 0x02, 0xFB, 0xE5, 0xC9, 0x92, 0xB1, 0x9D, 0xF3, 0x1C, - 0x94, 0x25, 0xD4, 0xF3, 0x67, 0x90, 0xE2, 0xF9, 0x68, 0xA2, 0x9C, 0xD7, 0xD4, 0x34, 0xAE, 0xBF, - 0x0E, 0x40, 0x0B, 0xEE, 0x97, 0x0C, 0x34, 0x0F, 0x98, 0x53, 0x53, 0x09, 0x40, 0x09, 0xF1, 0xDE, - 0x37, 0x23, 0x2E, 0xB8, 0xFA, 0x1F, 0x81, 0xB7, 0x4C, 0xF2, 0xA6, 0x63, 0xAE, 0x37, 0x63, 0xCF, - 0xC8, 0x6E, 0x46, 0x94, 0x52, 0xB1, 0x1E, 0xAB, 0xA1, 0x04, 0xCB, 0x36, 0x83, 0x6A, 0xF0, 0x79, - 0x23, 0xD5, 0xBE, 0xC8, 0xCC, 0x6B, 0x7B, 0xD6, 0x21, 0x5D, 0xCD, 0x6A, 0xCF, 0x59, 0x6A, 0x86, - 0xD9, 0x86, 0x00, 0xFD, 0x5C, 0x34, 0x1D, 0x1A, 0xF6, 0x46, 0x26, 0x98, 0xF6, 0xDB, 0x14, 0x12, - 0x61, 0x9C, 0xEC, 0x8A, 0x0E, 0x5C, 0x69, 0x79, 0x69, 0x56, 0x18, 0x2A, 0xD5, 0xF3, 0xD2, 0xEB, - 0x92, 0xFA, 0x5B, 0x98, 0xE2, 0xC5, 0x43, 0x4C, 0x63, 0xEE, 0x04, 0x12, 0x29, 0xED, 0x76, 0x45, - 0x35, 0x1D, 0x9E, 0x7B, 0x9D, 0x17, 0x22, 0x20, 0x2F, 0x5F, 0xF9, 0x50, 0x18, 0x07, 0x3D, 0xF5, - 0xC2, 0xAA, 0xF6, 0xA9, 0xF5, 0x1C, 0x9D, 0x73, 0xBF, 0x6D, 0x36, 0x15, 0xDC, 0x59, 0x97, 0xFF, - 0x5A, 0xC3, 0xE1, 0x5C, 0xA6, 0x91, 0x3C, 0xB4, 0x3D, 0xDF, 0x2A, 0xA2, 0x0B, 0xD9, 0x5F, 0x77, - 0xA1, 0xB5, 0xB2, 0x63, 0xAE, 0x7A, 0x3B, 0x8F, 0x80, 0x06, 0x53, 0xB9, 0x37, 0x2F, 0xA7, 0x2C, - 0x69, 0xB8, 0x37, 0x6F, 0xF6, 0x6B, 0x9C, 0xCE, 0x09, 0x8F, 0xE2, 0xC7, 0x23, 0xFB, 0x45, 0xCE, - 0x38, 0xCE, 0x08, 0x75, 0x41, 0x25, 0x7F, 0x89, 0x1D, 0x6A, 0xB1, 0xDC, 0x11, 0x28, 0x49, 0xD1, - 0x26, 0x1B, 0x46, 0x1E, 0xA1, 0xFF, 0xAB, 0x83, 0x68, 0x45, 0xBE, 0xC0, 0xC5, 0xD3, 0x59, 0x2F, - 0x1A, 0x98, 0xE6, 0x0E, 0x51, 0x67, 0x1A, 0x66, 0x5F, 0x51, 0x56, 0x7D, 0x7B, 0x2B, 0x79, 0x54, - 0x7E, 0xCC, 0xC3, 0x28, 0xFA, 0xC8, 0xFF, 0xAC, 0x4E, 0xAF, 0xAC, 0x57, 0x7C, 0x2F, 0x71, 0x78, - 0xFD, 0x3D, 0xCF, 0xA6, 0x31, 0xDF, 0x85, 0x31, 0xB9, 0x16, 0xA8, 0xAF, 0x16, 0x7B, 0xC0, 0xB7, - 0x36, 0xCA, 0xCB, 0x6F, 0x36, 0x24, 0x8C, 0x8D, 0x06, 0x15, 0x48, 0xA9, 0x24, 0x16, 0x63, 0x72, - 0x01, 0x25, 0x97, 0xF7, 0x0C, 0xA5, 0x10, 0x7C, 0x75, 0x65, 0x0A, 0x51, 0x43, 0x89, 0xD2, 0xC9, - 0xCD, 0xEB, 0xB8, 0x38, 0x76, 0x00, 0xFB, 0x8D, 0x70, 0x8D, 0xB4, 0xF3, 0x03, 0xD7, 0x2D, 0x01, - 0xD5, 0x61, 0xD0, 0x8D, 0x67, 0xC3, 0xDF, 0x34, 0x46, 0x15, 0x26, 0x5C, 0x47, 0x7F, 0x5D, 0x85, - 0x0D, 0xDF, 0x2C, 0x45, 0x44, 0xF1, 0xF5, 0xAA, 0xF6, 0xAF, 0x8B, 0x48, 0xB2, 0x2B, 0x1A, 0x1C, - 0xA7, 0xD1, 0x7A, 0x90, 0x59, 0xC5, 0xFE, 0x75, 0x9E, 0x8B, 0x68, 0x54, 0x26, 0xA9, 0xC5, 0x0B, - 0xC0, 0x6A, 0x20, 0xB0, 0xB6, 0xCD, 0x87, 0x07, 0x00, 0xAB, 0xC2, 0x91, 0x53, 0x7F, 0x90, 0x24, - 0xDF, 0x0E, 0xD3, 0x00, 0x21, 0xC1, 0x69, 0x09, 0xDE, 0xB4, 0xFF, 0xB6, 0xC1, 0xE4, 0x5B, 0x70, - 0x15, 0x4E, 0x6E, 0x3C, 0x47, 0x28, 0x38, 0x61, 0xAD, 0x70, 0x44, 0x45, 0xEE, 0x08, 0x8B, 0x44, - 0xEF, 0x74, 0x36, 0xFA, 0x46, 0xE2, 0x2F, 0xFB, 0x96, 0x50, 0x58, 0xC9, 0x4A, 0x92, 0x54, 0x06, - 0x47, 0xF2, 0x63, 0xF2, 0x31, 0x1C, 0x49, 0x26, 0x54, 0x86, 0xFF, 0x69, 0x28, 0x0D, 0xE6, 0x27, - 0xE4, 0x23, 0xA2, 0x61, 0xA7, 0x83, 0xA4, 0x89, 0x4A, 0xBC, 0xE0, 0xD3, 0x47, 0x96, 0xBA, 0xA3, - 0xBB, 0x7C, 0x89, 0x61, 0x1C, 0x53, 0xAA, 0x37, 0x28, 0x38, 0x49, 0xCE, 0xD2, 0x5F, 0x09, 0xCA, - 0x4E, 0xD2, 0xD9, 0x5C, 0x99, 0xCE, 0x4D, 0xF1, 0xA3, 0x42, 0x55, 0x9A, 0x01, 0xEF, 0xD5, 0x22, - 0x29, 0xC7, 0x5E, 0x10, 0xD0, 0x2E, 0xF1, 0x7B, 0x4C, 0x29, 0x9E, 0x7A, 0x00, 0x6E, 0xF4, 0x87, - 0x74, 0xB9, 0x74, 0x8F, 0x50, 0x18, 0xB9, 0x3C, 0xD5, 0xEA, 0x57, 0xF4, 0xD4, 0xE9, 0xB8, 0x07, - 0x09, 0xFD, 0x29, 0x0B, 0x67, 0x13, 0x5D, 0xA6, 0x0D, 0x5F, 0xB6, 0x58, 0x4E, 0xBD, 0xC2, 0xB7, - 0xDB, 0xEB, 0xC1, 0xB1, 0x8F, 0xEE, 0xC3, 0x64, 0x1E, 0x52, 0xF4, 0x0B, 0x7A, 0xBA, 0xC5, 0x45, - 0x40, 0x09, 0x54, 0xDB, 0x9B, 0xD7, 0x3B, 0x2E, 0xC0, 0x3A, 0xF5, 0x61, 0x1B, 0xF1, 0x81, 0x4E, - 0xBB, 0x62, 0x7D, 0x9E, 0xBB, 0xCD, 0x78, 0x8E, 0x5B, 0x8C, 0x97, 0xCB, 0x2D, 0xFD, 0x77, 0xE5, - 0x5C, 0x24, 0x76, 0x8F, 0xD2, 0xC6, 0x68, 0x2A, 0x2B, 0x45, 0xBB, 0xFD, 0x2E, 0x1D, 0xD0, 0x96, - 0x83, 0x45, 0x5F, 0xD7, 0x54, 0x77, 0x1E, 0xC5, 0xEA, 0x81, 0x4A, 0x8A, 0xC7, 0xE4, 0x72, 0x12, - 0x67, 0x11, 0x37, 0x7F, 0x5D, 0x4C, 0xE2, 0xB1, 0xCC, 0x2E, 0x26, 0x87, 0x2C, 0x32, 0xD0, 0xC6, - 0x12, 0xBC, 0x7A, 0x47, 0x6B, 0xF4, 0x05, 0x37, 0x62, 0x31, 0x47, 0x1B, 0x1B, 0x9E, 0x9C, 0xC1, - 0x0D, 0xA4, 0x0C, 0xA6, 0xFC, 0x6F, 0xC1, 0x8B, 0xFC, 0xCF, 0x29, 0xA2, 0x21, 0xFF, 0x5B, 0xBC, - 0x7F, 0xFA, 0x8A, 0x9E, 0x74, 0x6E, 0x43, 0xF1, 0x8B, 0x6D, 0xB9, 0x87, 0x38, 0x42, 0x07, 0xD4, - 0xEB, 0x81, 0x77, 0xC1, 0xDE, 0xAE, 0xF5, 0xC3, 0xDB, 0xE0, 0x4D, 0x0F, 0xB4, 0x70, 0xC5, 0x7E, - 0x0B, 0xBF, 0xF4, 0x19, 0xD2, 0x03, 0x8F, 0x23, 0xBD, 0x11, 0xC8, 0xE3, 0xE4, 0xE5, 0x9F, 0x3B, - 0x9D, 0x52, 0xC9, 0xE1, 0xB9, 0x02, 0x5F, 0x7B, 0xA0, 0x5C, 0xBC, 0xF9, 0xFD, 0x05, 0x3D, 0x09, - 0x17, 0x82, 0xC5, 0x57, 0xF4, 0x34, 0xE0, 0xED, 0x61, 0x84, 0xA7, 0x22, 0x09, 0x0F, 0xCA, 0x9B, - 0x1F, 0x5A, 0xB7, 0x1E, 0x16, 0x05, 0x1C, 0x4E, 0xD9, 0x15, 0x46, 0xCB, 0xEA, 0x15, 0x22, 0x93, - 0x8F, 0x82, 0xD8, 0x5C, 0xFA, 0x8A, 0x29, 0xD8, 0xAF, 0xCD, 0x18, 0x3F, 0x43, 0x36, 0x08, 0xB5, - 0x9E, 0x8C, 0xF0, 0x5A, 0xE3, 0x89, 0x4A, 0x66, 0x10, 0x29, 0x86, 0x36, 0xDA, 0xE5, 0x10, 0x2D, - 0xE6, 0x9E, 0x1A, 0x2C, 0x41, 0x15, 0x1F, 0x30, 0x34, 0x63, 0x22, 0x43, 0xEE, 0x98, 0xD5, 0xD7, - 0xAB, 0xCD, 0x2F, 0x74, 0x22, 0xAE, 0xFC, 0x5E, 0xD0, 0x90, 0x22, 0xAF, 0x10, 0x1D, 0x4A, 0xAD, - 0x2C, 0xDE, 0x82, 0xF1, 0x4B, 0x18, 0xBE, 0x68, 0xE2, 0x41, 0xDC, 0xE9, 0x78, 0x1B, 0x94, 0xD1, - 0xF9, 0x90, 0x93, 0x4D, 0xFF, 0xF9, 0x6E, 0xE7, 0x95, 0x90, 0xFE, 0x22, 0x8D, 0xA4, 0x45, 0xC0, - 0xF7, 0xBF, 0x5B, 0xC0, 0x2F, 0x97, 0x5E, 0x91, 0x19, 0x41, 0xAB, 0x31, 0xFD, 0x3D, 0xB5, 0x22, - 0x04, 0x4A, 0xFD, 0x57, 0x95, 0xDF, 0xAF, 0xCD, 0xDF, 0x39, 0x87, 0x53, 0x37, 0x61, 0x35, 0x87, - 0x04, 0xB0, 0x04, 0xC8, 0x13, 0x23, 0x55, 0xAF, 0xE2, 0x78, 0x04, 0x14, 0x3A, 0x34, 0xB7, 0x3B, - 0x7B, 0x40, 0xBD, 0x32, 0xCB, 0x14, 0xDB, 0x55, 0x91, 0x6E, 0xEA, 0x0F, 0xD8, 0xFB, 0x14, 0x30, - 0x7D, 0xF2, 0x86, 0x48, 0x8B, 0x00, 0x40, 0x83, 0xE2, 0x87, 0xC8, 0x7E, 0x11, 0x8F, 0xD5, 0xD1, - 0x18, 0xF9, 0x0F, 0x93, 0x78, 0x34, 0x31, 0xD5, 0x06, 0x51, 0xC2, 0x5B, 0x49, 0xF2, 0x89, 0xC8, - 0x1F, 0xFA, 0xD2, 0x4A, 0xB6, 0x10, 0x3F, 0x74, 0x2F, 0x1A, 0x17, 0xAA, 0xAA, 0xE8, 0xBB, 0xA8, - 0x0D, 0xBA, 0x5C, 0x7A, 0x96, 0xB5, 0xC6, 0xFE, 0x94, 0xCC, 0x5A, 0xA4, 0x9E, 0x5D, 0x47, 0xBE, - 0xD2, 0x40, 0xC4, 0x45, 0xF1, 0xC7, 0x19, 0x9E, 0x1E, 0x4A, 0x0C, 0x8A, 0xE4, 0xE5, 0x55, 0x51, - 0x43, 0xFF, 0x00, 0x31, 0x63, 0xE6, 0xA6, 0xAA, 0xCD, 0xB5, 0x52, 0x63, 0xEC, 0x02, 0xB4, 0x27, - 0x82, 0x40, 0x1B, 0x0F, 0xEE, 0x84, 0x8D, 0x35, 0x0A, 0xD9, 0xA2, 0x77, 0xE3, 0x94, 0xA0, 0x8C, - 0x32, 0x05, 0x9B, 0xC7, 0x6D, 0xF1, 0x79, 0xCD, 0x4B, 0xBE, 0x09, 0x79, 0x1B, 0x45, 0x12, 0x7A, - 0x1D, 0xBE, 0xC0, 0x58, 0x5F, 0xA0, 0x22, 0x52, 0xD6, 0x10, 0x7A, 0x65, 0x0D, 0xCD, 0x1C, 0x86, - 0x31, 0x83, 0xCD, 0x83, 0xD1, 0x5A, 0x96, 0x40, 0x7F, 0x7D, 0x9B, 0x1E, 0xAD, 0xDB, 0xF4, 0x00, - 0xDC, 0xE8, 0xE5, 0xC6, 0xC5, 0xA5, 0x70, 0x95, 0x66, 0x82, 0x53, 0x6B, 0x49, 0x23, 0x9C, 0x10, - 0x91, 0xF6, 0x41, 0xEF, 0xF4, 0xFB, 0xC2, 0x1C, 0x61, 0x54, 0x1F, 0x14, 0xC7, 0x4F, 0xE3, 0xBE, - 0xBF, 0x50, 0xE3, 0x2A, 0x7E, 0x00, 0x93, 0x90, 0xFC, 0x29, 0x4C, 0xE2, 0x88, 0x95, 0xE9, 0x24, - 0x8C, 0x4D, 0xBE, 0x02, 0x79, 0x39, 0xDE, 0x95, 0x99, 0x1C, 0xBE, 0x96, 0x32, 0xB0, 0xF2, 0x30, - 0xA1, 0xAA, 0x36, 0x17, 0xFE, 0x07, 0x95, 0x74, 0x5B, 0xDA, 0x61, 0xB5, 0x96, 0x59, 0xBC, 0xEC, - 0x1F, 0xC6, 0x33, 0x4E, 0xB0, 0x33, 0x82, 0x38, 0x70, 0xF5, 0xAA, 0xAA, 0x24, 0x53, 0x2F, 0x97, - 0xCB, 0x5A, 0xB1, 0x94, 0xCB, 0xF2, 0x27, 0x07, 0x70, 0x90, 0x24, 0x1F, 0xD5, 0x31, 0xBB, 0x64, - 0x03, 0x12, 0xF1, 0x2C, 0x08, 0xA2, 0xEA, 0x64, 0x5E, 0x8B, 0x73, 0xB1, 0xE2, 0x3C, 0x0D, 0x6C, - 0xF0, 0x84, 0xCE, 0x12, 0xF4, 0x61, 0x4D, 0xF3, 0x0D, 0xCA, 0xDD, 0x70, 0x80, 0xD5, 0xB2, 0xA0, - 0x67, 0x18, 0x97, 0xFB, 0x2A, 0x8B, 0x33, 0x63, 0x05, 0x6E, 0x5A, 0xAE, 0x77, 0x57, 0x24, 0x1C, - 0x94, 0xC5, 0x77, 0x88, 0xBE, 0x4F, 0xC2, 0xF4, 0x2B, 0xD3, 0x07, 0xBD, 0x3B, 0xFF, 0xE8, 0xF8, - 0xC3, 0xC1, 0xAF, 0xA7, 0x97, 0x37, 0x07, 0x97, 0x97, 0xE7, 0x37, 0x47, 0x07, 0x97, 0x07, 0x40, - 0x07, 0x3A, 0x68, 0x71, 0x09, 0xD1, 0xEE, 0x7C, 0x42, 0xAE, 0xA8, 0x93, 0xC1, 0xA0, 0x36, 0x26, - 0x48, 0xF0, 0x3C, 0x1B, 0xA1, 0x41, 0x2F, 0x07, 0x79, 0x2E, 0x23, 0xEF, 0x95, 0x03, 0x9E, 0xE9, - 0x57, 0xF4, 0xF8, 0x81, 0x14, 0x8C, 0x5D, 0xD6, 0x93, 0x19, 0xE7, 0x17, 0x6B, 0x40, 0xEB, 0xEC, - 0x2D, 0x1B, 0xC2, 0x50, 0x1D, 0xDF, 0x44, 0x20, 0x24, 0xBD, 0x4C, 0x58, 0xFF, 0xF0, 0xD9, 0x07, - 0x47, 0xD5, 0xB0, 0xD9, 0xFE, 0x61, 0x7E, 0xB7, 0x5B, 0xE4, 0xE2, 0x56, 0x4F, 0x9B, 0x8A, 0x71, - 0xD6, 0xB6, 0x0A, 0x78, 0x78, 0xA1, 0xAA, 0x97, 0xA4, 0x58, 0x03, 0x4C, 0x5E, 0xCE, 0x33, 0x74, - 0x40, 0x93, 0x90, 0x34, 0x1E, 0x8F, 0x1B, 0x4D, 0xC9, 0xC5, 0x79, 0xBB, 0x0C, 0x27, 0x2F, 0x47, - 0x5D, 0x94, 0x60, 0xAB, 0x31, 0xBD, 0xDB, 0x23, 0xCF, 0x15, 0xD6, 0xDE, 0x91, 0x78, 0xF9, 0x40, - 0x74, 0xF8, 0x1B, 0x75, 0x3D, 0xB1, 0x7E, 0xE8, 0xA2, 0xC1, 0xB3, 0x1A, 0x9C, 0xB9, 0x7A, 0x04, - 0xB5, 0xC0, 0x8C, 0x85, 0xDC, 0x2F, 0x53, 0x45, 0xFA, 0xE9, 0xA8, 0xF0, 0x68, 0xA1, 0x6F, 0x8B, - 0xFB, 0xC8, 0xB6, 0x23, 0xFF, 0xA7, 0xE3, 0xCB, 0x9B, 0xDF, 0x4E, 0x3E, 0xDD, 0x5C, 0x9C, 0xFC, - 0xCF, 0xE3, 0x9B, 0xCF, 0x27, 0x7F, 0x3E, 0x3E, 0xBD, 0x18, 0x94, 0x93, 0x5B, 0xB6, 0x07, 0x83, - 0x09, 0xD3, 0xFB, 0x90, 0x88, 0xA8, 0x2D, 0x3E, 0xC5, 0x1F, 0xE2, 0x47, 0x14, 0x79, 0x3C, 0xBB, - 0xC0, 0xFA, 0x8D, 0x45, 0x44, 0x17, 0xA3, 0xF5, 0x33, 0x03, 0xAC, 0x5D, 0xED, 0x0C, 0x7F, 0x5C, - 0xD0, 0x7C, 0xF8, 0xE3, 0x02, 0xE5, 0xB4, 0x1C, 0x3E, 0x6D, 0xC5, 0xC0, 0x0F, 0x8F, 0x4F, 0x4F, - 0x2D, 0x23, 0xB7, 0x5E, 0x5A, 0x34, 0x87, 0xC1, 0x31, 0xC7, 0xFD, 0xDC, 0xA8, 0x3F, 0xDF, 0x31, - 0xEA, 0xBD, 0xE1, 0x8F, 0x0B, 0xC2, 0x46, 0x1D, 0xB3, 0x51, 0xE7, 0xB9, 0x3E, 0xDE, 0xD0, 0x82, - 0x2D, 0xB4, 0xE0, 0xE1, 0xDF, 0xC4, 0x1D, 0xD0, 0x72, 0xA9, 0xF3, 0x48, 0x58, 0xAE, 0x84, 0x91, - 0x4F, 0x28, 0x9E, 0x7D, 0xCE, 0xF0, 0x2C, 0xBC, 0x13, 0x16, 0x50, 0x00, 0x37, 0xFA, 0x79, 0x6E, - 0x44, 0x15, 0x3F, 0xC9, 0xE1, 0x9B, 0x37, 0x5B, 0x3B, 0xDF, 0x93, 0x48, 0xE6, 0x32, 0x9E, 0xA2, - 0xF7, 0x21, 0x57, 0x42, 0x6A, 0xB9, 0x64, 0x2C, 0xDF, 0xAC, 0xE9, 0x64, 0x82, 0x3E, 0xDA, 0x06, - 0xA5, 0x87, 0x1E, 0x3A, 0x7B, 0x4C, 0x11, 0x5D, 0x56, 0x40, 0xB8, 0x9C, 0x30, 0x59, 0x85, 0x93, - 0xE8, 0xE3, 0x85, 0xCE, 0x2C, 0x93, 0x84, 0x3A, 0xEA, 0xEB, 0x47, 0xA2, 0x9F, 0xCB, 0x86, 0x51, - 0xC4, 0x77, 0x80, 0x30, 0x51, 0x11, 0x61, 0x85, 0xB7, 0x3B, 0x57, 0xFE, 0x6B, 0x99, 0x67, 0xA4, - 0x10, 0x64, 0x18, 0xE3, 0x39, 0x3D, 0x39, 0xEA, 0x74, 0x84, 0xF8, 0x11, 0xBF, 0x3D, 0x7B, 0x25, - 0xF0, 0xFF, 0xC3, 0x0C, 0x2C, 0x3A, 0xC4, 0xFC, 0x51, 0x48, 0x91, 0x9F, 0xE2, 0x07, 0x91, 0x4C, - 0x89, 0x74, 0x2D, 0xB4, 0x7E, 0x17, 0x34, 0x4E, 0x0E, 0xB0, 0x4D, 0x0D, 0xD1, 0xEE, 0x9B, 0x66, - 0xC6, 0x15, 0x7D, 0xE6, 0xD9, 0x58, 0x35, 0x71, 0x85, 0xDB, 0xA4, 0x15, 0x1D, 0x2D, 0xAA, 0x2C, - 0xF8, 0x74, 0x55, 0x40, 0xC4, 0x36, 0xB6, 0x28, 0xD2, 0x9E, 0x94, 0xE7, 0x59, 0xE5, 0x96, 0x22, - 0x88, 0x2A, 0x86, 0x30, 0xDF, 0x26, 0x95, 0x07, 0x59, 0xD0, 0xCD, 0x3A, 0xDA, 0x75, 0xB8, 0xB3, - 0x09, 0x0D, 0x79, 0x5B, 0x0E, 0x20, 0x05, 0xB9, 0x2D, 0x6F, 0xCD, 0x1F, 0x9B, 0x9B, 0xE6, 0x3F, - 0x5D, 0xEA, 0x99, 0x3C, 0xCF, 0x61, 0x7F, 0xEF, 0xF5, 0xBF, 0x33, 0x62, 0xFE, 0xAB, 0x64, 0xC4, - 0x54, 0x6F, 0x1E, 0xEB, 0xA9, 0x30, 0x79, 0x72, 0x07, 0xAC, 0x13, 0x58, 0x84, 0x3A, 0xF5, 0xC4, - 0xA4, 0x94, 0x1E, 0x73, 0x24, 0xF6, 0x1B, 0x9D, 0xC2, 0x21, 0x6D, 0xCC, 0xE3, 0xA3, 0xF2, 0xD6, - 0xC2, 0x14, 0x86, 0x70, 0x02, 0x47, 0xD5, 0xBC, 0x3E, 0x86, 0xC5, 0x5A, 0xEF, 0x49, 0xD5, 0xD8, - 0x2A, 0xB4, 0x54, 0x97, 0xC7, 0x38, 0x51, 0x79, 0xC3, 0xCB, 0x69, 0x38, 0x95, 0x1C, 0xAC, 0xA4, - 0xE1, 0xCC, 0xEC, 0x9E, 0xF1, 0x41, 0x6A, 0x7B, 0xAD, 0x11, 0x14, 0x8F, 0x7B, 0x6B, 0x61, 0x21, - 0x26, 0xDA, 0x49, 0x5D, 0xBC, 0xD6, 0xE4, 0x8F, 0x0C, 0x82, 0x4A, 0x22, 0xF0, 0x73, 0xFC, 0x20, - 0x43, 0xEB, 0x55, 0x3E, 0x88, 0xBC, 0x35, 0x87, 0x28, 0x49, 0x2A, 0xDF, 0x85, 0x9C, 0x1B, 0xE1, - 0x2C, 0x42, 0x91, 0x78, 0xDF, 0x23, 0x32, 0x6C, 0x5A, 0x2B, 0xA8, 0xB9, 0x5B, 0x09, 0xC3, 0x52, - 0x81, 0x7B, 0xAE, 0xFC, 0x5E, 0x2A, 0xBA, 0x90, 0xB7, 0x2D, 0xFA, 0x48, 0x7A, 0xC3, 0x3D, 0xB4, - 0x3E, 0x87, 0x19, 0x8D, 0xC3, 0x44, 0x7C, 0x0D, 0x2A, 0xF2, 0xBB, 0x9C, 0x05, 0x8C, 0x3B, 0xF3, - 0x29, 0x91, 0x7C, 0x97, 0xE2, 0x0C, 0x7D, 0x42, 0x8F, 0xD4, 0x78, 0x97, 0x57, 0x08, 0x5E, 0x32, - 0xC5, 0x98, 0x4E, 0xC4, 0x27, 0x6E, 0x8A, 0x95, 0x99, 0x2F, 0x99, 0x24, 0x1E, 0xF4, 0x20, 0xCE, - 0xE2, 0xBB, 0x38, 0x1D, 0xB0, 0xDD, 0x3A, 0xCC, 0xEE, 0x10, 0x1D, 0x74, 0xFB, 0xB9, 0x95, 0xE2, - 0x56, 0x36, 0xF1, 0xF1, 0x78, 0x4C, 0x64, 0x70, 0xC8, 0x6E, 0x95, 0x61, 0xCC, 0x8F, 0xCB, 0x65, - 0x7F, 0xB7, 0xEE, 0x4E, 0x84, 0xBF, 0xFD, 0x35, 0x99, 0xF8, 0xAC, 0x5F, 0xE3, 0xB0, 0xC3, 0xF2, - 0x6D, 0x9C, 0x0A, 0xDB, 0xB9, 0x91, 0x63, 0x8E, 0x3B, 0x16, 0x89, 0xB9, 0x69, 0x49, 0xF0, 0x6A, - 0x7D, 0x1B, 0x66, 0xAB, 0xC8, 0x1F, 0xC5, 0xF2, 0xBF, 0x0E, 0x54, 0x4A, 0x4D, 0x23, 0x5A, 0xB9, - 0xD9, 0x99, 0x72, 0x95, 0x14, 0x3F, 0x0B, 0x8C, 0x04, 0xDF, 0x17, 0x2F, 0x58, 0x57, 0x28, 0xE6, - 0x56, 0xCC, 0x56, 0xBF, 0x87, 0xAD, 0xBC, 0x7E, 0x34, 0xBA, 0x43, 0x46, 0xFC, 0x0E, 0xE1, 0x59, - 0x35, 0x41, 0x53, 0x19, 0x56, 0xDE, 0x1B, 0xC9, 0x70, 0xD2, 0x55, 0xCF, 0xAF, 0x91, 0xAF, 0x5E, - 0xFC, 0x18, 0xF1, 0x96, 0x9B, 0x80, 0x34, 0x3F, 0x96, 0x5C, 0xFF, 0xF9, 0x95, 0x74, 0x4A, 0x34, - 0x1F, 0x0D, 0xDA, 0x1E, 0xF4, 0x56, 0x75, 0x18, 0x7B, 0x45, 0x68, 0x84, 0x02, 0x2E, 0xE1, 0xB9, - 0xB0, 0xF3, 0xB4, 0x08, 0xC4, 0x59, 0x44, 0x0A, 0xE7, 0x63, 0x0E, 0xCC, 0x12, 0x76, 0x5C, 0xCA, - 0x6F, 0xB4, 0xBE, 0x2C, 0x6C, 0xAC, 0xA0, 0xF2, 0x30, 0xA7, 0xA4, 0x28, 0xF1, 0x7B, 0x1D, 0x19, - 0x94, 0xA6, 0x65, 0x5D, 0x6B, 0x1B, 0x61, 0x4D, 0x0E, 0xFA, 0x0F, 0x2B, 0x33, 0x46, 0x5A, 0x21, - 0x02, 0xA0, 0x2C, 0x15, 0xAD, 0xDD, 0xB6, 0x81, 0x08, 0x56, 0xE1, 0xF4, 0x47, 0x26, 0x2A, 0xAC, - 0x59, 0x50, 0xB9, 0x44, 0x7D, 0xD7, 0x2B, 0xFC, 0xB1, 0x2A, 0x02, 0x7F, 0xC5, 0xC1, 0x56, 0x24, - 0x06, 0x33, 0xCF, 0xB6, 0x2F, 0x1B, 0x87, 0x13, 0xCD, 0xB2, 0x15, 0xBB, 0xC7, 0xB3, 0x3B, 0x5B, - 0xBD, 0x99, 0xB4, 0xC9, 0x55, 0x51, 0xA5, 0xAC, 0xBB, 0x72, 0x06, 0xF4, 0xEC, 0xC4, 0x78, 0xD1, - 0xBE, 0xB7, 0x81, 0x4D, 0x6F, 0x15, 0x3A, 0xDD, 0xE7, 0xDA, 0x47, 0x94, 0x32, 0xDC, 0xB4, 0x17, - 0xB2, 0xC3, 0x62, 0x91, 0x4A, 0xAF, 0x69, 0xC3, 0x44, 0x35, 0x6D, 0xA3, 0x1C, 0x56, 0xB7, 0xBD, - 0x39, 0x8F, 0xA6, 0xAB, 0x5E, 0xF8, 0xA0, 0xB6, 0x44, 0xDE, 0xDC, 0x68, 0xFA, 0xC2, 0x4E, 0x3C, - 0x7B, 0x90, 0x39, 0xED, 0x1A, 0x31, 0x2B, 0x8D, 0xA4, 0x61, 0xD3, 0xED, 0xD9, 0xB5, 0xA9, 0x02, - 0x48, 0x60, 0x84, 0xBB, 0x69, 0xDA, 0xD7, 0xF3, 0x8A, 0x04, 0x43, 0xC1, 0x46, 0xDF, 0x58, 0x21, - 0x4D, 0xB3, 0xAB, 0x25, 0x4B, 0x4B, 0x0A, 0x73, 0xA1, 0x6C, 0x97, 0x25, 0x55, 0xA3, 0x26, 0xB4, - 0x26, 0x34, 0x68, 0xA6, 0xFD, 0xD4, 0x22, 0xD1, 0xC2, 0x16, 0x15, 0xC6, 0x0F, 0x9E, 0x6D, 0x8B, - 0xD3, 0x2F, 0x80, 0x4A, 0x3A, 0x54, 0x10, 0xD4, 0xB7, 0xDF, 0xD6, 0x89, 0x2E, 0x87, 0xB8, 0x3F, - 0x6A, 0x5B, 0xBE, 0xC6, 0xB5, 0xA8, 0x55, 0x20, 0x14, 0x31, 0x5D, 0xD4, 0xB8, 0xF3, 0x92, 0x4E, - 0x52, 0xB2, 0x85, 0x96, 0xD1, 0x5E, 0xC1, 0x28, 0xD2, 0xC3, 0xA0, 0x41, 0x30, 0x7C, 0xE6, 0xD1, - 0x2A, 0xD5, 0xD9, 0x56, 0xF7, 0x60, 0xE5, 0xCA, 0xCA, 0xBE, 0xD4, 0xA4, 0x2D, 0x1A, 0xB3, 0x68, - 0x7A, 0xB4, 0xF4, 0x0A, 0xB7, 0xD1, 0x9A, 0xF8, 0x29, 0x0D, 0xE8, 0xA5, 0x9D, 0xD8, 0xA0, 0xBB, - 0x6A, 0x39, 0x0E, 0xEB, 0x9D, 0x52, 0x90, 0x97, 0xF4, 0x56, 0x73, 0x83, 0x88, 0x89, 0x50, 0x18, - 0x51, 0xB4, 0x5C, 0x76, 0x8B, 0x7B, 0xEB, 0x9A, 0x9A, 0xEB, 0x0B, 0xCD, 0x76, 0x45, 0x25, 0xA1, - 0xF4, 0x5A, 0x03, 0xB3, 0x97, 0x6A, 0x7F, 0x46, 0xD9, 0xA8, 0x25, 0x14, 0xA5, 0xB1, 0xC0, 0xDB, - 0xD1, 0xD9, 0x34, 0x88, 0x88, 0x5E, 0x78, 0xED, 0x68, 0x75, 0xDB, 0x61, 0x01, 0x00, 0xD1, 0xDB, - 0xFE, 0xFE, 0x77, 0xEF, 0xCE, 0x65, 0x4A, 0xEB, 0xA7, 0xFC, 0xC2, 0x45, 0xB0, 0xDA, 0xB7, 0x57, - 0x99, 0x1A, 0x4D, 0x98, 0x4A, 0x06, 0x98, 0xE6, 0x4B, 0x62, 0xA3, 0xF1, 0xD1, 0x5C, 0x5C, 0xF4, - 0x68, 0xCF, 0xCD, 0xDA, 0x48, 0xF5, 0x51, 0xA5, 0xB0, 0xF2, 0x69, 0x23, 0x8D, 0x57, 0x58, 0xA7, - 0x1A, 0x29, 0xA5, 0xDB, 0x83, 0x97, 0xDF, 0x82, 0x18, 0xEC, 0x33, 0xED, 0x71, 0xD0, 0xCF, 0x1B, - 0xA9, 0xB1, 0x58, 0xD9, 0xB3, 0x3E, 0xC9, 0x35, 0xCD, 0x63, 0xD0, 0x6D, 0x3C, 0xAB, 0x49, 0x46, - 0x08, 0xBA, 0xFD, 0xFC, 0xE6, 0x76, 0x7E, 0x7B, 0x5B, 0xC8, 0x15, 0xD3, 0xE7, 0x67, 0x05, 0x4B, - 0x6E, 0xAE, 0x12, 0xC5, 0x43, 0xE5, 0x3C, 0x41, 0xDF, 0xF6, 0x3A, 0x9D, 0xC2, 0xBE, 0xDA, 0x08, - 0x71, 0xB9, 0xA4, 0xEF, 0x7A, 0x9D, 0x4E, 0xFC, 0xB6, 0x7D, 0x5F, 0x06, 0xDC, 0x15, 0x43, 0x68, - 0xAC, 0xEC, 0x7C, 0xD7, 0xE9, 0x58, 0x2C, 0xFB, 0x1B, 0x7D, 0x90, 0x97, 0xDF, 0xD5, 0x94, 0x3D, - 0xEE, 0x6E, 0xEE, 0x10, 0xE5, 0x79, 0x5D, 0x4B, 0x4F, 0x90, 0x24, 0xB3, 0x71, 0x5C, 0x8B, 0x00, - 0x01, 0xCF, 0x9A, 0xDB, 0xFD, 0xC6, 0xD5, 0x57, 0x4C, 0x5D, 0xCD, 0xFE, 0x69, 0x65, 0xFD, 0xB7, - 0xFD, 0x66, 0x58, 0x72, 0x8A, 0x57, 0x49, 0xFB, 0x35, 0x84, 0xD4, 0xFE, 0x0A, 0x1E, 0x59, 0xC9, - 0x05, 0x83, 0x76, 0x00, 0x9B, 0x85, 0xCD, 0xA7, 0xA9, 0x8B, 0xFA, 0x1A, 0x6C, 0x6F, 0xD0, 0xAA, - 0x0D, 0x49, 0x1E, 0x81, 0x3D, 0x1B, 0x6D, 0xBD, 0x95, 0x62, 0x48, 0x7D, 0x6F, 0x1E, 0xB0, 0x1E, - 0x4F, 0x6D, 0xE5, 0x80, 0xDC, 0xCA, 0x55, 0x85, 0xDB, 0x91, 0x78, 0x7C, 0xC6, 0x9D, 0x9A, 0xE5, - 0x0B, 0x72, 0xB5, 0x8B, 0xF6, 0xB8, 0x2D, 0x4E, 0xE7, 0xAC, 0x99, 0xCD, 0x92, 0x27, 0x01, 0x41, - 0xB9, 0xBB, 0xE9, 0xA7, 0x6B, 0xB0, 0x60, 0x53, 0x59, 0xF4, 0x11, 0x47, 0x28, 0x08, 0x02, 0xCE, - 0xE7, 0x7C, 0xDF, 0xF5, 0x8F, 0xCE, 0x3E, 0xDE, 0x1C, 0x1D, 0x9F, 0x5E, 0x1E, 0xDC, 0x9C, 0x9E, - 0x7C, 0x3A, 0xDE, 0xA7, 0x2F, 0x02, 0xFB, 0x2E, 0x3A, 0x58, 0x03, 0xC2, 0xE7, 0x83, 0x9F, 0x8E, - 0xD9, 0x52, 0x68, 0x82, 0xF1, 0xC2, 0xB6, 0x11, 0xF3, 0xF8, 0x5F, 0x90, 0xE7, 0xF3, 0xAA, 0x3E, - 0xF3, 0xFB, 0x67, 0x52, 0x83, 0xDF, 0x7B, 0xEE, 0x7B, 0xF4, 0x65, 0xC3, 0x58, 0x36, 0x9B, 0x0D, - 0x67, 0x7C, 0xDA, 0x05, 0xA7, 0x8E, 0x13, 0x8C, 0x33, 0xAF, 0x78, 0x1F, 0xD8, 0xD0, 0x02, 0x80, - 0x17, 0x8D, 0xDF, 0xDE, 0xF5, 0xF6, 0xFB, 0x83, 0xC2, 0x31, 0xA3, 0x5E, 0xE1, 0x3F, 0x82, 0x3E, - 0xF8, 0x96, 0xD9, 0xB1, 0x4F, 0x83, 0x9D, 0x84, 0x75, 0x59, 0xDF, 0x2C, 0xE9, 0xC6, 0x5A, 0x27, - 0x53, 0xED, 0x95, 0xBB, 0x65, 0x98, 0x70, 0xA7, 0xAF, 0xB8, 0x70, 0xE6, 0x5C, 0x2E, 0xDD, 0x11, - 0xCD, 0x12, 0x5D, 0xAA, 0x5D, 0xE5, 0x5C, 0x3E, 0xCF, 0xBA, 0x5C, 0xCD, 0xFA, 0x3E, 0x7A, 0xB1, - 0x7E, 0xF7, 0x17, 0x4C, 0xAB, 0xA6, 0xF1, 0x7D, 0x4C, 0x9F, 0x56, 0xB6, 0x22, 0xD5, 0x16, 0x83, - 0xD5, 0x3D, 0xD5, 0xDA, 0xE4, 0x96, 0x17, 0x8E, 0xC6, 0xA5, 0x96, 0xB4, 0xC3, 0x22, 0x9F, 0x3F, - 0x52, 0x44, 0xE4, 0xAA, 0x77, 0xED, 0xCF, 0xC2, 0x3B, 0xF4, 0x7B, 0x5E, 0x7F, 0x61, 0x58, 0xD9, - 0x81, 0x8A, 0xE6, 0xDD, 0x7A, 0xF3, 0x61, 0xED, 0x30, 0xD5, 0xD8, 0x13, 0x2C, 0x6F, 0x57, 0xDF, - 0x26, 0xB9, 0xF2, 0xE1, 0x28, 0x20, 0xDE, 0x55, 0xE6, 0x6D, 0xC3, 0x89, 0x7F, 0xF2, 0xDE, 0x64, - 0x23, 0x00, 0x33, 0x6F, 0x87, 0x95, 0x9E, 0x95, 0xA8, 0xC6, 0x8A, 0x77, 0x61, 0x58, 0x0B, 0x72, - 0xCB, 0xCA, 0xF7, 0x58, 0xF9, 0x79, 0x39, 0x50, 0x56, 0xE6, 0xBD, 0xE2, 0xB5, 0x2D, 0x41, 0x8C, - 0x33, 0xEF, 0x35, 0xFB, 0x54, 0x8A, 0x63, 0x7B, 0x0D, 0x47, 0xA5, 0xFB, 0x8D, 0x51, 0x0E, 0xB7, - 0xFB, 0xBD, 0x57, 0xFF, 0xBE, 0xD8, 0xFA, 0x17, 0xB9, 0xD8, 0x6A, 0x8A, 0x8E, 0x56, 0xBF, 0xE8, - 0x12, 0xF7, 0x5B, 0x58, 0xDF, 0x6F, 0x85, 0xEA, 0xF2, 0xAB, 0xFD, 0xA2, 0x2B, 0x5C, 0x71, 0xD1, - 0x65, 0xB9, 0xDE, 0x32, 0xE2, 0xDE, 0x23, 0xEB, 0xAD, 0x15, 0x6D, 0x72, 0x36, 0xD3, 0xB7, 0x5C, - 0xE5, 0x0B, 0x2A, 0x52, 0xAB, 0xAF, 0xF2, 0x4E, 0xF0, 0xE8, 0x64, 0x1F, 0xC3, 0x99, 0xBA, 0x71, - 0x48, 0xA8, 0x20, 0xC8, 0x89, 0x7C, 0xD5, 0x5C, 0xDC, 0xC4, 0x44, 0x15, 0x33, 0xBD, 0x71, 0x3B, - 0x3E, 0xD2, 0x81, 0xF4, 0xD7, 0x48, 0xE9, 0x50, 0xD4, 0xB6, 0x87, 0xA6, 0x2F, 0x70, 0xEC, 0xEA, - 0x9A, 0xAE, 0x95, 0x38, 0xD6, 0x28, 0xB9, 0xE5, 0xE0, 0xD9, 0xDF, 0x18, 0xCF, 0xB8, 0x38, 0x5D, - 0x46, 0x58, 0x5A, 0x79, 0x0B, 0x0E, 0xF9, 0xEE, 0x50, 0x9F, 0x8B, 0x46, 0x82, 0x2A, 0xBD, 0xE0, - 0x6F, 0x73, 0x34, 0x47, 0xE7, 0xED, 0xB1, 0x0C, 0xD3, 0x96, 0xDB, 0x27, 0x71, 0x76, 0x86, 0xAE, - 0x70, 0xFD, 0x2D, 0x05, 0x2F, 0x2C, 0x83, 0x6E, 0x1A, 0xC8, 0xBA, 0xB7, 0x47, 0xC6, 0x70, 0xEA, - 0xAC, 0xD3, 0x0C, 0x2A, 0x68, 0x33, 0xF6, 0x11, 0xB6, 0xBF, 0x37, 0xC6, 0x8A, 0xAC, 0xFB, 0x57, - 0xE2, 0xD4, 0x5C, 0xBD, 0xA2, 0x32, 0x8A, 0xBC, 0x67, 0x8F, 0x79, 0x15, 0xE4, 0x29, 0xBE, 0x67, - 0x60, 0x8D, 0xCB, 0x29, 0x56, 0x52, 0x7A, 0xD5, 0x6A, 0x9D, 0xA8, 0xD0, 0x9A, 0xD7, 0xB7, 0xBA, - 0x16, 0xE4, 0x7B, 0xF7, 0xBA, 0x1B, 0xA9, 0x5A, 0xA9, 0xBE, 0x74, 0x68, 0x16, 0xC9, 0x98, 0xCA, - 0x43, 0x5A, 0x54, 0xDC, 0x47, 0x42, 0xFB, 0xFD, 0x48, 0x68, 0xBB, 0x18, 0x29, 0xF3, 0x6C, 0x18, - 0x45, 0x12, 0xAA, 0xF6, 0xF7, 0x28, 0xF1, 0xAC, 0x75, 0x39, 0x40, 0x2B, 0x78, 0xE5, 0x22, 0xC3, - 0xD0, 0xB5, 0xB7, 0x5B, 0x14, 0xD9, 0x72, 0x91, 0x83, 0xC7, 0x8D, 0x2F, 0x88, 0x8B, 0x12, 0x02, - 0x4A, 0xC6, 0x4F, 0x93, 0xF6, 0xC3, 0x66, 0x31, 0x95, 0xDB, 0xEA, 0x97, 0xBD, 0xCD, 0x2A, 0x6F, - 0x5A, 0x6A, 0x50, 0x0A, 0xAB, 0x2B, 0xAF, 0xFE, 0x67, 0xFD, 0xA2, 0x17, 0xE9, 0x20, 0x77, 0x4A, - 0xD8, 0xE9, 0xA0, 0x0A, 0x4A, 0xE9, 0x6D, 0x15, 0x8A, 0xC3, 0x78, 0x95, 0x18, 0xE4, 0xD9, 0x5D, - 0xCC, 0x3C, 0x7E, 0x5F, 0x7E, 0x5C, 0x18, 0x76, 0x38, 0x0F, 0x69, 0x87, 0xC4, 0x07, 0x79, 0x57, - 0x0D, 0x9E, 0x97, 0x71, 0x10, 0xE4, 0xB3, 0xC7, 0x2F, 0xBA, 0x0F, 0x69, 0x3A, 0x36, 0xC0, 0x4E, - 0xA4, 0xB1, 0xF8, 0x19, 0x70, 0x27, 0xC5, 0xCD, 0x86, 0x06, 0x4C, 0xF1, 0x8C, 0x41, 0x15, 0x0F, - 0xD3, 0xB9, 0x0D, 0xBE, 0xC5, 0xB8, 0xAA, 0x52, 0xCB, 0x0A, 0x23, 0xEB, 0xF7, 0x75, 0x6C, 0xA4, - 0x2E, 0xFC, 0xF2, 0xA3, 0x35, 0x88, 0x75, 0x33, 0x24, 0x46, 0x1A, 0xED, 0x87, 0x57, 0xA4, 0xE5, - 0x28, 0x88, 0xF3, 0x58, 0xCD, 0xC3, 0xD1, 0x53, 0x8A, 0x0F, 0xE9, 0x74, 0xC8, 0x3B, 0xDB, 0x08, - 0x47, 0x38, 0x21, 0x9D, 0x8E, 0xA7, 0xD0, 0x63, 0x03, 0x4C, 0xC2, 0xA7, 0xC0, 0x4D, 0x71, 0xAA, - 0x73, 0x8F, 0x58, 0x18, 0x0D, 0xC6, 0x00, 0xC6, 0x79, 0x95, 0x61, 0x17, 0xC5, 0x33, 0x93, 0x6F, - 0xA1, 0x2C, 0xB7, 0xBE, 0xBF, 0xED, 0x2D, 0x97, 0xF4, 0x5D, 0xF3, 0xD1, 0x0E, 0x29, 0x3F, 0xEE, - 0x4E, 0xC7, 0x43, 0x45, 0xC6, 0x24, 0x0B, 0xF6, 0xB0, 0xD8, 0x55, 0x55, 0xC6, 0x6D, 0x91, 0x09, - 0x40, 0x7B, 0x82, 0xCB, 0xE4, 0xC8, 0x4C, 0x53, 0x8A, 0x83, 0x46, 0x59, 0xA7, 0xF2, 0x84, 0x2E, - 0x97, 0xC5, 0xA3, 0x91, 0xCA, 0x22, 0x83, 0x1A, 0xA6, 0x56, 0x7A, 0x2C, 0x80, 0x08, 0x03, 0xA4, - 0x23, 0x70, 0x18, 0xF2, 0xB6, 0x1C, 0x31, 0x1F, 0x94, 0xB8, 0x94, 0x7E, 0x17, 0xBB, 0x29, 0x8A, - 0x34, 0x6C, 0x8B, 0xFB, 0x82, 0x52, 0x03, 0xF7, 0x36, 0xC1, 0xA3, 0xAF, 0x8D, 0x14, 0x8B, 0x41, - 0x9E, 0xDB, 0x98, 0x80, 0x4D, 0xB4, 0xA2, 0xA5, 0x7C, 0x96, 0x6E, 0xC9, 0xA6, 0x5A, 0xF0, 0x6A, - 0xDC, 0xC4, 0xAB, 0xF1, 0x7E, 0x3C, 0xE8, 0x0D, 0x5D, 0x9E, 0x9F, 0xD0, 0xE5, 0x2E, 0xFB, 0xBA, - 0x5E, 0x98, 0x8E, 0x26, 0x38, 0x5B, 0x2E, 0xDD, 0x04, 0x8D, 0xA9, 0x0B, 0xF6, 0xD5, 0x5C, 0x67, - 0x22, 0xFD, 0xE7, 0x3E, 0x79, 0x9E, 0x7C, 0xE1, 0xE4, 0x19, 0xB8, 0xEE, 0x80, 0x9A, 0xD9, 0x4C, - 0xBF, 0x19, 0x4C, 0x6E, 0xDB, 0x79, 0xA5, 0xC8, 0xAD, 0x86, 0xB1, 0x69, 0x64, 0xAD, 0x86, 0x54, - 0xF7, 0x6D, 0xFB, 0x6F, 0x84, 0x12, 0xC4, 0x03, 0xB5, 0x40, 0x54, 0x24, 0x72, 0x2E, 0x0E, 0xB4, - 0x7D, 0xEB, 0x81, 0x76, 0x8B, 0x95, 0x1E, 0x55, 0x77, 0x34, 0xF6, 0x65, 0x1B, 0xE2, 0xEA, 0xD9, - 0x55, 0x9E, 0x45, 0x1B, 0x8F, 0x24, 0xA3, 0x1C, 0xEE, 0xBE, 0x7E, 0xD5, 0xFF, 0x1E, 0x1F, 0x71, - 0xEE, 0x0D, 0xF2, 0x3F, 0x71, 0x8A, 0x2E, 0x28, 0xCE, 0x50, 0xE1, 0x1F, 0x5E, 0x29, 0xAF, 0xFB, - 0x86, 0xAB, 0xFD, 0xF2, 0xEF, 0x38, 0x45, 0x24, 0xB8, 0xBA, 0x86, 0xC5, 0xCF, 0xCF, 0x18, 0x27, - 0xF5, 0x92, 0x72, 0xC6, 0x24, 0x26, 0x94, 0x3E, 0x87, 0x51, 0x14, 0xA7, 0x77, 0xC1, 0x62, 0x3C, - 0x4F, 0x92, 0x41, 0x0F, 0x32, 0x36, 0x18, 0xF4, 0xE0, 0x08, 0xA5, 0x14, 0x65, 0x83, 0x1E, 0xE4, - 0xEC, 0x35, 0xE8, 0xE5, 0x3C, 0xB8, 0x09, 0xEF, 0xA7, 0x7A, 0x2F, 0xA3, 0x60, 0xAB, 0x77, 0x52, - 0x15, 0x43, 0x6E, 0xE5, 0xB3, 0x81, 0x90, 0xBE, 0x3B, 0x36, 0xCB, 0xF4, 0x13, 0xB1, 0x7A, 0x3D, - 0x8D, 0x77, 0x65, 0x34, 0x39, 0xD3, 0xB9, 0x4B, 0x7C, 0xC7, 0xDF, 0x27, 0x5A, 0x03, 0x25, 0x4B, - 0x33, 0x86, 0xA9, 0xE5, 0xD0, 0x42, 0xCB, 0xE1, 0xBD, 0x01, 0x26, 0x7D, 0x85, 0xD7, 0x12, 0x37, - 0x55, 0xB6, 0xC1, 0x11, 0xD5, 0x3A, 0x1D, 0xEA, 0xAB, 0x07, 0x55, 0xAB, 0x9B, 0xA8, 0x9A, 0xE6, - 0x35, 0x6E, 0x9C, 0xA2, 0x13, 0x46, 0x70, 0x82, 0x46, 0x94, 0xB0, 0x19, 0xE7, 0x91, 0x6A, 0x8D, - 0xBD, 0x03, 0xD4, 0x2E, 0x66, 0x59, 0xE9, 0x41, 0xF4, 0xD7, 0x90, 0xCD, 0xD4, 0x25, 0xB6, 0xB5, - 0x81, 0xEB, 0x22, 0xA2, 0x4C, 0xAF, 0xC6, 0x7D, 0x6D, 0x18, 0x45, 0xA7, 0x71, 0x8A, 0xEC, 0x80, - 0x41, 0xAE, 0xB1, 0x28, 0x4D, 0xC5, 0x5B, 0xEB, 0x8C, 0x03, 0x2B, 0xB7, 0x5C, 0x59, 0xDA, 0x5F, - 0x4B, 0xAA, 0xAF, 0x43, 0x73, 0xB8, 0x0E, 0x38, 0x3D, 0x29, 0x6B, 0x52, 0x62, 0x2D, 0xA0, 0xFC, - 0x2A, 0x47, 0x7A, 0x35, 0xC4, 0x29, 0x2A, 0xEF, 0xF1, 0x6B, 0x41, 0x40, 0x69, 0xD4, 0xD8, 0xDE, - 0x98, 0x03, 0xC1, 0xFB, 0xC5, 0x73, 0xC0, 0x56, 0xA8, 0x9B, 0x9B, 0xD7, 0x4A, 0xDB, 0x36, 0xDA, - 0x2D, 0x38, 0xAD, 0x06, 0x6B, 0x11, 0x54, 0x3F, 0x09, 0x5C, 0x97, 0x58, 0x15, 0x42, 0x0C, 0x2A, - 0xCC, 0x67, 0x0E, 0xB2, 0xFC, 0x2D, 0x07, 0x15, 0x32, 0x55, 0x07, 0x49, 0xAE, 0xEA, 0xAB, 0xBF, - 0xDB, 0xBF, 0xAE, 0x36, 0x93, 0x03, 0xCF, 0x73, 0xEE, 0xBE, 0xC0, 0xE5, 0x98, 0x61, 0xA0, 0x35, - 0x84, 0x1B, 0xCA, 0x6D, 0x4B, 0xCC, 0xB4, 0x5E, 0xD1, 0x77, 0x01, 0xAA, 0xCE, 0x6C, 0xA7, 0x43, - 0xDF, 0x06, 0xA8, 0x3C, 0x5B, 0xB9, 0x6D, 0xDD, 0x49, 0x6B, 0x64, 0x0B, 0xA8, 0x6E, 0x0D, 0xA7, - 0xAB, 0x78, 0xB9, 0x74, 0x99, 0xCC, 0x75, 0xAF, 0x6D, 0xFD, 0x6C, 0xB6, 0x35, 0xC8, 0x2B, 0xCB, - 0x53, 0x3C, 0x3A, 0xAE, 0x31, 0xA6, 0x16, 0xC4, 0xB5, 0x4F, 0x90, 0x02, 0x58, 0xE9, 0xB0, 0xB8, - 0x88, 0xAB, 0x7C, 0x90, 0x0F, 0x0B, 0x76, 0x5F, 0xED, 0xEC, 0xFC, 0xDB, 0xFE, 0xFA, 0x2F, 0x62, - 0x7F, 0xB5, 0x86, 0xB1, 0xAF, 0x1B, 0x5F, 0x99, 0xDE, 0xD3, 0xFC, 0xCC, 0x80, 0x9B, 0x61, 0x47, - 0xCA, 0x0C, 0x0B, 0x93, 0x95, 0x2A, 0x06, 0x8C, 0x56, 0x57, 0xB9, 0x59, 0x59, 0x85, 0xDB, 0x7B, - 0xE7, 0x15, 0x7B, 0xEF, 0x64, 0xF5, 0xC3, 0x06, 0x0C, 0x43, 0xC1, 0xA1, 0xA3, 0x61, 0xD9, 0xF6, - 0x5B, 0x7D, 0xC6, 0x80, 0xAC, 0x36, 0x61, 0x6A, 0xB5, 0x09, 0xD7, 0x0F, 0x41, 0x55, 0xEB, 0x6F, - 0xD9, 0x26, 0x9C, 0xD9, 0x5F, 0x3E, 0xE0, 0xDA, 0x5B, 0x86, 0xFA, 0x2B, 0x87, 0x92, 0xAA, 0x98, - 0xA2, 0x07, 0x27, 0xAD, 0xE8, 0x8F, 0x45, 0xE0, 0x88, 0x79, 0x12, 0xFD, 0xCA, 0x43, 0x87, 0x18, - 0x4E, 0xDC, 0xDA, 0xCC, 0x69, 0x7E, 0x3F, 0xE0, 0x67, 0x8E, 0xE2, 0x5B, 0x12, 0x12, 0xFA, 0x4B, - 0x8A, 0x1F, 0x52, 0xEB, 0xF3, 0x06, 0xE1, 0x58, 0xD7, 0x68, 0x59, 0x11, 0x9F, 0x0B, 0x8B, 0xB3, - 0x70, 0xC3, 0x5B, 0x65, 0x6E, 0x56, 0x5B, 0x50, 0x37, 0x63, 0xBC, 0x58, 0x3D, 0x89, 0x1F, 0x72, - 0x20, 0xC5, 0x30, 0x8C, 0xA7, 0xE2, 0xA3, 0x06, 0xEF, 0x05, 0x91, 0x95, 0xF9, 0xB8, 0xFE, 0x06, - 0x7A, 0xB4, 0x5C, 0x8E, 0x7C, 0x11, 0xCD, 0xE2, 0x3D, 0x1A, 0x63, 0x95, 0x97, 0x4D, 0x22, 0x6A, - 0x67, 0x06, 0xE5, 0xC9, 0x96, 0x04, 0xA5, 0x41, 0xDD, 0x21, 0x7A, 0x28, 0x72, 0xDA, 0x7B, 0xEE, - 0x56, 0xE4, 0x8A, 0x24, 0x03, 0x49, 0x3D, 0x30, 0xE1, 0x21, 0x7D, 0x74, 0x46, 0x61, 0x9A, 0x62, - 0x1E, 0x95, 0x90, 0x61, 0x5E, 0x44, 0x23, 0xA4, 0x8F, 0x41, 0xA2, 0x07, 0x5B, 0x0D, 0xD6, 0xA7, - 0xAC, 0xCA, 0x85, 0x9D, 0x4F, 0xD5, 0x11, 0x33, 0x23, 0x0C, 0x64, 0xCD, 0xB5, 0x34, 0xC5, 0x1A, - 0x2A, 0x9A, 0xA6, 0xD2, 0x89, 0xD5, 0x54, 0x6A, 0x7F, 0xB1, 0x2E, 0xC6, 0x6F, 0x79, 0x8D, 0x2F, - 0xCE, 0x71, 0xDC, 0xEE, 0xC8, 0x0E, 0x12, 0x37, 0xFC, 0xF0, 0xB8, 0xC2, 0xC3, 0xAB, 0x39, 0xD3, - 0xC9, 0x72, 0xD9, 0xCB, 0xDB, 0xA9, 0xB2, 0xF8, 0x87, 0x98, 0xA9, 0xE5, 0xC9, 0x4C, 0xC4, 0x4D, - 0xFA, 0x1E, 0x7B, 0xF5, 0x3A, 0xF0, 0xF3, 0x55, 0x73, 0x6A, 0x1D, 0xE3, 0xF3, 0x6F, 0x53, 0xFE, - 0x61, 0x97, 0x0F, 0x72, 0x31, 0xD8, 0x0C, 0x30, 0xDF, 0x76, 0xFF, 0x50, 0xB1, 0xD2, 0x34, 0x5E, - 0x47, 0x94, 0x01, 0xA8, 0xC8, 0x17, 0xB5, 0x37, 0xA9, 0x35, 0x49, 0xD6, 0xEA, 0xEE, 0x4C, 0xFC, - 0x14, 0x67, 0xD3, 0x30, 0x29, 0x39, 0x2A, 0x57, 0x5F, 0x39, 0x1C, 0x65, 0xA1, 0x74, 0x27, 0x39, - 0xC4, 0x22, 0x8D, 0x8A, 0xB9, 0xF6, 0x84, 0xC8, 0x52, 0x42, 0x59, 0x69, 0xAC, 0x40, 0xDE, 0x1E, - 0xAC, 0x5E, 0x9B, 0xCF, 0x98, 0x70, 0xFB, 0x85, 0x46, 0xD9, 0x59, 0xB9, 0x52, 0x5C, 0x78, 0x8B, - 0x55, 0x52, 0x77, 0xC7, 0x28, 0xA5, 0xCA, 0x37, 0xD9, 0xB3, 0xF0, 0x4C, 0x11, 0x59, 0xA8, 0x0A, - 0x71, 0x15, 0xBC, 0x96, 0xEC, 0x63, 0xDF, 0x91, 0x2B, 0xA8, 0x81, 0xB5, 0xAD, 0xAB, 0x76, 0xAD, - 0x17, 0x63, 0xB5, 0x6D, 0xD7, 0x5F, 0xF7, 0x2E, 0xCF, 0xEC, 0xB3, 0xF6, 0x25, 0x37, 0xB9, 0xC6, - 0xE0, 0x97, 0x45, 0xE9, 0x71, 0x86, 0xF0, 0x38, 0x2A, 0xAD, 0x28, 0x2E, 0x3C, 0x5F, 0x6E, 0xEB, - 0xE7, 0xC5, 0x23, 0x14, 0x27, 0xF6, 0x1A, 0xC3, 0xC8, 0x67, 0xEA, 0x52, 0x50, 0xFF, 0x08, 0x23, - 0x61, 0xF1, 0x43, 0x30, 0xF2, 0x85, 0x0E, 0x15, 0x50, 0x18, 0x49, 0x6B, 0x22, 0x82, 0x6B, 0x70, - 0xF5, 0x8D, 0x00, 0xDD, 0x83, 0x37, 0x02, 0x12, 0xFB, 0x43, 0x42, 0x12, 0xB0, 0xE1, 0x8D, 0x04, - 0x27, 0x7E, 0x6E, 0xAA, 0x8E, 0xF2, 0x56, 0xB8, 0x8B, 0x44, 0xC0, 0x35, 0x6E, 0x53, 0xB6, 0x5E, - 0x34, 0xCD, 0x43, 0x34, 0xCB, 0x40, 0xC5, 0xC5, 0xBA, 0xE4, 0xDE, 0xFF, 0xB2, 0x79, 0x3D, 0x97, - 0x1F, 0x1C, 0x94, 0x5C, 0xD1, 0xEB, 0x3E, 0x89, 0x08, 0xF6, 0xB7, 0x00, 0xDC, 0x03, 0xED, 0x88, - 0x24, 0x82, 0x10, 0x14, 0x26, 0x05, 0x49, 0x13, 0x49, 0x03, 0x9A, 0x37, 0x0B, 0x80, 0x85, 0x4D, - 0x87, 0xF3, 0x8D, 0x43, 0xAD, 0xD0, 0x79, 0x6B, 0xEC, 0xD0, 0x7A, 0x93, 0x60, 0x0E, 0xEF, 0xA5, - 0x67, 0xA1, 0x4D, 0xB7, 0x0F, 0x5E, 0x08, 0x5A, 0x03, 0xA1, 0x4C, 0xFF, 0x43, 0xE0, 0x33, 0xC8, - 0x40, 0x69, 0xE9, 0xFF, 0x90, 0x1E, 0x04, 0x6C, 0x20, 0x0F, 0x00, 0xFF, 0x90, 0x2E, 0x32, 0x29, - 0xAC, 0x5A, 0xD5, 0xE0, 0x67, 0x6E, 0x1D, 0x79, 0xB3, 0x0E, 0x6B, 0xDB, 0x3F, 0xF5, 0x2D, 0xA3, - 0xF8, 0xC6, 0x7F, 0xF2, 0x2B, 0xC2, 0xFA, 0xD2, 0xAE, 0xBF, 0xAA, 0xE0, 0xC5, 0xAD, 0xBC, 0x0B, - 0x2D, 0x5D, 0x4E, 0x2A, 0xD7, 0x73, 0xCD, 0x72, 0xBC, 0x8E, 0x88, 0x6C, 0x5B, 0xC3, 0xA4, 0x19, - 0xC6, 0x3A, 0xE8, 0xD9, 0xE5, 0xE5, 0xAA, 0xFD, 0xB5, 0x90, 0x37, 0xA5, 0x7B, 0xEE, 0xB6, 0xE3, - 0x50, 0xE5, 0x66, 0xD9, 0x72, 0xCC, 0xD0, 0x5A, 0xBA, 0x70, 0x01, 0x38, 0x47, 0x23, 0xEA, 0xF5, - 0x60, 0xCF, 0x32, 0x1D, 0x36, 0xC2, 0x00, 0xEB, 0xB1, 0x4D, 0x79, 0x13, 0x0C, 0xBF, 0xF9, 0x0A, - 0xBE, 0x02, 0xAF, 0x6A, 0x18, 0x2F, 0xCE, 0x16, 0x9C, 0x15, 0xC5, 0x2B, 0xEC, 0x7E, 0x55, 0x80, - 0x96, 0x61, 0x70, 0x1B, 0xDC, 0xB0, 0x62, 0x2E, 0x47, 0x40, 0x98, 0xA2, 0x78, 0x4E, 0x33, 0x65, - 0x10, 0x2C, 0x3F, 0x82, 0xD2, 0xF3, 0xE0, 0x51, 0xD0, 0xD4, 0x3C, 0x58, 0xB3, 0x79, 0xFB, 0xC9, - 0xB5, 0xDF, 0x72, 0x72, 0xD5, 0x6E, 0x06, 0x05, 0xBC, 0x22, 0x0E, 0x3F, 0x7D, 0xF4, 0xC7, 0x71, - 0x92, 0xF0, 0x5B, 0xDB, 0x00, 0x95, 0xEC, 0xCA, 0xEA, 0x1B, 0x9F, 0xD7, 0x9B, 0x2B, 0xA4, 0xB1, - 0xD4, 0x46, 0x38, 0x68, 0x5E, 0xF7, 0x37, 0x48, 0x8E, 0xBA, 0xE5, 0xAD, 0x65, 0x43, 0xB2, 0x0A, - 0x25, 0xD0, 0x4D, 0x6C, 0x9D, 0xBF, 0xDC, 0x02, 0x30, 0xFA, 0x66, 0xAC, 0xAA, 0x26, 0xBE, 0x6E, - 0x0D, 0x4D, 0xF0, 0x6C, 0x3C, 0x37, 0xAD, 0x78, 0xD6, 0xBC, 0x62, 0xB8, 0xC5, 0xAA, 0x75, 0x3A, - 0x91, 0x7A, 0x00, 0x67, 0xFF, 0xDE, 0x3C, 0xD7, 0xD4, 0xD6, 0x50, 0x7C, 0x83, 0xDF, 0xE1, 0x8A, - 0xD3, 0xA4, 0xFC, 0xB5, 0x3D, 0x82, 0x2A, 0xBB, 0xB1, 0x3C, 0xCF, 0x2D, 0x27, 0x1F, 0xCE, 0xC5, - 0xDD, 0xE5, 0x16, 0x1C, 0x59, 0xEE, 0x2E, 0xB7, 0x59, 0xA9, 0xF5, 0xEE, 0x72, 0xC7, 0xEA, 0x77, - 0xBB, 0xCB, 0xEA, 0xD7, 0x9D, 0x77, 0xF7, 0x1A, 0xDC, 0x71, 0xAF, 0xE1, 0xBC, 0xD9, 0x00, 0x38, - 0xCF, 0xE1, 0xD6, 0x9B, 0xDD, 0x7F, 0xC7, 0x97, 0xF9, 0x57, 0x31, 0x03, 0x1F, 0x56, 0x23, 0xC8, - 0xD7, 0x4D, 0xC0, 0xC2, 0xDC, 0x8B, 0xB5, 0x95, 0x37, 0x14, 0x7F, 0xED, 0x08, 0xB7, 0xDB, 0x89, - 0x3D, 0x9E, 0x99, 0x0A, 0x25, 0xA3, 0x24, 0x81, 0x0A, 0xBA, 0xAD, 0xCF, 0x1D, 0x46, 0xE8, 0xFA, - 0x3F, 0xC5, 0xE8, 0x61, 0x85, 0x71, 0xB5, 0x62, 0x2C, 0x25, 0x86, 0xB1, 0xB4, 0x6A, 0x57, 0x2D, - 0x5B, 0x5B, 0xD5, 0x7D, 0x5F, 0x4C, 0xE4, 0x48, 0xD3, 0xBB, 0x62, 0x37, 0x89, 0xC9, 0x05, 0xE2, - 0x29, 0xF5, 0x0C, 0x2A, 0x98, 0xDE, 0xB5, 0xBA, 0x50, 0xF9, 0x81, 0xC8, 0x20, 0x28, 0x83, 0x1E, - 0x4F, 0xD5, 0xD0, 0xCB, 0x95, 0xE9, 0x37, 0xA4, 0xE1, 0x41, 0x92, 0xA1, 0x30, 0x7A, 0xBA, 0x40, - 0x29, 0x0D, 0x44, 0x16, 0x0A, 0xC7, 0xE8, 0xB3, 0x96, 0x80, 0xB5, 0xF8, 0x94, 0x1B, 0xFD, 0x70, - 0xE8, 0x5A, 0x6F, 0x29, 0xE1, 0xDC, 0x6B, 0xC6, 0x4A, 0x48, 0xF6, 0xA0, 0x4C, 0x68, 0x11, 0xDD, - 0xBC, 0x7C, 0x23, 0x5F, 0xA1, 0x39, 0x8F, 0x84, 0xCE, 0x8D, 0x98, 0x1C, 0xE7, 0xC6, 0xC1, 0x34, - 0xB4, 0xAE, 0x98, 0x75, 0xC5, 0x8E, 0xC1, 0x1F, 0xD4, 0xEB, 0x7A, 0x22, 0x7A, 0xB5, 0xB1, 0x1D, - 0xB7, 0x20, 0x20, 0xC2, 0xF5, 0x8A, 0xBE, 0x64, 0xD4, 0xEB, 0xA2, 0xB6, 0x72, 0x06, 0xF1, 0xEA, - 0xD1, 0x3B, 0xEA, 0xA0, 0x35, 0x5D, 0x50, 0x1A, 0xB5, 0x51, 0x25, 0xE7, 0x31, 0x3E, 0x8C, 0x86, - 0x28, 0x8D, 0x34, 0xF1, 0xC7, 0x71, 0xCA, 0xF3, 0x13, 0x19, 0x48, 0xF0, 0x03, 0x7D, 0x91, 0x60, - 0xC1, 0x7C, 0x5C, 0xAC, 0x27, 0x4A, 0x6D, 0x50, 0x36, 0xD6, 0xE2, 0x2D, 0xB6, 0xB6, 0xDE, 0x98, - 0x71, 0xBF, 0x4B, 0x01, 0xB2, 0x9F, 0x17, 0x32, 0xBC, 0x1A, 0x0D, 0xD9, 0x8A, 0x71, 0x5F, 0xA7, - 0x0E, 0xD8, 0xDA, 0x7A, 0xB3, 0x51, 0x82, 0x26, 0x91, 0x17, 0xEF, 0x58, 0x0E, 0xD2, 0xA7, 0x4B, - 0x49, 0x23, 0x61, 0x78, 0x21, 0xF2, 0x91, 0xA5, 0x15, 0xAC, 0x39, 0xF8, 0x66, 0xB6, 0x50, 0xA9, - 0xA4, 0x14, 0x67, 0xD8, 0x97, 0x22, 0x2A, 0x8C, 0x21, 0x72, 0x75, 0xAD, 0x60, 0x74, 0xBE, 0xF6, - 0x5A, 0x27, 0x5D, 0xE6, 0x18, 0x6D, 0x58, 0xDF, 0xBD, 0x3A, 0x0B, 0x19, 0x33, 0x69, 0x9B, 0x36, - 0x11, 0x48, 0xBD, 0x5D, 0x66, 0x48, 0xFD, 0x6A, 0x33, 0xB0, 0xAE, 0xA2, 0xC2, 0x06, 0x51, 0xA3, - 0xC1, 0xBE, 0x95, 0x43, 0xC9, 0xFC, 0x96, 0xF0, 0x00, 0xE2, 0x4A, 0xBF, 0x14, 0x97, 0xB9, 0xEA, - 0xF9, 0xE2, 0xAA, 0xDA, 0x4C, 0xB4, 0x8B, 0x2E, 0xDF, 0xF5, 0xCC, 0xE8, 0x30, 0xED, 0xC1, 0xAF, - 0x73, 0xB1, 0x22, 0xB8, 0xA3, 0x60, 0xEB, 0x68, 0x2B, 0xC7, 0x89, 0x46, 0x6C, 0x56, 0xCD, 0x64, - 0xEB, 0x2C, 0xEA, 0xA3, 0x4C, 0x1B, 0xDE, 0x22, 0x3B, 0x46, 0xDE, 0xC2, 0xC5, 0x8B, 0x36, 0x5C, - 0x87, 0x36, 0x56, 0xD8, 0xA8, 0xCD, 0x51, 0xF5, 0x69, 0x57, 0x19, 0x08, 0x8C, 0x03, 0xC6, 0xEC, - 0xB3, 0x24, 0x1C, 0x31, 0x95, 0xC2, 0xD5, 0x17, 0x3C, 0x55, 0x51, 0x1A, 0x17, 0xB3, 0xA2, 0x64, - 0xD0, 0xFE, 0x1A, 0x63, 0x8C, 0x79, 0x8E, 0x07, 0xD5, 0xF4, 0xED, 0x73, 0x9A, 0x7E, 0xF9, 0x71, - 0x11, 0xFA, 0x87, 0x3D, 0xFF, 0xE8, 0xF8, 0x34, 0xFF, 0x52, 0x02, 0xC3, 0x25, 0x89, 0xB2, 0x70, - 0xCB, 0x78, 0x2B, 0xCF, 0xE4, 0x93, 0x66, 0x29, 0xDD, 0x20, 0x1C, 0x8D, 0x52, 0xAB, 0xB9, 0xAE, - 0xC8, 0x0E, 0xA7, 0xAE, 0x32, 0x2A, 0x86, 0xD2, 0xC2, 0xE5, 0xCC, 0xDA, 0xFE, 0xD1, 0xA6, 0x43, - 0x70, 0xB7, 0x5F, 0xFE, 0x16, 0xF3, 0x99, 0xD1, 0x6C, 0x61, 0xDC, 0x1A, 0x13, 0xE6, 0x99, 0xBE, - 0xAA, 0x90, 0x04, 0xE8, 0x79, 0x7E, 0x97, 0x43, 0xBB, 0x7C, 0x35, 0x5D, 0x39, 0x85, 0x03, 0x6C, - 0x5B, 0x3D, 0x8A, 0x67, 0x41, 0xBC, 0xBA, 0x9A, 0x0A, 0x98, 0xB3, 0xBA, 0xA6, 0xE1, 0xD4, 0xBD, - 0x46, 0xED, 0x31, 0x4E, 0xE9, 0x87, 0x70, 0x1A, 0x27, 0x4F, 0xAB, 0x9F, 0xA0, 0xEA, 0xAA, 0x2B, - 0x21, 0x5E, 0xC4, 0x7F, 0x47, 0x6B, 0xC1, 0x63, 0x15, 0x39, 0x92, 0x52, 0x60, 0x65, 0x81, 0x1D, - 0xF4, 0x1D, 0xA2, 0xEF, 0xD9, 0x79, 0x9A, 0x09, 0x3A, 0x6E, 0xAF, 0xE2, 0x36, 0x01, 0xB5, 0x8C, - 0xF5, 0x6A, 0x6F, 0x22, 0x7D, 0xA5, 0x42, 0x8D, 0xE6, 0x95, 0xEF, 0x86, 0x05, 0x6F, 0x1A, 0x3E, - 0x7A, 0x99, 0xB4, 0x21, 0xF5, 0x41, 0x4B, 0x1B, 0xD3, 0xD8, 0x26, 0x1A, 0x49, 0xB6, 0x6A, 0x6D, - 0x65, 0x4C, 0x56, 0x66, 0xFA, 0x4C, 0xE7, 0x68, 0xB9, 0xB4, 0x46, 0x41, 0x6B, 0x5E, 0xD2, 0x3C, - 0xF3, 0x37, 0x5B, 0xFA, 0xF9, 0x70, 0xA2, 0x0E, 0xAF, 0xD8, 0x7A, 0x78, 0xC5, 0xB6, 0xC3, 0xE8, - 0x0E, 0x2B, 0x3E, 0x34, 0xF2, 0x28, 0xF2, 0x73, 0x6B, 0x5A, 0xF7, 0xC4, 0x9D, 0xD8, 0x4F, 0x25, - 0x93, 0x1C, 0xBE, 0x79, 0xDD, 0xDB, 0xD3, 0x2E, 0xB8, 0xEA, 0x0C, 0xE4, 0xC4, 0xEA, 0x84, 0xAA, - 0x1C, 0xB0, 0xE3, 0xA6, 0xD9, 0x84, 0x59, 0x80, 0xC4, 0xB5, 0xFD, 0x74, 0x36, 0xA7, 0x28, 0x12, - 0x9E, 0xFC, 0x31, 0x80, 0x69, 0x30, 0x0B, 0x33, 0x82, 0x4E, 0x52, 0xEA, 0xF1, 0x48, 0xFC, 0xEA, - 0xE4, 0xF4, 0x27, 0x26, 0xDC, 0x3D, 0x77, 0x26, 0x8C, 0x8C, 0x5D, 0xE1, 0x94, 0xCD, 0x4E, 0x42, - 0x6B, 0x55, 0xA7, 0x78, 0xE6, 0x02, 0x75, 0x0C, 0xBC, 0x52, 0x86, 0xD0, 0x3F, 0x77, 0x09, 0x67, - 0xA0, 0x6E, 0x0A, 0x55, 0xD1, 0xEF, 0x5D, 0xC2, 0x58, 0xA6, 0x8B, 0xAF, 0xF3, 0x6F, 0x38, 0xC0, - 0xF1, 0x01, 0xE1, 0x2C, 0x22, 0x81, 0xF1, 0xF7, 0x39, 0x4A, 0x42, 0xA6, 0x73, 0x5D, 0x62, 0xE5, - 0xBB, 0xA2, 0x1D, 0x8E, 0x5B, 0xEA, 0xC4, 0x25, 0x70, 0xA5, 0x43, 0xBD, 0x08, 0x0B, 0x8A, 0x55, - 0x60, 0x50, 0xB6, 0x49, 0xE2, 0xB2, 0xE7, 0x7B, 0x12, 0x88, 0x99, 0x20, 0xFA, 0xE4, 0x9B, 0xEC, - 0x7B, 0xC9, 0x55, 0xEF, 0xDA, 0xB8, 0xBF, 0xE2, 0xBF, 0x37, 0xBD, 0xD1, 0x7E, 0xF8, 0x72, 0x6B, - 0xD0, 0x03, 0xE0, 0x65, 0x08, 0x60, 0x72, 0xD5, 0x37, 0xAB, 0xB0, 0x9F, 0x2F, 0x27, 0xAC, 0x58, - 0xB5, 0x64, 0x32, 0x5F, 0xB3, 0x3D, 0x2B, 0x86, 0x7D, 0x00, 0x33, 0x06, 0xA5, 0xCF, 0x60, 0x18, - 0x00, 0x2A, 0x35, 0xFB, 0xBC, 0x66, 0x0A, 0x60, 0x52, 0x24, 0xD9, 0x85, 0x6F, 0x76, 0x7B, 0x22, - 0xD6, 0x37, 0x8C, 0xBF, 0xD1, 0x93, 0x9B, 0xE9, 0xB4, 0x97, 0xF8, 0x10, 0x25, 0xC9, 0x05, 0xFA, - 0xDB, 0x1C, 0xA5, 0x23, 0x54, 0x3E, 0x32, 0x13, 0x7D, 0x3C, 0xD6, 0x3C, 0x6A, 0xBC, 0x39, 0x55, - 0x72, 0x08, 0x75, 0xE5, 0xCB, 0x92, 0x30, 0xA0, 0xDD, 0x94, 0x9B, 0x0D, 0xA0, 0xBC, 0x10, 0x0B, - 0x6F, 0x89, 0x97, 0x75, 0x43, 0xD0, 0xAD, 0xDA, 0x60, 0x44, 0x26, 0xE3, 0xDE, 0xB0, 0x05, 0x86, - 0xCE, 0x43, 0x91, 0x06, 0xBD, 0x61, 0xFA, 0xB6, 0x04, 0x6F, 0x98, 0x6E, 0x6E, 0x2A, 0x04, 0xC2, - 0xC0, 0x3D, 0x70, 0x83, 0x20, 0xC0, 0x7C, 0x3D, 0xED, 0x77, 0xFB, 0x83, 0x3E, 0x9C, 0x04, 0x71, - 0x3D, 0x99, 0x46, 0xB6, 0x19, 0xBE, 0x48, 0x81, 0xCA, 0x2F, 0x30, 0x51, 0x39, 0x04, 0x26, 0x7E, - 0x4C, 0x7E, 0xCB, 0xC2, 0xD9, 0x0C, 0x45, 0xA0, 0xD3, 0x21, 0x9B, 0x9B, 0xEA, 0x94, 0x41, 0x72, - 0x89, 0xAD, 0xE2, 0x82, 0x91, 0x97, 0xC0, 0x89, 0x27, 0xFA, 0x81, 0x04, 0x80, 0x5C, 0x53, 0x45, - 0x1A, 0x35, 0xC4, 0x8B, 0x94, 0x1E, 0x64, 0x0C, 0x5C, 0xEB, 0x9E, 0xC9, 0x89, 0x40, 0xF4, 0x4D, - 0x54, 0xDF, 0xA4, 0xE8, 0x9B, 0x0F, 0x77, 0x98, 0x75, 0x3A, 0xE8, 0x5D, 0xD0, 0xEB, 0x74, 0xD0, - 0x5B, 0x2A, 0xB2, 0x6E, 0x80, 0x78, 0x73, 0xD3, 0x0E, 0xB0, 0xDB, 0x5D, 0x05, 0x52, 0x65, 0xF7, - 0x2E, 0x10, 0xC5, 0x25, 0xEB, 0x0B, 0x7A, 0x47, 0x55, 0x72, 0xE9, 0xA2, 0x4A, 0x58, 0xB6, 0x79, - 0xB0, 0x31, 0xE1, 0x00, 0xB1, 0x89, 0x81, 0x13, 0x95, 0x7B, 0x7A, 0x88, 0x37, 0x78, 0x9E, 0x95, - 0x70, 0x23, 0x08, 0xC8, 0x10, 0xE0, 0xCD, 0x20, 0xE3, 0x51, 0x22, 0x60, 0xD6, 0xE9, 0xE0, 0x77, - 0xA9, 0xD4, 0x53, 0xF6, 0xBD, 0xC9, 0x66, 0x90, 0x2A, 0xC4, 0x69, 0x16, 0xA6, 0x24, 0x09, 0x29, - 0x2A, 0xEC, 0xB6, 0x97, 0x58, 0x64, 0x16, 0xF2, 0x42, 0xC8, 0x8E, 0x1D, 0xDC, 0x7C, 0x14, 0xF4, - 0x20, 0x0A, 0x7A, 0x30, 0xDC, 0xDC, 0x04, 0x83, 0x0D, 0x06, 0xEE, 0x6D, 0xAF, 0xD3, 0x79, 0x1E, - 0xA0, 0x1E, 0x44, 0x9B, 0xDC, 0xD3, 0x4F, 0x21, 0x02, 0x51, 0x80, 0x61, 0xD8, 0xED, 0xEA, 0x99, - 0x9C, 0x6C, 0x3E, 0x0F, 0xAD, 0x82, 0x3A, 0x93, 0x4A, 0x30, 0x0A, 0x95, 0xB1, 0x5B, 0xBF, 0xD8, - 0x52, 0xF9, 0x21, 0xE2, 0x4D, 0x54, 0xB4, 0x1A, 0x49, 0xA7, 0x57, 0xF3, 0x8E, 0x1C, 0x09, 0xA3, - 0x53, 0x6C, 0xE6, 0xF3, 0x66, 0x4B, 0x82, 0xBC, 0x45, 0x43, 0xB2, 0xB9, 0x09, 0xE2, 0xCD, 0x80, - 0x16, 0x33, 0x68, 0x5D, 0xAC, 0x75, 0x63, 0xA5, 0xC0, 0x0B, 0x17, 0xEC, 0xFF, 0x08, 0x93, 0xE2, - 0x87, 0xC8, 0xB9, 0x18, 0xDB, 0xD3, 0x9F, 0x57, 0x2D, 0x72, 0x8A, 0x0B, 0x30, 0x4C, 0x34, 0xC3, - 0xF4, 0x82, 0x20, 0xC8, 0x3C, 0x2A, 0x4B, 0x95, 0xF2, 0xEE, 0xBA, 0x83, 0x91, 0x27, 0xD8, 0x06, - 0x41, 0xB1, 0x7C, 0x31, 0x3B, 0x71, 0x43, 0xAC, 0xAA, 0xC0, 0x89, 0xE7, 0x1E, 0xB9, 0x30, 0x01, - 0x20, 0xF7, 0x30, 0x4C, 0x60, 0x4F, 0xE2, 0xBB, 0x99, 0x79, 0x89, 0xFA, 0xD3, 0xDE, 0x31, 0xA3, - 0x4A, 0x34, 0x8C, 0xEA, 0xBD, 0xBE, 0xEB, 0xED, 0x93, 0x6E, 0xEA, 0x11, 0x88, 0x8B, 0x30, 0xF7, - 0x37, 0x01, 0x81, 0xF3, 0x1A, 0x55, 0x84, 0xAF, 0x24, 0x37, 0xF0, 0xE9, 0xF9, 0x0F, 0x32, 0x4F, - 0x7D, 0xB1, 0xC1, 0x83, 0xE8, 0x6D, 0xDC, 0xE9, 0x4C, 0xDE, 0x06, 0x64, 0xB9, 0x44, 0xEF, 0x02, - 0xFE, 0x37, 0xD9, 0x77, 0x0F, 0xDD, 0x81, 0x7B, 0xE4, 0xE6, 0x25, 0x0C, 0x0B, 0xE1, 0xC0, 0x28, - 0x10, 0xC1, 0x18, 0xDE, 0x40, 0xF7, 0x90, 0x09, 0xA4, 0x79, 0x69, 0xFC, 0xF3, 0x62, 0xF4, 0xDA, - 0x54, 0x2B, 0x06, 0x17, 0x8F, 0xBD, 0xC4, 0x48, 0x26, 0xEF, 0x44, 0x01, 0x7E, 0x87, 0xF6, 0xDD, - 0x23, 0x77, 0xE0, 0x1E, 0xBA, 0x70, 0x54, 0x84, 0x6F, 0xC1, 0x6C, 0xC1, 0x4F, 0xBC, 0x88, 0xC9, - 0x9E, 0x61, 0x14, 0x24, 0x6C, 0xF5, 0x8A, 0x5A, 0x7A, 0xFC, 0xBA, 0x6E, 0xD2, 0xA5, 0x06, 0x6A, - 0x56, 0xDB, 0x2B, 0x15, 0xAB, 0x03, 0xE5, 0x1E, 0x83, 0x84, 0x06, 0x18, 0xC6, 0x60, 0xD3, 0xBB, - 0xE9, 0xF6, 0xC1, 0x8B, 0x98, 0x7F, 0xDA, 0xEC, 0x6F, 0x7A, 0xFC, 0x1B, 0x1E, 0x20, 0xC0, 0x8E, - 0x1D, 0xB2, 0xEF, 0x3C, 0x87, 0xFD, 0xAD, 0x37, 0x7B, 0xFF, 0x36, 0xAC, 0xFF, 0x8B, 0x18, 0xD6, - 0x8F, 0xF0, 0xB4, 0xD9, 0xAB, 0xFA, 0xCD, 0xDE, 0xB6, 0xF2, 0xAA, 0x7E, 0xF5, 0xFA, 0x95, 0x34, - 0xA9, 0x6F, 0x6D, 0x6D, 0x0B, 0xAF, 0xEA, 0xBD, 0xFE, 0xAB, 0xBE, 0x70, 0xAB, 0x16, 0xA6, 0x77, - 0xA6, 0x5A, 0xBD, 0xEE, 0xED, 0xEE, 0x02, 0x18, 0x71, 0x9F, 0xEB, 0xBD, 0x1E, 0x80, 0x37, 0xCA, - 0xFB, 0x7A, 0xAE, 0xED, 0xF2, 0xE3, 0x40, 0xB9, 0xD6, 0xE2, 0x69, 0x37, 0x93, 0x7D, 0x77, 0xF1, - 0x43, 0x8A, 0xB2, 0xAE, 0x0B, 0xEF, 0xD5, 0x57, 0x91, 0xE8, 0x87, 0x2F, 0xA3, 0xBB, 0xA0, 0x0F, - 0x67, 0x15, 0x37, 0xEA, 0x9B, 0xD5, 0x6E, 0xD4, 0x21, 0x1C, 0xC1, 0x04, 0xCE, 0xE1, 0x7D, 0x35, - 0x84, 0x06, 0x5A, 0xCB, 0x7D, 0xBA, 0xEA, 0x6C, 0x1D, 0x17, 0x4F, 0xD5, 0x64, 0xDE, 0xF3, 0xC2, - 0xBE, 0x5F, 0x09, 0x03, 0x1F, 0xDA, 0xAF, 0x03, 0x46, 0xD6, 0xBB, 0x83, 0xA4, 0xE6, 0x51, 0xAD, - 0x3F, 0xCD, 0xF5, 0x71, 0x49, 0x64, 0x81, 0x39, 0x64, 0x24, 0x08, 0xEE, 0x36, 0x37, 0xD5, 0x1D, - 0x02, 0x7E, 0xD0, 0x81, 0x3A, 0xF4, 0x03, 0x3B, 0x76, 0x32, 0xBF, 0xC4, 0xE7, 0x96, 0x4F, 0x38, - 0x95, 0xA9, 0x2B, 0xCE, 0x51, 0x94, 0x85, 0x0F, 0x32, 0x61, 0x96, 0xF2, 0x3F, 0x4B, 0xD1, 0x83, - 0x13, 0xF9, 0xDC, 0x7C, 0x22, 0x5F, 0x9A, 0x02, 0x9F, 0x47, 0xB3, 0x2B, 0x3A, 0x3B, 0x7C, 0x56, - 0x20, 0x0F, 0xB3, 0x81, 0xDD, 0xB9, 0x9A, 0x8D, 0xD6, 0x5E, 0xBD, 0x76, 0x2E, 0x74, 0x85, 0xDF, - 0x8A, 0x6B, 0xAD, 0x8C, 0xE8, 0x01, 0xA5, 0x59, 0x7C, 0x3B, 0xA7, 0xC8, 0x73, 0xC3, 0x2C, 0x0E, - 0xBB, 0x93, 0x38, 0x8A, 0x50, 0xEA, 0x42, 0x97, 0x66, 0xF3, 0xDA, 0xA3, 0x69, 0x83, 0x36, 0x56, - 0x33, 0x0D, 0x93, 0x8F, 0x56, 0x13, 0x8D, 0x0C, 0x64, 0x25, 0x98, 0x46, 0xE5, 0xFD, 0x7A, 0x1E, - 0x51, 0xEA, 0xCD, 0xEC, 0xA4, 0xD1, 0xF5, 0xDA, 0x5A, 0xAE, 0x3B, 0xF0, 0xC2, 0x76, 0x13, 0x70, - 0x2F, 0x6A, 0x81, 0xDF, 0x79, 0x25, 0x42, 0x2C, 0xD0, 0x0B, 0x64, 0x5E, 0xB9, 0xE9, 0xAE, 0xF9, - 0x62, 0x5B, 0x8D, 0x1A, 0x38, 0x2D, 0x79, 0x44, 0x1A, 0x8E, 0x88, 0xC2, 0xEA, 0x29, 0x4F, 0xDB, - 0x32, 0x62, 0x82, 0xCD, 0xBF, 0xF7, 0xBE, 0x39, 0x12, 0x7B, 0x9C, 0x32, 0xD1, 0x76, 0xC8, 0x33, - 0x86, 0x16, 0x7E, 0x8C, 0x45, 0xE9, 0x7D, 0x39, 0xB8, 0x3B, 0x63, 0x90, 0x0F, 0x21, 0x13, 0x08, - 0x4F, 0x41, 0x26, 0xC7, 0x7B, 0xC2, 0xDD, 0x74, 0x46, 0xC8, 0xC3, 0xA6, 0xD4, 0x3B, 0xD7, 0x15, - 0xA1, 0x9A, 0xBF, 0x8A, 0x9C, 0xA8, 0x4C, 0xD0, 0x78, 0xD3, 0xB2, 0x28, 0xD7, 0x0D, 0x40, 0x63, - 0xF2, 0xED, 0xBA, 0x6D, 0xEA, 0x13, 0x6F, 0x9F, 0x8E, 0x42, 0x30, 0xF9, 0x38, 0xBD, 0x98, 0xE0, - 0x87, 0xD3, 0x38, 0xFD, 0xFA, 0x2B, 0x1B, 0x25, 0x5B, 0x47, 0xB5, 0xA8, 0xF6, 0xEC, 0xEB, 0xCF, - 0xF8, 0x5E, 0xE4, 0x3F, 0x6D, 0xF0, 0x7D, 0x2D, 0x81, 0xFC, 0x39, 0x8E, 0xD0, 0x6A, 0x90, 0xA7, - 0x28, 0xBC, 0xB7, 0x87, 0xC9, 0xF7, 0x7A, 0xF0, 0xA6, 0x25, 0xD6, 0x49, 0x9D, 0xDA, 0xF2, 0x62, - 0xA6, 0x81, 0xE0, 0x3C, 0xC6, 0x8D, 0xA8, 0x22, 0x69, 0xF7, 0x21, 0xC3, 0x53, 0x19, 0x3B, 0xD8, - 0x42, 0xEE, 0xC6, 0x65, 0xA4, 0x84, 0x2C, 0x0F, 0xFB, 0xC5, 0xE4, 0x8E, 0x4A, 0xC7, 0x20, 0xAD, - 0xE3, 0x7A, 0x19, 0x98, 0x1F, 0xA5, 0xA7, 0x74, 0x7D, 0xA5, 0x2C, 0xAA, 0x2E, 0x4C, 0xB6, 0x40, - 0xEC, 0xC3, 0xCA, 0xB2, 0xD4, 0xC1, 0x99, 0x27, 0xA1, 0x34, 0xB3, 0xD9, 0x53, 0x61, 0x8A, 0x6F, - 0x2F, 0x50, 0x75, 0x59, 0x97, 0xDA, 0x9B, 0x36, 0x38, 0xD3, 0x1F, 0xD7, 0x1A, 0x7B, 0xFE, 0x05, - 0xAA, 0xC9, 0x88, 0x52, 0xA4, 0x68, 0x03, 0x99, 0x36, 0x74, 0x37, 0x6B, 0xEE, 0x75, 0xCD, 0x16, - 0xCF, 0x04, 0xB1, 0xCD, 0xE5, 0x62, 0x16, 0x8E, 0xE2, 0xF4, 0xAE, 0xBD, 0x77, 0x73, 0x28, 0x86, - 0x27, 0x65, 0xEB, 0xC0, 0x57, 0xC6, 0xD6, 0x2B, 0x76, 0x95, 0xE6, 0xCE, 0x19, 0x38, 0xE9, 0x4A, - 0xDC, 0x56, 0x85, 0x16, 0x59, 0x4E, 0x2C, 0x35, 0x4C, 0x47, 0xC8, 0x95, 0x34, 0xB6, 0x06, 0xB0, - 0x2C, 0x76, 0xA2, 0x46, 0xF0, 0x66, 0x0C, 0xF9, 0x56, 0x2A, 0x36, 0x46, 0xC8, 0xAC, 0x75, 0x50, - 0xCD, 0x31, 0x58, 0xF3, 0x9D, 0x6C, 0x1F, 0xEB, 0x4B, 0x0B, 0x4B, 0xD5, 0xA2, 0x9D, 0xAF, 0x0F, - 0x53, 0xBA, 0x4F, 0x37, 0x01, 0x6D, 0x66, 0xD2, 0xEA, 0x30, 0xAC, 0x8E, 0x64, 0x56, 0x0A, 0x57, - 0xEE, 0x44, 0xDA, 0x20, 0xB7, 0x38, 0x77, 0x73, 0x13, 0x8F, 0xD5, 0x7F, 0xD2, 0xD0, 0xDB, 0x00, - 0xB2, 0x7A, 0xD5, 0xB6, 0x0C, 0x83, 0x7B, 0xB8, 0x22, 0xBB, 0x63, 0x6C, 0x7B, 0xA0, 0x1A, 0xDD, - 0xCA, 0x12, 0xF1, 0x66, 0xCD, 0x96, 0x6C, 0xBF, 0x18, 0x27, 0xF8, 0x21, 0x70, 0xA5, 0xA2, 0x51, - 0x0B, 0xAB, 0x64, 0x0A, 0x49, 0x7D, 0x79, 0x6F, 0xFF, 0xDC, 0xA8, 0x30, 0xF1, 0xBE, 0xD6, 0x0E, - 0xEA, 0xD6, 0x20, 0xA0, 0x8B, 0xD0, 0xEE, 0xDA, 0x6D, 0x58, 0xED, 0x20, 0x17, 0x7C, 0x0F, 0xC0, - 0x59, 0xEE, 0xF8, 0x85, 0x22, 0xEA, 0x90, 0x59, 0x98, 0x3A, 0x0B, 0x47, 0x3E, 0x0F, 0x1A, 0x38, - 0x71, 0xCA, 0x43, 0xE5, 0xF0, 0x17, 0x3E, 0x43, 0x47, 0x10, 0x63, 0xE0, 0xF4, 0x7B, 0xBD, 0xFF, - 0x18, 0x3A, 0xF7, 0x28, 0xA3, 0xF1, 0x28, 0x4C, 0xBA, 0x61, 0x12, 0xDF, 0xA5, 0x03, 0x87, 0xE2, - 0xD9, 0xD0, 0xE1, 0xD3, 0x33, 0x70, 0x5A, 0x28, 0xAA, 0x26, 0x30, 0xFF, 0xD2, 0x4A, 0xB7, 0x92, - 0xC3, 0x09, 0x6D, 0xD1, 0xFF, 0xEA, 0x59, 0x24, 0xEC, 0xE9, 0x5E, 0x4A, 0xE9, 0x3A, 0xCA, 0xF4, - 0xFC, 0x16, 0xEE, 0x6B, 0x86, 0xB3, 0x82, 0x1F, 0xCD, 0x35, 0xC3, 0x20, 0xE5, 0x25, 0xBD, 0x6E, - 0xD1, 0xB0, 0x11, 0x6B, 0x36, 0xAA, 0x7D, 0xF9, 0x83, 0x38, 0xA8, 0x06, 0x17, 0x00, 0x19, 0xFA, - 0x77, 0x4D, 0xD6, 0x59, 0x38, 0x22, 0xBA, 0x81, 0xF3, 0xE3, 0x02, 0xF9, 0x63, 0x9C, 0x21, 0x23, - 0x93, 0xCE, 0xD0, 0x19, 0xE3, 0x94, 0x76, 0xC7, 0xFC, 0xCE, 0x50, 0x73, 0xC7, 0x5A, 0x37, 0x8C, - 0xAA, 0x2D, 0x89, 0xFF, 0x8E, 0xD6, 0x6D, 0xC9, 0xB6, 0xF8, 0x7C, 0xF6, 0x38, 0x64, 0x2C, 0xB6, - 0xD9, 0x86, 0x3F, 0x63, 0xF7, 0x41, 0x8A, 0xA9, 0xE7, 0xFF, 0xB8, 0xC0, 0xFE, 0xFB, 0xB3, 0xD3, - 0xA3, 0x9B, 0xC3, 0xD3, 0x83, 0x8B, 0x8B, 0x1C, 0x38, 0x0B, 0xD1, 0xED, 0x83, 0x64, 0xF9, 0xF5, - 0x3A, 0xFE, 0x4D, 0xCC, 0xEA, 0x30, 0x6F, 0xEF, 0xB2, 0xDA, 0xDB, 0xF7, 0x74, 0xF6, 0x1E, 0x27, - 0xD1, 0x7A, 0x1D, 0x9E, 0x5C, 0x1E, 0x9C, 0x9E, 0x1C, 0x56, 0xBA, 0xE4, 0x4C, 0x32, 0x70, 0x62, - 0x1A, 0x26, 0xF1, 0x68, 0x98, 0x7F, 0x81, 0x74, 0x33, 0x70, 0xFF, 0xFB, 0x57, 0xF4, 0x34, 0xCE, - 0xC2, 0x29, 0x22, 0xCE, 0x2D, 0x53, 0x7F, 0x6F, 0x6E, 0xF1, 0xE3, 0x0D, 0x99, 0x84, 0x11, 0x7E, - 0xB8, 0x71, 0x6D, 0x9A, 0xE8, 0xA6, 0xEB, 0x2C, 0x9C, 0xDD, 0xDE, 0x7F, 0x38, 0x0B, 0xC7, 0xB9, - 0xC5, 0x8F, 0x5D, 0x51, 0x77, 0xE0, 0xA4, 0x38, 0x45, 0x43, 0x27, 0xCF, 0xDD, 0x06, 0xB0, 0x4C, - 0xAC, 0xB4, 0x40, 0x64, 0x00, 0xDD, 0xCD, 0x2F, 0x8E, 0x53, 0x24, 0x66, 0xEA, 0x1A, 0x4C, 0x36, - 0xE2, 0x1E, 0x08, 0x82, 0xC1, 0xBE, 0xB0, 0x6A, 0xB5, 0x6F, 0x07, 0xA3, 0x11, 0x5F, 0x18, 0x9C, - 0x05, 0x73, 0x81, 0xE1, 0x97, 0x55, 0x00, 0xCD, 0x46, 0x76, 0xB0, 0x0A, 0xA0, 0x20, 0xD7, 0x7A, - 0xEB, 0x43, 0xB0, 0x99, 0x61, 0xD7, 0x01, 0x0E, 0x9F, 0x95, 0xC3, 0x5F, 0xCF, 0x2F, 0xCE, 0xCE, - 0xE5, 0xAC, 0x98, 0x25, 0x17, 0x97, 0xBF, 0x9F, 0x1E, 0xDF, 0xBC, 0x3F, 0x3D, 0x3B, 0xFC, 0xA5, - 0x98, 0x33, 0x3C, 0xA7, 0x4C, 0x20, 0x0F, 0x9C, 0xFE, 0xEC, 0xD1, 0x21, 0x38, 0x89, 0xA3, 0x3A, - 0x5A, 0xB2, 0x4E, 0x57, 0x24, 0x12, 0x19, 0x38, 0xDD, 0x3E, 0x5B, 0x0A, 0x6B, 0x21, 0x69, 0xE2, - 0xB7, 0x02, 0xBD, 0xF7, 0xA7, 0x27, 0x9F, 0x14, 0x62, 0xC5, 0x12, 0x6A, 0xC4, 0x9D, 0x2D, 0x28, - 0xED, 0x65, 0x3D, 0xA8, 0xB3, 0xD5, 0x97, 0x06, 0x26, 0xE8, 0x13, 0x87, 0x50, 0x34, 0xEB, 0xA2, - 0x34, 0x72, 0xE2, 0x74, 0x1C, 0xA7, 0x31, 0x45, 0xC3, 0xDC, 0xDD, 0x5C, 0x8F, 0xE8, 0xDF, 0x38, - 0x9E, 0x95, 0xD3, 0x50, 0x1F, 0x09, 0xE7, 0xE4, 0x7F, 0xFA, 0x20, 0x6C, 0xC8, 0x32, 0x16, 0x5E, - 0x6F, 0xFD, 0xB4, 0xAE, 0x84, 0xFC, 0xCB, 0x9A, 0xE8, 0xAE, 0x87, 0xE2, 0xC1, 0x79, 0x19, 0x41, - 0x43, 0x68, 0xAC, 0x96, 0x7E, 0x02, 0xBB, 0xDF, 0xE4, 0x5E, 0xEC, 0xF4, 0x9C, 0x5E, 0x75, 0x3C, - 0x4E, 0x9C, 0x12, 0x44, 0xFF, 0x60, 0xA4, 0x7F, 0xFD, 0x74, 0x74, 0x7C, 0x7E, 0x7A, 0xF2, 0xE9, - 0xB8, 0x11, 0xF5, 0x1E, 0x5F, 0x6C, 0x2D, 0xE8, 0xAC, 0x27, 0x2F, 0xB4, 0x9A, 0xE3, 0x2C, 0x1C, - 0x1D, 0x07, 0xC8, 0x09, 0x6F, 0x09, 0x4E, 0xE6, 0x14, 0x0D, 0x99, 0xA6, 0x35, 0x70, 0x7A, 0x43, - 0x87, 0xBF, 0x13, 0x64, 0x7F, 0xFC, 0xBD, 0x1B, 0xA7, 0x11, 0x7A, 0x1C, 0x38, 0xFD, 0xA1, 0x33, - 0xC3, 0x71, 0x4A, 0x51, 0xD6, 0xE5, 0x76, 0x4B, 0x22, 0x65, 0x70, 0xF3, 0xF2, 0xF7, 0x25, 0x5F, - 0x55, 0x7B, 0x8E, 0xE2, 0xFB, 0x86, 0xDE, 0xED, 0xCC, 0xA4, 0x5B, 0xBE, 0xD7, 0x9F, 0xCF, 0x66, - 0xE1, 0xDF, 0xE6, 0x48, 0xB2, 0xCF, 0x33, 0x06, 0xFD, 0xCD, 0x5D, 0x9F, 0xA4, 0x32, 0x45, 0x94, - 0x1D, 0x85, 0x2F, 0xC5, 0x49, 0xE4, 0x2A, 0x86, 0xE4, 0x1A, 0x8F, 0x1D, 0xE4, 0x87, 0x29, 0x89, - 0x7D, 0x94, 0xD2, 0x2C, 0x46, 0xC4, 0x03, 0x60, 0xAD, 0xF9, 0x19, 0xDF, 0x75, 0x7F, 0x5C, 0xC4, - 0xB9, 0xA9, 0xF2, 0x10, 0xB5, 0x27, 0xAC, 0x6C, 0x7C, 0xAB, 0x1B, 0xDB, 0x46, 0xA3, 0xE1, 0xAC, - 0x52, 0x5D, 0x4C, 0x54, 0x42, 0xFF, 0xE4, 0xD3, 0x9F, 0x8E, 0xCF, 0x2F, 0x8F, 0x8F, 0x6E, 0x8E, - 0x8E, 0x3F, 0x1C, 0xFC, 0x7A, 0x7A, 0x79, 0x73, 0x78, 0x76, 0x7A, 0x76, 0x5E, 0xC2, 0x30, 0x11, - 0xD6, 0x41, 0x1F, 0x73, 0x92, 0x78, 0x66, 0xB6, 0x43, 0xF0, 0x3C, 0xE4, 0xDB, 0xBA, 0xB3, 0xCF, - 0x50, 0x4D, 0x1D, 0xCC, 0xBF, 0x34, 0x59, 0x9C, 0xCA, 0x7A, 0xBF, 0x0C, 0xDD, 0x2F, 0xB2, 0x72, - 0xF1, 0x74, 0x1E, 0xE7, 0x4C, 0xEE, 0x4A, 0xF3, 0xAA, 0xD2, 0x96, 0xEB, 0x16, 0xA8, 0xDC, 0x66, - 0xE7, 0xE6, 0xF7, 0x47, 0xEA, 0x2A, 0x1A, 0x05, 0xB5, 0x73, 0xA8, 0xBC, 0xF0, 0x1A, 0xA2, 0xB7, - 0x01, 0x1D, 0xA2, 0xC2, 0x03, 0x03, 0xAD, 0x08, 0x4F, 0x6B, 0x31, 0xC7, 0x9B, 0xFA, 0x35, 0x02, - 0xF5, 0xAB, 0x0A, 0x11, 0x62, 0x0B, 0x81, 0x9C, 0x7B, 0x1B, 0x34, 0x61, 0xF2, 0x8E, 0x0E, 0x81, - 0x05, 0xB8, 0x30, 0xF8, 0x55, 0x4C, 0xAA, 0x05, 0x64, 0x3C, 0xF3, 0x80, 0xCA, 0xB8, 0x73, 0xCE, - 0x5F, 0xC4, 0x9B, 0xEF, 0xBC, 0x1A, 0xE8, 0xD2, 0x68, 0xF5, 0x96, 0x80, 0x54, 0x66, 0x01, 0x6D, - 0xB9, 0x6E, 0x26, 0xBD, 0x68, 0xF0, 0x3E, 0x99, 0x17, 0x71, 0x03, 0x1B, 0xAE, 0x41, 0xA4, 0x71, - 0xF3, 0x5E, 0xB5, 0xF9, 0xC0, 0x44, 0xD1, 0xAA, 0x46, 0x61, 0x14, 0x15, 0x2D, 0x2E, 0xF4, 0x81, - 0x50, 0xE2, 0x25, 0xAF, 0x6A, 0x0D, 0xB2, 0xDA, 0x6E, 0x1B, 0x18, 0xE9, 0x32, 0x94, 0xAA, 0x09, - 0x07, 0x8D, 0x35, 0xEB, 0xA4, 0x6E, 0x01, 0x77, 0xD5, 0xBB, 0x06, 0x45, 0x44, 0xC0, 0xC2, 0xFA, - 0xEE, 0xB7, 0xE2, 0xAA, 0x2C, 0xC4, 0x69, 0xC4, 0x0D, 0xF1, 0xC4, 0xEB, 0x35, 0xDE, 0xBB, 0x74, - 0xFB, 0x00, 0x6E, 0xA0, 0xE5, 0xB2, 0x1E, 0xCA, 0x14, 0x5D, 0xF5, 0xAF, 0x57, 0xE6, 0x61, 0x83, - 0x59, 0x40, 0xD7, 0xAA, 0x97, 0x16, 0xCE, 0x8B, 0x04, 0xF6, 0x00, 0xC4, 0x85, 0xD3, 0x56, 0xD6, - 0x86, 0x1C, 0x1B, 0x7C, 0xDA, 0x1C, 0x24, 0x77, 0xB9, 0xC4, 0x6F, 0x7B, 0x65, 0xCC, 0xC3, 0xEA, - 0xD2, 0x3A, 0x92, 0x3F, 0x3F, 0x64, 0xE1, 0xDD, 0x54, 0xE4, 0x63, 0x8B, 0xC7, 0x5E, 0x5C, 0x78, - 0xA4, 0xA0, 0xAB, 0xDE, 0xF5, 0x3B, 0x7A, 0xD5, 0xBB, 0x1E, 0x86, 0xB6, 0xE0, 0xF6, 0x1C, 0x88, - 0xA6, 0xB4, 0x5A, 0xA8, 0x29, 0x8C, 0xF7, 0x59, 0x9B, 0x01, 0x6B, 0x0D, 0xE3, 0x7D, 0xF6, 0xCF, - 0x80, 0x15, 0x40, 0xDC, 0x4D, 0x37, 0xFB, 0x40, 0x3A, 0xD2, 0xAB, 0x3E, 0x48, 0x10, 0x04, 0xA9, - 0xA8, 0xD4, 0x83, 0x93, 0x20, 0x0D, 0x82, 0x20, 0x13, 0xED, 0x9B, 0xCC, 0x67, 0xCF, 0x44, 0x06, - 0x4E, 0xB4, 0x69, 0x66, 0x14, 0xE0, 0x6E, 0xDA, 0xE5, 0x6F, 0x4A, 0x9E, 0x03, 0x63, 0xB3, 0x0F, - 0xED, 0x7C, 0xC2, 0x8D, 0x79, 0x23, 0x00, 0x60, 0xBA, 0x11, 0x04, 0xB8, 0x10, 0x61, 0x59, 0x10, - 0x04, 0xF8, 0x8F, 0x1B, 0x04, 0x86, 0x3D, 0x88, 0x00, 0xC8, 0xF3, 0xC6, 0x55, 0x61, 0x82, 0x0A, - 0x75, 0x04, 0xF0, 0x1A, 0x20, 0x79, 0x57, 0x1D, 0xF4, 0x0B, 0x87, 0xBB, 0x76, 0x69, 0x2B, 0x1D, - 0x00, 0x2A, 0x96, 0x1F, 0x19, 0x28, 0x77, 0x55, 0x00, 0xE2, 0xCC, 0xF0, 0xFB, 0x45, 0xCF, 0x6B, - 0x22, 0x82, 0x49, 0x34, 0xB7, 0x29, 0x02, 0xF0, 0xEA, 0x26, 0x2D, 0x36, 0xD9, 0xC2, 0xE6, 0xED, - 0xC5, 0x5D, 0x2A, 0x1D, 0x83, 0x33, 0x25, 0x6C, 0xB9, 0xE6, 0xC8, 0x53, 0xD5, 0x80, 0x45, 0xDE, - 0x70, 0x75, 0xD8, 0x2C, 0x80, 0x55, 0xCC, 0xD6, 0x35, 0xEC, 0xAE, 0xF2, 0x29, 0xC4, 0xA1, 0x94, - 0x60, 0x1E, 0xC8, 0x0D, 0x41, 0x64, 0x49, 0x4B, 0x64, 0x17, 0x1A, 0xB7, 0x21, 0x51, 0x21, 0x12, - 0xED, 0x15, 0x20, 0xF9, 0x03, 0x1E, 0x05, 0x64, 0x2B, 0xFD, 0xC8, 0x85, 0xC6, 0xFD, 0x9E, 0x9D, - 0xC8, 0x0C, 0xEF, 0x4A, 0x34, 0x4C, 0xD9, 0x86, 0x9E, 0x9A, 0x1B, 0x7A, 0x8D, 0x16, 0x57, 0xE9, - 0x35, 0xA4, 0x41, 0xDA, 0x3A, 0x0A, 0x2E, 0x1B, 0xF1, 0xEA, 0xAC, 0xA9, 0x77, 0x88, 0x7A, 0x94, - 0xBB, 0x7A, 0xAE, 0x85, 0x2F, 0xD7, 0x7E, 0xD4, 0x0B, 0x82, 0xAA, 0xE3, 0xC2, 0x55, 0x7A, 0xAD, - 0x1F, 0x7B, 0x58, 0xBE, 0x15, 0x2F, 0x44, 0x9A, 0x28, 0xA7, 0x0D, 0x87, 0xB6, 0xE6, 0x3C, 0x32, - 0xDD, 0x49, 0x4A, 0xFB, 0x7B, 0x07, 0x59, 0x16, 0x3E, 0x35, 0x7A, 0x02, 0x00, 0x00, 0xEB, 0xBC, - 0x52, 0xDB, 0xE6, 0xE4, 0x95, 0x3A, 0x7E, 0xF0, 0x30, 0xA4, 0x90, 0x06, 0x41, 0x10, 0xC3, 0x90, - 0xBB, 0xA1, 0xB4, 0x2F, 0x81, 0x66, 0x39, 0xD6, 0x8C, 0x39, 0x13, 0x3D, 0x3C, 0x74, 0x59, 0x55, - 0x55, 0xD5, 0xCF, 0x37, 0xBF, 0xF8, 0x3F, 0x2E, 0xC6, 0x35, 0x8D, 0x96, 0x1F, 0xC9, 0xF3, 0x2F, - 0xB9, 0xE5, 0x02, 0x58, 0x3D, 0x84, 0x47, 0xF4, 0x10, 0x25, 0x49, 0x71, 0xC3, 0x8B, 0xFC, 0xC7, - 0x3E, 0x44, 0xFE, 0xE3, 0x16, 0x44, 0xFE, 0x13, 0xFB, 0xEB, 0x89, 0xFD, 0xC5, 0xF1, 0xDB, 0x28, - 0x12, 0x8F, 0x9B, 0xF7, 0xBE, 0xDF, 0x02, 0xA9, 0x0F, 0x72, 0x4B, 0x03, 0xD3, 0x53, 0x35, 0x1E, - 0x17, 0x81, 0xDD, 0x6A, 0x14, 0x89, 0xAF, 0xAF, 0xD0, 0xB5, 0x7E, 0x37, 0x53, 0xFF, 0x4E, 0xAE, - 0xAF, 0xE8, 0x35, 0xEC, 0xF6, 0xC5, 0xEB, 0x21, 0xFE, 0x2F, 0x05, 0x5C, 0x4B, 0x42, 0x1B, 0x3C, - 0xBC, 0x77, 0x2C, 0x5C, 0x5D, 0x2B, 0xAF, 0xA7, 0xB2, 0x52, 0x17, 0xF6, 0x30, 0xEA, 0xB4, 0x50, - 0x80, 0xD0, 0xF5, 0x90, 0x74, 0x3A, 0x9E, 0x0A, 0x59, 0xC2, 0x54, 0xF9, 0xE2, 0x71, 0x7C, 0x90, - 0xEE, 0xBB, 0x73, 0x35, 0x34, 0x77, 0xA0, 0x62, 0xF9, 0x6F, 0x6E, 0xA2, 0x77, 0x41, 0xD6, 0xE9, - 0x78, 0x28, 0xE8, 0xC1, 0x78, 0x73, 0x93, 0xBF, 0x5B, 0x98, 0x89, 0x77, 0x0B, 0x3B, 0x70, 0xEE, - 0x9F, 0x08, 0x9F, 0x05, 0x1A, 0x57, 0x5F, 0xD8, 0xF3, 0xB7, 0xF4, 0xD6, 0x8C, 0x57, 0x73, 0xDB, - 0xB3, 0x86, 0x57, 0xAC, 0xB8, 0xF6, 0x06, 0xE2, 0x35, 0x07, 0x62, 0x4D, 0x84, 0xF5, 0x86, 0x7D, - 0xAA, 0x24, 0xC2, 0x9A, 0x55, 0xFD, 0xC5, 0x66, 0x39, 0xDC, 0x7E, 0xF5, 0xFA, 0xDF, 0xB9, 0xB0, - 0xFE, 0x05, 0x7D, 0x05, 0x0B, 0xAF, 0x99, 0x80, 0xB6, 0x1A, 0x8A, 0xAA, 0x9F, 0xB5, 0xF1, 0xAB, - 0xF6, 0xA1, 0x30, 0xDC, 0x15, 0x9F, 0x0C, 0xC3, 0x64, 0x51, 0xA8, 0x7E, 0x5E, 0x5C, 0x9E, 0x9F, - 0xFC, 0x72, 0x7C, 0xF9, 0xF3, 0xF9, 0xD9, 0xAF, 0x3F, 0xFD, 0xAC, 0x4B, 0xEB, 0xFD, 0x9B, 0xB6, - 0xFF, 0x80, 0xFA, 0x47, 0x27, 0x1F, 0xF5, 0xDF, 0xC5, 0x3D, 0x44, 0xDD, 0xF9, 0x51, 0x38, 0x3A, - 0xE2, 0x20, 0xF6, 0xF6, 0x76, 0xB6, 0x85, 0xEF, 0xE3, 0x6E, 0xBF, 0x6F, 0xA4, 0xF3, 0xE2, 0xAE, - 0x8F, 0xC2, 0xE1, 0x31, 0xD1, 0x4E, 0x90, 0x11, 0xFB, 0x6B, 0x6B, 0xEF, 0x8D, 0x70, 0x7D, 0x14, - 0x2E, 0x92, 0x73, 0xEE, 0x40, 0xB9, 0xBD, 0x03, 0x86, 0xA5, 0x1E, 0xA5, 0xA7, 0xD7, 0x2D, 0x4E, - 0x22, 0x17, 0x9A, 0x78, 0x29, 0xFF, 0xC8, 0x78, 0xCA, 0xCA, 0x4B, 0xE8, 0xCB, 0x4F, 0xE2, 0xCA, - 0x82, 0x7D, 0xAD, 0x0E, 0x57, 0x56, 0x28, 0x64, 0x0D, 0xB4, 0x13, 0x4A, 0xB9, 0x99, 0xD1, 0x2C, - 0xFE, 0x8A, 0xE8, 0x24, 0xC3, 0xF3, 0xBB, 0x09, 0xAB, 0x5B, 0xA2, 0xB1, 0xAC, 0x24, 0xB6, 0x6A, - 0xE3, 0xAB, 0x39, 0x2D, 0xA5, 0x3A, 0x5D, 0x6E, 0x11, 0x36, 0x6A, 0xD6, 0xE7, 0xB6, 0x5A, 0x9F, - 0x27, 0xB9, 0x68, 0x64, 0x92, 0x4A, 0xED, 0x30, 0xAB, 0xD5, 0x6D, 0x20, 0x80, 0x6C, 0x51, 0xD0, - 0x81, 0x5F, 0xE8, 0x8D, 0xDB, 0xA3, 0x40, 0x40, 0x0C, 0x74, 0x22, 0x23, 0xA1, 0x86, 0x17, 0x71, - 0x20, 0x26, 0x61, 0x16, 0x8E, 0x28, 0xCA, 0xFE, 0x07, 0x66, 0x1A, 0xBE, 0xF2, 0xD0, 0xA4, 0x76, - 0x4F, 0xCF, 0xB8, 0xD9, 0xA7, 0xB3, 0x2D, 0x26, 0x44, 0x3D, 0x36, 0x6F, 0x5A, 0x32, 0x15, 0x55, - 0x62, 0xF0, 0x3E, 0xE0, 0xEC, 0x2B, 0xDB, 0x33, 0xB9, 0x26, 0x13, 0xFA, 0xEC, 0xCF, 0x23, 0x1D, - 0x9B, 0xE0, 0x66, 0x84, 0x93, 0xF9, 0x34, 0x15, 0xAA, 0x01, 0xCF, 0xDD, 0xB9, 0xD1, 0x5F, 0x61, - 0x38, 0xA8, 0x1C, 0x67, 0x78, 0x9A, 0xC9, 0xC2, 0x49, 0x56, 0x1F, 0x5E, 0xD2, 0x28, 0xA0, 0x4D, - 0x7D, 0xC4, 0x79, 0xA1, 0x08, 0x21, 0xED, 0x87, 0x3B, 0x81, 0x09, 0xBC, 0x81, 0x63, 0xB5, 0xC1, - 0xDE, 0x05, 0x65, 0x22, 0x37, 0x1E, 0x7F, 0xE1, 0x2C, 0x68, 0xA3, 0x3E, 0xDB, 0x06, 0x78, 0x41, - 0x74, 0xA8, 0xBE, 0x13, 0x2F, 0x16, 0x57, 0xB7, 0x17, 0x41, 0x4F, 0xAB, 0xC1, 0xD4, 0x8C, 0x3F, - 0x2E, 0xF7, 0x96, 0x1B, 0xD0, 0xED, 0x0F, 0x29, 0x93, 0xD7, 0xB4, 0xDB, 0x05, 0x3C, 0x4B, 0x43, - 0x82, 0xC3, 0x88, 0xD1, 0xD0, 0xA3, 0x15, 0xFA, 0x02, 0xF1, 0xDC, 0x2C, 0x42, 0x1E, 0x60, 0xE7, - 0x4A, 0xFF, 0xD3, 0xAF, 0xA7, 0xA7, 0x37, 0x87, 0xC7, 0xEC, 0x7F, 0x67, 0x47, 0xC7, 0xCB, 0x25, - 0x93, 0xC4, 0x41, 0x10, 0x84, 0x60, 0x71, 0x11, 0xD0, 0xCD, 0xFE, 0xF0, 0x36, 0x43, 0xE1, 0xD7, - 0x5C, 0x8C, 0x75, 0x1A, 0xD4, 0x27, 0x50, 0xBA, 0x2A, 0x72, 0x3C, 0x0F, 0x83, 0x6E, 0x1F, 0xDE, - 0x4A, 0x64, 0x87, 0xB7, 0x6F, 0x2F, 0x86, 0xB7, 0x4C, 0x57, 0x37, 0xB0, 0xB9, 0xAD, 0x62, 0xC3, - 0xDB, 0xDD, 0x04, 0xE5, 0x52, 0x86, 0xE2, 0x6F, 0x22, 0x92, 0xED, 0x50, 0xA6, 0xB6, 0xBD, 0x01, - 0x8B, 0xF1, 0xD5, 0xED, 0x75, 0x70, 0xC8, 0x84, 0x1A, 0x8D, 0xD3, 0x39, 0xCA, 0x05, 0x65, 0x36, - 0xFA, 0xF0, 0x29, 0xB8, 0x85, 0x0F, 0x15, 0x10, 0xAC, 0xDD, 0xCC, 0x78, 0x8E, 0x7F, 0x1B, 0x04, - 0xC1, 0xEC, 0xAA, 0x77, 0x7D, 0xD5, 0xBB, 0x66, 0x23, 0xDB, 0xE8, 0x69, 0x87, 0x8A, 0x99, 0x48, - 0x9A, 0xEA, 0x81, 0xE1, 0x43, 0x20, 0xDC, 0x86, 0xE5, 0x34, 0x48, 0x0E, 0xF4, 0xCA, 0x80, 0x21, - 0x2A, 0x5E, 0xE2, 0xE8, 0xF7, 0x37, 0x1B, 0x3D, 0xC8, 0x8D, 0x10, 0xF4, 0x8A, 0x47, 0xD3, 0xE7, - 0xB6, 0x19, 0xD6, 0x13, 0x7C, 0x12, 0x86, 0x9A, 0x3E, 0xBC, 0x09, 0x1E, 0x8C, 0x51, 0x49, 0x7A, - 0x1E, 0xDB, 0x79, 0xA7, 0xB8, 0xF8, 0x9F, 0x85, 0xA9, 0x88, 0x72, 0x7C, 0xF3, 0xAE, 0xDF, 0xE9, - 0x78, 0xC7, 0xA5, 0xE3, 0x68, 0xF2, 0xE2, 0x86, 0x9F, 0x36, 0x01, 0xBC, 0x30, 0xBE, 0xE9, 0x1C, - 0x45, 0xC2, 0xE3, 0xC3, 0x85, 0xE1, 0xBB, 0xE0, 0xB6, 0xD3, 0x09, 0xDF, 0x06, 0x4F, 0x9D, 0x8E, - 0x17, 0x06, 0xB7, 0x00, 0xC0, 0x8D, 0xDA, 0xAA, 0xD5, 0xCF, 0xC0, 0x7F, 0xE6, 0x9E, 0x30, 0x9D, - 0x0E, 0x11, 0x24, 0x0B, 0x01, 0x79, 0x88, 0xE9, 0x68, 0xE2, 0x1D, 0x57, 0x0C, 0x77, 0x65, 0xE1, - 0x0A, 0xE0, 0xA4, 0xD3, 0x69, 0xAC, 0x62, 0x48, 0x58, 0x00, 0x33, 0xB0, 0x18, 0x85, 0x04, 0xB9, - 0x4C, 0xFC, 0x0D, 0x1A, 0x9B, 0x54, 0x44, 0x27, 0x10, 0x6C, 0x38, 0xE4, 0x2D, 0x0D, 0xD5, 0x73, - 0x45, 0xFB, 0x8A, 0x38, 0x55, 0x50, 0x22, 0x91, 0xD1, 0x7C, 0x65, 0xEF, 0x85, 0xA0, 0xE7, 0x99, - 0x39, 0x1E, 0xFC, 0x98, 0xBC, 0xC7, 0x49, 0xE4, 0x01, 0xDB, 0x58, 0x8B, 0xBD, 0x10, 0x40, 0x56, - 0xF3, 0x84, 0xEF, 0x6A, 0xF6, 0xBA, 0xE6, 0x2E, 0x28, 0x6A, 0x1F, 0xC5, 0x53, 0x7B, 0x55, 0xBD, - 0x91, 0x4A, 0xA8, 0xE9, 0x7D, 0x4C, 0xE2, 0xDB, 0x04, 0x79, 0x60, 0xFF, 0xB8, 0x64, 0x61, 0xC7, - 0xFE, 0x6F, 0x3F, 0x9F, 0x5C, 0x1E, 0x5F, 0x7C, 0x3E, 0x38, 0x3C, 0x96, 0xEB, 0xF9, 0xE7, 0x83, - 0xF3, 0x41, 0xB9, 0x12, 0xE7, 0x41, 0x26, 0x5F, 0x88, 0xC7, 0x74, 0x35, 0x6B, 0x13, 0xDE, 0x4F, - 0x71, 0x72, 0x01, 0x9C, 0xB7, 0xCA, 0x68, 0x7D, 0xF9, 0x71, 0x51, 0xDB, 0xAC, 0xF3, 0xEE, 0x8F, - 0x8B, 0x07, 0x5F, 0xBC, 0x68, 0x40, 0x91, 0xAF, 0x27, 0x89, 0x1F, 0x8A, 0xF3, 0x2F, 0x00, 0xBA, - 0x8E, 0x1B, 0x04, 0x41, 0x09, 0x1F, 0x0E, 0xBA, 0x14, 0x10, 0xE7, 0xFF, 0xFC, 0x6F, 0x17, 0xC0, - 0x8D, 0x12, 0x06, 0xDC, 0x7B, 0x5A, 0x27, 0xA1, 0x07, 0x40, 0xCE, 0x44, 0xF9, 0xFB, 0xF9, 0x4F, - 0xEF, 0x3D, 0x00, 0x8E, 0xAD, 0xC7, 0x15, 0x5E, 0x21, 0xF8, 0x92, 0xDD, 0xDD, 0x7A, 0x3F, 0x2E, - 0xE6, 0xBE, 0x76, 0x32, 0x67, 0x8B, 0xDB, 0xA7, 0x58, 0xB7, 0xE7, 0xC4, 0x29, 0x83, 0xF5, 0x00, - 0xF0, 0xFF, 0x8A, 0xE3, 0xD4, 0x73, 0xA1, 0x0B, 0x72, 0xF0, 0xA5, 0xC8, 0xE7, 0x85, 0x02, 0x6B, - 0xF5, 0xE1, 0x2A, 0x4B, 0x41, 0x94, 0x85, 0x0F, 0x8C, 0x89, 0x2E, 0xD1, 0x23, 0x3D, 0x49, 0xDF, - 0x67, 0x22, 0x4A, 0x2B, 0x93, 0xA0, 0x9D, 0x8E, 0xC9, 0x60, 0xE8, 0xED, 0x6B, 0x76, 0x92, 0xDA, - 0x0C, 0x5E, 0x03, 0xD8, 0x36, 0xAC, 0x29, 0xBF, 0xF7, 0xBA, 0x42, 0xD7, 0xFC, 0x3E, 0x86, 0x41, - 0xB8, 0x30, 0xB5, 0x20, 0x3B, 0x53, 0x59, 0x74, 0x28, 0x21, 0x88, 0x4F, 0xC5, 0xA8, 0x3E, 0xDC, - 0xC9, 0xE1, 0xC0, 0xAF, 0xA5, 0x82, 0x8F, 0x7C, 0xDB, 0x80, 0xE7, 0xA2, 0xF0, 0xBD, 0xAE, 0x75, - 0x54, 0x2A, 0x10, 0xB5, 0xA4, 0x7C, 0x3D, 0x08, 0x36, 0x36, 0x24, 0xE3, 0xA2, 0x8C, 0x20, 0x21, - 0xD0, 0x0F, 0x0A, 0xFB, 0xCD, 0xE9, 0xF0, 0x34, 0x38, 0x87, 0xE7, 0x01, 0xD2, 0xF2, 0xF8, 0xEB, - 0xF0, 0x6B, 0x70, 0x04, 0x8F, 0x02, 0xCA, 0x05, 0xFC, 0x23, 0x7C, 0x0F, 0x2F, 0x03, 0x1D, 0x6F, - 0xA7, 0x1E, 0xAC, 0x71, 0x8C, 0xB3, 0xE3, 0x70, 0x64, 0x04, 0x83, 0x3B, 0xA0, 0x72, 0xA7, 0x89, - 0x65, 0x78, 0x3A, 0xE8, 0xA1, 0xE0, 0xDD, 0xC2, 0xA5, 0x78, 0xE6, 0x6E, 0x98, 0x59, 0x84, 0x92, - 0xF0, 0x09, 0x65, 0x9D, 0xCE, 0xE5, 0x72, 0x59, 0xBA, 0x43, 0x53, 0xFC, 0xD0, 0xE9, 0x78, 0x47, - 0xC1, 0x6E, 0x6F, 0x7B, 0xBB, 0xBF, 0xB7, 0xF3, 0x9A, 0x61, 0x68, 0xA9, 0xE3, 0x67, 0x77, 0xB7, - 0xE1, 0xBB, 0x77, 0xAF, 0x3B, 0xFD, 0xBD, 0x57, 0xAF, 0x5E, 0x6D, 0xF5, 0x77, 0xE1, 0xA3, 0xB5, - 0x1E, 0x80, 0xE6, 0xD5, 0x99, 0xD1, 0xC3, 0xD7, 0xA2, 0x87, 0xD3, 0xC0, 0x56, 0xA7, 0xDE, 0xC3, - 0x7B, 0x6B, 0x3D, 0x00, 0x2F, 0x03, 0x3E, 0xC4, 0xA0, 0x36, 0x44, 0x90, 0x6B, 0x1B, 0xF5, 0xC7, - 0x22, 0x14, 0x0E, 0x4A, 0x92, 0x93, 0x54, 0x2B, 0x4F, 0x8C, 0x5C, 0x82, 0x05, 0xCE, 0x86, 0x52, - 0xE2, 0x5F, 0x2E, 0x97, 0xD3, 0xE2, 0x46, 0xF6, 0x83, 0xEE, 0xB1, 0xD3, 0xF9, 0x58, 0x45, 0xDC, - 0x5A, 0xCF, 0x86, 0xB9, 0xB5, 0x22, 0x80, 0x0C, 0xE0, 0x63, 0xB3, 0x8F, 0x79, 0x4C, 0xF8, 0x7D, - 0x12, 0x8A, 0xF6, 0xA7, 0xCD, 0xB7, 0xD3, 0x83, 0xE9, 0xEA, 0xEB, 0x63, 0xC6, 0x49, 0x3D, 0x00, - 0x2F, 0xEB, 0x6B, 0xA2, 0x9E, 0x20, 0x81, 0x87, 0x12, 0x80, 0x47, 0x62, 0xB7, 0x72, 0xE4, 0x18, - 0xF6, 0x06, 0xFC, 0xD7, 0xF6, 0xF6, 0xEE, 0xEE, 0xCE, 0xCE, 0xF6, 0xD6, 0xE0, 0x4C, 0xAD, 0xBF, - 0xF3, 0x6B, 0x58, 0x13, 0x92, 0xC6, 0x45, 0xEB, 0x79, 0xFE, 0xC5, 0xDC, 0xC2, 0x1C, 0x45, 0xBB, - 0xC1, 0x59, 0x30, 0xE2, 0x74, 0x52, 0x72, 0xC8, 0x3B, 0x7F, 0xF7, 0xAE, 0xBF, 0x07, 0xCF, 0x19, - 0xDD, 0xB6, 0x76, 0x77, 0xE1, 0xD6, 0xEE, 0x6E, 0xE7, 0x5C, 0x07, 0x37, 0x8C, 0x64, 0xFC, 0x84, - 0x63, 0xF8, 0xA5, 0x76, 0x3D, 0xFB, 0x5F, 0x7F, 0x5C, 0xDC, 0x7B, 0xAC, 0xF9, 0xBB, 0x1E, 0xF0, - 0xA9, 0x52, 0x4C, 0xFA, 0x7B, 0x00, 0xBA, 0x3D, 0x17, 0xEE, 0x81, 0x02, 0x03, 0xB5, 0xFD, 0x1D, - 0xEC, 0x7B, 0x0C, 0xFF, 0x82, 0x97, 0x5A, 0x87, 0x90, 0x36, 0xDD, 0x15, 0x7F, 0x01, 0x80, 0xD3, - 0xA1, 0xC0, 0x28, 0x97, 0x1C, 0xF4, 0xB8, 0x5C, 0x1A, 0x7B, 0x9B, 0xF7, 0x18, 0x8C, 0xE4, 0xCD, - 0xF5, 0x74, 0x9E, 0xD0, 0x78, 0x96, 0x3C, 0x9D, 0xCD, 0xC2, 0x51, 0x4C, 0x9F, 0xBC, 0x33, 0xE8, - 0xEF, 0x02, 0x00, 0xBF, 0xB6, 0x13, 0xDB, 0x14, 0x8F, 0xA7, 0x4C, 0x3C, 0x7E, 0x8F, 0xAC, 0xF5, - 0x4E, 0xB9, 0x68, 0x95, 0x84, 0x9D, 0xCD, 0x92, 0xA7, 0x8F, 0x71, 0x1A, 0x4F, 0xE7, 0x53, 0xB6, - 0x15, 0x65, 0x21, 0xA1, 0xDE, 0x31, 0x3C, 0x83, 0x72, 0x76, 0x4F, 0xAF, 0xE1, 0x03, 0x7C, 0x94, - 0xE2, 0x04, 0x2C, 0x97, 0x0D, 0x74, 0xE2, 0x57, 0xF8, 0xA7, 0x4D, 0x53, 0xAD, 0x24, 0x5E, 0x65, - 0xC2, 0x4F, 0xD9, 0x84, 0xF3, 0xB9, 0x3E, 0x35, 0x27, 0xFD, 0x54, 0x6D, 0x25, 0x8D, 0xB8, 0x21, - 0x8E, 0xD3, 0x7B, 0xA0, 0xA2, 0x9F, 0x99, 0xDC, 0x61, 0xB0, 0xC4, 0xE9, 0x7A, 0xCC, 0xB0, 0x92, - 0x10, 0x06, 0x9B, 0x94, 0x68, 0x71, 0x50, 0x5F, 0x4C, 0x26, 0x39, 0x5A, 0xD8, 0x26, 0xBF, 0x2B, - 0x5D, 0x2D, 0x1D, 0x03, 0xC8, 0x35, 0xFC, 0xCD, 0xCD, 0x43, 0x78, 0x1B, 0x3C, 0xA9, 0xE0, 0x06, - 0xB7, 0x6F, 0x6F, 0xBA, 0xFD, 0x4E, 0x67, 0xEC, 0x93, 0xF9, 0x6D, 0xC8, 0x6D, 0xDB, 0xB7, 0x80, - 0x87, 0x90, 0xF5, 0x36, 0x37, 0x0F, 0x01, 0xBC, 0xCB, 0xED, 0x48, 0x57, 0x0D, 0xAE, 0x7D, 0x6D, - 0x59, 0x6F, 0xE6, 0x97, 0x69, 0x19, 0x06, 0x77, 0x50, 0x58, 0x2E, 0xF9, 0x4B, 0x1F, 0xF4, 0x38, - 0x4A, 0xE6, 0x11, 0xFA, 0x90, 0xE1, 0xF2, 0xE7, 0x23, 0x34, 0x0D, 0xD3, 0x88, 0x00, 0x8F, 0x14, - 0xC7, 0x2A, 0x50, 0x04, 0x89, 0xE3, 0x31, 0x09, 0xF4, 0x45, 0xD7, 0x72, 0x99, 0x2E, 0x97, 0x1E, - 0x6E, 0x3E, 0x44, 0xF9, 0x23, 0x09, 0xFB, 0x30, 0x1C, 0x4D, 0x64, 0xDC, 0x14, 0xC6, 0x23, 0x94, - 0xB3, 0x0C, 0x8C, 0xF9, 0x3F, 0x00, 0x14, 0x61, 0x57, 0x31, 0xB7, 0xC9, 0xA9, 0x65, 0x85, 0x52, - 0x32, 0xCF, 0x50, 0x09, 0x3F, 0x2F, 0x5B, 0x2E, 0x29, 0x4C, 0x97, 0x4B, 0x7B, 0x50, 0xC7, 0x55, - 0xA3, 0x07, 0x96, 0x13, 0xBB, 0x1D, 0x57, 0xA2, 0x70, 0xE5, 0x3D, 0x02, 0x81, 0xB0, 0xC7, 0x3A, - 0x96, 0x7F, 0x8B, 0x1C, 0x9D, 0x78, 0x1F, 0x73, 0x0B, 0x28, 0x3B, 0x84, 0x6C, 0xE0, 0x22, 0x42, - 0xAC, 0xE2, 0x5D, 0xA4, 0x78, 0xF7, 0xC7, 0x05, 0xE6, 0x1A, 0xCD, 0x17, 0x20, 0x6C, 0xF3, 0x46, - 0x0D, 0x91, 0x94, 0xAB, 0xF4, 0x5A, 0x50, 0x78, 0x48, 0xC3, 0x2F, 0x3F, 0x2E, 0x38, 0xD5, 0x6A, - 0x5F, 0xC0, 0x72, 0xE9, 0xBA, 0xF9, 0x8F, 0x0B, 0x9A, 0x0F, 0xBF, 0x80, 0xDC, 0xB2, 0xFD, 0x59, - 0x6E, 0xC8, 0xCA, 0xA6, 0x03, 0x48, 0xAA, 0xC5, 0xC7, 0xA9, 0x8A, 0x5B, 0xB1, 0xE1, 0x6D, 0xC4, - 0xCB, 0xE5, 0x06, 0x01, 0x7A, 0x3C, 0x55, 0x53, 0xC2, 0x7E, 0x7C, 0xD5, 0xBB, 0x7E, 0x1B, 0x90, - 0xAB, 0xDE, 0xF5, 0x3E, 0x7A, 0x17, 0xB0, 0x5F, 0x9D, 0x0E, 0x65, 0x7F, 0xF4, 0xAF, 0x99, 0xAE, - 0x47, 0x44, 0x01, 0xAB, 0xD1, 0xBF, 0x1E, 0xA0, 0xB7, 0xD5, 0x0A, 0xEF, 0x82, 0x72, 0x0D, 0xFA, - 0x4E, 0x7C, 0xA0, 0x6F, 0xD9, 0xCF, 0xE5, 0x92, 0xFD, 0x0A, 0x02, 0xFE, 0x4D, 0x1C, 0xDF, 0x75, - 0x3B, 0x01, 0x49, 0xF4, 0x20, 0xEA, 0xBD, 0x2D, 0x6A, 0x11, 0xA3, 0xFB, 0xDA, 0xC7, 0x12, 0x08, - 0x90, 0xE7, 0x45, 0x68, 0x95, 0xFB, 0x92, 0x73, 0x86, 0xB2, 0x42, 0xBC, 0x8D, 0x87, 0x00, 0x05, - 0x74, 0x13, 0x29, 0x7E, 0x47, 0xF9, 0x58, 0x65, 0x0B, 0x4D, 0x84, 0x7D, 0xBF, 0x6E, 0xF5, 0xD0, - 0x69, 0x43, 0xEB, 0x66, 0xFE, 0x6D, 0xDE, 0xCA, 0x6A, 0xD0, 0xDF, 0x61, 0x2D, 0x6A, 0x81, 0x8D, - 0x9A, 0x92, 0x8F, 0xEE, 0x31, 0x40, 0x15, 0xF3, 0xFF, 0xB8, 0xD9, 0x04, 0x3C, 0xCE, 0xE1, 0xD6, - 0xD6, 0xD6, 0xF6, 0xF7, 0x05, 0xAC, 0xB9, 0x3C, 0xFE, 0xF3, 0xE5, 0xCD, 0xFB, 0x83, 0x8B, 0x63, - 0x76, 0x40, 0x92, 0x76, 0xDA, 0xB3, 0xCF, 0x07, 0x87, 0x27, 0x97, 0xBF, 0x07, 0xB4, 0x41, 0x24, - 0xD6, 0x43, 0xDA, 0xEC, 0xF5, 0xFB, 0xDC, 0xCE, 0xDA, 0x50, 0x7F, 0x6B, 0xF7, 0x15, 0x2C, 0x83, - 0xF6, 0x77, 0x6B, 0x7D, 0x13, 0xA6, 0x3E, 0xC5, 0x19, 0x1A, 0xE3, 0xC7, 0xE5, 0x92, 0xFD, 0x38, - 0x45, 0x77, 0xE1, 0xE8, 0xE9, 0x38, 0xBA, 0x43, 0xFB, 0xEE, 0x2D, 0xA6, 0x14, 0x4F, 0xDD, 0x81, - 0x1B, 0x47, 0x08, 0xDF, 0x65, 0xE1, 0x6C, 0x12, 0x8F, 0xDC, 0x1C, 0xEE, 0xF5, 0x8D, 0xC4, 0xAB, - 0x66, 0xD4, 0x27, 0x6D, 0x89, 0xDF, 0x7D, 0xB5, 0xDB, 0x7B, 0xFD, 0x36, 0x40, 0x8C, 0x7B, 0x82, - 0xDD, 0x57, 0xBB, 0xBB, 0xAF, 0xBF, 0x25, 0x8E, 0x92, 0xFD, 0xE9, 0x6E, 0x40, 0x57, 0x89, 0xDB, - 0x80, 0xFA, 0x31, 0x39, 0x47, 0x84, 0x66, 0xF1, 0x88, 0xA2, 0xE8, 0x33, 0x7E, 0x10, 0x87, 0xB0, - 0x9F, 0x92, 0xA7, 0xD9, 0x84, 0x7F, 0xAC, 0x15, 0xF1, 0x1C, 0x51, 0x27, 0xE3, 0x0F, 0x61, 0x42, - 0x9E, 0x8A, 0xC0, 0x4C, 0xA5, 0xD2, 0xE2, 0xCA, 0x41, 0x04, 0x5B, 0x42, 0xF5, 0xC4, 0x52, 0x1C, - 0x7B, 0x67, 0x3A, 0x27, 0xD4, 0x91, 0xC9, 0xA5, 0xC6, 0xAC, 0x69, 0xE1, 0xCC, 0x80, 0x72, 0x68, - 0xE9, 0x3E, 0x86, 0xAD, 0x08, 0x9B, 0x1D, 0x17, 0xF4, 0xDD, 0xEA, 0x19, 0xF4, 0xDD, 0x7A, 0xC5, - 0x00, 0xAF, 0x22, 0x8B, 0x05, 0x10, 0x9B, 0x34, 0xF3, 0x36, 0x45, 0x7F, 0x78, 0xB3, 0xF3, 0x6A, - 0x4B, 0x75, 0xF0, 0x66, 0x6F, 0xBB, 0x9F, 0x7B, 0x08, 0xE4, 0xCD, 0x73, 0xA2, 0x21, 0x28, 0x00, - 0x8B, 0x11, 0x21, 0x83, 0x85, 0x78, 0x04, 0x33, 0x58, 0x88, 0xD7, 0x42, 0x3D, 0x28, 0x1F, 0x16, - 0xF5, 0x72, 0x38, 0x42, 0x49, 0x62, 0x29, 0xCF, 0xA1, 0x78, 0x10, 0xF7, 0x0D, 0x4D, 0xE1, 0x68, - 0x12, 0x66, 0xF5, 0x72, 0x95, 0xB1, 0x8E, 0xE2, 0x19, 0x83, 0x9F, 0xE7, 0x39, 0xDC, 0xD9, 0xDD, - 0xFB, 0x9E, 0xBC, 0xC1, 0x7A, 0x5B, 0x60, 0xA2, 0x3B, 0x29, 0xB8, 0xA5, 0x52, 0x6E, 0xB1, 0xBE, - 0x2B, 0xB3, 0x73, 0x39, 0x28, 0x82, 0xB4, 0x3A, 0xC7, 0x44, 0x00, 0x38, 0x48, 0x12, 0x91, 0x1D, - 0x5B, 0x87, 0x3D, 0x2E, 0x6F, 0x35, 0x2A, 0xFD, 0x9B, 0x70, 0xFF, 0x28, 0xF6, 0x28, 0x09, 0xBC, - 0x62, 0xD2, 0x56, 0xD8, 0x95, 0x3E, 0x1D, 0xA7, 0x51, 0xE9, 0xC3, 0xB3, 0xBB, 0xBE, 0x43, 0xD4, - 0x19, 0x17, 0xB7, 0xF1, 0xEA, 0x7B, 0x25, 0xA4, 0x72, 0x0D, 0xEC, 0xFE, 0x55, 0x0F, 0x2A, 0xBF, - 0x24, 0x13, 0x19, 0xA9, 0xAB, 0x97, 0x3B, 0x93, 0x85, 0x61, 0x56, 0xD8, 0xF0, 0x79, 0x38, 0x37, - 0x72, 0x8E, 0xB8, 0xAD, 0x20, 0xF2, 0xC0, 0x7E, 0x0D, 0xD2, 0xC0, 0x02, 0xC8, 0x82, 0xED, 0x31, - 0x8F, 0x2A, 0xAC, 0x5C, 0xF8, 0x6A, 0x78, 0x02, 0x15, 0x21, 0xAE, 0xDD, 0x5F, 0xE1, 0x99, 0x4E, - 0x32, 0xC2, 0x79, 0xEE, 0x5A, 0x7B, 0x0E, 0x96, 0xB1, 0x04, 0x45, 0x98, 0x53, 0x73, 0x40, 0x52, - 0x7D, 0x6F, 0xA3, 0x42, 0xC5, 0xDB, 0xA5, 0x0C, 0xF6, 0xAA, 0x77, 0xBD, 0xD9, 0x38, 0x93, 0xC3, - 0x22, 0x7E, 0x56, 0xC3, 0x48, 0xF7, 0xD1, 0x7F, 0x34, 0x7D, 0x0A, 0x82, 0xDE, 0xFE, 0x0A, 0x0A, - 0x55, 0x50, 0xE9, 0x5F, 0x6F, 0x9A, 0x71, 0xA3, 0x1A, 0xDF, 0xA8, 0x82, 0x6E, 0xFF, 0x7A, 0x70, - 0xD5, 0xDC, 0xF3, 0xF7, 0x01, 0x67, 0xA0, 0x1B, 0x20, 0x5C, 0xE7, 0xF6, 0xB9, 0x39, 0x55, 0x31, - 0x59, 0xAB, 0xB3, 0x23, 0xF4, 0x2A, 0x3B, 0xB0, 0x7F, 0xE8, 0xB4, 0xFC, 0x23, 0xA9, 0x53, 0xA4, - 0xA4, 0xAD, 0x8B, 0x0D, 0x7E, 0x6B, 0x61, 0x23, 0xC3, 0x75, 0x6E, 0xAE, 0x7C, 0xF3, 0x63, 0x9E, - 0xB7, 0x31, 0x6F, 0x1B, 0x91, 0x94, 0x9B, 0x8B, 0x5D, 0xA7, 0x16, 0xFE, 0xB1, 0x9D, 0x8E, 0x87, - 0xAE, 0xFA, 0xD7, 0xEF, 0x28, 0x57, 0x74, 0x91, 0x9C, 0x10, 0xA1, 0x9B, 0x2A, 0x0F, 0x52, 0xE5, - 0x44, 0x7C, 0x99, 0xC5, 0x53, 0x63, 0x8B, 0xB3, 0xCA, 0x1C, 0xDB, 0xF4, 0x5F, 0xF5, 0xAF, 0xBB, - 0x01, 0xB2, 0x8C, 0xBB, 0x56, 0x5D, 0xD0, 0xA2, 0xA9, 0xB2, 0xAD, 0xEE, 0xDB, 0xDE, 0xBE, 0x80, - 0x51, 0x95, 0xE6, 0x3C, 0x32, 0xB0, 0x0D, 0x1B, 0xAB, 0xB0, 0xE4, 0x90, 0x1A, 0xB1, 0x0F, 0x7A, - 0x22, 0x70, 0x38, 0xDB, 0xFB, 0xB6, 0x5E, 0xFF, 0xDB, 0x87, 0xE5, 0x5F, 0xC4, 0x87, 0xA5, 0xE2, - 0x33, 0x65, 0x71, 0xFB, 0xE0, 0xAE, 0x1D, 0x58, 0x47, 0xB0, 0x0A, 0x65, 0x04, 0x2B, 0x33, 0x8B, - 0x84, 0x8E, 0x42, 0x15, 0xB6, 0x46, 0xA1, 0xAA, 0xC6, 0x9D, 0xB2, 0x3B, 0x09, 0x88, 0x9B, 0x49, - 0xA9, 0x75, 0x48, 0x8F, 0x5E, 0xE5, 0xDE, 0xCC, 0xAF, 0xE8, 0x8D, 0xB7, 0x07, 0x96, 0x90, 0x4D, - 0xB8, 0x1C, 0xB2, 0x49, 0x45, 0x7A, 0xB2, 0xB5, 0xAB, 0x81, 0x2B, 0xC5, 0x77, 0x9A, 0xA2, 0x90, - 0xCC, 0x33, 0x74, 0x41, 0x19, 0xA7, 0xDC, 0x3D, 0xF1, 0x8B, 0x5D, 0x1E, 0xDB, 0xD0, 0x8A, 0xFD, - 0x9A, 0x11, 0x81, 0x3E, 0x0A, 0xB3, 0x25, 0x2A, 0x45, 0x06, 0xBA, 0x72, 0x8B, 0x27, 0xCE, 0x2E, - 0x74, 0xD5, 0xAB, 0x65, 0xF7, 0xDA, 0x48, 0x5E, 0x28, 0xB1, 0xE1, 0x51, 0x82, 0xB8, 0xB2, 0x32, - 0x09, 0xC9, 0x9F, 0xC2, 0x24, 0x8E, 0x58, 0xCD, 0x8A, 0x4E, 0xC5, 0x29, 0xA8, 0x03, 0xC8, 0x0B, - 0x12, 0xBE, 0xEB, 0xE5, 0x1A, 0x44, 0xC5, 0xF3, 0xB5, 0x32, 0xD0, 0xA2, 0xAB, 0xA1, 0xBA, 0x26, - 0x96, 0xDB, 0x17, 0xFF, 0xD1, 0xE9, 0x68, 0x3F, 0x6B, 0x59, 0x3C, 0x29, 0x25, 0xA0, 0x14, 0x2D, - 0x90, 0xE9, 0xCD, 0x29, 0xAB, 0x57, 0x9E, 0xDD, 0xD7, 0x88, 0x3F, 0x8E, 0xF9, 0xF8, 0xCC, 0x48, - 0xC5, 0x69, 0xED, 0x54, 0xAF, 0x22, 0x0D, 0x57, 0xD8, 0x76, 0x32, 0x14, 0x8C, 0x38, 0xB2, 0x71, - 0x5D, 0x83, 0x0B, 0x4B, 0x29, 0xDD, 0xF0, 0x2A, 0xCF, 0x95, 0x0C, 0x91, 0x79, 0x42, 0x03, 0xCB, - 0x91, 0xA2, 0x44, 0x44, 0x0D, 0x6D, 0x8D, 0x4B, 0x79, 0x6B, 0x4B, 0xFB, 0xA5, 0x02, 0x3B, 0xB6, - 0x74, 0x65, 0xC5, 0xAE, 0x0C, 0x0C, 0xD4, 0x04, 0xA0, 0x74, 0x19, 0xFA, 0x9B, 0x6B, 0xAF, 0xB4, - 0x76, 0x88, 0xB0, 0x12, 0x91, 0x2C, 0x4F, 0x02, 0xCA, 0x70, 0x81, 0xC1, 0x64, 0xF6, 0x7E, 0xBF, - 0x3B, 0xBC, 0x78, 0x23, 0x40, 0x1E, 0x5D, 0xFC, 0xCB, 0xB3, 0x82, 0x02, 0x7C, 0x19, 0x5A, 0x57, - 0x82, 0x82, 0xDD, 0x14, 0x5E, 0x5C, 0x05, 0x08, 0xE5, 0x57, 0x81, 0x72, 0x51, 0x88, 0x1F, 0x13, - 0x99, 0xC5, 0xD5, 0x33, 0x99, 0xC6, 0xB6, 0x24, 0xD4, 0xA7, 0x5A, 0x6C, 0x22, 0x05, 0x03, 0x80, - 0x52, 0x45, 0xB1, 0x2D, 0xEF, 0xBD, 0xF9, 0xF7, 0xBE, 0xFC, 0x2F, 0xB4, 0x2F, 0xDB, 0xFC, 0xEB, - 0x2A, 0x9E, 0x45, 0xF5, 0xFD, 0x9A, 0x3B, 0x56, 0xB6, 0xB9, 0x69, 0x2A, 0x49, 0xA9, 0x37, 0xED, - 0xB4, 0xEC, 0xCF, 0xB0, 0x72, 0xDF, 0x1E, 0x49, 0xE1, 0xD2, 0x53, 0x3F, 0xA7, 0xB7, 0x0C, 0x25, - 0x8E, 0x8E, 0xCA, 0x3A, 0x34, 0xBE, 0x0B, 0x90, 0x3F, 0xBE, 0x13, 0x3F, 0x6E, 0xD9, 0x8F, 0xDB, - 0x3B, 0x4B, 0x75, 0xED, 0x59, 0xC6, 0x57, 0x48, 0x9C, 0xF3, 0xA4, 0x13, 0xFC, 0x73, 0xB1, 0xA5, - 0x6D, 0xF5, 0xDE, 0xBC, 0xEA, 0xEF, 0x6E, 0xE5, 0x85, 0xEB, 0x53, 0x39, 0x27, 0x93, 0x08, 0xC3, - 0x52, 0x38, 0xA5, 0x94, 0xBE, 0x9A, 0xBD, 0xE5, 0xFA, 0x7A, 0xA5, 0x0C, 0xBA, 0x9F, 0x13, 0xC4, - 0x63, 0xA5, 0x31, 0x00, 0xDC, 0x5D, 0x8B, 0x1B, 0x61, 0x2A, 0x76, 0xBB, 0x14, 0x53, 0x27, 0x9E, - 0xCE, 0x84, 0x68, 0x40, 0x91, 0xCB, 0x77, 0xE1, 0x03, 0xA2, 0xDB, 0x28, 0xA0, 0x57, 0x72, 0xFC, - 0x62, 0x64, 0x05, 0x5A, 0xFA, 0xB7, 0x1C, 0x44, 0xF1, 0x9D, 0xA3, 0x74, 0x9D, 0xE7, 0xB5, 0xB9, - 0x1D, 0x71, 0x1D, 0x2B, 0x51, 0x3A, 0xD6, 0x33, 0xEC, 0x44, 0x55, 0x07, 0x41, 0x23, 0x1C, 0x66, - 0xCA, 0xB6, 0x87, 0xF2, 0xD7, 0x93, 0x48, 0x2B, 0x58, 0x0D, 0x2E, 0x94, 0xB9, 0xD6, 0x6B, 0x50, - 0xF1, 0x2A, 0x60, 0x11, 0xAB, 0x7C, 0x3E, 0x56, 0x98, 0x9B, 0x9B, 0x50, 0x1C, 0xA9, 0xB2, 0x01, - 0xCA, 0x87, 0xA5, 0x29, 0xAB, 0x62, 0x27, 0x5E, 0xC0, 0xFE, 0xBF, 0xEC, 0xFD, 0x09, 0x77, 0xDB, - 0x38, 0xB2, 0x28, 0x8E, 0x7F, 0x15, 0x5B, 0xB7, 0x47, 0x43, 0xB4, 0x20, 0x85, 0xD4, 0xE2, 0x45, - 0x32, 0xED, 0x7F, 0xDA, 0x49, 0xBA, 0xFD, 0x9F, 0x74, 0x92, 0x17, 0xA7, 0x6F, 0xCF, 0x3C, 0xB7, - 0x9E, 0x9B, 0x96, 0x20, 0x0B, 0x2F, 0x34, 0xA9, 0x21, 0xA1, 0x24, 0xBE, 0x36, 0xEF, 0x67, 0xFF, - 0x1D, 0xEC, 0x00, 0x09, 0x52, 0x92, 0x93, 0xB9, 0x33, 0x6F, 0x96, 0x73, 0xA6, 0x23, 0x13, 0x40, - 0xA1, 0x00, 0x14, 0x0A, 0x85, 0x42, 0x2D, 0x2C, 0xFB, 0x0D, 0x9E, 0x17, 0x73, 0x64, 0xF6, 0xA6, - 0x8D, 0x16, 0xFD, 0x09, 0x39, 0xA9, 0x69, 0x2F, 0x7C, 0x37, 0x49, 0xA7, 0x03, 0x74, 0x82, 0xA3, - 0x52, 0xA5, 0x2B, 0x32, 0xED, 0xE1, 0x79, 0x18, 0x86, 0x52, 0x75, 0x53, 0x87, 0x4C, 0xBE, 0x8A, - 0xF1, 0x0C, 0x79, 0x04, 0x06, 0xF4, 0x82, 0x25, 0x2F, 0x93, 0x41, 0xE1, 0xB2, 0xAE, 0xE4, 0x7A, - 0x5E, 0x9D, 0xBE, 0xB0, 0x06, 0x33, 0xA9, 0x2C, 0x9A, 0x4E, 0x6C, 0x97, 0x8A, 0x0D, 0x8E, 0x43, - 0x08, 0x70, 0x2F, 0x8B, 0xC7, 0x47, 0xD6, 0x43, 0x0D, 0x30, 0x4C, 0x17, 0x37, 0x0F, 0x89, 0xD3, - 0xA8, 0x90, 0xCB, 0xE9, 0x59, 0xE8, 0xC3, 0x24, 0xF4, 0x61, 0x14, 0xFA, 0x70, 0xC9, 0x33, 0x0E, - 0xBC, 0xBA, 0xF5, 0x7C, 0x00, 0x67, 0xFC, 0x8F, 0x1F, 0xE8, 0x1F, 0x13, 0xED, 0x0E, 0xED, 0x4F, - 0xD0, 0x09, 0x2B, 0xA0, 0xD7, 0xE1, 0x3B, 0x34, 0xE7, 0x3A, 0x07, 0x2A, 0x11, 0x8A, 0x19, 0xD6, - 0xE6, 0x98, 0xA8, 0x6C, 0x8E, 0x09, 0x7D, 0x95, 0xAC, 0xDD, 0x61, 0x8C, 0x69, 0xE4, 0x92, 0x51, - 0xA5, 0x8B, 0xDB, 0xFD, 0x30, 0x5C, 0xCA, 0x47, 0x68, 0xF5, 0xF9, 0x86, 0x7E, 0xE6, 0x59, 0x0B, - 0x50, 0x37, 0x3B, 0x0D, 0xCA, 0x72, 0xAB, 0x5A, 0x8F, 0xF7, 0x3C, 0x65, 0x50, 0x0E, 0x23, 0x98, - 0x40, 0x02, 0x33, 0x30, 0xB1, 0x89, 0x06, 0x59, 0xF4, 0x21, 0xDC, 0xAD, 0xAF, 0xC8, 0x14, 0x14, - 0x19, 0x0B, 0xF6, 0x9E, 0xC0, 0x65, 0x19, 0xE1, 0xC5, 0x2D, 0x9D, 0x9A, 0x32, 0x3E, 0x45, 0xD2, - 0x71, 0x8C, 0x4C, 0x6C, 0x70, 0xD1, 0x49, 0x9D, 0x4D, 0x9C, 0x4C, 0x5E, 0x56, 0x93, 0x4A, 0x87, - 0x39, 0xB6, 0xFD, 0x8D, 0x06, 0x29, 0xE3, 0xAA, 0x57, 0x80, 0x19, 0xEF, 0xDB, 0x32, 0x98, 0x3A, - 0x31, 0xD2, 0x40, 0xA9, 0xB8, 0xDD, 0x51, 0x78, 0x35, 0x9D, 0x90, 0xEC, 0xFE, 0x21, 0xAA, 0x21, - 0xF3, 0x2B, 0x7F, 0x2A, 0x1C, 0x9B, 0xE9, 0xD9, 0x5B, 0xCC, 0x22, 0x32, 0x5B, 0x4A, 0x56, 0x91, - 0xC6, 0xA8, 0x87, 0x18, 0x0F, 0x15, 0x2E, 0xEE, 0x1C, 0xE7, 0x60, 0xAB, 0xDD, 0x4C, 0x3B, 0xB5, - 0xDF, 0x54, 0x5D, 0xDB, 0x5A, 0x77, 0x5D, 0x9A, 0x14, 0x6C, 0xC2, 0x42, 0x54, 0xC0, 0xCB, 0x6E, - 0x91, 0x18, 0x7C, 0x04, 0x31, 0x9B, 0x9E, 0x7A, 0x64, 0x2D, 0x36, 0xC1, 0xE7, 0x84, 0xB7, 0xE5, - 0xA1, 0xE9, 0x15, 0x1C, 0x3A, 0x81, 0x30, 0x2A, 0xEA, 0xAB, 0xD8, 0x89, 0x20, 0x60, 0x16, 0xEE, - 0x07, 0x62, 0x3B, 0xA2, 0xAB, 0x9C, 0x29, 0x7B, 0x23, 0xCD, 0xE8, 0x96, 0x21, 0x9E, 0x2C, 0x4F, - 0xEA, 0x68, 0x64, 0xB2, 0xD4, 0xAE, 0x8B, 0x98, 0x6F, 0x5E, 0xBE, 0xB3, 0x96, 0x6A, 0x33, 0x8B, - 0xBD, 0xBF, 0xDC, 0x92, 0x22, 0x99, 0x79, 0xF4, 0x7E, 0x18, 0x62, 0xAE, 0x5D, 0xCE, 0xDA, 0xED, - 0x88, 0xBD, 0x34, 0x27, 0xED, 0xB6, 0x47, 0x7F, 0x85, 0x4B, 0x8A, 0x30, 0xBD, 0xF9, 0x5F, 0x05, - 0xF4, 0x33, 0xAB, 0x46, 0x7F, 0x87, 0x4B, 0x36, 0x80, 0x4E, 0x27, 0x9F, 0xC2, 0xFD, 0x08, 0x70, - 0x63, 0x10, 0xD1, 0xF6, 0xCC, 0x6A, 0x3A, 0x66, 0xE9, 0x7E, 0x93, 0x4E, 0x38, 0x2B, 0x8A, 0x88, - 0x81, 0x0D, 0xA6, 0xB5, 0x4E, 0x8A, 0xA0, 0x28, 0x72, 0x12, 0x11, 0x3C, 0xDB, 0xB3, 0x96, 0xCB, - 0x48, 0x3A, 0xB1, 0x1F, 0x94, 0x93, 0x08, 0xC8, 0xA1, 0xE4, 0x7A, 0x72, 0x32, 0x35, 0xB7, 0x7C, - 0x60, 0x4C, 0xFD, 0x15, 0x66, 0x57, 0xFE, 0x54, 0xB2, 0x7F, 0x74, 0x95, 0x77, 0x83, 0x29, 0x43, - 0xE5, 0x2A, 0x98, 0x42, 0x34, 0x31, 0x6A, 0x05, 0x8E, 0x5A, 0x4A, 0xE7, 0xC9, 0xAA, 0xB3, 0x3A, - 0x10, 0xC9, 0xD3, 0x22, 0xA7, 0xA7, 0x05, 0x9A, 0xD8, 0x7F, 0xE7, 0xDD, 0x2E, 0x77, 0x26, 0x77, - 0xF7, 0xAF, 0xEB, 0xFA, 0x90, 0x80, 0x3A, 0x04, 0x32, 0x2B, 0xA5, 0x0A, 0xB3, 0x11, 0x67, 0x50, - 0x20, 0x9A, 0xD0, 0x3F, 0x4E, 0x32, 0xA6, 0xC8, 0xF4, 0x6A, 0xAB, 0xE1, 0x90, 0xA5, 0xFE, 0x92, - 0x5C, 0xE0, 0x0C, 0x5D, 0x69, 0x29, 0x5A, 0x8D, 0x7E, 0x8C, 0xD4, 0x19, 0x8C, 0x8A, 0x62, 0x12, - 0xF3, 0x0B, 0xB8, 0x0F, 0x97, 0x65, 0x37, 0xB9, 0x29, 0x8C, 0x1B, 0xC4, 0xD3, 0xB8, 0x80, 0xA3, - 0x20, 0x18, 0x7E, 0xCD, 0xCB, 0x59, 0xF5, 0xB9, 0x5E, 0xBF, 0x9E, 0x39, 0xCA, 0x9C, 0xFE, 0x2B, - 0x75, 0xD9, 0x4B, 0x79, 0x7A, 0x60, 0x25, 0x75, 0x2A, 0xA3, 0x40, 0x23, 0x79, 0x68, 0x34, 0x5B, - 0xA2, 0xF9, 0x85, 0x2A, 0x30, 0x5F, 0xC0, 0x74, 0x96, 0xA6, 0x68, 0x3E, 0x67, 0x4A, 0x26, 0x7A, - 0x4D, 0x47, 0x09, 0xCA, 0xBC, 0x16, 0x8F, 0xCE, 0x6E, 0xE8, 0x6B, 0x4C, 0xE0, 0xBE, 0xBA, 0xCC, - 0x35, 0x40, 0xB8, 0x89, 0xD7, 0x59, 0x1D, 0x80, 0x40, 0xE8, 0x7C, 0xE6, 0xAB, 0xAC, 0xA2, 0xEA, - 0x61, 0x09, 0x8F, 0xE7, 0xA5, 0x98, 0x28, 0x22, 0x8F, 0xA9, 0x00, 0xA0, 0xDB, 0x94, 0x92, 0x2D, - 0x97, 0x46, 0xAB, 0x6D, 0x4F, 0x4A, 0xB3, 0x50, 0x42, 0x48, 0x5E, 0x86, 0xD4, 0x68, 0x58, 0xB0, - 0x7A, 0xE9, 0xAE, 0xD2, 0x5B, 0x46, 0xB9, 0x08, 0xDE, 0x01, 0x59, 0x82, 0xE9, 0x9F, 0xF1, 0x2C, - 0x4B, 0x49, 0x94, 0x7F, 0x34, 0x43, 0x60, 0xBB, 0x27, 0x5A, 0x47, 0xB2, 0x2E, 0x95, 0xD3, 0xFB, - 0xEF, 0xD1, 0xF1, 0x60, 0xF8, 0xEF, 0xFB, 0xEF, 0xBF, 0xC8, 0xFD, 0xF7, 0xE7, 0x74, 0x9D, 0xD7, - 0x2B, 0xA5, 0x75, 0x6E, 0xE3, 0xE3, 0x23, 0xFF, 0x40, 0x0A, 0x29, 0x8D, 0xBC, 0xC0, 0xCE, 0x2F, - 0x6C, 0xDE, 0x93, 0x4C, 0x3D, 0x22, 0x29, 0x54, 0x26, 0x2D, 0x6D, 0xFF, 0x27, 0x07, 0xE8, 0xF9, - 0x30, 0xD5, 0x99, 0xB6, 0x80, 0xC7, 0x37, 0x9F, 0x4C, 0x71, 0xE2, 0x86, 0xD8, 0x33, 0xF5, 0xB4, - 0xD0, 0x81, 0xCA, 0x46, 0x57, 0xF8, 0xAD, 0x33, 0x15, 0x66, 0x8C, 0x49, 0xB0, 0x89, 0x7B, 0x8F, - 0x56, 0x69, 0x66, 0x8C, 0x43, 0x4B, 0x0C, 0xF6, 0x18, 0x2A, 0xC9, 0xC4, 0xCC, 0x41, 0xF1, 0xCB, - 0x87, 0x4C, 0xAB, 0xD9, 0x34, 0xAE, 0xC7, 0x47, 0x66, 0x9C, 0xE6, 0x0B, 0x03, 0x30, 0x9F, 0xFF, - 0x7D, 0xBA, 0x55, 0xE2, 0x46, 0x23, 0x96, 0x2A, 0x6F, 0xBE, 0x4B, 0x33, 0xA9, 0x2B, 0x93, 0xF6, - 0x24, 0x69, 0x3C, 0x36, 0x9E, 0x30, 0x29, 0x12, 0xCF, 0x76, 0x9A, 0x72, 0x00, 0xB3, 0xF4, 0xB3, - 0x0D, 0x22, 0xD8, 0x1E, 0x84, 0xC0, 0x06, 0x7E, 0x29, 0x23, 0x01, 0xE0, 0x7D, 0x19, 0x28, 0xF3, - 0x6C, 0x8F, 0xE4, 0x31, 0x5B, 0x49, 0xA8, 0x07, 0x33, 0x2F, 0xA0, 0x5F, 0xCB, 0x2E, 0xED, 0x53, - 0x18, 0x55, 0x76, 0x47, 0x54, 0xC0, 0x41, 0x7F, 0xF0, 0xEF, 0xDC, 0xEF, 0xFF, 0x2A, 0xAC, 0xD1, - 0xA2, 0x94, 0x2A, 0x6F, 0x3C, 0x08, 0x8E, 0x07, 0xAE, 0x07, 0x3B, 0xA6, 0x01, 0x1C, 0x8D, 0x8E, - 0x0F, 0xB8, 0xA3, 0xF6, 0xE0, 0x60, 0x74, 0xC0, 0x1D, 0xB5, 0xF9, 0x0B, 0xDF, 0x5C, 0xB1, 0xD5, - 0xEB, 0x10, 0x7B, 0x87, 0xFD, 0xBE, 0x60, 0xAB, 0xEB, 0x9D, 0x9E, 0xF8, 0x84, 0x83, 0x6B, 0x0C, - 0xE7, 0x4C, 0xE8, 0xB6, 0xDF, 0xFB, 0x58, 0x10, 0xAF, 0x75, 0xC9, 0x89, 0xD8, 0xE4, 0xBE, 0xB9, - 0x7A, 0x74, 0xA0, 0x67, 0x3E, 0x8F, 0x57, 0xF6, 0x21, 0xCA, 0x3F, 0x32, 0x6D, 0xD4, 0x75, 0xEF, - 0x05, 0xBA, 0x49, 0xD7, 0xC9, 0x0C, 0xCD, 0x2F, 0xE6, 0x31, 0xFB, 0xAE, 0xE4, 0xB8, 0x77, 0x91, - 0x2D, 0xC6, 0x25, 0x08, 0xCD, 0xF3, 0x57, 0xEB, 0x38, 0x7E, 0xCF, 0x23, 0x9C, 0x99, 0xB9, 0xE3, - 0xDF, 0xA0, 0x2F, 0x84, 0x4F, 0x21, 0x4F, 0xFB, 0xF2, 0x36, 0x89, 0xEF, 0x75, 0x9E, 0x76, 0xD6, - 0x52, 0x3D, 0xB1, 0x57, 0x9A, 0x73, 0xBE, 0xF3, 0xAB, 0xF9, 0x44, 0x29, 0xBE, 0xFD, 0x64, 0xBF, - 0x54, 0x9A, 0xEF, 0xEB, 0x44, 0xA5, 0xC8, 0x16, 0xE2, 0x24, 0x4A, 0xE6, 0xF2, 0x67, 0xD9, 0xCC, - 0x77, 0xBC, 0x1F, 0x14, 0xEA, 0x81, 0x4C, 0x1B, 0xCF, 0xED, 0xFA, 0xDC, 0xE9, 0x6E, 0xE9, 0x00, - 0x69, 0x3D, 0x79, 0xD2, 0x01, 0x33, 0x63, 0xD6, 0xB9, 0x4C, 0xE4, 0xBB, 0x6B, 0xBF, 0x4D, 0xED, - 0x6B, 0xC1, 0x3B, 0x71, 0xD8, 0xB5, 0xCF, 0x52, 0x1F, 0x15, 0x98, 0x3C, 0xD2, 0x1D, 0xCF, 0xF7, - 0xB3, 0x0B, 0xEC, 0x6A, 0xBB, 0x0A, 0x38, 0xB3, 0x2F, 0x05, 0xF4, 0x61, 0xCE, 0xB6, 0x09, 0x1A, - 0xB3, 0x94, 0x1E, 0x94, 0x47, 0x29, 0xAB, 0x66, 0xC1, 0x48, 0x55, 0x04, 0x17, 0x99, 0xF4, 0x09, - 0x3C, 0x3E, 0x2A, 0x01, 0x1D, 0xC9, 0x1C, 0x87, 0xDC, 0x1D, 0x37, 0xCD, 0x91, 0xC7, 0xF2, 0x37, - 0x9B, 0x2D, 0xE4, 0x7E, 0xC8, 0xD8, 0xFE, 0x48, 0x04, 0x63, 0x50, 0x5F, 0xBD, 0x58, 0x5C, 0x0F, - 0xA0, 0x27, 0xEE, 0x63, 0x66, 0x63, 0x15, 0xD5, 0xA9, 0x26, 0xD5, 0x49, 0xA9, 0x0B, 0x3B, 0x74, - 0xF8, 0x8B, 0x55, 0xF6, 0x73, 0x9A, 0x60, 0x92, 0xF2, 0xAE, 0x97, 0xBD, 0xCB, 0xD2, 0x67, 0xD5, - 0x77, 0x5D, 0xBB, 0x5E, 0x8E, 0xF4, 0xE5, 0x47, 0xDF, 0x0B, 0x9A, 0x43, 0x3C, 0xD6, 0xA0, 0x5A, - 0x86, 0x5D, 0xAE, 0x15, 0xB1, 0x85, 0x64, 0xC1, 0x0F, 0x8D, 0x1B, 0xC8, 0x42, 0xB3, 0x07, 0x57, - 0xEE, 0x9D, 0x48, 0xA8, 0x63, 0x29, 0x15, 0xF0, 0x2B, 0x30, 0xB3, 0xFB, 0xA3, 0x47, 0x90, 0xF7, - 0xD5, 0x4B, 0x2A, 0xA2, 0x72, 0x15, 0xD5, 0x6E, 0xF1, 0x37, 0x48, 0x1B, 0xE4, 0x16, 0xD8, 0xCA, - 0xEF, 0xED, 0x95, 0x59, 0xAF, 0x84, 0x75, 0xAC, 0x42, 0xCE, 0x28, 0x6B, 0x51, 0x06, 0xF2, 0xEF, - 0xC5, 0x67, 0x34, 0xDF, 0x61, 0x5E, 0xCB, 0x20, 0xEE, 0xD2, 0x4F, 0x3B, 0xB5, 0xC7, 0xF5, 0x56, - 0x14, 0xB3, 0x75, 0x4E, 0xD2, 0x3B, 0x66, 0x10, 0x9D, 0xB7, 0x60, 0xAB, 0xDE, 0x77, 0xAB, 0x05, - 0x5B, 0x56, 0xD2, 0x15, 0xFA, 0xB7, 0x4A, 0x01, 0x21, 0x2C, 0x30, 0xAA, 0xE6, 0x18, 0xFC, 0xE7, - 0xAF, 0x66, 0x25, 0x1D, 0x76, 0xBD, 0x05, 0x5B, 0x2E, 0xEF, 0x17, 0x69, 0xC3, 0xC1, 0x2F, 0x21, - 0x62, 0xD9, 0xA1, 0x31, 0xE9, 0x82, 0x2E, 0x23, 0x6E, 0x96, 0x17, 0x59, 0x29, 0xB5, 0xAC, 0x99, - 0xA8, 0xA1, 0x95, 0xDA, 0xA9, 0x50, 0xD1, 0xCF, 0x5A, 0xB0, 0x65, 0xC4, 0x16, 0xB3, 0x8C, 0x4A, - 0x74, 0xFC, 0xCF, 0x5C, 0xD1, 0x7B, 0xEF, 0x1E, 0x1A, 0x3F, 0xF7, 0x7D, 0x77, 0xE2, 0xA2, 0x59, - 0x2F, 0x9A, 0xCF, 0xB5, 0x20, 0xF0, 0x22, 0xBD, 0x93, 0x9B, 0x19, 0x68, 0xB6, 0xD3, 0xCA, 0xD8, - 0xE0, 0x4C, 0xAD, 0xC6, 0xA6, 0xFD, 0x5D, 0xEE, 0x6A, 0x5E, 0xC9, 0x80, 0xD5, 0x40, 0x28, 0xAD, - 0x8B, 0x84, 0xA0, 0x2C, 0xE7, 0xE7, 0xEE, 0xDB, 0x9B, 0x1C, 0x65, 0x9F, 0x50, 0xD6, 0xC2, 0xC9, - 0x9E, 0x62, 0x46, 0x4A, 0xB9, 0x4E, 0xB9, 0x96, 0xFC, 0xDA, 0x73, 0x35, 0xAB, 0xE4, 0x72, 0x32, - 0x2B, 0x09, 0x7C, 0x2D, 0x4D, 0x1A, 0x00, 0xF0, 0x81, 0x2C, 0x29, 0x32, 0x69, 0x3C, 0x1F, 0xFB, - 0x05, 0x98, 0xA0, 0x5E, 0xCA, 0x81, 0x79, 0xA4, 0x3C, 0x2C, 0xEB, 0x70, 0x60, 0x1C, 0x7E, 0x96, - 0x26, 0x09, 0xB3, 0x2E, 0x28, 0x44, 0x30, 0xB3, 0xB9, 0x99, 0x43, 0xC9, 0xD2, 0x44, 0x4B, 0xDE, - 0x62, 0xDC, 0x41, 0x8A, 0x06, 0x24, 0xE5, 0x05, 0x58, 0x49, 0x49, 0x9A, 0x21, 0x31, 0xA7, 0x6A, - 0xD9, 0x22, 0xB9, 0x3D, 0x13, 0x1F, 0x0D, 0x20, 0x6C, 0x79, 0xC6, 0xFB, 0xE5, 0x9A, 0x25, 0xC1, - 0x4B, 0x3E, 0xDD, 0x34, 0xDF, 0x11, 0xDD, 0x75, 0x94, 0xC1, 0x88, 0x0C, 0x29, 0x21, 0x81, 0x4A, - 0xB9, 0xBA, 0x2C, 0xCB, 0x29, 0x2D, 0x55, 0x59, 0x4A, 0xEC, 0x2D, 0xE2, 0x75, 0xBE, 0xD4, 0xB9, - 0xD9, 0x34, 0x6D, 0xFB, 0x25, 0x01, 0xB4, 0x1B, 0x80, 0x7A, 0x41, 0x11, 0x14, 0x66, 0x53, 0x26, - 0xD5, 0xD2, 0xAF, 0xA5, 0x59, 0x3C, 0xAB, 0x6B, 0xEF, 0x8F, 0x3D, 0xAC, 0xE2, 0xEC, 0xD5, 0x49, - 0x9B, 0x41, 0xCD, 0x41, 0x2E, 0xB1, 0x36, 0xCC, 0xCC, 0x24, 0xCE, 0x80, 0xC5, 0x31, 0xB6, 0xE3, - 0x31, 0xDA, 0xF4, 0x60, 0x98, 0x9D, 0x08, 0x02, 0x29, 0xD5, 0x6F, 0x12, 0x71, 0xAB, 0x8D, 0x6B, - 0x62, 0xE3, 0xB8, 0xC4, 0xDB, 0x5E, 0xCE, 0x4D, 0x71, 0x5D, 0x45, 0x28, 0x99, 0xBB, 0x0B, 0xCA, - 0x92, 0x6F, 0x23, 0x7A, 0xC6, 0x94, 0xB9, 0xE7, 0x54, 0x92, 0x57, 0xAD, 0x8C, 0xC9, 0xAC, 0xCB, - 0x84, 0x18, 0x8E, 0x98, 0x04, 0x4E, 0x94, 0x38, 0xA5, 0x84, 0xC6, 0xA6, 0x4A, 0xB5, 0x37, 0x07, - 0x4A, 0x30, 0x95, 0xC8, 0xCA, 0xF2, 0xAA, 0x23, 0x67, 0x85, 0x42, 0x7E, 0x9B, 0x9C, 0xB3, 0xAB, - 0x82, 0xE0, 0xF9, 0x60, 0x43, 0x34, 0xCF, 0xF2, 0xBA, 0x6E, 0x47, 0xD1, 0xAE, 0x8E, 0x40, 0xE1, - 0xFC, 0xBC, 0x91, 0x7E, 0x9A, 0x72, 0x60, 0x69, 0x1D, 0xB2, 0xBA, 0x11, 0xC9, 0x1D, 0xBB, 0xA1, - 0xBD, 0x6D, 0x3D, 0x68, 0x5D, 0x9F, 0xF4, 0x2A, 0x56, 0xEE, 0x29, 0x6C, 0x69, 0x6A, 0xE1, 0xB3, - 0x20, 0xD7, 0xB9, 0x74, 0xC5, 0x53, 0x1C, 0x73, 0x7F, 0xDF, 0x6E, 0x51, 0xE4, 0x88, 0xA8, 0x4A, - 0x88, 0xEB, 0x3C, 0xC8, 0x44, 0x0A, 0x6F, 0xA4, 0x41, 0x78, 0xA3, 0xA8, 0x69, 0x49, 0x1C, 0xDA, - 0x15, 0x43, 0x54, 0xFA, 0x50, 0x4E, 0x2D, 0xAA, 0x4F, 0x13, 0x8B, 0xB7, 0x88, 0x7D, 0xC3, 0x37, - 0xC9, 0xBE, 0xA1, 0xFD, 0xAE, 0xD9, 0x03, 0xBE, 0x53, 0x30, 0x88, 0xE6, 0x73, 0xF1, 0xC7, 0x79, - 0xC4, 0xF3, 0x5B, 0x97, 0x0D, 0xD8, 0x2B, 0x6C, 0xC6, 0xD9, 0xA4, 0xB0, 0xE1, 0x6E, 0xCF, 0xF0, - 0xB6, 0xA1, 0x4E, 0xEE, 0x89, 0x44, 0x45, 0xB1, 0x75, 0x86, 0x9E, 0x93, 0x38, 0xA2, 0xC7, 0x1A, - 0x13, 0xA1, 0x21, 0x99, 0x54, 0xE8, 0x50, 0xAF, 0x48, 0x55, 0xA2, 0xEE, 0x55, 0x20, 0x55, 0xD6, - 0x69, 0x16, 0xC5, 0xB1, 0x0E, 0xB5, 0x6E, 0xCB, 0x09, 0xDB, 0x45, 0x91, 0xAF, 0x3F, 0xA5, 0x36, - 0xED, 0x99, 0x66, 0xF0, 0x5B, 0x9D, 0x4D, 0x4D, 0x01, 0xDB, 0x4B, 0xDD, 0x96, 0x56, 0xA7, 0x72, - 0x24, 0xE6, 0x88, 0x98, 0x22, 0x53, 0x09, 0x4B, 0xA3, 0x03, 0x00, 0xC6, 0x9B, 0xAA, 0x34, 0x4D, - 0x67, 0x35, 0x24, 0x3C, 0xBF, 0x1E, 0x6D, 0x75, 0x2F, 0x7A, 0x7C, 0x44, 0x75, 0x57, 0x10, 0x3B, - 0x80, 0xFC, 0x93, 0x60, 0xF2, 0xB6, 0xA5, 0xA8, 0xF2, 0x4F, 0x82, 0x24, 0x1A, 0x6F, 0x88, 0x1A, - 0xC7, 0xD4, 0xAE, 0xE5, 0x78, 0xF3, 0xC6, 0x31, 0x59, 0x8D, 0x20, 0xA7, 0x0E, 0xCA, 0x6A, 0x6E, - 0x33, 0xF7, 0x51, 0x19, 0x62, 0x28, 0x51, 0xCF, 0x1B, 0x50, 0xCF, 0x1F, 0x1F, 0xF3, 0xE6, 0x78, - 0xF3, 0xAE, 0x18, 0xD3, 0x4F, 0x5B, 0x38, 0x03, 0x82, 0x8A, 0x39, 0xBD, 0x23, 0x24, 0x79, 0x29, - 0x2E, 0x26, 0x6B, 0x69, 0xFF, 0x1D, 0xBB, 0xBD, 0xBA, 0xE7, 0xCE, 0x58, 0xAF, 0x43, 0x5A, 0xDD, - 0xE9, 0xBE, 0x3D, 0xA2, 0x25, 0x95, 0x70, 0xAF, 0x07, 0x0C, 0x8E, 0xD3, 0x3B, 0xFC, 0x90, 0x16, - 0x95, 0xFC, 0xBD, 0xD7, 0x55, 0xDD, 0xEB, 0xBA, 0x80, 0xC7, 0x83, 0xA0, 0xFF, 0x6F, 0xCD, 0xFB, - 0xBF, 0x88, 0xE6, 0x5D, 0x7B, 0xB2, 0xD6, 0x2B, 0xDF, 0x03, 0x61, 0x7D, 0x3B, 0x1C, 0x1D, 0x94, - 0xAC, 0x6F, 0xB9, 0x3A, 0xDE, 0xCE, 0x0F, 0xAF, 0x75, 0xEF, 0xEC, 0x21, 0x93, 0xE9, 0xDE, 0x8F, - 0x47, 0xBE, 0x48, 0x10, 0xCF, 0xD4, 0xF6, 0x0B, 0xDA, 0xE0, 0x68, 0x18, 0x00, 0xF8, 0x29, 0xE4, - 0xA6, 0x3D, 0xBD, 0x85, 0x30, 0x56, 0x65, 0xA6, 0xA3, 0x01, 0x85, 0x7A, 0xCB, 0x6E, 0xB4, 0xEF, - 0xD1, 0xED, 0xCB, 0x2F, 0x2B, 0xEF, 0x13, 0x6C, 0xDD, 0xB6, 0xB8, 0xF6, 0xBE, 0x9C, 0x26, 0x7E, - 0xBD, 0x59, 0x7B, 0x9F, 0xB0, 0x34, 0xF1, 0xF3, 0xA7, 0x25, 0x89, 0x57, 0x09, 0x92, 0x95, 0xE3, - 0x84, 0x6D, 0x9F, 0xDA, 0x14, 0xED, 0xF3, 0xCE, 0x7C, 0xD4, 0x4A, 0xDC, 0xEE, 0x18, 0x33, 0xD7, - 0xA3, 0x68, 0x53, 0xCA, 0x78, 0x79, 0xF9, 0x98, 0x67, 0xD1, 0xED, 0xE5, 0x2C, 0x4B, 0xE3, 0xF8, - 0xF9, 0x1D, 0x13, 0xCC, 0xE5, 0xB9, 0x8B, 0x12, 0x3A, 0x17, 0x73, 0x2D, 0x5C, 0x35, 0x47, 0x11, - 0x65, 0x48, 0xBE, 0x48, 0x3F, 0x27, 0x1F, 0xF0, 0x1D, 0xBA, 0x24, 0xD1, 0xDD, 0x4A, 0x3B, 0x27, - 0xC5, 0xF3, 0x9F, 0x22, 0x2D, 0xB5, 0xE9, 0x47, 0x83, 0x34, 0x9E, 0x5F, 0xD6, 0x7B, 0x5C, 0x5B, - 0xC5, 0x65, 0xAF, 0xEB, 0xEB, 0x34, 0x79, 0x8D, 0x93, 0xF5, 0x17, 0xF1, 0xE0, 0x27, 0x41, 0xDB, - 0xDA, 0x04, 0xAE, 0x82, 0x75, 0xEA, 0xAF, 0x6B, 0x1B, 0xBB, 0x01, 0x57, 0xB4, 0xE6, 0x54, 0x78, - 0xAD, 0x57, 0x9A, 0xD7, 0x74, 0xEA, 0xC8, 0xAA, 0x5F, 0x06, 0x56, 0xEA, 0xA8, 0x74, 0x3C, 0x6D, - 0xDF, 0x95, 0xB3, 0x61, 0x15, 0x60, 0x65, 0x5C, 0x0C, 0x09, 0x4E, 0x0F, 0xAF, 0x71, 0x82, 0xF2, - 0x9D, 0x07, 0x57, 0x69, 0xEB, 0x04, 0x6B, 0x3B, 0x94, 0xD1, 0xA9, 0xA6, 0x47, 0xA4, 0x54, 0x95, - 0x85, 0x25, 0x15, 0xD3, 0xCF, 0xB2, 0x82, 0x96, 0x5D, 0x59, 0x9B, 0x5F, 0x56, 0x8D, 0x2D, 0x7E, - 0x59, 0xE9, 0xFA, 0x66, 0x3C, 0xCE, 0x34, 0xF9, 0x25, 0x47, 0xD9, 0x45, 0xB2, 0x5A, 0x13, 0x33, - 0xB1, 0xF8, 0xD2, 0xA0, 0x51, 0xC1, 0x41, 0xCB, 0x7E, 0xA5, 0x85, 0x36, 0x58, 0xCA, 0xB0, 0xD2, - 0xEC, 0x6D, 0xB6, 0x59, 0x4E, 0x13, 0xE6, 0x3E, 0x5B, 0x56, 0x9D, 0x09, 0x9F, 0xDA, 0x1A, 0x3D, - 0xB5, 0x0B, 0x9E, 0x4B, 0xE9, 0x5E, 0x02, 0x5A, 0x2A, 0x36, 0x12, 0xAC, 0xF3, 0x1D, 0xED, 0xE9, - 0x29, 0x9C, 0x23, 0xBE, 0x99, 0xD3, 0x52, 0xF8, 0x05, 0x17, 0x02, 0x2A, 0x9E, 0x17, 0x73, 0xF2, - 0xB7, 0xEA, 0xCB, 0x8D, 0x6E, 0xEA, 0x41, 0xD7, 0x0D, 0x09, 0xDC, 0x79, 0xBE, 0xA0, 0x9F, 0x25, - 0xC3, 0x90, 0xD3, 0x98, 0x73, 0x5D, 0x6E, 0x91, 0x21, 0x2A, 0x9C, 0x83, 0x07, 0xF7, 0x0A, 0xCC, - 0x71, 0xCE, 0x47, 0xE1, 0x2E, 0x2F, 0x33, 0xAF, 0xA0, 0x90, 0xA3, 0x7E, 0x28, 0xB3, 0x35, 0xA6, - 0x4D, 0xCC, 0x9B, 0x62, 0x30, 0xF0, 0x29, 0xEA, 0x39, 0x82, 0x35, 0xD8, 0x6D, 0x79, 0x44, 0x84, - 0x8D, 0x2D, 0x5F, 0x26, 0x73, 0xE9, 0xA1, 0x68, 0x46, 0x9E, 0x28, 0xB9, 0x5A, 0xD5, 0x75, 0xA9, - 0xF2, 0x16, 0xD4, 0x80, 0x2E, 0x39, 0x77, 0x3F, 0x3E, 0xA2, 0x2B, 0x9F, 0xFB, 0x73, 0xB3, 0x28, - 0x45, 0xDA, 0xB9, 0x1B, 0xD8, 0xC8, 0xD3, 0x0B, 0xE3, 0x37, 0xC4, 0x82, 0x45, 0x77, 0x31, 0xB2, - 0x2F, 0xB5, 0x5A, 0x93, 0xCD, 0xD9, 0x51, 0x60, 0x1E, 0x5E, 0x31, 0x93, 0xD4, 0x81, 0xD2, 0x7E, - 0x38, 0xE8, 0x8C, 0x5B, 0xBC, 0xEB, 0x51, 0x95, 0x7B, 0xC8, 0x58, 0xDE, 0xA3, 0x13, 0xC2, 0x22, - 0x41, 0xA9, 0xE4, 0x45, 0x89, 0xF1, 0x55, 0xA5, 0x37, 0x52, 0x76, 0xB2, 0x29, 0xCB, 0x0A, 0x35, - 0x49, 0x4F, 0xD8, 0xD4, 0x4C, 0x52, 0x33, 0xFF, 0x09, 0xD6, 0x8E, 0x03, 0x7C, 0x53, 0x51, 0xD6, - 0xA5, 0x5C, 0x08, 0x52, 0xB8, 0xEF, 0x33, 0x0B, 0xE7, 0x89, 0x4E, 0x54, 0x66, 0x66, 0x48, 0xCA, - 0x42, 0x63, 0xCE, 0x79, 0xCF, 0x42, 0x2A, 0x12, 0xF5, 0x9B, 0xC1, 0xD3, 0xC6, 0xB4, 0x07, 0x96, - 0x8C, 0x29, 0x03, 0xDA, 0x80, 0x9B, 0xC3, 0xED, 0x04, 0x93, 0xEC, 0x44, 0x04, 0x40, 0x9E, 0x64, - 0x36, 0xD6, 0xDA, 0x4F, 0x82, 0x72, 0xE7, 0x0D, 0xC3, 0xC8, 0xE0, 0xBE, 0x0F, 0x26, 0x42, 0xB1, - 0x60, 0xBC, 0xC4, 0xE1, 0xFC, 0xD7, 0x2C, 0x5A, 0xAD, 0xD0, 0x1C, 0x9C, 0xE5, 0x57, 0xB9, 0x56, - 0xE7, 0x77, 0x42, 0x32, 0x56, 0x7E, 0x29, 0x05, 0x5B, 0x90, 0x60, 0xBA, 0x2F, 0x28, 0xCB, 0x89, - 0x04, 0x0F, 0xDC, 0x9C, 0x6D, 0xC0, 0x83, 0x88, 0xF1, 0xF2, 0x68, 0xCF, 0x60, 0x82, 0xDA, 0x6D, - 0x03, 0x89, 0x32, 0x0E, 0x99, 0xC4, 0x21, 0xD3, 0x16, 0xBC, 0x79, 0xEF, 0x2E, 0x5A, 0x31, 0x76, - 0xA8, 0xD2, 0xB0, 0x78, 0xB7, 0xB0, 0xB5, 0xD7, 0x02, 0x32, 0xD2, 0x6C, 0x42, 0x01, 0xB2, 0xA7, - 0x8D, 0xFC, 0xAC, 0xF5, 0x5B, 0xF6, 0x5B, 0xD2, 0x1A, 0xB7, 0x7E, 0x4B, 0x5A, 0xA0, 0x26, 0x1A, - 0x8C, 0xA0, 0xF1, 0x1A, 0x16, 0x53, 0xCF, 0xC5, 0x2C, 0x5D, 0x86, 0x76, 0xEA, 0xAE, 0x9C, 0xBD, - 0xDC, 0xAF, 0xB7, 0x50, 0xAA, 0xED, 0x52, 0xF6, 0xB9, 0xE7, 0x32, 0x7F, 0xEA, 0xAB, 0x2C, 0xBA, - 0x43, 0x4A, 0x75, 0xEE, 0x2C, 0xAD, 0x0F, 0xF0, 0x29, 0x9E, 0x72, 0x32, 0x7E, 0x04, 0xDB, 0xAD, - 0x6C, 0x0D, 0x88, 0xF1, 0x60, 0x44, 0x27, 0x8A, 0x49, 0x41, 0xED, 0x36, 0x2A, 0x87, 0x4C, 0xA0, - 0xFC, 0x42, 0x2C, 0x85, 0x0A, 0x13, 0xE9, 0x14, 0x99, 0xB4, 0x62, 0xD2, 0x6A, 0xAB, 0xD3, 0x0E, - 0x7A, 0x8D, 0x03, 0x2E, 0x8B, 0x7B, 0xB6, 0x98, 0x64, 0x2A, 0xA4, 0x37, 0xB1, 0x2C, 0x24, 0x43, - 0xDB, 0xD4, 0x31, 0xAD, 0xAA, 0xB1, 0x49, 0x23, 0x1F, 0x2A, 0x78, 0x98, 0xBB, 0x18, 0xCF, 0x3E, - 0x5A, 0x71, 0xEE, 0xCA, 0x79, 0x61, 0xA4, 0xD1, 0x21, 0xA7, 0x76, 0x69, 0x74, 0x08, 0x20, 0xDE, - 0xC8, 0x64, 0xF3, 0xED, 0x58, 0xFD, 0xBE, 0x87, 0x59, 0x34, 0x71, 0x02, 0xE4, 0x4A, 0x44, 0x19, - 0xE2, 0xFD, 0x98, 0x88, 0xF1, 0xDB, 0x69, 0xB1, 0x55, 0x64, 0xBE, 0xAF, 0xC6, 0x49, 0xC7, 0xEB, - 0x6B, 0xC0, 0xE8, 0x0A, 0x41, 0x32, 0xE5, 0x58, 0xB9, 0x2B, 0x08, 0x7D, 0x81, 0x72, 0x35, 0x10, - 0x41, 0x4A, 0xF8, 0x39, 0x76, 0x82, 0x59, 0xBC, 0x12, 0xC2, 0xD9, 0x2B, 0x56, 0xDF, 0xED, 0xE0, - 0x25, 0xEA, 0xE0, 0xF3, 0xA7, 0x2C, 0xE6, 0x1F, 0x6F, 0x70, 0x62, 0x55, 0xC7, 0xAA, 0x7A, 0x6D, - 0x95, 0x32, 0xC4, 0x42, 0xE8, 0xA0, 0x7E, 0x4D, 0xB3, 0xF9, 0x73, 0xC2, 0xD5, 0x3B, 0x7C, 0x22, - 0xE9, 0xA5, 0x1F, 0xC3, 0x5C, 0x1D, 0x46, 0x5A, 0x13, 0x25, 0x7F, 0xC9, 0x49, 0x56, 0x97, 0xC1, - 0xDE, 0x6C, 0x9D, 0x65, 0xCC, 0xDA, 0x3D, 0xF9, 0x68, 0xAA, 0x7D, 0xB0, 0xE4, 0xC3, 0x8C, 0x8F, - 0x5A, 0x45, 0xB9, 0x2C, 0xCA, 0x7B, 0x19, 0xE5, 0x22, 0xF4, 0xD4, 0xCC, 0x80, 0x43, 0xF6, 0x28, - 0xC5, 0xB2, 0xBA, 0xCA, 0xB8, 0x96, 0xAD, 0xF7, 0xA5, 0x1B, 0x40, 0xF9, 0xFB, 0xBE, 0x1B, 0x4C, - 0x61, 0x7D, 0x23, 0x11, 0xB2, 0xCA, 0xF3, 0xE1, 0x82, 0x72, 0x72, 0xE6, 0x70, 0xC2, 0xBF, 0x81, - 0x9A, 0x1C, 0x87, 0xCC, 0x4F, 0xC5, 0x0D, 0xD1, 0xB8, 0xC1, 0xED, 0x6B, 0xCD, 0x40, 0xE3, 0x4E, - 0x51, 0x74, 0x9E, 0x28, 0xBD, 0xAE, 0x39, 0xF9, 0x5E, 0xA2, 0x95, 0xAF, 0x4D, 0x9D, 0x81, 0x22, - 0x97, 0x21, 0xAA, 0x4A, 0xAC, 0xDD, 0x11, 0xBB, 0xCB, 0xDF, 0x91, 0x7B, 0x73, 0xD0, 0xEC, 0x52, - 0x63, 0x2A, 0xA4, 0x6B, 0x8E, 0x0E, 0x14, 0x1A, 0x01, 0x82, 0x7C, 0x7A, 0x3A, 0x6B, 0xCF, 0x14, - 0xE7, 0x84, 0x5A, 0xD7, 0x08, 0x79, 0x00, 0xD6, 0x0C, 0x5A, 0x2C, 0xB4, 0x0F, 0x51, 0xCD, 0xA2, - 0xD2, 0x59, 0x69, 0x88, 0x3A, 0x35, 0xDD, 0x71, 0xE8, 0xF6, 0x2D, 0xC6, 0x1A, 0xB8, 0x55, 0x22, - 0x58, 0x81, 0x82, 0x5B, 0xD4, 0xAD, 0x77, 0x89, 0x7F, 0x9A, 0x7A, 0x8F, 0x9E, 0x65, 0x7E, 0x5E, - 0x55, 0xB4, 0xD4, 0x52, 0xA3, 0xB3, 0x80, 0x1E, 0x91, 0x4C, 0xEE, 0xC1, 0x0B, 0x8F, 0xA8, 0xCD, - 0x73, 0xE5, 0x4F, 0xBB, 0x5D, 0x9E, 0x61, 0x82, 0xFF, 0xD3, 0x69, 0x4C, 0xE8, 0xC7, 0x32, 0xDD, - 0x11, 0x3D, 0x18, 0x76, 0x2B, 0x36, 0x55, 0x29, 0x74, 0x44, 0xDC, 0xE5, 0xCE, 0xF3, 0xE1, 0xBC, - 0xD1, 0xB8, 0x7C, 0xC3, 0xF1, 0x0D, 0x9D, 0x63, 0x06, 0x54, 0x62, 0xB5, 0xD9, 0xF7, 0xF6, 0xB6, - 0xE1, 0xCA, 0xF1, 0xF8, 0x34, 0xF4, 0x59, 0xF0, 0x53, 0x7C, 0xE6, 0x8F, 0x3D, 0x72, 0x8A, 0xE9, - 0x56, 0xEB, 0x86, 0xD8, 0xA2, 0x4D, 0xED, 0xE1, 0x05, 0xBB, 0x23, 0x1F, 0x40, 0xFA, 0x7F, 0xF2, - 0x2C, 0x1C, 0xF9, 0x90, 0x3C, 0x63, 0x65, 0xD1, 0x4D, 0xEE, 0x11, 0xC0, 0xC3, 0x64, 0xB1, 0x40, - 0xC6, 0x5E, 0x30, 0xFC, 0x9E, 0x00, 0x50, 0xE4, 0xCB, 0x74, 0x1D, 0xCF, 0x5F, 0xA5, 0xD9, 0x0C, - 0x59, 0x27, 0xA5, 0xD4, 0x6B, 0xF6, 0x70, 0xFE, 0x73, 0x34, 0x3B, 0x43, 0xBD, 0x28, 0x26, 0x7F, - 0x42, 0xF7, 0x9B, 0x03, 0x4F, 0xDF, 0x45, 0x33, 0x61, 0xD2, 0x43, 0xCF, 0x5F, 0x06, 0x58, 0xDF, - 0xA6, 0xC6, 0x88, 0x27, 0x1C, 0xF9, 0x13, 0xBA, 0x2F, 0x0C, 0x45, 0x00, 0x95, 0xCF, 0x84, 0x47, - 0x72, 0xAD, 0xB2, 0x0A, 0xF5, 0x88, 0xFC, 0x0D, 0xBD, 0x3E, 0x0B, 0x5A, 0x71, 0xB3, 0x26, 0x24, - 0x4D, 0xE8, 0x5D, 0xA6, 0xAC, 0x1E, 0x00, 0xED, 0x36, 0x37, 0x09, 0xE1, 0x55, 0x8C, 0xF0, 0x73, - 0xF2, 0x7E, 0x69, 0x46, 0xA4, 0x73, 0x4F, 0x81, 0xCC, 0x10, 0x87, 0x7A, 0x39, 0x49, 0x57, 0xEF, - 0xB2, 0x74, 0x15, 0xDD, 0x46, 0xE2, 0x92, 0x8B, 0x7A, 0xAB, 0x8C, 0x69, 0x48, 0x54, 0x6E, 0x86, - 0x2D, 0xB5, 0x75, 0x54, 0x68, 0x96, 0x33, 0x70, 0x66, 0x6A, 0x05, 0x2E, 0x92, 0x59, 0xC6, 0x88, - 0x26, 0x8A, 0xD9, 0xC4, 0x79, 0x08, 0x8C, 0x03, 0x36, 0x84, 0x39, 0x22, 0x11, 0x8E, 0xAD, 0xCA, - 0x97, 0x38, 0xB9, 0x8D, 0x91, 0xAA, 0xD7, 0xAF, 0xAB, 0xF7, 0x22, 0x5D, 0xDF, 0x18, 0xF5, 0x06, - 0x46, 0x3D, 0xB9, 0x90, 0x8A, 0x11, 0xAC, 0x74, 0x45, 0xA9, 0x49, 0x98, 0xCF, 0x37, 0x4B, 0xCF, - 0xCC, 0x45, 0xAF, 0xAE, 0xEA, 0x83, 0x63, 0x53, 0xD8, 0x3E, 0x57, 0xFA, 0xDC, 0xA8, 0xAF, 0xE3, - 0xF0, 0x39, 0x63, 0xF4, 0x41, 0xC5, 0xFB, 0x56, 0x9D, 0x8A, 0x0A, 0xB8, 0x36, 0xE4, 0x76, 0x70, - 0xD7, 0xAB, 0x96, 0x5B, 0x89, 0x05, 0xAA, 0xAB, 0xCC, 0x6C, 0x8B, 0x3E, 0x45, 0x31, 0xA5, 0xD3, - 0x6C, 0xA3, 0x90, 0x9F, 0x23, 0x22, 0x1B, 0x98, 0xA2, 0xBD, 0x06, 0xE7, 0x01, 0xB6, 0x77, 0x8B, - 0x86, 0xCB, 0xCB, 0x37, 0x9A, 0x53, 0xDE, 0xC1, 0xDF, 0x64, 0x5A, 0xEB, 0x41, 0x6F, 0x9E, 0xD9, - 0xFA, 0xB9, 0x63, 0x47, 0xB5, 0x9A, 0xBD, 0xC6, 0x75, 0xD8, 0xB4, 0x4C, 0x5C, 0xF0, 0x28, 0xEA, - 0x77, 0xDE, 0x43, 0xFD, 0xF1, 0xAD, 0x26, 0xD7, 0x71, 0x74, 0x37, 0xCA, 0x4A, 0xEA, 0x38, 0xB6, - 0x37, 0xAF, 0xC9, 0xF3, 0x6A, 0x05, 0x3C, 0x1F, 0x6E, 0x10, 0x8A, 0x82, 0x06, 0xE5, 0x9F, 0xC1, - 0xE3, 0xCE, 0x8D, 0x6B, 0x94, 0x87, 0xC0, 0xD9, 0x60, 0xEC, 0x37, 0x49, 0x2A, 0xCD, 0xB7, 0xA4, - 0xFD, 0xFA, 0x96, 0x92, 0x75, 0x6E, 0x10, 0xFD, 0x76, 0x8B, 0x29, 0x51, 0xDF, 0xDD, 0x55, 0x30, - 0x05, 0x13, 0xD2, 0x6E, 0xCB, 0x6B, 0xAF, 0x0A, 0xE3, 0xE0, 0xAC, 0x4C, 0x2F, 0x1D, 0x3C, 0x2A, - 0xC5, 0x52, 0x98, 0xFF, 0x34, 0x81, 0xF6, 0xA7, 0xEA, 0xA6, 0x54, 0x53, 0xDE, 0xE9, 0x14, 0x4E, - 0x76, 0xFB, 0x50, 0x15, 0x88, 0xD5, 0x6D, 0x64, 0xDF, 0xD7, 0xF1, 0xD2, 0x5D, 0x6B, 0x16, 0x98, - 0xC2, 0x9B, 0xC1, 0x99, 0xB7, 0xBB, 0xC0, 0x4E, 0x48, 0x23, 0xF0, 0xBE, 0xF5, 0x56, 0x4F, 0x25, - 0xE3, 0xE7, 0x42, 0x09, 0x24, 0xC5, 0x81, 0x12, 0x9D, 0xA8, 0x6B, 0x9E, 0x12, 0x02, 0xF6, 0x3D, - 0x21, 0x18, 0x7C, 0xA5, 0x3C, 0xA0, 0x86, 0x69, 0xBE, 0x20, 0x30, 0x2D, 0x22, 0x3B, 0x74, 0x2F, - 0xEE, 0xEE, 0xD0, 0x1C, 0x47, 0x04, 0x59, 0xA7, 0xEF, 0x36, 0x94, 0x57, 0x16, 0x54, 0xCB, 0x14, - 0x28, 0x83, 0xBB, 0x56, 0x4B, 0x58, 0x2A, 0xB3, 0xBA, 0xB2, 0x60, 0x3A, 0x65, 0x6F, 0xDA, 0x93, - 0xBA, 0x5D, 0xBB, 0x91, 0x0D, 0xD4, 0x20, 0xFF, 0x32, 0x99, 0x03, 0xD3, 0xD5, 0xB9, 0x7C, 0xC6, - 0x4E, 0xFA, 0x4D, 0x0A, 0x8F, 0xB3, 0x06, 0x84, 0x4F, 0x1A, 0xF7, 0x4D, 0x7D, 0x4B, 0x7F, 0x1A, - 0xFA, 0xE3, 0xA6, 0xD2, 0x3A, 0x81, 0x7E, 0x1C, 0x34, 0xA1, 0x2A, 0x09, 0x86, 0x43, 0xFB, 0x90, - 0x8A, 0x9B, 0x62, 0xED, 0xA4, 0xD4, 0xC9, 0x55, 0xF6, 0x24, 0xBB, 0x44, 0x7B, 0x38, 0xD8, 0x6F, - 0xC4, 0xA3, 0x72, 0x86, 0xF0, 0x96, 0xA7, 0x7E, 0xE3, 0x9C, 0xD4, 0x8E, 0xDA, 0x0D, 0x4D, 0xC7, - 0x2D, 0xAD, 0x9B, 0x63, 0x95, 0x9F, 0xA8, 0x49, 0xFF, 0xDE, 0x44, 0x6F, 0x4C, 0x23, 0x62, 0x5D, - 0x40, 0x6B, 0xD4, 0xBC, 0xF5, 0xED, 0x99, 0x36, 0x97, 0x0B, 0xCC, 0xCD, 0x3C, 0x51, 0x04, 0xC9, - 0xAD, 0xE1, 0x88, 0xBC, 0xB4, 0xD3, 0x29, 0x28, 0x2F, 0x16, 0xCF, 0x00, 0xF5, 0xF5, 0x68, 0x9D, - 0xA0, 0xB1, 0x0E, 0x53, 0x22, 0x95, 0x85, 0x4D, 0x4B, 0x5A, 0xAA, 0x3D, 0x3D, 0x75, 0x48, 0xDA, - 0x9A, 0x53, 0xDC, 0xBD, 0x5C, 0x92, 0x69, 0x3B, 0x9F, 0x44, 0xB9, 0x4A, 0x33, 0x62, 0x15, 0x6B, - 0x96, 0x1B, 0xE6, 0xEB, 0xD5, 0x2A, 0x43, 0x79, 0xCE, 0x3F, 0x32, 0xB2, 0x1C, 0xEF, 0x07, 0x05, - 0x28, 0xC5, 0xEB, 0x73, 0xAE, 0x71, 0x2D, 0x3D, 0x7A, 0xDB, 0x51, 0xF2, 0x6E, 0x04, 0x5B, 0xAF, - 0x98, 0xD1, 0x21, 0x43, 0x58, 0x9E, 0x4D, 0x76, 0x8F, 0xAE, 0x8D, 0xF9, 0x0D, 0x51, 0x59, 0xF7, - 0x01, 0xC6, 0x5F, 0x85, 0xAF, 0xDF, 0x8C, 0x98, 0xC0, 0xA7, 0xAC, 0xC3, 0x2F, 0x8A, 0xCA, 0xC3, - 0xB2, 0x3A, 0x2B, 0x8D, 0x9B, 0x63, 0xB7, 0xEE, 0x7A, 0xA9, 0x37, 0xD8, 0xA6, 0x67, 0x03, 0x97, - 0x9E, 0xFD, 0x24, 0x0C, 0xE8, 0x15, 0x7D, 0xE4, 0xFB, 0xF4, 0x7E, 0xB7, 0xED, 0x4D, 0x39, 0x8A, - 0x09, 0x3B, 0x13, 0xE9, 0xB1, 0x27, 0x32, 0x50, 0x1A, 0x04, 0x5D, 0x1F, 0x7F, 0xBD, 0x26, 0x4F, - 0xBE, 0xA9, 0xF6, 0xD8, 0x51, 0x53, 0x83, 0x9E, 0xAE, 0xA3, 0x09, 0xB8, 0x8E, 0xA6, 0xDD, 0xE6, - 0x22, 0xDD, 0xBE, 0x7C, 0xCF, 0x34, 0xFE, 0x34, 0xDF, 0x9D, 0x58, 0x42, 0x21, 0x3A, 0xC1, 0x3C, - 0xCC, 0xD0, 0x25, 0xDD, 0x65, 0xC9, 0x0C, 0x01, 0x16, 0xF7, 0xA5, 0x1B, 0x40, 0x91, 0x31, 0xD4, - 0xD1, 0x9F, 0xC3, 0x4E, 0x60, 0x8E, 0x66, 0xEF, 0x32, 0xF6, 0x8A, 0x4E, 0xE9, 0x2A, 0xEF, 0x45, - 0xAB, 0x55, 0x8C, 0x67, 0x3C, 0x41, 0x20, 0x9B, 0xCE, 0x3F, 0xA1, 0xFB, 0x5C, 0xE6, 0x92, 0x32, - 0x1B, 0x92, 0x0C, 0xDF, 0xDE, 0x22, 0x16, 0xFE, 0x8E, 0x6D, 0x51, 0x2E, 0x91, 0x15, 0xFC, 0x79, - 0x50, 0x28, 0x69, 0xE9, 0x6E, 0x67, 0x85, 0x17, 0x8B, 0x8A, 0x0D, 0xA2, 0x30, 0x4B, 0xAF, 0x2D, - 0xFE, 0x56, 0x8F, 0xB5, 0x10, 0x87, 0x5B, 0x3C, 0x17, 0x4F, 0xF0, 0x19, 0x3D, 0x56, 0xD5, 0xBE, - 0xAA, 0x58, 0xED, 0x28, 0x52, 0xB4, 0xED, 0x75, 0xB8, 0xD6, 0x5C, 0xE7, 0x86, 0x2A, 0x37, 0xB3, - 0x3A, 0xAA, 0xA9, 0xC2, 0x12, 0xE6, 0xD4, 0x41, 0x71, 0xF2, 0xF9, 0x72, 0x05, 0xC5, 0xE4, 0x85, - 0xA5, 0x7F, 0x69, 0x36, 0xC5, 0x4B, 0x83, 0x34, 0xF2, 0x2D, 0x99, 0x2A, 0xC9, 0x91, 0x35, 0x35, - 0x2D, 0x1A, 0x4B, 0x1F, 0x6A, 0x46, 0xA6, 0xCC, 0xC5, 0xCA, 0x46, 0x4E, 0xA4, 0xC6, 0x68, 0x0A, - 0x6F, 0xA9, 0x8D, 0xAD, 0x98, 0x7F, 0x34, 0xDA, 0x49, 0x98, 0x66, 0x2C, 0x15, 0x2B, 0x7E, 0xCB, - 0xC6, 0x05, 0xF5, 0x44, 0xDE, 0xBF, 0x5D, 0xEC, 0x5A, 0x8A, 0xEB, 0x59, 0x9A, 0x7C, 0x42, 0x19, - 0x51, 0x3E, 0x27, 0x69, 0xFC, 0x21, 0x55, 0x31, 0x92, 0x2E, 0x92, 0x39, 0xFA, 0x62, 0x06, 0xB0, - 0x22, 0x56, 0xFC, 0x2A, 0x72, 0x1A, 0xE6, 0xA5, 0xC8, 0x55, 0x3A, 0xBC, 0x5E, 0x5E, 0xB2, 0x4A, - 0x03, 0xD5, 0x88, 0x73, 0x13, 0x1D, 0xD0, 0xC7, 0x11, 0x70, 0xEF, 0x0C, 0x77, 0xBB, 0xE3, 0xEC, - 0x94, 0x72, 0xD6, 0xFD, 0x30, 0xCC, 0xDB, 0x6D, 0x0F, 0x77, 0xC2, 0xAC, 0x1B, 0x18, 0x71, 0xE1, - 0x72, 0x44, 0x2A, 0x4F, 0x52, 0xE6, 0x86, 0x7A, 0xE2, 0xCB, 0x70, 0x8D, 0xDE, 0x1E, 0x29, 0x0D, - 0x7C, 0xD3, 0x5D, 0x1D, 0xBB, 0x95, 0xF4, 0xCD, 0xEC, 0x84, 0xBB, 0x78, 0xD2, 0xC3, 0x40, 0x5F, - 0xBA, 0x78, 0x3B, 0xE7, 0x3B, 0xA6, 0x7A, 0x6B, 0x76, 0x5F, 0x2E, 0x83, 0xB2, 0x46, 0x7F, 0xDF, - 0xDF, 0x0A, 0x0D, 0xAE, 0xF8, 0x17, 0x12, 0xB9, 0xF0, 0x1F, 0xF3, 0x61, 0x1E, 0xEE, 0xFB, 0xCA, - 0xB2, 0xE3, 0xB4, 0x5E, 0x9E, 0xB0, 0x6E, 0x5E, 0x4D, 0x36, 0x57, 0x30, 0x09, 0xAD, 0x58, 0x91, - 0x9C, 0x87, 0x2D, 0xBC, 0xFD, 0xC4, 0x86, 0x91, 0x86, 0xD9, 0x16, 0x16, 0x18, 0x81, 0x0C, 0xA2, - 0x23, 0xD9, 0xFC, 0x46, 0x7A, 0x4E, 0x98, 0xCD, 0x06, 0x80, 0xCB, 0x30, 0x12, 0x3D, 0xCD, 0x98, - 0x09, 0x4A, 0x37, 0x12, 0x61, 0x4B, 0x7D, 0x38, 0x0F, 0x7D, 0x78, 0x1D, 0xFA, 0x70, 0x1D, 0xFA, - 0xCC, 0x22, 0x99, 0xA5, 0xEF, 0x4D, 0x7B, 0xB3, 0x65, 0x94, 0x3D, 0x27, 0x5E, 0x04, 0x44, 0xFA, - 0xAF, 0xE8, 0xD4, 0x6F, 0xB7, 0xCB, 0x85, 0xDD, 0x00, 0x4C, 0x40, 0xD4, 0xED, 0xF2, 0x44, 0xE0, - 0xCB, 0x93, 0x54, 0x3D, 0xC6, 0x97, 0x6A, 0x2E, 0x3B, 0xB4, 0xE6, 0xB2, 0xD3, 0x29, 0x54, 0x66, - 0x5D, 0xC2, 0x10, 0x81, 0x98, 0xFD, 0xC3, 0xB6, 0x47, 0xA2, 0x77, 0x04, 0xCB, 0x07, 0x11, 0x77, - 0x3A, 0x90, 0x74, 0xBB, 0x00, 0xF6, 0xED, 0x42, 0x4C, 0x0B, 0xE7, 0x9D, 0x0E, 0xC4, 0x9D, 0x0E, - 0x50, 0x69, 0xB4, 0x12, 0x23, 0xAC, 0x1E, 0x56, 0xDB, 0x8E, 0x22, 0x96, 0xB3, 0xA4, 0xDA, 0xEB, - 0x4E, 0x98, 0x77, 0x03, 0xB8, 0x64, 0xFF, 0x80, 0x09, 0xA1, 0xE3, 0x61, 0x83, 0x52, 0x2E, 0x8D, - 0x74, 0xEE, 0x28, 0x45, 0x5C, 0xA2, 0x55, 0x94, 0x45, 0x24, 0xCD, 0xBC, 0xC4, 0xC8, 0xAF, 0xAE, - 0x8E, 0x6A, 0xB5, 0xCB, 0xC1, 0x04, 0x3C, 0x34, 0xD7, 0x28, 0x89, 0xC2, 0xF5, 0x01, 0x29, 0x37, - 0xB0, 0x07, 0x35, 0x15, 0x63, 0xC4, 0xC6, 0x72, 0xDD, 0x09, 0x51, 0x37, 0x80, 0x51, 0x97, 0xFE, - 0x03, 0x60, 0xD4, 0xED, 0xD2, 0x52, 0x16, 0xB8, 0x71, 0x82, 0x4F, 0x12, 0xB5, 0x0A, 0xCB, 0x4E, - 0x60, 0xAC, 0xC9, 0x76, 0x03, 0xC5, 0x9D, 0x4D, 0x03, 0x75, 0xD4, 0xD8, 0x7E, 0xA0, 0xFD, 0xE6, - 0x81, 0xCA, 0x65, 0x15, 0x03, 0x5D, 0xF3, 0x81, 0x2E, 0x3B, 0x7C, 0xA0, 0x4B, 0x5E, 0x5A, 0x14, - 0xCB, 0x4E, 0x87, 0x11, 0xF0, 0x22, 0x8C, 0x3A, 0xB3, 0x6E, 0xDC, 0xB9, 0x86, 0x9F, 0x8C, 0xD7, - 0xCB, 0x3A, 0xD1, 0x6E, 0xD9, 0x8D, 0x3A, 0x71, 0x67, 0xDE, 0xBD, 0xEE, 0xAE, 0xB9, 0x28, 0xF7, - 0xF8, 0xD8, 0x6A, 0xB1, 0xEC, 0xF8, 0x39, 0x8B, 0xF1, 0x17, 0xC1, 0x25, 0xA0, 0x02, 0xD3, 0x9D, - 0x08, 0x81, 0x8A, 0xF9, 0x4D, 0x71, 0xD1, 0x6E, 0x0F, 0xFA, 0xFB, 0x82, 0x04, 0xCF, 0xD3, 0x39, - 0x7A, 0x97, 0xE2, 0x84, 0x78, 0x3E, 0xD0, 0xA2, 0x67, 0x79, 0x93, 0x77, 0x95, 0xAC, 0x98, 0x68, - 0xC3, 0x21, 0x01, 0x86, 0xD8, 0x60, 0xEA, 0xB0, 0xA5, 0xD7, 0x8B, 0xAA, 0x0E, 0x4C, 0x70, 0xAC, - 0xDA, 0x97, 0xD3, 0x6E, 0x00, 0x79, 0xFF, 0x94, 0x5D, 0xC0, 0x7D, 0x5F, 0x49, 0xAD, 0x65, 0x41, - 0xCD, 0xD1, 0x94, 0xF0, 0x97, 0xF8, 0xC9, 0xA2, 0x1B, 0x22, 0xF8, 0xA9, 0x13, 0xA2, 0xA2, 0x28, - 0xF0, 0xC2, 0xCB, 0xDB, 0xED, 0x45, 0xE7, 0x53, 0x8D, 0x24, 0x4E, 0x1B, 0xBA, 0xA7, 0x67, 0xAB, - 0x71, 0x95, 0xE7, 0xAD, 0xC3, 0xB1, 0x15, 0x26, 0x60, 0x44, 0xDA, 0x17, 0x10, 0xC3, 0x04, 0xCC, - 0x3D, 0x8B, 0x7E, 0xD3, 0x64, 0xF9, 0x90, 0xC3, 0xE6, 0x73, 0x12, 0xB0, 0xD7, 0x56, 0x2A, 0x43, - 0x7E, 0xEA, 0xE8, 0x78, 0xBD, 0xD2, 0x74, 0x4B, 0xD8, 0xF1, 0x2C, 0x20, 0xFF, 0x3E, 0xFE, 0x54, - 0x14, 0xB6, 0x99, 0x85, 0xCB, 0x52, 0xC5, 0x3A, 0x4A, 0x80, 0x88, 0x67, 0xC9, 0x77, 0x23, 0x9F, - 0xD3, 0x13, 0x7F, 0x02, 0xC4, 0x4F, 0xF7, 0x43, 0x2E, 0xA3, 0x4F, 0xB6, 0x72, 0x5D, 0xB7, 0x2A, - 0x59, 0x1C, 0xCC, 0x58, 0xBA, 0x23, 0x5E, 0x05, 0xD3, 0x6D, 0x4E, 0x68, 0x19, 0xD1, 0xB6, 0x28, - 0x6B, 0xA1, 0x5C, 0x0A, 0x56, 0x35, 0x06, 0xF5, 0x1C, 0x2D, 0x64, 0x21, 0x66, 0x97, 0xC8, 0xC6, - 0x43, 0xF4, 0x78, 0xC8, 0xC6, 0xF1, 0xE0, 0x6E, 0x77, 0xA2, 0x5F, 0x23, 0x39, 0x9A, 0x8D, 0x09, - 0xB0, 0xCC, 0x2E, 0x3A, 0x72, 0x69, 0x6A, 0x93, 0x27, 0x51, 0x14, 0xC4, 0x55, 0xBC, 0x01, 0x87, - 0x4E, 0xA7, 0x5E, 0x37, 0x7F, 0xB5, 0x2D, 0x66, 0x67, 0x02, 0xA9, 0x71, 0x19, 0x39, 0x88, 0xA7, - 0x45, 0xE1, 0x64, 0xA9, 0x5A, 0x97, 0xCC, 0xD3, 0x0E, 0x68, 0x2E, 0xB7, 0xF9, 0xBA, 0xFC, 0xD9, - 0x84, 0xD4, 0xC3, 0xF4, 0x28, 0x7F, 0xBB, 0xF0, 0x90, 0xC1, 0x4E, 0xC1, 0x69, 0xE8, 0x17, 0xB6, - 0x5A, 0xBB, 0xB2, 0xA2, 0xCE, 0x3B, 0x33, 0x45, 0x83, 0xEF, 0x24, 0x66, 0x42, 0xF3, 0x2A, 0x65, - 0x82, 0x06, 0x37, 0x05, 0x13, 0xB4, 0xFF, 0xF0, 0x65, 0xEC, 0xC3, 0xFB, 0x31, 0x33, 0x6C, 0xCB, - 0x49, 0xC1, 0x6C, 0xD6, 0x1E, 0xBE, 0x8C, 0x1B, 0x58, 0x0E, 0xAD, 0x1C, 0x47, 0x39, 0x29, 0x8A, - 0x46, 0xE2, 0xF5, 0xA1, 0x80, 0xD9, 0x60, 0x13, 0x62, 0x59, 0xDA, 0xED, 0x6A, 0x08, 0xE4, 0xF4, - 0x67, 0x91, 0x01, 0x6B, 0x27, 0x2B, 0xEE, 0xB1, 0x36, 0x70, 0x3A, 0x9A, 0x0D, 0x65, 0x1A, 0x52, - 0xCB, 0x25, 0x6D, 0xD6, 0xBB, 0x30, 0xC3, 0xB8, 0xA9, 0x34, 0xA3, 0x55, 0x87, 0xB7, 0x43, 0x5A, - 0xB7, 0x12, 0x1F, 0xEE, 0x88, 0x7E, 0x75, 0xB8, 0xAF, 0x4D, 0xE1, 0xCA, 0xE9, 0xAB, 0xB4, 0x2A, - 0xE0, 0xF0, 0xB0, 0x3F, 0xFA, 0xBA, 0xA4, 0xA4, 0x96, 0x53, 0x5C, 0x48, 0xEA, 0x72, 0xB2, 0xD2, - 0x92, 0x0A, 0x02, 0xA4, 0x34, 0x08, 0xFA, 0xC1, 0x0A, 0x64, 0x47, 0x5C, 0xE3, 0x91, 0x9D, 0xD4, - 0x26, 0x29, 0xCA, 0x43, 0xEC, 0x1D, 0x0D, 0x86, 0x03, 0x96, 0xE5, 0xB4, 0x5C, 0xD3, 0xF3, 0x61, - 0x2E, 0xB2, 0xAF, 0x08, 0xCF, 0xC0, 0x34, 0x03, 0x5E, 0xAB, 0x54, 0xAD, 0xC5, 0x86, 0xE6, 0xE8, - 0xBB, 0xAE, 0x79, 0xA5, 0x26, 0x87, 0x60, 0x8D, 0xA6, 0xA6, 0xAD, 0x59, 0x87, 0xB7, 0xB2, 0x27, - 0xA5, 0xA6, 0x99, 0x55, 0x89, 0xB7, 0xAB, 0x4C, 0x70, 0x4D, 0xD3, 0x72, 0x3D, 0x31, 0x5A, 0xF7, - 0xC2, 0x35, 0x4C, 0x58, 0xB5, 0x76, 0xAB, 0x4A, 0x12, 0x35, 0xED, 0xCD, 0x3A, 0x2D, 0x50, 0xC0, - 0x83, 0xC3, 0x41, 0xF0, 0x6F, 0xB7, 0xC9, 0x7F, 0x11, 0xB7, 0xC9, 0x12, 0xCF, 0x90, 0x19, 0x88, - 0x9F, 0xBF, 0xB9, 0xBC, 0xE0, 0x69, 0x88, 0x2F, 0xAB, 0x8E, 0x94, 0x87, 0xFD, 0xC1, 0xB1, 0x88, - 0x62, 0xE8, 0x8F, 0x46, 0x32, 0x8A, 0xE1, 0x81, 0x2F, 0x5D, 0x29, 0x87, 0xDC, 0x93, 0x92, 0xFB, - 0x4F, 0xC6, 0x21, 0xCB, 0xF4, 0xAD, 0x12, 0xE2, 0xB7, 0xFE, 0x63, 0xC1, 0xFE, 0xD7, 0x02, 0x70, - 0x5E, 0x29, 0xF2, 0xD9, 0xFF, 0x5A, 0x00, 0x5E, 0xD7, 0xB7, 0x5A, 0xD7, 0xB7, 0x5A, 0x84, 0x2C, - 0x6D, 0x6D, 0x2B, 0xBB, 0xBD, 0x89, 0xBC, 0xFE, 0x68, 0x04, 0xF7, 0xF4, 0x7F, 0xFC, 0xDE, 0x00, - 0xB4, 0x20, 0x2D, 0x19, 0x0F, 0xFB, 0xC7, 0xC3, 0xE3, 0x83, 0xC3, 0x20, 0x38, 0x2C, 0x26, 0xEE, - 0x21, 0x8B, 0x89, 0x5C, 0x64, 0x08, 0xC9, 0xC0, 0x64, 0x4A, 0x8E, 0xBE, 0x2A, 0x77, 0xDF, 0x47, - 0x83, 0xE1, 0xE0, 0xA0, 0x05, 0x60, 0xB9, 0x60, 0x36, 0x13, 0x78, 0x95, 0x0B, 0x86, 0xE8, 0x38, - 0xF2, 0x9D, 0x2D, 0x86, 0x91, 0xBB, 0xC5, 0x60, 0x78, 0x30, 0x8A, 0x86, 0x8E, 0x82, 0xC3, 0xD1, - 0xC8, 0x3F, 0xBC, 0x71, 0x14, 0xF8, 0x07, 0xC7, 0x47, 0xC7, 0x91, 0xA3, 0x60, 0x3E, 0x98, 0x1F, - 0xCE, 0x16, 0x8E, 0x82, 0xD1, 0x68, 0x74, 0x38, 0x1A, 0x38, 0x0A, 0xD0, 0xA2, 0x7F, 0xDC, 0x3F, - 0x76, 0x14, 0x1C, 0x45, 0xA8, 0x3F, 0x70, 0x61, 0xB5, 0x98, 0xA1, 0xE3, 0xA1, 0xAB, 0x8F, 0xC3, - 0xFE, 0xF1, 0xC2, 0xD9, 0x79, 0x34, 0x3F, 0x5C, 0x44, 0x47, 0xCE, 0x91, 0xA3, 0x3E, 0xEA, 0xBB, - 0xB0, 0xA2, 0xFF, 0x9B, 0xB5, 0xC0, 0x14, 0x32, 0x11, 0xE3, 0x78, 0x04, 0x83, 0xC1, 0x08, 0x06, - 0x87, 0x23, 0xD8, 0x0F, 0x46, 0xB0, 0x3F, 0x1A, 0x69, 0x0F, 0x1B, 0x1C, 0xFA, 0x13, 0x7C, 0xD2, - 0x0F, 0x0E, 0x26, 0x58, 0xAB, 0xF2, 0xF2, 0x90, 0x5C, 0xE1, 0x67, 0x83, 0x83, 0x3F, 0x1C, 0x3C, - 0xFA, 0x53, 0xBA, 0xFD, 0xAE, 0xF0, 0x33, 0xF1, 0x47, 0x42, 0xFF, 0xF8, 0xC3, 0xC1, 0x74, 0x22, - 0x22, 0xAF, 0x33, 0xAA, 0x62, 0x4A, 0x8D, 0x24, 0x41, 0x31, 0x43, 0x22, 0xCF, 0x3D, 0x9E, 0x9D, - 0x81, 0x93, 0x94, 0x55, 0xF8, 0x9E, 0x92, 0x1F, 0x2F, 0x2D, 0xCC, 0xB4, 0x0A, 0xFE, 0x84, 0x9C, - 0xF4, 0x87, 0x2C, 0xDF, 0x81, 0xBA, 0x48, 0x1C, 0x75, 0x02, 0xFF, 0x7B, 0xD2, 0xDC, 0x11, 0x86, - 0x18, 0xE2, 0xDA, 0x8E, 0x78, 0x69, 0xA1, 0x74, 0x86, 0xA8, 0x00, 0x1E, 0xE0, 0x1A, 0xA3, 0x4F, - 0x25, 0x0F, 0xE3, 0x65, 0xAD, 0x87, 0xF1, 0x86, 0xF4, 0x7F, 0x4A, 0x53, 0x6C, 0x05, 0xFC, 0x72, - 0x38, 0x66, 0x46, 0xB5, 0x19, 0xFE, 0x4A, 0xAD, 0x4A, 0xA0, 0x2C, 0x67, 0xCC, 0x99, 0x88, 0xD2, - 0x76, 0x1E, 0xCD, 0x96, 0x48, 0xC4, 0x4F, 0x64, 0xD5, 0xCE, 0xCD, 0x02, 0x55, 0x99, 0x01, 0xA5, - 0xD7, 0x2E, 0x74, 0xCB, 0xEC, 0x3E, 0xC7, 0x31, 0xBC, 0x89, 0x66, 0x1F, 0xC5, 0x1F, 0x73, 0xC8, - 0x23, 0xAC, 0x8D, 0xAF, 0xC5, 0x8F, 0xE7, 0xB3, 0x19, 0x4A, 0xC8, 0x78, 0x0D, 0x95, 0x7C, 0xF9, - 0x4A, 0x37, 0x15, 0x62, 0xA8, 0x2A, 0xFA, 0x41, 0x01, 0xFA, 0x90, 0x45, 0x49, 0xCE, 0x33, 0xAE, - 0x8D, 0x17, 0xAE, 0x0A, 0x6F, 0x57, 0xD1, 0x5F, 0xD7, 0x88, 0x2E, 0x10, 0xC5, 0xA8, 0x77, 0x13, - 0xA3, 0x64, 0xEE, 0xCD, 0xE1, 0x02, 0xE8, 0xCA, 0x17, 0x89, 0x50, 0x60, 0x6F, 0x82, 0x5A, 0xAD, - 0x58, 0x0F, 0x3D, 0x4A, 0x72, 0x3C, 0x76, 0xB2, 0x31, 0xA1, 0xDE, 0x00, 0xD0, 0x9A, 0xD0, 0xB1, - 0x63, 0x92, 0x65, 0x58, 0xD3, 0xF5, 0x6A, 0xCE, 0xB2, 0x83, 0xE7, 0x24, 0xCD, 0x64, 0x54, 0x37, - 0x65, 0x0F, 0x87, 0x08, 0x3B, 0x2C, 0xDC, 0xE9, 0x13, 0x8D, 0x5B, 0x0C, 0xA1, 0xB5, 0xB6, 0xCC, - 0xB9, 0x78, 0xB9, 0x42, 0x33, 0xBC, 0xC0, 0x33, 0x2B, 0x44, 0x9E, 0x3B, 0x5A, 0x9F, 0x19, 0x7F, - 0xDF, 0x42, 0x5E, 0x06, 0xA7, 0xA8, 0x73, 0x62, 0xDD, 0xB2, 0x53, 0x86, 0xB6, 0xD5, 0xCB, 0x8E, - 0x23, 0x96, 0xD9, 0x1F, 0x67, 0x62, 0xDE, 0x6C, 0x6F, 0x4C, 0xFE, 0xB5, 0xD0, 0x40, 0x51, 0xF8, - 0x50, 0x94, 0x15, 0x0A, 0xBC, 0x12, 0x53, 0x24, 0xF4, 0x34, 0x41, 0x87, 0xB7, 0x1E, 0x32, 0xFE, - 0x84, 0x31, 0x80, 0xB8, 0xA7, 0x49, 0x9C, 0x15, 0xEB, 0x3F, 0xE1, 0x9C, 0x16, 0x73, 0x5A, 0x67, - 0x45, 0xFC, 0x27, 0xBC, 0xD6, 0x9F, 0xF9, 0x16, 0x30, 0x0A, 0xF9, 0x07, 0xB8, 0xA6, 0x55, 0x9A, - 0x69, 0x9F, 0x35, 0x72, 0x54, 0xA1, 0x94, 0xE8, 0x6C, 0xCB, 0x09, 0x37, 0xB4, 0x09, 0xD7, 0x44, - 0x7F, 0x63, 0x97, 0x16, 0xE0, 0xC6, 0x2D, 0x64, 0x23, 0x57, 0xAD, 0xFA, 0xB5, 0x5D, 0xED, 0x34, - 0x96, 0x46, 0x4C, 0xAD, 0x8E, 0x34, 0xFF, 0x09, 0x91, 0xEB, 0xEB, 0x99, 0x35, 0x2C, 0xFD, 0x1D, - 0xA6, 0xBD, 0x37, 0xBF, 0xBC, 0x7E, 0xCD, 0x77, 0x3B, 0x90, 0xBC, 0xCB, 0x0D, 0x38, 0x0C, 0xCD, - 0xCA, 0xED, 0xB6, 0xE7, 0xAE, 0x26, 0x52, 0x3D, 0x40, 0x39, 0x44, 0x9C, 0xF3, 0x31, 0x7B, 0x1B, - 0x67, 0x4E, 0x2B, 0x1A, 0x7B, 0x83, 0xC9, 0x46, 0x2A, 0x92, 0xF0, 0xD3, 0x55, 0x34, 0xC3, 0xE4, - 0x7E, 0x23, 0x78, 0x2A, 0xDF, 0xE2, 0x85, 0xD7, 0x84, 0x56, 0xF3, 0x7C, 0xD7, 0xA1, 0xD7, 0x4C, - 0x4F, 0x0D, 0x68, 0x36, 0x36, 0x14, 0xE8, 0xE2, 0x1E, 0x65, 0xCE, 0x6E, 0xB1, 0x5A, 0x31, 0x67, - 0x5E, 0xE9, 0xCA, 0x9F, 0xF2, 0x7D, 0x1C, 0x47, 0xB3, 0x8F, 0xD0, 0xD9, 0x82, 0x67, 0x8C, 0xE1, - 0xB5, 0x03, 0x5E, 0x3B, 0x43, 0xF3, 0x9A, 0xBA, 0x81, 0xAE, 0xDB, 0xE7, 0x75, 0x6F, 0x33, 0x84, - 0x92, 0x9A, 0xDA, 0x7D, 0x5D, 0x7B, 0xC0, 0x6B, 0xDF, 0xA3, 0x38, 0x4E, 0x3F, 0xD7, 0x54, 0x1F, - 0xE8, 0xEA, 0x43, 0x89, 0xF6, 0x1A, 0xD5, 0x54, 0x1E, 0xEA, 0xCA, 0x23, 0x5E, 0xF9, 0x2E, 0xBA, - 0x45, 0x09, 0x89, 0x6A, 0xEA, 0x8F, 0x74, 0xFD, 0x03, 0x5E, 0x7F, 0x76, 0x1F, 0xD5, 0x21, 0x7E, - 0xA0, 0x2B, 0x1F, 0xF2, 0xCA, 0x9F, 0x97, 0x98, 0xD4, 0xA1, 0x72, 0xA8, 0x6B, 0x1F, 0x09, 0xBC, - 0xD9, 0xB3, 0xE4, 0x0F, 0x0D, 0x93, 0x7E, 0xA4, 0xDB, 0x1C, 0x9B, 0x6D, 0xDE, 0xD7, 0x4E, 0xFD, - 0xB1, 0xB1, 0x4C, 0xBE, 0xD9, 0xE4, 0xC7, 0x86, 0x15, 0x08, 0xCC, 0xC5, 0x0D, 0xCC, 0x56, 0x7F, - 0x69, 0x5A, 0x89, 0xC0, 0x58, 0xE7, 0xA0, 0x6F, 0x8F, 0xA9, 0x76, 0x45, 0x02, 0x63, 0xB9, 0x83, - 0x81, 0xD9, 0xE8, 0xE7, 0xC6, 0x95, 0x09, 0x8C, 0x75, 0x0F, 0x86, 0x66, 0xBB, 0xF3, 0xFA, 0x15, - 0x0A, 0x8C, 0xF5, 0x0F, 0x46, 0x66, 0xA3, 0x5F, 0x1B, 0x56, 0x2A, 0x18, 0xB1, 0x04, 0x4E, 0x5C, - 0x70, 0x45, 0xF3, 0xE7, 0x49, 0x8E, 0xB5, 0xDC, 0xAE, 0x5E, 0x7C, 0x38, 0x58, 0x75, 0x57, 0x3F, - 0x28, 0xB5, 0x90, 0x3A, 0x7E, 0xC3, 0x6F, 0xDD, 0x9F, 0x64, 0x27, 0x39, 0x73, 0x56, 0x17, 0x28, - 0x65, 0x9D, 0x40, 0x50, 0x99, 0xD9, 0xF2, 0x2A, 0x9B, 0xD6, 0x20, 0xC6, 0xEA, 0x83, 0xA2, 0x41, - 0x0C, 0xD9, 0x42, 0x94, 0x2A, 0xC9, 0xBE, 0xDA, 0x4B, 0x99, 0x9F, 0xFF, 0x2C, 0xFE, 0x84, 0x6A, - 0x66, 0x3A, 0x65, 0x5B, 0x5F, 0xB7, 0x05, 0x56, 0x6E, 0xF7, 0x80, 0x17, 0x9E, 0xB2, 0x5D, 0x42, - 0x20, 0xFF, 0x8C, 0x65, 0x92, 0xB5, 0x28, 0x47, 0x7B, 0xFD, 0xD1, 0xC1, 0xD8, 0x14, 0x46, 0x4C, - 0x39, 0xA4, 0x8A, 0x86, 0x59, 0x3C, 0xE1, 0x59, 0xC6, 0x04, 0x94, 0x43, 0x1B, 0x8A, 0x21, 0xAE, - 0xB8, 0xA0, 0xE8, 0x62, 0x1B, 0xCA, 0x91, 0x0D, 0x45, 0x48, 0x35, 0x2E, 0x08, 0xBC, 0x48, 0xB4, - 0x9E, 0x73, 0x9F, 0x25, 0xBB, 0x31, 0x5B, 0x6F, 0x34, 0x75, 0xB6, 0x16, 0x65, 0x85, 0xD2, 0x03, - 0x19, 0xB9, 0x16, 0x6B, 0xAA, 0xCB, 0x97, 0xCD, 0x4E, 0x07, 0x81, 0x9D, 0xFB, 0xB9, 0x4B, 0xE7, - 0x78, 0x71, 0x2F, 0xC8, 0x02, 0x81, 0x07, 0xE4, 0x99, 0x20, 0xB6, 0x5F, 0x5A, 0x27, 0x95, 0x39, - 0xC8, 0xC5, 0xBE, 0x20, 0xD5, 0xAC, 0xAF, 0x79, 0x6D, 0xAA, 0x59, 0x3C, 0x79, 0x99, 0x72, 0xAC, - 0x8A, 0xB8, 0x88, 0x94, 0x67, 0x42, 0x9E, 0x73, 0x45, 0x51, 0x4C, 0xA4, 0xE2, 0x6A, 0xEF, 0x96, - 0xEB, 0xB3, 0x6C, 0x42, 0x24, 0xD9, 0xBD, 0x14, 0x99, 0xED, 0xBB, 0x3E, 0x32, 0x12, 0x01, 0xAA, - 0xC4, 0x7F, 0xC5, 0x27, 0x99, 0xA0, 0x65, 0xE6, 0x48, 0x44, 0xFE, 0xA9, 0xA2, 0xDB, 0xFA, 0x54, - 0xC0, 0x83, 0xC1, 0xF0, 0xF8, 0xEB, 0x54, 0xEC, 0xE7, 0x38, 0x9B, 0xAD, 0xE3, 0x28, 0x7B, 0x8D, - 0x73, 0xE2, 0xD0, 0x74, 0x33, 0x1D, 0x58, 0x26, 0x93, 0xF0, 0xF3, 0xBB, 0x77, 0xA2, 0x6E, 0xDF, - 0xD9, 0xD6, 0xB7, 0xEF, 0xBB, 0xE8, 0x8B, 0x78, 0xEE, 0x40, 0xF2, 0x06, 0xFD, 0x02, 0xC5, 0x88, - 0x20, 0x71, 0xAF, 0x76, 0x5C, 0xBC, 0xF3, 0x9A, 0x5C, 0x13, 0xAC, 0x59, 0xE8, 0x02, 0x62, 0x5E, - 0xB9, 0xA9, 0x38, 0x93, 0xA3, 0x8C, 0xEC, 0x0C, 0x9F, 0x37, 0x0B, 0x5D, 0x40, 0x6C, 0xF8, 0x1F, - 0x32, 0x7C, 0xB7, 0x33, 0x74, 0xDA, 0x28, 0xAC, 0x02, 0xB0, 0x94, 0x05, 0x51, 0x96, 0x45, 0xF7, - 0x4C, 0x49, 0xF0, 0x9C, 0xFE, 0xF2, 0x4A, 0x33, 0xA8, 0x6E, 0xAF, 0x24, 0xCA, 0x08, 0x33, 0x8E, - 0x51, 0xAE, 0x46, 0xB1, 0xF0, 0x3C, 0x62, 0x97, 0x36, 0xD5, 0xA0, 0x12, 0x45, 0x47, 0x16, 0x14, - 0xB9, 0x55, 0xCD, 0xF2, 0x6B, 0x52, 0xEB, 0xA5, 0x33, 0xD8, 0x2A, 0xFF, 0x0C, 0x8D, 0x1A, 0x02, - 0x25, 0x8D, 0x94, 0x36, 0x41, 0xE6, 0x28, 0xC9, 0xF3, 0x0A, 0x77, 0x3A, 0x80, 0x5C, 0x61, 0xC9, - 0x42, 0xD8, 0x10, 0xAF, 0xD4, 0x73, 0xED, 0xF9, 0xFD, 0x2C, 0xC6, 0x33, 0x6E, 0xE8, 0x83, 0xC1, - 0x74, 0x62, 0xCE, 0x03, 0xA9, 0xA3, 0x20, 0x6B, 0x02, 0xD8, 0x88, 0x63, 0xE7, 0x70, 0x63, 0x3D, - 0xD6, 0xD8, 0x1C, 0x28, 0x3A, 0x35, 0xCB, 0x81, 0x56, 0x6A, 0x99, 0x9F, 0x27, 0xE4, 0x04, 0xF1, - 0xD4, 0xA0, 0x26, 0xDE, 0x53, 0xB9, 0x53, 0xAC, 0x69, 0x47, 0x05, 0xCF, 0xA2, 0x6B, 0x77, 0xDF, - 0x30, 0x54, 0x04, 0xA6, 0x14, 0x2D, 0xD3, 0xC3, 0xBD, 0xB9, 0x76, 0x48, 0x0A, 0x11, 0x14, 0x67, - 0x73, 0x75, 0x6B, 0x70, 0x53, 0x35, 0x69, 0xB1, 0x5C, 0xD5, 0xD2, 0xAC, 0x9E, 0x79, 0x95, 0x49, - 0xED, 0x74, 0xCA, 0x9F, 0xFE, 0x50, 0x6A, 0xE4, 0xD8, 0x0A, 0x9C, 0xA5, 0x07, 0xCA, 0xF6, 0x93, - 0xF7, 0xD7, 0xE9, 0x14, 0x19, 0x9A, 0xDD, 0xCF, 0x58, 0xC8, 0x28, 0x45, 0x64, 0x65, 0xC7, 0x2F, - 0x45, 0xE1, 0x95, 0x74, 0xD8, 0xE7, 0x51, 0xB2, 0x97, 0x26, 0xF1, 0xFD, 0x9E, 0x80, 0xB2, 0xF7, - 0x79, 0x89, 0xE8, 0x04, 0xA3, 0x3D, 0xFE, 0x40, 0xBA, 0x87, 0xF3, 0xBD, 0xC5, 0x3A, 0x8E, 0x5B, - 0x60, 0x52, 0x4A, 0xA3, 0xFA, 0x6D, 0x46, 0x03, 0x77, 0x9A, 0xEE, 0x6E, 0x00, 0xA6, 0x32, 0x27, - 0xE2, 0x9A, 0x79, 0x3C, 0x38, 0x08, 0xB2, 0xBA, 0x04, 0xC5, 0x2A, 0x5D, 0x95, 0xEB, 0x6E, 0xDB, - 0x63, 0x97, 0xF5, 0x29, 0x32, 0x7C, 0xD2, 0xF3, 0xA0, 0xD7, 0xEB, 0x89, 0x4C, 0xA4, 0x3A, 0xD7, - 0x2B, 0x0E, 0xD1, 0x04, 0x9F, 0x58, 0xED, 0x08, 0xDF, 0x99, 0x5B, 0x6C, 0xCA, 0x2D, 0x76, 0x6E, - 0x87, 0xA8, 0xBD, 0xAB, 0xAC, 0x19, 0x9C, 0xDC, 0x5E, 0x78, 0x65, 0x30, 0x73, 0x80, 0x31, 0x82, - 0xD2, 0x3B, 0xC3, 0x52, 0x2D, 0xDB, 0x13, 0x3A, 0x21, 0xA7, 0x21, 0x9A, 0x90, 0x6E, 0x77, 0x33, - 0xAE, 0xA4, 0xA3, 0xC4, 0xE4, 0x2D, 0x90, 0xA6, 0x28, 0x37, 0x64, 0xF1, 0xDD, 0xBC, 0x2B, 0xE9, - 0xA0, 0x43, 0x7C, 0x45, 0x78, 0xF2, 0x57, 0x3B, 0x86, 0x4F, 0xF9, 0xFC, 0x70, 0x0E, 0x5B, 0x59, - 0xB6, 0x00, 0x6B, 0x8B, 0xAA, 0x51, 0x9C, 0x96, 0x77, 0x47, 0xC9, 0xFE, 0xA9, 0x54, 0xBD, 0x5B, - 0xAA, 0x3E, 0x29, 0x93, 0x7D, 0xA7, 0xCC, 0x0B, 0xB6, 0xDD, 0x06, 0x08, 0x98, 0xA6, 0xF6, 0xA2, - 0x5B, 0x6D, 0x98, 0x43, 0x32, 0x7C, 0xC7, 0xE3, 0xBD, 0x51, 0xE9, 0xCF, 0x62, 0xAE, 0xED, 0xB6, - 0x67, 0x63, 0x5B, 0x3D, 0xC3, 0xCA, 0x58, 0x75, 0xB5, 0xA0, 0xE0, 0x42, 0x84, 0xB9, 0xE3, 0x0B, - 0x4F, 0x66, 0x95, 0xF1, 0x98, 0x25, 0x10, 0x24, 0x27, 0xA1, 0xCF, 0x8D, 0xDE, 0xD0, 0x89, 0xFF, - 0xF8, 0x88, 0x4E, 0xED, 0x8E, 0x2B, 0xAC, 0x85, 0xA1, 0xB0, 0x27, 0x5F, 0x75, 0xF7, 0xD2, 0x35, - 0xD9, 0x4B, 0x17, 0x7B, 0x2C, 0x0A, 0x4C, 0x8B, 0xD9, 0x0E, 0xA1, 0x0E, 0x3E, 0xF1, 0x9D, 0x2C, - 0x29, 0x49, 0xC9, 0x1E, 0x43, 0x64, 0x4F, 0xF8, 0x62, 0xE4, 0x7B, 0x38, 0xD9, 0x8B, 0x71, 0x4E, - 0xF6, 0x6E, 0xD0, 0x7D, 0x9A, 0xCC, 0xF7, 0xD8, 0x52, 0xEF, 0xF9, 0x1C, 0x10, 0x3E, 0xF5, 0xF5, - 0x5E, 0xCC, 0x43, 0xD2, 0x0D, 0x26, 0xF9, 0x69, 0xE8, 0x4F, 0x72, 0x49, 0xD5, 0xEC, 0x2C, 0xE8, - 0xE4, 0x1D, 0x61, 0xFC, 0x71, 0xCB, 0xFF, 0x04, 0xDA, 0x32, 0x14, 0x75, 0x48, 0x07, 0x77, 0xAD, - 0xF3, 0x09, 0x2F, 0xBC, 0xFC, 0xD4, 0x67, 0xA7, 0x97, 0xBD, 0x2E, 0xB9, 0xB5, 0x13, 0xCB, 0x44, - 0x34, 0x01, 0x36, 0xFB, 0xA8, 0xAE, 0x47, 0xA7, 0x81, 0x1D, 0xDA, 0x97, 0x0A, 0x9E, 0x15, 0x99, - 0x30, 0xA3, 0xF2, 0xC6, 0x71, 0x14, 0x45, 0xF5, 0x4C, 0x93, 0xC9, 0x2E, 0x2B, 0xFD, 0x23, 0x50, - 0xE6, 0xCF, 0x45, 0x51, 0x12, 0x57, 0x93, 0x02, 0x06, 0xC3, 0xC1, 0xF1, 0xD7, 0xE4, 0xFF, 0x9D, - 0xC5, 0x69, 0x62, 0xA4, 0xFC, 0xE5, 0x7F, 0x2A, 0xA1, 0x1E, 0x79, 0x04, 0xE2, 0x70, 0xC4, 0xA8, - 0x49, 0xBE, 0xD4, 0xEF, 0xCB, 0xD7, 0x78, 0x1D, 0xE2, 0x44, 0xAD, 0x0F, 0x13, 0x8A, 0x7A, 0x38, - 0x17, 0x72, 0x1B, 0x38, 0xBB, 0x9A, 0x8E, 0x1F, 0x0A, 0xC6, 0x5F, 0x84, 0x85, 0x35, 0x25, 0x10, - 0x02, 0xF2, 0xAB, 0x6C, 0x1A, 0xE2, 0x93, 0x30, 0x38, 0x23, 0x57, 0xD9, 0x74, 0x4C, 0xFF, 0xD3, - 0x6E, 0x23, 0x8F, 0xFE, 0x0B, 0x71, 0x37, 0x50, 0x87, 0x58, 0x5E, 0x14, 0xF0, 0xC8, 0x1F, 0x7D, - 0xA5, 0x15, 0xCD, 0xCC, 0x7C, 0x74, 0x08, 0x49, 0x8F, 0xA4, 0xEF, 0xA2, 0xF9, 0x1C, 0xCD, 0x7F, - 0x42, 0x5F, 0x42, 0xD2, 0xCB, 0x6E, 0x6F, 0x22, 0xFE, 0x4F, 0x48, 0xE8, 0x1D, 0x85, 0xFE, 0x97, - 0xDE, 0x51, 0xE8, 0xBF, 0xE2, 0x5D, 0x2E, 0x24, 0x86, 0xA2, 0xB5, 0x7A, 0x49, 0x60, 0x51, 0x88, - 0xAD, 0xC4, 0xFF, 0x29, 0x4F, 0xFE, 0x3F, 0xF9, 0x14, 0x65, 0x7B, 0x4B, 0x38, 0x83, 0xB1, 0xBE, - 0x27, 0xCD, 0x4B, 0x4E, 0x5E, 0xD2, 0x2E, 0x3C, 0x38, 0xD0, 0x47, 0xB7, 0x74, 0xD0, 0xEA, 0x9F, - 0xB5, 0xFC, 0x56, 0x87, 0x1E, 0x0C, 0xAA, 0xF9, 0xB5, 0x65, 0x36, 0x80, 0x4E, 0xC8, 0x99, 0x47, - 0x3A, 0x3D, 0x7F, 0x04, 0x9E, 0x79, 0x88, 0xFD, 0x3B, 0x16, 0xFF, 0x3E, 0x13, 0xDF, 0x0B, 0x0B, - 0x77, 0xFE, 0x98, 0x2E, 0x9E, 0xD7, 0x7D, 0x5F, 0xBC, 0x9E, 0xFB, 0x05, 0xD4, 0x56, 0x09, 0xE0, - 0x01, 0xF1, 0x47, 0xCA, 0xB0, 0x6A, 0x03, 0x62, 0xE5, 0x35, 0xDE, 0x0F, 0xC3, 0xFC, 0xEC, 0xF7, - 0xFF, 0xF8, 0xEE, 0x81, 0x0E, 0xA9, 0xA0, 0xFF, 0x10, 0xFE, 0x0F, 0xE6, 0xFF, 0xE4, 0xA0, 0xF8, - 0x7D, 0x5C, 0x53, 0xFE, 0x7B, 0x01, 0x91, 0x78, 0xED, 0xAC, 0x74, 0x13, 0xF6, 0x47, 0x23, 0xB5, - 0x2D, 0xD0, 0xC9, 0x49, 0x7F, 0xF8, 0x48, 0x4E, 0x4E, 0x82, 0x83, 0x47, 0x7C, 0x72, 0x72, 0xF4, - 0x98, 0x83, 0xD3, 0xD3, 0x53, 0xBF, 0x28, 0xBC, 0xA5, 0xB1, 0x40, 0x8F, 0x8F, 0x9E, 0xB1, 0x5A, - 0x0F, 0x05, 0x00, 0xD6, 0x80, 0xD4, 0xEC, 0x11, 0x6B, 0xF6, 0xA2, 0xD0, 0x88, 0x2C, 0xD3, 0x1F, - 0x8D, 0xBE, 0x27, 0x00, 0x5E, 0x65, 0x30, 0x81, 0xE9, 0x34, 0x8C, 0xE9, 0x1C, 0x08, 0x80, 0x1E, - 0x62, 0x44, 0x02, 0x20, 0x9B, 0xBD, 0xA5, 0x78, 0xC2, 0x65, 0x15, 0x61, 0x24, 0x1E, 0x71, 0x97, - 0xF2, 0xED, 0x56, 0x7E, 0x2E, 0x0A, 0xC4, 0x5F, 0x13, 0x42, 0xDB, 0xE0, 0x03, 0x2F, 0xBC, 0x28, - 0xA4, 0xBD, 0xB5, 0x39, 0xE9, 0x81, 0x67, 0xFD, 0xD1, 0x08, 0x06, 0x61, 0x18, 0x46, 0x2A, 0xAF, - 0x6A, 0x9E, 0x8F, 0x19, 0x29, 0x72, 0xD0, 0xBC, 0x5E, 0xA1, 0x1D, 0x6E, 0xD9, 0xDF, 0xA7, 0xA7, - 0xFD, 0x61, 0x9B, 0x36, 0xCD, 0xD5, 0x87, 0xE0, 0x80, 0x7D, 0x98, 0xA9, 0x0F, 0x47, 0xEC, 0xEF, - 0x38, 0x44, 0x76, 0x8B, 0xB9, 0xFA, 0x20, 0x5A, 0x5C, 0xAB, 0x0F, 0xAC, 0x85, 0xA4, 0xC3, 0x2C, - 0x8C, 0xCD, 0xD8, 0x3B, 0x1E, 0xEE, 0xC6, 0xE0, 0xFB, 0x08, 0xC0, 0x24, 0x9C, 0x5B, 0xDF, 0xF3, - 0xEE, 0x9C, 0x7D, 0x4F, 0xC3, 0x6B, 0xEB, 0xFB, 0xAC, 0x7B, 0xCD, 0xBE, 0x57, 0xA7, 0xCD, 0x39, - 0x69, 0xA0, 0xA0, 0x44, 0x21, 0xDF, 0x01, 0x42, 0x73, 0x01, 0x05, 0x42, 0xFD, 0xD1, 0x28, 0xE4, - 0x73, 0x27, 0x56, 0xA4, 0x60, 0xC9, 0x3C, 0xF2, 0x75, 0x86, 0xAC, 0x87, 0xC5, 0xB0, 0x6C, 0xEA, - 0x24, 0xF7, 0x6A, 0xEC, 0xAA, 0x2D, 0x96, 0x17, 0xF2, 0x59, 0x83, 0x98, 0x9D, 0x55, 0xD2, 0x33, - 0x64, 0x2F, 0x56, 0x3A, 0x8B, 0x5C, 0x4F, 0xB9, 0x9A, 0xB9, 0x5C, 0x4C, 0x19, 0xC3, 0x24, 0xAD, - 0x22, 0x2E, 0x37, 0x3A, 0x45, 0xFA, 0x51, 0x20, 0x4D, 0xE9, 0x57, 0x4C, 0xB1, 0x93, 0xDA, 0x48, - 0xC3, 0x8C, 0x91, 0x42, 0x74, 0x34, 0xC3, 0x84, 0x5E, 0x0D, 0x51, 0xEF, 0x8E, 0x67, 0x24, 0xBB, - 0x7F, 0x2B, 0xBE, 0x19, 0x43, 0xC7, 0x06, 0xA5, 0xEB, 0x49, 0x83, 0x74, 0x13, 0x44, 0xDF, 0xE3, - 0x67, 0x12, 0x6D, 0x31, 0xBE, 0xF7, 0x3F, 0xFE, 0xE0, 0x98, 0xF3, 0xAB, 0x12, 0xED, 0x94, 0x28, - 0xC7, 0xA2, 0x9B, 0x69, 0x51, 0x78, 0x82, 0x79, 0xF2, 0x0D, 0xC9, 0xD8, 0x68, 0x65, 0x37, 0x32, - 0x49, 0x13, 0x62, 0x66, 0x4F, 0x9C, 0xF7, 0x70, 0xFE, 0x86, 0x05, 0x61, 0x95, 0x32, 0xDD, 0x5C, - 0x06, 0x64, 0xE1, 0x56, 0x6D, 0x42, 0xC4, 0xF1, 0x5A, 0x3C, 0xCC, 0x54, 0x0B, 0x4C, 0x90, 0xC8, - 0x88, 0x13, 0x40, 0x24, 0x73, 0xDB, 0x04, 0x5A, 0x40, 0xE0, 0xB6, 0xE4, 0x09, 0x41, 0x5F, 0x88, - 0xD7, 0xEA, 0xCF, 0x5B, 0xF0, 0xE1, 0x33, 0x8E, 0xE3, 0xF7, 0x28, 0x9A, 0xBF, 0x62, 0xC1, 0x2A, - 0x13, 0x12, 0xDF, 0xB3, 0x73, 0x61, 0x92, 0xB7, 0xDB, 0x1E, 0x09, 0x73, 0x48, 0x7A, 0xB7, 0x71, - 0x7A, 0x13, 0xC5, 0xE7, 0xE9, 0xDD, 0x2A, 0xCD, 0x31, 0x41, 0x6F, 0x57, 0x88, 0xA7, 0x34, 0x08, - 0x5B, 0xB3, 0x74, 0x75, 0xDF, 0x82, 0x74, 0xCB, 0x71, 0x6C, 0x5E, 0xE3, 0x04, 0x45, 0xD9, 0x8F, - 0x59, 0x34, 0xC7, 0x14, 0x29, 0x1F, 0xFA, 0x30, 0x80, 0x01, 0x00, 0x85, 0x9A, 0x45, 0x6B, 0x0A, - 0x59, 0x48, 0x88, 0x3B, 0xA6, 0xE7, 0x7A, 0xF6, 0x1F, 0x57, 0xBF, 0xCD, 0xA3, 0xEE, 0x62, 0xFA, - 0x30, 0x80, 0x47, 0xC5, 0x33, 0x0C, 0x94, 0x92, 0x56, 0xBB, 0xBF, 0x47, 0x39, 0xDA, 0x1B, 0x8E, - 0xD5, 0xE6, 0x5B, 0x45, 0x59, 0x8E, 0x2E, 0x12, 0xE2, 0x21, 0xA1, 0x70, 0x0B, 0x60, 0x1F, 0xF4, - 0x32, 0xB4, 0x42, 0x11, 0xF1, 0xFA, 0x00, 0x06, 0x07, 0x74, 0x2B, 0x56, 0x6A, 0xF5, 0xE1, 0xA0, - 0x5C, 0x2B, 0xAD, 0xD6, 0x1A, 0xC0, 0x61, 0xB9, 0x96, 0xA6, 0x74, 0x4E, 0x71, 0x5C, 0x61, 0x3B, - 0xFA, 0xFB, 0x21, 0x14, 0x55, 0x6B, 0x0D, 0xE1, 0x68, 0x03, 0xDA, 0x30, 0x12, 0x88, 0x1F, 0x8E, - 0x0D, 0x76, 0x8A, 0xF8, 0xF6, 0xF1, 0xAA, 0x43, 0x60, 0x40, 0xE8, 0xC1, 0x42, 0xB7, 0x03, 0x3B, - 0x5A, 0x78, 0xF3, 0x63, 0x47, 0xF3, 0x9A, 0xD6, 0xFC, 0x40, 0xD2, 0x24, 0x28, 0x56, 0x9C, 0x36, - 0x39, 0xFB, 0xCD, 0xFB, 0x2D, 0xFF, 0xDE, 0xFB, 0x6D, 0xFE, 0x10, 0xC0, 0x41, 0x01, 0x7E, 0xCB, - 0xBF, 0x87, 0x1B, 0xFE, 0xF6, 0xD8, 0x07, 0xFF, 0x31, 0x78, 0xFC, 0x6D, 0x7E, 0xF6, 0x5B, 0xCF, - 0xFB, 0x6D, 0xDE, 0x01, 0xF4, 0x3B, 0x38, 0xFB, 0x0D, 0x3C, 0xB3, 0x59, 0x93, 0xB1, 0x22, 0x39, - 0x7B, 0x1D, 0x4C, 0xCC, 0x0F, 0xFD, 0xA9, 0x35, 0xCF, 0x39, 0x7B, 0xE2, 0xAB, 0x1C, 0x79, 0x9E, - 0x0E, 0x01, 0x79, 0x35, 0x9A, 0x9E, 0x05, 0x7C, 0x8C, 0xAF, 0xE2, 0x34, 0xA2, 0x4D, 0x46, 0x53, - 0x00, 0x9C, 0x33, 0xCC, 0x7C, 0x01, 0x1E, 0x1F, 0xF7, 0x71, 0xF5, 0x5E, 0x60, 0xA8, 0x79, 0xC7, - 0x7B, 0xBF, 0x24, 0xF9, 0x7A, 0xB5, 0x4A, 0x33, 0x82, 0xE6, 0x7B, 0xB3, 0x3C, 0xA7, 0x22, 0xF3, - 0x5D, 0x44, 0xF8, 0x75, 0x80, 0xF4, 0x16, 0x38, 0x8E, 0x59, 0x9A, 0xC4, 0x10, 0x43, 0xF3, 0x2F, - 0x04, 0x5B, 0x39, 0x93, 0x8A, 0x0C, 0x61, 0x53, 0x17, 0x7F, 0x75, 0x97, 0xEF, 0xD1, 0x4C, 0xEF, - 0x5D, 0x71, 0xE2, 0xC3, 0x68, 0xCA, 0x1D, 0x51, 0x2E, 0xEE, 0xA2, 0x5B, 0xF4, 0x22, 0x22, 0x91, - 0xAA, 0xD1, 0x9B, 0x47, 0x24, 0x82, 0xFD, 0xD1, 0x68, 0x9F, 0x9E, 0xD1, 0x4F, 0xEC, 0x5C, 0x10, - 0x93, 0x5B, 0x56, 0x80, 0x8C, 0xC6, 0x0A, 0xCE, 0x3E, 0x73, 0x21, 0xCD, 0xE4, 0x1B, 0x05, 0x19, - 0xF3, 0x64, 0x43, 0x4C, 0x8C, 0xC8, 0x42, 0xC2, 0xFE, 0x4D, 0x42, 0xC6, 0xDE, 0x45, 0xAF, 0xBD, - 0x7E, 0xD0, 0x3F, 0xF8, 0xDE, 0xCB, 0x4F, 0xC2, 0x9E, 0x3F, 0x38, 0xEE, 0x1F, 0x9D, 0xE5, 0xCF, - 0x82, 0x7E, 0xEF, 0xB8, 0xCF, 0x93, 0xA4, 0xAF, 0xD2, 0xCF, 0x9E, 0x97, 0x53, 0x59, 0x71, 0x04, - 0x9E, 0x05, 0xF4, 0x1F, 0xD8, 0xEF, 0x0D, 0x01, 0xE8, 0xF4, 0x0E, 0x83, 0x51, 0xFF, 0x7B, 0x2F, - 0x53, 0xCD, 0xB2, 0x4A, 0xB3, 0xCC, 0xD5, 0xCC, 0x3F, 0xEC, 0xF7, 0xBF, 0xF7, 0x12, 0xD5, 0x2C, - 0xA9, 0x34, 0x4B, 0xAA, 0xCD, 0x0A, 0xD4, 0xCB, 0x44, 0x00, 0xC3, 0xD7, 0xEB, 0x3B, 0x9C, 0x44, - 0xC9, 0xCC, 0x29, 0x02, 0x10, 0x0F, 0xE9, 0xC3, 0x47, 0x4A, 0x38, 0xEC, 0x70, 0x63, 0x67, 0x59, - 0x05, 0x46, 0x3F, 0x24, 0x85, 0x27, 0x24, 0x22, 0x36, 0xAF, 0x54, 0xCE, 0xDF, 0x65, 0x5E, 0xD5, - 0xC9, 0x97, 0x85, 0xBA, 0xE7, 0x24, 0x94, 0x7D, 0x4F, 0x78, 0xB8, 0x6F, 0xA2, 0xAA, 0x45, 0xF4, - 0xB7, 0xA8, 0xB6, 0xA4, 0xBF, 0xA5, 0x10, 0x76, 0xED, 0xCD, 0x1C, 0xE8, 0x79, 0x29, 0x8C, 0xE0, - 0x12, 0x40, 0x67, 0x19, 0x37, 0x38, 0xE4, 0x2A, 0xE6, 0x49, 0x7C, 0x82, 0xDB, 0x6D, 0x2F, 0x3D, - 0xF5, 0x1F, 0x1F, 0x23, 0xFA, 0x9F, 0xE5, 0xA9, 0x0F, 0x26, 0x20, 0xED, 0xEA, 0xD8, 0x9F, 0x3E, - 0x64, 0x3F, 0x67, 0x08, 0xC7, 0x5E, 0x2F, 0xF8, 0x3E, 0x05, 0x00, 0x46, 0xF5, 0xC5, 0x11, 0x00, - 0x70, 0x59, 0x5F, 0xBC, 0xA4, 0x1B, 0xFF, 0x6B, 0x90, 0x16, 0x02, 0x7C, 0xCA, 0x04, 0xF8, 0x88, - 0x09, 0xF0, 0x4B, 0x8B, 0xCF, 0xAA, 0x49, 0xC7, 0xFF, 0xF0, 0x93, 0x7E, 0x42, 0xC5, 0xB7, 0xC7, - 0x88, 0xFF, 0xB3, 0xA4, 0xFF, 0xD0, 0xA9, 0xD7, 0xAF, 0xD6, 0xB4, 0xB3, 0xB4, 0x63, 0xCD, 0x1F, - 0xFD, 0xD6, 0x4D, 0x29, 0xFB, 0x8C, 0xEC, 0x7A, 0x91, 0xA3, 0x5E, 0x44, 0xEB, 0x2D, 0xED, 0x7A, - 0x4B, 0x47, 0xBD, 0x25, 0xF8, 0x9B, 0xAF, 0xCA, 0x46, 0x81, 0x3A, 0x87, 0x99, 0x5C, 0xA9, 0x24, - 0x74, 0xF4, 0x45, 0x37, 0xE8, 0x11, 0x3D, 0x7A, 0x5C, 0x65, 0x54, 0x5E, 0x66, 0x9C, 0xF8, 0xDA, - 0xA3, 0x22, 0xC6, 0x09, 0x8F, 0x1D, 0x92, 0x9E, 0x24, 0x12, 0x64, 0x1A, 0x12, 0xD1, 0x07, 0x8C, - 0x42, 0x5A, 0xC9, 0x05, 0x25, 0xA5, 0x50, 0x18, 0x98, 0xE8, 0x24, 0xD3, 0x42, 0x36, 0x16, 0x2D, - 0xE5, 0xFD, 0x25, 0x3A, 0xAD, 0x03, 0x40, 0x18, 0x80, 0xB3, 0x74, 0x4C, 0xE4, 0xE3, 0x63, 0x2A, - 0xCE, 0xEF, 0x48, 0x41, 0x81, 0xCB, 0xDA, 0xFE, 0x23, 0xD5, 0xFF, 0x52, 0xF7, 0x8F, 0x15, 0xE6, - 0xB2, 0xFF, 0x65, 0x6D, 0xFF, 0x98, 0xF7, 0x1F, 0x8D, 0xB1, 0xEC, 0x3F, 0x2A, 0x38, 0xFB, 0x9A, - 0xAF, 0x67, 0x06, 0x03, 0xA4, 0x02, 0x3E, 0x4E, 0xA8, 0xEC, 0x99, 0x1B, 0x5F, 0x31, 0x17, 0xDA, - 0xE5, 0x75, 0xD7, 0x25, 0xB4, 0x6B, 0x79, 0xBD, 0x86, 0x5B, 0x4E, 0x0D, 0xC9, 0xBF, 0xF6, 0xA2, - 0x6F, 0x5D, 0x43, 0x64, 0x59, 0xE9, 0xEA, 0x26, 0x3F, 0xD3, 0xD3, 0x2B, 0x16, 0x37, 0x4F, 0xC9, - 0x68, 0x23, 0xCE, 0x69, 0x6D, 0x8D, 0xCB, 0xBC, 0xA2, 0x91, 0xB9, 0x2E, 0xE0, 0xD1, 0xF1, 0xC1, - 0xD7, 0xBE, 0xE3, 0xA6, 0x19, 0xFA, 0x80, 0x32, 0x3A, 0x47, 0xB1, 0xEB, 0x1D, 0x77, 0xC8, 0x9F, - 0x71, 0xB9, 0x07, 0x43, 0x12, 0x62, 0x6F, 0x38, 0x18, 0x1E, 0x71, 0x97, 0x87, 0xC3, 0xA3, 0x03, - 0x91, 0x3C, 0xEA, 0x90, 0x56, 0x5B, 0xD2, 0x1F, 0x03, 0xBF, 0xCF, 0x5D, 0x1E, 0x0E, 0x8E, 0x0F, - 0x45, 0xF2, 0x28, 0xFE, 0x16, 0x3C, 0x0F, 0xB1, 0x17, 0x1C, 0x8E, 0x06, 0x3C, 0x79, 0x54, 0x30, - 0x3C, 0xF2, 0x79, 0xF2, 0xA8, 0xC3, 0xE3, 0x63, 0x91, 0x3D, 0xEA, 0xB8, 0x7F, 0xD4, 0x07, 0xF0, - 0x53, 0x88, 0xBD, 0xD1, 0x70, 0x30, 0x02, 0xF0, 0x96, 0xFE, 0x3A, 0x3E, 0x0A, 0x00, 0x5C, 0x51, - 0x04, 0x0E, 0x0E, 0x7C, 0xAE, 0x2C, 0xBA, 0x0C, 0xF7, 0x03, 0xF1, 0xA2, 0x7C, 0xA7, 0x5E, 0x94, - 0xF3, 0xED, 0xED, 0xB9, 0x93, 0x1F, 0x70, 0x12, 0x65, 0xF7, 0x8E, 0xB7, 0xD7, 0xD8, 0xFD, 0xF6, - 0x6A, 0xD6, 0x57, 0xCD, 0x4B, 0xB9, 0x7A, 0xA8, 0xE4, 0xB3, 0x3D, 0x44, 0x5D, 0x5B, 0x34, 0x2D, - 0x41, 0xA3, 0xF7, 0xA5, 0x57, 0x08, 0xCD, 0xB7, 0x87, 0x68, 0xB7, 0x30, 0x40, 0x54, 0x72, 0x0A, - 0xE5, 0xF8, 0xBF, 0x5C, 0x99, 0x8B, 0x6A, 0xE0, 0x9A, 0xF5, 0x55, 0xF3, 0x12, 0xCC, 0x5F, 0x33, - 0x4C, 0xD0, 0x3B, 0x2A, 0xFF, 0xEE, 0x80, 0x70, 0xA5, 0x91, 0x0D, 0xA8, 0x9C, 0x79, 0x89, 0xC5, - 0xC8, 0xDA, 0x16, 0xFA, 0x35, 0x4E, 0x72, 0x12, 0x25, 0x04, 0x9B, 0x19, 0xF6, 0x84, 0xF5, 0xFC, - 0x85, 0xA3, 0x48, 0xE0, 0x64, 0x1B, 0xFA, 0x57, 0xFB, 0x5A, 0xF6, 0x6C, 0xE3, 0x0A, 0x0F, 0x81, - 0xA6, 0x0E, 0x7B, 0x2C, 0x60, 0x09, 0xAF, 0x99, 0x95, 0x0D, 0x33, 0x5C, 0x5D, 0x02, 0x97, 0xEF, - 0x66, 0x09, 0x8F, 0x86, 0xEE, 0xF8, 0x55, 0x9B, 0x8F, 0x8F, 0x32, 0xDB, 0x9E, 0xED, 0xE1, 0xB9, - 0x03, 0xAA, 0x3F, 0x38, 0x42, 0x31, 0x39, 0xD3, 0x0F, 0xC5, 0xE9, 0xED, 0xD7, 0xA2, 0x99, 0xF6, - 0x5E, 0x2B, 0x20, 0xBB, 0xE0, 0xA8, 0x5B, 0x55, 0x70, 0x11, 0x50, 0xCC, 0xE4, 0x6D, 0x4F, 0xC5, - 0x6E, 0xD6, 0x33, 0x1D, 0x62, 0x77, 0x40, 0xCF, 0x68, 0x56, 0xC1, 0xC6, 0xC0, 0xCF, 0x76, 0x2C, - 0x7D, 0x22, 0x92, 0x73, 0x86, 0xA4, 0xE5, 0xA5, 0xBB, 0x23, 0xA6, 0x66, 0x5B, 0x37, 0x72, 0x02, - 0xE0, 0x3A, 0xC1, 0xB3, 0x74, 0xFE, 0xD5, 0x18, 0x5F, 0xF7, 0x7E, 0xB1, 0x00, 0xED, 0x82, 0xAF, - 0xDD, 0xD2, 0x85, 0x96, 0x0A, 0x2F, 0xBC, 0xA4, 0xAC, 0x84, 0x58, 0xC8, 0x6E, 0x85, 0xDE, 0xBA, - 0x77, 0x6E, 0x35, 0xDD, 0x65, 0x36, 0xAD, 0x86, 0x4E, 0x44, 0xD4, 0x41, 0x94, 0xCF, 0x5E, 0xE3, - 0xE4, 0xE3, 0xEE, 0xE8, 0xAD, 0x7A, 0x6F, 0xAD, 0xA6, 0xBB, 0x30, 0x21, 0xAB, 0xA1, 0x13, 0x11, - 0x0D, 0x6D, 0xB5, 0x26, 0x3F, 0xB1, 0x08, 0x52, 0x2E, 0x3B, 0xA5, 0x4F, 0xBD, 0x0B, 0xA3, 0x82, - 0x2B, 0xD6, 0x85, 0x73, 0xF0, 0x95, 0xCD, 0x50, 0xD9, 0xBD, 0x2E, 0xCE, 0xE8, 0x44, 0xD4, 0x4D, - 0xA8, 0x4E, 0x82, 0x28, 0x7B, 0xC3, 0x78, 0x3E, 0x8C, 0x7B, 0x8B, 0x34, 0xFB, 0x1C, 0x65, 0x3C, - 0x28, 0x38, 0xF0, 0xAA, 0x83, 0x36, 0x4E, 0xD5, 0xCA, 0xC1, 0x5C, 0xE3, 0x5F, 0x63, 0x36, 0xDF, - 0xBA, 0x4F, 0xDB, 0x55, 0x5F, 0x9E, 0xB1, 0xA5, 0x13, 0x7B, 0xEB, 0x21, 0xD8, 0xA9, 0xF5, 0x8C, - 0x94, 0x90, 0xFC, 0x8F, 0x27, 0xC2, 0xE1, 0x32, 0x4F, 0x49, 0x82, 0x72, 0x4F, 0x82, 0xDD, 0xD0, - 0x8A, 0xAC, 0xF9, 0x21, 0xFD, 0x21, 0x25, 0x24, 0xBD, 0x33, 0xC2, 0xA1, 0xE7, 0x76, 0x41, 0x9D, - 0xE7, 0x52, 0x63, 0xC2, 0x40, 0x8E, 0xD5, 0x67, 0x2A, 0x3C, 0x88, 0x78, 0x68, 0x3C, 0xF0, 0x99, - 0xAE, 0x56, 0x07, 0x76, 0x4B, 0x7F, 0x28, 0x1E, 0x94, 0x9C, 0x0A, 0xD0, 0xA8, 0x05, 0xCB, 0xE1, - 0xD5, 0x7E, 0xD5, 0x85, 0x56, 0x2B, 0x54, 0xEB, 0x85, 0x55, 0x5E, 0x70, 0x11, 0xDF, 0x94, 0x02, - 0x7E, 0xB0, 0x05, 0x1E, 0x61, 0xF8, 0xC1, 0xF4, 0xEB, 0x38, 0x4D, 0x9C, 0x01, 0x28, 0xAC, 0x04, - 0x18, 0x79, 0xBA, 0xCE, 0x66, 0x68, 0xEC, 0x17, 0xAE, 0x5D, 0xDC, 0xBB, 0x8B, 0xB2, 0x8F, 0x2C, - 0x5A, 0xC4, 0x0B, 0xCC, 0xEE, 0x05, 0xF5, 0xD0, 0xE4, 0xB2, 0xAC, 0x9C, 0xE1, 0x24, 0xAC, 0x4A, - 0x7C, 0xE5, 0x58, 0xB2, 0xC0, 0x8D, 0x7B, 0xE2, 0x9F, 0x6F, 0xB0, 0x26, 0xD9, 0x39, 0xB8, 0xE4, - 0x6D, 0xEF, 0x57, 0x5D, 0xEE, 0x79, 0xC2, 0xE0, 0xC0, 0x81, 0x2D, 0x53, 0x1F, 0x8B, 0x14, 0xE7, - 0x5B, 0x73, 0x0E, 0x93, 0xE4, 0x2D, 0xE9, 0xD9, 0x25, 0x9A, 0xBB, 0xC0, 0xE6, 0xCE, 0xBC, 0x90, - 0xEE, 0x84, 0xD8, 0xC6, 0x26, 0xA8, 0xE4, 0xC4, 0x2E, 0xC7, 0x2A, 0x34, 0xEA, 0xCA, 0xF8, 0xFB, - 0xD2, 0x25, 0x50, 0x51, 0x40, 0xC9, 0x60, 0x4D, 0x7E, 0x7F, 0xBE, 0xC2, 0x2A, 0xE0, 0x9D, 0xF1, - 0x6D, 0x6B, 0xD1, 0x5F, 0x51, 0x13, 0xBB, 0x40, 0x70, 0x3A, 0xA3, 0x03, 0x22, 0x13, 0x9D, 0xAD, - 0xBF, 0x02, 0xBD, 0x92, 0x9A, 0x9F, 0x9B, 0x0B, 0xF5, 0x24, 0x2D, 0x9A, 0x0B, 0x6E, 0x34, 0xE3, - 0x7D, 0x48, 0x4F, 0xC7, 0x8A, 0x9F, 0x63, 0x35, 0x06, 0x0B, 0xAB, 0x9A, 0xA5, 0x9F, 0x37, 0x54, - 0xA5, 0x35, 0x58, 0x55, 0x91, 0x66, 0xB4, 0xB9, 0xB6, 0xA8, 0xC4, 0x67, 0x97, 0x33, 0xB4, 0x52, - 0x83, 0x32, 0x9B, 0xE3, 0x7F, 0x32, 0xCB, 0x56, 0xD9, 0x00, 0x71, 0x0B, 0x23, 0xA1, 0x12, 0xDA, - 0xC3, 0xC9, 0x9E, 0x30, 0xE5, 0x77, 0xB7, 0xBD, 0x22, 0xD3, 0x10, 0x5D, 0x91, 0x69, 0xC1, 0x48, - 0xD0, 0x34, 0x44, 0x35, 0x69, 0x52, 0x17, 0xF2, 0x7A, 0x97, 0xF7, 0xC9, 0xCC, 0xAC, 0xAB, 0x0F, - 0xFD, 0x5E, 0x9C, 0xDE, 0xBE, 0x46, 0x9F, 0x50, 0x7C, 0x12, 0x66, 0xF4, 0x42, 0xC0, 0x7E, 0xBF, - 0x4C, 0xD6, 0x77, 0xBD, 0x5F, 0x9F, 0xBF, 0x7F, 0xD3, 0x6E, 0xEF, 0x5F, 0xAA, 0x80, 0xA7, 0x46, - 0xA3, 0xCF, 0x51, 0x96, 0x78, 0x2D, 0x05, 0x7A, 0x0F, 0xE7, 0x7B, 0xEB, 0x24, 0x43, 0x31, 0xA6, - 0xD4, 0xBC, 0x17, 0x25, 0xF3, 0xBD, 0xCF, 0x38, 0x8E, 0xF7, 0x6E, 0xD0, 0x1E, 0x0F, 0x02, 0x39, - 0xDF, 0xCB, 0xD3, 0x34, 0xE9, 0xB5, 0x00, 0xBC, 0x0C, 0x75, 0x94, 0xC4, 0x0A, 0xC6, 0x0A, 0xCD, - 0x22, 0x63, 0x67, 0xAF, 0x30, 0x40, 0xC8, 0xDF, 0x44, 0x6F, 0x58, 0x38, 0x46, 0xFE, 0x8B, 0x80, - 0xC7, 0x47, 0xCF, 0xCA, 0x20, 0x15, 0xF5, 0x7E, 0xBE, 0x78, 0x73, 0xF1, 0xF3, 0x2F, 0x3F, 0x5F, - 0x9F, 0xBF, 0x7D, 0x7D, 0xA9, 0x53, 0xF6, 0xB0, 0x4C, 0x3D, 0xBA, 0xF0, 0xFD, 0xDB, 0x5F, 0x2F, - 0x9D, 0x57, 0xBD, 0x9E, 0xD1, 0x1D, 0x28, 0x38, 0xC3, 0xA1, 0x7F, 0x84, 0xFB, 0x81, 0x9C, 0x31, - 0xBB, 0xBE, 0xAE, 0x22, 0xAB, 0xAB, 0xCC, 0x57, 0x3A, 0x38, 0xA6, 0xAB, 0x89, 0x59, 0x4D, 0xB4, - 0x7C, 0x17, 0xDD, 0xA2, 0x5C, 0x1B, 0x08, 0xBB, 0x5A, 0xC9, 0x2A, 0x85, 0x64, 0x98, 0x1F, 0x98, - 0xDD, 0x69, 0x7D, 0x03, 0x51, 0xA3, 0x28, 0x1F, 0xF2, 0x8D, 0x4D, 0x64, 0x25, 0xD5, 0x4A, 0x44, - 0x67, 0x6A, 0x6C, 0x24, 0xEA, 0x14, 0x92, 0x41, 0xBC, 0xCC, 0x67, 0x52, 0x32, 0x35, 0x2D, 0x57, - 0x1C, 0x8C, 0xB7, 0xA6, 0x85, 0x82, 0xF4, 0x62, 0x96, 0xEF, 0x08, 0xA9, 0xD4, 0x42, 0x41, 0x3A, - 0xCF, 0xF1, 0x8E, 0x90, 0x4A, 0x2D, 0x14, 0xA4, 0xB7, 0x3B, 0x8F, 0xAE, 0xD4, 0x82, 0xF9, 0x5E, - 0xAF, 0xD5, 0xE2, 0x35, 0x84, 0xE1, 0xD2, 0x8C, 0x5C, 0xC6, 0x63, 0xE1, 0xB9, 0x8D, 0x0C, 0xA9, - 0xC7, 0x2B, 0x25, 0x09, 0x2E, 0x63, 0xC0, 0x8A, 0xEA, 0xE8, 0xDD, 0x28, 0xB3, 0x2F, 0x0A, 0x76, - 0xA1, 0x29, 0xFF, 0x55, 0x0A, 0x4C, 0xF1, 0x5F, 0x96, 0x16, 0x1B, 0xA5, 0x33, 0x71, 0x2A, 0xC8, - 0x74, 0x0A, 0x8E, 0x61, 0x8D, 0xBD, 0xF2, 0x91, 0x51, 0x73, 0x06, 0xB2, 0x23, 0x63, 0xF3, 0x19, - 0x08, 0x0A, 0x57, 0x2F, 0x46, 0xB6, 0x2A, 0x13, 0xBC, 0x0E, 0xB2, 0xA2, 0x62, 0x6F, 0xF0, 0xB5, - 0x52, 0x77, 0x10, 0x6F, 0xD1, 0xE3, 0x3E, 0x4F, 0x06, 0x38, 0x11, 0xD8, 0xEC, 0x92, 0x44, 0x04, - 0xF5, 0x6E, 0x70, 0x32, 0x67, 0x43, 0x70, 0xAA, 0x70, 0x00, 0x80, 0x26, 0x5C, 0x07, 0xCD, 0x3D, - 0xB0, 0x10, 0xD5, 0xE3, 0xD6, 0x4F, 0xAD, 0x82, 0xC7, 0x02, 0xF0, 0x58, 0xC8, 0xB1, 0xC6, 0x4E, - 0x9D, 0x97, 0x1A, 0x00, 0xF7, 0x03, 0x60, 0x88, 0x4C, 0xC6, 0xCC, 0x3C, 0x88, 0x69, 0x1B, 0x33, - 0xC9, 0xC3, 0x3C, 0x82, 0xD2, 0x05, 0x3D, 0x82, 0xF4, 0xB4, 0x16, 0xF4, 0x7F, 0x25, 0x7D, 0xF5, - 0x5D, 0x01, 0x8F, 0x86, 0x07, 0xFE, 0xD7, 0x18, 0x72, 0x9A, 0x72, 0x55, 0x48, 0x2C, 0x91, 0x42, - 0x9B, 0x77, 0x5A, 0x5F, 0x99, 0xEA, 0xD9, 0xD2, 0x31, 0xAB, 0xF3, 0x4C, 0xC6, 0x16, 0x0E, 0xAF, - 0x64, 0x7C, 0x37, 0x81, 0x3E, 0xCB, 0x7D, 0x4D, 0x0F, 0x68, 0x2E, 0x95, 0x94, 0xB6, 0x2C, 0xFB, - 0xA8, 0xA4, 0x1E, 0xF6, 0x57, 0x88, 0xC2, 0x53, 0xAF, 0x04, 0x55, 0x26, 0x36, 0x86, 0xF6, 0xA4, - 0x69, 0xFA, 0x91, 0x9D, 0x01, 0xDB, 0x30, 0xBD, 0x0C, 0xC6, 0x30, 0x53, 0xD7, 0x2E, 0x15, 0xB2, - 0x94, 0x9E, 0xEC, 0xDA, 0x75, 0xC7, 0xC8, 0x4F, 0x62, 0x00, 0x10, 0xEE, 0x02, 0x04, 0x06, 0xA0, - 0xD0, 0x49, 0xD8, 0xB9, 0x30, 0xC4, 0x25, 0x27, 0x33, 0x40, 0xE4, 0x95, 0x36, 0x94, 0x37, 0xDD, - 0x08, 0x2B, 0xF8, 0x20, 0xE6, 0x8A, 0xAA, 0x29, 0xD2, 0xC0, 0x09, 0x4D, 0xC1, 0xC4, 0xB6, 0x1A, - 0x56, 0xC6, 0xF6, 0x39, 0x6D, 0x75, 0x95, 0x4F, 0x7B, 0xB3, 0x28, 0x8E, 0x85, 0x55, 0x06, 0x64, - 0x3C, 0x4E, 0x51, 0x4E, 0x79, 0x75, 0xB4, 0x28, 0x51, 0x42, 0x41, 0xA7, 0x23, 0xD0, 0xCB, 0xE6, - 0x17, 0x45, 0x99, 0x4A, 0x9C, 0x91, 0xA8, 0x44, 0xEA, 0x77, 0x69, 0x68, 0x0E, 0x40, 0x51, 0xC0, - 0xD1, 0x70, 0x30, 0xFA, 0x77, 0xF8, 0xB0, 0x7F, 0x91, 0xF0, 0x61, 0x17, 0x96, 0xBE, 0xAC, 0x27, - 0xF8, 0xA3, 0x38, 0x48, 0xDF, 0xA3, 0x55, 0x9A, 0x91, 0x0F, 0xF7, 0x2B, 0x54, 0x8D, 0x21, 0xD6, - 0x1F, 0x1D, 0x0D, 0xC5, 0x83, 0x5A, 0x10, 0x88, 0x07, 0xB5, 0xBE, 0x1F, 0x8C, 0x4A, 0x31, 0xC4, - 0x86, 0x47, 0x7D, 0xF9, 0x9E, 0x36, 0x38, 0xE4, 0xEF, 0x69, 0xFC, 0x65, 0xED, 0x3A, 0xC4, 0xDE, - 0xC1, 0x70, 0xC0, 0x9F, 0xD3, 0x46, 0x41, 0xC0, 0x5F, 0xD3, 0x06, 0x87, 0x83, 0x21, 0x7F, 0x4D, - 0xE3, 0x4F, 0x77, 0xB7, 0xB4, 0x56, 0x7F, 0xD8, 0xE7, 0xAF, 0x69, 0x07, 0x83, 0x51, 0x40, 0xA5, - 0x60, 0xEC, 0x8D, 0x8E, 0x87, 0x01, 0x80, 0x77, 0xE1, 0x43, 0xCB, 0x6B, 0x8D, 0x7D, 0xD8, 0x02, - 0xAD, 0x71, 0x00, 0x5B, 0xDF, 0xB7, 0xC6, 0x7D, 0xD8, 0xEA, 0xB4, 0xC6, 0x03, 0xD8, 0xEA, 0xB2, - 0x2F, 0xBD, 0xD6, 0xB8, 0x5F, 0xC0, 0xF3, 0x30, 0x18, 0x04, 0xFE, 0x61, 0x5F, 0xDB, 0x65, 0xDF, - 0x28, 0xF3, 0x5C, 0x74, 0xDA, 0x1F, 0x2A, 0xD3, 0xF6, 0x5E, 0x8E, 0xC8, 0xAF, 0x98, 0x9D, 0x55, - 0xF9, 0xE3, 0xE3, 0x7E, 0x30, 0x29, 0xF9, 0x56, 0x07, 0x63, 0x99, 0x4D, 0x96, 0xF4, 0x84, 0x77, - 0xEE, 0xAF, 0x38, 0x11, 0xBE, 0xCE, 0x46, 0x19, 0x8B, 0x7F, 0x83, 0xFF, 0x4B, 0x17, 0x0E, 0x8C, - 0x42, 0xDE, 0xC7, 0x3B, 0x71, 0x49, 0x9B, 0x58, 0x86, 0x80, 0xBA, 0xFC, 0x12, 0xFF, 0x17, 0x7A, - 0x87, 0xBF, 0xA0, 0x38, 0xB7, 0x2D, 0xF3, 0x58, 0xD7, 0x11, 0xCE, 0x35, 0xEC, 0x03, 0xA3, 0x24, - 0x4E, 0x3F, 0xA3, 0x4C, 0x95, 0x1C, 0x5A, 0xE8, 0xB2, 0x38, 0xEB, 0xAA, 0xEC, 0xC8, 0xD9, 0x23, - 0x53, 0x04, 0xDB, 0x26, 0x71, 0x6C, 0x3C, 0xD1, 0x17, 0x7B, 0x3C, 0x81, 0x6F, 0x94, 0x2E, 0xD6, - 0x71, 0xCC, 0x93, 0xED, 0xE9, 0x72, 0x73, 0xA6, 0x6E, 0x39, 0x78, 0x7A, 0xD0, 0x8A, 0xD2, 0x41, - 0xA5, 0xD4, 0x9E, 0x8E, 0x60, 0x58, 0x6D, 0x5E, 0x9A, 0x8F, 0x60, 0x64, 0x57, 0xB9, 0x64, 0x08, - 0x54, 0x6A, 0x1D, 0xD8, 0xB5, 0x58, 0x42, 0x8F, 0x72, 0x9D, 0x23, 0x67, 0x67, 0xC6, 0x54, 0x04, - 0xC7, 0x75, 0x7D, 0x19, 0x95, 0xFA, 0xBE, 0x5D, 0xE9, 0x62, 0x96, 0x26, 0x1F, 0x30, 0x89, 0xC5, - 0x98, 0xFB, 0xD5, 0x19, 0x31, 0x4B, 0x4D, 0xEA, 0xA1, 0x87, 0x89, 0x59, 0x66, 0xCE, 0xD6, 0x2A, - 0x5D, 0x99, 0x45, 0x55, 0xBA, 0x61, 0xB4, 0x2B, 0xEC, 0x0C, 0xF6, 0x83, 0x82, 0xF2, 0xB3, 0xFB, - 0xC9, 0xBE, 0x65, 0xF0, 0x7F, 0x85, 0x7A, 0x3F, 0xBE, 0xFC, 0x70, 0xFD, 0xEB, 0xC5, 0x9B, 0xEB, - 0xCB, 0x8B, 0xFF, 0xFD, 0xF2, 0xFA, 0xDD, 0xC5, 0x9F, 0x5F, 0xBE, 0xBE, 0x0C, 0xFD, 0x69, 0xD8, - 0x72, 0x7C, 0x6F, 0x41, 0xD9, 0xE0, 0xFC, 0xE5, 0xEB, 0xD7, 0x56, 0x8B, 0x40, 0xB4, 0x28, 0x17, - 0xB4, 0x0A, 0xEF, 0xBE, 0x81, 0x99, 0x30, 0x83, 0x81, 0x5A, 0x4E, 0xF3, 0x50, 0x88, 0xE0, 0x67, - 0x9F, 0x43, 0x5F, 0x3C, 0x98, 0xBF, 0xDC, 0x22, 0x00, 0x1A, 0xE7, 0xE4, 0x30, 0x83, 0x4B, 0x78, - 0x0D, 0x17, 0xF0, 0x53, 0x28, 0xA2, 0x99, 0xE5, 0xB3, 0x68, 0x85, 0x64, 0x0E, 0x17, 0xA6, 0x53, - 0xCA, 0xCA, 0x6F, 0xEB, 0xF6, 0xCB, 0xA5, 0xFB, 0x05, 0x20, 0xD4, 0xB1, 0xCD, 0xF4, 0xFB, 0x1C, - 0xAE, 0x3E, 0x28, 0xE6, 0xEE, 0xF8, 0x6B, 0x99, 0xFB, 0xF5, 0x64, 0x69, 0x00, 0xB5, 0x1E, 0xD5, - 0xAE, 0x65, 0x10, 0x0A, 0xFB, 0xE5, 0x6A, 0x21, 0x3E, 0x33, 0xBD, 0x5B, 0x16, 0x7E, 0x32, 0xFF, - 0x14, 0xDA, 0x3C, 0x3A, 0xEC, 0x5F, 0x70, 0x42, 0x06, 0x7D, 0xEE, 0x96, 0x33, 0xF4, 0x8F, 0x0F, - 0xB4, 0xFF, 0x59, 0x86, 0x93, 0xDB, 0x17, 0x88, 0x82, 0xE4, 0x35, 0x67, 0x3D, 0xEE, 0x90, 0xF2, - 0x21, 0xFD, 0x85, 0x2C, 0x06, 0x32, 0xEB, 0xDE, 0x9A, 0x2C, 0x8E, 0xEC, 0x5A, 0xBF, 0x90, 0xC5, - 0x91, 0x5D, 0x47, 0x46, 0x81, 0x67, 0x15, 0xD6, 0x3D, 0xFA, 0xD3, 0x50, 0xDB, 0x73, 0x61, 0x99, - 0x51, 0x6A, 0xD8, 0x92, 0x09, 0x35, 0xF1, 0x2C, 0x4D, 0xDE, 0x44, 0x77, 0xC6, 0x17, 0xA3, 0xDA, - 0x25, 0x89, 0x66, 0x1F, 0xB5, 0x04, 0x2A, 0xEB, 0x96, 0x3E, 0xCF, 0xD6, 0xD9, 0x73, 0x42, 0x58, - 0x56, 0x9C, 0x30, 0xD6, 0xF1, 0x3D, 0x3E, 0x7C, 0x78, 0x7F, 0xFD, 0xE2, 0xF9, 0x87, 0xE7, 0xDC, - 0xA3, 0x49, 0x2D, 0x2C, 0xCA, 0xA2, 0x1C, 0xC9, 0xFA, 0x2C, 0xBF, 0x26, 0x15, 0xBF, 0x37, 0xB7, - 0x53, 0x0F, 0x00, 0x3F, 0x20, 0xE7, 0xF3, 0xFD, 0xBC, 0xCE, 0xEA, 0xA0, 0xD4, 0xC8, 0x06, 0x54, - 0xB1, 0x69, 0x60, 0x25, 0xEF, 0x39, 0x5F, 0x7E, 0x9F, 0x7E, 0x76, 0x85, 0xE3, 0x6B, 0xEE, 0xA9, - 0xD2, 0xD6, 0x09, 0xB6, 0xAE, 0xDF, 0x1C, 0x91, 0x27, 0xF4, 0xA8, 0x5A, 0x95, 0x40, 0xB9, 0x7B, - 0xB9, 0x44, 0xC9, 0xFC, 0x55, 0x3A, 0x5B, 0xEF, 0x3E, 0xB6, 0x52, 0x4B, 0x07, 0xC8, 0x9A, 0x1E, - 0xEF, 0x93, 0x19, 0x57, 0x75, 0xFE, 0x10, 0xB9, 0x74, 0xDB, 0x1B, 0x7A, 0xAD, 0xB6, 0xAE, 0x01, - 0xED, 0xEE, 0xDD, 0xC5, 0xD5, 0x76, 0x46, 0xA2, 0x1E, 0x48, 0x73, 0x47, 0x25, 0x94, 0x9E, 0x07, - 0xC1, 0x3D, 0x3D, 0x9F, 0xB6, 0xEF, 0xDF, 0x6E, 0x61, 0x80, 0x70, 0x40, 0xFE, 0x10, 0xDD, 0xEC, - 0x06, 0x58, 0x35, 0xD0, 0x00, 0x4A, 0x60, 0x79, 0x76, 0x98, 0x9F, 0xD3, 0x4F, 0x2E, 0x33, 0x96, - 0x1A, 0xC8, 0xE5, 0x36, 0x16, 0x98, 0xED, 0xED, 0x93, 0x6A, 0xA0, 0x6F, 0x6B, 0x9F, 0x54, 0x6B, - 0xE8, 0x53, 0x03, 0xD7, 0xAC, 0x5F, 0xD2, 0xFD, 0x2B, 0x98, 0x8C, 0x2B, 0x72, 0xBD, 0xCF, 0xF6, - 0x80, 0x2B, 0x8D, 0x6C, 0x40, 0xE5, 0x09, 0xE7, 0x9E, 0x8F, 0x5B, 0xCF, 0xB5, 0xAE, 0x2E, 0x1B, - 0x5B, 0x00, 0xD9, 0x31, 0xC4, 0x19, 0xF6, 0xC3, 0x2A, 0x5A, 0xE7, 0x68, 0x3E, 0xDE, 0x0F, 0x44, - 0xC0, 0x19, 0xE6, 0x2A, 0xFD, 0xE7, 0xB1, 0x6F, 0xFE, 0xF9, 0x97, 0xB1, 0x0F, 0xE7, 0xEC, 0x98, - 0x99, 0x73, 0x97, 0xD7, 0xB1, 0x0F, 0xD5, 0x3B, 0x9A, 0x2F, 0x43, 0x5A, 0xE6, 0x2B, 0x34, 0xC3, - 0x51, 0x2C, 0xA2, 0xE0, 0x5C, 0xF5, 0x47, 0x07, 0xB0, 0x3F, 0x3A, 0x84, 0xFD, 0xD1, 0xD1, 0xD4, - 0xF9, 0x72, 0xC7, 0xCF, 0x46, 0x7D, 0x25, 0xCE, 0xC8, 0xFD, 0xFB, 0xF4, 0xF3, 0x87, 0x2C, 0x9A, - 0x7D, 0x14, 0xC7, 0xD9, 0x6B, 0xB7, 0xB6, 0x87, 0x7F, 0x34, 0x33, 0x54, 0x35, 0x25, 0x08, 0x72, - 0x75, 0xED, 0x7C, 0xE1, 0xE8, 0xA5, 0x49, 0x29, 0x9F, 0x96, 0x7E, 0x8B, 0xB5, 0x3A, 0xB3, 0xB3, - 0x63, 0x69, 0xC5, 0x13, 0x1F, 0x10, 0x15, 0xEF, 0xB4, 0x96, 0xEB, 0x55, 0x14, 0xC7, 0x37, 0xD1, - 0xEC, 0xA3, 0x7A, 0x9C, 0xAB, 0xBE, 0x4D, 0xCC, 0xD1, 0xCD, 0xFA, 0xD6, 0x6B, 0xFD, 0x92, 0x7C, - 0x4C, 0xD2, 0xCF, 0xC9, 0xDE, 0xF9, 0xE5, 0xC5, 0x1E, 0x9D, 0xEA, 0xF1, 0x5E, 0x0B, 0x3E, 0xE0, - 0x39, 0x4A, 0x08, 0x5E, 0x60, 0x24, 0x03, 0x01, 0x89, 0x3E, 0xD8, 0x77, 0x9D, 0xBC, 0x08, 0x40, - 0x76, 0x0D, 0xCD, 0xC7, 0xA4, 0x47, 0x52, 0x2E, 0x4E, 0x80, 0x02, 0x14, 0x0E, 0xCC, 0xB4, 0x1E, - 0x5A, 0x63, 0x86, 0xB6, 0xC0, 0xEA, 0xE5, 0xE5, 0xF9, 0xEE, 0x58, 0xD5, 0xA0, 0xF0, 0x05, 0xCD, - 0xD6, 0x04, 0x3D, 0x0D, 0x8D, 0x3F, 0xBF, 0x3C, 0xFF, 0xE5, 0xC3, 0x4B, 0x8D, 0x0A, 0xFB, 0x81, - 0xDC, 0x1D, 0xBD, 0x75, 0x8C, 0x55, 0x1B, 0xB3, 0x6E, 0xEA, 0xEA, 0x6D, 0xCD, 0x88, 0x11, 0x8C, - 0x66, 0xFC, 0x01, 0x19, 0xCE, 0x23, 0x12, 0x8D, 0xB1, 0xBB, 0x73, 0xAD, 0xA6, 0x77, 0x75, 0xDE, - 0xFA, 0xE9, 0xED, 0xDB, 0x3F, 0xB5, 0xC2, 0x30, 0x24, 0xED, 0xB6, 0x87, 0x43, 0xAC, 0x97, 0xAD, - 0x6A, 0xFB, 0x56, 0x46, 0xEC, 0xC5, 0xF9, 0xE5, 0x13, 0x08, 0x44, 0x21, 0xBD, 0x8A, 0xEE, 0xE3, - 0x34, 0x9A, 0xD7, 0xE1, 0xFD, 0x2E, 0xC3, 0x89, 0x32, 0xBB, 0xD1, 0x18, 0xB3, 0x6A, 0x2B, 0x5A, - 0x26, 0x93, 0xE8, 0x95, 0x9A, 0x36, 0x28, 0x78, 0xFF, 0x7F, 0xAD, 0x42, 0x9B, 0x35, 0x60, 0x16, - 0x79, 0x82, 0x27, 0xD9, 0x40, 0x5B, 0x41, 0xC1, 0x54, 0x1E, 0x14, 0xB9, 0x9B, 0xF3, 0x71, 0x6B, - 0xAF, 0x05, 0x5D, 0x70, 0xC5, 0xCB, 0x13, 0x5A, 0x90, 0x2D, 0xC1, 0x0A, 0x20, 0xCF, 0x4D, 0x20, - 0x9C, 0xE7, 0xB1, 0x8C, 0x9F, 0x5F, 0x85, 0xD9, 0xF3, 0x2A, 0x66, 0xEF, 0xF1, 0xED, 0x72, 0x47, - 0xD4, 0x7E, 0xA8, 0xA2, 0xF6, 0x22, 0xFD, 0x9C, 0xEC, 0x06, 0xE4, 0xBC, 0x0A, 0xE4, 0x15, 0xD7, - 0x36, 0xEE, 0x06, 0xE7, 0x45, 0x15, 0xCE, 0x0F, 0xD1, 0xEC, 0xE3, 0xEE, 0x80, 0x5E, 0x56, 0x01, - 0xBD, 0x41, 0x5F, 0x88, 0x78, 0x62, 0xDB, 0x01, 0xD0, 0xAB, 0x2A, 0xA0, 0x77, 0x19, 0x9A, 0xA1, - 0x39, 0x4E, 0x6E, 0x77, 0x87, 0xF6, 0x63, 0x15, 0x1A, 0x25, 0xD2, 0xE7, 0x37, 0x79, 0x1A, 0xAF, - 0xC9, 0x8E, 0xC0, 0x7E, 0x72, 0xA0, 0x26, 0xCE, 0xCB, 0xDD, 0x00, 0x5D, 0xD4, 0xAE, 0xDE, 0x87, - 0xE8, 0x66, 0x37, 0x50, 0xFF, 0x7F, 0x13, 0x14, 0xBB, 0x70, 0x5D, 0x24, 0xF4, 0x8E, 0x1E, 0x47, - 0xF7, 0x3C, 0xCF, 0xDF, 0x36, 0xB0, 0x56, 0x19, 0x5A, 0xE0, 0x2F, 0xE3, 0xD6, 0x99, 0x22, 0xF5, - 0x0D, 0x60, 0xFD, 0x5D, 0x50, 0xFC, 0x93, 0x03, 0x16, 0x5F, 0xC9, 0xA7, 0xE3, 0xD7, 0x04, 0x73, - 0x27, 0xE4, 0x5E, 0x57, 0xB9, 0x98, 0x78, 0xE7, 0xDE, 0x05, 0xCA, 0xCF, 0x26, 0x94, 0x39, 0x0B, - 0x3E, 0xF4, 0x04, 0x28, 0xEF, 0xAA, 0x50, 0x76, 0xE1, 0xA8, 0x02, 0xCA, 0x65, 0x95, 0x4B, 0x6D, - 0xCD, 0xFA, 0x04, 0x88, 0x0F, 0x55, 0x10, 0xBB, 0xB3, 0xA8, 0x3F, 0x57, 0x96, 0xE8, 0x09, 0x83, - 0xF9, 0xDF, 0xF5, 0xFC, 0x69, 0xE7, 0xAD, 0xF2, 0xBB, 0x05, 0x6B, 0x19, 0xD1, 0xCD, 0xFB, 0x34, - 0x46, 0x10, 0x99, 0x90, 0x96, 0x92, 0x07, 0xBC, 0x17, 0x9E, 0x47, 0xBB, 0xC1, 0xBA, 0x31, 0x61, - 0x71, 0x67, 0x6B, 0xC5, 0xEF, 0x54, 0x66, 0x9A, 0xDD, 0x40, 0xCE, 0xAC, 0xE5, 0x43, 0xC9, 0xFC, - 0x05, 0xA2, 0x12, 0xC7, 0x73, 0x42, 0x32, 0x7C, 0xB3, 0x26, 0x28, 0x7F, 0x97, 0xE1, 0xBB, 0x28, - 0xBB, 0xDF, 0x12, 0xAA, 0xDC, 0x7D, 0xA7, 0x6A, 0xF7, 0x6D, 0xEC, 0xE0, 0x12, 0xCD, 0xD2, 0x64, - 0xBE, 0x7D, 0x17, 0x02, 0xEE, 0xDC, 0x84, 0x1B, 0xE3, 0x04, 0x3D, 0x79, 0x85, 0x90, 0x09, 0xE9, - 0xD3, 0xD7, 0xAD, 0xD0, 0xC2, 0x5A, 0xED, 0xFF, 0x7C, 0x1A, 0xCB, 0xBF, 0x35, 0x81, 0x90, 0xE8, - 0xE6, 0x9C, 0x05, 0xBB, 0xDD, 0x09, 0xC4, 0xD2, 0x9E, 0x75, 0xC2, 0x2C, 0x01, 0x76, 0x5B, 0x42, - 0xCD, 0x40, 0x5D, 0xC0, 0x44, 0xA6, 0xEC, 0xDD, 0xB0, 0x8A, 0x6D, 0xFA, 0xFD, 0x5A, 0xBC, 0xDC, - 0xE0, 0x9E, 0x84, 0xD9, 0x5D, 0x79, 0xBF, 0x6B, 0xFA, 0xDC, 0x0D, 0x50, 0x62, 0xF3, 0x65, 0x4A, - 0xEA, 0x97, 0x24, 0x22, 0xEB, 0x6D, 0xC1, 0x54, 0x47, 0x59, 0x0B, 0x71, 0xB7, 0x81, 0x96, 0x24, - 0xD5, 0x7D, 0x05, 0x7F, 0x65, 0xAD, 0x6E, 0xBA, 0xE0, 0x3A, 0xC2, 0xAF, 0x95, 0x7F, 0xFF, 0x5A, - 0xA2, 0x99, 0x73, 0xA1, 0x4B, 0xB8, 0x8F, 0x77, 0x5C, 0x99, 0xAC, 0x04, 0x88, 0x2B, 0x60, 0xDE, - 0xA3, 0xDB, 0x9D, 0xB7, 0x55, 0x6E, 0x41, 0x8A, 0x3E, 0x21, 0x99, 0xE2, 0x78, 0x17, 0x20, 0xC4, - 0x04, 0xC2, 0x75, 0xE2, 0x6F, 0x95, 0x85, 0xE3, 0x0E, 0x70, 0xD6, 0x25, 0xDA, 0x65, 0xD1, 0x83, - 0x77, 0xC1, 0xA7, 0x34, 0xF3, 0x7F, 0x54, 0x33, 0x5F, 0x38, 0xEE, 0x5A, 0x69, 0xBC, 0xBE, 0xDB, - 0x1A, 0xC3, 0x5A, 0xC8, 0xFF, 0xED, 0x90, 0x39, 0xBE, 0x02, 0xF2, 0x1F, 0x5B, 0x7F, 0xAC, 0xA1, - 0x96, 0x18, 0xCD, 0xC8, 0xBB, 0x2C, 0x25, 0x68, 0x46, 0xD0, 0xB6, 0x77, 0x8B, 0x12, 0xD6, 0xDF, - 0xB9, 0xE9, 0x3B, 0xE3, 0x2A, 0x59, 0xCE, 0x76, 0xB6, 0x15, 0xFF, 0x8C, 0x3D, 0xF9, 0xA4, 0x5E, - 0xAA, 0x82, 0x6B, 0x45, 0x07, 0xE2, 0x25, 0xBD, 0x73, 0xBF, 0xF7, 0xC3, 0xCB, 0xD7, 0x46, 0x4E, - 0x94, 0x1B, 0x14, 0xC7, 0xDE, 0xB6, 0x4D, 0x5F, 0xBF, 0x32, 0x5A, 0xC6, 0xD2, 0x80, 0x6B, 0xDB, - 0xD6, 0xFF, 0xF9, 0xE1, 0x6B, 0x5A, 0xBF, 0xFA, 0xAA, 0xBE, 0xCF, 0xDF, 0x1B, 0xAD, 0x67, 0x51, - 0x96, 0xE1, 0xE8, 0x16, 0xBD, 0xE7, 0xDE, 0xF0, 0x5B, 0x4F, 0xDC, 0xA5, 0x39, 0x6F, 0xD1, 0xEC, - 0x63, 0xBE, 0x8A, 0x66, 0x68, 0xEB, 0xE6, 0x3F, 0x99, 0xC3, 0x27, 0xD1, 0xCD, 0xD6, 0x0D, 0x2F, - 0xDF, 0x1A, 0x0D, 0x59, 0xC0, 0xC5, 0xB7, 0xDC, 0x19, 0x64, 0xBB, 0xD6, 0x17, 0xE5, 0xD6, 0x17, - 0xDB, 0x0E, 0x39, 0xE8, 0x5D, 0xBC, 0x79, 0x61, 0xB4, 0x66, 0xE1, 0x1C, 0xB7, 0x6E, 0xFB, 0xC6, - 0xA2, 0xB3, 0x44, 0xDE, 0xBD, 0xB7, 0x6D, 0xFE, 0xD3, 0x87, 0x4B, 0x7B, 0xBE, 0x2E, 0x91, 0x63, - 0xD0, 0x0E, 0xCB, 0x50, 0x1F, 0x72, 0x97, 0x05, 0xE3, 0x93, 0xA7, 0xCC, 0xD0, 0x72, 0x44, 0x98, - 0xFA, 0x5B, 0x45, 0xDB, 0xCF, 0xF9, 0xC3, 0xFC, 0x9B, 0xE8, 0x8E, 0x7D, 0x63, 0x9B, 0x75, 0x73, - 0x1F, 0x81, 0xBB, 0x0F, 0x07, 0xC4, 0x6D, 0xA0, 0xF5, 0x9B, 0xA1, 0x49, 0x84, 0xB7, 0x01, 0x35, - 0x6C, 0x06, 0xF5, 0x36, 0xE3, 0x2F, 0x43, 0x2C, 0xC6, 0x24, 0x9A, 0xCB, 0x68, 0xEC, 0xDB, 0x40, - 0x3E, 0x6A, 0x86, 0xFC, 0xD3, 0xFD, 0x0A, 0x65, 0x31, 0x4E, 0x3E, 0x6E, 0x09, 0x2E, 0xA8, 0x59, - 0xA6, 0x32, 0xA6, 0xAF, 0x6E, 0x77, 0x41, 0x32, 0xD8, 0xB0, 0x30, 0x12, 0xEA, 0x0F, 0xBB, 0x41, - 0xDD, 0xB0, 0x40, 0x12, 0x2A, 0x3F, 0x5A, 0x77, 0x82, 0xEC, 0x37, 0x2D, 0x98, 0x38, 0xB1, 0x9F, - 0xB0, 0x58, 0x41, 0xE3, 0xF4, 0x0A, 0xB8, 0xBB, 0x4E, 0x6D, 0xD3, 0xDC, 0x0A, 0x90, 0x3B, 0xCE, - 0x6B, 0xE3, 0xC4, 0x5A, 0xF2, 0xCA, 0x46, 0xB0, 0x86, 0xE1, 0xBB, 0x94, 0x7E, 0x0E, 0xA5, 0xC1, - 0x6F, 0x59, 0x16, 0xDB, 0x05, 0xC8, 0x91, 0x05, 0xC4, 0x96, 0xA1, 0x76, 0x81, 0xF3, 0xC2, 0x82, - 0x53, 0xC3, 0x49, 0x1B, 0xDA, 0xBF, 0xB4, 0xDA, 0xD7, 0x73, 0xD3, 0x06, 0x10, 0x3F, 0x59, 0x20, - 0x36, 0x71, 0x54, 0x07, 0x80, 0x9F, 0x4B, 0x73, 0xC1, 0x92, 0x6A, 0x5F, 0xEC, 0x3C, 0x94, 0xD0, - 0x02, 0xF3, 0x11, 0xDD, 0xAF, 0xA2, 0xF9, 0xF3, 0xD5, 0x2A, 0xC6, 0x33, 0xE6, 0xF2, 0xCB, 0xED, - 0xC9, 0x77, 0x80, 0x77, 0xEA, 0x80, 0xF7, 0x66, 0x7D, 0x87, 0x32, 0x3C, 0xDB, 0x19, 0xD6, 0xCC, - 0x82, 0xB5, 0x58, 0xD3, 0x4B, 0x40, 0xBE, 0xE3, 0x34, 0x25, 0x36, 0xDD, 0x21, 0xC2, 0xFD, 0x80, - 0xBC, 0xFE, 0x2E, 0x40, 0xD2, 0x1A, 0x20, 0x83, 0x5D, 0x80, 0x3C, 0x7E, 0x0B, 0x20, 0xC5, 0xB7, - 0x18, 0xCE, 0x7F, 0xD7, 0x00, 0xA9, 0x57, 0xB7, 0x9A, 0x40, 0x4A, 0x02, 0xF1, 0x1F, 0xEC, 0xA7, - 0x19, 0x03, 0x2C, 0x95, 0xE9, 0x5F, 0xF0, 0x54, 0x31, 0xC2, 0x85, 0x7D, 0xBB, 0x95, 0xAB, 0xED, - 0xE0, 0xC7, 0xAD, 0x3A, 0x30, 0x42, 0x1C, 0xA3, 0x3D, 0x9C, 0xEC, 0xA5, 0xBD, 0xF3, 0x9F, 0x9E, - 0xBF, 0xBF, 0x7C, 0xF9, 0xE1, 0x12, 0xEC, 0xDA, 0xB5, 0x27, 0xBB, 0x46, 0xD5, 0x8E, 0x65, 0x8F, - 0x2D, 0xAF, 0xD5, 0xA9, 0xBF, 0xAF, 0x34, 0x00, 0x07, 0xDB, 0x00, 0x07, 0x4F, 0x04, 0xFE, 0xFD, - 0x36, 0xC0, 0xBF, 0x7F, 0x22, 0xF0, 0xCE, 0x36, 0xC0, 0x3B, 0x4F, 0x04, 0xDE, 0xDD, 0x06, 0x78, - 0xF7, 0x89, 0xC0, 0x7B, 0xDB, 0x00, 0xEF, 0x3D, 0x11, 0xF8, 0xB3, 0x6D, 0x80, 0x3F, 0xE3, 0xC0, - 0x27, 0xBB, 0x02, 0xFF, 0x0F, 0xB5, 0x0B, 0xEC, 0x43, 0x90, 0x9B, 0xF6, 0x3E, 0x8F, 0xF1, 0x6D, - 0x72, 0x87, 0x12, 0xF2, 0x2E, 0x22, 0x04, 0xD5, 0x5D, 0xA3, 0xB2, 0x2C, 0xCD, 0xAA, 0x52, 0xB8, - 0xF9, 0xEA, 0x8C, 0x78, 0x1C, 0xC5, 0x77, 0x51, 0x96, 0xE3, 0xE4, 0x76, 0x8F, 0xFD, 0x39, 0xDE, - 0x6B, 0x41, 0x04, 0x60, 0xFD, 0x94, 0x18, 0xCE, 0x69, 0xF5, 0x77, 0x72, 0x7A, 0xDF, 0xA7, 0xE2, - 0xC5, 0xAA, 0x67, 0x54, 0xB7, 0x9C, 0x97, 0xC5, 0x15, 0x9A, 0x6B, 0xBA, 0xE4, 0x1B, 0x36, 0x77, - 0x5E, 0x2E, 0x6E, 0x11, 0x91, 0x96, 0x82, 0x95, 0xCC, 0x9F, 0xDA, 0xE8, 0xB0, 0xB8, 0x5E, 0x65, - 0x28, 0x47, 0xD9, 0x27, 0x6E, 0xE7, 0xA2, 0x1D, 0x1E, 0x0C, 0xB4, 0x59, 0x49, 0x8F, 0x1B, 0xC0, - 0x84, 0xFB, 0x7E, 0xC5, 0x38, 0xA6, 0x67, 0x5A, 0xC4, 0x28, 0x73, 0x53, 0x77, 0xF9, 0x5F, 0xC2, - 0xAA, 0x71, 0x4D, 0xCF, 0xB2, 0x99, 0x51, 0x46, 0xA8, 0x66, 0xDF, 0x42, 0x43, 0x1C, 0xE6, 0x05, - 0x9B, 0xFA, 0x38, 0xFD, 0xFC, 0x1E, 0xE5, 0x69, 0xFC, 0x09, 0x27, 0xB7, 0xCF, 0x73, 0xE6, 0x27, - 0xDA, 0xE8, 0xCC, 0xFA, 0xC9, 0xE5, 0xCC, 0xFA, 0x2E, 0x4B, 0xEF, 0x70, 0x8E, 0x7A, 0x19, 0xBD, - 0x04, 0x5F, 0x21, 0x36, 0xD5, 0xE2, 0x9B, 0x9A, 0x65, 0x76, 0x7B, 0xB9, 0x43, 0xA9, 0x8A, 0x71, - 0xE0, 0xB5, 0xFE, 0xE3, 0xF2, 0xF5, 0xDB, 0x5F, 0xAF, 0x3F, 0x5C, 0xFC, 0xFC, 0xF2, 0xED, 0x2F, - 0x1F, 0x5A, 0x00, 0xC0, 0x11, 0xA2, 0xC7, 0xD1, 0x14, 0xF4, 0x78, 0x4A, 0x28, 0x66, 0x9F, 0x81, - 0x17, 0xE5, 0x8A, 0x3C, 0xA1, 0x14, 0x8B, 0xBE, 0x89, 0x98, 0xD7, 0x41, 0x1A, 0x4B, 0xCF, 0xD9, - 0x88, 0x8E, 0x60, 0x8F, 0x53, 0xC8, 0x1E, 0xF7, 0x97, 0xCB, 0xF6, 0x48, 0xF4, 0x91, 0x92, 0x53, - 0x9C, 0x26, 0xB7, 0xF4, 0xAF, 0x65, 0x94, 0xEC, 0x8D, 0x7C, 0xDF, 0xDF, 0xBB, 0xCB, 0x5B, 0xA0, - 0x00, 0x80, 0x87, 0xE2, 0x5F, 0x67, 0x19, 0x4A, 0xA8, 0x20, 0xF5, 0xF1, 0x62, 0xDE, 0xB0, 0xC8, - 0x2A, 0x93, 0x5C, 0x6F, 0x9D, 0xC5, 0x17, 0xF3, 0x42, 0x7B, 0xB9, 0xB3, 0x68, 0xC6, 0x18, 0x4A, - 0x9B, 0x44, 0xD3, 0x5E, 0xA7, 0xF7, 0x05, 0x66, 0xAE, 0xCF, 0xF7, 0x30, 0x09, 0xA5, 0xDF, 0x44, - 0x1A, 0xD6, 0x90, 0xC9, 0x04, 0x2F, 0xBC, 0x94, 0xB9, 0x23, 0xE0, 0xD0, 0xDA, 0x00, 0xBC, 0x6B, - 0xE3, 0xD3, 0x0F, 0x86, 0xF5, 0x51, 0x2D, 0x4D, 0x50, 0x92, 0xB6, 0x73, 0xB0, 0x38, 0x89, 0x00, - 0x03, 0x88, 0x27, 0x79, 0x15, 0x27, 0x93, 0x3E, 0xD5, 0xA0, 0x6A, 0xE8, 0xD3, 0x41, 0x7C, 0x82, - 0xF0, 0x03, 0x28, 0xBD, 0x68, 0x4E, 0xCF, 0xDB, 0x6D, 0x2F, 0x71, 0x8C, 0x5D, 0x90, 0x69, 0xE7, - 0x9C, 0x25, 0xDB, 0xDC, 0x9E, 0x20, 0x5F, 0xBC, 0xFC, 0xE1, 0x97, 0x1F, 0xA5, 0xAB, 0x4C, 0xD5, - 0xA2, 0x65, 0x25, 0x78, 0xCB, 0x3C, 0x22, 0x51, 0xAB, 0xE3, 0xC9, 0xE8, 0xB2, 0xCA, 0x33, 0x08, - 0x9D, 0xFD, 0xBE, 0xD7, 0xFA, 0xEE, 0x01, 0x15, 0xAD, 0xDF, 0xC7, 0xEC, 0x17, 0x4F, 0x64, 0xB0, - 0xCA, 0x52, 0x92, 0xD2, 0x2A, 0xBD, 0xBB, 0x68, 0xC5, 0x1D, 0xB3, 0x10, 0x53, 0xBF, 0x71, 0x4E, - 0xD1, 0x5B, 0x64, 0xE9, 0x1D, 0x65, 0xB2, 0xE7, 0xF2, 0x79, 0xA1, 0xF7, 0x7F, 0x53, 0x9C, 0x78, - 0xAD, 0x16, 0x28, 0x5A, 0xBF, 0x03, 0xE8, 0xE8, 0x06, 0x31, 0x9F, 0x33, 0x42, 0xAB, 0x50, 0x98, - 0x8C, 0xD6, 0x11, 0x7B, 0x09, 0xA0, 0x30, 0x9E, 0x13, 0xCF, 0x07, 0x00, 0x8C, 0x91, 0xC5, 0xF4, - 0x04, 0xD9, 0x88, 0x9C, 0x00, 0xC8, 0xCE, 0xB0, 0xE2, 0xAA, 0x72, 0xAE, 0x1C, 0xC3, 0x8C, 0xC2, - 0x8A, 0x19, 0xB8, 0xCE, 0x54, 0x25, 0x3D, 0xB1, 0xCE, 0x29, 0xB7, 0x4D, 0x1F, 0x1F, 0x79, 0xDB, - 0x92, 0x9D, 0x1C, 0xCF, 0x85, 0xC8, 0x02, 0x51, 0x78, 0xC0, 0x58, 0x48, 0xC3, 0x47, 0x2F, 0x99, - 0x10, 0x85, 0xDE, 0x84, 0x74, 0xC2, 0x73, 0x1D, 0x27, 0x92, 0x74, 0xCE, 0x55, 0xD1, 0x19, 0xE9, - 0x9C, 0x8F, 0x91, 0x76, 0xFF, 0x72, 0x4C, 0x13, 0xC7, 0xC0, 0x32, 0x4E, 0x17, 0xF4, 0xEC, 0xA1, - 0x5E, 0xBE, 0xBE, 0xE1, 0x25, 0x1E, 0x81, 0x89, 0x63, 0xA6, 0x64, 0xE6, 0x25, 0xC3, 0x66, 0xDD, - 0x6A, 0x1C, 0xF1, 0xE4, 0x14, 0xEE, 0xB6, 0x93, 0xED, 0x77, 0x5C, 0x5A, 0xDA, 0x52, 0xF6, 0x39, - 0x90, 0xC3, 0x0C, 0xA6, 0x90, 0x98, 0x56, 0x56, 0xEE, 0xFD, 0xC6, 0x73, 0x89, 0xE0, 0x85, 0xB7, - 0x9F, 0xEA, 0x50, 0x96, 0x3B, 0xCE, 0xC9, 0x6E, 0x93, 0xF0, 0x75, 0xC3, 0x2E, 0x73, 0x92, 0xEA, - 0xB0, 0x09, 0xF4, 0xB7, 0x18, 0xB6, 0x8B, 0x61, 0x86, 0x61, 0xA8, 0x1C, 0xDE, 0x6C, 0x9E, 0x19, - 0x86, 0x61, 0x26, 0x29, 0xD3, 0x32, 0xE8, 0x65, 0x7E, 0x8A, 0x15, 0x33, 0x7D, 0xD3, 0xD8, 0x5D, - 0xE7, 0x58, 0xAC, 0xD0, 0x34, 0x4B, 0xB7, 0xE2, 0xB6, 0x0B, 0xED, 0xA1, 0x64, 0x0E, 0x0A, 0xD3, - 0x10, 0x8D, 0xB1, 0xFA, 0x1C, 0x66, 0xCA, 0xE5, 0x4D, 0x1C, 0x13, 0xB6, 0xBB, 0xB7, 0xF8, 0x13, - 0x4A, 0xCE, 0x5E, 0xEF, 0x93, 0xCE, 0xA5, 0xA8, 0xF7, 0x28, 0x9A, 0xA3, 0x8C, 0x5E, 0x53, 0x61, - 0xE4, 0xB4, 0x2E, 0x9D, 0xA5, 0x71, 0x0E, 0x97, 0x2A, 0x9B, 0xB8, 0xF6, 0x1F, 0x9F, 0xA3, 0x99, - 0x78, 0x9B, 0xA3, 0xAD, 0xF3, 0xDE, 0xE7, 0x2C, 0x5A, 0x45, 0x22, 0x9D, 0xB8, 0xA3, 0xFA, 0x1D, - 0xAB, 0xC4, 0x5F, 0x6A, 0x58, 0x77, 0xD2, 0x86, 0xD9, 0x38, 0xE7, 0x98, 0x97, 0xCD, 0xDA, 0x75, - 0x68, 0xC5, 0x38, 0x41, 0x3C, 0x93, 0x8D, 0x6B, 0x75, 0x6E, 0xA2, 0x1C, 0x75, 0x5C, 0x05, 0x52, - 0xE6, 0x2C, 0x4F, 0xEE, 0x5D, 0x94, 0x7D, 0x34, 0xE3, 0xD9, 0x94, 0x5A, 0x39, 0x2C, 0x6F, 0x7B, - 0x5F, 0xDA, 0x6D, 0xDC, 0x25, 0xA7, 0x7E, 0xBB, 0xDD, 0x0F, 0xC3, 0x70, 0xCD, 0x3D, 0xA6, 0xE6, - 0x64, 0xE9, 0x82, 0xF0, 0xA5, 0x1B, 0x80, 0x76, 0x7B, 0xCD, 0x5E, 0x04, 0x51, 0x1C, 0xBF, 0xA2, - 0x7C, 0x3A, 0x9D, 0xA3, 0x77, 0x29, 0x5D, 0x4D, 0x77, 0x7D, 0x16, 0xEC, 0x7B, 0xDE, 0x5B, 0xDC, - 0xC2, 0x79, 0xEF, 0x86, 0xFE, 0x47, 0x1E, 0xF9, 0xDA, 0x63, 0x77, 0x11, 0x92, 0xC9, 0xE2, 0x04, - 0x4F, 0x3A, 0x9D, 0x05, 0x3B, 0x99, 0xF3, 0x10, 0x5D, 0x2D, 0xA6, 0xEA, 0x3C, 0xB4, 0x3D, 0x73, - 0x7A, 0x9F, 0x67, 0x2C, 0x4F, 0x81, 0x97, 0x03, 0x98, 0x9F, 0x04, 0xFD, 0xC3, 0x76, 0x3B, 0xD1, - 0xCE, 0xF0, 0xC9, 0x95, 0xEB, 0x08, 0xC9, 0xC1, 0x74, 0x82, 0xDA, 0x6D, 0x0A, 0xB8, 0x74, 0x26, - 0xB0, 0x4C, 0xD9, 0x72, 0x67, 0x18, 0x56, 0xF8, 0x8C, 0xB6, 0x59, 0xC2, 0x4C, 0xCE, 0x18, 0xAC, - 0x91, 0x02, 0x2F, 0x57, 0xE2, 0x73, 0x55, 0xD8, 0x51, 0xD0, 0x2C, 0x07, 0xA4, 0x5E, 0x34, 0x9F, - 0xBF, 0xC6, 0x09, 0x62, 0xA1, 0x28, 0x3E, 0x7A, 0x75, 0x8D, 0x5D, 0x0B, 0xD4, 0x40, 0x05, 0x30, - 0x7B, 0x7C, 0xDC, 0x77, 0xCD, 0xBB, 0x91, 0x0C, 0xCF, 0x2E, 0xE8, 0x64, 0xDD, 0xE0, 0x34, 0x8C, - 0x00, 0x5E, 0x78, 0x4B, 0x1E, 0xD2, 0x65, 0xE2, 0xAA, 0x76, 0x12, 0x4D, 0xC0, 0x0E, 0xCB, 0xDC, - 0xE9, 0x34, 0x2C, 0xB3, 0x93, 0x21, 0xF9, 0xCE, 0x91, 0xCA, 0xE4, 0x50, 0x55, 0x26, 0xE5, 0xF8, - 0x6C, 0x46, 0x5C, 0xEA, 0x04, 0x67, 0x4E, 0x8A, 0x57, 0x09, 0xA8, 0x9C, 0x81, 0x51, 0x78, 0x91, - 0xE5, 0xBB, 0xE4, 0xF1, 0x97, 0x8A, 0xB1, 0x13, 0xDA, 0xA9, 0x93, 0x91, 0x64, 0xE9, 0x67, 0xED, - 0x32, 0x5E, 0x42, 0xBC, 0xAE, 0x7E, 0x37, 0x70, 0x2E, 0xF5, 0x53, 0xB9, 0x41, 0x0F, 0xE7, 0x22, - 0xC8, 0x02, 0x8B, 0x5B, 0xF3, 0x4D, 0x39, 0x8D, 0x3A, 0x47, 0x9D, 0xEB, 0x18, 0x75, 0x03, 0x48, - 0xF9, 0x46, 0x06, 0x66, 0x69, 0x42, 0x70, 0xB2, 0x46, 0xF4, 0xC8, 0x8B, 0xDB, 0x6D, 0x6F, 0x2D, - 0x5F, 0xAF, 0x51, 0x1C, 0xE7, 0xCE, 0xC6, 0x30, 0x73, 0xCD, 0xC1, 0x2D, 0x22, 0x6F, 0xD6, 0x71, - 0x4C, 0x9B, 0x79, 0x73, 0x00, 0xE7, 0x00, 0x96, 0xF8, 0x52, 0xD4, 0xC4, 0x84, 0x28, 0x3E, 0xD7, - 0x22, 0x33, 0xD3, 0x4B, 0x96, 0x9E, 0xE9, 0xC5, 0x4B, 0xEB, 0xC3, 0xAF, 0x17, 0x2F, 0x3E, 0xFC, - 0xE4, 0xA6, 0x54, 0x00, 0x77, 0x23, 0x79, 0x7A, 0x26, 0x3B, 0x01, 0xC1, 0x4C, 0x64, 0x4E, 0x9B, - 0x74, 0xBB, 0xD9, 0xEE, 0x1B, 0xC9, 0x77, 0x43, 0xE5, 0x0B, 0xB1, 0x99, 0x41, 0x9F, 0xAD, 0x29, - 0xB3, 0xA1, 0xFD, 0xAC, 0x68, 0x3F, 0x1F, 0x52, 0x36, 0x95, 0x35, 0xDC, 0x39, 0x07, 0xE3, 0xED, - 0xAB, 0xF7, 0x61, 0x0E, 0x0A, 0x71, 0x58, 0x78, 0xEB, 0x5E, 0x9C, 0x46, 0xF3, 0x26, 0xD8, 0xFC, - 0xB3, 0x74, 0x5F, 0xE4, 0xEB, 0x68, 0x7F, 0xD3, 0x63, 0x01, 0x52, 0x08, 0x31, 0x8B, 0x18, 0xF3, - 0x06, 0xA7, 0x07, 0xA3, 0xD1, 0x60, 0x74, 0x66, 0x0B, 0x51, 0xCA, 0x6E, 0x4E, 0xE2, 0x1D, 0xFA, - 0xE3, 0x12, 0x00, 0x9C, 0x9F, 0xA7, 0x77, 0x37, 0x38, 0x41, 0x73, 0x0F, 0x6C, 0x6C, 0xED, 0xE8, - 0x9C, 0x99, 0x30, 0x02, 0xFB, 0xC0, 0x18, 0xEF, 0x08, 0x87, 0x6E, 0x0A, 0x94, 0x10, 0xF7, 0xC1, - 0x7B, 0x12, 0xA9, 0xA3, 0xD7, 0xDF, 0x7C, 0xF4, 0x82, 0x76, 0x7B, 0x7F, 0xDD, 0x5B, 0x46, 0xF9, - 0x39, 0x87, 0x59, 0x57, 0x69, 0x07, 0x6A, 0xAB, 0x67, 0xDA, 0x35, 0xB2, 0xDB, 0x06, 0xF1, 0x62, - 0x43, 0x28, 0xA3, 0x16, 0x61, 0xCA, 0x86, 0x1E, 0xD3, 0x22, 0x3D, 0x3E, 0xA2, 0x1E, 0xB7, 0xCC, - 0xA0, 0xBF, 0x2C, 0x55, 0xD3, 0x99, 0x53, 0x33, 0x55, 0x82, 0x39, 0xDE, 0x5C, 0x89, 0x5E, 0x02, - 0xF7, 0x6F, 0x3C, 0xD4, 0xE3, 0xBE, 0x35, 0x57, 0xBE, 0xF4, 0x6D, 0xDD, 0x14, 0xCF, 0x48, 0xFC, - 0x45, 0x69, 0x92, 0x87, 0xEA, 0xD8, 0x2A, 0xD8, 0x53, 0xBD, 0x26, 0x0D, 0x55, 0xB5, 0x65, 0x04, - 0x6C, 0x19, 0x8C, 0xAA, 0x5E, 0xAB, 0xB8, 0x7D, 0xC8, 0xA7, 0xFA, 0x87, 0x42, 0x54, 0x7D, 0x26, - 0xA4, 0x98, 0x71, 0xDB, 0x95, 0x72, 0x00, 0x3E, 0xD3, 0xC3, 0x56, 0x5C, 0x0F, 0xF6, 0xFD, 0x42, - 0x5B, 0x8C, 0xD8, 0xF5, 0x9F, 0x26, 0x9A, 0xD6, 0x2F, 0xCD, 0x2C, 0x4D, 0x3E, 0xA1, 0x8C, 0xBC, - 0x4C, 0x63, 0xF7, 0x61, 0xFB, 0x45, 0x47, 0x67, 0xF9, 0xC7, 0x13, 0x2A, 0x54, 0xDA, 0xE2, 0xFF, - 0x61, 0x81, 0xE2, 0x8B, 0xBB, 0x07, 0x7A, 0xF7, 0x71, 0xDE, 0x07, 0xBF, 0xA8, 0xB1, 0x3D, 0x71, - 0xF9, 0xB4, 0xDF, 0xA6, 0xA6, 0x90, 0xB2, 0x55, 0x50, 0x29, 0x13, 0x71, 0x59, 0x30, 0xDC, 0xF7, - 0x0B, 0xC3, 0x06, 0x48, 0x44, 0x9B, 0xD4, 0x41, 0x8C, 0x9A, 0xAE, 0x6A, 0xE2, 0xE5, 0xF4, 0x57, - 0x75, 0x63, 0xB3, 0xAF, 0xD4, 0x19, 0xA2, 0xD2, 0xFC, 0x8C, 0xC8, 0x57, 0x66, 0xF7, 0x8C, 0xF9, - 0xB5, 0x33, 0xB3, 0xEF, 0x4F, 0x94, 0x1C, 0x54, 0x82, 0x55, 0x37, 0xCB, 0x75, 0x7D, 0x00, 0x77, - 0x17, 0x13, 0x29, 0x6C, 0xF9, 0x6E, 0xF2, 0xFC, 0xE2, 0xBE, 0xC5, 0x3B, 0x9C, 0x1C, 0x75, 0xD4, - 0x52, 0x77, 0x93, 0x93, 0x4D, 0xD4, 0xDF, 0x6E, 0x7B, 0xE5, 0x10, 0x9F, 0xDF, 0x44, 0x9E, 0xB4, - 0x82, 0x83, 0x9E, 0xF1, 0x9F, 0x63, 0xA4, 0x25, 0x58, 0xA0, 0x72, 0x90, 0x7F, 0x6B, 0xC9, 0x38, - 0x70, 0xF2, 0x01, 0x45, 0xF1, 0x25, 0x42, 0xAC, 0x5B, 0xD1, 0xAE, 0xCC, 0x8A, 0xF7, 0x4D, 0x67, - 0x65, 0x82, 0xE8, 0xD1, 0xDE, 0x7C, 0xFA, 0xA3, 0x2D, 0x4E, 0x7F, 0x37, 0x59, 0x15, 0xCD, 0xDB, - 0x60, 0xDF, 0x2F, 0x98, 0xD9, 0x5C, 0xDD, 0xA5, 0xB1, 0x9E, 0x89, 0x88, 0xFD, 0xB5, 0xEF, 0x37, - 0xCD, 0xC9, 0x97, 0x49, 0xD3, 0x86, 0x77, 0x7C, 0x4C, 0xD0, 0x17, 0x72, 0x49, 0xD2, 0x95, 0xB7, - 0xF9, 0x54, 0x28, 0x2B, 0x7B, 0xEC, 0xBB, 0xFC, 0x87, 0xE8, 0xC6, 0x54, 0x53, 0x95, 0xA6, 0x85, - 0x59, 0xA5, 0x15, 0xDA, 0xEE, 0xAF, 0xF4, 0x4C, 0x61, 0xEB, 0x9F, 0xCC, 0x97, 0x75, 0xD5, 0xEC, - 0xA2, 0xC2, 0xCD, 0x6A, 0x5B, 0xF9, 0xAC, 0x55, 0x79, 0xEE, 0x51, 0x03, 0x99, 0x39, 0xF7, 0xC1, - 0x17, 0x9D, 0xCC, 0x08, 0x41, 0x23, 0xC7, 0x94, 0x93, 0x1C, 0xDC, 0xE7, 0xE1, 0x16, 0x2A, 0xAF, - 0x34, 0xC3, 0xB7, 0x38, 0x39, 0x53, 0x5D, 0x6D, 0x60, 0x15, 0x1A, 0x91, 0x26, 0x3E, 0xE4, 0x44, - 0x06, 0x80, 0x71, 0xA9, 0x17, 0xD7, 0xD9, 0xB6, 0x61, 0xA4, 0x2A, 0xD2, 0xF8, 0xCE, 0x02, 0xEB, - 0xB5, 0xB2, 0x6D, 0x37, 0xE3, 0xCE, 0x3E, 0xED, 0xEC, 0xDB, 0x62, 0x42, 0xDD, 0x72, 0x0B, 0x6A, - 0x5A, 0x26, 0xF7, 0x5C, 0x76, 0x88, 0x5B, 0x45, 0x51, 0x0F, 0x4C, 0x62, 0x59, 0x73, 0x06, 0xEE, - 0x3C, 0x71, 0x77, 0xA9, 0xB6, 0xC0, 0xD7, 0x33, 0x57, 0x03, 0x5D, 0xCF, 0xB2, 0xF3, 0xD2, 0xEB, - 0xC6, 0xB9, 0x43, 0x40, 0x61, 0xF8, 0xF3, 0x2A, 0x1D, 0xBE, 0x93, 0x89, 0x37, 0x4D, 0x96, 0x62, - 0x3F, 0xA7, 0xA1, 0x2F, 0xEE, 0x16, 0x06, 0xF6, 0x3E, 0xEC, 0x6A, 0x0A, 0x84, 0xC6, 0x65, 0xE1, - 0xF1, 0x31, 0x50, 0x62, 0x9B, 0x5D, 0xDF, 0x2B, 0xD7, 0x62, 0x52, 0x8E, 0xE9, 0xDF, 0xDB, 0x84, - 0xAC, 0xB9, 0x73, 0x5C, 0x78, 0xDF, 0x6F, 0xC2, 0x77, 0x47, 0x74, 0x4B, 0x75, 0x34, 0xAE, 0xDA, - 0x8D, 0xD8, 0xE6, 0x61, 0xE6, 0xD2, 0x5A, 0x6D, 0xA1, 0x6F, 0xB4, 0x36, 0x9C, 0x87, 0x6B, 0x9B, - 0x57, 0x66, 0xCA, 0x82, 0x60, 0x78, 0x0D, 0x5B, 0x10, 0xAC, 0x99, 0x74, 0x1F, 0xCE, 0xBE, 0x86, - 0x52, 0x76, 0x19, 0x76, 0x80, 0x62, 0xF4, 0xB3, 0x11, 0x50, 0xC9, 0x5B, 0xD8, 0x1E, 0x94, 0xA6, - 0xE0, 0xF2, 0x90, 0xBA, 0x6E, 0xB1, 0xC2, 0x18, 0xA7, 0xE1, 0x46, 0x56, 0x07, 0x54, 0xBD, 0xFB, - 0x85, 0xFD, 0x33, 0xDD, 0x41, 0x20, 0x3A, 0x18, 0xFB, 0xB0, 0xDA, 0x2B, 0xEF, 0xA0, 0xE2, 0xDB, - 0xF8, 0x2D, 0xD0, 0x76, 0xF9, 0x39, 0xEE, 0x46, 0x22, 0x55, 0x8F, 0xBE, 0x3A, 0xBC, 0x9C, 0x7A, - 0x89, 0x9A, 0xD1, 0xBA, 0xBC, 0xFB, 0x6A, 0xF1, 0x72, 0x12, 0xBE, 0xE5, 0xD3, 0xE7, 0xA0, 0x14, - 0xA3, 0x54, 0x48, 0x45, 0xD2, 0x7B, 0xCF, 0xC8, 0x2D, 0xAF, 0xA0, 0xCA, 0x8D, 0xCA, 0x84, 0xF5, - 0x33, 0xEE, 0x52, 0xE3, 0x12, 0x72, 0x48, 0x74, 0x93, 0x5F, 0xB9, 0x06, 0x3A, 0x1D, 0x0F, 0x44, - 0x08, 0x89, 0x9A, 0x56, 0xE1, 0x43, 0x51, 0xDD, 0xB0, 0xDC, 0x1D, 0xF6, 0x6B, 0x84, 0x35, 0xFE, - 0xAE, 0x6C, 0xCF, 0x0F, 0x4F, 0xCC, 0x48, 0xBA, 0xDD, 0x89, 0xF3, 0x6E, 0xD2, 0x2C, 0xA7, 0x4D, - 0x24, 0xE8, 0xC2, 0xE5, 0xB9, 0xFB, 0x0F, 0x80, 0xEA, 0x2A, 0x43, 0x9F, 0xCA, 0xA8, 0x56, 0x3D, - 0x95, 0x9A, 0x16, 0x39, 0xB0, 0x56, 0xCA, 0x34, 0x62, 0xB9, 0xB9, 0x7D, 0x0C, 0x47, 0x83, 0x83, - 0xA3, 0x43, 0xFF, 0x38, 0xE8, 0x03, 0xD8, 0xDF, 0x67, 0x15, 0xFD, 0x7D, 0x16, 0xF8, 0xD9, 0x59, - 0xBF, 0x1D, 0x76, 0x65, 0x83, 0x01, 0x97, 0x0B, 0x85, 0x63, 0x3B, 0xC7, 0x56, 0xB8, 0xB7, 0xF3, - 0xAC, 0xFD, 0xFB, 0x01, 0xCC, 0x58, 0x84, 0x77, 0xFB, 0x79, 0x74, 0xD7, 0x5B, 0x07, 0x02, 0x93, - 0xA4, 0x97, 0xA1, 0x55, 0x1C, 0xCD, 0x90, 0x50, 0xC9, 0x43, 0xBC, 0x49, 0xFF, 0xEE, 0xD6, 0x65, - 0x40, 0xE7, 0x67, 0x98, 0x01, 0x98, 0xD3, 0x4B, 0xA3, 0x75, 0xE5, 0x02, 0x4C, 0xE4, 0x45, 0xC4, - 0x1E, 0x98, 0x31, 0x1E, 0xFC, 0xF4, 0xF1, 0x60, 0x96, 0x75, 0xD8, 0x55, 0x65, 0x9B, 0x31, 0x00, - 0xA7, 0x12, 0x47, 0x64, 0xF3, 0x60, 0x46, 0x19, 0x3F, 0x47, 0xD9, 0x47, 0x94, 0x39, 0xDF, 0x2E, - 0x24, 0x0E, 0x10, 0x5B, 0xA3, 0x2D, 0x2A, 0xF1, 0x13, 0xF8, 0x50, 0x99, 0x31, 0x93, 0x0C, 0x71, - 0xBA, 0xA3, 0xFE, 0xC0, 0x20, 0x45, 0x11, 0x1B, 0xD5, 0x1F, 0x53, 0xFA, 0x77, 0x4E, 0xDC, 0xFD, - 0x46, 0x71, 0x0E, 0x5B, 0xCB, 0x67, 0x51, 0x1C, 0x76, 0x6B, 0xCA, 0xBE, 0x38, 0x27, 0x8A, 0x3D, - 0x9F, 0xD7, 0x69, 0x29, 0x20, 0x01, 0x13, 0x7C, 0x52, 0x27, 0xCF, 0x4F, 0x70, 0xA7, 0x03, 0xD4, - 0x2C, 0x58, 0xB4, 0x81, 0x69, 0xCB, 0xCD, 0x43, 0x98, 0xDC, 0x64, 0x28, 0xFA, 0x28, 0x42, 0x86, - 0xFE, 0xAD, 0x66, 0x03, 0xBA, 0x6F, 0x55, 0x9D, 0x00, 0xEE, 0xFB, 0xB0, 0x46, 0xA5, 0xDF, 0x09, - 0x9A, 0x14, 0x6E, 0x2E, 0x4A, 0xD2, 0xA4, 0x8E, 0x3B, 0x81, 0xAD, 0xAE, 0x00, 0x13, 0xAC, 0x59, - 0xDC, 0x93, 0x66, 0xCA, 0xB7, 0x66, 0xAA, 0x6F, 0xCD, 0x54, 0x75, 0x5D, 0x36, 0xCF, 0x56, 0xF7, - 0x9B, 0xE3, 0x34, 0x18, 0x6F, 0x54, 0xA6, 0x88, 0x00, 0xD1, 0xB5, 0xD4, 0x84, 0xD8, 0x73, 0x54, - 0x6D, 0x73, 0x92, 0xE1, 0x3B, 0x66, 0x41, 0x57, 0x23, 0x03, 0xB2, 0xAD, 0x1C, 0x36, 0xDD, 0x60, - 0x59, 0x8D, 0x2E, 0x82, 0x35, 0xFA, 0xE5, 0x39, 0xCE, 0x57, 0xCD, 0xED, 0x69, 0x0D, 0xB3, 0xBD, - 0x9D, 0xD1, 0xC8, 0x67, 0x4F, 0x01, 0xE2, 0x4C, 0xB2, 0x03, 0x9C, 0x70, 0xEE, 0xF1, 0xED, 0xF8, - 0x46, 0x1D, 0xAD, 0x37, 0xEC, 0x9D, 0x6F, 0xC1, 0x0A, 0xAC, 0xDD, 0xBA, 0x13, 0x0E, 0xF5, 0x5B, - 0x30, 0x28, 0x01, 0xEE, 0x3F, 0x0D, 0xB0, 0x63, 0x24, 0x6C, 0x77, 0x17, 0x5F, 0xF5, 0x96, 0xB1, - 0xEF, 0x17, 0x76, 0x80, 0x99, 0x9A, 0xEB, 0xB1, 0x5B, 0xBA, 0x71, 0x4B, 0x4B, 0x0D, 0x4A, 0x5E, - 0x7E, 0x97, 0x94, 0x2F, 0xA8, 0x25, 0x3D, 0x6F, 0xD3, 0xCD, 0xB8, 0xAC, 0xBE, 0x73, 0x73, 0xD1, - 0x5A, 0xAD, 0xA5, 0x32, 0xCF, 0x75, 0xE9, 0x6C, 0xEA, 0xAF, 0xE4, 0x42, 0x69, 0xE4, 0x0E, 0xFA, - 0xC7, 0x1B, 0x3B, 0xBB, 0x63, 0xDB, 0x30, 0xEF, 0x6C, 0x10, 0xFF, 0xF8, 0xAE, 0x17, 0x29, 0x08, - 0xB2, 0x6E, 0x00, 0x9B, 0x4C, 0x2D, 0x44, 0xB5, 0x1A, 0x5E, 0x7F, 0x8B, 0xC8, 0x0F, 0x71, 0x94, - 0x7C, 0x34, 0xC8, 0xA8, 0xF2, 0xAE, 0x33, 0xD9, 0x48, 0x28, 0x95, 0x24, 0x63, 0x9B, 0xF7, 0x99, - 0x95, 0x4C, 0xAC, 0xE1, 0xE2, 0x6A, 0xC7, 0x1F, 0xFA, 0xE7, 0x24, 0x32, 0x86, 0x7E, 0xCE, 0xD6, - 0xFC, 0xAB, 0xC8, 0xAD, 0xA9, 0x71, 0x03, 0xB9, 0x6D, 0x47, 0x67, 0x78, 0x1B, 0x2A, 0xCB, 0xFF, - 0x1F, 0xA5, 0x32, 0x3B, 0xE2, 0x5F, 0x1D, 0x95, 0x35, 0x68, 0xBC, 0x9E, 0xFC, 0x28, 0x22, 0x47, - 0x4D, 0xCF, 0xF7, 0xCD, 0xE6, 0x44, 0x25, 0x4D, 0xC4, 0x37, 0xBC, 0xDB, 0x3C, 0x51, 0x4B, 0x0A, - 0xF4, 0x1E, 0xFD, 0xBB, 0xCF, 0x9E, 0x40, 0xE3, 0xFF, 0xB5, 0xD9, 0x33, 0xA2, 0x9A, 0x3D, 0xEC, - 0xAE, 0x0A, 0xB0, 0xB6, 0xDF, 0x2E, 0xB3, 0xA7, 0x1F, 0x2D, 0xB6, 0xD8, 0xD7, 0xBB, 0x03, 0x16, - 0x2C, 0xE9, 0xEF, 0xC6, 0x0E, 0x1A, 0xDF, 0x64, 0x6C, 0xB6, 0xA0, 0xD6, 0x40, 0x6A, 0xB6, 0xFF, - 0xC7, 0x57, 0x41, 0x4C, 0xD6, 0xDF, 0x64, 0x21, 0xE8, 0x14, 0x6C, 0x5E, 0x05, 0x47, 0x1C, 0xFB, - 0xBF, 0xCF, 0x1A, 0x88, 0xE8, 0xA8, 0x35, 0xFA, 0xB4, 0xFF, 0x89, 0xC3, 0xDB, 0xB9, 0xF2, 0x3C, - 0x75, 0x53, 0x13, 0x98, 0x09, 0xDA, 0x68, 0x6F, 0x30, 0xE9, 0x74, 0xD0, 0x37, 0x51, 0x0A, 0x99, - 0x9C, 0xCE, 0x87, 0xE4, 0xDB, 0x72, 0xB2, 0x92, 0xBE, 0xE7, 0xEF, 0x40, 0x03, 0x32, 0x0E, 0xED, - 0xBF, 0x89, 0xA0, 0x89, 0x08, 0x4C, 0x61, 0xE1, 0x9F, 0x8A, 0x08, 0xCA, 0x21, 0xC1, 0xFE, 0x4D, - 0x06, 0xDB, 0x92, 0x81, 0x5B, 0x3B, 0xF1, 0xCF, 0x43, 0x19, 0xE5, 0x90, 0x6E, 0xFF, 0xA6, 0x8C, - 0x6D, 0x4F, 0x89, 0x7F, 0x76, 0xCA, 0xB0, 0x42, 0xF2, 0xFE, 0xDD, 0x6E, 0x20, 0xF6, 0xE3, 0x93, - 0x73, 0xCA, 0x1D, 0x1F, 0x3B, 0x15, 0x13, 0x82, 0x7F, 0x90, 0x9B, 0x49, 0x43, 0x00, 0x5F, 0x23, - 0xE5, 0x66, 0xAD, 0xA7, 0xC0, 0xA6, 0x2D, 0x03, 0x71, 0xC5, 0xB3, 0x98, 0x80, 0x72, 0xA2, 0x4C, - 0xB6, 0x1B, 0xF0, 0x15, 0x9A, 0x86, 0x1B, 0x7A, 0xB3, 0x84, 0x55, 0xEE, 0x7C, 0x89, 0xA1, 0x0F, - 0x65, 0x96, 0x4C, 0x2E, 0x5E, 0x34, 0x86, 0x0F, 0x56, 0x79, 0x2C, 0x35, 0x96, 0xA7, 0xBE, 0x7A, - 0xDE, 0xC4, 0xB9, 0xD7, 0xFA, 0x42, 0x50, 0x76, 0xD7, 0x52, 0x8E, 0x1C, 0xF4, 0x53, 0xF6, 0xE5, - 0x13, 0xE9, 0x0A, 0xFF, 0x3D, 0xBB, 0x84, 0xDB, 0xED, 0xB5, 0xA4, 0x63, 0x86, 0x69, 0x3B, 0x45, - 0x32, 0x7C, 0x7B, 0x8B, 0xD8, 0x0A, 0xB1, 0xE4, 0x28, 0x3C, 0xDA, 0xDE, 0xCB, 0xCB, 0xF3, 0x4E, - 0xEB, 0xEA, 0x2C, 0x98, 0xF4, 0x67, 0x2D, 0x69, 0xE6, 0x42, 0x01, 0xC5, 0x38, 0x59, 0x7F, 0x69, - 0x29, 0xCB, 0xC7, 0xAD, 0x01, 0x1D, 0xCC, 0x5A, 0xA0, 0x76, 0xD8, 0x66, 0x50, 0xE3, 0xAD, 0x07, - 0xBE, 0xE3, 0x50, 0x4E, 0xFD, 0x49, 0xFF, 0xF0, 0x60, 0xE2, 0xDB, 0xC3, 0xB1, 0x67, 0x6C, 0x57, - 0x90, 0x47, 0xA3, 0xC9, 0xF1, 0xA8, 0x0C, 0x52, 0xCC, 0xD0, 0x36, 0xB0, 0x8C, 0x31, 0x76, 0x5A, - 0x36, 0x14, 0xB9, 0x60, 0xBB, 0x4E, 0xF4, 0xE9, 0xD1, 0x60, 0x32, 0xF4, 0x7D, 0x7F, 0xC0, 0xD0, - 0xE2, 0x8F, 0xDD, 0x38, 0x37, 0xE6, 0xD5, 0x67, 0x09, 0x94, 0x19, 0xCC, 0x7A, 0x33, 0x4F, 0x3A, - 0xC3, 0x6F, 0xA2, 0x3B, 0xD4, 0x69, 0xB5, 0x00, 0x8F, 0xF1, 0xF5, 0x76, 0xC1, 0x32, 0x8D, 0xAB, - 0x18, 0xC4, 0x0F, 0x76, 0x4E, 0x5B, 0x64, 0x66, 0xB1, 0x95, 0xB9, 0x25, 0xE5, 0xE8, 0x88, 0x7C, - 0x11, 0x19, 0x8E, 0xAB, 0x83, 0x29, 0xFB, 0xF3, 0x86, 0xFB, 0xBE, 0xF5, 0xCE, 0x20, 0x5F, 0x51, - 0xDC, 0x89, 0xEF, 0x0D, 0x37, 0x85, 0x90, 0x31, 0x09, 0x65, 0x6B, 0x50, 0x8A, 0x6E, 0xFC, 0x24, - 0x7C, 0x03, 0x07, 0xBE, 0x65, 0x53, 0xC3, 0x48, 0x07, 0xFC, 0xE2, 0xBC, 0xFD, 0x4F, 0xE8, 0x3E, - 0x2F, 0x0F, 0x42, 0xC2, 0xA9, 0x5A, 0xAB, 0xCA, 0xE0, 0x36, 0x3E, 0x4C, 0xD5, 0xAD, 0x57, 0xC4, - 0x5C, 0x52, 0x86, 0x8E, 0xF5, 0xAD, 0x82, 0x27, 0xB5, 0xEA, 0x3F, 0xA9, 0xD5, 0xC0, 0xD1, 0xCA, - 0x7E, 0x5A, 0xDC, 0x44, 0x55, 0x96, 0xB7, 0x8F, 0x99, 0xD5, 0x51, 0xBD, 0x27, 0x3A, 0xF3, 0xEF, - 0x07, 0x2A, 0x35, 0x5F, 0x55, 0x97, 0xEC, 0xF0, 0x98, 0xCF, 0x91, 0xC8, 0xFA, 0x0B, 0x2C, 0xF4, - 0x0E, 0xB6, 0x58, 0x4B, 0x6E, 0x36, 0xAA, 0x43, 0xDB, 0x68, 0xB3, 0x29, 0x1F, 0xDA, 0xEF, 0xA8, - 0x87, 0x5B, 0x40, 0xD3, 0x8E, 0xEC, 0x25, 0x72, 0x08, 0xFA, 0x1B, 0x68, 0x9A, 0xDB, 0xF4, 0xC4, - 0x38, 0xF9, 0x58, 0x6A, 0x39, 0x1C, 0x6D, 0xD1, 0x6F, 0xC5, 0x2B, 0xA3, 0x04, 0xE4, 0x40, 0x4E, - 0x45, 0x35, 0xC0, 0xC8, 0x25, 0xCA, 0x70, 0x14, 0xEF, 0xAD, 0xD2, 0x8C, 0xEC, 0x89, 0x98, 0x42, - 0x68, 0xBE, 0x67, 0x90, 0xF8, 0x1E, 0x8F, 0x4A, 0xD7, 0x6B, 0x6D, 0x63, 0x85, 0x6B, 0xB4, 0xFB, - 0x13, 0x6B, 0xA6, 0x67, 0xB6, 0x26, 0xF5, 0x1C, 0x5F, 0x37, 0x13, 0xD9, 0x63, 0x63, 0xC0, 0x56, - 0x62, 0x79, 0x2E, 0x23, 0xBC, 0xCB, 0x52, 0x92, 0xCE, 0xD2, 0x38, 0x6C, 0xFD, 0x39, 0xF0, 0x5B, - 0xD6, 0x24, 0xA3, 0xC1, 0xB6, 0x4D, 0xFF, 0xF3, 0x43, 0xDF, 0x2F, 0x35, 0xF6, 0xFD, 0xFE, 0xB6, - 0xAD, 0x5F, 0xBC, 0x7F, 0xFE, 0x63, 0xB9, 0xF1, 0xD6, 0x5D, 0x3F, 0x7F, 0xF3, 0x97, 0x72, 0x5B, - 0x17, 0x93, 0x2C, 0xCF, 0x6C, 0xAE, 0x72, 0x08, 0x3A, 0x66, 0x54, 0xA5, 0x11, 0xAC, 0xCE, 0x66, - 0xE0, 0xFB, 0xA3, 0xDA, 0xC5, 0x7F, 0xF1, 0xF2, 0xFC, 0xF2, 0xE5, 0x07, 0x56, 0x67, 0x2F, 0x49, - 0xC9, 0x5E, 0xBE, 0x5E, 0x51, 0x42, 0x40, 0xF3, 0x3D, 0x2F, 0x47, 0x68, 0xEF, 0x3F, 0xFA, 0x23, - 0xFF, 0x10, 0xB4, 0xCA, 0xF0, 0x0E, 0x9A, 0x87, 0xFA, 0x32, 0x99, 0xA5, 0x54, 0x34, 0x0A, 0x5B, - 0x97, 0x3F, 0xBE, 0x2F, 0x0D, 0x35, 0xD8, 0x02, 0x97, 0x60, 0x07, 0x5C, 0x82, 0x5D, 0x70, 0x91, - 0x19, 0x5D, 0x2D, 0x3E, 0xED, 0xDA, 0x5E, 0x38, 0xE7, 0x3C, 0xE0, 0x27, 0x3C, 0x9F, 0xA3, 0x24, - 0xDC, 0x0F, 0xEC, 0x4E, 0x87, 0x47, 0xBC, 0x8D, 0x19, 0x96, 0xB3, 0x54, 0xE3, 0xD8, 0x51, 0x83, - 0x6F, 0xE7, 0xC3, 0xB1, 0xAC, 0x23, 0x19, 0x8A, 0x3B, 0xD3, 0x1A, 0xC3, 0x3F, 0x22, 0xE8, 0x79, - 0x2C, 0xEC, 0x3F, 0x9A, 0xC5, 0x6E, 0x17, 0xFA, 0x17, 0x09, 0x26, 0x38, 0x8A, 0xF1, 0x7F, 0x21, - 0xD7, 0x36, 0xAC, 0x04, 0x1A, 0x71, 0x3F, 0xD8, 0xDB, 0xAE, 0x6F, 0x5B, 0x6F, 0xE2, 0xFE, 0x76, - 0x54, 0x7D, 0xC3, 0xAE, 0x03, 0x04, 0xCD, 0xDF, 0x45, 0x39, 0xFF, 0x66, 0x9D, 0xE9, 0x66, 0x0A, - 0x84, 0xBF, 0xA1, 0xF8, 0x11, 0x3C, 0x55, 0xFC, 0x08, 0x1C, 0xA8, 0xFE, 0xFD, 0x04, 0x90, 0xE0, - 0x7F, 0xE4, 0x6C, 0x3E, 0xAA, 0xA7, 0x93, 0xBF, 0xCD, 0xD1, 0x1C, 0x7C, 0xF3, 0xA3, 0x39, 0x78, - 0xF2, 0xD1, 0x1C, 0x7C, 0x8B, 0xA3, 0x39, 0xD8, 0xF6, 0x68, 0x66, 0x34, 0x82, 0x93, 0xDB, 0xBD, - 0x9B, 0x68, 0xF6, 0x71, 0x8F, 0xA4, 0x7B, 0x49, 0x9A, 0xDD, 0x45, 0xF1, 0xD7, 0x9E, 0xC8, 0xC1, - 0xEE, 0x27, 0xB2, 0x3A, 0x5F, 0xF5, 0x59, 0xB9, 0xF3, 0xC1, 0xF7, 0xE6, 0xED, 0x9B, 0x97, 0x5F, - 0x79, 0xF2, 0x05, 0xBB, 0x9C, 0x6C, 0xEF, 0x2F, 0x9F, 0x70, 0xB2, 0xED, 0x7C, 0xAE, 0x08, 0xF9, - 0x78, 0xA7, 0x73, 0x8E, 0x63, 0xB6, 0xFD, 0x39, 0xB7, 0xD5, 0x21, 0xE5, 0xBB, 0x0F, 0xA9, 0x52, - 0xD8, 0xE7, 0xCA, 0x39, 0xF5, 0xB4, 0x53, 0xE9, 0x0D, 0x23, 0x44, 0x71, 0x30, 0x01, 0x48, 0x21, - 0x85, 0x61, 0x68, 0x70, 0x33, 0x71, 0x89, 0x2D, 0xF5, 0xFE, 0xCF, 0x77, 0x58, 0x59, 0x27, 0x80, - 0x99, 0xD4, 0x82, 0x94, 0x75, 0xA8, 0x0D, 0x90, 0xE1, 0x83, 0xBD, 0x57, 0xC6, 0x39, 0xB4, 0xC9, - 0x6C, 0x9C, 0x15, 0xA1, 0x9B, 0x1E, 0x55, 0xB4, 0x2E, 0x03, 0x3C, 0x7C, 0x10, 0xCB, 0x35, 0x8E, - 0xE0, 0x2C, 0x8D, 0xF3, 0xF1, 0xB2, 0x70, 0x59, 0xE6, 0xC8, 0x5E, 0xC7, 0x33, 0x18, 0xC5, 0x64, - 0x1C, 0x17, 0x61, 0xA4, 0x22, 0x6B, 0xD5, 0x9E, 0x1A, 0xF0, 0x3A, 0x44, 0xE1, 0x29, 0x3A, 0x0B, - 0xC6, 0x7D, 0xB8, 0x76, 0x19, 0xF1, 0x2F, 0xC2, 0x35, 0xFC, 0x14, 0x92, 0x33, 0x16, 0x52, 0xE6, - 0x6C, 0x30, 0x1E, 0xB2, 0x7F, 0xAF, 0xBD, 0xB4, 0x72, 0xEE, 0x82, 0x71, 0xC0, 0x2B, 0x0D, 0xC7, - 0x7D, 0x5F, 0xD4, 0x9A, 0x1B, 0xC7, 0x2B, 0x18, 0xFB, 0xE3, 0x40, 0x7C, 0xC7, 0xEE, 0x33, 0x0F, - 0x30, 0xEF, 0x8E, 0xF5, 0xD9, 0xBC, 0xFE, 0x30, 0x3B, 0x3B, 0xA2, 0xB0, 0x97, 0x67, 0xFD, 0x71, - 0x30, 0xE8, 0xB3, 0x5F, 0xC1, 0xD8, 0x1F, 0xFB, 0xE3, 0x03, 0x05, 0x99, 0x9F, 0x33, 0x60, 0x7C, - 0xA8, 0xBE, 0xE8, 0xB3, 0x02, 0x8C, 0x8F, 0xC4, 0x38, 0x8E, 0x45, 0x29, 0xBB, 0x75, 0x84, 0x61, - 0x98, 0x2B, 0xF4, 0x19, 0xD6, 0xFA, 0x90, 0x00, 0xE3, 0xFE, 0x48, 0x7C, 0xDF, 0x4F, 0x4B, 0xBB, - 0x14, 0x8C, 0x87, 0x23, 0xD5, 0x4B, 0xD5, 0x95, 0x7E, 0x7C, 0x70, 0xE0, 0x1A, 0x2F, 0xE7, 0xDB, - 0x60, 0x1C, 0xA0, 0x81, 0x44, 0x82, 0xDF, 0x5F, 0x04, 0x1A, 0xBE, 0x2F, 0x11, 0xE1, 0x37, 0x13, - 0xF5, 0x59, 0x55, 0xA7, 0x77, 0x0E, 0xF5, 0x75, 0xA8, 0xFA, 0x50, 0x9C, 0x95, 0x7D, 0x1F, 0x89, - 0xC5, 0xA0, 0x7C, 0x50, 0x36, 0xA4, 0x12, 0x3C, 0x8B, 0x3D, 0x34, 0xA6, 0xFC, 0x4A, 0x55, 0x08, - 0xCC, 0x0A, 0x52, 0xAC, 0x96, 0xF5, 0x86, 0x7C, 0xCA, 0x82, 0xF1, 0x90, 0xCD, 0xE8, 0xE3, 0x23, - 0xE5, 0x2A, 0xEA, 0x97, 0x9C, 0xC7, 0x59, 0x18, 0x86, 0x31, 0x18, 0xF7, 0x4D, 0x7C, 0xAA, 0x1B, - 0x0C, 0x8C, 0x7D, 0x98, 0x56, 0xB5, 0x5F, 0xBF, 0x7F, 0xF7, 0x20, 0x15, 0x60, 0xC5, 0xD5, 0x77, - 0x0F, 0xE4, 0xAC, 0xD5, 0x1A, 0xB7, 0xCE, 0x5A, 0xC5, 0x77, 0x0F, 0x8B, 0x62, 0xF2, 0xDD, 0xC3, - 0xA7, 0xE2, 0xBB, 0xFB, 0xDF, 0x01, 0xDC, 0xF7, 0x27, 0x9F, 0xA2, 0x6C, 0x6F, 0x01, 0x3F, 0x15, - 0xD7, 0xEB, 0xD5, 0x9C, 0x0A, 0xD3, 0x84, 0xC8, 0x70, 0xFC, 0xDC, 0xF7, 0x03, 0x66, 0x4A, 0x4B, - 0xC6, 0x62, 0xE7, 0x9C, 0x79, 0xE8, 0x31, 0x1C, 0xF9, 0x83, 0x41, 0x70, 0x30, 0x3C, 0x82, 0xA8, - 0x1D, 0x76, 0x83, 0x83, 0xC3, 0xC3, 0xC3, 0x7E, 0x70, 0x00, 0xD1, 0x63, 0xB8, 0xE8, 0x29, 0x05, - 0x26, 0x73, 0x33, 0x61, 0x21, 0xD0, 0x28, 0xB8, 0xF7, 0x3F, 0xFE, 0xE0, 0x5D, 0x31, 0x70, 0x53, - 0x00, 0xC6, 0x23, 0xE1, 0xC7, 0x42, 0x9B, 0x33, 0x58, 0xC7, 0xFE, 0x90, 0x36, 0x1F, 0x0C, 0x46, - 0xA3, 0xE1, 0x70, 0xD0, 0x7F, 0xEC, 0x8F, 0x46, 0x6D, 0x0C, 0x20, 0x2A, 0xAE, 0xD1, 0x17, 0x92, - 0x45, 0x33, 0x62, 0xE0, 0x24, 0xD9, 0x46, 0x1E, 0x5E, 0xF9, 0xD0, 0x87, 0x2C, 0xBC, 0x9B, 0x0F, - 0xFD, 0x29, 0x33, 0xD2, 0xCB, 0x42, 0x9F, 0x85, 0x60, 0x9D, 0xA7, 0x2C, 0x8A, 0xDB, 0x55, 0xD2, - 0xC9, 0xA6, 0x06, 0xD7, 0xED, 0x24, 0x53, 0xC8, 0x5C, 0xD8, 0x2F, 0xD7, 0x37, 0xEF, 0xD8, 0x37, - 0x8F, 0x74, 0x12, 0xA0, 0x39, 0x11, 0xEA, 0xDD, 0x22, 0x62, 0x17, 0x32, 0xB8, 0x29, 0x87, 0x49, - 0x11, 0xCF, 0xAF, 0x82, 0x69, 0xBB, 0xED, 0x65, 0x61, 0x00, 0x20, 0xED, 0x20, 0xED, 0x04, 0xB4, - 0x13, 0x7C, 0x95, 0x4E, 0x8B, 0xCF, 0x4B, 0x1C, 0x23, 0xAF, 0xD3, 0x49, 0x4F, 0xB0, 0x8A, 0xE5, - 0x99, 0x76, 0x12, 0x5A, 0xE3, 0x44, 0x5A, 0x91, 0x0B, 0xC6, 0x5A, 0xE0, 0x85, 0xA7, 0xC1, 0x25, - 0x9D, 0xEC, 0x34, 0xEC, 0x3F, 0x3E, 0xF6, 0xED, 0x2F, 0x23, 0xC0, 0x99, 0xB0, 0xD1, 0xA7, 0xEA, - 0x23, 0xE9, 0x10, 0x23, 0x62, 0x68, 0x62, 0xF5, 0xA0, 0x75, 0xF4, 0xFD, 0x09, 0x52, 0xDF, 0x99, - 0xAA, 0xBE, 0x1B, 0xB0, 0x2E, 0x10, 0x85, 0x47, 0xFF, 0x09, 0x7D, 0x20, 0xBD, 0x42, 0x0C, 0x3B, - 0xED, 0xC1, 0xD1, 0x18, 0xF7, 0x16, 0xB7, 0x32, 0xFC, 0x5D, 0x89, 0x36, 0x68, 0x11, 0xA4, 0x38, - 0xC1, 0xFC, 0x6A, 0x40, 0xFF, 0x33, 0xA4, 0xFF, 0x19, 0x4D, 0xAD, 0x33, 0x63, 0x48, 0x41, 0xDC, - 0xD4, 0x83, 0xB8, 0xD9, 0x0C, 0x62, 0x44, 0x41, 0xC8, 0x80, 0x40, 0xA1, 0xFE, 0xD9, 0x9B, 0xC5, - 0x69, 0x82, 0x3C, 0x00, 0x8D, 0x4F, 0xEB, 0x64, 0xCE, 0x72, 0x94, 0x20, 0x33, 0x71, 0x79, 0xB5, - 0xD7, 0x9A, 0xFA, 0x4E, 0x54, 0xE4, 0x0B, 0x59, 0x52, 0x5C, 0xAF, 0xB2, 0x74, 0x86, 0xF2, 0xFC, - 0x17, 0xD9, 0x48, 0x38, 0x1C, 0x6B, 0xE4, 0x48, 0x15, 0x39, 0x6F, 0xFF, 0xBF, 0xD1, 0xE3, 0x23, - 0x3A, 0x1D, 0x01, 0x4A, 0xEA, 0x94, 0x5C, 0x88, 0xA3, 0x7B, 0x96, 0xD0, 0x2C, 0x44, 0x90, 0xF4, - 0x16, 0xB7, 0x8F, 0x61, 0xFF, 0xE0, 0x68, 0x38, 0x18, 0x0D, 0x47, 0x07, 0xCC, 0x98, 0x1D, 0xB1, - 0x47, 0xAB, 0xC5, 0x6D, 0x3B, 0xEC, 0xCA, 0x82, 0x43, 0x0A, 0x85, 0x0F, 0xEB, 0xA5, 0x80, 0xE5, - 0x01, 0x85, 0xDF, 0xE5, 0x8F, 0xEF, 0x7D, 0x7A, 0xAF, 0x42, 0x74, 0xED, 0x1C, 0x26, 0x43, 0x74, - 0xDD, 0x10, 0x5D, 0x14, 0x57, 0xD9, 0x0D, 0x2D, 0x53, 0x03, 0x42, 0xD5, 0x01, 0xA1, 0x5A, 0xF4, - 0x7D, 0x67, 0x19, 0x9B, 0xD9, 0x76, 0xD8, 0x3D, 0x38, 0x0C, 0xFC, 0xA3, 0xA3, 0x83, 0x21, 0x44, - 0x55, 0xCC, 0x2B, 0x99, 0xF2, 0xE8, 0xBE, 0x0D, 0x98, 0xA8, 0x24, 0x49, 0xDB, 0x37, 0x05, 0x27, - 0x7F, 0x5A, 0x0E, 0x51, 0xAA, 0x07, 0x2E, 0xCE, 0x79, 0xED, 0xE6, 0xC6, 0x38, 0x9C, 0x7E, 0xDB, - 0x12, 0xBB, 0x80, 0x7B, 0x42, 0x49, 0x26, 0x52, 0x69, 0xA4, 0x36, 0x4F, 0x16, 0xFA, 0x93, 0xEC, - 0x84, 0x4C, 0xB2, 0x4E, 0x07, 0x60, 0x8D, 0x41, 0x36, 0x85, 0xF8, 0x34, 0x1C, 0xF8, 0xED, 0x36, - 0x3E, 0x09, 0x07, 0x87, 0x67, 0x5E, 0xCE, 0x57, 0x48, 0x31, 0xB2, 0x9C, 0xAD, 0xA4, 0x64, 0x8B, - 0x8F, 0xB8, 0x3B, 0xF0, 0xC1, 0x18, 0x9F, 0x86, 0x43, 0xDE, 0x64, 0xC8, 0x9A, 0xDC, 0x94, 0x9A, - 0xDC, 0xD8, 0x4D, 0x86, 0xBC, 0xC9, 0x31, 0x6F, 0x72, 0xBC, 0xA1, 0x97, 0xFE, 0xF0, 0x11, 0x77, - 0x8F, 0x79, 0x93, 0xC0, 0xE7, 0x6D, 0x02, 0x7F, 0x43, 0x3F, 0xAC, 0x51, 0xE0, 0xFB, 0x60, 0x4C, - 0x27, 0x18, 0x9F, 0x55, 0xE7, 0x93, 0x9E, 0x7A, 0xAC, 0x48, 0xF4, 0x35, 0x18, 0xF6, 0x83, 0xC3, - 0xC3, 0xFE, 0x11, 0x93, 0x29, 0xE8, 0x57, 0x0A, 0x4C, 0x2E, 0x2E, 0x93, 0x63, 0x30, 0xC7, 0xD3, - 0xA4, 0x63, 0x0B, 0xAC, 0xB1, 0x7F, 0x6C, 0x2E, 0x9C, 0x81, 0xB3, 0x12, 0xEB, 0xCD, 0xC0, 0x95, - 0x3F, 0x1D, 0x07, 0x30, 0x17, 0xE7, 0x85, 0xC4, 0x42, 0x79, 0x39, 0x32, 0x71, 0x44, 0x7E, 0x55, - 0x58, 0x1C, 0x99, 0x08, 0xFB, 0x87, 0x83, 0xC3, 0x61, 0x70, 0xD4, 0x1F, 0x32, 0xE1, 0x44, 0x7E, - 0xEE, 0x07, 0xC3, 0xC3, 0xE1, 0xD1, 0xE0, 0x60, 0x78, 0x34, 0xEE, 0x1B, 0x03, 0xD1, 0xC3, 0xEB, - 0x07, 0xD5, 0x09, 0xD1, 0x98, 0xF7, 0x61, 0x0E, 0xC6, 0xFD, 0xBE, 0x1E, 0x2D, 0x3D, 0x03, 0x45, - 0xDB, 0x63, 0x28, 0x66, 0x5C, 0x7D, 0x00, 0xE3, 0xBE, 0x9E, 0x2D, 0xBD, 0x17, 0x46, 0xE3, 0xFE, - 0xD0, 0x82, 0xA0, 0xF6, 0x77, 0xDD, 0x84, 0xF9, 0x6C, 0x26, 0xFA, 0x7A, 0x2A, 0x4C, 0x07, 0xCE, - 0x71, 0xFF, 0xD0, 0xFC, 0xAE, 0x3B, 0x39, 0x32, 0x3F, 0xAB, 0xF9, 0x18, 0x8D, 0xFB, 0xC7, 0x46, - 0x81, 0x9A, 0x90, 0xC3, 0xF1, 0xE0, 0xD8, 0xC2, 0x4A, 0xED, 0x5C, 0x8B, 0xA6, 0x47, 0x6D, 0x37, - 0x6B, 0x01, 0xE3, 0xA1, 0x6A, 0x7E, 0x53, 0x6A, 0x7E, 0xB3, 0xA9, 0xF9, 0xCD, 0x2D, 0x18, 0x0F, - 0x18, 0xBA, 0x8F, 0x8F, 0x43, 0xF1, 0xEF, 0x88, 0xA3, 0x9F, 0x75, 0xC4, 0x2E, 0x2D, 0x09, 0x03, - 0x19, 0x5D, 0x89, 0x91, 0xEA, 0x52, 0xB1, 0xAE, 0xBC, 0xCA, 0xBA, 0xF2, 0xDA, 0x83, 0xA2, 0x1B, - 0xC0, 0xBC, 0xC2, 0x96, 0x98, 0xB8, 0xF7, 0x15, 0x33, 0x01, 0x9F, 0x38, 0x01, 0x75, 0x57, 0x62, - 0x99, 0xB6, 0xFF, 0xF2, 0xC7, 0xF7, 0x7B, 0x91, 0xE4, 0x96, 0xE3, 0xBD, 0x3F, 0xCC, 0x7B, 0x2D, - 0x88, 0x0D, 0x77, 0xE2, 0x52, 0xBA, 0xD0, 0x87, 0xB2, 0x12, 0x4D, 0x9D, 0xEF, 0xAE, 0xFB, 0x72, - 0xB3, 0x10, 0xE9, 0x27, 0xBF, 0x97, 0x14, 0x54, 0x0D, 0x5E, 0x73, 0xF7, 0x9D, 0x00, 0x3A, 0xCD, - 0x38, 0xBE, 0x74, 0x82, 0xC9, 0xAE, 0x3D, 0x7F, 0xF7, 0x80, 0xA8, 0xCC, 0x4A, 0x8A, 0xF7, 0xBF, - 0x1B, 0x5E, 0x6A, 0xEE, 0x3C, 0xA6, 0xF4, 0xF4, 0x38, 0x28, 0x9D, 0x17, 0x0F, 0xFF, 0x53, 0x88, - 0x9E, 0xB9, 0x31, 0x35, 0x33, 0xA2, 0x96, 0x22, 0xF5, 0x34, 0xA9, 0xD4, 0xB7, 0xB9, 0xA3, 0xD7, - 0x9B, 0xDE, 0x7C, 0x48, 0x57, 0xEE, 0x00, 0xB7, 0xA6, 0x65, 0x4E, 0x83, 0x3B, 0x0A, 0xAC, 0x9C, - 0x8B, 0x4E, 0x99, 0x41, 0xEE, 0xAF, 0xEA, 0x78, 0x32, 0x9E, 0x5A, 0xC9, 0xFD, 0x86, 0x6A, 0x17, - 0xDA, 0xF8, 0x45, 0x9F, 0xD0, 0xFC, 0xCF, 0x35, 0xB8, 0xD3, 0xB2, 0xBF, 0xD4, 0xFA, 0xEE, 0xD4, - 0x36, 0x39, 0x37, 0x3C, 0xDF, 0x95, 0x50, 0x3B, 0xB3, 0x3E, 0x6E, 0xD5, 0xF6, 0xC6, 0xD5, 0xF6, - 0xA6, 0xA1, 0x2D, 0x1F, 0x75, 0x73, 0x34, 0xF1, 0x5D, 0xF4, 0xBC, 0xFC, 0x15, 0xDF, 0xCE, 0x84, - 0xEB, 0x0A, 0x18, 0xF0, 0xF8, 0x18, 0x28, 0x57, 0x6F, 0xA5, 0x36, 0xB7, 0x9E, 0xDD, 0x1B, 0x75, - 0xB9, 0x5C, 0xA8, 0x6B, 0xDD, 0xC4, 0xE9, 0xEC, 0x63, 0xAB, 0xE4, 0x2A, 0x6B, 0x3E, 0x1A, 0x6C, - 0x03, 0x44, 0xB1, 0x5B, 0x0B, 0xD0, 0x68, 0x6C, 0x69, 0xB9, 0xB7, 0xC2, 0x26, 0xCA, 0x5A, 0x85, - 0xD2, 0x18, 0xFD, 0xA1, 0x1F, 0x86, 0x81, 0x6D, 0xFF, 0xBE, 0x85, 0x7A, 0x1A, 0x8B, 0x19, 0x2C, - 0xA5, 0x00, 0xAE, 0x9B, 0x42, 0x2E, 0x29, 0xF2, 0x4E, 0x54, 0x7C, 0x94, 0x93, 0xFE, 0xE3, 0xA3, - 0x67, 0xC8, 0x83, 0xC1, 0x14, 0x9C, 0xD6, 0xED, 0xA3, 0xC7, 0x47, 0x76, 0x8A, 0xD0, 0x0B, 0x40, - 0xBD, 0xCF, 0x33, 0x80, 0xF8, 0xB4, 0x26, 0xFE, 0x86, 0xDE, 0xCB, 0xC4, 0x1D, 0x2C, 0xC5, 0xDA, - 0xCD, 0xB8, 0xEB, 0x7E, 0x09, 0x60, 0x16, 0x2F, 0xE5, 0x4C, 0xC3, 0xCC, 0x40, 0xEC, 0x6B, 0x22, - 0x93, 0xBA, 0xAC, 0xC7, 0x44, 0x04, 0x99, 0xE0, 0xCC, 0x98, 0x9D, 0xB1, 0x3F, 0xA9, 0x3D, 0x86, - 0x82, 0xE1, 0x58, 0x84, 0xAA, 0x28, 0x31, 0xBB, 0x5F, 0x59, 0x57, 0xB9, 0xE8, 0x8B, 0x67, 0x60, - 0xE4, 0x3C, 0xEF, 0xBE, 0xF7, 0xE3, 0xCB, 0x0F, 0xD7, 0xBF, 0x5E, 0xBC, 0xB9, 0xBE, 0xBC, 0xF8, - 0xDF, 0x2F, 0x85, 0x6A, 0xC5, 0xD6, 0xDA, 0x2A, 0xAA, 0xDA, 0x16, 0x1A, 0x8B, 0xCA, 0x5C, 0x0B, - 0xEE, 0xC8, 0xA5, 0xF0, 0xDD, 0xCA, 0x06, 0xC9, 0x3A, 0x1D, 0x8E, 0xE8, 0xC9, 0x50, 0x43, 0x02, - 0x45, 0x4D, 0xD9, 0x2C, 0x8D, 0xF3, 0x82, 0xD8, 0x07, 0x6F, 0xBF, 0x3F, 0xF6, 0xF9, 0x9C, 0xF5, - 0xAD, 0xF0, 0x1E, 0x7C, 0x75, 0x58, 0x3E, 0x51, 0x91, 0x71, 0x65, 0x9D, 0x2F, 0xAB, 0x65, 0x92, - 0xE9, 0x56, 0xAA, 0xCB, 0xB5, 0x53, 0xB1, 0x27, 0x2B, 0x35, 0x58, 0xBC, 0x39, 0x0F, 0x00, 0x28, - 0xFA, 0x0F, 0xAC, 0xFE, 0xB1, 0xC8, 0x8B, 0x5A, 0xE9, 0x5C, 0x16, 0xC8, 0x9E, 0xED, 0x8A, 0x95, - 0x6E, 0xED, 0x62, 0xD9, 0xA7, 0x35, 0x03, 0x83, 0xD2, 0x0C, 0x34, 0x8E, 0x48, 0xC0, 0x55, 0xB9, - 0x56, 0xEB, 0x66, 0x2B, 0x5D, 0x55, 0x87, 0x56, 0x8F, 0xB0, 0x86, 0xAA, 0xF2, 0xC1, 0x3A, 0xA7, - 0x81, 0x41, 0x35, 0x64, 0x01, 0x33, 0x69, 0x78, 0x43, 0x10, 0x52, 0x71, 0x0A, 0xBA, 0x04, 0x93, - 0x27, 0x1C, 0x8C, 0x6E, 0xCF, 0xE9, 0xFF, 0x27, 0x4F, 0x4B, 0xFE, 0x90, 0x6C, 0xE5, 0x3A, 0x6F, - 0x8C, 0xE5, 0x5A, 0x3B, 0xB7, 0x8F, 0x8F, 0xEE, 0x38, 0x7E, 0x8D, 0x61, 0x14, 0xF8, 0x3C, 0x3B, - 0x23, 0xA6, 0x31, 0x01, 0x44, 0x85, 0x57, 0x98, 0xB9, 0xE6, 0x70, 0xD3, 0x54, 0x3B, 0xDA, 0xDE, - 0x6C, 0xD7, 0x56, 0xCD, 0xAA, 0x7B, 0xD6, 0x04, 0x0C, 0x73, 0x96, 0x37, 0xAD, 0x82, 0x8E, 0x32, - 0xD4, 0x04, 0xB1, 0xB6, 0x79, 0x6D, 0xA8, 0x3F, 0x7E, 0xFE, 0xCA, 0xAC, 0xC7, 0xF6, 0xD2, 0x19, - 0x7B, 0x52, 0xC5, 0x10, 0x4C, 0x13, 0xF6, 0xF7, 0xF9, 0x32, 0x4A, 0x6E, 0x45, 0x46, 0x18, 0x24, - 0xA1, 0x18, 0x99, 0x98, 0x6D, 0x40, 0x72, 0x0F, 0x86, 0x48, 0xD4, 0xAC, 0x49, 0x8D, 0xAC, 0xCE, - 0xFD, 0xAB, 0x29, 0xA4, 0x27, 0xBA, 0x48, 0xE0, 0x34, 0x69, 0x71, 0x0D, 0xEA, 0x04, 0x2B, 0xEE, - 0x34, 0xD1, 0xB7, 0x08, 0x2C, 0x79, 0x12, 0xCC, 0xF5, 0xEF, 0x09, 0x5E, 0x78, 0xCF, 0xFE, 0xCF, - 0x6F, 0xF3, 0xCE, 0x77, 0xCF, 0x7A, 0xE8, 0x0B, 0x9A, 0x79, 0xC8, 0x50, 0x2A, 0x33, 0x93, 0xE8, - 0x8B, 0x84, 0xCA, 0xFF, 0xB4, 0x9E, 0x7F, 0x12, 0xE2, 0x76, 0x1B, 0x9F, 0xF4, 0x47, 0x07, 0x00, - 0x2F, 0xBC, 0xD6, 0x19, 0x7F, 0x79, 0x20, 0x9C, 0x67, 0x3E, 0x90, 0xFB, 0x15, 0x1A, 0xFB, 0x90, - 0x59, 0x98, 0x8E, 0x71, 0x01, 0x58, 0x3C, 0x5E, 0xD5, 0xBB, 0xE7, 0xC3, 0x4B, 0x9E, 0xBF, 0x87, - 0x0D, 0x02, 0x78, 0x39, 0x98, 0xD0, 0xC3, 0xC8, 0x6C, 0x1C, 0xC8, 0xC6, 0x70, 0x46, 0xEB, 0x8C, - 0x51, 0x01, 0x8A, 0x42, 0x99, 0xFB, 0x97, 0x92, 0x4C, 0xA5, 0x09, 0x03, 0x24, 0x62, 0x94, 0xCA, - 0xA9, 0x35, 0x33, 0x3E, 0x1B, 0xD2, 0x91, 0x31, 0x41, 0x82, 0xA5, 0x79, 0x44, 0x89, 0x45, 0x54, - 0xCA, 0x21, 0x57, 0xC1, 0x54, 0x5A, 0xF9, 0x66, 0x28, 0x22, 0x48, 0x03, 0x22, 0x4C, 0xC4, 0xA0, - 0xE2, 0xD2, 0x78, 0x9F, 0xFE, 0x96, 0x08, 0x2C, 0x70, 0x82, 0xF3, 0xA5, 0xAE, 0x07, 0x40, 0x51, - 0x69, 0x6B, 0x84, 0x77, 0xAC, 0xCF, 0x76, 0x52, 0x01, 0x34, 0xD1, 0x5A, 0x7D, 0x81, 0xF8, 0xB8, - 0x05, 0x84, 0x2F, 0x3F, 0x2F, 0xCA, 0x42, 0xDC, 0x5B, 0xE0, 0x64, 0xCE, 0xF3, 0xDC, 0xF2, 0x8C, - 0x5D, 0x2C, 0x71, 0x50, 0xFE, 0x2B, 0x26, 0x4B, 0xAF, 0x85, 0xE7, 0x61, 0x4B, 0xFB, 0xBA, 0x76, - 0xE9, 0xA9, 0x90, 0xB1, 0x24, 0x2E, 0xF8, 0x2A, 0x9B, 0xF6, 0x72, 0xE6, 0xF1, 0x39, 0x50, 0xD1, - 0x84, 0x5D, 0x9B, 0x5F, 0x2B, 0x88, 0x6B, 0x8B, 0xCA, 0x97, 0xA8, 0xDA, 0xDC, 0x74, 0xF2, 0xE9, - 0xD1, 0xCE, 0xEA, 0x22, 0x43, 0xAA, 0xB3, 0xA4, 0x2E, 0x0F, 0x78, 0x3E, 0xCE, 0xE1, 0x3A, 0xC3, - 0x63, 0x52, 0xB8, 0x00, 0x96, 0x15, 0x1D, 0xCC, 0x16, 0xBA, 0x32, 0x71, 0x9B, 0x93, 0xE5, 0x7D, - 0x93, 0xE1, 0xF8, 0xDB, 0x22, 0x68, 0xEC, 0xE0, 0xCB, 0x15, 0x9A, 0xE1, 0x28, 0x56, 0xEF, 0x41, - 0xE6, 0xD3, 0x4D, 0x69, 0xFB, 0x6A, 0x27, 0x05, 0xFD, 0x18, 0xB3, 0xEF, 0x11, 0x19, 0x1D, 0x29, - 0x37, 0x20, 0xE9, 0x97, 0x93, 0x4E, 0x07, 0xC1, 0x4E, 0x87, 0xE8, 0x8D, 0x89, 0xAF, 0xD0, 0x14, - 0x38, 0xB6, 0xCA, 0x95, 0xBD, 0x51, 0x1D, 0x30, 0xAF, 0xC8, 0xB4, 0x98, 0x5A, 0xDB, 0x37, 0xAF, - 0x6E, 0x5F, 0x06, 0x7E, 0x92, 0x3B, 0x77, 0xE3, 0x95, 0xBD, 0x9D, 0xDD, 0x5D, 0x88, 0x3D, 0x9E, - 0x17, 0x53, 0x60, 0x99, 0x7A, 0x57, 0x73, 0xAC, 0x57, 0xC2, 0x1F, 0xD6, 0xCC, 0xA9, 0x0F, 0x0A, - 0x67, 0x36, 0xF5, 0x6D, 0xDB, 0x07, 0x56, 0x7B, 0x3B, 0xC5, 0xF7, 0xB6, 0x30, 0xFA, 0xA0, 0x70, - 0x27, 0x48, 0x67, 0xD7, 0x16, 0x04, 0x4A, 0x69, 0x01, 0xAA, 0x93, 0xD6, 0x2F, 0xA6, 0x96, 0xF6, - 0xDF, 0xCD, 0xE1, 0xAB, 0x24, 0xC2, 0xDD, 0x59, 0x4A, 0xCC, 0x9C, 0x2D, 0x92, 0x7E, 0x77, 0x54, - 0xFC, 0x9C, 0x2F, 0x9E, 0x7F, 0x12, 0xE6, 0xED, 0x76, 0x4E, 0xF9, 0x79, 0x89, 0x11, 0xF7, 0xC5, - 0xCA, 0xE5, 0x05, 0xD8, 0x81, 0xFD, 0x56, 0x32, 0xB8, 0x97, 0x93, 0x20, 0x38, 0x46, 0x2B, 0x3A, - 0xEA, 0x8F, 0x0E, 0xF8, 0xB8, 0x8B, 0x4A, 0xCE, 0xF6, 0x5D, 0x80, 0x1C, 0xDA, 0x40, 0x9A, 0x96, - 0xB0, 0x19, 0xD0, 0x91, 0x00, 0xA4, 0x53, 0x9A, 0x6F, 0x08, 0xBC, 0xCF, 0x3E, 0x8B, 0x04, 0xEA, - 0xB4, 0x61, 0x4D, 0x02, 0xF1, 0x87, 0x4A, 0xC2, 0xCB, 0x7F, 0x44, 0x9B, 0x6D, 0x3D, 0x00, 0x2B, - 0x63, 0xF9, 0x46, 0xE4, 0xFF, 0x9E, 0x56, 0x6D, 0x50, 0x05, 0xA5, 0x2C, 0x67, 0xC2, 0xDE, 0x3E, - 0xC8, 0x78, 0x6D, 0x8D, 0x46, 0xC7, 0x0E, 0xD5, 0xB1, 0xAC, 0xA5, 0x49, 0xAD, 0xBF, 0xAF, 0xDF, - 0x03, 0x45, 0x00, 0x6B, 0x37, 0x8E, 0x70, 0xDF, 0x07, 0x63, 0xAF, 0xF5, 0x8C, 0x32, 0x6E, 0xC4, - 0x94, 0x38, 0x1B, 0x71, 0xB9, 0xBB, 0xA2, 0x15, 0xA7, 0x50, 0xA7, 0xF5, 0xBE, 0x42, 0x57, 0xC1, - 0x74, 0xFA, 0xF8, 0xE8, 0xC4, 0x11, 0x14, 0x82, 0x3A, 0x1F, 0x76, 0x4E, 0xEB, 0xF0, 0xAF, 0x96, - 0x05, 0xA4, 0x26, 0xC6, 0xFF, 0x65, 0x95, 0x98, 0x2C, 0xD0, 0xF5, 0x91, 0x6A, 0xE9, 0xB6, 0x63, - 0x5C, 0x89, 0x99, 0x05, 0x5D, 0x88, 0x75, 0xA8, 0x4B, 0x87, 0x51, 0x13, 0x79, 0xBE, 0x61, 0xB2, - 0x3F, 0xA4, 0xAB, 0xC6, 0xC7, 0x82, 0x4D, 0x51, 0xB3, 0xB5, 0x13, 0xB1, 0xA3, 0x50, 0x44, 0x09, - 0xA1, 0xD7, 0x85, 0x97, 0x31, 0xBA, 0x43, 0x09, 0x69, 0x88, 0xEA, 0xE9, 0xBC, 0xAF, 0xA3, 0xE6, - 0xF8, 0x23, 0xBB, 0xBA, 0xC6, 0x3E, 0x35, 0xF0, 0x4B, 0x83, 0xBF, 0xEA, 0xB7, 0x72, 0x18, 0xE6, - 0x69, 0xC6, 0x1A, 0x29, 0xBE, 0xE2, 0x3B, 0xAC, 0x64, 0x9F, 0xC5, 0x3A, 0x8E, 0xF9, 0x73, 0x4B, - 0x5D, 0x0A, 0x22, 0xF3, 0xED, 0xC1, 0x69, 0x89, 0x0D, 0xA5, 0xB9, 0xBA, 0x27, 0x6F, 0x1D, 0xBB, - 0xBD, 0x83, 0x58, 0x73, 0x76, 0x91, 0x10, 0x94, 0x25, 0x51, 0xDC, 0xD4, 0xAE, 0x28, 0x4F, 0xB3, - 0x8D, 0xB9, 0x13, 0x5E, 0xE9, 0x85, 0xB1, 0xB9, 0xA6, 0x7A, 0x21, 0x1F, 0xB4, 0x1B, 0x74, 0x32, - 0xCE, 0xD6, 0x85, 0xE6, 0xED, 0x95, 0xF7, 0xAB, 0xBA, 0x43, 0x00, 0xC9, 0x60, 0x21, 0xCE, 0x5C, - 0xF2, 0x3A, 0x55, 0x26, 0xFA, 0xBC, 0xB7, 0xEE, 0x9D, 0xA3, 0x38, 0x66, 0x86, 0x17, 0x48, 0xE6, - 0x2A, 0x0B, 0x83, 0x93, 0x93, 0x7E, 0xFF, 0xB1, 0xF5, 0xB2, 0x65, 0xA7, 0x3E, 0x83, 0xA8, 0x56, - 0x21, 0x85, 0x36, 0xA8, 0x9B, 0x4A, 0xB6, 0xF1, 0xB6, 0xE3, 0x41, 0x1D, 0x2F, 0x9B, 0xD0, 0x9B, - 0x40, 0x93, 0xA7, 0x7F, 0xFD, 0xEE, 0xEA, 0x10, 0x77, 0xE2, 0x70, 0x23, 0xD6, 0x2A, 0x13, 0xFB, - 0xBD, 0x9C, 0x47, 0x10, 0x46, 0x00, 0xE6, 0xA5, 0xA8, 0xC5, 0x1B, 0xFD, 0xF3, 0x9F, 0xC7, 0x31, - 0xDF, 0x6C, 0xD5, 0x1C, 0x07, 0xBE, 0x08, 0x82, 0x5E, 0x97, 0x04, 0xBF, 0x34, 0x28, 0x97, 0x2D, - 0xB3, 0xC2, 0xBF, 0xF6, 0x41, 0x40, 0xBD, 0x8C, 0xA8, 0xD4, 0xFF, 0x5B, 0x6B, 0xC3, 0xBF, 0x7B, - 0x40, 0x85, 0xF1, 0xE7, 0x6F, 0xBF, 0xFD, 0xCE, 0x93, 0x5E, 0x7A, 0x7F, 0x6C, 0xFD, 0xF5, 0x8F, - 0x2C, 0x2B, 0xCF, 0xEF, 0xEF, 0x82, 0xEF, 0xB2, 0xEF, 0xAA, 0xDB, 0xAF, 0x87, 0x73, 0x1D, 0x2E, - 0x1B, 0x9C, 0x05, 0x63, 0xBF, 0x68, 0xFD, 0xF5, 0xF7, 0xF1, 0x1F, 0x5B, 0x2B, 0xDE, 0xEE, 0x8F, - 0xB4, 0xDD, 0x41, 0x30, 0x09, 0x5A, 0xAB, 0x3F, 0x8E, 0x5B, 0x59, 0xCB, 0x04, 0x86, 0x8D, 0xEC, - 0x15, 0x41, 0x31, 0xD1, 0x1F, 0xE4, 0x31, 0x5B, 0x64, 0xBF, 0x8F, 0x5B, 0x77, 0xBC, 0x4D, 0x8B, - 0xB6, 0xF1, 0xEF, 0x5A, 0xE3, 0xD6, 0xDE, 0x5F, 0x2D, 0x28, 0x0F, 0xEC, 0x5D, 0x6C, 0xDC, 0x87, - 0xEA, 0x69, 0x6B, 0x3C, 0x84, 0x37, 0x51, 0x36, 0x3E, 0x28, 0xAE, 0xAC, 0x37, 0xAB, 0x69, 0xD7, - 0xB3, 0x9E, 0x9F, 0x28, 0xB2, 0xA0, 0xD8, 0xFB, 0xEB, 0xEF, 0xE3, 0xD6, 0x3B, 0xFF, 0xBB, 0xAC, - 0x05, 0x8A, 0x12, 0xD3, 0xDC, 0x90, 0xFF, 0xA3, 0x54, 0xB3, 0x28, 0x48, 0xEF, 0x22, 0x59, 0xAD, - 0x89, 0x48, 0x9B, 0x16, 0xBE, 0x64, 0xBA, 0x8D, 0xD7, 0xE1, 0x2C, 0x8E, 0xF2, 0x9C, 0xAF, 0x70, - 0xB6, 0x9E, 0x11, 0x2E, 0xB5, 0x3B, 0x16, 0x5A, 0x2A, 0xD9, 0xCC, 0xF4, 0xDF, 0x85, 0xF9, 0x07, - 0x6F, 0xC4, 0x14, 0x22, 0x0D, 0x84, 0x22, 0x8F, 0x12, 0x94, 0xCC, 0x1B, 0x6B, 0x15, 0x3A, 0xA4, - 0x01, 0x02, 0x0F, 0xE8, 0x44, 0x03, 0x3F, 0x33, 0xFA, 0x41, 0x63, 0x74, 0x2A, 0xC1, 0x49, 0xD9, - 0x83, 0x42, 0x46, 0xEE, 0xD9, 0x42, 0xEC, 0xE9, 0xEC, 0x73, 0x88, 0x20, 0x0A, 0x09, 0x24, 0xE1, - 0x67, 0x00, 0x4D, 0xC8, 0x12, 0x82, 0x80, 0x0D, 0x20, 0x71, 0x02, 0x27, 0x1C, 0xB8, 0xDE, 0x50, - 0x7C, 0xE4, 0xA5, 0x0E, 0x1B, 0x4D, 0xEA, 0x8B, 0x62, 0xF2, 0x3A, 0xCC, 0xBD, 0x2B, 0xBA, 0xF7, - 0x3E, 0xF5, 0x2E, 0x7E, 0x30, 0xEB, 0x80, 0x29, 0x7C, 0x0D, 0x0A, 0x78, 0x34, 0x1C, 0x8E, 0x19, - 0xD6, 0xE1, 0xE9, 0xC3, 0x62, 0x9D, 0xCC, 0xD8, 0x45, 0x04, 0x4B, 0x3F, 0x28, 0x71, 0x53, 0xDD, - 0x4B, 0x17, 0x7B, 0x08, 0x90, 0xDE, 0x1C, 0xE7, 0xAB, 0x34, 0x47, 0x1E, 0x98, 0x48, 0xC9, 0x37, - 0xF4, 0x8B, 0xB7, 0x37, 0xFF, 0x17, 0xCD, 0x48, 0x6F, 0x8E, 0x16, 0x38, 0x41, 0xEF, 0xB2, 0x74, - 0x85, 0xD8, 0x59, 0x0B, 0x5B, 0xD7, 0xD7, 0x28, 0xFF, 0x39, 0x9D, 0xAF, 0x63, 0xD4, 0x82, 0x0F, - 0x9F, 0xA2, 0x78, 0x8D, 0xC6, 0xFB, 0x7E, 0x01, 0x20, 0xA1, 0xAC, 0xE6, 0x05, 0x07, 0xC5, 0x22, - 0x38, 0xF0, 0xDF, 0xD1, 0x4D, 0x8C, 0x42, 0xD5, 0x07, 0x2B, 0x08, 0x49, 0x8F, 0xA4, 0x56, 0xA9, - 0xF1, 0x07, 0xD7, 0x6F, 0x41, 0xEB, 0x5B, 0x95, 0xCA, 0x34, 0xED, 0xCA, 0x4A, 0x39, 0xBD, 0x77, - 0x0B, 0x9D, 0x6C, 0x2E, 0xD0, 0x60, 0xB1, 0x47, 0xD4, 0xE8, 0x1E, 0xAA, 0xA5, 0xFE, 0x44, 0x4F, - 0x07, 0xA2, 0xD3, 0x51, 0x81, 0x0A, 0x90, 0x31, 0x3D, 0x95, 0x52, 0x3D, 0x5D, 0x52, 0x35, 0x56, - 0x39, 0xB8, 0xCC, 0xDA, 0xEC, 0xBE, 0x8E, 0x00, 0x44, 0xC5, 0x3A, 0x31, 0x1B, 0xD8, 0xC1, 0x48, - 0xCC, 0x16, 0xDA, 0xF9, 0x7F, 0xC2, 0x54, 0x82, 0xEA, 0xF9, 0xD2, 0xAC, 0x24, 0xE3, 0xC1, 0x41, - 0x4A, 0x1A, 0xB0, 0x34, 0xB9, 0x72, 0xF5, 0x35, 0x62, 0x0F, 0x62, 0x40, 0x63, 0xC4, 0x6A, 0x5B, - 0x2B, 0x83, 0x1B, 0x97, 0xB1, 0x01, 0x96, 0x07, 0xC2, 0x53, 0x4A, 0x5F, 0x45, 0x51, 0xC0, 0x60, - 0xE4, 0x8F, 0x14, 0xF5, 0x3D, 0x81, 0x8E, 0x5E, 0xA5, 0xEB, 0xEC, 0x4F, 0xE8, 0xFE, 0xE7, 0x68, - 0x15, 0x92, 0xDE, 0x87, 0xCF, 0xA9, 0xF8, 0xCD, 0x29, 0x63, 0xC2, 0x88, 0x61, 0x0F, 0xBB, 0xC9, - 0x81, 0x0A, 0x4D, 0x0F, 0x45, 0xC1, 0xEE, 0x74, 0xDC, 0x82, 0x5B, 0x17, 0x5C, 0xA1, 0xA9, 0x7A, - 0x41, 0x14, 0x7F, 0xB3, 0x84, 0x13, 0xD6, 0x97, 0x2B, 0x32, 0x0D, 0x71, 0x71, 0xCB, 0xDB, 0x97, - 0x97, 0x92, 0x57, 0x39, 0x2B, 0x37, 0x18, 0x73, 0xCC, 0x38, 0x3F, 0xAB, 0xE0, 0x52, 0x98, 0x63, - 0xC0, 0xF6, 0xF0, 0x1A, 0x08, 0x9B, 0xB6, 0xA6, 0x42, 0x0B, 0x56, 0x83, 0xC9, 0x61, 0x06, 0x13, - 0xB3, 0xBC, 0x27, 0xD1, 0x94, 0x77, 0x4F, 0xF6, 0x51, 0x56, 0x67, 0x8D, 0xCD, 0xD1, 0xA9, 0xEA, - 0xAC, 0x0A, 0x87, 0x26, 0x47, 0x0A, 0x31, 0xCC, 0x79, 0xF2, 0xC1, 0x4C, 0x5A, 0x3A, 0xC8, 0x74, - 0x78, 0xD2, 0xC0, 0xD9, 0x02, 0x61, 0xA6, 0xB5, 0xCB, 0x64, 0x5A, 0xBB, 0x8C, 0x0B, 0x1B, 0x30, - 0x07, 0x8E, 0xA9, 0xE8, 0x89, 0x4F, 0x94, 0x40, 0x0E, 0x82, 0x60, 0xF8, 0x35, 0x04, 0x82, 0xF3, - 0xF3, 0x65, 0x96, 0xDE, 0xA1, 0xB7, 0x97, 0x21, 0xFD, 0xE3, 0x35, 0x4E, 0xD6, 0x5F, 0xD8, 0x2F, - 0xF1, 0xFA, 0xCE, 0x7E, 0x5F, 0xAC, 0x96, 0x69, 0x82, 0xC4, 0xCF, 0x68, 0xCE, 0x7E, 0xFC, 0x1C, - 0xCD, 0x42, 0x46, 0xE0, 0x97, 0xD1, 0x22, 0xCA, 0xF0, 0x7F, 0xA2, 0x2C, 0xC7, 0x69, 0xC2, 0x8A, - 0xF8, 0x17, 0x0E, 0x0F, 0xDD, 0x46, 0xB3, 0xFB, 0x97, 0xF3, 0x5B, 0xDE, 0xFA, 0x15, 0xCE, 0xD0, - 0x22, 0xE5, 0x1D, 0xBC, 0x49, 0xE7, 0x06, 0x8B, 0x12, 0x7F, 0x33, 0xC3, 0x13, 0x8A, 0xFD, 0xBC, - 0x15, 0x86, 0xE4, 0x7E, 0x85, 0xD2, 0xC5, 0x5E, 0x12, 0x7D, 0xC2, 0xB7, 0x11, 0x49, 0x33, 0x1D, - 0x06, 0x58, 0x54, 0x3F, 0x6B, 0x25, 0xE9, 0x1C, 0xB5, 0xC6, 0xAA, 0x46, 0x6F, 0x9D, 0xA3, 0xEC, - 0xF9, 0x2D, 0x4A, 0x98, 0x1C, 0x57, 0x5B, 0x6B, 0x15, 0x47, 0x64, 0x91, 0x66, 0x77, 0x13, 0x13, - 0x27, 0xDC, 0xC3, 0xC9, 0x2C, 0x5E, 0xCF, 0x51, 0xEE, 0xB5, 0xC4, 0xB7, 0x16, 0x9F, 0x21, 0x63, - 0x10, 0x66, 0x25, 0xFA, 0x41, 0xD4, 0x10, 0x23, 0x7E, 0xF6, 0x7F, 0x3C, 0xEF, 0x6C, 0x7F, 0xC6, - 0x26, 0xF4, 0x31, 0x4A, 0xE6, 0x59, 0x8A, 0xE7, 0xA0, 0x07, 0xBE, 0xCF, 0x59, 0xF1, 0x33, 0xDC, - 0x23, 0x28, 0x27, 0x2C, 0x75, 0x40, 0x75, 0xE2, 0x14, 0x43, 0x10, 0x41, 0x80, 0x14, 0x54, 0xA9, - 0x35, 0xD5, 0x99, 0xF2, 0x70, 0xEF, 0x2E, 0x22, 0xB3, 0xA5, 0xF7, 0x4C, 0xB4, 0xFD, 0xED, 0x99, - 0xF7, 0xDB, 0xBC, 0x03, 0x9E, 0x81, 0x12, 0xBD, 0xA1, 0xC7, 0x47, 0x6D, 0xFE, 0x72, 0xE6, 0x8F, - 0xF5, 0x8B, 0xD6, 0x55, 0x30, 0x05, 0x05, 0x94, 0xCB, 0x78, 0xD5, 0xFA, 0x39, 0x9A, 0xE1, 0x84, - 0xA4, 0xF9, 0xB2, 0x05, 0xE9, 0x6F, 0x7A, 0x89, 0x88, 0xF9, 0xCF, 0x77, 0xEF, 0xCE, 0xF9, 0x8F, - 0x83, 0xA3, 0x3F, 0xB5, 0xA6, 0x7A, 0xF4, 0x39, 0x1F, 0x38, 0x23, 0x87, 0x16, 0x7E, 0x17, 0xCD, - 0xD9, 0x73, 0x18, 0x34, 0xA8, 0xA5, 0x85, 0xDF, 0xD1, 0x7F, 0xF5, 0x77, 0x49, 0x51, 0x57, 0x2D, - 0xF1, 0xAB, 0x05, 0xE9, 0xAF, 0xE0, 0x80, 0xFF, 0x3B, 0xE8, 0xF3, 0x7F, 0xCF, 0x5F, 0x3A, 0xFA, - 0xE1, 0x74, 0xA9, 0x99, 0x78, 0xEB, 0x35, 0x8F, 0x4D, 0x73, 0x1A, 0xFA, 0x36, 0x11, 0x3F, 0xFB, - 0xED, 0xE6, 0x3C, 0x7B, 0x7B, 0xF9, 0xDB, 0xCD, 0x33, 0x39, 0xD9, 0x74, 0x8F, 0xF8, 0x07, 0x5F, - 0xB3, 0x47, 0x2E, 0x99, 0x1F, 0xE3, 0x6B, 0x9C, 0x13, 0xC9, 0x38, 0x99, 0x89, 0x11, 0xBD, 0x84, - 0x98, 0x65, 0x0D, 0x02, 0xDC, 0x2D, 0x22, 0x7F, 0x42, 0xF7, 0x3A, 0xC5, 0x1A, 0x3B, 0x20, 0xAE, - 0xA6, 0xA5, 0xBD, 0xCD, 0x3E, 0xEB, 0x73, 0x90, 0xBB, 0x94, 0x51, 0x20, 0xCC, 0xBC, 0xA1, 0x52, - 0xE5, 0x4C, 0x59, 0x27, 0xE5, 0x28, 0xCA, 0x54, 0x9C, 0x7F, 0xDE, 0x17, 0x3D, 0x1B, 0x7D, 0x58, - 0x6D, 0x64, 0xA4, 0x7B, 0x65, 0x5F, 0x8D, 0x38, 0xE6, 0x48, 0x6B, 0x99, 0x58, 0x91, 0x38, 0x62, - 0x45, 0x78, 0x38, 0xA1, 0xC5, 0x37, 0xA2, 0xF5, 0x1B, 0x50, 0xA5, 0x55, 0x51, 0x50, 0x0A, 0x06, - 0xA6, 0x70, 0x99, 0xE0, 0x85, 0xA7, 0xB8, 0x1C, 0xD1, 0xD5, 0xF1, 0xA2, 0x32, 0x88, 0x5A, 0xB4, - 0x99, 0x0F, 0x0C, 0xB6, 0xDA, 0x5A, 0xBD, 0x18, 0xAD, 0xAE, 0xF0, 0x14, 0xEC, 0x5B, 0x1D, 0x71, - 0xD7, 0x22, 0xBB, 0x0A, 0xDD, 0x22, 0xF6, 0x9B, 0x44, 0x69, 0x4E, 0x78, 0xEA, 0x27, 0xE9, 0xBA, - 0x23, 0xF3, 0x92, 0x98, 0x78, 0x49, 0x19, 0xC2, 0x8D, 0x02, 0x1B, 0xAB, 0xD4, 0x71, 0x04, 0xC5, - 0xF7, 0xBC, 0xD6, 0x05, 0x41, 0x59, 0x44, 0xD4, 0xBB, 0x88, 0x7B, 0x71, 0x0D, 0xDB, 0x33, 0x31, - 0x31, 0xA8, 0x76, 0x62, 0xF6, 0x3D, 0x7C, 0xE2, 0x3F, 0x3E, 0xE2, 0x53, 0xD7, 0xCA, 0x6C, 0xC4, - 0x10, 0x01, 0x30, 0x4F, 0x1F, 0xEE, 0x31, 0x8A, 0xE7, 0x7B, 0x76, 0xE9, 0xD7, 0x8D, 0x1C, 0x81, - 0x62, 0x91, 0x66, 0x2F, 0xA3, 0xD9, 0xF2, 0x87, 0x7B, 0x46, 0x04, 0x54, 0x08, 0xF8, 0x87, 0x19, - 0x2F, 0x29, 0x97, 0x7C, 0xF5, 0x60, 0x19, 0xCB, 0xC8, 0x2B, 0x4A, 0x52, 0x06, 0x45, 0x96, 0x15, - 0x7A, 0x70, 0x4C, 0xA2, 0xA2, 0xE4, 0x7F, 0x42, 0x14, 0x0D, 0xF2, 0x57, 0x6E, 0x6E, 0xCB, 0xB2, - 0x88, 0xD3, 0x34, 0xF3, 0x3C, 0xD2, 0xC1, 0xE0, 0x59, 0x1F, 0xA8, 0x97, 0xEF, 0x5A, 0x3C, 0xF2, - 0x29, 0xDB, 0x64, 0xD9, 0x69, 0x89, 0xA4, 0x8D, 0x0E, 0x73, 0x96, 0x85, 0x65, 0xE1, 0x65, 0x27, - 0x75, 0x75, 0xF2, 0x4E, 0x00, 0xB1, 0x30, 0xA3, 0xC8, 0x75, 0x3E, 0x63, 0x57, 0x77, 0xDD, 0x80, - 0x0F, 0x7C, 0x02, 0xF2, 0x6E, 0x57, 0x1E, 0x3C, 0x39, 0x15, 0x49, 0x0E, 0xFB, 0x7D, 0xCE, 0x6E, - 0x21, 0x7E, 0x22, 0xC3, 0x7D, 0x81, 0x6E, 0xD2, 0x75, 0x32, 0x43, 0xF3, 0x8B, 0x79, 0x8C, 0x3E, - 0x44, 0xF9, 0xC7, 0x90, 0xF4, 0xE4, 0xCF, 0xFF, 0xB5, 0x46, 0x6B, 0x2A, 0x4C, 0xBC, 0xCB, 0x70, - 0x9A, 0x61, 0x72, 0xAF, 0xBF, 0x49, 0xA1, 0x56, 0xBC, 0xF7, 0x61, 0x8F, 0xCA, 0x46, 0x40, 0x08, - 0xB9, 0x99, 0x53, 0x34, 0x24, 0x51, 0xFE, 0xD1, 0xBC, 0xED, 0x84, 0x7E, 0x81, 0x92, 0xBF, 0x52, - 0x68, 0x9A, 0x77, 0xB3, 0x3A, 0xEA, 0xBE, 0x21, 0x26, 0x8C, 0xA5, 0x85, 0x01, 0xC5, 0x22, 0xA6, - 0x9F, 0xF9, 0x4D, 0x50, 0x5C, 0x69, 0x24, 0xF9, 0xF0, 0x66, 0xE2, 0x79, 0x12, 0x18, 0xDF, 0x84, - 0x96, 0x1C, 0x4F, 0x3D, 0x1D, 0xD7, 0xAE, 0xD3, 0x99, 0xE8, 0x3B, 0xBD, 0x57, 0x96, 0xF9, 0xF0, - 0x3C, 0x46, 0xE7, 0x51, 0x1C, 0xDF, 0x44, 0xB3, 0x8F, 0xDA, 0xC2, 0x27, 0x4A, 0x66, 0x28, 0x96, - 0x9F, 0xBD, 0x6A, 0x4D, 0x65, 0xB8, 0x67, 0x7C, 0x0B, 0x6D, 0x93, 0x07, 0xAC, 0x1E, 0xF3, 0x4D, - 0x6C, 0x43, 0xBF, 0x90, 0x03, 0x74, 0x20, 0xA0, 0x2D, 0x07, 0x4D, 0xB8, 0x52, 0xBD, 0xCB, 0xF4, - 0x56, 0x25, 0xA4, 0x84, 0x53, 0x4C, 0xEF, 0x06, 0x27, 0x73, 0xF6, 0x09, 0x00, 0xED, 0xFB, 0xA6, - 0xE7, 0xD9, 0x81, 0xA7, 0x48, 0x40, 0xE1, 0x43, 0x8A, 0x68, 0x1E, 0xA2, 0x1E, 0xC1, 0x77, 0xE8, - 0x3D, 0xBA, 0x8B, 0x70, 0x82, 0x93, 0x5B, 0x0F, 0xC0, 0x2C, 0xF4, 0x27, 0x1B, 0xE7, 0x9E, 0x31, - 0xFE, 0xF0, 0x45, 0x44, 0x50, 0x2F, 0x49, 0x3F, 0x2B, 0xB5, 0x5B, 0xC3, 0x62, 0x40, 0xA2, 0xED, - 0xC9, 0x02, 0xA8, 0x5B, 0x76, 0x09, 0x80, 0xD8, 0x30, 0x35, 0x83, 0x98, 0xA2, 0x50, 0x45, 0x2B, - 0xE8, 0x8D, 0xBE, 0xC7, 0xA7, 0x99, 0xDC, 0x64, 0x79, 0x97, 0x9C, 0x74, 0xFB, 0x7E, 0xBB, 0x4D, - 0x49, 0x30, 0x8D, 0x51, 0xEF, 0x73, 0x94, 0x25, 0xDE, 0xEF, 0x14, 0x81, 0x3D, 0x46, 0x6C, 0x7B, - 0xE8, 0xCB, 0x0C, 0xA1, 0x39, 0x9A, 0xEF, 0x45, 0x71, 0x9C, 0x12, 0x82, 0xE6, 0x7B, 0x73, 0x14, - 0xCD, 0x63, 0x9C, 0xA0, 0xBD, 0x9B, 0xFB, 0xBD, 0xEF, 0x1E, 0x58, 0x97, 0xD1, 0x4D, 0xEE, 0xB1, - 0x1F, 0xCC, 0xAB, 0xDA, 0xCB, 0xBB, 0x04, 0x80, 0xE2, 0x2E, 0xFF, 0x1D, 0x40, 0x36, 0x5B, 0x16, - 0x65, 0x4E, 0xF2, 0x30, 0x2B, 0x2C, 0x92, 0x2A, 0xF8, 0x3E, 0x48, 0xF6, 0xB8, 0x39, 0x07, 0xDD, - 0x11, 0x95, 0xF5, 0xD2, 0x17, 0x6E, 0x66, 0xED, 0x75, 0x87, 0xD2, 0x35, 0xF1, 0x3C, 0x7A, 0x1F, - 0x95, 0xEF, 0x0A, 0xDC, 0xC4, 0xE7, 0x85, 0x40, 0xCE, 0x0B, 0x0E, 0x00, 0x5B, 0xCC, 0x12, 0x31, - 0xD2, 0x7B, 0x38, 0xED, 0x56, 0x82, 0x40, 0xCA, 0x38, 0x48, 0xB5, 0x34, 0xAE, 0xEA, 0x7A, 0x7E, - 0x3B, 0x48, 0x30, 0x92, 0x07, 0x6B, 0x46, 0xD9, 0x8D, 0xD8, 0x4C, 0xE4, 0xDB, 0xD5, 0x4D, 0x00, - 0xBB, 0x15, 0x56, 0x99, 0x41, 0x02, 0xCB, 0x2C, 0x63, 0x3F, 0x17, 0xF7, 0x81, 0x76, 0xBB, 0x25, - 0x06, 0x7E, 0x61, 0x90, 0x5C, 0x0B, 0x27, 0x7B, 0xDC, 0x94, 0xED, 0x8C, 0xCF, 0xD4, 0x56, 0xF3, - 0xE4, 0x00, 0xC4, 0x47, 0x5B, 0x9D, 0x10, 0xF6, 0xA5, 0x5C, 0xB1, 0x18, 0x27, 0x4E, 0x7E, 0x57, - 0x7F, 0x9B, 0xFD, 0x2B, 0x1F, 0x1E, 0xFA, 0xBC, 0x57, 0x1A, 0x60, 0x21, 0x5E, 0x5F, 0x8D, 0x6A, - 0x72, 0xF1, 0xA1, 0xF9, 0x4D, 0x33, 0x38, 0xC5, 0xBE, 0xCC, 0x62, 0xF1, 0x8D, 0x32, 0xF2, 0xE3, - 0xFE, 0x51, 0xFF, 0xEB, 0x18, 0x39, 0xB7, 0x0B, 0x12, 0xE2, 0xFE, 0xCF, 0xE9, 0x1C, 0x09, 0x4D, - 0xF9, 0x25, 0x89, 0x88, 0x8B, 0x61, 0x0F, 0x07, 0x60, 0xB2, 0xA9, 0x95, 0xA9, 0x39, 0xD1, 0x36, - 0x6E, 0x37, 0x65, 0x45, 0xBD, 0xD6, 0x60, 0xF2, 0xD0, 0xBD, 0xEA, 0x4F, 0x2A, 0x41, 0xE0, 0x90, - 0x5F, 0x91, 0x88, 0xBC, 0x6F, 0x13, 0xD1, 0x46, 0x24, 0xD0, 0x66, 0xBB, 0x7A, 0x7B, 0x90, 0x60, - 0x92, 0xB5, 0xDB, 0xB8, 0xDD, 0xF6, 0x32, 0xE3, 0x31, 0x00, 0x5F, 0xE5, 0xEC, 0x71, 0x9A, 0x3D, - 0x19, 0x5D, 0x9F, 0xBF, 0x7D, 0xF1, 0xF2, 0xFA, 0xE2, 0xCD, 0x8B, 0x97, 0x7F, 0x9E, 0xEE, 0x87, - 0x61, 0xDE, 0x7B, 0xF3, 0xCB, 0xEB, 0xD7, 0xDC, 0x82, 0x9D, 0x96, 0xB4, 0xDB, 0xCD, 0xB5, 0x7F, - 0xFD, 0xE9, 0xE2, 0xC3, 0xCB, 0xCB, 0x77, 0xCF, 0xCF, 0x5F, 0xEA, 0x36, 0xA0, 0x28, 0xE0, 0xE0, - 0x70, 0xF0, 0x55, 0xB7, 0x7F, 0x69, 0xB1, 0xF5, 0x9C, 0x90, 0x8C, 0x5E, 0x98, 0xAD, 0x38, 0x00, - 0x5B, 0x68, 0x89, 0x16, 0xB7, 0xF2, 0x04, 0xB9, 0x51, 0xBF, 0x94, 0xB1, 0x19, 0xA5, 0xD1, 0xBC, - 0xC8, 0x49, 0x44, 0xF0, 0x6C, 0x8F, 0xA4, 0x2A, 0xA2, 0x80, 0xDA, 0x3D, 0x57, 0xE8, 0xF4, 0xF4, - 0x34, 0x38, 0x68, 0xF7, 0x47, 0x23, 0x48, 0x7F, 0x1E, 0xB1, 0x5F, 0xFD, 0xD1, 0xA8, 0x8D, 0xA6, - 0xB2, 0x9D, 0x15, 0x8B, 0x40, 0xB5, 0xF4, 0x58, 0xA5, 0x2B, 0x7F, 0x0A, 0x4E, 0x4E, 0x82, 0x83, - 0x47, 0xF1, 0x67, 0x40, 0xFF, 0x3C, 0x7A, 0xE4, 0x7F, 0xF4, 0xE9, 0xED, 0x8A, 0x3D, 0xD3, 0x59, - 0x0F, 0x57, 0xD2, 0x31, 0x64, 0x4F, 0x3F, 0x4A, 0x59, 0xEF, 0x50, 0xB6, 0x3B, 0xB5, 0x35, 0x20, - 0xED, 0x51, 0x5D, 0xE0, 0xFC, 0x22, 0x61, 0xCF, 0xD9, 0x5A, 0xDC, 0x93, 0x4F, 0x7A, 0x6D, 0x01, - 0xB3, 0xC0, 0xF9, 0x0F, 0x69, 0x3C, 0xD7, 0x15, 0x94, 0xA7, 0xAA, 0x51, 0x43, 0x3B, 0x8A, 0xDA, - 0x62, 0xE3, 0x32, 0xCA, 0xAD, 0xA5, 0xF1, 0x80, 0x48, 0x0B, 0x6A, 0xE1, 0x63, 0xBB, 0x73, 0x9F, - 0x05, 0x63, 0xE5, 0xBF, 0x6B, 0x22, 0x61, 0x1B, 0x07, 0x2A, 0x47, 0x5C, 0xA3, 0xCA, 0x45, 0xF2, - 0x09, 0xE7, 0xF8, 0x26, 0x36, 0xB0, 0xD0, 0x4E, 0xB8, 0x66, 0x3D, 0x12, 0xC5, 0x78, 0x56, 0x37, - 0xE4, 0x1B, 0x5A, 0xE5, 0x05, 0xBE, 0xAB, 0x1D, 0x31, 0xAB, 0x70, 0x49, 0x32, 0xFC, 0x11, 0x91, - 0x65, 0x96, 0xAE, 0x6F, 0x97, 0xBA, 0xAA, 0xF6, 0xEE, 0x35, 0xFA, 0x33, 0x5E, 0x8C, 0x6A, 0xD0, - 0xBF, 0xB9, 0x2D, 0x6E, 0x91, 0x34, 0x96, 0xB3, 0xED, 0x74, 0x64, 0xB4, 0x0B, 0x05, 0xEF, 0x16, - 0x49, 0xAB, 0xB8, 0xA6, 0x8A, 0x0C, 0xC9, 0x57, 0xB7, 0x94, 0xDA, 0x2A, 0x35, 0xC2, 0xD0, 0x2B, - 0x43, 0x05, 0x74, 0x86, 0xB7, 0xAC, 0x7D, 0xC3, 0x6A, 0xBF, 0xBA, 0x7D, 0x17, 0xC5, 0x88, 0x10, - 0x73, 0xB2, 0x85, 0x07, 0xB9, 0x0B, 0xFE, 0xE3, 0xA3, 0x0C, 0xAF, 0x51, 0xDB, 0xFB, 0xF6, 0xF0, - 0x6E, 0x1A, 0xE1, 0x49, 0xFC, 0x84, 0x79, 0x8E, 0x67, 0x06, 0xDA, 0xAD, 0xE9, 0x7A, 0x8B, 0xAA, - 0x1C, 0xAA, 0x66, 0x2C, 0x8E, 0x16, 0x72, 0x1B, 0xF2, 0xA0, 0x01, 0xD5, 0x85, 0xF5, 0x94, 0x4B, - 0x6C, 0x05, 0x0B, 0xE1, 0x90, 0x24, 0x06, 0xCC, 0xDD, 0xD3, 0xE4, 0x00, 0xC7, 0x92, 0xB6, 0x46, - 0x23, 0x59, 0x5F, 0xB8, 0xB1, 0x09, 0x28, 0x63, 0x7B, 0xBE, 0x74, 0xAD, 0x39, 0x47, 0x72, 0x2C, - 0x0D, 0x88, 0x0B, 0x83, 0x78, 0xEA, 0x90, 0xB9, 0xD9, 0x11, 0x99, 0x9B, 0xAD, 0x90, 0xB9, 0x71, - 0x21, 0x53, 0xE5, 0x0E, 0x6A, 0x1B, 0xD9, 0x0C, 0xE0, 0xE6, 0xB6, 0x28, 0x5B, 0xE6, 0x3E, 0xD8, - 0x2C, 0x04, 0xE7, 0x2F, 0xEF, 0x56, 0xE4, 0xDE, 0x13, 0x41, 0x9E, 0x6F, 0x2C, 0xA7, 0xF6, 0xB1, - 0xF8, 0x66, 0x04, 0x06, 0xA0, 0x13, 0xF1, 0x8B, 0xE5, 0x8A, 0xCD, 0xF5, 0x95, 0x95, 0x8E, 0xDB, - 0xED, 0xFF, 0xAE, 0x61, 0x56, 0xDC, 0x84, 0xD6, 0x39, 0x87, 0x75, 0x95, 0x77, 0x9A, 0xD8, 0x1A, - 0x20, 0xDB, 0xCC, 0x76, 0x5D, 0x53, 0x7B, 0x09, 0x38, 0x8B, 0x36, 0xC9, 0xB3, 0xA8, 0x2D, 0xA8, - 0x4C, 0x97, 0xCD, 0x7B, 0x76, 0x9D, 0xB6, 0xB3, 0xAD, 0xE6, 0x6B, 0x5C, 0xC2, 0x83, 0xF7, 0x69, - 0x1E, 0x37, 0xEA, 0x44, 0xFD, 0x7A, 0x4C, 0x2A, 0x1B, 0xBE, 0x6E, 0x11, 0x39, 0x56, 0x8A, 0xB9, - 0x56, 0xD0, 0xA9, 0xB0, 0xB1, 0x9D, 0x51, 0xAA, 0xE5, 0x7B, 0x75, 0x28, 0x35, 0x30, 0xC3, 0xCD, - 0xA3, 0x50, 0xF8, 0x56, 0x46, 0x52, 0xE1, 0x71, 0x3B, 0x8F, 0xA4, 0xCA, 0x46, 0x37, 0xE3, 0xA3, - 0x7A, 0xB5, 0x88, 0x8E, 0xFB, 0x1B, 0xD7, 0x61, 0xB2, 0xB8, 0x3D, 0xAB, 0xE0, 0x76, 0xD6, 0x24, - 0x64, 0x8C, 0x83, 0xB1, 0x4F, 0x2F, 0x5C, 0xB6, 0xA0, 0x88, 0x85, 0x8C, 0x58, 0xD2, 0x7E, 0x53, - 0x89, 0x30, 0xF4, 0xE5, 0xF5, 0x02, 0x7D, 0x21, 0x4A, 0xDD, 0x60, 0x7B, 0x12, 0xD0, 0x12, 0x64, - 0x95, 0x10, 0x3A, 0x06, 0x7A, 0x03, 0x2B, 0xAB, 0xD3, 0x58, 0xF1, 0x59, 0x77, 0x78, 0x70, 0x7C, - 0x78, 0xD0, 0xF7, 0x87, 0xC7, 0x6D, 0x05, 0x81, 0xDF, 0xDE, 0x6D, 0x6C, 0x4F, 0x4E, 0xFA, 0xD2, - 0xAB, 0x14, 0x7D, 0x21, 0xF4, 0x82, 0xC4, 0x60, 0x22, 0x13, 0x25, 0xC4, 0xBA, 0x5A, 0xD7, 0xCC, - 0x97, 0xD9, 0xEB, 0x68, 0xEC, 0xC9, 0x7E, 0x8F, 0x74, 0xBF, 0xE0, 0xF4, 0xB4, 0x7F, 0xC0, 0x40, - 0x97, 0x60, 0x98, 0xBD, 0xB4, 0x43, 0x8D, 0xB2, 0x1E, 0xF4, 0x63, 0xC8, 0x30, 0x6C, 0x2B, 0xA8, - 0x36, 0x2A, 0x92, 0xBD, 0xDA, 0xD2, 0xD6, 0xA0, 0x6D, 0x0F, 0xA8, 0x54, 0xBD, 0xD4, 0x6B, 0xD9, - 0xD0, 0x8C, 0x76, 0xAA, 0x00, 0x89, 0xA1, 0xD3, 0xC1, 0x39, 0x47, 0xCC, 0xE1, 0xB3, 0x62, 0x05, - 0x96, 0xAF, 0x0F, 0x52, 0xB2, 0xB5, 0x7C, 0x71, 0xA2, 0xB2, 0xBE, 0xA7, 0x3A, 0x31, 0x17, 0x93, - 0xEE, 0x0F, 0x71, 0xC8, 0x54, 0xCE, 0x7C, 0x7B, 0xCA, 0x8C, 0xF3, 0x5F, 0x20, 0x50, 0x94, 0xAF, - 0x28, 0x79, 0x01, 0x8F, 0xFD, 0xE3, 0xAF, 0xBC, 0x95, 0x0A, 0x2B, 0x0F, 0x66, 0x57, 0x25, 0x95, - 0xF1, 0xA1, 0xFC, 0x1C, 0x92, 0xDE, 0xCF, 0xCF, 0xFF, 0x7C, 0xFD, 0xC3, 0x2F, 0xAF, 0x5E, 0xBD, - 0x7C, 0xCF, 0xDC, 0x8B, 0x1D, 0xF7, 0xD4, 0xC1, 0xF0, 0x98, 0xDE, 0x11, 0xB1, 0x77, 0x34, 0x1C, - 0x1C, 0x02, 0x98, 0x84, 0xD8, 0x1B, 0x05, 0x01, 0x80, 0xA9, 0xB8, 0xC4, 0xC2, 0x28, 0xC4, 0xDE, - 0xF0, 0x60, 0x30, 0x04, 0x70, 0x49, 0x7F, 0x1D, 0x1D, 0x0C, 0x00, 0x9C, 0x85, 0xD8, 0x3B, 0x0C, - 0x82, 0x03, 0x00, 0xE3, 0x10, 0x7B, 0xF4, 0xEA, 0x06, 0xE0, 0x9C, 0x7E, 0xEB, 0xF7, 0x0F, 0xE8, - 0xB5, 0xB7, 0xDC, 0xED, 0xB0, 0x7F, 0x3C, 0x3C, 0x3E, 0x38, 0xEC, 0x1F, 0x8F, 0x14, 0xCE, 0xAE, - 0x37, 0x26, 0xF3, 0x6D, 0x7E, 0x19, 0xE5, 0xDC, 0x34, 0x9C, 0x29, 0xD1, 0x90, 0xD3, 0x37, 0x3C, - 0x24, 0x2E, 0x83, 0x98, 0x50, 0xA4, 0xF4, 0xE7, 0x49, 0xA9, 0xC5, 0xCE, 0xE4, 0x19, 0xAE, 0xE5, - 0x1F, 0xF2, 0x87, 0xB2, 0xF8, 0x27, 0xD1, 0x4D, 0x1E, 0x3E, 0x14, 0xFC, 0x0F, 0xE1, 0xCC, 0xEA, - 0x1B, 0x7F, 0xFD, 0xD9, 0xFA, 0xCB, 0xF0, 0x7C, 0x0C, 0xB3, 0x4D, 0xC6, 0x98, 0x96, 0x6B, 0xE9, - 0xAC, 0x6C, 0xD2, 0xCD, 0xEB, 0xDC, 0xF1, 0x2C, 0xFB, 0x5A, 0x7D, 0x9B, 0x88, 0x4C, 0x2E, 0x61, - 0xA2, 0xAC, 0x13, 0x79, 0x2C, 0xBB, 0x65, 0xC4, 0x0D, 0x34, 0xAF, 0x7C, 0x98, 0x9A, 0x37, 0xEF, - 0x9F, 0x9E, 0xBF, 0xB7, 0x3E, 0xFC, 0x7A, 0xF1, 0xE2, 0xC3, 0x4F, 0x76, 0x95, 0xB7, 0x2F, 0x5E, - 0x4E, 0x95, 0xF3, 0xF5, 0x12, 0x13, 0x94, 0xAF, 0x44, 0x2A, 0x9A, 0xE6, 0x5E, 0x2A, 0x37, 0x76, - 0xDE, 0x57, 0xF9, 0xB3, 0xEC, 0xD1, 0x75, 0xC1, 0x57, 0xFD, 0xE2, 0xFC, 0x3C, 0x46, 0x11, 0xA5, - 0x56, 0xED, 0x0E, 0x70, 0x87, 0xEE, 0xD2, 0xEC, 0x9E, 0x7E, 0x4F, 0xD6, 0xAB, 0xFF, 0xA5, 0x74, - 0x42, 0x73, 0x5B, 0x27, 0xE4, 0xAA, 0xFC, 0x2E, 0xCD, 0x31, 0xA5, 0x07, 0xED, 0xC8, 0x95, 0xC6, - 0xEE, 0x14, 0xB7, 0x2C, 0xA9, 0xB5, 0xD0, 0xEC, 0x32, 0x53, 0x00, 0x47, 0x1D, 0x9D, 0xFE, 0x9D, - 0xE9, 0x49, 0xF8, 0xA5, 0xBF, 0x77, 0x8E, 0xB3, 0xD9, 0x3A, 0x8E, 0xB2, 0xD7, 0x38, 0x27, 0xFA, - 0x91, 0xEE, 0x3C, 0xCD, 0x32, 0x34, 0x93, 0x79, 0xDF, 0x99, 0x76, 0xD6, 0xD3, 0xE0, 0xA5, 0x8D, - 0x72, 0x25, 0x12, 0x8A, 0x23, 0xF6, 0x89, 0x19, 0xED, 0x24, 0x47, 0x64, 0xBD, 0xFA, 0x10, 0xDD, - 0x5C, 0x92, 0x74, 0x95, 0xF3, 0xD3, 0x4F, 0xA5, 0xF4, 0x31, 0x92, 0xB0, 0x48, 0x5B, 0x7C, 0x49, - 0x24, 0xF4, 0xFA, 0x8F, 0xB4, 0xFB, 0xAE, 0xFA, 0x7C, 0x43, 0x3F, 0xDF, 0x54, 0x3E, 0x3B, 0x22, - 0xAC, 0x81, 0xB1, 0x03, 0xA4, 0xEF, 0x80, 0x57, 0xF9, 0x66, 0xA9, 0x48, 0x62, 0x9B, 0xC5, 0x81, - 0x52, 0x65, 0x3A, 0x9E, 0x5F, 0x2D, 0xC2, 0x73, 0x8D, 0xCA, 0x26, 0xCD, 0xD2, 0xD8, 0x4A, 0x85, - 0xF6, 0x08, 0x4B, 0x85, 0x4D, 0xE3, 0xAC, 0x76, 0xE2, 0xD7, 0xF6, 0x50, 0x53, 0xB2, 0xCD, 0xC8, - 0xED, 0x26, 0x85, 0x65, 0xDD, 0x6E, 0x5A, 0x12, 0x51, 0x10, 0x99, 0x60, 0x8C, 0x86, 0xE9, 0x7B, - 0x1D, 0x0D, 0xDB, 0x74, 0x01, 0x09, 0xA3, 0x94, 0x3D, 0x8B, 0x63, 0x96, 0x4F, 0x41, 0xAB, 0x50, - 0x3C, 0x86, 0x71, 0x75, 0xE0, 0x5D, 0xF4, 0x85, 0x13, 0xF0, 0xA9, 0x26, 0x48, 0x06, 0x4F, 0xC7, - 0xFD, 0xFD, 0x4F, 0x8C, 0x3E, 0xAF, 0x52, 0xF6, 0x8A, 0x62, 0x79, 0x27, 0x18, 0xD6, 0xC7, 0xF7, - 0x5D, 0xCD, 0x73, 0x95, 0x5E, 0xEA, 0x34, 0xF4, 0xDB, 0x6D, 0x61, 0x0D, 0xC9, 0xE1, 0xD6, 0xED, - 0x1D, 0x2B, 0x5F, 0x94, 0x85, 0xAB, 0x7C, 0x79, 0x40, 0xDA, 0x99, 0xB6, 0xE3, 0x3A, 0x0B, 0xCC, - 0x38, 0x21, 0xB9, 0x6A, 0x2D, 0x51, 0xC1, 0xA7, 0x95, 0x43, 0xE9, 0xAC, 0xF2, 0x65, 0x8C, 0x8B, - 0x05, 0x8E, 0x63, 0x39, 0xDA, 0xF7, 0xE9, 0xE7, 0xBC, 0x6C, 0x2A, 0xC0, 0xA7, 0x4C, 0xBC, 0xCF, - 0x3E, 0x28, 0x33, 0x00, 0xC4, 0x02, 0x2C, 0x3A, 0x8E, 0x02, 0x99, 0x78, 0x5C, 0x4F, 0x41, 0x39, - 0x4D, 0x2C, 0x87, 0xA8, 0xA3, 0x55, 0xD8, 0x34, 0x02, 0xD8, 0x6B, 0x87, 0xF1, 0x82, 0xB6, 0xCB, - 0xA1, 0xF6, 0x8F, 0xC2, 0xC6, 0x44, 0x58, 0xFA, 0xAA, 0xD9, 0xB7, 0x49, 0xC7, 0xB5, 0x93, 0x97, - 0x87, 0x52, 0x5E, 0x49, 0xC2, 0x66, 0xC4, 0xD9, 0x8B, 0x70, 0x72, 0xEA, 0xA2, 0x6D, 0xF9, 0xD6, - 0x58, 0xFA, 0x1C, 0x26, 0x00, 0x56, 0xD6, 0xF5, 0xD4, 0x37, 0x7C, 0x7A, 0xE8, 0xA6, 0x3B, 0x41, - 0xC0, 0x61, 0xAE, 0x6F, 0x36, 0xE1, 0x09, 0x03, 0x3A, 0x61, 0xC7, 0x28, 0x61, 0xA9, 0xE2, 0x40, - 0x4F, 0x0D, 0x1E, 0xEB, 0x40, 0xAE, 0xDA, 0x63, 0x28, 0xFD, 0x9C, 0x9F, 0x10, 0x05, 0x3D, 0x37, - 0xE9, 0x24, 0x3F, 0x21, 0x93, 0xBC, 0xD3, 0x01, 0x95, 0xCE, 0x4E, 0x48, 0x47, 0xAF, 0xBE, 0x7A, - 0x44, 0xDD, 0x14, 0x35, 0x87, 0xBD, 0x3E, 0x9C, 0x95, 0x49, 0xAE, 0xC2, 0x78, 0x28, 0x9E, 0xE2, - 0x26, 0xC6, 0xE0, 0xAB, 0x97, 0x73, 0x0B, 0x83, 0xEA, 0xF6, 0xEF, 0xA4, 0xCA, 0x47, 0x8C, 0x27, - 0x8D, 0xEF, 0xC2, 0x54, 0xBA, 0x9B, 0x31, 0x9A, 0x55, 0x80, 0xD8, 0x5F, 0xDD, 0xAE, 0xE8, 0x64, - 0x23, 0x2E, 0xDC, 0x7F, 0x79, 0xAF, 0x9C, 0x3C, 0x91, 0x4D, 0x11, 0x3A, 0x25, 0x13, 0xD4, 0xED, - 0x56, 0xA7, 0xE8, 0xD4, 0x35, 0x45, 0x76, 0x85, 0xCA, 0x00, 0x02, 0x6B, 0x72, 0xD2, 0x95, 0x27, - 0x0F, 0x0B, 0x5E, 0xCB, 0x1C, 0x4B, 0xA7, 0x03, 0x38, 0xAD, 0x9D, 0xB8, 0x88, 0xAA, 0xC4, 0x24, - 0xCD, 0x6E, 0xBB, 0xC9, 0x84, 0xCD, 0xA8, 0x89, 0x10, 0xC9, 0xF0, 0xDD, 0x25, 0x7B, 0xEA, 0x94, - 0x6F, 0xF2, 0x7C, 0x5B, 0xDB, 0x61, 0x40, 0xF8, 0xA4, 0xEA, 0x00, 0x1F, 0x9C, 0x0F, 0x94, 0xEA, - 0xB0, 0x99, 0xD5, 0x75, 0x84, 0x1C, 0x6B, 0x57, 0x12, 0x11, 0x44, 0x10, 0x0B, 0xCB, 0xE4, 0xDE, - 0x13, 0x85, 0x60, 0x23, 0xBC, 0x21, 0x4E, 0x78, 0xC3, 0x2F, 0x10, 0x29, 0x8B, 0xAB, 0xFB, 0x52, - 0xD9, 0x3D, 0x24, 0xB4, 0x2C, 0x95, 0x23, 0xBB, 0xEF, 0x84, 0x29, 0xB0, 0xC4, 0x67, 0xBB, 0x3E, - 0xFF, 0x68, 0x00, 0x34, 0x58, 0x4C, 0x21, 0x77, 0x87, 0xCD, 0x65, 0x54, 0x68, 0x29, 0x9C, 0xBF, - 0x47, 0x8B, 0x38, 0xFD, 0xFC, 0x32, 0x89, 0x6E, 0x62, 0xA4, 0xAC, 0xE8, 0xAF, 0x33, 0xF6, 0x95, - 0x71, 0x19, 0x43, 0x1A, 0x3C, 0x45, 0xE0, 0x1B, 0x6D, 0x5E, 0x43, 0xC2, 0x44, 0x96, 0x28, 0x59, - 0x2B, 0xC6, 0xAA, 0x37, 0xCB, 0xFC, 0xB4, 0x17, 0x7C, 0x5F, 0xE9, 0x57, 0x61, 0xDE, 0x2C, 0xD3, - 0x3A, 0xE0, 0xCA, 0x77, 0x4F, 0xF6, 0x9E, 0x2D, 0x44, 0x85, 0x88, 0xCC, 0x96, 0x68, 0xFE, 0xB3, - 0x59, 0xD9, 0xE3, 0x2F, 0xDA, 0xEE, 0xA2, 0x07, 0xBE, 0x9B, 0xF6, 0xFD, 0x49, 0x03, 0x12, 0xA7, - 0x55, 0x12, 0xDE, 0x88, 0x35, 0x0A, 0xF7, 0x03, 0x79, 0xEC, 0x59, 0x26, 0x0D, 0xCE, 0x06, 0x8E, - 0xE5, 0x00, 0x94, 0x00, 0x3A, 0x61, 0x79, 0x35, 0xEA, 0x61, 0x74, 0x3A, 0x80, 0x4D, 0x75, 0xB2, - 0x5E, 0xF1, 0x41, 0xD2, 0xAB, 0xD7, 0x69, 0xE0, 0xFB, 0x3A, 0x42, 0x98, 0x14, 0x22, 0x98, 0x60, - 0x53, 0x26, 0xA1, 0x0D, 0xB2, 0xD2, 0xFE, 0x0E, 0x0C, 0xB6, 0x30, 0xC9, 0xF0, 0x41, 0x93, 0xCC, - 0xBE, 0x90, 0x11, 0x4E, 0xF5, 0xA7, 0x33, 0x93, 0x6C, 0x5F, 0x47, 0xD9, 0x2D, 0xE2, 0xF1, 0x24, - 0xC6, 0xE6, 0xF7, 0xCB, 0xBB, 0x28, 0x8E, 0x45, 0x01, 0x28, 0xAA, 0x95, 0xD5, 0x79, 0xEA, 0xF9, - 0x30, 0xEA, 0x99, 0xC5, 0x3F, 0x22, 0xE6, 0xF0, 0x9E, 0x7F, 0x48, 0xDF, 0xA3, 0xBB, 0xF4, 0x13, - 0x02, 0x06, 0xCF, 0x31, 0xF6, 0x07, 0x44, 0xB0, 0xC2, 0x0A, 0xAB, 0x42, 0xA6, 0xEB, 0x70, 0x66, - 0x1C, 0x10, 0x1B, 0x67, 0xA6, 0x11, 0x62, 0xC2, 0x46, 0xE5, 0x9C, 0xD9, 0x4B, 0xBC, 0x41, 0x9F, - 0x5F, 0x47, 0xF7, 0xE9, 0x9A, 0x58, 0x98, 0x60, 0x30, 0xA9, 0xD4, 0x7F, 0xBE, 0x5A, 0xC5, 0xF7, - 0xEE, 0xEA, 0x79, 0x2F, 0xE6, 0x1F, 0x61, 0x75, 0xF6, 0x9E, 0xCF, 0xFF, 0xEF, 0x3A, 0x27, 0x4A, - 0x56, 0x65, 0x66, 0x62, 0xBD, 0x59, 0xBA, 0x4E, 0x08, 0x9F, 0x81, 0x39, 0x28, 0x8A, 0x4D, 0x0D, - 0x8C, 0xE0, 0xEE, 0xDB, 0x4B, 0x28, 0x49, 0x88, 0x39, 0x9D, 0x27, 0xDD, 0xEE, 0xDE, 0xA9, 0x3F, - 0x01, 0x4A, 0x5C, 0x64, 0xB3, 0x2A, 0x8F, 0x45, 0x7D, 0x02, 0x4A, 0x27, 0x52, 0xFB, 0x54, 0xB7, - 0x0E, 0xDA, 0xBA, 0x13, 0x31, 0x07, 0x40, 0x9D, 0x4B, 0xEC, 0x08, 0x30, 0x7B, 0xB2, 0x4F, 0x58, - 0x68, 0x9E, 0xC6, 0x82, 0x7F, 0x35, 0x1D, 0x09, 0x18, 0xFA, 0x8A, 0xC4, 0x4C, 0xBA, 0xDB, 0x4D, - 0x66, 0x83, 0x79, 0x78, 0x35, 0x15, 0xD3, 0xE2, 0x2B, 0x37, 0xC7, 0xD4, 0x71, 0x16, 0x06, 0x93, - 0xF4, 0x34, 0xF4, 0x27, 0x69, 0xB7, 0xCB, 0x99, 0xD1, 0xB2, 0xBC, 0xE5, 0x53, 0x46, 0x62, 0xFB, - 0xCB, 0xC7, 0xC7, 0xFD, 0xA5, 0xB6, 0x46, 0x68, 0xB7, 0x97, 0xB4, 0xF4, 0x43, 0x86, 0xEF, 0xEE, - 0xD0, 0x5C, 0xC8, 0x7E, 0xE0, 0x24, 0x44, 0x60, 0x96, 0x26, 0x04, 0x27, 0x6B, 0x79, 0x53, 0x98, - 0x85, 0x57, 0xCB, 0x29, 0x5F, 0x18, 0xAB, 0x79, 0x4A, 0x97, 0xA8, 0xD2, 0x59, 0xB7, 0x9B, 0x02, - 0x38, 0xEB, 0xAD, 0x13, 0x1E, 0x50, 0x69, 0x29, 0xED, 0x14, 0xE3, 0xAA, 0xAC, 0x43, 0xB1, 0x8A, - 0x4F, 0xC3, 0xB4, 0xDD, 0x8E, 0x4F, 0xD2, 0xCE, 0x4C, 0x5E, 0x07, 0x4A, 0xDD, 0xCF, 0xC3, 0xD9, - 0xD5, 0x4C, 0x8D, 0x75, 0xEA, 0xC0, 0x19, 0x5E, 0x9B, 0x7B, 0x45, 0x4C, 0xF9, 0x8F, 0x88, 0x50, - 0xD2, 0xC7, 0x09, 0xE2, 0xD5, 0x72, 0xE0, 0xCD, 0xAC, 0xFD, 0x0A, 0xE0, 0x3A, 0xBC, 0x96, 0x70, - 0x67, 0x66, 0x4C, 0xF1, 0xC5, 0x64, 0x11, 0xFA, 0x4E, 0x82, 0xD8, 0x77, 0x5C, 0x5F, 0xBA, 0xC1, - 0x99, 0x69, 0x88, 0x64, 0x5C, 0xE2, 0x4A, 0x02, 0x41, 0x67, 0x0D, 0xC6, 0xE5, 0x9A, 0x16, 0xA0, - 0x9A, 0x46, 0x62, 0x1E, 0x3E, 0x51, 0x7A, 0xB0, 0x63, 0x9D, 0xAC, 0x27, 0xA8, 0xD3, 0x29, 0x89, - 0x49, 0xD6, 0xBD, 0xC7, 0x41, 0x58, 0x70, 0xDF, 0x07, 0x93, 0x4F, 0xCA, 0x92, 0xFB, 0x93, 0x62, - 0x3C, 0xCC, 0x85, 0x95, 0xC7, 0x3C, 0x61, 0x16, 0x63, 0x63, 0xBD, 0x24, 0x9D, 0x04, 0x26, 0x7C, - 0x2E, 0xF3, 0xF1, 0xA7, 0x02, 0xC0, 0xA4, 0x13, 0x7E, 0x52, 0xD9, 0x7E, 0x67, 0xBC, 0x51, 0xAF, - 0xD7, 0xFB, 0xC4, 0xB7, 0xF1, 0xAD, 0x9E, 0xD6, 0x00, 0xAE, 0xC2, 0xEB, 0xAB, 0xDB, 0xE9, 0x84, - 0x4E, 0xE7, 0xAA, 0xDD, 0xF6, 0x6E, 0xBB, 0x5D, 0xF1, 0x89, 0xD7, 0xBD, 0x0C, 0xD5, 0xD2, 0xAE, - 0xBB, 0x01, 0xBC, 0x0B, 0xE7, 0x9C, 0xD0, 0x2E, 0x29, 0x45, 0xEB, 0x91, 0x29, 0xA9, 0xE7, 0x0E, - 0xAE, 0x6C, 0xC3, 0xF1, 0x19, 0x05, 0xC5, 0x43, 0x0A, 0xE2, 0x85, 0x47, 0xFF, 0xEA, 0xCD, 0xD2, - 0xD5, 0x3D, 0x4B, 0x0C, 0xFD, 0x2A, 0x4B, 0xEF, 0xBC, 0xD9, 0xD5, 0xE5, 0x14, 0xDE, 0x75, 0x11, - 0xA4, 0x12, 0x1D, 0xA2, 0xA3, 0x87, 0xAB, 0x6E, 0x88, 0xA0, 0x03, 0x23, 0x78, 0x27, 0x0B, 0xEE, - 0xC0, 0xC3, 0x65, 0xB7, 0x3B, 0xB1, 0xBB, 0x8F, 0xBE, 0x78, 0x97, 0xD0, 0x07, 0x93, 0x3B, 0x4E, - 0x6D, 0xB7, 0x88, 0x88, 0xAD, 0x40, 0x27, 0xC6, 0x22, 0x49, 0x4A, 0x6A, 0xC8, 0x20, 0x36, 0x50, - 0x14, 0xB6, 0xEC, 0x34, 0x33, 0x45, 0xA6, 0xEB, 0x2B, 0x32, 0x3D, 0x41, 0xED, 0xF6, 0xEC, 0x8A, - 0x4C, 0xE9, 0x9D, 0x8F, 0xB1, 0x04, 0xFA, 0x51, 0x5E, 0x75, 0xCE, 0xC3, 0x75, 0x77, 0xC1, 0xE7, - 0xE5, 0xDC, 0xCD, 0x19, 0xF9, 0xCF, 0x13, 0xD2, 0x55, 0x77, 0x07, 0x29, 0x67, 0x1B, 0x62, 0x78, - 0xA3, 0x1C, 0x6E, 0x5C, 0x55, 0x4E, 0x6C, 0x19, 0xB3, 0x44, 0x90, 0x55, 0xBA, 0xED, 0x24, 0xA0, - 0xAB, 0xFC, 0x33, 0xB9, 0xCC, 0x2D, 0x91, 0xA3, 0xC0, 0x4D, 0x66, 0xAA, 0x7A, 0xE5, 0x28, 0xB8, - 0x98, 0xA9, 0x25, 0xDA, 0xFE, 0xA5, 0xB3, 0xB6, 0x8E, 0xD5, 0x6E, 0x00, 0xA8, 0x58, 0x9B, 0x57, - 0x4E, 0x4B, 0xC4, 0x54, 0xBE, 0xD5, 0x1D, 0x52, 0x95, 0x8A, 0x68, 0xB7, 0xC4, 0xD0, 0x13, 0x18, - 0xB6, 0x5C, 0x40, 0x07, 0x1A, 0xAB, 0xB6, 0xE3, 0x89, 0x04, 0x70, 0x37, 0x80, 0x69, 0xE8, 0xC3, - 0x28, 0xCC, 0xAF, 0xD2, 0xE9, 0xA4, 0x52, 0x2D, 0xDC, 0x7D, 0xEE, 0x26, 0x9C, 0x67, 0x6B, 0x1E, - 0x3F, 0x6B, 0x06, 0xD2, 0x0D, 0x20, 0xEE, 0x24, 0xDD, 0x00, 0x4C, 0x66, 0x74, 0x93, 0xCC, 0xBA, - 0x5D, 0x2A, 0xE8, 0x45, 0xED, 0x76, 0xC4, 0x9D, 0x63, 0x4F, 0xB3, 0xCE, 0x52, 0x27, 0xE4, 0x43, - 0x61, 0xD4, 0x93, 0x7B, 0x57, 0x1F, 0x18, 0x88, 0xB6, 0x2C, 0xDD, 0xF8, 0x72, 0x44, 0xBC, 0x59, - 0xB7, 0x0B, 0x75, 0x7D, 0x16, 0x14, 0x69, 0xD6, 0xE9, 0x40, 0x24, 0xF8, 0x02, 0x8F, 0x06, 0x94, - 0x75, 0x02, 0x18, 0xDD, 0x51, 0x79, 0x60, 0x5C, 0x81, 0x5D, 0x00, 0xB8, 0xEC, 0x54, 0xBB, 0x64, - 0xF3, 0xD5, 0xE9, 0xA4, 0x53, 0x23, 0x20, 0x84, 0xD1, 0x2B, 0x24, 0x57, 0x59, 0xB7, 0x2B, 0x58, - 0xC2, 0xCC, 0x98, 0x0A, 0x1D, 0x8A, 0xB6, 0x1B, 0x4C, 0x08, 0x45, 0x9A, 0x74, 0xBB, 0x00, 0xD1, - 0x8D, 0xC2, 0x70, 0xE9, 0x84, 0x33, 0x73, 0x4E, 0xD3, 0xE4, 0x82, 0x39, 0xC8, 0xBC, 0xBC, 0xC3, - 0x84, 0x20, 0x11, 0x09, 0x87, 0xD6, 0x06, 0x70, 0xD6, 0x09, 0x59, 0x33, 0x8E, 0xB8, 0x3A, 0x93, - 0x0C, 0x7E, 0x4C, 0x27, 0xD5, 0x79, 0x0D, 0x9D, 0xC4, 0xA5, 0xCB, 0x7B, 0x9A, 0xD0, 0xDD, 0x6E, - 0x75, 0x12, 0x83, 0xA2, 0xC8, 0xF9, 0xEB, 0x11, 0xC5, 0xEB, 0x43, 0xCA, 0x85, 0x0D, 0x1E, 0xDA, - 0x84, 0x09, 0x44, 0x54, 0x9A, 0x17, 0x46, 0xE1, 0x93, 0x92, 0x70, 0x64, 0x92, 0x20, 0x3B, 0xA9, - 0x73, 0x21, 0x70, 0x5F, 0x75, 0x03, 0xD8, 0x0D, 0xA6, 0x3A, 0xC6, 0xDD, 0x59, 0xEE, 0x38, 0xFE, - 0xC6, 0x8A, 0x46, 0xE5, 0xB4, 0xE1, 0xD0, 0x9F, 0xE0, 0x93, 0x6C, 0xD2, 0xE9, 0x60, 0xC0, 0xB6, - 0x0B, 0x0F, 0x53, 0x70, 0x95, 0x1A, 0xF6, 0x84, 0xEC, 0x99, 0x41, 0x18, 0x14, 0xD2, 0xCD, 0xDB, - 0x0D, 0x9D, 0xD5, 0xD8, 0x2F, 0x5E, 0x4B, 0xF4, 0xC2, 0xF3, 0xE6, 0x9F, 0xC8, 0x4B, 0xC1, 0x15, - 0x82, 0x78, 0x4A, 0x77, 0x55, 0xA1, 0xFE, 0xF6, 0xA7, 0x05, 0xC9, 0xA2, 0x24, 0x8F, 0x23, 0x82, - 0xB4, 0xD0, 0xF5, 0x21, 0xD5, 0x61, 0x0B, 0xB8, 0xF5, 0xB6, 0x9C, 0x86, 0xCC, 0x31, 0x0D, 0xD2, - 0x98, 0xF6, 0x2C, 0xEB, 0x29, 0x58, 0x0A, 0x02, 0x77, 0xA8, 0x1C, 0xB7, 0x5A, 0x85, 0x66, 0xC2, - 0xCC, 0xBD, 0xFB, 0x55, 0x2A, 0xE4, 0x3B, 0x2E, 0x09, 0x91, 0x10, 0x41, 0x1C, 0x22, 0x71, 0x79, - 0x2A, 0xAD, 0xA2, 0xB8, 0x9A, 0x2A, 0x81, 0x66, 0x02, 0x48, 0xB7, 0x2B, 0xC2, 0x45, 0x76, 0x82, - 0x2A, 0xE7, 0xA8, 0x34, 0xC6, 0x9D, 0xC0, 0x6A, 0x8E, 0x3B, 0x1D, 0x69, 0xAB, 0xBC, 0xC0, 0x59, - 0x4E, 0xC6, 0x04, 0xC6, 0x51, 0x4E, 0xC6, 0x98, 0x79, 0xCC, 0x1A, 0x9A, 0x3C, 0xE1, 0x27, 0x9E, - 0xAC, 0xE3, 0x78, 0x3F, 0x14, 0xCC, 0x9B, 0x05, 0xCB, 0x61, 0x2E, 0xB4, 0xE2, 0x1C, 0x5F, 0x65, - 0xE8, 0x13, 0xAD, 0x4E, 0xD9, 0x92, 0x60, 0xDC, 0xF2, 0x71, 0x0D, 0x85, 0x3E, 0x90, 0xBC, 0x8D, - 0x9D, 0x2F, 0x13, 0xD4, 0xD9, 0x14, 0xE2, 0x81, 0x36, 0xA6, 0xE0, 0x7E, 0xC5, 0x73, 0xB2, 0x04, - 0x66, 0x97, 0xE1, 0xBE, 0x5F, 0x18, 0x9D, 0x29, 0xD4, 0xA4, 0x36, 0x96, 0x2B, 0x2D, 0xC0, 0x64, - 0x5F, 0x37, 0xEA, 0x76, 0xD1, 0xB4, 0xDD, 0x46, 0xF4, 0x20, 0x32, 0x74, 0xD4, 0x95, 0x2B, 0x19, - 0xB7, 0x9C, 0x1D, 0xA3, 0x13, 0xFF, 0xCC, 0x1F, 0x23, 0x16, 0x3B, 0x6C, 0x87, 0x4E, 0x3A, 0x1D, - 0xD6, 0x89, 0x39, 0xCC, 0x5D, 0x7A, 0x63, 0x3A, 0x83, 0x9F, 0xF9, 0x7B, 0xA0, 0xE1, 0x51, 0x60, - 0xBC, 0x9B, 0xF9, 0xAE, 0xE0, 0x21, 0xE2, 0x05, 0xD1, 0x3C, 0x9F, 0xCD, 0xEF, 0x94, 0x85, 0x50, - 0x0A, 0x90, 0x39, 0x7D, 0x4A, 0x45, 0xCA, 0x99, 0xDD, 0x7A, 0x8E, 0x54, 0x2E, 0xE4, 0xDD, 0x2E, - 0x0C, 0x80, 0xD4, 0x80, 0x58, 0x4F, 0x78, 0x1C, 0xDD, 0xE7, 0x71, 0x2C, 0x31, 0x6E, 0x46, 0xD8, - 0x38, 0xDC, 0x4A, 0x08, 0xA3, 0x32, 0xC2, 0x68, 0x13, 0x56, 0x88, 0x61, 0xE5, 0x44, 0x2A, 0x9A, - 0xCF, 0x39, 0x3E, 0xA6, 0x61, 0x35, 0xBD, 0x4C, 0x2D, 0x7B, 0xEA, 0xBB, 0x15, 0xBA, 0x5D, 0x82, - 0xE6, 0xC7, 0x2B, 0x80, 0x44, 0x05, 0xB5, 0xF4, 0x2A, 0xFC, 0x93, 0x45, 0xE9, 0x7C, 0x20, 0xEC, - 0x5B, 0x97, 0xE5, 0x4D, 0xA2, 0xBF, 0x4E, 0xE8, 0x26, 0xD5, 0x18, 0x17, 0x2C, 0x4E, 0x51, 0x0D, - 0x14, 0xCE, 0xEC, 0x4D, 0x38, 0xA7, 0x21, 0xE2, 0x07, 0x03, 0xCB, 0xB7, 0x44, 0xBF, 0x74, 0x42, - 0x24, 0x78, 0x7E, 0x33, 0xAC, 0x17, 0xDC, 0xA3, 0xD1, 0x0D, 0x4B, 0xA0, 0x26, 0xFE, 0xEE, 0x48, - 0x88, 0x16, 0xA6, 0x02, 0xFF, 0xD3, 0x32, 0x02, 0xDD, 0x06, 0x04, 0x68, 0xBF, 0xA2, 0xBD, 0xA1, - 0x82, 0xCA, 0xD8, 0x2D, 0x5B, 0x4C, 0x30, 0x01, 0xAC, 0x51, 0x61, 0x7F, 0x75, 0xD0, 0xB3, 0xF0, - 0x55, 0x29, 0x93, 0x9C, 0xF9, 0x4D, 0x87, 0x3B, 0x80, 0x54, 0x8E, 0x52, 0x3E, 0x87, 0x95, 0x04, - 0x71, 0x74, 0x89, 0xAF, 0x59, 0x5B, 0xA8, 0x0B, 0x8B, 0x42, 0x98, 0xF4, 0x5C, 0x57, 0x8D, 0x0D, - 0x84, 0x2F, 0x8E, 0xC9, 0x2E, 0xA1, 0xC8, 0xE0, 0x66, 0x07, 0x2C, 0x51, 0x2A, 0x3F, 0x92, 0xE1, - 0xBB, 0xF7, 0xF8, 0x76, 0x49, 0x94, 0xDE, 0x8F, 0x09, 0x2F, 0xEC, 0xC0, 0x94, 0x86, 0x07, 0xD7, - 0x48, 0x04, 0x74, 0x0D, 0x73, 0xB3, 0xCE, 0xDB, 0x4F, 0x28, 0xCB, 0x67, 0x51, 0x12, 0x66, 0xBA, - 0x9A, 0xFA, 0x96, 0x54, 0xA0, 0x9D, 0x28, 0x3D, 0xB1, 0xD9, 0x85, 0x72, 0x78, 0x92, 0x7D, 0x58, - 0xA1, 0xFF, 0xDD, 0x9A, 0x3A, 0x85, 0x4E, 0x6D, 0x55, 0x23, 0x56, 0x6A, 0x86, 0x12, 0x15, 0xAE, - 0x59, 0x75, 0x5B, 0x2C, 0xA3, 0xFC, 0x8D, 0xC3, 0x86, 0x49, 0xD4, 0x3F, 0xB1, 0xFB, 0x61, 0x1C, - 0xB3, 0xFC, 0x56, 0x28, 0xBB, 0xAD, 0x39, 0xF9, 0x2C, 0x78, 0x60, 0xC2, 0x22, 0x2D, 0xE7, 0x12, - 0xB0, 0x46, 0xA4, 0xEB, 0x98, 0x4F, 0xCA, 0x88, 0x79, 0xF5, 0x0A, 0xDE, 0xAE, 0xEA, 0x00, 0xA2, - 0x1E, 0x3D, 0xDF, 0x4E, 0x6D, 0xA4, 0x3B, 0x95, 0x35, 0x61, 0x70, 0x69, 0xCD, 0x70, 0x53, 0x4D, - 0x16, 0x17, 0x8A, 0x21, 0xA0, 0xE4, 0x32, 0xF1, 0x01, 0xFA, 0xB2, 0x3B, 0x2D, 0x1C, 0xF3, 0xBF, - 0x61, 0xFD, 0x62, 0x08, 0xE5, 0x69, 0xAB, 0x65, 0x08, 0x46, 0x02, 0xDE, 0x04, 0x9F, 0x84, 0xBC, - 0x3D, 0x13, 0x92, 0xA4, 0x9A, 0x54, 0x82, 0x69, 0x12, 0x5F, 0x70, 0x99, 0x82, 0x6D, 0x16, 0xA8, - 0xD6, 0x9E, 0x83, 0xEF, 0x04, 0xF0, 0x21, 0xA3, 0x0B, 0x34, 0x46, 0x50, 0x04, 0xC5, 0x1A, 0x13, - 0xE6, 0xA0, 0xE4, 0x34, 0x39, 0xBA, 0x2E, 0xE0, 0xD1, 0x70, 0x70, 0xF8, 0x2D, 0x8C, 0x99, 0x28, - 0xD2, 0x21, 0xA9, 0x2A, 0x00, 0xAA, 0xB6, 0x4B, 0xC3, 0xA3, 0x3E, 0x37, 0x5D, 0x62, 0x76, 0x4A, - 0x96, 0xE5, 0x12, 0x33, 0x49, 0x9A, 0xB8, 0xA0, 0x08, 0xBC, 0x16, 0x19, 0x42, 0xFF, 0x85, 0x98, - 0x86, 0x2D, 0xB5, 0x4D, 0x00, 0xF9, 0xF4, 0x47, 0xA1, 0xF4, 0x16, 0x59, 0x3A, 0xD8, 0x06, 0x95, - 0x89, 0xD9, 0xAC, 0x19, 0x3E, 0x32, 0xEA, 0xDE, 0x7C, 0x77, 0x83, 0x13, 0x34, 0x57, 0xD6, 0x44, - 0xD7, 0xC8, 0x32, 0xFB, 0x52, 0x9F, 0x55, 0x2C, 0x8F, 0x5F, 0x70, 0x42, 0x06, 0x7D, 0x16, 0x55, - 0xC5, 0x1B, 0x7C, 0x8F, 0x80, 0xCE, 0x0C, 0xF7, 0xF8, 0xD8, 0x60, 0x98, 0x93, 0x95, 0xCD, 0x7F, - 0xB2, 0x8A, 0xF9, 0x4F, 0x56, 0x31, 0xFF, 0x29, 0x89, 0x0E, 0x88, 0x05, 0x18, 0xE3, 0xF7, 0x56, - 0x71, 0x81, 0x27, 0x30, 0x17, 0x87, 0xAA, 0xB8, 0x19, 0x22, 0x1E, 0x0D, 0xA4, 0x12, 0x8F, 0x26, - 0x22, 0xD1, 0xD5, 0xE0, 0x7B, 0xD4, 0xF1, 0xA7, 0x10, 0x87, 0x7D, 0xFF, 0xF8, 0x30, 0x18, 0x05, - 0x6D, 0x22, 0x68, 0xEA, 0xAA, 0x54, 0x29, 0x98, 0x42, 0x5E, 0xA5, 0xDF, 0x26, 0x67, 0xF6, 0x44, - 0x5D, 0xA1, 0xE9, 0x18, 0x9F, 0x79, 0x3E, 0xCC, 0x7B, 0xFC, 0x26, 0xF2, 0x8A, 0xF9, 0xC9, 0xCC, - 0xD1, 0xBB, 0x14, 0x27, 0x04, 0x78, 0x98, 0x0A, 0xCC, 0x90, 0x9C, 0x9E, 0xF6, 0xFB, 0x4D, 0x30, - 0xCC, 0x40, 0x6D, 0xD5, 0x42, 0xE5, 0x71, 0x3D, 0xC6, 0x53, 0x19, 0x3A, 0xC5, 0x8A, 0x02, 0xC3, - 0x91, 0x0C, 0xC9, 0x55, 0x66, 0x5C, 0x22, 0x18, 0xD5, 0xF0, 0x4B, 0x04, 0xB4, 0x4B, 0xAA, 0xD7, - 0x8B, 0x53, 0x15, 0x22, 0xD3, 0xE8, 0x37, 0x24, 0x57, 0xC1, 0x14, 0x56, 0x26, 0x4C, 0x4C, 0x57, - 0xFF, 0x11, 0x3D, 0xDA, 0x60, 0xCD, 0xCB, 0xCD, 0xC9, 0x49, 0xBF, 0x2F, 0x1F, 0x03, 0xCC, 0xB6, - 0xF5, 0x88, 0x58, 0xA1, 0xEA, 0x36, 0x40, 0x66, 0x37, 0x10, 0x2A, 0x53, 0x57, 0x43, 0x13, 0xE9, - 0xBE, 0xE8, 0x9C, 0x53, 0xD6, 0x5F, 0xAE, 0x18, 0xF4, 0x47, 0x47, 0x7D, 0xE5, 0xB9, 0x62, 0xB6, - 0xE0, 0xAE, 0x0E, 0xF5, 0x30, 0x83, 0x29, 0xF7, 0x3F, 0xA8, 0xAF, 0xD1, 0x9F, 0xD2, 0x1E, 0xCF, - 0x39, 0xCB, 0x31, 0xAA, 0x0D, 0x83, 0xE3, 0xE1, 0xC0, 0x1F, 0xB8, 0xBB, 0x54, 0xE4, 0xD2, 0x48, - 0xA7, 0x92, 0xDF, 0x7D, 0x03, 0x2A, 0x52, 0xF4, 0x5E, 0xE0, 0xFC, 0x5C, 0xD4, 0x30, 0xE3, 0xC5, - 0xCA, 0x1E, 0x5C, 0xC8, 0xCA, 0xEB, 0xE4, 0xD7, 0x61, 0xAA, 0x51, 0x68, 0xD8, 0x3B, 0xAA, 0x0E, - 0xBB, 0x74, 0x9A, 0x6E, 0x48, 0xA8, 0xCE, 0x0F, 0xC9, 0x5A, 0x89, 0x38, 0x8D, 0xE6, 0xDC, 0xCA, - 0xC8, 0x30, 0x56, 0x8A, 0xC2, 0xC1, 0xF7, 0x54, 0xEC, 0x95, 0xB1, 0x12, 0x8D, 0x66, 0x11, 0xE5, - 0x06, 0x44, 0xC7, 0x48, 0x14, 0x1F, 0xE9, 0x1E, 0xD0, 0xE1, 0x11, 0xC5, 0xC7, 0xBE, 0xC1, 0x12, - 0x24, 0x2C, 0x26, 0x7D, 0xCA, 0x41, 0x32, 0xF3, 0xCA, 0xCA, 0xB8, 0x01, 0x34, 0xCC, 0xBC, 0x99, - 0xFD, 0xB9, 0x47, 0xCA, 0x51, 0xE1, 0x2D, 0x8E, 0xCB, 0xDA, 0x30, 0x03, 0x63, 0x3D, 0x12, 0x67, - 0xC7, 0xD5, 0xCD, 0x6B, 0xA1, 0xE2, 0xEA, 0xD8, 0xD9, 0x9B, 0x91, 0x8A, 0x15, 0x38, 0xF6, 0xBE, - 0xEA, 0xB3, 0x5C, 0x46, 0xD9, 0x8F, 0xB6, 0x74, 0x33, 0x96, 0x21, 0xA4, 0xDD, 0xC9, 0x01, 0x58, - 0x2B, 0xAC, 0x65, 0x60, 0x98, 0x80, 0x07, 0x8D, 0x5F, 0x56, 0x8F, 0x5C, 0xE2, 0xC4, 0xE9, 0x11, - 0xFF, 0x7F, 0xEC, 0xBD, 0x69, 0x73, 0x24, 0xCB, 0x76, 0x18, 0x16, 0xDE, 0x23, 0xF4, 0xC1, 0xFB, - 0x2E, 0x2F, 0x8D, 0xE2, 0x65, 0xB3, 0x6A, 0x3A, 0xD1, 0x53, 0x5B, 0xEF, 0x28, 0x40, 0x18, 0x0C, - 0xE6, 0x5E, 0xE8, 0xCE, 0xC6, 0x01, 0xE6, 0xDD, 0xF7, 0xD4, 0xD3, 0xC4, 0xAD, 0xE9, 0x4E, 0x00, - 0xF9, 0xA6, 0x51, 0x05, 0x56, 0x55, 0xCF, 0x0C, 0x1E, 0xBA, 0x68, 0x5A, 0xA6, 0x68, 0x53, 0xA2, - 0x64, 0x4A, 0xA6, 0x29, 0xDA, 0xA6, 0x2D, 0xD9, 0xA6, 0x4C, 0xD2, 0xA1, 0x70, 0x48, 0x0E, 0x86, - 0x37, 0x52, 0x76, 0xC4, 0xBD, 0x3F, 0xC0, 0xFF, 0xE1, 0xFD, 0x12, 0x47, 0x9E, 0x5C, 0x2A, 0xB3, - 0x96, 0x06, 0x66, 0xE6, 0x92, 0x7C, 0x34, 0x19, 0x33, 0xD1, 0xC8, 0xCA, 0x3C, 0x79, 0xF2, 0xE4, - 0xC9, 0x93, 0xFB, 0xC9, 0x73, 0xE8, 0xA0, 0x50, 0x43, 0x51, 0x5A, 0x43, 0x4E, 0x42, 0x37, 0x58, - 0x94, 0x86, 0x2B, 0x4A, 0xC3, 0x49, 0x5C, 0xF0, 0x95, 0xAD, 0x55, 0xAA, 0xE2, 0x2C, 0xF8, 0x4D, - 0xAA, 0x72, 0xDC, 0x09, 0x9A, 0xC5, 0x37, 0xB3, 0xC6, 0x52, 0x84, 0x49, 0xDD, 0xF0, 0x7A, 0xBB, - 0xE4, 0x13, 0xAB, 0xB3, 0x09, 0x3F, 0x22, 0xED, 0x60, 0x9B, 0x53, 0x87, 0xC8, 0x5A, 0x0C, 0xCC, - 0xD6, 0x98, 0x04, 0xD9, 0xDA, 0xA9, 0xE3, 0x89, 0x3D, 0x0B, 0x88, 0xC5, 0x0D, 0xDA, 0xC0, 0x69, - 0x7D, 0x61, 0x28, 0x8B, 0x9C, 0x99, 0x26, 0xFE, 0xE9, 0x40, 0x99, 0x3C, 0xAD, 0x76, 0xDB, 0x15, - 0x87, 0xCA, 0xC5, 0x80, 0xBB, 0xED, 0x58, 0x85, 0xF7, 0x9E, 0x9A, 0x36, 0x05, 0x8F, 0xD2, 0x0E, - 0xE2, 0x07, 0x0D, 0xA9, 0x78, 0xD8, 0xCB, 0x1F, 0xD1, 0xD9, 0x35, 0x09, 0xAF, 0x9B, 0x12, 0xA4, - 0x20, 0xAE, 0xD7, 0x6C, 0xA9, 0x53, 0x56, 0x53, 0xDC, 0x51, 0xA8, 0xDD, 0xC6, 0xC5, 0x01, 0x1F, - 0x85, 0x2E, 0x16, 0x1F, 0xCA, 0x42, 0x54, 0x83, 0xDF, 0xCE, 0xB6, 0x9D, 0x09, 0xD9, 0x0D, 0xEC, - 0xC9, 0xF6, 0x36, 0xD1, 0xD7, 0x11, 0xB8, 0x93, 0x75, 0xF8, 0x9A, 0xA8, 0x18, 0x45, 0x3A, 0x94, - 0x4F, 0xC5, 0x22, 0x24, 0x0D, 0x6C, 0x50, 0x73, 0xEA, 0x74, 0xD2, 0x72, 0xE6, 0x14, 0x11, 0x6E, - 0x85, 0x57, 0x39, 0x53, 0x9D, 0x68, 0xE4, 0xD6, 0xAD, 0x5D, 0x88, 0x35, 0xA9, 0x32, 0x5C, 0x25, - 0x79, 0x33, 0xEB, 0x35, 0xC8, 0x3F, 0xAE, 0x46, 0xE0, 0x56, 0x89, 0xAA, 0xC2, 0xA4, 0xCB, 0xD2, - 0x47, 0xB4, 0x95, 0x3D, 0x21, 0x3B, 0xA5, 0xF6, 0x62, 0xDB, 0x06, 0x9D, 0xD7, 0xD5, 0x66, 0xCA, - 0x4A, 0x0D, 0x85, 0xB5, 0x66, 0xCF, 0xE4, 0x05, 0x45, 0xE1, 0xB1, 0x40, 0x47, 0xF9, 0xD1, 0x8D, - 0x87, 0x7F, 0xD2, 0x3B, 0x8C, 0x7C, 0xBA, 0xAC, 0xAC, 0x9F, 0xF8, 0x11, 0x86, 0xB6, 0x6C, 0xE1, - 0x71, 0x0D, 0x83, 0xF6, 0x1F, 0x97, 0x64, 0x25, 0xF8, 0x6A, 0xC9, 0x95, 0x8F, 0xD3, 0x62, 0xAE, - 0x80, 0xED, 0x0B, 0x39, 0x33, 0x13, 0xD0, 0x8C, 0xDA, 0xC0, 0xF2, 0x2D, 0xBE, 0xC7, 0x51, 0x96, - 0x0D, 0x3F, 0x41, 0x4D, 0xA1, 0xC9, 0x53, 0x5D, 0x25, 0xB2, 0x86, 0x4A, 0x64, 0x9B, 0xC7, 0x80, - 0x3F, 0xAE, 0x0A, 0xD0, 0x5E, 0x24, 0x0F, 0x8A, 0x35, 0xEB, 0x3A, 0xFA, 0x42, 0x4D, 0x17, 0x25, - 0xE8, 0x5C, 0x08, 0x77, 0x3A, 0x85, 0x5E, 0xE4, 0x4F, 0x7C, 0xA7, 0xB9, 0x63, 0x4B, 0xFD, 0x44, - 0xB7, 0x49, 0x31, 0x5C, 0x76, 0xE8, 0xE8, 0xA6, 0xEA, 0x34, 0xD3, 0xA1, 0x5A, 0x2A, 0x88, 0xAB, - 0x46, 0xE4, 0x5A, 0xFE, 0xBD, 0x62, 0xF5, 0xC0, 0x93, 0xEE, 0xB9, 0x3B, 0x4A, 0x1C, 0x3F, 0xB7, - 0x79, 0x7D, 0x9D, 0x71, 0x75, 0x0F, 0x79, 0x93, 0xEB, 0xDD, 0xC3, 0x13, 0x8A, 0x78, 0x57, 0x45, - 0x5B, 0xE8, 0x25, 0xD7, 0xE7, 0xDE, 0x0D, 0xFC, 0x7B, 0x7C, 0x78, 0xAF, 0x3F, 0x5F, 0xA8, 0x64, - 0x46, 0x36, 0x0C, 0xBB, 0xAA, 0x87, 0xAF, 0x72, 0x1E, 0x9A, 0xAE, 0x58, 0xF7, 0x5F, 0xC0, 0x5A, - 0x58, 0x29, 0x03, 0xE7, 0xB5, 0xAB, 0x83, 0x09, 0x81, 0xE3, 0x85, 0xD2, 0x6C, 0x43, 0x50, 0xC6, - 0xA6, 0x06, 0xD5, 0xA2, 0xA9, 0x42, 0x55, 0xBA, 0x7A, 0x0D, 0x56, 0xB9, 0x4C, 0xA0, 0x4B, 0x6C, - 0x90, 0xF8, 0xA1, 0xCD, 0x1B, 0x7C, 0x9D, 0x96, 0x56, 0x81, 0x56, 0x79, 0xBA, 0x93, 0xA5, 0x17, - 0x1A, 0x26, 0x8A, 0xC3, 0x9C, 0x6C, 0x4A, 0x66, 0xC8, 0xB1, 0xAD, 0x49, 0xBA, 0x1B, 0xE0, 0x76, - 0x9B, 0xCD, 0xBC, 0xAD, 0xD2, 0xC2, 0x32, 0x9D, 0xE5, 0x22, 0x63, 0xB5, 0x60, 0xAC, 0xCB, 0x8B, - 0x7E, 0x9E, 0xA2, 0xDD, 0xBF, 0x54, 0xDD, 0xAF, 0x81, 0xBB, 0x24, 0x5A, 0x3A, 0xA9, 0x96, 0xAE, - 0x2F, 0xD4, 0xC9, 0x2C, 0xD7, 0x5E, 0x62, 0x8B, 0xB3, 0x18, 0xE4, 0xDF, 0x23, 0xB7, 0x48, 0x50, - 0x5E, 0x52, 0x85, 0xA4, 0x32, 0xF3, 0xE1, 0x72, 0x68, 0x35, 0x8A, 0x43, 0x05, 0x53, 0x71, 0xBB, - 0xB5, 0x51, 0x4A, 0x90, 0x23, 0x6A, 0x64, 0xE7, 0xCC, 0xE2, 0x3C, 0xCA, 0xC4, 0x4C, 0x94, 0xD5, - 0xEA, 0xE8, 0x96, 0x16, 0x0A, 0xFA, 0x10, 0x5E, 0x1A, 0x15, 0x33, 0x84, 0xB9, 0x18, 0xDF, 0xF5, - 0x18, 0xAE, 0xEE, 0x16, 0xAD, 0x79, 0x6D, 0x82, 0xAD, 0x3C, 0x9F, 0xC7, 0x57, 0xD7, 0xA0, 0x9B, - 0x23, 0xAE, 0x31, 0x18, 0xB8, 0xEA, 0x1B, 0x66, 0x43, 0xD7, 0xC3, 0x9C, 0x29, 0x63, 0x55, 0xDA, - 0xC1, 0x14, 0x8F, 0xCA, 0x2C, 0xD1, 0xD0, 0x72, 0xD1, 0x57, 0xAE, 0xCD, 0x44, 0x35, 0xD5, 0x4D, - 0x28, 0xD3, 0x8B, 0xBE, 0x50, 0x92, 0xE3, 0x6C, 0x16, 0x60, 0xED, 0x73, 0xB2, 0x81, 0x13, 0x3A, - 0x4A, 0x5D, 0xCA, 0xEB, 0x24, 0x94, 0x21, 0x2F, 0xC7, 0x4D, 0x78, 0x4B, 0x89, 0x53, 0x51, 0x5C, - 0x84, 0x6B, 0x6D, 0xD8, 0x5C, 0x98, 0x36, 0x1D, 0x5D, 0x6E, 0x1B, 0xAC, 0xE0, 0x10, 0x9D, 0x71, - 0x46, 0x6D, 0xA7, 0x12, 0xDD, 0xA5, 0x91, 0x41, 0xAF, 0x7B, 0xF9, 0x24, 0x21, 0x9B, 0xD5, 0x67, - 0xD7, 0x6B, 0x5E, 0x53, 0xC5, 0xDA, 0x33, 0x86, 0x6C, 0x56, 0x74, 0x82, 0xA2, 0xF6, 0x3A, 0x33, - 0x10, 0x9C, 0xA4, 0x96, 0x94, 0x20, 0x6E, 0xEA, 0x97, 0xD8, 0x5C, 0xD5, 0x65, 0x7B, 0x1B, 0x7C, - 0x81, 0x35, 0x9E, 0x7D, 0xC9, 0xC7, 0x51, 0x1D, 0xB3, 0xF6, 0xF0, 0x4E, 0x76, 0x4D, 0x3B, 0xD7, - 0xB5, 0xCB, 0x94, 0xBB, 0x33, 0xF1, 0xB6, 0x86, 0xB7, 0xC2, 0x44, 0x2E, 0x0C, 0x99, 0xE6, 0x50, - 0xBA, 0xED, 0x4C, 0x12, 0x4A, 0x4B, 0xB2, 0xBD, 0xAD, 0x52, 0x6B, 0x4F, 0xF0, 0x8E, 0x57, 0x5C, - 0xDB, 0x8A, 0x92, 0x4D, 0xD2, 0x49, 0xAC, 0x0E, 0x9E, 0x05, 0x11, 0xFD, 0xC8, 0xD8, 0xC7, 0xA4, - 0x38, 0x99, 0x28, 0xA2, 0xDD, 0x59, 0xC3, 0x21, 0x05, 0xE9, 0x24, 0x75, 0xB2, 0xD5, 0x49, 0x66, - 0xA5, 0x4D, 0x45, 0x42, 0xA9, 0xDA, 0x49, 0x27, 0x09, 0x1D, 0x6C, 0xFF, 0xA4, 0x29, 0x63, 0x6C, - 0x8C, 0xB5, 0x19, 0x03, 0xD7, 0xCD, 0x53, 0x6C, 0xD3, 0x1B, 0x0B, 0x19, 0x4E, 0x8B, 0x99, 0x22, - 0x29, 0x66, 0x8A, 0x78, 0x9A, 0xB2, 0x99, 0x22, 0xD9, 0x0D, 0x6A, 0x0E, 0xA7, 0x92, 0xED, 0xAC, - 0x43, 0xF4, 0xDE, 0x4D, 0x69, 0xC8, 0xAB, 0x2A, 0x27, 0x18, 0xDE, 0xD9, 0x82, 0xDD, 0x41, 0x6D, - 0x21, 0x81, 0xC1, 0x4A, 0xA9, 0xBC, 0x93, 0x22, 0x52, 0xE7, 0xBB, 0x24, 0x9F, 0x96, 0x50, 0x71, - 0xE6, 0xB7, 0x51, 0x93, 0x6C, 0x87, 0x4C, 0xCA, 0x57, 0x7B, 0x9C, 0xC3, 0x99, 0x7E, 0x17, 0x80, - 0x27, 0x51, 0x47, 0x1C, 0xA8, 0xB4, 0x71, 0xF9, 0xE4, 0x27, 0xBB, 0xF5, 0xD4, 0x3F, 0xA9, 0x7F, - 0x79, 0x9C, 0x75, 0x02, 0x4C, 0x65, 0x7B, 0xBD, 0x96, 0x13, 0x4A, 0x54, 0xDC, 0x4B, 0xC1, 0xED, - 0xD1, 0x45, 0x8E, 0xFC, 0xA1, 0xEF, 0x7C, 0x8A, 0x39, 0xB1, 0x73, 0x9C, 0xC1, 0xFD, 0x24, 0x7F, - 0x13, 0x23, 0x8D, 0x7B, 0x97, 0xE2, 0x0B, 0x0B, 0x6E, 0x62, 0x21, 0xC8, 0x94, 0xD9, 0xBA, 0xD7, - 0xBB, 0xB8, 0x8B, 0xA3, 0x45, 0xF7, 0xDA, 0xCA, 0x2E, 0x92, 0xF8, 0x1D, 0x5C, 0x4D, 0x1F, 0x26, - 0x49, 0x9C, 0x98, 0x5F, 0x33, 0x42, 0x5B, 0x70, 0xBB, 0xD6, 0xC2, 0xD1, 0xA2, 0x65, 0x7E, 0x76, - 0xC3, 0x80, 0xDF, 0xE7, 0xA8, 0x25, 0xC2, 0xD7, 0xB9, 0xD5, 0x9A, 0x87, 0x51, 0x14, 0x67, 0xAD, - 0xD7, 0xB8, 0xF5, 0x1A, 0x9F, 0xC5, 0x09, 0x6E, 0x01, 0x6E, 0x06, 0xCF, 0x8A, 0x11, 0x39, 0x78, - 0xA1, 0xB9, 0xF5, 0x75, 0x71, 0xAB, 0x77, 0xCF, 0xE4, 0x98, 0xB6, 0x65, 0xBA, 0xD5, 0xE1, 0x71, - 0xEF, 0x65, 0xDC, 0xFB, 0x0E, 0xF8, 0x07, 0xF0, 0xFB, 0x5E, 0xBD, 0x6F, 0x08, 0x69, 0xDD, 0x35, - 0x0B, 0x02, 0x45, 0xAB, 0x4D, 0x8E, 0x3C, 0xD3, 0xAC, 0x4E, 0xB5, 0x59, 0xDE, 0x61, 0x6D, 0x01, - 0x80, 0xB2, 0x35, 0x26, 0xB0, 0xD4, 0x77, 0xC0, 0x3F, 0x1A, 0xCB, 0xCA, 0xB6, 0x00, 0x84, 0xD9, - 0xAA, 0x73, 0x59, 0x42, 0xC7, 0x51, 0x92, 0x6C, 0x59, 0xA7, 0xB4, 0xDD, 0x4E, 0xF6, 0xC8, 0xB6, - 0x33, 0x26, 0x1F, 0xE9, 0x89, 0xA2, 0x49, 0xF3, 0x35, 0xC8, 0x6E, 0xD1, 0xC2, 0x96, 0x00, 0x75, - 0x4F, 0x14, 0x4A, 0x89, 0xA5, 0xF7, 0x0E, 0xA5, 0xD4, 0xF2, 0xC3, 0x8C, 0x42, 0xB6, 0x36, 0x42, - 0xA9, 0x92, 0x26, 0x0E, 0x7C, 0xC5, 0x98, 0xA3, 0xA8, 0x8F, 0x86, 0x81, 0x3D, 0x09, 0x77, 0x14, - 0xED, 0xC3, 0x90, 0x8E, 0x2F, 0x4C, 0x55, 0x33, 0x44, 0xF3, 0x00, 0x83, 0x0A, 0x58, 0xA7, 0x73, - 0xC1, 0x34, 0xF6, 0xE6, 0xC5, 0xF4, 0x54, 0xD6, 0x5F, 0x5F, 0x06, 0x53, 0x06, 0x1C, 0x5A, 0x42, - 0x8B, 0x5E, 0xE2, 0x6D, 0xB7, 0xE7, 0xAA, 0x06, 0xD9, 0x92, 0x29, 0xCE, 0xCC, 0xAD, 0x4A, 0x01, - 0xC9, 0x6E, 0x10, 0xB6, 0xDB, 0xC9, 0xCE, 0x85, 0x75, 0x13, 0x76, 0x82, 0x65, 0x41, 0x96, 0x28, - 0x2C, 0xA7, 0xA4, 0x2D, 0x02, 0x1B, 0x9D, 0x06, 0xC4, 0x5C, 0xA2, 0x05, 0xCA, 0x2C, 0xB4, 0x0A, - 0x1C, 0x74, 0x26, 0xDE, 0x0E, 0xAD, 0x76, 0x96, 0x85, 0xF9, 0x53, 0x69, 0x36, 0xDE, 0x5C, 0xA2, - 0x15, 0x05, 0x4D, 0x02, 0xBC, 0x7D, 0x86, 0xE2, 0x20, 0xDD, 0x3E, 0x45, 0x61, 0x31, 0x9C, 0x25, - 0x28, 0xB6, 0x26, 0xCB, 0xE9, 0xA2, 0xAC, 0x54, 0xBD, 0x9C, 0xAE, 0x66, 0xE8, 0x0C, 0x9D, 0xA2, - 0x10, 0x6D, 0x39, 0x16, 0x3A, 0xED, 0x04, 0x21, 0x3A, 0x0D, 0x82, 0x20, 0x6D, 0xB7, 0xCD, 0x45, - 0xA7, 0x83, 0x4E, 0x03, 0xDB, 0x42, 0x67, 0x34, 0xF6, 0x8C, 0x6B, 0x4A, 0xAD, 0x3A, 0x1D, 0x4A, - 0x8B, 0x05, 0xEA, 0xD5, 0xA7, 0xCC, 0x74, 0xDD, 0x82, 0x6D, 0x61, 0x97, 0xD3, 0xC5, 0xB6, 0x2A, - 0xA6, 0x29, 0x48, 0xB6, 0x59, 0x5B, 0x2C, 0x85, 0x44, 0xE9, 0xB6, 0x83, 0x4E, 0x3B, 0x1D, 0xE4, - 0x40, 0xE1, 0x3C, 0xBB, 0x58, 0x62, 0xD2, 0xC4, 0xC8, 0xB2, 0x72, 0xC8, 0xAE, 0x9D, 0xDB, 0x9C, - 0xA2, 0x14, 0x71, 0x75, 0xDB, 0xB7, 0x81, 0xAA, 0x4B, 0xB5, 0x54, 0x57, 0x0B, 0x36, 0x3C, 0x2F, - 0x5A, 0xAC, 0xD7, 0x36, 0x90, 0x86, 0xEB, 0x7A, 0xA5, 0x05, 0xBA, 0xB3, 0x6F, 0x3B, 0x9D, 0xC9, - 0x5B, 0x80, 0x8F, 0x59, 0xBB, 0x85, 0x1D, 0x89, 0xE9, 0xAD, 0x85, 0x78, 0xE4, 0x5B, 0xCB, 0x42, - 0x5A, 0x93, 0x89, 0xC1, 0x36, 0xCE, 0xD1, 0x66, 0x71, 0xD7, 0xC7, 0x44, 0xB1, 0x09, 0xE2, 0x8F, - 0x42, 0xD2, 0xC0, 0x46, 0x49, 0x90, 0xD1, 0xE9, 0x4D, 0x7F, 0x1F, 0x62, 0x4F, 0x62, 0x29, 0x5E, - 0x93, 0xB8, 0xD3, 0xA1, 0xEB, 0x9E, 0x24, 0x08, 0x82, 0x58, 0x79, 0x7F, 0x32, 0xED, 0x74, 0xD2, - 0xD9, 0x04, 0x4B, 0xB5, 0x27, 0x4D, 0x95, 0x95, 0x6B, 0xF9, 0xC6, 0xDB, 0x91, 0xD0, 0xF2, 0x25, - 0xB9, 0x85, 0xE2, 0x0E, 0xE8, 0x3E, 0x47, 0x9D, 0x80, 0x40, 0xB9, 0x14, 0x03, 0x5B, 0x45, 0x10, - 0x56, 0xCF, 0x58, 0x0C, 0x2E, 0x37, 0xEC, 0x65, 0x11, 0x38, 0xAD, 0x2E, 0xDE, 0x0C, 0x8D, 0xA3, - 0xBC, 0x5C, 0xDF, 0x52, 0xDF, 0x6F, 0xAC, 0x6E, 0xE9, 0x94, 0x5B, 0x9D, 0xF0, 0x79, 0xD9, 0xAC, - 0xAF, 0x50, 0x66, 0x58, 0xE5, 0x9D, 0x24, 0x51, 0x77, 0x92, 0x7C, 0x63, 0x85, 0xC8, 0x34, 0x9B, - 0x29, 0xEE, 0x78, 0x04, 0xCA, 0x82, 0xC0, 0xC6, 0xD1, 0x4B, 0x1F, 0x3D, 0x8A, 0x05, 0xC7, 0x94, - 0x36, 0x03, 0xEE, 0x5E, 0x86, 0x57, 0xA6, 0x69, 0xD2, 0xE5, 0x20, 0xF8, 0x6B, 0x41, 0x09, 0xCA, - 0x2C, 0xCB, 0xEA, 0x26, 0x78, 0xB1, 0x9A, 0x63, 0xD3, 0xE4, 0xF3, 0x02, 0xEE, 0x64, 0x96, 0x7C, - 0xC4, 0x8C, 0xC2, 0xC0, 0x46, 0x42, 0xFD, 0x7B, 0x72, 0xB1, 0x13, 0x31, 0xEB, 0xC4, 0xD1, 0xF6, - 0xC5, 0x4E, 0x6A, 0xDD, 0x24, 0xFC, 0x01, 0xD3, 0xF6, 0x85, 0x35, 0x81, 0x57, 0x0E, 0x79, 0xDC, - 0x09, 0x52, 0xF9, 0x30, 0x87, 0x96, 0x11, 0xA2, 0xCC, 0x9A, 0xC4, 0xBB, 0x73, 0x2A, 0x87, 0xDB, - 0xC1, 0x1C, 0xD1, 0x81, 0x4A, 0x0E, 0x3D, 0x6C, 0x1A, 0x08, 0x95, 0xDE, 0x15, 0x6F, 0x3B, 0xD6, - 0x64, 0xD9, 0x6E, 0xC7, 0xF2, 0x7D, 0xC3, 0x22, 0x58, 0xEE, 0xA5, 0xDB, 0xCE, 0x38, 0x9D, 0xF0, - 0xD2, 0x16, 0xA0, 0xC4, 0xBD, 0x10, 0x82, 0x9A, 0xE4, 0xB7, 0x8C, 0xF9, 0x24, 0x47, 0x3D, 0x77, - 0xD4, 0xFB, 0x4E, 0x2C, 0xF0, 0xE0, 0xAC, 0xAA, 0x9F, 0x32, 0xB2, 0x47, 0xAE, 0xB0, 0xAD, 0xD3, - 0xB7, 0x99, 0x86, 0xCA, 0xD0, 0x97, 0x76, 0xBC, 0x63, 0x69, 0x97, 0x37, 0x52, 0xDC, 0x1A, 0x95, - 0xB5, 0x4D, 0xAC, 0x9B, 0x74, 0x75, 0x85, 0x0B, 0xCB, 0xB7, 0x25, 0x0B, 0x38, 0xB8, 0xD6, 0x02, - 0x8E, 0xB8, 0x5B, 0x8C, 0x23, 0x46, 0xDE, 0xFE, 0x3C, 0x03, 0xD7, 0xAC, 0x6C, 0xBD, 0x26, 0x15, - 0xF9, 0xD8, 0xFB, 0x32, 0x70, 0x8E, 0xC6, 0xBB, 0x12, 0x2F, 0xA5, 0x3E, 0x5F, 0x05, 0x5D, 0x17, - 0xBF, 0x95, 0xF7, 0x98, 0x9A, 0x57, 0x43, 0x5D, 0x57, 0xB1, 0xAC, 0xDD, 0x1B, 0x47, 0xE0, 0x6C, - 0xF9, 0x8C, 0xCC, 0x99, 0x92, 0x2F, 0xF3, 0xAD, 0x6F, 0x1A, 0x85, 0xD9, 0x06, 0x03, 0x15, 0x7A, - 0x85, 0xFC, 0xA4, 0xAD, 0xA6, 0x9A, 0xAA, 0x55, 0x97, 0xAA, 0x29, 0x17, 0x4B, 0xBA, 0x8A, 0xFC, - 0x38, 0x6A, 0x54, 0xC5, 0x63, 0x95, 0x9E, 0x92, 0x75, 0x03, 0xCB, 0xB2, 0x4A, 0xAE, 0x1A, 0x99, - 0xB3, 0x5C, 0x6E, 0x77, 0x81, 0x31, 0xCC, 0x2C, 0xFC, 0xF5, 0x6A, 0x85, 0xD7, 0x11, 0x2F, 0xAD, - 0xA6, 0x00, 0x9A, 0x6E, 0xC5, 0x22, 0x85, 0x74, 0x7A, 0xB1, 0xCC, 0x4A, 0x65, 0x38, 0x1F, 0x5C, - 0x86, 0xEA, 0x19, 0x30, 0x50, 0x8B, 0x6D, 0x90, 0x1F, 0x3E, 0xD2, 0xAA, 0xD9, 0xC6, 0x5A, 0x36, - 0x12, 0xD5, 0xA4, 0x85, 0x4B, 0xE9, 0x0B, 0xBE, 0xC6, 0xC2, 0x4D, 0x2B, 0x5C, 0x56, 0xFD, 0xB1, - 0x2E, 0x99, 0xD9, 0x34, 0x86, 0x6C, 0x93, 0xB7, 0x56, 0x00, 0x63, 0x85, 0x97, 0xC1, 0x58, 0x6C, - 0x1E, 0x72, 0xDA, 0x9F, 0xC2, 0x27, 0xE7, 0x95, 0xF4, 0x53, 0xA2, 0xA0, 0x92, 0xCE, 0x1C, 0x58, - 0x46, 0xB9, 0xEB, 0xE2, 0x0D, 0x21, 0xD4, 0x27, 0xC3, 0x65, 0xD6, 0x7D, 0xAF, 0xB7, 0xD1, 0xB5, - 0x92, 0x74, 0x5D, 0x34, 0x4F, 0xB7, 0xA2, 0x1C, 0x5D, 0x4E, 0xAB, 0xF5, 0x11, 0xFB, 0x47, 0xDC, - 0x10, 0x96, 0xE4, 0xC8, 0xFE, 0x92, 0x1B, 0xD0, 0x28, 0xF4, 0x72, 0x6B, 0xF9, 0x11, 0x2E, 0x8B, - 0x2D, 0x28, 0x25, 0xBD, 0xC6, 0x48, 0x8A, 0x52, 0xB1, 0xF7, 0x81, 0xCE, 0x36, 0x25, 0xE9, 0x5A, - 0x4F, 0xAA, 0xF3, 0x00, 0x5B, 0x14, 0xF9, 0xC1, 0x35, 0xA7, 0x79, 0x6A, 0xAB, 0xCD, 0x05, 0xC1, - 0xD2, 0x4F, 0xED, 0x35, 0x52, 0x94, 0x04, 0x85, 0xDE, 0x4A, 0x6C, 0xF9, 0x3D, 0x44, 0xF5, 0x81, - 0x84, 0x86, 0xB5, 0x9C, 0xAA, 0xA0, 0xAE, 0x60, 0xCA, 0xD5, 0xA9, 0x24, 0xCE, 0x51, 0xCF, 0x71, - 0x3E, 0x6D, 0x62, 0x12, 0xF7, 0xC1, 0x77, 0xD1, 0x9B, 0x64, 0xEA, 0x92, 0xD5, 0x69, 0x49, 0x53, - 0x8C, 0x2C, 0x59, 0xCD, 0x66, 0xD3, 0x52, 0xB7, 0xDB, 0x0D, 0x93, 0xF3, 0x15, 0xB8, 0x13, 0xE6, - 0xF5, 0x13, 0x7A, 0x41, 0x7C, 0xC8, 0xBB, 0xD5, 0xB0, 0x76, 0xA4, 0xDF, 0xC1, 0x08, 0x24, 0x8A, - 0x12, 0x90, 0x61, 0x68, 0x36, 0xB4, 0x85, 0x12, 0x64, 0x49, 0xB9, 0x3F, 0x96, 0x3B, 0x5F, 0xCA, - 0xDD, 0x47, 0x3A, 0x24, 0xD2, 0x34, 0xB5, 0xEA, 0x15, 0xB5, 0x38, 0xE1, 0x85, 0x6A, 0x9C, 0x3E, - 0xA0, 0xF0, 0x64, 0x50, 0x8A, 0x3B, 0xC7, 0xCC, 0xE7, 0xF7, 0x66, 0x4C, 0x7B, 0x95, 0xAA, 0x14, - 0x5A, 0x5B, 0x2A, 0xD8, 0x1D, 0x14, 0xB8, 0x14, 0x70, 0xF1, 0x80, 0xE8, 0xA0, 0xEA, 0xCC, 0x5D, - 0xAD, 0x62, 0xB5, 0xF0, 0x8A, 0x72, 0x9B, 0x96, 0x58, 0xA3, 0xDC, 0xA6, 0x32, 0xA5, 0xCA, 0x52, - 0x69, 0x37, 0x1D, 0x37, 0x2B, 0x4D, 0x8A, 0x66, 0xE7, 0x2A, 0xCD, 0xCC, 0xD5, 0x11, 0xBE, 0x4D, - 0x95, 0xD2, 0xB5, 0xB2, 0x60, 0xCB, 0x66, 0x17, 0x9C, 0xE4, 0xCC, 0x64, 0x8B, 0xC1, 0xCD, 0x79, - 0x8A, 0x95, 0x77, 0x33, 0xA4, 0xA6, 0x1F, 0x49, 0x09, 0xE9, 0xF5, 0xDC, 0x51, 0x7F, 0x27, 0x20, - 0xED, 0x36, 0xD9, 0x09, 0x7A, 0x7D, 0xCF, 0x19, 0x15, 0x57, 0x46, 0x77, 0x42, 0xE3, 0x58, 0x93, - 0x5E, 0xDF, 0x73, 0xED, 0x1D, 0xBA, 0x83, 0x4C, 0x77, 0x82, 0xDE, 0xC0, 0xF3, 0xBD, 0x3D, 0xAD, - 0x17, 0x38, 0xB6, 0xEB, 0xDF, 0x33, 0xC9, 0x36, 0x94, 0x65, 0x75, 0xD2, 0x6D, 0xC8, 0xD0, 0xE9, - 0xF7, 0x7A, 0x5E, 0x7F, 0x8D, 0x37, 0xEA, 0x68, 0x8E, 0x29, 0x17, 0xF8, 0xCB, 0xC3, 0x22, 0xA4, - 0x22, 0xBF, 0x63, 0x5D, 0x6F, 0x29, 0x67, 0x22, 0x87, 0x77, 0xAD, 0xD7, 0x35, 0x22, 0xD7, 0xBB, - 0xB9, 0xD4, 0x65, 0xDD, 0xAC, 0xC9, 0x4A, 0x25, 0x76, 0x3F, 0x95, 0xE2, 0x23, 0x0D, 0xE7, 0x73, - 0x21, 0x92, 0xE7, 0x8F, 0xBC, 0x5B, 0xC9, 0x6F, 0xDE, 0x13, 0x8B, 0x74, 0x90, 0xFA, 0x19, 0x1D, - 0x2F, 0xE5, 0x08, 0x17, 0xE7, 0xA8, 0xEF, 0x7B, 0x9F, 0x72, 0xDC, 0x57, 0x67, 0xB4, 0x30, 0xA8, - 0x46, 0x43, 0xAD, 0x6A, 0xE2, 0x69, 0xBD, 0x83, 0xAC, 0xA4, 0x6D, 0xAD, 0x45, 0x88, 0x9C, 0xBA, - 0xCE, 0x76, 0x90, 0xD5, 0x7A, 0x4A, 0xD0, 0xA2, 0x15, 0x4E, 0xEA, 0xE0, 0xB2, 0x41, 0xB4, 0xE8, - 0xA2, 0xFB, 0x29, 0x4A, 0xF4, 0x87, 0xDF, 0x3F, 0x29, 0xA9, 0xD4, 0x2B, 0x9F, 0x07, 0xCF, 0x1E, - 0x3F, 0x7B, 0xA1, 0x78, 0x58, 0xD5, 0xA2, 0xD5, 0x18, 0xC8, 0xE7, 0xF6, 0xFA, 0xEB, 0x12, 0xD0, - 0xCE, 0xCE, 0x08, 0xE9, 0x65, 0xD1, 0x5C, 0xB5, 0x24, 0xE9, 0x09, 0x4A, 0x15, 0x1C, 0xD4, 0x54, - 0x67, 0x17, 0x35, 0x30, 0xC9, 0x43, 0x15, 0x76, 0x1A, 0x06, 0xAA, 0x32, 0xDD, 0x41, 0x95, 0x96, - 0xB1, 0xEB, 0x9A, 0x1C, 0x10, 0xB4, 0x8C, 0x9A, 0xA4, 0x02, 0x4F, 0xAD, 0x9C, 0x78, 0x6E, 0x8E, - 0xFC, 0x61, 0xDF, 0xFB, 0xB4, 0xF9, 0x9A, 0x2D, 0x12, 0xAB, 0xB3, 0x35, 0xDB, 0x3B, 0x26, 0xFA, - 0xDE, 0x31, 0xAA, 0x75, 0xCE, 0x07, 0x2F, 0xFC, 0xF8, 0x82, 0x5F, 0x73, 0x77, 0x2B, 0x2E, 0x62, - 0x6B, 0xFD, 0xE2, 0x2E, 0x82, 0xA8, 0x7B, 0x1A, 0xE1, 0xF7, 0xD9, 0xD1, 0x42, 0xBC, 0x73, 0x3F, - 0x95, 0x0F, 0xBC, 0x6A, 0x76, 0x8C, 0x69, 0xFD, 0x8E, 0x51, 0xCB, 0x50, 0x20, 0x60, 0x7B, 0x44, - 0x66, 0x50, 0xB0, 0x62, 0x69, 0x87, 0x2C, 0xCA, 0x8E, 0x78, 0x0B, 0xB2, 0x85, 0x77, 0x26, 0xCD, - 0x33, 0x6F, 0xF1, 0x6A, 0x3A, 0x90, 0x06, 0xA1, 0x8A, 0xA2, 0xB8, 0xF3, 0x7C, 0xD3, 0x46, 0x89, - 0xE6, 0xC0, 0xD6, 0x32, 0x2B, 0xF5, 0xB7, 0xAA, 0x2C, 0x91, 0x3E, 0xA3, 0xAC, 0x0F, 0xF5, 0xDB, - 0x9B, 0xCB, 0xD6, 0x8B, 0x90, 0xE4, 0x65, 0xE0, 0xE4, 0x68, 0xE0, 0x38, 0x9F, 0xE4, 0xAE, 0xB1, - 0x64, 0x2C, 0x96, 0x77, 0xF4, 0xE3, 0xC3, 0x93, 0xE3, 0xA2, 0xBF, 0xCA, 0x98, 0x9B, 0x7C, 0x63, - 0x8E, 0xEE, 0x03, 0x05, 0x78, 0x6A, 0xCF, 0x82, 0x1B, 0xE3, 0x6B, 0x63, 0x6C, 0xFC, 0xF8, 0xEF, - 0xFE, 0xB2, 0x81, 0xC2, 0xB1, 0xF1, 0xE3, 0xDF, 0xF8, 0x3B, 0x06, 0x7A, 0x3D, 0x36, 0x7E, 0xFC, - 0x6B, 0xBF, 0x62, 0xA0, 0x39, 0xFD, 0xFB, 0xAB, 0x06, 0x5A, 0xD0, 0xBF, 0x7F, 0xD3, 0x40, 0x98, - 0xFE, 0xFD, 0xEB, 0x06, 0x3A, 0x1B, 0x1B, 0xDF, 0xFC, 0x23, 0x03, 0x9D, 0x8F, 0x8D, 0x6F, 0xFE, - 0xB1, 0x81, 0x2E, 0x68, 0xEC, 0x6F, 0x1B, 0x88, 0xD0, 0xBF, 0x7F, 0xC3, 0x40, 0x3F, 0x1C, 0x1B, - 0x3F, 0xFE, 0xF5, 0xDF, 0x34, 0xD0, 0x1B, 0xFA, 0xF7, 0xD7, 0x0C, 0xB4, 0xA4, 0x7F, 0x7F, 0xD5, - 0x40, 0x97, 0xF4, 0xEF, 0xAF, 0x1B, 0x28, 0xA2, 0x7F, 0xFF, 0xD0, 0x40, 0xF1, 0xD8, 0xF8, 0xF1, - 0xDF, 0xFA, 0xBF, 0x0C, 0x74, 0x45, 0xFF, 0xFE, 0x81, 0x81, 0x7E, 0x9E, 0xC6, 0xFF, 0xA2, 0x81, - 0x12, 0xFA, 0xFD, 0x87, 0x06, 0x4A, 0xE9, 0xDF, 0x7F, 0x62, 0xA0, 0x8C, 0xC6, 0xFF, 0x96, 0x81, - 0x56, 0xF4, 0xEF, 0x6F, 0x1B, 0xE8, 0x2D, 0xFD, 0xFB, 0xFB, 0x06, 0x7A, 0x47, 0xFF, 0xFE, 0x43, - 0x03, 0xBD, 0xA7, 0x7F, 0xFF, 0xAA, 0x81, 0xAE, 0xC7, 0xC6, 0x8F, 0x7F, 0xE5, 0xB7, 0x0D, 0xF4, - 0x23, 0xFA, 0xF7, 0x1F, 0x18, 0xC8, 0xB8, 0x31, 0xC6, 0xC6, 0xFF, 0xFB, 0x8B, 0x06, 0x32, 0xD6, - 0xB4, 0x82, 0xBF, 0xF2, 0xF7, 0x0D, 0x64, 0xE4, 0xC6, 0xD8, 0xF8, 0xE6, 0x7F, 0x34, 0x90, 0xF1, - 0x0B, 0x34, 0xF0, 0xBF, 0x1B, 0xB9, 0xC2, 0x8C, 0xEE, 0x7E, 0x70, 0x63, 0xFC, 0x14, 0x03, 0xD0, - 0xE2, 0x1F, 0x54, 0xB9, 0x3C, 0xF5, 0x67, 0x05, 0x30, 0x32, 0xFE, 0x12, 0x0D, 0xFC, 0xDF, 0x06, - 0x32, 0xA6, 0xC6, 0xD8, 0x20, 0x3F, 0x34, 0x90, 0xF1, 0xEA, 0x15, 0x8D, 0xFA, 0x27, 0x06, 0x32, - 0x66, 0xC6, 0xD8, 0x58, 0x73, 0x6A, 0xBE, 0xF9, 0x5D, 0x4E, 0xCD, 0x99, 0xA0, 0xE5, 0x0F, 0x05, - 0x2D, 0xBF, 0xAF, 0x97, 0x79, 0xA0, 0x34, 0xD9, 0xB4, 0x47, 0x0B, 0xA3, 0xA8, 0xBF, 0xFD, 0x25, - 0x81, 0xFA, 0xDB, 0xDF, 0xE0, 0xA8, 0xBF, 0xFD, 0x6B, 0x06, 0x32, 0x7E, 0x8E, 0x06, 0x7E, 0xCB, - 0x40, 0xD0, 0x94, 0xDF, 0xFE, 0x1E, 0x2F, 0xED, 0xDB, 0xDF, 0xE6, 0xA5, 0x7D, 0xFB, 0xBF, 0xF1, - 0xE2, 0xBE, 0xFD, 0x07, 0xBC, 0xB8, 0x6F, 0xFF, 0x50, 0x2F, 0xEE, 0x45, 0xB9, 0x36, 0xDF, 0xFE, - 0x7D, 0x5E, 0x1B, 0xDA, 0xD0, 0xBC, 0xC8, 0xDF, 0xE1, 0x45, 0x7E, 0xF3, 0x3B, 0xA2, 0x80, 0xDF, - 0x13, 0x05, 0xFC, 0x9F, 0xA2, 0x80, 0xDF, 0x15, 0xF5, 0xF9, 0x5D, 0xBD, 0x80, 0x9F, 0x0D, 0x6E, - 0x74, 0xBC, 0xDF, 0xFE, 0x0F, 0x15, 0xBC, 0xDF, 0xFE, 0xCF, 0xA2, 0x2A, 0xFF, 0x8B, 0xA8, 0xCA, - 0xEF, 0xDF, 0x5E, 0xD2, 0xB7, 0x7F, 0xA0, 0x97, 0xF4, 0x25, 0x2F, 0x09, 0xA8, 0x6C, 0x62, 0xDA, - 0x6F, 0x35, 0xB3, 0x48, 0xB4, 0xC8, 0xB7, 0x7F, 0x4F, 0xC7, 0xFB, 0x83, 0x4A, 0x83, 0xFF, 0x4E, - 0x33, 0x8B, 0x80, 0xDE, 0xAF, 0x05, 0xBD, 0x37, 0xA2, 0xE2, 0x50, 0xD2, 0xFF, 0x5A, 0xA9, 0xC1, - 0x3F, 0xD4, 0x4B, 0x3A, 0x54, 0xDB, 0xBE, 0x3F, 0x13, 0x9C, 0xFB, 0x25, 0x51, 0x9F, 0x5F, 0x96, - 0xC5, 0xFD, 0x66, 0xB3, 0x10, 0xFC, 0xB6, 0x28, 0xF7, 0x7F, 0x12, 0xE5, 0xFE, 0x1F, 0xB7, 0x09, - 0xC1, 0x5F, 0x69, 0xAE, 0xE1, 0x7F, 0x2F, 0x8B, 0xFC, 0xDB, 0x42, 0x08, 0xFE, 0x1F, 0x21, 0xD3, - 0xFF, 0x48, 0x14, 0xF0, 0x8F, 0x45, 0x01, 0xBF, 0xA3, 0xE3, 0xFD, 0x42, 0xAD, 0xCF, 0x40, 0xD6, - 0xE7, 0x57, 0x36, 0xB4, 0xCF, 0x77, 0x21, 0xD4, 0x53, 0x23, 0x30, 0x44, 0x2F, 0x85, 0x66, 0xD0, - 0xE5, 0xEF, 0xF7, 0x36, 0xCB, 0xDF, 0x29, 0x6F, 0x20, 0x5D, 0x0C, 0x37, 0x88, 0xCB, 0x1F, 0x18, - 0x79, 0x8E, 0xDC, 0xDE, 0xB0, 0xB8, 0x3F, 0x7D, 0x1B, 0x26, 0x2D, 0x82, 0xD2, 0xC9, 0xC7, 0xEC, - 0xDA, 0x9D, 0xD3, 0xC3, 0xE3, 0x83, 0xFD, 0xE7, 0x87, 0x0F, 0x29, 0xEF, 0x1C, 0xFA, 0x63, 0x8B, - 0x51, 0x48, 0x75, 0x17, 0x86, 0xE9, 0x92, 0x26, 0x30, 0x5E, 0xD9, 0x06, 0xC2, 0xDD, 0xE3, 0x67, - 0x5F, 0x04, 0xC6, 0x3F, 0x05, 0xA1, 0x93, 0xEF, 0x07, 0xC6, 0x3F, 0x4D, 0x43, 0x87, 0x34, 0xF4, - 0xCF, 0x40, 0xE8, 0xD9, 0x49, 0x60, 0xFC, 0xB3, 0x10, 0x7A, 0xFA, 0xB3, 0x81, 0xF1, 0xCF, 0xD1, - 0xD0, 0xFE, 0xC1, 0x97, 0x81, 0xF1, 0xCF, 0xD3, 0xD0, 0x83, 0xC3, 0xC7, 0x81, 0xF1, 0x2F, 0x40, - 0xE8, 0x38, 0x30, 0x5E, 0xBD, 0xA6, 0xA1, 0x2F, 0x4E, 0x02, 0xE3, 0x55, 0x46, 0x43, 0x8F, 0x1F, - 0x05, 0xC6, 0xAB, 0x88, 0x86, 0xBE, 0x47, 0xE3, 0xDE, 0xD2, 0xD0, 0x23, 0x1A, 0x77, 0x46, 0x43, - 0x07, 0x2F, 0x02, 0xE3, 0x55, 0xC2, 0x28, 0x08, 0x8C, 0x7F, 0x11, 0x02, 0x47, 0x81, 0xF1, 0x2F, - 0xD1, 0xC0, 0xC3, 0xC7, 0x87, 0x81, 0xF1, 0x2F, 0x43, 0xE8, 0xC0, 0x09, 0x8C, 0x7F, 0x85, 0x85, - 0xDC, 0xC0, 0xF8, 0x57, 0x59, 0xC8, 0x0B, 0x8C, 0x7F, 0x8D, 0x85, 0xFC, 0xC0, 0xF8, 0xD7, 0x69, - 0xE8, 0xE9, 0xFE, 0x97, 0x81, 0xF1, 0x6F, 0x00, 0x92, 0x1F, 0x3C, 0x0D, 0x8C, 0x7F, 0x93, 0xD5, - 0xE2, 0x41, 0x60, 0xFC, 0x5B, 0x50, 0xD6, 0xFE, 0xD3, 0xC0, 0xF8, 0xB7, 0x21, 0xEE, 0x49, 0x60, - 0xFC, 0x3B, 0x00, 0xF6, 0xF2, 0x41, 0x60, 0xFC, 0xBB, 0x10, 0x75, 0x7C, 0x10, 0x18, 0x7F, 0x11, - 0x88, 0x3B, 0x0E, 0x8C, 0x7F, 0x8F, 0x06, 0x3E, 0x3F, 0x0E, 0x8C, 0x7F, 0x9F, 0x06, 0x5E, 0x1C, - 0x07, 0xC6, 0x7F, 0x40, 0x03, 0x2F, 0x8F, 0x03, 0xE3, 0x3F, 0x84, 0x7C, 0xCF, 0x61, 0x9D, 0x87, - 0xBB, 0x0F, 0x69, 0xDD, 0xFF, 0x23, 0x23, 0x37, 0x09, 0xF0, 0x99, 0xAE, 0x38, 0x28, 0xBB, 0x6F, - 0x72, 0xCB, 0x42, 0x66, 0x0A, 0x0D, 0xC0, 0xE2, 0x1C, 0x88, 0xEB, 0x3E, 0xDF, 0x7F, 0x18, 0x18, - 0xDF, 0xFC, 0xA2, 0x81, 0xD2, 0xEE, 0x17, 0xCF, 0x9E, 0x07, 0xC6, 0x37, 0xFF, 0x31, 0x0D, 0x3E, - 0x78, 0xFE, 0x45, 0x60, 0x7C, 0xF3, 0x57, 0x69, 0xF0, 0xE9, 0x03, 0x1A, 0xFC, 0x4F, 0x68, 0xF0, - 0xE8, 0x29, 0x85, 0xFD, 0x25, 0x88, 0xA5, 0xC5, 0x7C, 0xF3, 0xD7, 0x68, 0xF0, 0xF8, 0x78, 0x3F, - 0x30, 0xBE, 0xF9, 0x65, 0x1A, 0x3C, 0x84, 0xE0, 0x7F, 0x0A, 0xC8, 0x4E, 0x8E, 0x03, 0xE3, 0x9B, - 0xFF, 0x8C, 0x05, 0xFF, 0x72, 0x60, 0x7C, 0xF3, 0x2B, 0x34, 0xF8, 0x3D, 0x88, 0xFD, 0xEB, 0x34, - 0xF8, 0xFC, 0x31, 0x45, 0xF6, 0x37, 0x58, 0xF0, 0x65, 0x60, 0x7C, 0xF3, 0xAB, 0x34, 0xF8, 0xE2, - 0x28, 0x30, 0xBE, 0xF9, 0x9B, 0x0C, 0xAD, 0x1B, 0x18, 0xDF, 0xFC, 0x2D, 0x16, 0xF4, 0x02, 0xE3, - 0x9B, 0xFF, 0x9C, 0x06, 0x1F, 0x1E, 0x50, 0x04, 0xBF, 0x06, 0xB9, 0x5E, 0x3A, 0x81, 0xF1, 0xCD, - 0xDF, 0x66, 0x41, 0x0A, 0xFB, 0x77, 0x00, 0x16, 0x4A, 0xF8, 0x2F, 0x68, 0xF0, 0xE0, 0x80, 0x52, - 0xFE, 0xEB, 0x34, 0xF8, 0xE4, 0xAB, 0xC0, 0xF8, 0xE6, 0xBF, 0x84, 0xF4, 0xE7, 0x94, 0xC4, 0xDF, - 0x00, 0x6A, 0x21, 0xF8, 0x77, 0x21, 0xF6, 0x19, 0xCD, 0xF5, 0x9B, 0x10, 0xFC, 0xFC, 0x80, 0xD2, - 0xF0, 0x5F, 0x41, 0x18, 0x82, 0xFF, 0x35, 0x20, 0xA3, 0x52, 0xF0, 0xCD, 0x7F, 0xC3, 0x8A, 0x08, - 0x8C, 0x6F, 0x7E, 0x8B, 0x86, 0x9E, 0xD1, 0x36, 0xFA, 0xE6, 0xBF, 0x05, 0x12, 0x9E, 0x04, 0xC6, - 0x37, 0xFF, 0x1D, 0x0D, 0xED, 0x3F, 0xA7, 0x91, 0x7F, 0xCF, 0x40, 0xA6, 0x2A, 0xFA, 0x9C, 0xE9, - 0xB2, 0x27, 0x00, 0xF3, 0x8F, 0x4F, 0x82, 0xAF, 0x3F, 0xBB, 0x21, 0xB4, 0xAD, 0xF3, 0x57, 0xAF, - 0xBE, 0xCE, 0xD1, 0xC0, 0x1B, 0x8D, 0x3E, 0x6D, 0xC9, 0x8D, 0xE9, 0x57, 0x98, 0xE1, 0x2F, 0xF1, - 0xF5, 0xEB, 0x38, 0x4C, 0x16, 0xB0, 0xAE, 0xAD, 0xAE, 0xC0, 0x69, 0xDF, 0xA6, 0x2B, 0xF0, 0x1B, - 0x7F, 0x38, 0x9E, 0x1A, 0xB6, 0x81, 0x0C, 0xCB, 0x98, 0x21, 0x7F, 0x34, 0x9E, 0x1A, 0x8E, 0x81, - 0x8C, 0x2D, 0x63, 0x86, 0x7A, 0xF6, 0x78, 0x6A, 0xB8, 0x30, 0xD4, 0xCC, 0x50, 0xCF, 0x19, 0x4F, - 0x0D, 0xCF, 0x40, 0xC6, 0x4F, 0xD1, 0x0F, 0x77, 0x3C, 0x35, 0x7C, 0x03, 0x19, 0x9F, 0xD1, 0x0F, - 0x6F, 0x3C, 0x35, 0x7A, 0x06, 0x32, 0x7E, 0x9A, 0x7E, 0xF8, 0xE3, 0xA9, 0xD1, 0x87, 0x91, 0x67, - 0x86, 0x7A, 0xBD, 0xF1, 0xD4, 0x18, 0x18, 0xC8, 0x68, 0xD3, 0x8F, 0xFE, 0x78, 0x6A, 0x0C, 0x0D, - 0x64, 0xDC, 0xA3, 0x1F, 0x83, 0xF1, 0xD4, 0x18, 0x19, 0xC8, 0x30, 0x8D, 0x19, 0x72, 0x86, 0x34, - 0x69, 0x62, 0x20, 0x63, 0x0C, 0x5F, 0x34, 0x2D, 0x30, 0x90, 0xD1, 0x81, 0x2F, 0x4A, 0x1E, 0x32, - 0x90, 0xB1, 0x03, 0x5F, 0x94, 0xBE, 0x6D, 0x03, 0x19, 0xA7, 0xF4, 0x6B, 0x44, 0x09, 0xEC, 0x1A, - 0xC8, 0xD8, 0x85, 0x2F, 0x4A, 0xE1, 0x7D, 0x03, 0x19, 0x7B, 0xF0, 0x45, 0x49, 0xFC, 0x1A, 0x86, - 0xB3, 0x19, 0x72, 0x1D, 0x9A, 0x6F, 0x0A, 0xE3, 0xDE, 0x0C, 0xB9, 0x2E, 0xCD, 0xF7, 0xEA, 0x15, - 0x8C, 0x7E, 0xF4, 0x93, 0x66, 0x9C, 0xC1, 0x10, 0x48, 0xBF, 0x68, 0xC6, 0x9F, 0x31, 0xD0, 0xCF, - 0x18, 0x3F, 0x33, 0xCB, 0x27, 0x4D, 0xFC, 0xD4, 0xEE, 0x1E, 0x89, 0xAA, 0xB7, 0x70, 0x93, 0x5D, - 0x5F, 0xE1, 0xB1, 0x8D, 0x98, 0x43, 0xC9, 0xF1, 0x96, 0x83, 0xDE, 0xE0, 0xEB, 0x31, 0xE3, 0x7F, - 0x8E, 0xC2, 0xC0, 0xC4, 0x5D, 0xB0, 0xC6, 0xF7, 0x25, 0xBE, 0xDE, 0x73, 0xC6, 0xB6, 0xB5, 0x36, - 0x71, 0x37, 0x5C, 0xC2, 0xA7, 0xCB, 0x3F, 0xE7, 0x59, 0xB2, 0xA4, 0xDF, 0x3E, 0xFF, 0xBE, 0xC4, - 0x59, 0x48, 0xBF, 0x87, 0x63, 0xDB, 0x9A, 0x70, 0xCF, 0x4C, 0xB8, 0xFB, 0x06, 0x5F, 0x1F, 0xC4, - 0x0B, 0xCC, 0xBD, 0x2F, 0xD9, 0x63, 0xE3, 0xE5, 0xD1, 0x97, 0xF8, 0xFA, 0x28, 0xBA, 0x5A, 0x65, - 0x2F, 0xAF, 0xF6, 0x93, 0x24, 0x7E, 0x67, 0x80, 0x76, 0xCB, 0x1B, 0x7C, 0xBD, 0x17, 0xD3, 0xDF, - 0x20, 0xDB, 0x4B, 0xBB, 0x07, 0x36, 0x15, 0xB6, 0x8E, 0xF1, 0x6C, 0xDF, 0x18, 0x17, 0x5F, 0xD3, - 0x7D, 0x43, 0xCD, 0xFF, 0x18, 0x9F, 0x65, 0xB7, 0x63, 0x78, 0xA8, 0x61, 0x78, 0xA8, 0x61, 0x80, - 0xC7, 0xF8, 0xB7, 0xA3, 0x38, 0xD0, 0x50, 0x1C, 0x68, 0x28, 0x1E, 0xC6, 0xEF, 0x22, 0x1D, 0x03, - 0xDC, 0xEE, 0x57, 0x70, 0x3C, 0xD0, 0x70, 0x3C, 0x30, 0xF8, 0xE5, 0x2C, 0x73, 0x28, 0x35, 0x1C, - 0x83, 0xFE, 0x12, 0x63, 0xB0, 0x75, 0xC3, 0xB2, 0x4B, 0x70, 0x08, 0x3C, 0x3C, 0x7C, 0x2C, 0xAE, - 0x73, 0x8B, 0x54, 0x19, 0xC9, 0xD0, 0x8C, 0x18, 0x1A, 0xD1, 0x70, 0x15, 0x44, 0xC6, 0xF4, 0xAF, - 0x18, 0x55, 0x24, 0x5F, 0x9C, 0xA0, 0xB8, 0xCB, 0xE4, 0x20, 0xD8, 0xB2, 0x55, 0x7C, 0x8E, 0x37, - 0x66, 0x70, 0xB2, 0xED, 0x75, 0x9A, 0x0E, 0x5E, 0x8C, 0xF9, 0xDF, 0x26, 0x0C, 0xEE, 0x60, 0xAC, - 0xD3, 0x80, 0x04, 0x2A, 0xC9, 0x25, 0x1D, 0xE5, 0xE1, 0xF1, 0x81, 0xD5, 0x84, 0xCC, 0x1B, 0xB0, - 0xFA, 0x71, 0x41, 0xE3, 0x36, 0xFC, 0xC2, 0xBD, 0x32, 0x22, 0x63, 0xEA, 0x4C, 0x8C, 0x8E, 0x19, - 0x76, 0x1C, 0xAB, 0x63, 0x3C, 0x34, 0x10, 0x4B, 0x0E, 0x74, 0x00, 0xEF, 0xA1, 0x51, 0x25, 0xC1, - 0x24, 0x7B, 0xC6, 0x6B, 0x63, 0x4C, 0xD3, 0x7B, 0x0F, 0x0D, 0xCB, 0xB2, 0xC6, 0x77, 0x10, 0x28, - 0x8D, 0xC4, 0xD1, 0x47, 0x90, 0x78, 0xD0, 0x44, 0xE2, 0x41, 0x03, 0x89, 0x67, 0x9C, 0xC4, 0x83, - 0x26, 0x12, 0xCB, 0x02, 0xAB, 0x91, 0x38, 0xFC, 0x08, 0x12, 0xF7, 0x0D, 0x44, 0xD6, 0x6B, 0x80, - 0xD8, 0x2A, 0x53, 0xB9, 0x6F, 0xAC, 0xD7, 0x75, 0x99, 0x7B, 0xFB, 0x46, 0x3D, 0x75, 0xE5, 0x3E, - 0xAD, 0x52, 0xE7, 0xDB, 0x1F, 0x41, 0xDD, 0x83, 0x0D, 0xD4, 0x3D, 0x68, 0xA2, 0xEE, 0x41, 0x03, - 0x75, 0xE5, 0x8E, 0xAA, 0x51, 0xD7, 0x1B, 0x17, 0xDD, 0x6B, 0xBD, 0x96, 0x63, 0x60, 0x5D, 0x11, - 0xEE, 0x2F, 0xE8, 0x7D, 0xDC, 0xEF, 0xF3, 0xD2, 0x42, 0xA5, 0xB4, 0xA9, 0x57, 0xD4, 0xE2, 0x17, - 0xB4, 0x82, 0xBD, 0x5F, 0xD0, 0x5B, 0xAD, 0x36, 0xB7, 0xC2, 0x83, 0x2F, 0x8C, 0xB1, 0x56, 0x8D, - 0x2F, 0x34, 0x6C, 0x5F, 0xE8, 0xC8, 0x7A, 0xB7, 0x20, 0x7B, 0x54, 0x42, 0xF6, 0x48, 0x43, 0xF6, - 0x48, 0x47, 0xE6, 0x29, 0x3C, 0xD9, 0x8B, 0xBB, 0x74, 0x62, 0x09, 0xDC, 0x71, 0x31, 0x3F, 0x54, - 0x38, 0xD3, 0xD3, 0xEA, 0x5C, 0x4D, 0x2E, 0xD5, 0xDC, 0xAF, 0xC1, 0xEF, 0x6D, 0xC2, 0xDF, 0xDF, - 0x8C, 0xBF, 0xAF, 0xE3, 0x77, 0x1C, 0xF7, 0x16, 0x6E, 0x3C, 0x57, 0x6B, 0xFF, 0xEC, 0x79, 0x29, - 0xB7, 0x77, 0x4B, 0xEE, 0x9F, 0xD5, 0x72, 0xFF, 0x6C, 0x29, 0xB7, 0x7F, 0x4B, 0xEE, 0x17, 0x5A, - 0xEE, 0x17, 0xA5, 0xDC, 0xB7, 0xB5, 0xE3, 0xB1, 0x96, 0xFB, 0xB8, 0x94, 0xBB, 0x5E, 0xA4, 0x7A, - 0x4D, 0x12, 0xE9, 0xF4, 0xCA, 0x8C, 0x1B, 0xD4, 0x22, 0x18, 0x34, 0x22, 0x18, 0x94, 0x11, 0x0C, - 0x6B, 0x11, 0x0C, 0x1B, 0x11, 0x0C, 0xCB, 0x08, 0x46, 0xB5, 0x08, 0x46, 0x8D, 0x08, 0x46, 0x25, - 0x04, 0xAE, 0x5D, 0x87, 0xC0, 0xB5, 0x9B, 0x10, 0xB8, 0x76, 0x19, 0x81, 0x53, 0x8B, 0xC0, 0x69, - 0x44, 0xE0, 0x94, 0x11, 0xD4, 0x4A, 0x9F, 0xDB, 0x38, 0x2E, 0xB8, 0x5E, 0x19, 0x41, 0xAD, 0x00, - 0xBA, 0x7E, 0x23, 0x02, 0x5F, 0x22, 0x10, 0x1E, 0x29, 0xC9, 0x99, 0xB9, 0xA5, 0x8C, 0x65, 0xFA, - 0x10, 0xC7, 0xA6, 0x6B, 0x1A, 0x12, 0x63, 0x32, 0x39, 0x33, 0x49, 0xBB, 0xBD, 0x15, 0xAD, 0xD7, - 0x5B, 0x75, 0xC9, 0x5B, 0x44, 0xCF, 0x56, 0x8B, 0x77, 0xAB, 0x58, 0x2F, 0xF2, 0x45, 0x53, 0x41, - 0x01, 0x84, 0xC5, 0x2A, 0xA1, 0x00, 0x6C, 0xB7, 0xE5, 0x6A, 0x72, 0x37, 0xF0, 0x87, 0x5C, 0x93, - 0x99, 0x46, 0x89, 0x27, 0x40, 0x62, 0xB1, 0x42, 0x97, 0xB2, 0x1C, 0xAB, 0x82, 0xD4, 0x34, 0x4E, - 0xAB, 0x6B, 0x34, 0x60, 0xCC, 0xCB, 0x63, 0x8B, 0x6E, 0x1F, 0xEA, 0x13, 0x9F, 0xBE, 0x7C, 0x6C, - 0x59, 0xE3, 0x7E, 0x4F, 0xA4, 0x1E, 0x80, 0xF3, 0x77, 0x93, 0x0F, 0x44, 0x8E, 0xF6, 0x82, 0x2F, - 0x0B, 0x92, 0xA9, 0x04, 0x9A, 0xD5, 0x38, 0x08, 0x9F, 0xEA, 0xCB, 0xEA, 0x19, 0x18, 0x72, 0xB7, - 0x4A, 0x43, 0x14, 0x91, 0xD7, 0xAF, 0x4A, 0x85, 0xFB, 0x3D, 0xA5, 0xFE, 0x3B, 0xC1, 0xC8, 0x56, - 0xFD, 0x96, 0x8B, 0xA1, 0x50, 0x02, 0x6C, 0xF7, 0xFD, 0xB1, 0xFC, 0xE8, 0x78, 0xEE, 0x84, 0x3D, - 0xD3, 0x63, 0x2F, 0x13, 0xA4, 0x3D, 0x23, 0xB8, 0xD0, 0x03, 0x93, 0x5F, 0x82, 0x28, 0x78, 0x9A, - 0x40, 0xBA, 0x59, 0xFC, 0xF2, 0xEA, 0x0A, 0x27, 0x07, 0x61, 0x8A, 0x4D, 0xCB, 0x42, 0x65, 0xFA, - 0x72, 0x41, 0x9F, 0xE7, 0xAA, 0x5C, 0x29, 0xD7, 0x43, 0xD9, 0x23, 0x08, 0x4E, 0x8E, 0x8D, 0x96, - 0x61, 0xC9, 0xEA, 0x19, 0x0F, 0x71, 0xB8, 0x50, 0xD8, 0x8E, 0xBB, 0xF3, 0x78, 0xC1, 0xB5, 0xE3, - 0xD3, 0xAF, 0x48, 0x76, 0x61, 0x1A, 0x5F, 0xE2, 0x6B, 0xC3, 0x92, 0xA6, 0x39, 0x79, 0x3A, 0xD8, - 0xA9, 0xF3, 0x90, 0xAF, 0x52, 0x4E, 0x37, 0xAE, 0x41, 0xD6, 0xCD, 0xE2, 0xC7, 0xF1, 0xBB, 0x46, - 0xCA, 0x33, 0x75, 0x69, 0x99, 0xB3, 0x6A, 0x6C, 0xE2, 0x31, 0x97, 0xA8, 0x3A, 0xB6, 0xA9, 0xAC, - 0xB6, 0xC6, 0x3A, 0x23, 0xF6, 0x74, 0xF1, 0x19, 0x2B, 0x45, 0xF4, 0x1C, 0xAD, 0x88, 0x5E, 0xEF, - 0x4E, 0x45, 0xF4, 0x9C, 0x8E, 0x3B, 0xB0, 0xC6, 0xBD, 0x7E, 0x53, 0x29, 0x0F, 0x0F, 0x1F, 0x8F, - 0x5D, 0x67, 0xD4, 0x94, 0x7C, 0x78, 0x7C, 0x30, 0x76, 0x5D, 0xBB, 0x29, 0xF9, 0xD1, 0xF1, 0xD8, - 0x75, 0x9D, 0x8A, 0x80, 0xCB, 0xF4, 0xCF, 0x8F, 0xAD, 0x42, 0x05, 0x39, 0x47, 0x3E, 0x77, 0xE8, - 0xFF, 0x91, 0x5B, 0xFF, 0x97, 0xD9, 0xD9, 0xF0, 0x24, 0x7E, 0x99, 0x9D, 0x79, 0x6E, 0x90, 0x75, - 0x59, 0xC5, 0x8B, 0xEF, 0x15, 0xFD, 0x2B, 0xDE, 0xD0, 0x04, 0x59, 0x9D, 0x6E, 0x46, 0x71, 0x35, - 0x50, 0x97, 0xA8, 0x1E, 0xD5, 0x49, 0xDB, 0x9F, 0xFD, 0x5E, 0xCF, 0xEB, 0xED, 0x99, 0x78, 0x3B, - 0x80, 0xDB, 0x7F, 0x54, 0xC7, 0x6E, 0x50, 0x13, 0xE8, 0x98, 0x78, 0x77, 0xD7, 0xB1, 0x2D, 0xAB, - 0x53, 0xDB, 0x22, 0x3F, 0xED, 0xD8, 0xAE, 0xDF, 0x01, 0x3D, 0x02, 0xCB, 0x1A, 0xD7, 0x82, 0x58, - 0x39, 0x2A, 0xD7, 0x42, 0xDD, 0x86, 0xC3, 0x7B, 0x20, 0x2C, 0x55, 0x27, 0x98, 0x96, 0xB2, 0x62, - 0x6F, 0x2E, 0x09, 0xB2, 0x49, 0xB2, 0x43, 0x26, 0x9D, 0x4E, 0x22, 0xC5, 0x7E, 0x9A, 0xCC, 0x26, - 0x99, 0xA8, 0x43, 0x26, 0xEA, 0x90, 0x76, 0x6A, 0xA5, 0x86, 0x57, 0x23, 0xDB, 0x50, 0x8D, 0x4C, - 0xAF, 0x46, 0x03, 0xA2, 0x4C, 0x36, 0x7A, 0x4A, 0xAB, 0xA4, 0x37, 0x54, 0xD5, 0x85, 0xA4, 0xB4, - 0x2F, 0x19, 0x65, 0x38, 0x21, 0x97, 0x81, 0xAD, 0x7B, 0xCF, 0x52, 0xE2, 0x17, 0x78, 0x0E, 0x9C, - 0x52, 0x95, 0xB6, 0xA5, 0xFE, 0x39, 0x9D, 0x8B, 0x88, 0x78, 0xE2, 0x62, 0x2B, 0x8A, 0xEB, 0x8A, - 0xEF, 0x26, 0x8E, 0x4A, 0xCD, 0xAD, 0x28, 0x5D, 0x24, 0x9D, 0x8E, 0xD4, 0x0D, 0xE1, 0xFA, 0x25, - 0x4C, 0x37, 0x64, 0x9A, 0x76, 0x3A, 0x33, 0xAE, 0x15, 0xA2, 0x21, 0x12, 0x1A, 0x22, 0x44, 0xD5, - 0x10, 0x19, 0x9B, 0x3C, 0x83, 0x06, 0x8A, 0x78, 0x24, 0x91, 0x6E, 0x15, 0x65, 0xB5, 0x44, 0x0B, - 0x46, 0x41, 0x32, 0x89, 0xA0, 0x05, 0xA3, 0x42, 0xDB, 0x5B, 0xA3, 0x30, 0x52, 0x55, 0x60, 0x92, - 0x76, 0x3B, 0x91, 0x2A, 0x30, 0xE4, 0xCC, 0xEC, 0x74, 0xA2, 0xDD, 0x40, 0x72, 0x40, 0x2F, 0x24, - 0x41, 0x42, 0x91, 0x3B, 0xAE, 0x60, 0xE4, 0x35, 0x8E, 0xDB, 0xED, 0xB8, 0xB6, 0xC6, 0x89, 0xA8, - 0x65, 0x5C, 0x5B, 0xCB, 0x44, 0xD4, 0x2C, 0xE6, 0x4F, 0xFD, 0xFA, 0x3D, 0x77, 0x30, 0xDA, 0x0A, - 0x02, 0x30, 0x68, 0xC4, 0x61, 0x14, 0x89, 0xC8, 0x4B, 0x3D, 0xB9, 0x51, 0x20, 0x04, 0xED, 0xE2, - 0x89, 0xE9, 0x90, 0x9B, 0xDB, 0xB3, 0x74, 0xF9, 0xE0, 0x60, 0xA0, 0xE1, 0x68, 0xDA, 0xD6, 0x87, - 0x0B, 0x09, 0x4A, 0x50, 0x84, 0x62, 0xA1, 0x1B, 0x8F, 0xE6, 0x8A, 0xC0, 0x70, 0xDC, 0x53, 0x7B, - 0x26, 0x3A, 0xDC, 0x96, 0x83, 0xB8, 0xBE, 0x63, 0x91, 0x36, 0x49, 0xDA, 0x81, 0x33, 0x72, 0x83, - 0xC0, 0x74, 0x5D, 0xBF, 0x9D, 0x58, 0x7B, 0x9E, 0x33, 0x76, 0x5D, 0x9F, 0x7E, 0xFB, 0x36, 0xFD, - 0x76, 0x7A, 0xE3, 0x01, 0x7B, 0x92, 0x87, 0x62, 0xA1, 0x7D, 0x6F, 0x46, 0x81, 0x70, 0xA6, 0x2B, - 0x30, 0x75, 0x3A, 0xF1, 0xCC, 0xA2, 0xAD, 0xE0, 0x4F, 0xAC, 0x64, 0x67, 0x27, 0xE8, 0xA3, 0x64, - 0x1D, 0x44, 0xBC, 0xDD, 0x2E, 0x94, 0x22, 0xCA, 0xB4, 0xED, 0xB9, 0x4A, 0x79, 0x95, 0x44, 0x6F, - 0xEC, 0xA3, 0x65, 0x70, 0xB1, 0x1D, 0xB3, 0x82, 0xE7, 0x3B, 0x4B, 0xA6, 0xF6, 0x3F, 0x57, 0xA4, - 0x05, 0xAA, 0x1C, 0x05, 0x78, 0x3A, 0xEF, 0x74, 0x66, 0xC8, 0x71, 0x87, 0x5B, 0x81, 0xE9, 0x8C, - 0xDC, 0x76, 0x64, 0x59, 0x37, 0xF3, 0xED, 0x6D, 0x94, 0xCA, 0x13, 0x95, 0x5C, 0xC3, 0x1F, 0xD3, - 0xD6, 0x8D, 0x90, 0xA4, 0xB6, 0xEF, 0xB5, 0xA3, 0x3C, 0x5D, 0xAF, 0x41, 0xFF, 0xEB, 0x62, 0x2F, - 0xD9, 0x71, 0xDC, 0xE1, 0xDE, 0x7C, 0x7B, 0x7B, 0x9C, 0x4D, 0x43, 0x10, 0x84, 0xB1, 0xC7, 0x13, - 0x5C, 0xDB, 0x1F, 0xAE, 0xD7, 0xC9, 0x6E, 0x00, 0xC2, 0xC5, 0x44, 0x99, 0xCA, 0xDE, 0x7A, 0x0D, - 0xF2, 0x13, 0x04, 0x41, 0x42, 0x67, 0x66, 0x9E, 0xCD, 0x1A, 0x27, 0x3B, 0x4C, 0xFD, 0x6A, 0x9D, - 0xEC, 0x3A, 0x8E, 0xE3, 0x3B, 0x8E, 0xA3, 0x26, 0xF3, 0x4E, 0x55, 0x96, 0x05, 0xF1, 0x34, 0x81, - 0x6C, 0xFB, 0x13, 0xF6, 0x68, 0x69, 0xCE, 0x98, 0xB0, 0x80, 0x17, 0x91, 0x10, 0xDC, 0x32, 0xB7, - 0xCC, 0xC5, 0xCE, 0xD2, 0x5A, 0xAF, 0x1D, 0x77, 0xD8, 0x36, 0xD3, 0x00, 0x4F, 0x17, 0x33, 0xF1, - 0x95, 0xD0, 0xAF, 0x8E, 0x23, 0xBF, 0x23, 0xF8, 0x76, 0xE5, 0x77, 0x0C, 0xDF, 0xDE, 0xCC, 0xB2, - 0x26, 0x16, 0x27, 0x26, 0x45, 0x82, 0x2A, 0x11, 0x88, 0x44, 0x20, 0x46, 0x8B, 0x4E, 0xE0, 0x53, - 0x56, 0x43, 0x29, 0x94, 0xD5, 0x29, 0xE5, 0x90, 0xCC, 0x2A, 0x17, 0x38, 0x45, 0x5B, 0xA7, 0x16, - 0x34, 0xD6, 0xA2, 0xDC, 0xB5, 0x8B, 0x16, 0x0E, 0x52, 0xC4, 0x5E, 0x00, 0x0B, 0x9C, 0x45, 0xF3, - 0x25, 0x96, 0x75, 0xB3, 0x60, 0x8F, 0x2F, 0xD8, 0xCB, 0x2D, 0x72, 0x66, 0x5E, 0x04, 0xA6, 0xE7, - 0xB4, 0x53, 0x6B, 0x67, 0xA7, 0xBF, 0xEE, 0x7B, 0xED, 0x04, 0x5D, 0x00, 0x09, 0x3A, 0x1C, 0x27, - 0xE8, 0x42, 0x2E, 0xD8, 0x0A, 0xF9, 0xFA, 0xCE, 0x09, 0xDA, 0x8C, 0x49, 0x8B, 0x71, 0x28, 0x57, - 0x43, 0x21, 0xAB, 0x8B, 0xAA, 0xAC, 0xD6, 0x54, 0xD6, 0xE9, 0x41, 0x65, 0x1D, 0x77, 0x6D, 0xD2, - 0xEA, 0x8A, 0x7A, 0x47, 0xE8, 0x82, 0xCB, 0xE0, 0x85, 0x94, 0xC1, 0x8B, 0x8A, 0x0C, 0x2A, 0x1E, - 0x62, 0xAA, 0x2C, 0xF1, 0x6D, 0x60, 0xC9, 0xF0, 0x4F, 0x17, 0x4B, 0x3E, 0x14, 0xB7, 0x16, 0xE3, - 0x52, 0x69, 0x86, 0xD2, 0xE2, 0x6A, 0x69, 0x71, 0x7D, 0x03, 0x0C, 0x18, 0xFF, 0x87, 0x92, 0xFF, - 0xBC, 0x29, 0x22, 0xD1, 0x14, 0x31, 0xBA, 0x10, 0x9D, 0xFB, 0x42, 0x74, 0xEE, 0x1A, 0xBE, 0x8B, - 0x29, 0x24, 0xCC, 0xF3, 0x1C, 0xB9, 0x6E, 0xEF, 0x93, 0x96, 0x92, 0x11, 0xA1, 0xB3, 0xC4, 0xF7, - 0xFA, 0xFA, 0xCD, 0x11, 0x09, 0xA6, 0xD3, 0x41, 0x7F, 0x88, 0x86, 0x83, 0xD1, 0x0C, 0x4D, 0x1D, - 0xA7, 0xD7, 0x43, 0x8E, 0xD3, 0x1B, 0x42, 0xB8, 0x6F, 0x23, 0xC7, 0xE9, 0x3B, 0x34, 0xEC, 0xBB, - 0x3D, 0xE4, 0xF8, 0x7D, 0x80, 0xF1, 0x07, 0x0E, 0xA2, 0x3F, 0x2C, 0xEC, 0xD1, 0xB0, 0xCF, 0xC2, - 0x7D, 0x1A, 0x1E, 0xB0, 0xF0, 0x88, 0x86, 0x01, 0x9E, 0x2E, 0xC0, 0x9C, 0x9E, 0xC7, 0xC2, 0x3D, - 0x17, 0x39, 0xBD, 0x1E, 0xC0, 0xF4, 0x1D, 0x07, 0x39, 0x7D, 0xCF, 0x86, 0xB0, 0x3F, 0x44, 0xF4, - 0x87, 0x86, 0x07, 0x3D, 0x1B, 0x39, 0x83, 0x3E, 0xE0, 0x1C, 0xF4, 0x07, 0x34, 0xCC, 0xE2, 0x07, - 0x34, 0x7E, 0xE0, 0xD1, 0xF0, 0xD0, 0x1E, 0x20, 0xFA, 0xC3, 0xC2, 0x23, 0x1A, 0x06, 0xFC, 0x43, - 0xDF, 0x46, 0xCE, 0xB0, 0xDF, 0xA7, 0xE1, 0x51, 0x6F, 0x88, 0x9C, 0x11, 0xE4, 0x75, 0x6D, 0x77, - 0x80, 0x5C, 0xDB, 0xEB, 0xD1, 0xB0, 0x67, 0xF7, 0x90, 0xEB, 0xD9, 0x7D, 0x08, 0xF7, 0x7D, 0x44, - 0x7F, 0x58, 0x78, 0x84, 0x5C, 0x6F, 0xC0, 0xE2, 0x87, 0x0E, 0xA2, 0x3F, 0x2C, 0x4C, 0xE1, 0x87, - 0x80, 0xC7, 0xB7, 0x5D, 0xE4, 0xFA, 0xB6, 0x07, 0x61, 0xCF, 0x43, 0xF4, 0x07, 0xC2, 0x23, 0x1A, - 0x3F, 0x72, 0x59, 0x78, 0x80, 0xDC, 0x9E, 0x4D, 0xEB, 0xE5, 0xF6, 0xEC, 0x11, 0x0D, 0x8F, 0x20, - 0xEC, 0xD9, 0xC8, 0xED, 0x79, 0x80, 0xB3, 0xD7, 0x77, 0x90, 0xDB, 0xEB, 0x03, 0x7C, 0xDF, 0xB5, - 0x11, 0xFD, 0x61, 0xE1, 0x1E, 0x0D, 0x03, 0x0D, 0x7D, 0xCF, 0x41, 0x6E, 0xDF, 0x63, 0x30, 0x1E, - 0x8D, 0xF7, 0x06, 0x10, 0x1E, 0xB8, 0xC8, 0xED, 0x03, 0x1F, 0xDC, 0xFE, 0x70, 0x84, 0xDC, 0xFE, - 0x08, 0xF2, 0x0E, 0xFC, 0x21, 0xA2, 0x3F, 0x10, 0xEE, 0x79, 0xC8, 0x1D, 0x00, 0x9F, 0xDD, 0x41, - 0x6F, 0x84, 0xDC, 0x41, 0x9F, 0xC1, 0xF4, 0x7B, 0x34, 0x0C, 0x7C, 0x18, 0x0C, 0xFB, 0xC8, 0x1D, - 0x0C, 0x01, 0x66, 0xE8, 0x0C, 0x10, 0xFD, 0x81, 0xF0, 0xA0, 0x8F, 0xE8, 0x0F, 0x0B, 0x8F, 0x68, - 0x18, 0xE8, 0x1F, 0x52, 0x9E, 0x0C, 0x87, 0x50, 0xEE, 0x70, 0xE4, 0x21, 0xFA, 0x43, 0xC3, 0x23, - 0xCA, 0x93, 0x91, 0x0D, 0x74, 0x8E, 0xFC, 0x3E, 0xA2, 0x3F, 0x33, 0x34, 0xF5, 0x6C, 0x7B, 0x88, - 0xE8, 0x0F, 0x84, 0x5D, 0x07, 0xD1, 0x1F, 0x1A, 0x76, 0x3C, 0x1F, 0x79, 0x8E, 0x07, 0x30, 0x8E, - 0xEF, 0x22, 0xCF, 0xF1, 0x7D, 0x16, 0xEE, 0xD3, 0xF0, 0x08, 0xC2, 0xBD, 0x01, 0xF2, 0x98, 0x1C, - 0x7A, 0x6E, 0xDF, 0x46, 0xF4, 0x87, 0x85, 0x3D, 0x1A, 0xF6, 0x20, 0x3C, 0xA0, 0xF1, 0x03, 0x16, - 0x3F, 0xE8, 0xD3, 0xF0, 0x00, 0xC2, 0xA3, 0x21, 0xF2, 0xDC, 0x11, 0xE0, 0xF1, 0x46, 0x1E, 0xF2, - 0xBC, 0x11, 0xAD, 0xAF, 0xE7, 0xDB, 0x3D, 0x44, 0x7F, 0x68, 0x98, 0xB6, 0x05, 0xFD, 0x61, 0xE1, - 0x21, 0xF2, 0x7A, 0x3E, 0x0B, 0x53, 0x7A, 0x7A, 0x3E, 0xAD, 0x8B, 0xD7, 0xF7, 0x3C, 0x44, 0x7F, - 0x58, 0xB8, 0x8F, 0xBC, 0x3E, 0x8F, 0xEF, 0xF5, 0x90, 0xD7, 0x87, 0xB6, 0xF3, 0x06, 0x7D, 0x07, - 0xD1, 0x1F, 0x16, 0xF6, 0x69, 0x18, 0xCA, 0x1D, 0x0C, 0x68, 0xFC, 0x80, 0xC1, 0x0C, 0x69, 0xFC, - 0x10, 0xE2, 0x87, 0x14, 0x66, 0x08, 0xFC, 0xF7, 0x28, 0x0F, 0x3D, 0xC6, 0x43, 0x6F, 0x38, 0xEA, - 0xD1, 0x30, 0x8F, 0x1F, 0xD0, 0x30, 0xD4, 0x65, 0xD4, 0xF3, 0x90, 0x37, 0x02, 0x79, 0xF6, 0x46, - 0xFD, 0x21, 0xF2, 0x46, 0x0C, 0xE7, 0x68, 0xE0, 0xD3, 0x30, 0xC0, 0x8F, 0x28, 0xFE, 0xD1, 0x08, - 0x68, 0x18, 0x8D, 0x3C, 0xE4, 0xDB, 0x2E, 0xE5, 0x9B, 0x6F, 0x7B, 0x43, 0x44, 0x7F, 0x68, 0xD8, - 0xF1, 0x1D, 0xE4, 0x33, 0x3E, 0xFB, 0x94, 0xCF, 0xF4, 0x07, 0xC2, 0x3D, 0x1B, 0xF9, 0x4E, 0xCF, - 0x61, 0x61, 0x8F, 0x86, 0x3D, 0x08, 0x0F, 0x7D, 0xE4, 0x3B, 0x43, 0x8A, 0xDF, 0xF7, 0xFD, 0x21, - 0xF2, 0xFB, 0xD0, 0xD7, 0xFC, 0x51, 0x6F, 0x84, 0xE8, 0xCF, 0x0C, 0x4D, 0x7B, 0x23, 0xBB, 0x8F, - 0x7A, 0x23, 0x68, 0xDF, 0xDE, 0xC8, 0x1B, 0xA2, 0xDE, 0x08, 0x78, 0xD8, 0x1B, 0x0D, 0x6C, 0xD4, - 0x1B, 0xC1, 0xF8, 0xD0, 0xB7, 0x6D, 0x17, 0xF5, 0x6D, 0xE8, 0x2F, 0x7D, 0xBB, 0x3F, 0x44, 0x7D, - 0x1B, 0xF8, 0xD3, 0xB7, 0x07, 0x0E, 0xEA, 0xDB, 0xD0, 0x5E, 0x7D, 0x7B, 0xD8, 0x47, 0xF4, 0x87, - 0x85, 0x47, 0xA8, 0x6F, 0x43, 0xDB, 0xF5, 0x1D, 0x7B, 0x84, 0xE8, 0x0F, 0x84, 0x7B, 0x3D, 0xD4, - 0x77, 0x40, 0x9E, 0xFB, 0x9E, 0xE3, 0x21, 0xFA, 0x43, 0xC3, 0xBE, 0xE7, 0xA2, 0xBE, 0xEF, 0xF9, - 0x2C, 0x3C, 0x42, 0x7D, 0x1F, 0x68, 0xE8, 0xFB, 0x3D, 0x1B, 0xD1, 0x1F, 0x16, 0x1E, 0xD0, 0x30, - 0xE0, 0xE9, 0x0F, 0x46, 0xA8, 0xDF, 0x1F, 0x42, 0xFC, 0xC8, 0x71, 0x51, 0x7F, 0xE4, 0xF4, 0x20, - 0xDC, 0xF7, 0x11, 0xFD, 0x61, 0xE1, 0x3E, 0xEA, 0x8F, 0x06, 0x0C, 0x66, 0x40, 0x61, 0x80, 0xE7, - 0xFD, 0xD1, 0x60, 0x48, 0xC3, 0xB4, 0xBE, 0x03, 0xDB, 0x19, 0xA1, 0x81, 0xED, 0x52, 0x7A, 0x06, - 0x7D, 0xA7, 0x8F, 0x06, 0xAC, 0xCF, 0x0E, 0xFA, 0x83, 0x21, 0x1A, 0xF4, 0xA1, 0xBF, 0x0C, 0x5D, - 0xDB, 0x43, 0x43, 0x17, 0xF8, 0x36, 0x74, 0x3D, 0x1F, 0x0D, 0x5D, 0x68, 0x8B, 0xA1, 0x3B, 0x1C, - 0xA2, 0xA1, 0x0B, 0xED, 0x35, 0xA4, 0xB2, 0x3A, 0xF4, 0x80, 0x3F, 0x43, 0xDF, 0xB6, 0xD1, 0xD0, - 0x87, 0xF1, 0xC1, 0x71, 0x3D, 0xCF, 0x46, 0xF4, 0xB7, 0x07, 0x5F, 0xBE, 0xEF, 0x20, 0xFA, 0x4B, - 0xE9, 0xF0, 0x3D, 0xDB, 0xF1, 0x11, 0xFC, 0xF2, 0xAF, 0x11, 0x7C, 0x8D, 0xD8, 0x97, 0xDF, 0xA3, - 0x5F, 0xD0, 0xBA, 0x7D, 0xDF, 0xA5, 0xAC, 0xA5, 0xBF, 0xF4, 0xAB, 0x67, 0xBB, 0x3E, 0xEA, 0xF7, - 0x6C, 0x18, 0x89, 0xFB, 0x3D, 0xBB, 0xD7, 0xA7, 0x5F, 0x8C, 0x2F, 0x74, 0xF2, 0x47, 0xF0, 0x0B, - 0x5F, 0x3D, 0x97, 0x7E, 0xD1, 0xB1, 0x6A, 0x86, 0xD2, 0x60, 0x3A, 0xED, 0x0F, 0xED, 0xD1, 0x00, - 0xD1, 0x5F, 0x48, 0x1F, 0x3A, 0xB6, 0x83, 0xE8, 0xAF, 0xCB, 0xBF, 0x86, 0xF4, 0xCB, 0x71, 0xD8, - 0x57, 0xCF, 0xA5, 0x5F, 0x3D, 0x9F, 0x7F, 0x8D, 0xE0, 0x8B, 0xCD, 0x2E, 0x23, 0xC7, 0xF7, 0x10, - 0xFC, 0xE9, 0xF1, 0x6F, 0x98, 0x6F, 0x46, 0x0E, 0x70, 0x1B, 0x02, 0x2C, 0x9D, 0xCF, 0x46, 0x23, - 0xD7, 0xA1, 0x73, 0xD0, 0xC8, 0x85, 0xD6, 0x76, 0x9C, 0x91, 0xD7, 0x77, 0x11, 0xFC, 0xA1, 0xD8, - 0x47, 0x74, 0xAA, 0xE8, 0x21, 0xF6, 0x87, 0x7F, 0x7B, 0x7D, 0xFA, 0xDD, 0x07, 0x2E, 0x8E, 0x9C, - 0xC1, 0xA0, 0x6F, 0xD3, 0xEF, 0xD1, 0x68, 0x34, 0x63, 0x2F, 0xBB, 0x93, 0x89, 0x3A, 0x15, 0xD6, - 0xED, 0xC4, 0xC4, 0x4E, 0xE8, 0x2D, 0x4E, 0x52, 0x12, 0x47, 0x81, 0xD1, 0x37, 0xD0, 0x56, 0x62, - 0xDD, 0x24, 0xE5, 0x6D, 0x19, 0x4C, 0xE0, 0x16, 0x4A, 0xD8, 0xDA, 0xDB, 0xB1, 0x50, 0x42, 0x17, - 0x14, 0xB6, 0x88, 0xB0, 0x91, 0x83, 0x3C, 0xD7, 0x52, 0x3E, 0xDD, 0x01, 0x72, 0x40, 0x4B, 0x9A, - 0xC5, 0xB8, 0xC8, 0xF7, 0x7A, 0x2E, 0xA2, 0xFD, 0x8B, 0xE6, 0x1D, 0xD9, 0xB6, 0x33, 0x0B, 0x5C, - 0x16, 0x72, 0x21, 0x24, 0xE0, 0x1C, 0x67, 0x64, 0xFB, 0xC8, 0x77, 0x1D, 0x78, 0xA9, 0x4B, 0xA5, - 0xA3, 0xE7, 0xCC, 0x02, 0x47, 0x41, 0xE4, 0xDB, 0x9E, 0x8B, 0x7A, 0x3D, 0xD7, 0xF6, 0x15, 0xF4, - 0x7D, 0x6F, 0xE0, 0xFB, 0xB4, 0xFD, 0x7B, 0x7D, 0x35, 0xB6, 0x67, 0xFB, 0x36, 0xB4, 0xBC, 0xAD, - 0xC7, 0x52, 0x51, 0xEF, 0x39, 0x9E, 0x0E, 0xEB, 0x0E, 0x29, 0xAC, 0x37, 0x18, 0x68, 0xB1, 0x3D, - 0x9B, 0x4A, 0x52, 0xCF, 0x71, 0xAC, 0x92, 0xD3, 0x14, 0xA2, 0x5A, 0xDB, 0x94, 0x35, 0x27, 0x53, - 0x3C, 0x9B, 0xDA, 0x33, 0xF6, 0xD7, 0x99, 0x81, 0x2D, 0x8F, 0x77, 0xF3, 0x77, 0x25, 0x7B, 0xDD, - 0x78, 0xC7, 0x73, 0xF7, 0xEC, 0x31, 0xDE, 0x71, 0xDC, 0xC1, 0x9E, 0x33, 0xC6, 0x6C, 0x85, 0xB4, - 0x97, 0x4C, 0xF1, 0x6C, 0xAC, 0x3F, 0x5F, 0x87, 0x13, 0x5A, 0xC4, 0x1F, 0xE9, 0x17, 0xE6, 0x05, - 0xC8, 0x99, 0x89, 0x77, 0xB2, 0xA9, 0x4D, 0xCB, 0x5A, 0xAF, 0xF1, 0x6E, 0x36, 0x4D, 0x68, 0x71, - 0xC2, 0xBF, 0xAA, 0xC3, 0x36, 0x42, 0xC9, 0x6E, 0x90, 0x82, 0xF7, 0x56, 0x12, 0xA4, 0x9D, 0x64, - 0x77, 0xD7, 0x41, 0x14, 0x92, 0x00, 0x64, 0x1A, 0x90, 0x8E, 0xC3, 0x4E, 0xA9, 0xE9, 0xBE, 0x19, - 0xD0, 0x11, 0x8A, 0xCE, 0x52, 0x9C, 0xB4, 0x06, 0x44, 0x9A, 0x19, 0xD8, 0x72, 0x72, 0xF0, 0x76, - 0x49, 0xC9, 0xDE, 0x0D, 0x1C, 0xCF, 0xB1, 0x07, 0x6E, 0xBB, 0x8D, 0x77, 0x02, 0x67, 0xD4, 0xEF, - 0xDB, 0x3D, 0x4A, 0x04, 0x0B, 0x0E, 0x21, 0xD6, 0xED, 0xBB, 0x8E, 0xEF, 0xEC, 0xB9, 0x63, 0x87, - 0x2E, 0xE8, 0x7A, 0xA3, 0xE1, 0x27, 0x3E, 0x9E, 0xFB, 0x2A, 0x21, 0xC2, 0x89, 0xC2, 0x5D, 0x35, - 0xF2, 0xE5, 0xB3, 0xB9, 0xA4, 0xF1, 0x35, 0x77, 0xF9, 0x2D, 0x77, 0x08, 0x9C, 0x97, 0x6F, 0xB8, - 0xDF, 0x29, 0x85, 0x4A, 0xF5, 0xFC, 0x79, 0xC8, 0x9E, 0x44, 0x2B, 0x1A, 0xFB, 0x57, 0x38, 0x5A, - 0x90, 0xE8, 0x1C, 0x9E, 0xBE, 0xD8, 0xDA, 0xF3, 0xDE, 0x67, 0x67, 0x67, 0x29, 0x96, 0x2F, 0xEF, - 0x4E, 0x49, 0x7A, 0x7C, 0x1D, 0xCD, 0x69, 0x5D, 0x98, 0x63, 0x1C, 0xE1, 0x63, 0xE4, 0x3A, 0x9A, - 0x1F, 0x84, 0xCB, 0x65, 0x2A, 0x01, 0x17, 0x64, 0xF1, 0x32, 0xC5, 0x09, 0xE8, 0x92, 0x14, 0x70, - 0x71, 0x04, 0x6C, 0x78, 0x1E, 0x26, 0xA9, 0x30, 0x66, 0x75, 0x97, 0x87, 0x00, 0x95, 0x4C, 0x3A, - 0x22, 0xFE, 0x20, 0xE0, 0x22, 0x8C, 0x16, 0x4B, 0x2C, 0x4B, 0x95, 0x27, 0x74, 0x3A, 0x29, 0x76, - 0x0E, 0x4C, 0xA1, 0xD5, 0x90, 0x26, 0x76, 0x58, 0x7B, 0x6C, 0x05, 0x81, 0xF0, 0x98, 0x5A, 0x54, - 0x68, 0x37, 0x13, 0xBB, 0x11, 0x0A, 0x64, 0x56, 0xAA, 0x6B, 0x15, 0xC7, 0x77, 0x0A, 0x13, 0x3B, - 0x65, 0x73, 0x6B, 0x4A, 0x43, 0x48, 0x2D, 0xFF, 0x52, 0x6B, 0x70, 0x23, 0x19, 0x40, 0x8A, 0x55, - 0xE6, 0xAB, 0x7C, 0x46, 0xA1, 0x35, 0x00, 0x27, 0x8D, 0xDD, 0x82, 0x40, 0x8F, 0xA9, 0x6D, 0x25, - 0x7B, 0x22, 0x2C, 0x68, 0xAB, 0x64, 0x30, 0xAF, 0xA4, 0xD6, 0x44, 0x7D, 0xA8, 0x1B, 0x47, 0xA6, - 0xB4, 0x91, 0x28, 0xDE, 0x5D, 0x14, 0x04, 0x8A, 0x1C, 0xB8, 0xDD, 0xC6, 0xA6, 0x95, 0xDF, 0x51, - 0x74, 0x5C, 0xBA, 0xE7, 0x18, 0x7A, 0x7D, 0x7F, 0x70, 0x67, 0x19, 0x62, 0x4D, 0x24, 0x9B, 0xA7, - 0x52, 0xD0, 0x6E, 0x0F, 0x0F, 0x2A, 0x56, 0x90, 0x0C, 0xC8, 0xD4, 0x5A, 0x84, 0x59, 0xD8, 0x5A, - 0x90, 0x74, 0x1E, 0x26, 0x0B, 0xBC, 0x40, 0xAD, 0x55, 0x8A, 0x5B, 0x67, 0xCB, 0xF8, 0x5D, 0x8B, - 0x6E, 0xD9, 0x92, 0x78, 0xD9, 0xCA, 0xE2, 0x56, 0x08, 0x5C, 0x5E, 0xC6, 0x29, 0x89, 0xCE, 0x21, - 0x83, 0xC1, 0x6C, 0xD7, 0x54, 0x99, 0x54, 0xB1, 0x92, 0x59, 0xDB, 0x2B, 0x54, 0x09, 0xB3, 0x4A, - 0xAF, 0x3B, 0xEA, 0xBA, 0xC1, 0x77, 0x22, 0x29, 0x99, 0x85, 0xA0, 0x1A, 0xE2, 0x28, 0x35, 0xC2, - 0x09, 0xF4, 0x09, 0xD3, 0x9A, 0xA4, 0x38, 0x3B, 0x21, 0x97, 0x38, 0x5E, 0x65, 0xAA, 0x37, 0x25, - 0x15, 0xC4, 0xAA, 0x69, 0xBE, 0x4F, 0x21, 0x25, 0x57, 0xB1, 0x63, 0xCA, 0x98, 0x60, 0xCB, 0x56, - 0x4E, 0x38, 0xD7, 0xEB, 0x87, 0x61, 0x86, 0xBB, 0x51, 0xFC, 0xCE, 0xB4, 0x54, 0x0F, 0xDE, 0x55, - 0x5E, 0xEF, 0x56, 0xF9, 0x5C, 0xB1, 0x0E, 0xA6, 0xE4, 0x9A, 0x56, 0xC1, 0xE9, 0x32, 0x48, 0x13, - 0x69, 0x2A, 0x47, 0x70, 0xAC, 0x55, 0xE0, 0xC1, 0xC1, 0x6E, 0x41, 0xD0, 0x36, 0xD9, 0x0D, 0x1C, - 0x77, 0xEF, 0x56, 0xAE, 0xD9, 0x08, 0x5B, 0x96, 0xB0, 0xB6, 0xA8, 0xC4, 0x13, 0x54, 0x38, 0xFF, - 0x82, 0x26, 0x49, 0xBB, 0xF3, 0x30, 0x9B, 0x5F, 0x80, 0x0F, 0x2D, 0x13, 0x1C, 0xAB, 0x3F, 0x21, - 0xF3, 0x24, 0xCE, 0xC2, 0xF4, 0x0D, 0x43, 0x7D, 0xC3, 0x84, 0x17, 0xE7, 0x96, 0x85, 0x9E, 0x27, - 0xF1, 0x25, 0x49, 0x71, 0x37, 0xC1, 0x69, 0xBC, 0x7C, 0x8B, 0xCD, 0x2D, 0xC7, 0xB2, 0x2C, 0xAB, - 0x9B, 0x5D, 0xE0, 0xC8, 0xC4, 0xE2, 0x90, 0x30, 0x29, 0x77, 0xC6, 0xBA, 0x7A, 0xC3, 0x11, 0x4E, - 0xBB, 0x5D, 0xCC, 0x06, 0x6A, 0xAA, 0x1C, 0x41, 0x94, 0x16, 0xDF, 0x2E, 0x5A, 0xBC, 0xCC, 0x0D, - 0x4B, 0x39, 0x4E, 0xBD, 0x5B, 0x2B, 0xED, 0xD5, 0xF4, 0x90, 0xDD, 0x5E, 0xE1, 0x72, 0x4A, 0x9D, - 0x8B, 0x6A, 0x46, 0xA3, 0xC2, 0x49, 0x97, 0x86, 0xA1, 0x22, 0x71, 0xD5, 0x51, 0xE9, 0x96, 0x9C, - 0x7A, 0x8F, 0xB5, 0xD0, 0x5D, 0x3A, 0x87, 0xF0, 0x33, 0x58, 0x53, 0x73, 0xD9, 0xE9, 0x0B, 0x0A, - 0x4A, 0x09, 0xB7, 0x4F, 0xA6, 0x56, 0xDD, 0x74, 0xC8, 0xDF, 0x9A, 0xE5, 0xB9, 0xBE, 0x56, 0x88, - 0xE8, 0xE2, 0xE3, 0xD3, 0x2C, 0xCF, 0x65, 0xF1, 0x8B, 0xF3, 0xD7, 0xF2, 0xE6, 0x11, 0x2C, 0x02, - 0x1E, 0xC4, 0xCB, 0x38, 0x29, 0x9F, 0x2E, 0xDD, 0xFF, 0x39, 0x73, 0xFA, 0x6A, 0x11, 0x6E, 0x9F, - 0xCD, 0xAC, 0x57, 0xF7, 0xEB, 0x82, 0x9F, 0xAD, 0x25, 0xC4, 0x8D, 0x9B, 0x2B, 0x29, 0xD5, 0x2F, - 0x15, 0xD4, 0xD3, 0x12, 0x2B, 0x5F, 0x2A, 0xA8, 0xAF, 0x25, 0x56, 0xBE, 0x3E, 0xBB, 0x8F, 0xD2, - 0xE0, 0xFE, 0xCF, 0xF1, 0x98, 0xCE, 0x67, 0xF7, 0x27, 0xD2, 0xB0, 0x5C, 0x52, 0xBE, 0x53, 0xC9, - 0x84, 0xC1, 0x42, 0xA7, 0x6F, 0xA1, 0x34, 0x10, 0xAB, 0xDD, 0x1D, 0x77, 0xCF, 0xB0, 0x8D, 0x0E, - 0x19, 0x13, 0xA1, 0xCC, 0x9B, 0x71, 0x25, 0x5E, 0x7F, 0xCC, 0xFB, 0x30, 0x99, 0xDA, 0x33, 0xA1, - 0xC0, 0x2A, 0x2E, 0x86, 0x84, 0x56, 0x0A, 0x8F, 0x30, 0xD3, 0x4E, 0x6A, 0x71, 0xD1, 0xB3, 0x91, - 0x67, 0x49, 0x9D, 0x13, 0x01, 0xDF, 0x49, 0x69, 0x43, 0x2A, 0xBC, 0x56, 0xEF, 0x6F, 0x41, 0x31, - 0x45, 0x9D, 0xBC, 0x33, 0xA0, 0x57, 0xB9, 0xE2, 0xA7, 0x5D, 0x19, 0x3C, 0x1B, 0x4B, 0x57, 0x75, - 0x46, 0x72, 0xFE, 0x7A, 0x6C, 0x58, 0xD6, 0x4D, 0x16, 0x64, 0xBC, 0x60, 0xBF, 0x98, 0xAA, 0x49, - 0x17, 0xBF, 0xC7, 0x73, 0x93, 0x8D, 0x73, 0x8A, 0x15, 0x03, 0x3C, 0x75, 0x66, 0x7B, 0x4E, 0x6F, - 0x8C, 0xA7, 0xFE, 0x6C, 0xCF, 0xED, 0xD1, 0xC0, 0x60, 0xB6, 0xE7, 0xDB, 0xA3, 0xDE, 0x18, 0xEE, - 0x5D, 0x85, 0x73, 0x25, 0xB0, 0x73, 0x96, 0xC4, 0xAB, 0x68, 0x61, 0x4A, 0x8B, 0x91, 0x34, 0xEF, - 0x7A, 0x4D, 0x73, 0xD2, 0xDF, 0x01, 0xFC, 0x3A, 0xF6, 0x0C, 0x39, 0x7D, 0xEB, 0x7E, 0x76, 0xCF, - 0xED, 0xF5, 0x2C, 0x54, 0x9F, 0xCD, 0x05, 0xD0, 0x1E, 0xFC, 0x0E, 0x59, 0x36, 0xE7, 0x0E, 0xD9, - 0x3C, 0x00, 0xED, 0xC3, 0xEF, 0x88, 0x65, 0x73, 0xD5, 0x6C, 0xB3, 0x5C, 0x1E, 0x6E, 0x97, 0x58, - 0xF3, 0x53, 0x86, 0x45, 0x87, 0x19, 0xC9, 0x18, 0xC7, 0x42, 0xA9, 0x60, 0x48, 0xBB, 0x3D, 0xF5, - 0x50, 0x1F, 0x8D, 0x90, 0xE3, 0xCE, 0xBA, 0x24, 0x9A, 0x2F, 0x57, 0x0B, 0x9C, 0x9A, 0x62, 0x27, - 0x62, 0x59, 0xCA, 0xDC, 0xC2, 0xE3, 0xEE, 0x7B, 0x88, 0x04, 0x53, 0x1B, 0xD9, 0xC8, 0x2E, 0x9B, - 0xDC, 0xF2, 0xC0, 0xB1, 0x44, 0xD5, 0xB8, 0xA6, 0x28, 0x18, 0xDF, 0x4B, 0x11, 0xBE, 0x97, 0x76, - 0xB0, 0x45, 0xE9, 0x9E, 0x90, 0x69, 0x3A, 0x0B, 0x40, 0x01, 0x61, 0x2F, 0xD9, 0xD9, 0xF1, 0xC7, - 0x2E, 0x0B, 0xC2, 0x2D, 0x13, 0xDE, 0x4B, 0x76, 0x77, 0xFD, 0x71, 0xB2, 0xBB, 0x3B, 0x14, 0x47, - 0xC7, 0x04, 0x6E, 0x1F, 0xD5, 0xDE, 0xAA, 0xDD, 0xB0, 0x3B, 0x7D, 0x5E, 0xF2, 0x94, 0xA0, 0x14, - 0x45, 0xB3, 0x00, 0xF3, 0xD6, 0xFB, 0x9A, 0x8A, 0xC6, 0x67, 0x37, 0x09, 0x33, 0x85, 0x7D, 0x9F, - 0x86, 0x52, 0x19, 0x8A, 0x68, 0xE8, 0x6B, 0xBA, 0x85, 0x19, 0x0C, 0xEC, 0x4F, 0x19, 0x45, 0x9E, - 0xEF, 0xFF, 0xE0, 0xF1, 0xB3, 0xFD, 0x87, 0xA7, 0x8F, 0x8F, 0x9E, 0x1C, 0x9D, 0x14, 0xBA, 0x0A, - 0x7A, 0xB4, 0x83, 0x07, 0x39, 0xEA, 0x7B, 0xBD, 0x4F, 0xDC, 0x2C, 0x3D, 0x9C, 0xA7, 0x5F, 0xC0, - 0x6A, 0x9E, 0xEE, 0x19, 0x1F, 0xCE, 0x53, 0x18, 0x21, 0x6B, 0xF6, 0x4D, 0xD2, 0xEE, 0xC8, 0x70, - 0xE0, 0xBB, 0xDC, 0x61, 0xDB, 0x60, 0x60, 0x5B, 0x08, 0x2C, 0x18, 0xAA, 0x59, 0x9B, 0x2F, 0xF6, - 0xD9, 0xB6, 0x21, 0x91, 0x96, 0xB9, 0xE7, 0x60, 0x7C, 0x0E, 0xEC, 0xBC, 0xEB, 0xB6, 0x74, 0x82, - 0x58, 0xBE, 0x6F, 0x56, 0x8C, 0x91, 0x88, 0xFC, 0x8F, 0x5E, 0x07, 0x30, 0xB3, 0xE7, 0x85, 0xDB, - 0xC5, 0xF9, 0x9B, 0xE0, 0xE6, 0x2A, 0x5C, 0xA5, 0x78, 0x31, 0xDE, 0x72, 0xD0, 0x32, 0x8E, 0xAF, - 0x9E, 0xC7, 0x29, 0xA1, 0xED, 0x39, 0xB6, 0xD1, 0x59, 0xB8, 0x5C, 0x9E, 0x5C, 0x24, 0xF1, 0xEA, - 0xFC, 0x62, 0xBC, 0xE5, 0xE4, 0xE5, 0x57, 0xCB, 0x77, 0x21, 0xAB, 0xA1, 0x64, 0x41, 0xAD, 0x7C, - 0x73, 0xCC, 0x59, 0xC9, 0x06, 0x48, 0xE9, 0x2F, 0x5E, 0x2F, 0x66, 0x8A, 0x0B, 0x13, 0xB5, 0x4A, - 0x5C, 0x30, 0x9D, 0x95, 0x5C, 0x81, 0xAB, 0xA9, 0x62, 0xD1, 0x43, 0xE4, 0x8A, 0xF4, 0x86, 0x57, - 0x63, 0x0C, 0x14, 0x15, 0xA3, 0x93, 0xE8, 0xAA, 0x99, 0x35, 0xD9, 0x76, 0xB6, 0xC0, 0x10, 0x22, - 0x91, 0x6E, 0x57, 0x91, 0x63, 0xE5, 0x39, 0xBB, 0x36, 0x97, 0xA4, 0x96, 0xD9, 0x00, 0xF4, 0x69, - 0xE6, 0xCD, 0x95, 0x94, 0x3C, 0xC5, 0x19, 0xCF, 0xF9, 0x88, 0xCF, 0xCA, 0x15, 0x0C, 0x8F, 0x5E, - 0x07, 0x58, 0x9A, 0xD5, 0x92, 0xCB, 0x79, 0xC6, 0x2B, 0x31, 0x18, 0x94, 0x2C, 0x27, 0xB3, 0x36, - 0xEC, 0xB2, 0x26, 0xDC, 0x53, 0xA3, 0xD4, 0xB6, 0xDC, 0x76, 0xC6, 0x35, 0xB8, 0x54, 0x7B, 0xCB, - 0x6A, 0xF2, 0x14, 0xCF, 0xBA, 0xAB, 0xE8, 0x22, 0x8E, 0xDF, 0xD0, 0x85, 0xDE, 0xA4, 0x5A, 0x4E, - 0xB1, 0x4B, 0xA8, 0x97, 0xBA, 0x1C, 0xF2, 0x6A, 0x5B, 0x23, 0xCD, 0x50, 0x1A, 0x87, 0xC3, 0x3A, - 0x92, 0x0A, 0xCB, 0xD6, 0xEB, 0x18, 0xDD, 0x85, 0x05, 0xB5, 0x95, 0x92, 0xFE, 0xD2, 0x95, 0x4A, - 0x01, 0x59, 0x19, 0x57, 0x82, 0x2B, 0x71, 0xDE, 0x54, 0x28, 0x43, 0xC6, 0x17, 0xCF, 0x9E, 0x7D, - 0x69, 0xD0, 0x51, 0x89, 0x6E, 0xD2, 0x15, 0x6B, 0xB0, 0x1B, 0xA8, 0x49, 0x1B, 0xA8, 0x49, 0x29, - 0x35, 0x69, 0x99, 0x9A, 0x74, 0xD6, 0x2D, 0x50, 0xDF, 0x81, 0xA0, 0xE7, 0x2F, 0x4F, 0x0C, 0x04, - 0x16, 0x73, 0x34, 0xFD, 0x26, 0x8B, 0x63, 0xB0, 0x72, 0xDE, 0x60, 0x98, 0xEF, 0x6A, 0x1A, 0x88, - 0xE5, 0xBE, 0xAA, 0xB6, 0x1C, 0xD4, 0x40, 0x2E, 0xF8, 0x49, 0x29, 0xCE, 0x0B, 0xD4, 0x56, 0x6F, - 0xB7, 0xCD, 0x34, 0x68, 0x96, 0x30, 0x44, 0x82, 0x4C, 0x68, 0x76, 0x70, 0x00, 0x65, 0xFC, 0x40, - 0xB5, 0x52, 0x64, 0xA1, 0xAD, 0xA4, 0xDD, 0xDE, 0xA2, 0xD3, 0x0F, 0xE1, 0xCA, 0x04, 0x94, 0x5D, - 0xA0, 0x0A, 0x59, 0x66, 0x97, 0xA8, 0xA0, 0x85, 0xB6, 0xEC, 0x2D, 0x0A, 0x0F, 0x4C, 0x25, 0x67, - 0x26, 0x69, 0x91, 0x28, 0xCD, 0xC2, 0x68, 0x8E, 0xE3, 0xB3, 0x16, 0xDF, 0xA9, 0xE8, 0x3B, 0x5C, - 0xBD, 0x54, 0x1B, 0x35, 0x55, 0x42, 0xF5, 0x5C, 0xAB, 0x93, 0x4F, 0x39, 0x46, 0x68, 0x81, 0xB9, - 0x24, 0x52, 0x16, 0xDF, 0x44, 0x29, 0xAD, 0xDE, 0x1F, 0x0F, 0x6D, 0x36, 0x22, 0xF9, 0xED, 0x22, - 0xF4, 0xF2, 0x29, 0x93, 0x6A, 0x2C, 0xBA, 0x74, 0x43, 0xE7, 0xCD, 0xF9, 0x60, 0xCA, 0x4C, 0xD3, - 0x27, 0xDD, 0xE7, 0x61, 0x12, 0x5E, 0xA6, 0x93, 0xB0, 0x1B, 0x2E, 0x16, 0x10, 0x36, 0xED, 0xD2, - 0xFC, 0x57, 0x9D, 0xB8, 0xCA, 0x23, 0x9B, 0xEC, 0xEB, 0x0B, 0x66, 0xD9, 0x4A, 0x6C, 0x43, 0x00, - 0x75, 0x10, 0x8A, 0xC9, 0x82, 0x64, 0x8F, 0xC9, 0x25, 0xC9, 0x82, 0x2D, 0x87, 0x0F, 0x21, 0x02, - 0x0D, 0x07, 0xC4, 0xD2, 0xED, 0xE4, 0x7A, 0x8D, 0xBB, 0x2C, 0x72, 0x6A, 0xCF, 0xF6, 0x70, 0x97, - 0x9B, 0xD9, 0x1F, 0x87, 0xB5, 0xE5, 0xA8, 0x88, 0x95, 0x1E, 0xAD, 0x27, 0x0A, 0xD3, 0x1B, 0x90, - 0x97, 0x3B, 0x68, 0xAB, 0xED, 0x6C, 0x4A, 0x11, 0x82, 0x9E, 0x48, 0x5F, 0x63, 0xC8, 0x69, 0xAA, - 0x89, 0x0C, 0x5B, 0xE9, 0xB1, 0x42, 0xD7, 0x50, 0xED, 0x77, 0x02, 0xD2, 0x82, 0x68, 0xA9, 0x93, - 0xCC, 0x56, 0x90, 0x2A, 0x63, 0x95, 0x72, 0x34, 0x9E, 0x5A, 0x28, 0xAB, 0x13, 0x3D, 0x29, 0x7B, - 0x6C, 0xEF, 0x0E, 0x9B, 0xFF, 0xDA, 0xA6, 0x68, 0xE4, 0x1F, 0x9C, 0x2F, 0xE8, 0x3E, 0x74, 0xEF, - 0x9C, 0x35, 0x03, 0xBD, 0x03, 0xDB, 0xF9, 0x44, 0xE3, 0xA3, 0x87, 0xE9, 0x3C, 0xBC, 0xC2, 0xC7, - 0xF8, 0xE7, 0x57, 0x38, 0x9A, 0x63, 0xBE, 0x78, 0xCA, 0xBA, 0xDF, 0x3B, 0xE9, 0xD9, 0xF6, 0xE9, - 0xC9, 0x8B, 0xFD, 0xA7, 0xC7, 0x47, 0x27, 0x47, 0xCF, 0x9E, 0x9E, 0x9E, 0xEC, 0x3F, 0x78, 0x7C, - 0x18, 0x64, 0xDD, 0x93, 0x24, 0x8C, 0x58, 0x27, 0x3A, 0x09, 0x5F, 0x2F, 0x71, 0xDD, 0xD1, 0xB6, - 0x5F, 0x5E, 0xA2, 0xF5, 0x5D, 0x1A, 0x8A, 0x69, 0xC8, 0xEB, 0x39, 0xE2, 0xB8, 0x3B, 0xAC, 0x15, - 0xF2, 0x0C, 0xB0, 0x96, 0x6E, 0x73, 0x98, 0x99, 0xBC, 0x87, 0x6C, 0xCB, 0xA5, 0xD8, 0xDE, 0x03, - 0x60, 0x76, 0x91, 0x81, 0x77, 0x76, 0xFC, 0x75, 0x66, 0xE5, 0xE1, 0x62, 0x51, 0x78, 0x40, 0x2B, - 0x80, 0xA6, 0xD9, 0xCE, 0xCE, 0x70, 0x8D, 0x67, 0x01, 0xA1, 0x70, 0x29, 0xF3, 0xEF, 0x1E, 0x5D, - 0x17, 0xA0, 0xBA, 0x47, 0x00, 0xA9, 0xA1, 0x97, 0x08, 0x1F, 0x00, 0x2A, 0x96, 0x69, 0x32, 0x93, - 0x88, 0xF2, 0x2A, 0x4B, 0xC2, 0x42, 0x47, 0xAE, 0x6F, 0x4F, 0x1A, 0x79, 0x29, 0xD7, 0xFA, 0xBA, - 0x3F, 0x8B, 0xD0, 0xA4, 0xBB, 0x35, 0x0B, 0x65, 0x01, 0xD4, 0xBD, 0x1B, 0x5E, 0x5D, 0x2D, 0xAF, - 0x61, 0x19, 0x88, 0x18, 0x33, 0xDC, 0x5E, 0xDF, 0xB2, 0xB8, 0xBD, 0x5D, 0xB6, 0xBA, 0xCF, 0x2C, - 0x0B, 0x91, 0x00, 0xDC, 0x3A, 0x05, 0xBB, 0x72, 0x6B, 0x42, 0x3B, 0x17, 0x6D, 0x10, 0xCF, 0x45, - 0x8E, 0x3B, 0x60, 0x6D, 0x62, 0x23, 0xD7, 0xB7, 0x84, 0xB1, 0x5B, 0xB7, 0x67, 0x21, 0x16, 0xE4, - 0x85, 0x24, 0x88, 0x98, 0xEE, 0x10, 0x79, 0xAE, 0x25, 0xD6, 0x80, 0x11, 0xE4, 0x71, 0x7C, 0x6E, - 0xB3, 0x17, 0x76, 0x47, 0x31, 0x73, 0xF0, 0xA1, 0x34, 0x88, 0xC3, 0x7C, 0x54, 0x0B, 0x9E, 0xA6, - 0xC8, 0x46, 0x2E, 0x8D, 0x8A, 0xAC, 0x22, 0x72, 0xEA, 0xFA, 0xC8, 0x05, 0x5D, 0x13, 0x04, 0xD7, - 0x8F, 0x31, 0xF2, 0xF4, 0x5C, 0xC4, 0x74, 0xDC, 0x21, 0x72, 0xA8, 0xF4, 0xD4, 0xA5, 0xF9, 0x3E, - 0x72, 0x7A, 0xAE, 0x9E, 0x66, 0x3A, 0xBD, 0x3E, 0x8A, 0xE9, 0xBE, 0x4D, 0x44, 0xB8, 0x03, 0x14, - 0x23, 0xC7, 0x41, 0x4E, 0x01, 0x41, 0x63, 0x7C, 0x34, 0x54, 0xD1, 0x4D, 0x1D, 0xD0, 0x74, 0x19, - 0x22, 0xB8, 0xFA, 0xA4, 0x08, 0x06, 0x05, 0x7C, 0x8F, 0x61, 0xF0, 0x64, 0x8C, 0xEF, 0xB3, 0x98, - 0x91, 0xE2, 0xA5, 0x46, 0x60, 0x4A, 0x90, 0x5D, 0xA6, 0x35, 0x41, 0x0E, 0xF2, 0x14, 0x02, 0xDC, - 0x01, 0x02, 0x37, 0x59, 0x3A, 0xCC, 0x10, 0xD9, 0x3A, 0x4D, 0x09, 0xF2, 0xE8, 0x3F, 0x35, 0x9B, - 0x47, 0x91, 0xEB, 0x30, 0x3E, 0xF2, 0x90, 0xAF, 0xC2, 0xF8, 0xC8, 0x96, 0x11, 0x1C, 0xA6, 0x8F, - 0x3C, 0xD4, 0xD7, 0xA3, 0x7A, 0xC8, 0x43, 0x3D, 0x35, 0x5B, 0x0F, 0xD9, 0x32, 0x82, 0xC3, 0xB8, - 0xC8, 0x43, 0xAE, 0x0A, 0xE3, 0xD2, 0x66, 0x14, 0x11, 0x23, 0x0F, 0x39, 0x65, 0x36, 0xA6, 0x68, - 0x88, 0x7A, 0x32, 0x0A, 0xF2, 0xA8, 0x11, 0x82, 0xD5, 0x7D, 0x44, 0x91, 0x41, 0xEB, 0x0F, 0x66, - 0x68, 0x88, 0xFA, 0xE5, 0xB6, 0x65, 0x22, 0x57, 0x65, 0xC9, 0x74, 0x38, 0x44, 0x23, 0x1F, 0x8D, - 0x7A, 0x33, 0xE0, 0xE0, 0x40, 0x2F, 0x7B, 0x50, 0x8E, 0x4A, 0xB4, 0x28, 0x90, 0x8D, 0x81, 0x2A, - 0x1B, 0x94, 0x3E, 0x0D, 0x62, 0xE4, 0x20, 0x47, 0x6D, 0x6A, 0x4E, 0x4E, 0xDF, 0x67, 0xFD, 0xC5, - 0xA3, 0xD0, 0x7A, 0x92, 0x3F, 0x44, 0x7D, 0x9B, 0xA6, 0x0C, 0x75, 0xA6, 0x4F, 0xFB, 0x36, 0xEA, - 0x3B, 0xA8, 0xEF, 0xA2, 0xBE, 0x37, 0x43, 0x1E, 0x1A, 0xE9, 0xC9, 0x32, 0xA3, 0x5F, 0xCE, 0x58, - 0x94, 0xE6, 0x97, 0x4B, 0xD3, 0x71, 0xD2, 0x76, 0xEE, 0xEB, 0x39, 0x41, 0xBB, 0xC2, 0xA2, 0xEC, - 0x94, 0x29, 0x50, 0xC7, 0x7E, 0x15, 0x54, 0x14, 0xD2, 0x57, 0xF8, 0x51, 0x60, 0xF1, 0x87, 0x16, - 0xD0, 0xDC, 0xAB, 0x4D, 0xE9, 0x55, 0x53, 0x68, 0x6D, 0x7C, 0x0B, 0x84, 0xA8, 0xA1, 0xA0, 0x5E, - 0x95, 0x77, 0x1C, 0x9D, 0xDF, 0x58, 0x90, 0x83, 0x46, 0x52, 0xDE, 0xF4, 0x14, 0xB7, 0x9A, 0xE2, - 0x0F, 0x59, 0x41, 0x2E, 0x72, 0x2A, 0x55, 0xF2, 0x87, 0x68, 0x68, 0x53, 0x7C, 0xD5, 0xA4, 0xA1, - 0x83, 0x86, 0xC3, 0xBA, 0xA4, 0xE9, 0x70, 0x84, 0x46, 0x36, 0x1A, 0xB9, 0xB3, 0xDA, 0x7C, 0xA3, - 0x3E, 0x2B, 0x4E, 0x4B, 0x33, 0x87, 0x36, 0x13, 0xA0, 0x91, 0x2E, 0x86, 0x23, 0x64, 0xCB, 0x28, - 0x68, 0x11, 0x35, 0x42, 0x97, 0xF9, 0x9A, 0x14, 0x5E, 0xE7, 0x11, 0x9C, 0x60, 0xD5, 0x4A, 0xD1, - 0x08, 0x0D, 0x91, 0xB3, 0x41, 0x56, 0x20, 0x6B, 0x79, 0x4C, 0x82, 0x31, 0xC8, 0xA9, 0x14, 0xE5, - 0xB8, 0x94, 0x1D, 0x75, 0x89, 0x9C, 0xC2, 0x9A, 0xB4, 0x04, 0x98, 0x50, 0x14, 0xC1, 0xC6, 0x38, - 0x2D, 0xAA, 0x84, 0xA3, 0x2E, 0x8D, 0x57, 0xC6, 0xB1, 0x6F, 0xA9, 0x0D, 0xCB, 0x5C, 0xA5, 0x1C, - 0x44, 0xC6, 0xAE, 0x70, 0x29, 0x41, 0x0E, 0x1D, 0xB8, 0x1C, 0x6D, 0x28, 0xD3, 0xA3, 0x4A, 0xC4, - 0xD5, 0xA5, 0x09, 0xFC, 0x6E, 0x43, 0x2B, 0xF8, 0x22, 0x9F, 0x53, 0x2F, 0xFF, 0x8E, 0x0B, 0xFF, - 0x1B, 0x46, 0x16, 0xC7, 0xDE, 0x94, 0x3A, 0xAA, 0x26, 0x26, 0xC8, 0xF1, 0xD8, 0x7F, 0x7D, 0x0C, - 0x2C, 0xC5, 0xB2, 0xBA, 0xD2, 0x69, 0x43, 0x07, 0x9C, 0xD2, 0x68, 0x3A, 0x0E, 0xD3, 0x41, 0x78, - 0x06, 0x59, 0xFC, 0x42, 0x8A, 0x2F, 0xC4, 0x74, 0x2D, 0x3E, 0xB5, 0x51, 0xFD, 0x42, 0x1F, 0x60, - 0x2E, 0x4A, 0x02, 0x41, 0x23, 0x0A, 0x22, 0x72, 0x53, 0x2C, 0xEE, 0xE6, 0x52, 0x97, 0x21, 0x6D, - 0xD4, 0x65, 0x68, 0x5C, 0x66, 0x96, 0x95, 0x1C, 0x32, 0xB9, 0xC0, 0x4A, 0xE5, 0xDE, 0x07, 0x8E, - 0x62, 0x8F, 0xD9, 0x99, 0x5B, 0x9A, 0x85, 0x19, 0x1E, 0xDB, 0x48, 0x1C, 0x77, 0x8C, 0xA7, 0x33, - 0x11, 0x7E, 0x1E, 0xA7, 0x63, 0x1B, 0x15, 0x08, 0xC6, 0x36, 0x9A, 0x5F, 0xAC, 0xA2, 0x37, 0x10, - 0x9F, 0x0B, 0x6D, 0x62, 0x92, 0x91, 0x70, 0x79, 0x4C, 0xB1, 0x88, 0x53, 0xBE, 0xF9, 0x2A, 0x49, - 0x70, 0x94, 0xB1, 0xB8, 0x0A, 0x94, 0xBE, 0xE3, 0x52, 0x77, 0x76, 0x5A, 0x8A, 0xBE, 0xC9, 0x63, - 0x97, 0x48, 0xF1, 0x72, 0x89, 0xE7, 0xF2, 0x30, 0xF1, 0x2A, 0xC1, 0x73, 0xBC, 0x20, 0xD1, 0xB9, - 0xF4, 0x85, 0x5D, 0xDC, 0x2A, 0x25, 0x24, 0x92, 0x87, 0x5C, 0xAF, 0x83, 0x62, 0x91, 0x5F, 0x78, - 0xA3, 0xC3, 0xF3, 0x55, 0x86, 0x0B, 0x10, 0xAC, 0x24, 0xCE, 0x53, 0xA2, 0xE7, 0xD5, 0x72, 0xA6, - 0xF3, 0xFA, 0x5C, 0x38, 0x49, 0xE2, 0x44, 0x4B, 0xC2, 0x35, 0xD4, 0x04, 0x75, 0x04, 0xD6, 0x12, - 0xB5, 0xE9, 0x30, 0xB3, 0xA0, 0x70, 0x13, 0x54, 0x41, 0xEA, 0x06, 0x28, 0xA9, 0x52, 0x02, 0xDB, - 0xCC, 0x2C, 0x2E, 0x04, 0xCE, 0x92, 0xD7, 0xAF, 0x1F, 0x50, 0xE4, 0x9D, 0xAB, 0x70, 0x0B, 0x71, - 0xB9, 0x74, 0x1F, 0x70, 0x1A, 0xA7, 0x73, 0xB1, 0xB5, 0xBA, 0x28, 0xEB, 0xC0, 0x44, 0xDD, 0x67, - 0x22, 0x55, 0xEE, 0x86, 0xE5, 0x31, 0x76, 0x15, 0x3C, 0x2E, 0x0E, 0xB9, 0xAD, 0x9A, 0x66, 0x0B, - 0xEA, 0x5A, 0x52, 0x67, 0xD3, 0xA1, 0x24, 0xDB, 0xBC, 0x39, 0x23, 0x51, 0xB8, 0x1C, 0x1B, 0xAF, - 0x5E, 0x19, 0x39, 0x73, 0x50, 0x00, 0xBB, 0x69, 0x76, 0x7C, 0x41, 0xCE, 0x08, 0x3B, 0x44, 0x0E, - 0xA6, 0x30, 0x36, 0xF5, 0x67, 0xE2, 0xC8, 0x0B, 0xDE, 0xE7, 0x60, 0x2A, 0xBD, 0x67, 0xE4, 0x3D, - 0x77, 0x5A, 0xC5, 0x3E, 0xE4, 0x99, 0x42, 0x55, 0x5D, 0x23, 0x8E, 0x96, 0xD7, 0xAD, 0x38, 0xC2, - 0xAD, 0xD7, 0xD7, 0x19, 0x6E, 0x85, 0x69, 0x8B, 0xE5, 0x68, 0xA5, 0xAB, 0xAB, 0xAB, 0x38, 0xC9, - 0xF0, 0x82, 0x29, 0x65, 0x90, 0x40, 0xE2, 0xD2, 0x2C, 0x10, 0x23, 0xD2, 0x6E, 0xF7, 0xED, 0x5D, - 0xB2, 0x5E, 0x93, 0xDD, 0xBE, 0x57, 0x45, 0xCF, 0xB1, 0x5D, 0xAE, 0x52, 0x70, 0x77, 0x45, 0x22, - 0xEE, 0x1E, 0xCB, 0x7E, 0xEF, 0xCD, 0x5B, 0xDD, 0x2E, 0xFD, 0x7B, 0x66, 0x58, 0x39, 0xD0, 0x0A, - 0xEF, 0x07, 0x2E, 0xF1, 0x82, 0x84, 0x19, 0xE6, 0x8E, 0xB2, 0xF5, 0x38, 0xC5, 0x8C, 0x74, 0x6D, - 0x35, 0xB2, 0x77, 0x31, 0x54, 0x23, 0xA5, 0xF5, 0xD0, 0x72, 0xB6, 0xC2, 0x04, 0x6B, 0x55, 0xD2, - 0x9D, 0xB2, 0xD4, 0x97, 0x03, 0xEE, 0x22, 0x0B, 0xBB, 0xD1, 0x25, 0x18, 0xD5, 0xE6, 0x36, 0xB0, - 0xC8, 0x73, 0x77, 0xD3, 0xF5, 0x3A, 0xDD, 0xF5, 0x6B, 0x94, 0x62, 0xD4, 0xAC, 0x75, 0xCC, 0x70, - 0x6D, 0xC6, 0x0C, 0xF7, 0x8C, 0xB2, 0x7B, 0x67, 0x27, 0x18, 0x22, 0xB2, 0x0E, 0xD2, 0x9C, 0x32, - 0x06, 0x0E, 0xEA, 0xBB, 0x20, 0x12, 0xE2, 0x8C, 0xB3, 0x82, 0x1F, 0x52, 0x25, 0xE2, 0xB0, 0x95, - 0x92, 0xE8, 0x7C, 0xC9, 0xDA, 0xD4, 0x28, 0x7C, 0x76, 0x09, 0x2C, 0x15, 0x7B, 0xD9, 0xD9, 0xD4, - 0x9E, 0x31, 0xE2, 0xB3, 0xA9, 0x33, 0xAB, 0x7A, 0x36, 0xD3, 0xD1, 0x4B, 0xBA, 0x3F, 0xBB, 0xA1, - 0x19, 0x73, 0x4A, 0x3A, 0x0D, 0x3A, 0xB3, 0xBC, 0xF0, 0x52, 0x56, 0x54, 0x02, 0x91, 0x1C, 0x04, - 0xB7, 0x70, 0x5D, 0x57, 0x5C, 0x8C, 0x72, 0x6F, 0x3A, 0x13, 0x3C, 0xB1, 0x32, 0xB6, 0xFD, 0xAD, - 0x7B, 0x2B, 0xEA, 0xF6, 0x7A, 0x6D, 0x6C, 0x59, 0x08, 0xEF, 0xEE, 0x06, 0xC3, 0xC2, 0x18, 0x7C, - 0x82, 0xDF, 0xE2, 0x24, 0xC5, 0xA6, 0xD5, 0xFD, 0x61, 0x4C, 0x22, 0xD3, 0x30, 0xE0, 0x3C, 0xE2, - 0xB9, 0x32, 0x00, 0x2A, 0xA7, 0x6B, 0xEA, 0x48, 0x89, 0xD9, 0x2D, 0x87, 0x06, 0x59, 0x0B, 0x58, - 0x37, 0xA4, 0xE6, 0x35, 0x1D, 0x56, 0xBB, 0xF3, 0x56, 0x8E, 0x1A, 0x45, 0x5F, 0x9D, 0xC2, 0xC2, - 0xB8, 0x3F, 0xB3, 0x26, 0xA5, 0x7B, 0x1F, 0x65, 0xAC, 0x9A, 0x12, 0xC5, 0x3B, 0xA1, 0x16, 0xAD, - 0xDC, 0xFE, 0xA4, 0xB5, 0xF9, 0xA4, 0x17, 0xB5, 0x5B, 0x2E, 0x80, 0xD2, 0xBA, 0x0B, 0xA0, 0xB4, - 0xEE, 0x02, 0x48, 0xAD, 0x9B, 0xE0, 0x8C, 0x5A, 0xE6, 0xA6, 0x3A, 0x96, 0x6F, 0x88, 0xEE, 0x9C, - 0x8F, 0xB6, 0x5E, 0x51, 0x70, 0xF5, 0x0A, 0x49, 0x9F, 0x20, 0x01, 0x5A, 0x9B, 0x14, 0x54, 0xF7, - 0x0F, 0xA5, 0xE9, 0x62, 0x8A, 0x75, 0xA1, 0x9F, 0x05, 0x19, 0xAF, 0x68, 0x09, 0xC3, 0x5D, 0xF3, - 0x57, 0x9C, 0xFC, 0x6E, 0x06, 0xAF, 0x12, 0x5B, 0x53, 0xBD, 0xCA, 0xCA, 0x41, 0x8A, 0xDA, 0x81, - 0x9C, 0x22, 0x6F, 0x13, 0xB5, 0x8A, 0x84, 0x29, 0xB3, 0xAB, 0x2A, 0x61, 0x7A, 0x74, 0x8D, 0x84, - 0xE9, 0x00, 0xDF, 0xBD, 0x84, 0xA9, 0x55, 0xB2, 0xAA, 0x2B, 0x81, 0x1A, 0x49, 0xA9, 0x30, 0xFD, - 0x36, 0x70, 0xCA, 0xF4, 0xA2, 0x98, 0x2A, 0xC3, 0xB5, 0xD5, 0x58, 0xC1, 0xEC, 0xE2, 0xD4, 0x9F, - 0x31, 0x5B, 0xD7, 0x24, 0x14, 0xB3, 0x7C, 0xB7, 0x7C, 0xAD, 0x5B, 0x43, 0x01, 0xCA, 0xF8, 0x33, - 0x64, 0x15, 0xA5, 0xD4, 0x87, 0x95, 0x98, 0xB4, 0x2B, 0xD7, 0x1A, 0x34, 0xEC, 0x98, 0x55, 0xA2, - 0xA8, 0x56, 0xA4, 0x40, 0x55, 0x7B, 0x03, 0x2B, 0x6B, 0xF6, 0xAC, 0x34, 0x62, 0x69, 0x35, 0x93, - 0x8B, 0xA1, 0x4A, 0xCD, 0xB0, 0xAC, 0xC7, 0xB3, 0x9A, 0x61, 0xA1, 0xC8, 0x57, 0xBA, 0x3A, 0xA6, - 0x54, 0x3F, 0xDB, 0xD0, 0x9D, 0x8B, 0x8C, 0xF5, 0x54, 0xD3, 0x2E, 0xA3, 0xAC, 0x97, 0x94, 0x8E, - 0xA2, 0x2E, 0xAC, 0xF8, 0x58, 0xAE, 0x41, 0xD6, 0x02, 0xD6, 0xAD, 0xC0, 0x74, 0x07, 0x4F, 0x77, - 0xDA, 0x5D, 0xA8, 0x6C, 0x52, 0xEF, 0x7B, 0x55, 0xC1, 0x50, 0xE3, 0xF9, 0x9E, 0xA3, 0x36, 0xF2, - 0xE3, 0x36, 0x22, 0xB6, 0xF4, 0xDF, 0x53, 0xEC, 0xB6, 0xBA, 0xB0, 0xD9, 0x92, 0xBD, 0xBB, 0x9C, - 0x10, 0xB8, 0x95, 0xFD, 0x59, 0x57, 0x6A, 0x36, 0x4C, 0x67, 0x56, 0x7E, 0x7A, 0x45, 0x09, 0x4C, - 0xDE, 0xB2, 0x34, 0xD5, 0x8B, 0x70, 0x03, 0xC2, 0xEA, 0x86, 0xAF, 0x40, 0x98, 0x35, 0xA6, 0x3D, - 0x8F, 0xD3, 0x80, 0x54, 0x53, 0x8B, 0x8D, 0x60, 0x90, 0x56, 0x53, 0xC5, 0xCE, 0x30, 0x48, 0x72, - 0x88, 0x15, 0x57, 0x5B, 0xFC, 0x5D, 0x7E, 0x60, 0xA3, 0x28, 0xB0, 0xE1, 0xCD, 0x7C, 0xA1, 0xA4, - 0x5C, 0x22, 0xD7, 0xE2, 0xCE, 0x46, 0x1A, 0x52, 0x1B, 0xEA, 0x48, 0x91, 0x36, 0x52, 0xA3, 0x3C, - 0x7A, 0x90, 0x23, 0x2E, 0x59, 0xAF, 0x9D, 0x4D, 0xA5, 0xD0, 0x55, 0x55, 0x43, 0x59, 0x0E, 0x52, - 0x57, 0x8B, 0x97, 0x57, 0x70, 0x4B, 0xD4, 0xE2, 0xEF, 0x5B, 0x43, 0x50, 0xAD, 0x5B, 0xAC, 0x70, - 0x2B, 0x8B, 0xE9, 0xFA, 0xFC, 0x2D, 0x89, 0x57, 0x74, 0x8D, 0x7B, 0x1D, 0xCD, 0x5B, 0x9C, 0xB3, - 0xA8, 0x75, 0x4E, 0xDE, 0x92, 0xE8, 0xBC, 0xB5, 0xBA, 0x6A, 0x51, 0xE4, 0x24, 0x3A, 0x37, 0x0A, - 0x37, 0xFB, 0x8D, 0x6D, 0xC5, 0x7D, 0x00, 0x6F, 0x68, 0xAF, 0x6D, 0x47, 0x2A, 0xE8, 0xD5, 0x57, - 0x8B, 0x69, 0xED, 0x79, 0x60, 0xE6, 0x09, 0x6E, 0xB9, 0xDB, 0xED, 0x68, 0x77, 0xDB, 0x01, 0xA5, - 0x81, 0x49, 0xC4, 0xAE, 0xBA, 0xD3, 0x20, 0x9B, 0x46, 0x33, 0x53, 0xBF, 0xBD, 0x83, 0x3B, 0xEE, - 0xD4, 0x9A, 0x44, 0xEC, 0x92, 0x39, 0xBD, 0xF5, 0x1E, 0xB9, 0x5E, 0x9E, 0x22, 0x94, 0x4E, 0x36, - 0x09, 0xB7, 0x66, 0x25, 0xEF, 0x2E, 0x54, 0xFE, 0x89, 0x50, 0xD6, 0x1F, 0xF3, 0x87, 0xDF, 0x8D, - 0x02, 0x57, 0xE8, 0x53, 0x17, 0x43, 0x0D, 0xBF, 0x5F, 0x75, 0x7D, 0x66, 0x49, 0xC3, 0xED, 0xD3, - 0xBF, 0x70, 0xC3, 0x64, 0x49, 0x8D, 0x49, 0x77, 0x10, 0x70, 0x33, 0x1B, 0xCD, 0xDD, 0x6E, 0x1D, - 0x38, 0x9F, 0x38, 0x5E, 0xA9, 0x75, 0xE9, 0x7D, 0x40, 0x5D, 0x8A, 0xE1, 0x14, 0x47, 0x8B, 0x9F, - 0x84, 0x8A, 0xE4, 0x1F, 0x37, 0x18, 0xDC, 0x76, 0x70, 0xA4, 0xCD, 0x2D, 0x4E, 0xAF, 0xBD, 0xA1, - 0x0E, 0xD2, 0xD4, 0x0B, 0x09, 0xE2, 0x09, 0xD9, 0xC9, 0x26, 0x9D, 0x0E, 0xB1, 0x6E, 0x78, 0x27, - 0xA4, 0x6C, 0x25, 0x33, 0x24, 0xBA, 0xAC, 0x72, 0x06, 0x27, 0xEE, 0x42, 0xCB, 0xA5, 0xED, 0xEC, - 0x0C, 0xD7, 0x66, 0xB2, 0xE3, 0xF4, 0xED, 0xBD, 0x64, 0x7C, 0x61, 0xCD, 0x50, 0xB4, 0xBB, 0xEB, - 0xF3, 0x5E, 0xEB, 0x8E, 0x0B, 0xD5, 0x1E, 0xD2, 0x71, 0x26, 0x4C, 0xAF, 0x92, 0x8A, 0xFC, 0x6E, - 0x90, 0xAD, 0xD7, 0x50, 0x5A, 0x3A, 0xB3, 0x76, 0x3C, 0x17, 0x4C, 0x6A, 0xB8, 0x7D, 0xEE, 0xF2, - 0xB7, 0xBA, 0x2F, 0x32, 0x31, 0x5C, 0xD8, 0x22, 0x02, 0x7E, 0xE5, 0x99, 0xD6, 0x3A, 0x98, 0x9B, - 0xF9, 0xFF, 0x2D, 0xA6, 0x5C, 0xB5, 0x22, 0x39, 0xAE, 0xDF, 0x06, 0x24, 0xB3, 0xBD, 0xA6, 0x04, - 0xD3, 0xAA, 0xCD, 0xF3, 0xE8, 0xB5, 0x29, 0x0E, 0x90, 0xEA, 0x84, 0x49, 0xED, 0x66, 0xF6, 0x58, - 0x35, 0xD4, 0x37, 0x96, 0x93, 0x9F, 0xBA, 0xC4, 0x31, 0x6F, 0xAE, 0x84, 0xAE, 0x23, 0x41, 0xF3, - 0x78, 0x81, 0xC7, 0x09, 0x52, 0x85, 0x63, 0x5C, 0x11, 0x17, 0xC4, 0x7B, 0xC2, 0x58, 0xEB, 0x17, - 0x88, 0x75, 0x9C, 0xB1, 0xDA, 0x8B, 0x50, 0xF8, 0x3A, 0x4E, 0xB2, 0xF1, 0x96, 0x93, 0x5B, 0x5D, - 0x08, 0x0A, 0x55, 0x6A, 0x85, 0xAC, 0xC1, 0x58, 0x18, 0x14, 0x6A, 0x5A, 0xB2, 0xF3, 0x02, 0xA8, - 0x94, 0x26, 0xEC, 0xBD, 0x69, 0x18, 0xC4, 0x7B, 0xB1, 0xD4, 0xD6, 0x1A, 0x6F, 0xF3, 0x47, 0x88, - 0xA1, 0x18, 0xA4, 0xE3, 0x69, 0xD8, 0x34, 0x95, 0x84, 0x77, 0x1E, 0xB0, 0xB5, 0xE5, 0x8E, 0x87, - 0x62, 0x14, 0xA2, 0x08, 0xC6, 0x9B, 0x49, 0xB8, 0x63, 0x8B, 0xE7, 0x67, 0xEA, 0x06, 0xC1, 0xAC, - 0x92, 0x5B, 0xD6, 0x46, 0xB9, 0x4B, 0xA3, 0x0D, 0xC7, 0x8B, 0x58, 0xF6, 0x65, 0xDE, 0x0B, 0x7B, - 0xA3, 0x71, 0xD3, 0xE8, 0xA4, 0x0D, 0xAB, 0xC3, 0x0A, 0xD8, 0xF1, 0xEA, 0x35, 0x83, 0xDC, 0x76, - 0xAC, 0x92, 0xD5, 0xC5, 0x32, 0xE8, 0x43, 0x72, 0x4E, 0x32, 0x33, 0xD9, 0xF6, 0x87, 0x56, 0x9E, - 0xBF, 0xBB, 0x20, 0x4B, 0x6C, 0x76, 0x3A, 0x64, 0x27, 0x6B, 0xB7, 0xF9, 0x98, 0x62, 0xED, 0xFA, - 0x03, 0xDA, 0x01, 0xFA, 0xB6, 0x35, 0x21, 0xDB, 0xDB, 0xBA, 0xE5, 0xE7, 0x52, 0xE5, 0x83, 0xA1, - 0x3E, 0x6C, 0xAE, 0x83, 0x44, 0xB3, 0x1A, 0x69, 0x8F, 0x85, 0x43, 0xE0, 0xA6, 0x23, 0x80, 0x6A, - 0xB3, 0x2F, 0x83, 0xF9, 0xDE, 0xBC, 0xDA, 0xEC, 0x4B, 0xD1, 0xEC, 0xF3, 0xE9, 0x52, 0x9D, 0x9B, - 0x97, 0x1F, 0xD7, 0xD4, 0x3E, 0x9A, 0xA3, 0xA5, 0x68, 0xEA, 0x65, 0xD1, 0xD4, 0xEA, 0xD9, 0x42, - 0x4D, 0x53, 0xDF, 0xB1, 0x75, 0x1D, 0x67, 0xFC, 0x9D, 0xCD, 0xA2, 0x8E, 0x3B, 0x2E, 0x4F, 0xF7, - 0x4C, 0xB9, 0xF3, 0x16, 0x39, 0x2C, 0x99, 0xD8, 0xAE, 0x19, 0xE0, 0xE5, 0xF8, 0xEE, 0xFA, 0x41, - 0x10, 0x88, 0x61, 0x70, 0xBD, 0x76, 0xFB, 0xCC, 0xA0, 0x12, 0x9B, 0x68, 0xD9, 0x98, 0x38, 0xD0, - 0xC6, 0xC4, 0x82, 0x14, 0xA6, 0x62, 0x56, 0x19, 0x14, 0xD5, 0xB2, 0x61, 0xB1, 0x75, 0xC7, 0x35, - 0x8B, 0x32, 0xD1, 0xD7, 0xB5, 0x5A, 0x1F, 0x4D, 0x67, 0xC8, 0x16, 0xCD, 0x26, 0x17, 0x02, 0xDF, - 0xC1, 0x74, 0x7F, 0xB7, 0x76, 0xF5, 0xC7, 0x95, 0x2D, 0x6B, 0x16, 0x26, 0x99, 0xA9, 0xF7, 0xCF, - 0x32, 0xAF, 0x53, 0xE6, 0xEC, 0xBC, 0x61, 0xB6, 0xD1, 0x39, 0x5B, 0x60, 0xBE, 0x9D, 0xB3, 0x7D, - 0x95, 0xB1, 0x9B, 0x16, 0x50, 0xB7, 0x70, 0xB5, 0xF7, 0x27, 0xC0, 0xD5, 0xBC, 0x76, 0x35, 0x14, - 0xE5, 0x79, 0xDE, 0xA0, 0xF4, 0x36, 0xCF, 0x51, 0xDF, 0xF5, 0xDD, 0x4F, 0x53, 0xA7, 0x2B, 0x8E, - 0x21, 0x82, 0xAC, 0xB8, 0xD7, 0xA9, 0x6A, 0xC9, 0xB1, 0x57, 0x0B, 0x89, 0x78, 0xD2, 0x10, 0xB1, - 0xE7, 0x0B, 0x45, 0x86, 0xE6, 0xE7, 0x0B, 0xA9, 0x7A, 0x4D, 0x29, 0xD4, 0x4E, 0x23, 0xA9, 0x76, - 0x5A, 0x38, 0x35, 0xFB, 0xF8, 0x07, 0x05, 0x1F, 0xFA, 0x94, 0xE1, 0xCF, 0xDF, 0x1D, 0x90, 0xD2, - 0xBB, 0x83, 0xEF, 0xFC, 0x71, 0x47, 0xA4, 0x3E, 0x65, 0x28, 0x0E, 0x18, 0xD8, 0xC6, 0xF8, 0x8F, - 0xE9, 0x19, 0x03, 0xED, 0xF6, 0x77, 0x7C, 0xC3, 0x50, 0x27, 0x8F, 0x5C, 0x70, 0xF3, 0x53, 0x3E, - 0xA2, 0x95, 0xD5, 0xEA, 0xCB, 0xCD, 0x2E, 0x30, 0xCC, 0xD6, 0xEB, 0xE8, 0xBB, 0x7D, 0xBA, 0x20, - 0x86, 0xD4, 0x8D, 0x6A, 0xDE, 0xC8, 0x38, 0x3E, 0xD9, 0x7F, 0x71, 0x62, 0x58, 0xF9, 0xE9, 0x4F, - 0xC0, 0xBB, 0x85, 0xE2, 0xD1, 0x42, 0xD2, 0xF4, 0x68, 0x41, 0xB0, 0x15, 0xB2, 0xE8, 0xE3, 0x28, - 0x3F, 0xF9, 0x29, 0x3D, 0xC0, 0xF0, 0xB6, 0x74, 0x31, 0xA2, 0x71, 0x4E, 0x8D, 0x68, 0x4D, 0x32, - 0x30, 0x4F, 0x58, 0x78, 0xC7, 0xCD, 0x3A, 0x1D, 0x78, 0x7B, 0xDC, 0x1B, 0xB1, 0xB7, 0x06, 0x6A, - 0x21, 0x6E, 0x51, 0x64, 0x31, 0x6D, 0xD1, 0xCD, 0x10, 0xD9, 0xF1, 0x87, 0xEB, 0x75, 0x6F, 0xB0, - 0x43, 0xEA, 0x0C, 0x2C, 0x40, 0x5E, 0x8F, 0x76, 0x5A, 0x49, 0x00, 0x59, 0xC8, 0x81, 0x82, 0x2C, - 0x8A, 0x37, 0xB4, 0x64, 0x11, 0x38, 0xF6, 0x3D, 0x11, 0xEE, 0x90, 0x6D, 0x7F, 0x98, 0x97, 0x3A, - 0x44, 0xBB, 0x4D, 0xB6, 0xB3, 0x5D, 0xB9, 0xE2, 0x2A, 0x6A, 0x9D, 0xE7, 0x54, 0x86, 0x95, 0x67, - 0x1D, 0x76, 0x0D, 0x0B, 0xCA, 0x6C, 0xA9, 0x72, 0x45, 0x1A, 0x8D, 0x60, 0x75, 0xAC, 0x15, 0xCE, - 0x3F, 0xC5, 0x8F, 0x43, 0x80, 0x47, 0x3F, 0xF9, 0x2F, 0x43, 0xF8, 0x70, 0xF4, 0x93, 0xF2, 0x2C, - 0x04, 0x19, 0x87, 0x4F, 0x1F, 0x56, 0x1F, 0x84, 0x6C, 0x1A, 0x09, 0xE1, 0xF9, 0xA7, 0xB2, 0x62, - 0xF8, 0xE8, 0xA7, 0x1F, 0xEA, 0x93, 0x0C, 0x6D, 0x18, 0xF8, 0x6E, 0x9E, 0x6E, 0x34, 0x0C, 0x39, - 0x35, 0x4F, 0x37, 0xD2, 0x8F, 0x78, 0xBA, 0xC1, 0xC4, 0xED, 0x3B, 0x7A, 0xB7, 0xF1, 0xC1, 0x4F, - 0x35, 0x3E, 0xE4, 0x6D, 0xC6, 0x2D, 0x8F, 0x31, 0x86, 0x03, 0xFF, 0x93, 0x0C, 0x8A, 0x33, 0x0D, - 0xB2, 0xF2, 0x23, 0xFD, 0xC2, 0x9C, 0x0A, 0x57, 0xAD, 0x2B, 0x49, 0x48, 0xE0, 0xB9, 0x28, 0x0B, - 0x3C, 0xB7, 0x98, 0x9B, 0x2E, 0xC3, 0xF7, 0x8F, 0x99, 0x85, 0x02, 0x2E, 0x2D, 0x97, 0xE1, 0x7B, - 0xB1, 0x7F, 0x4F, 0x79, 0x4A, 0x86, 0xB2, 0x5D, 0xB7, 0xD7, 0xAF, 0xEA, 0x77, 0x54, 0x61, 0x99, - 0x36, 0x46, 0x14, 0x83, 0x46, 0xC6, 0x39, 0x2C, 0x5C, 0x92, 0x56, 0x76, 0x11, 0x46, 0x2D, 0xB7, - 0xD7, 0x37, 0xB8, 0xB8, 0x2B, 0xAA, 0x70, 0x47, 0x51, 0xE6, 0xB9, 0xE2, 0xDD, 0x06, 0x23, 0xA0, - 0x64, 0x30, 0x21, 0x15, 0x05, 0x94, 0xE1, 0xA5, 0x0D, 0x87, 0xB4, 0x44, 0x6E, 0x25, 0xE7, 0xD1, - 0xE2, 0xBD, 0x7C, 0x24, 0xE2, 0xF4, 0xF5, 0xD2, 0x4E, 0x13, 0x4C, 0x79, 0x0F, 0xE7, 0x10, 0x69, - 0xB1, 0x34, 0x61, 0xB1, 0xC7, 0xAB, 0xD7, 0xE5, 0x84, 0x05, 0xFD, 0x3E, 0x4A, 0x8F, 0x57, 0xAF, - 0x79, 0xFF, 0xC9, 0xC8, 0xBC, 0x75, 0x96, 0xC4, 0x97, 0x02, 0xAD, 0x54, 0x22, 0x01, 0x93, 0x45, - 0x13, 0xE6, 0x66, 0x82, 0x8F, 0xF3, 0x42, 0x40, 0x26, 0xC5, 0x59, 0x2A, 0x7B, 0xB7, 0x41, 0x52, - 0x9E, 0x1D, 0xAC, 0x1E, 0x3B, 0x63, 0x7B, 0x42, 0x8A, 0x67, 0x25, 0x70, 0xD0, 0x5A, 0xF8, 0x89, - 0x27, 0x30, 0x9D, 0xEA, 0xF9, 0x52, 0xCB, 0xD2, 0xCD, 0x77, 0xA5, 0xAA, 0xF9, 0xAE, 0x4C, 0x3B, - 0x94, 0xA1, 0x6B, 0x53, 0xB1, 0x80, 0x28, 0x76, 0x4B, 0xA9, 0x34, 0x73, 0x9D, 0xE5, 0xFC, 0x49, - 0x97, 0xF6, 0xD2, 0x24, 0x2D, 0x89, 0x4B, 0x93, 0xB0, 0x28, 0xEF, 0x1E, 0xF8, 0x86, 0x8C, 0xAE, - 0x2D, 0x94, 0x66, 0xB7, 0x90, 0xA8, 0x58, 0xA0, 0x34, 0x37, 0xC2, 0x4A, 0x7B, 0x15, 0x59, 0x8A, - 0x38, 0x4B, 0x83, 0x78, 0xAC, 0x20, 0x28, 0xC7, 0x6A, 0x80, 0x47, 0x8B, 0xF7, 0x75, 0xD8, 0x8E, - 0x16, 0xEF, 0x01, 0xA1, 0xD6, 0xF8, 0x55, 0x79, 0x28, 0x40, 0x0A, 0x49, 0xA8, 0x95, 0x0F, 0x0A, - 0xA8, 0x48, 0x46, 0x59, 0x54, 0x10, 0xCE, 0xB3, 0x98, 0xB5, 0x54, 0xC1, 0xD5, 0xE9, 0xAC, 0xA4, - 0xEE, 0xA5, 0xB0, 0x83, 0xE9, 0x78, 0x61, 0xBE, 0x83, 0x29, 0x98, 0x37, 0xCD, 0x2A, 0x3B, 0x1F, - 0xB5, 0x4E, 0xD3, 0x6C, 0xB6, 0xBB, 0x3B, 0x44, 0x69, 0xE0, 0xF6, 0xC4, 0x59, 0x7E, 0x29, 0x79, - 0x92, 0x6E, 0x13, 0xBA, 0xD8, 0xE1, 0xA8, 0x99, 0x14, 0x5D, 0x25, 0x71, 0x16, 0x67, 0xD7, 0x57, - 0xDC, 0xCB, 0x44, 0x77, 0x1E, 0x2E, 0x97, 0x65, 0x8E, 0xC1, 0xD6, 0x5F, 0xCA, 0x08, 0xD6, 0xAF, - 0xA8, 0x9B, 0xBA, 0x6C, 0xA9, 0x43, 0x7E, 0x52, 0x57, 0x93, 0x92, 0x8A, 0x95, 0x85, 0xB5, 0x06, - 0xA2, 0x0E, 0x1F, 0xBB, 0x81, 0x2E, 0xAE, 0x56, 0x1D, 0x05, 0xB6, 0xBC, 0x2B, 0xC5, 0x3B, 0xDB, - 0x35, 0x4A, 0x88, 0x30, 0xE0, 0xA6, 0xAD, 0x25, 0x4E, 0x53, 0x31, 0x8A, 0x6D, 0x3B, 0xA0, 0xB3, - 0x47, 0x07, 0xB8, 0x70, 0xB9, 0x8C, 0xDF, 0x81, 0xD6, 0x5E, 0x1D, 0xA7, 0x0B, 0x52, 0x66, 0xF5, - 0x62, 0xBA, 0xB3, 0x33, 0x5C, 0xD7, 0xCB, 0xAF, 0xD6, 0xDE, 0x05, 0x9E, 0x4E, 0x67, 0x16, 0xE0, - 0x5D, 0xB2, 0x47, 0xC6, 0x38, 0xCF, 0xD5, 0x0E, 0xDD, 0xC4, 0x10, 0x5B, 0x65, 0x88, 0x25, 0x41, - 0x54, 0x1E, 0xAC, 0xEB, 0x49, 0x28, 0xB8, 0x57, 0xEE, 0xDD, 0x0D, 0x4D, 0xF6, 0x47, 0xC4, 0xC9, - 0x69, 0x2D, 0x75, 0x0A, 0x23, 0x6A, 0x46, 0x7A, 0x95, 0x65, 0xDB, 0xCE, 0xAC, 0xD3, 0xC9, 0xF3, - 0x8B, 0x30, 0x95, 0xF5, 0x28, 0xCC, 0x14, 0x9A, 0x0D, 0x9D, 0x04, 0xCF, 0xAC, 0xED, 0x9A, 0xF1, - 0x62, 0x8A, 0x69, 0xDF, 0xB2, 0x76, 0xED, 0xFC, 0x1C, 0x67, 0x1A, 0x3A, 0xFD, 0x3A, 0xBB, 0x9A, - 0x07, 0x91, 0xA6, 0xFE, 0xA8, 0x1C, 0x56, 0xD0, 0x3D, 0xC8, 0x5E, 0x09, 0xA4, 0x9B, 0xAE, 0x5E, - 0x87, 0x6C, 0xAE, 0x43, 0xC4, 0x1A, 0x47, 0xAB, 0xE5, 0x52, 0x2B, 0x7C, 0x7F, 0xB9, 0x54, 0xC6, - 0x93, 0x9B, 0xFC, 0xB6, 0xF1, 0xE4, 0xBB, 0x18, 0x38, 0x4C, 0x3C, 0xCD, 0x2A, 0x12, 0xCD, 0x5F, - 0x11, 0x96, 0x86, 0x08, 0x79, 0xBC, 0x2F, 0x16, 0x6C, 0x93, 0x06, 0x19, 0xDC, 0x92, 0x6B, 0xB4, - 0x42, 0x7C, 0xCB, 0xBC, 0x60, 0x4D, 0x3F, 0x56, 0x25, 0x5A, 0x08, 0x6F, 0x91, 0x49, 0xEC, 0xB5, - 0x4A, 0xF2, 0x29, 0x6E, 0x80, 0x74, 0x55, 0xB2, 0xE6, 0xB2, 0xC6, 0x4A, 0x0F, 0x44, 0x49, 0x90, - 0x4E, 0xB3, 0x6D, 0x67, 0x36, 0x61, 0x7F, 0x82, 0x5F, 0x48, 0xF6, 0xC0, 0x42, 0xCD, 0x25, 0x89, - 0x4C, 0xC7, 0xBE, 0x97, 0x74, 0x30, 0x6D, 0x1B, 0x70, 0xCA, 0xCF, 0xD7, 0x29, 0x69, 0x8E, 0x7A, - 0x83, 0x4F, 0x33, 0xCA, 0xB4, 0xBF, 0x58, 0xC4, 0xD1, 0x93, 0x30, 0x0A, 0xCF, 0xE5, 0x79, 0x60, - 0x39, 0xB6, 0xF9, 0xD0, 0x2F, 0xA4, 0x60, 0x69, 0x30, 0x9D, 0x29, 0x27, 0x4B, 0x95, 0xE3, 0x0F, - 0x80, 0x69, 0x3E, 0xFE, 0x80, 0xE4, 0x29, 0x9E, 0x75, 0xC5, 0xFA, 0xB8, 0x2B, 0x71, 0xE5, 0xCB, - 0x38, 0x5C, 0x00, 0x29, 0xBA, 0xD6, 0xDF, 0x8D, 0x00, 0x1D, 0x67, 0x48, 0x1C, 0xB8, 0x65, 0x22, - 0x1B, 0x22, 0x29, 0x53, 0xB4, 0x87, 0x33, 0xC2, 0x7C, 0xA2, 0x51, 0x01, 0x53, 0x11, 0xDD, 0x22, - 0x08, 0xE8, 0xA0, 0x30, 0xBD, 0xF5, 0x2E, 0x09, 0xAF, 0xAE, 0x30, 0x2B, 0x8F, 0x63, 0x60, 0xA0, - 0xB0, 0x65, 0x0A, 0x33, 0x70, 0x3E, 0x53, 0x0B, 0x85, 0x85, 0xAE, 0xB6, 0x2C, 0x59, 0x37, 0xAA, - 0xC4, 0xAF, 0x72, 0xA4, 0x92, 0xFA, 0x4E, 0x0D, 0x67, 0x26, 0x84, 0x1D, 0x96, 0x6B, 0x5C, 0x21, - 0xB3, 0x20, 0x08, 0xE8, 0x66, 0x2B, 0x20, 0xC5, 0x89, 0x05, 0x3B, 0x8B, 0xA8, 0x8E, 0x7C, 0x07, - 0xF1, 0x6A, 0xB9, 0x80, 0x51, 0x8E, 0xD7, 0xAD, 0x15, 0x46, 0x2D, 0x40, 0x44, 0x87, 0xC1, 0xAC, - 0x75, 0x11, 0xA6, 0x7C, 0xB9, 0x8C, 0xA3, 0x16, 0xE5, 0x2C, 0x8C, 0x83, 0x2A, 0xD5, 0x74, 0x20, - 0x97, 0xEC, 0xE7, 0x8F, 0x6F, 0xB1, 0x6C, 0x17, 0x79, 0xA0, 0xC0, 0xC8, 0xE6, 0xA7, 0x97, 0x19, - 0x3B, 0xBD, 0x44, 0xC3, 0xC1, 0xE0, 0x13, 0x8D, 0xED, 0x30, 0x43, 0x63, 0xFB, 0x57, 0xE4, 0x7B, - 0x04, 0xBF, 0xAB, 0x1E, 0x4D, 0x7B, 0x83, 0x61, 0x8F, 0x1D, 0x4D, 0x83, 0x0D, 0xD9, 0x32, 0x7C, - 0xCD, 0x26, 0xB5, 0x50, 0x86, 0x65, 0x66, 0xCF, 0xC4, 0xBE, 0x03, 0x3C, 0x8B, 0x65, 0x39, 0x89, - 0xD8, 0x80, 0xA1, 0xED, 0xA5, 0x34, 0x48, 0x3A, 0x04, 0xB6, 0xE6, 0xAB, 0x24, 0x8D, 0x93, 0x1F, - 0x98, 0xB5, 0x80, 0xDD, 0x6B, 0x05, 0xE6, 0xFB, 0x0D, 0x30, 0xEF, 0x01, 0xE6, 0x2D, 0xC1, 0xEF, - 0xAE, 0xE2, 0x24, 0x6B, 0xC4, 0x44, 0xF9, 0x0E, 0x90, 0xAF, 0xC3, 0x14, 0x37, 0x42, 0xD1, 0x44, - 0x80, 0x62, 0x62, 0xD3, 0x00, 0xB6, 0x24, 0x91, 0xD4, 0xE2, 0xA7, 0xD0, 0x8F, 0x49, 0x84, 0xAB, - 0x13, 0x88, 0x06, 0x7C, 0x8E, 0x29, 0x37, 0x60, 0xE0, 0x14, 0xBB, 0x07, 0x66, 0x0A, 0x95, 0xF1, - 0x99, 0x62, 0xE0, 0xBC, 0x36, 0x33, 0x8B, 0xE2, 0x7C, 0xBA, 0x5A, 0x2E, 0x0F, 0x30, 0x4C, 0x0C, - 0x0A, 0x7C, 0xD2, 0xA5, 0x71, 0x0F, 0xC3, 0x0C, 0x1C, 0x10, 0xD0, 0x46, 0xFB, 0x2E, 0xA4, 0x42, - 0x29, 0xBD, 0xE6, 0xD2, 0x42, 0x95, 0x07, 0x15, 0x72, 0xC3, 0xC1, 0x05, 0xAD, 0x73, 0xC0, 0x18, - 0x49, 0xD2, 0xAF, 0x58, 0x9F, 0x2E, 0xF3, 0x92, 0xC2, 0x74, 0x65, 0xEA, 0x06, 0xA6, 0x03, 0x60, - 0xC1, 0x6C, 0x60, 0x8A, 0xB0, 0x8C, 0xB3, 0x65, 0xE2, 0x1D, 0x1B, 0x8C, 0xFA, 0x56, 0x60, 0x8B, - 0xED, 0xBF, 0xB0, 0x59, 0xC8, 0x12, 0xE3, 0x70, 0x21, 0x51, 0xA0, 0x4C, 0xA8, 0x49, 0x94, 0xD3, - 0x58, 0xE3, 0x08, 0x66, 0x5B, 0x39, 0x68, 0xC2, 0x2C, 0xC3, 0x0C, 0x17, 0xCF, 0x0C, 0xD8, 0x31, - 0x4A, 0x95, 0xD4, 0x26, 0x50, 0xE8, 0xC7, 0xEE, 0x77, 0xD3, 0x62, 0x4F, 0xC3, 0x4B, 0x9C, 0x5E, - 0x85, 0x73, 0xDA, 0x18, 0x35, 0xD6, 0x18, 0x06, 0x03, 0x47, 0x18, 0x1A, 0xEE, 0xDB, 0x45, 0xEB, - 0x69, 0xB9, 0x36, 0x34, 0xDF, 0x3C, 0x4E, 0x0A, 0x15, 0xCC, 0x38, 0x62, 0x99, 0x0F, 0x2E, 0xC2, - 0xE8, 0x1C, 0xF3, 0x77, 0x6F, 0xAA, 0x01, 0x5F, 0x06, 0x57, 0x02, 0xAB, 0xCB, 0xCB, 0x2C, 0xF8, - 0x72, 0xB4, 0x51, 0x9C, 0x5C, 0x86, 0xCB, 0x40, 0xED, 0x04, 0xB2, 0x03, 0x48, 0x22, 0xBA, 0xAC, - 0x0F, 0xA5, 0x5D, 0x06, 0x8D, 0x0C, 0xF6, 0xD7, 0x90, 0x83, 0xE5, 0x32, 0xC3, 0x49, 0x14, 0x66, - 0xF8, 0xAE, 0x78, 0xC2, 0x65, 0x86, 0x0C, 0x99, 0xCB, 0x28, 0x6E, 0x16, 0x15, 0x18, 0x41, 0xF4, - 0xBE, 0x98, 0x98, 0x14, 0x03, 0x92, 0xA5, 0x0A, 0x81, 0x31, 0x47, 0x48, 0x61, 0x07, 0x7F, 0x96, - 0x05, 0x7D, 0xB7, 0xC5, 0xBE, 0xD4, 0xDB, 0x0E, 0x9D, 0x0A, 0x76, 0x4A, 0x28, 0x75, 0xE8, 0xAB, - 0x35, 0xD5, 0x8E, 0x32, 0x59, 0xD4, 0xE4, 0xC3, 0x71, 0x85, 0x4B, 0xDD, 0x50, 0xAD, 0xAC, 0xF8, - 0xA4, 0x32, 0xBD, 0x41, 0x65, 0x71, 0x8B, 0xE5, 0x6C, 0x91, 0xB4, 0x15, 0x61, 0x92, 0x5D, 0xE0, - 0xA4, 0xC5, 0x0A, 0xA7, 0x7F, 0x5A, 0x0A, 0xDF, 0xA0, 0x96, 0x2C, 0xA9, 0xDC, 0x5D, 0x59, 0x2C, - 0xE8, 0x36, 0x37, 0xB7, 0x24, 0x67, 0x93, 0x40, 0x58, 0xC6, 0x21, 0x13, 0x1A, 0xD1, 0xD0, 0xAA, - 0xD1, 0x0E, 0x35, 0x18, 0x0D, 0x3E, 0xC9, 0x09, 0x0B, 0xBB, 0x79, 0x2D, 0x7A, 0x91, 0x16, 0x75, - 0x6B, 0x17, 0x69, 0x7C, 0x41, 0xA1, 0xD5, 0x06, 0x08, 0xAF, 0x85, 0x34, 0x71, 0xB0, 0x9B, 0x99, - 0xB8, 0x2B, 0x0F, 0x15, 0xA8, 0x00, 0x85, 0x8B, 0xC5, 0x26, 0x74, 0x0D, 0x45, 0xDE, 0xED, 0x7D, - 0x81, 0x46, 0x8A, 0x06, 0x69, 0x0A, 0x4B, 0x22, 0xF4, 0x6F, 0x85, 0xA0, 0x4D, 0x48, 0x1B, 0x0A, - 0x6E, 0x7C, 0xC8, 0xD4, 0x4C, 0x50, 0x09, 0x92, 0x16, 0xBC, 0x29, 0x73, 0x53, 0xB6, 0x3B, 0xBD, - 0x47, 0xD0, 0x0A, 0x7E, 0x56, 0x2D, 0x78, 0x53, 0xE6, 0xA6, 0x6C, 0x54, 0x1E, 0xED, 0xD1, 0x27, - 0xD9, 0x5F, 0xE4, 0x9E, 0x10, 0x34, 0x81, 0x54, 0xE2, 0xEE, 0x2E, 0x91, 0x7A, 0x42, 0x77, 0xC5, - 0x70, 0x1C, 0xE3, 0xE4, 0x2D, 0x99, 0x17, 0x15, 0xA7, 0x8B, 0x6E, 0x58, 0x3E, 0x31, 0xD7, 0x0A, - 0x69, 0xB9, 0x23, 0xD6, 0xE5, 0x15, 0xB0, 0xCA, 0x48, 0xF7, 0x3D, 0x16, 0x75, 0x97, 0xDC, 0x5A, - 0x86, 0x3C, 0xAD, 0xA0, 0xD8, 0x48, 0xB6, 0x06, 0x1A, 0x60, 0x60, 0xB8, 0xEF, 0x6B, 0xBE, 0x08, - 0xE8, 0x9C, 0xFC, 0x36, 0x4C, 0xF8, 0xEE, 0x50, 0x6C, 0x24, 0x4F, 0x17, 0x78, 0x1E, 0x27, 0x61, - 0x86, 0xD7, 0x6B, 0x1D, 0x18, 0xA5, 0x0C, 0x3C, 0x41, 0x51, 0x10, 0x26, 0xE7, 0xAB, 0x4B, 0x1C, - 0x65, 0xF2, 0x2C, 0x33, 0x0E, 0xA2, 0x1D, 0x6F, 0x2F, 0x1B, 0x33, 0x47, 0xB8, 0x41, 0xBA, 0x27, - 0xAF, 0xF2, 0xCF, 0x71, 0xF6, 0xEC, 0x5D, 0x24, 0x9A, 0xF4, 0x21, 0x4E, 0xE7, 0x09, 0xB9, 0xA2, - 0xCD, 0x01, 0x1B, 0x7C, 0x38, 0x2D, 0x36, 0x62, 0x00, 0x35, 0x82, 0x80, 0xAE, 0x88, 0xE3, 0xB3, - 0xD6, 0x0B, 0x7C, 0xB6, 0xC4, 0xF3, 0xAC, 0xDD, 0x36, 0x04, 0x09, 0x95, 0xB4, 0xAE, 0x20, 0xD3, - 0x8A, 0x83, 0x72, 0x94, 0xA4, 0x97, 0x1D, 0xF9, 0xD2, 0x2D, 0x0F, 0x25, 0x3C, 0x0C, 0x94, 0x1B, - 0xE7, 0x90, 0xEE, 0xFE, 0xC2, 0xED, 0x6D, 0x0B, 0xD4, 0x81, 0xC2, 0x99, 0xD5, 0x6E, 0x9B, 0x71, - 0x60, 0xD2, 0x5A, 0x24, 0x66, 0x6C, 0x8D, 0xA3, 0x5D, 0x1A, 0xA0, 0x68, 0x62, 0x6B, 0xCC, 0x88, - 0xB5, 0xD6, 0xEB, 0x58, 0x9E, 0xF5, 0x46, 0xBB, 0x5E, 0xBB, 0x1D, 0xB7, 0xDB, 0x4D, 0x82, 0x4B, - 0xF3, 0xA1, 0x38, 0xE7, 0xF7, 0x90, 0x92, 0xB9, 0xB0, 0xC3, 0xD6, 0x39, 0x2B, 0x25, 0x41, 0x46, - 0x32, 0xDB, 0x4C, 0xF4, 0x0F, 0xC2, 0x56, 0x9E, 0x4F, 0x3E, 0x7A, 0xED, 0xC3, 0x85, 0x21, 0xC8, - 0xBA, 0x4F, 0x8E, 0x9E, 0x1E, 0x3D, 0x79, 0xF9, 0xE4, 0xF4, 0xC5, 0xB3, 0xAF, 0x8E, 0x95, 0xCF, - 0x83, 0x67, 0x8F, 0x8F, 0xF5, 0x45, 0x51, 0x14, 0x10, 0xD3, 0xED, 0xD1, 0x1D, 0x4E, 0x4C, 0x57, - 0xB4, 0xEE, 0xA8, 0x67, 0xA1, 0x50, 0x7A, 0x64, 0xB8, 0x10, 0x1E, 0x19, 0x4A, 0x28, 0x5C, 0x54, - 0x2A, 0xC2, 0x81, 0x1D, 0xE7, 0x9C, 0xF5, 0x42, 0x69, 0xEB, 0xE0, 0xE2, 0xAE, 0x7E, 0x1B, 0x48, - 0xFA, 0x32, 0xC5, 0xC9, 0xF1, 0x3C, 0x89, 0x97, 0x4B, 0xCD, 0x28, 0x7E, 0x1C, 0xBD, 0xC0, 0x29, - 0xF9, 0x11, 0xAE, 0x79, 0xF8, 0x1D, 0xD6, 0xFB, 0x4A, 0x50, 0xE1, 0x65, 0x76, 0x6D, 0x7D, 0x15, - 0x47, 0xAC, 0xA0, 0xBB, 0xE3, 0x54, 0xE1, 0x65, 0x76, 0x15, 0xE7, 0x3C, 0x5E, 0xA6, 0x01, 0x3B, - 0x33, 0x09, 0xDF, 0x9B, 0xB8, 0x9B, 0x84, 0xEF, 0x9E, 0x5D, 0x31, 0xE5, 0x70, 0x9A, 0xB4, 0x5E, - 0xDB, 0x48, 0xE7, 0xA0, 0x78, 0xA9, 0x1F, 0xBF, 0x6B, 0xCA, 0x47, 0x93, 0xF4, 0x7C, 0x94, 0xD1, - 0x3C, 0x1F, 0x9F, 0xEB, 0x6B, 0x9F, 0xC3, 0x0B, 0x51, 0x80, 0xEB, 0xCC, 0x0B, 0x92, 0xF2, 0x85, - 0x17, 0xCB, 0x52, 0x1A, 0x87, 0xF4, 0xA5, 0x52, 0x9E, 0x00, 0xB3, 0x94, 0x0D, 0x2C, 0xD4, 0x0B, - 0x2B, 0xB4, 0x66, 0x5A, 0xF9, 0x5D, 0x25, 0x43, 0xA9, 0xC1, 0xD8, 0x02, 0xF0, 0x86, 0x22, 0x18, - 0x63, 0x44, 0xF3, 0x8E, 0xB3, 0xDC, 0xD2, 0xCF, 0xD4, 0x15, 0x2C, 0x85, 0x72, 0x46, 0x55, 0x14, - 0xF2, 0x14, 0x3E, 0x98, 0x9E, 0x82, 0x53, 0x3A, 0xE3, 0x63, 0x38, 0x98, 0xAB, 0xD0, 0x49, 0x61, - 0x1C, 0x7D, 0x7E, 0x81, 0x17, 0x0F, 0x96, 0x61, 0xF4, 0x86, 0x6E, 0xCB, 0x50, 0xDA, 0x6E, 0xCB, - 0x13, 0x7C, 0xBE, 0x1C, 0xA4, 0x84, 0xD1, 0xD8, 0x73, 0x9C, 0x3D, 0x3A, 0x37, 0x6D, 0x0B, 0xBC, - 0x24, 0x9F, 0x9D, 0xF3, 0xA8, 0x07, 0x32, 0xEA, 0xF5, 0xF9, 0x7A, 0x6D, 0xA6, 0x01, 0x81, 0x58, - 0x81, 0x50, 0xAD, 0x70, 0xA9, 0xAC, 0x20, 0xB5, 0x50, 0x5A, 0x6C, 0xDE, 0x82, 0x6C, 0x22, 0x8C, - 0x25, 0x13, 0xB6, 0x87, 0xEE, 0x90, 0x2E, 0xAB, 0xCF, 0x49, 0x7C, 0x85, 0xA2, 0x4A, 0xEC, 0x83, - 0x38, 0xCB, 0xE2, 0x4B, 0x61, 0xFE, 0x5A, 0x81, 0xB5, 0x14, 0xAD, 0x2E, 0xB6, 0x71, 0x26, 0xE9, - 0xA3, 0xD5, 0x72, 0x39, 0x89, 0x00, 0x4E, 0xDD, 0x78, 0x6F, 0x3B, 0x7B, 0x78, 0x4F, 0x44, 0x25, - 0x78, 0x7E, 0x3D, 0x5F, 0x62, 0xD3, 0xEA, 0xCE, 0xE3, 0xAB, 0xEB, 0x47, 0x49, 0x7C, 0x69, 0xA6, - 0xD6, 0x58, 0xA4, 0xC2, 0xB9, 0x54, 0x2A, 0x2C, 0x1C, 0x16, 0xF1, 0xFC, 0x90, 0x25, 0xEA, 0x38, - 0xC8, 0x46, 0x45, 0x3A, 0xC2, 0x7B, 0x75, 0x8D, 0xD4, 0x6E, 0x9B, 0x84, 0x9D, 0x23, 0x14, 0xC2, - 0xCC, 0x23, 0xB6, 0x1D, 0x64, 0x5B, 0xD6, 0xD8, 0x14, 0xF5, 0xEC, 0xD4, 0xB6, 0xF2, 0x7A, 0xCD, - 0xC1, 0x3B, 0x1D, 0xE6, 0xA6, 0xB6, 0xB8, 0x98, 0xDB, 0x4E, 0x3A, 0xCE, 0x44, 0x92, 0x75, 0x41, - 0xCE, 0xB2, 0xC3, 0x25, 0x86, 0xB9, 0xC8, 0x4C, 0x3A, 0x0E, 0xC2, 0xDB, 0x0E, 0xDA, 0x76, 0x2C, - 0x24, 0x21, 0x70, 0x66, 0x46, 0x0A, 0xC5, 0x79, 0x7D, 0x71, 0x92, 0x5E, 0x4E, 0x97, 0x55, 0x1A, - 0x1B, 0x98, 0xF8, 0x72, 0x20, 0x8B, 0x4B, 0x20, 0x6D, 0xDF, 0x54, 0xCC, 0xA4, 0xDA, 0x49, 0x2B, - 0x97, 0x42, 0xB8, 0x1C, 0xE0, 0x9A, 0x34, 0x74, 0x56, 0xE4, 0xD9, 0xF9, 0x99, 0x5C, 0xBD, 0x78, - 0xDB, 0xDC, 0x5D, 0x79, 0x87, 0x43, 0xEF, 0xD2, 0x6C, 0x94, 0x24, 0xA1, 0x2C, 0x50, 0xED, 0x10, - 0x96, 0x94, 0x29, 0x9E, 0x67, 0x92, 0x96, 0xB9, 0x2F, 0xCF, 0x6F, 0x79, 0x4A, 0x07, 0xA3, 0x54, - 0xD4, 0xD4, 0xB6, 0x50, 0xB2, 0x25, 0xA9, 0xA3, 0xC5, 0x88, 0x63, 0x66, 0xBD, 0xF6, 0x82, 0x7C, - 0x51, 0xFD, 0xE7, 0xE1, 0x39, 0x4E, 0xE5, 0x2A, 0x44, 0x63, 0x09, 0x77, 0xBC, 0x4C, 0xBB, 0xF9, - 0xB6, 0x23, 0x33, 0x9C, 0xC4, 0x27, 0xF1, 0x95, 0x59, 0x03, 0xBF, 0xAD, 0x30, 0x4D, 0x67, 0xF1, - 0x49, 0xCC, 0x3A, 0x40, 0x5D, 0x2E, 0x2D, 0x13, 0xAD, 0xCA, 0x26, 0x34, 0xE5, 0x83, 0xA7, 0x1A, - 0xE0, 0x89, 0xEA, 0xF1, 0x46, 0x2B, 0x88, 0x4E, 0xC2, 0xF3, 0x20, 0x35, 0xA7, 0x89, 0x69, 0xA3, - 0xA8, 0x7B, 0xC4, 0xC7, 0x64, 0x3E, 0xBD, 0x5A, 0x33, 0x34, 0xAF, 0xCE, 0xB9, 0x73, 0xBA, 0xE3, - 0x1A, 0xF9, 0x9F, 0xB2, 0xC2, 0x3D, 0xB8, 0xA0, 0xFB, 0xAB, 0x4C, 0x60, 0x94, 0xAB, 0xDC, 0x52, - 0x7C, 0xE3, 0xB1, 0xF8, 0xF9, 0x12, 0xBF, 0xC5, 0xCB, 0xC2, 0x41, 0x03, 0xCB, 0x06, 0xC7, 0xE4, - 0xFA, 0x73, 0x5B, 0x96, 0x20, 0x0B, 0x28, 0x43, 0x23, 0x0D, 0x1B, 0x5D, 0x89, 0x9E, 0x3F, 0xA6, - 0x61, 0xD9, 0xF6, 0x3C, 0x89, 0x4F, 0x0C, 0x02, 0x9D, 0x8E, 0x87, 0xAB, 0x87, 0x9E, 0x73, 0xE2, - 0xD5, 0x53, 0x51, 0x05, 0x44, 0x4C, 0x28, 0x1C, 0x23, 0x28, 0xA8, 0x9A, 0x3A, 0x56, 0xD8, 0x3C, - 0x38, 0x83, 0x9E, 0xF7, 0xE7, 0x8B, 0xD9, 0x3F, 0x23, 0x8B, 0xD9, 0x83, 0x38, 0xC1, 0x4F, 0xE2, - 0x55, 0x8A, 0xF5, 0x9E, 0x50, 0xBB, 0x62, 0x65, 0xEB, 0xD4, 0x50, 0x18, 0x5A, 0xBD, 0x08, 0x6E, - 0x9E, 0x3E, 0x7B, 0x7A, 0x38, 0xBE, 0x81, 0xC5, 0x59, 0x3A, 0xB6, 0x51, 0x82, 0xD3, 0x2C, 0x21, - 0xF3, 0x0C, 0x34, 0xA3, 0xB7, 0x9C, 0x1C, 0x7D, 0xDF, 0xB1, 0x65, 0xB2, 0x53, 0x24, 0xE3, 0x60, - 0xD7, 0x07, 0x7B, 0x2F, 0xAF, 0x57, 0x59, 0x16, 0x47, 0xED, 0x36, 0xF8, 0x2D, 0xE8, 0x32, 0x17, - 0x3A, 0xED, 0xB6, 0x89, 0xBB, 0xF3, 0x2C, 0x59, 0x82, 0x22, 0x54, 0x37, 0x5C, 0x32, 0x8D, 0x28, - 0x36, 0x1F, 0xD1, 0xE0, 0x96, 0x6D, 0xE5, 0xE8, 0x7B, 0x27, 0xAE, 0xAD, 0xE0, 0x1E, 0x69, 0xC8, - 0x3D, 0x77, 0xAB, 0xC0, 0x97, 0xA3, 0x87, 0x2F, 0xF6, 0x3F, 0x97, 0xA0, 0xAE, 0xD7, 0x0C, 0xBA, - 0x5E, 0x7B, 0x0A, 0x59, 0x39, 0xDA, 0x7F, 0xFA, 0x03, 0x99, 0xCF, 0xD3, 0xE9, 0xDF, 0xB2, 0xF3, - 0xBC, 0x70, 0x08, 0x32, 0x57, 0xFC, 0xCF, 0x05, 0x9C, 0xFC, 0x3D, 0xA7, 0x3F, 0xB6, 0xAD, 0xB5, - 0xC9, 0x29, 0xDF, 0xF3, 0xF9, 0x57, 0xB8, 0xCC, 0xF6, 0x86, 0x63, 0x5B, 0x0A, 0x88, 0x1F, 0x14, - 0x45, 0xEE, 0x99, 0x64, 0x1D, 0xF4, 0x7D, 0x44, 0xD6, 0x92, 0x26, 0x3A, 0x9F, 0xAF, 0x03, 0xAF, - 0x2D, 0x40, 0x90, 0xDF, 0x2E, 0xF8, 0xC6, 0xC0, 0x2D, 0x34, 0x2C, 0xC5, 0x81, 0x69, 0x3D, 0xCF, - 0x55, 0xB8, 0xBA, 0x47, 0x91, 0xB8, 0x63, 0x5B, 0xAB, 0x6D, 0x46, 0x27, 0xE7, 0x75, 0xE0, 0x59, - 0x16, 0x22, 0xD2, 0x43, 0x78, 0x8D, 0x6D, 0x1A, 0xB4, 0x08, 0x6E, 0x1E, 0x1E, 0x3E, 0xDA, 0x7F, - 0xF9, 0xF8, 0x84, 0xD6, 0xBD, 0x30, 0x6C, 0x43, 0xEB, 0xBD, 0xE5, 0x58, 0x1D, 0xCF, 0x45, 0x98, - 0x2E, 0xF3, 0x58, 0x20, 0x89, 0xDF, 0x75, 0x3C, 0x57, 0x5E, 0x46, 0x83, 0xDD, 0x1D, 0xB7, 0xD7, - 0x5B, 0xAF, 0xB3, 0xA9, 0x23, 0x43, 0x2E, 0x84, 0xF6, 0x0C, 0x63, 0xFC, 0xF5, 0x5F, 0x9C, 0x3E, - 0xF9, 0xEC, 0x66, 0x09, 0xF6, 0x79, 0xAC, 0x9C, 0x85, 0x1C, 0x19, 0x72, 0x67, 0x56, 0xFE, 0x75, - 0x8E, 0x8E, 0x3F, 0x7F, 0xA1, 0x15, 0x6D, 0x6B, 0x12, 0xA3, 0x4A, 0xD3, 0x9E, 0x71, 0x69, 0x8C, - 0x8D, 0x27, 0x86, 0x70, 0x58, 0xF1, 0x17, 0xA7, 0x3B, 0x9F, 0xDD, 0x00, 0xA1, 0xB6, 0x95, 0x4F, - 0x3E, 0xBB, 0x01, 0x42, 0x59, 0x20, 0x89, 0xDF, 0xE5, 0x9F, 0xDD, 0x64, 0x1C, 0xFF, 0xE9, 0xF3, - 0xA3, 0xEF, 0x1F, 0x3E, 0x3E, 0xFE, 0xCE, 0x8A, 0x79, 0xCF, 0xFE, 0x5C, 0xF3, 0x22, 0x72, 0x58, - 0x38, 0x9F, 0x96, 0xB6, 0x6D, 0x61, 0xE3, 0xB6, 0x8D, 0x0A, 0x94, 0x6E, 0x8B, 0xEE, 0xB5, 0x36, - 0x09, 0x62, 0xE5, 0xD4, 0x58, 0x6E, 0x46, 0xA5, 0xC9, 0xB4, 0x38, 0x8B, 0x61, 0x43, 0x51, 0xD8, - 0x57, 0x8B, 0xE6, 0xF1, 0x82, 0x44, 0xE7, 0x4A, 0x14, 0xDB, 0x89, 0x3C, 0xE7, 0xB0, 0x85, 0x76, - 0x21, 0x8B, 0x3F, 0xE4, 0x19, 0x8A, 0xF8, 0x65, 0x98, 0x66, 0xB0, 0x67, 0x0B, 0xC0, 0x24, 0xB0, - 0x58, 0xC7, 0x08, 0x04, 0xEA, 0x99, 0x7B, 0x69, 0x9F, 0x54, 0xBB, 0xD3, 0xAB, 0xCB, 0x57, 0x41, - 0xC7, 0x76, 0x7E, 0x70, 0xB5, 0xCA, 0x97, 0xA9, 0xAD, 0xF8, 0xAC, 0xC5, 0x07, 0xBA, 0x37, 0xF8, - 0x3A, 0x35, 0x2F, 0x2C, 0x76, 0xCB, 0x1C, 0x2E, 0x16, 0x22, 0xAB, 0x89, 0xD1, 0x05, 0xA8, 0xA5, - 0x6D, 0xC8, 0xB6, 0x28, 0xB2, 0x89, 0x9A, 0x9A, 0x18, 0x2D, 0x20, 0x1B, 0xAF, 0x02, 0x4C, 0xE3, - 0xB9, 0x8E, 0x37, 0x2B, 0x5E, 0xCE, 0x72, 0x16, 0xC3, 0xCC, 0x9A, 0xEB, 0x68, 0x0A, 0x0B, 0x3D, - 0x82, 0xEB, 0x0C, 0xAA, 0x38, 0xAB, 0x92, 0x28, 0xCB, 0x67, 0xCE, 0x5A, 0x2A, 0xCB, 0xC0, 0x47, - 0x68, 0x60, 0x62, 0xBA, 0x2F, 0x0E, 0xF5, 0x79, 0x36, 0xC5, 0x50, 0x86, 0xA4, 0xA8, 0x0E, 0xD5, - 0x8C, 0x71, 0x32, 0x55, 0x0E, 0xBB, 0x8A, 0x6A, 0xB1, 0x5B, 0xAC, 0x6A, 0xC5, 0xAA, 0x46, 0xB2, - 0x56, 0xD1, 0x9B, 0x28, 0x7E, 0x17, 0xB5, 0x04, 0x54, 0xCB, 0xF8, 0xEC, 0x06, 0xE7, 0xC6, 0xD7, - 0xBA, 0xEA, 0xB1, 0x94, 0x29, 0xDC, 0x20, 0x25, 0xCA, 0x9D, 0x85, 0x56, 0x20, 0x27, 0x52, 0xBD, - 0xBF, 0x90, 0x6C, 0xAD, 0xE5, 0x94, 0x48, 0x55, 0xAA, 0x55, 0xB4, 0x83, 0x5A, 0x2D, 0xB5, 0x25, - 0x9A, 0xAB, 0x25, 0xA0, 0xEA, 0xAB, 0x25, 0xBB, 0x44, 0x49, 0x61, 0xAD, 0xDC, 0x91, 0xE8, 0xB4, - 0xC8, 0x3B, 0x4D, 0xB9, 0x2F, 0xF1, 0x61, 0xB4, 0xBE, 0x4B, 0xE5, 0x59, 0x42, 0xCE, 0xCF, 0x71, - 0x52, 0x34, 0xB7, 0x54, 0x3B, 0x98, 0xC7, 0x4B, 0xB8, 0x62, 0xA4, 0x81, 0xDD, 0xA0, 0x66, 0x3C, - 0xE0, 0x87, 0x1F, 0x30, 0xA8, 0x31, 0xC8, 0x24, 0x7E, 0x57, 0x0F, 0x49, 0xB7, 0x0E, 0x85, 0xF3, - 0x53, 0x72, 0x66, 0xAA, 0x53, 0x50, 0xBB, 0xAD, 0xCD, 0x1B, 0x1A, 0x9C, 0x57, 0x82, 0xDB, 0x6A, - 0x80, 0xD3, 0x27, 0x77, 0x53, 0xC5, 0xB7, 0x5E, 0x7B, 0x2A, 0x76, 0x2D, 0x1B, 0x9B, 0x42, 0x3A, - 0x7C, 0x06, 0xE9, 0xE8, 0x13, 0x98, 0x58, 0x19, 0x49, 0x8E, 0xC9, 0x47, 0xAD, 0x3F, 0xBF, 0x0A, - 0x97, 0xAC, 0x6F, 0x98, 0x25, 0x10, 0x84, 0x91, 0x51, 0x0C, 0xEC, 0x86, 0xBC, 0x9E, 0xD2, 0x1B, - 0x45, 0x27, 0xA2, 0xD2, 0x0B, 0xEA, 0x3B, 0x93, 0x58, 0x0B, 0x98, 0x58, 0xC9, 0xAE, 0xDF, 0xBC, - 0x17, 0x12, 0x57, 0x57, 0xEA, 0xCC, 0x2C, 0x1C, 0xF9, 0x65, 0xED, 0xB6, 0x29, 0x25, 0xA3, 0x81, - 0xCA, 0xBD, 0xCA, 0x68, 0xDF, 0xE5, 0xD2, 0xF2, 0x80, 0x44, 0x61, 0x72, 0xCD, 0xC4, 0x45, 0xDE, - 0x24, 0xD7, 0xC0, 0x3D, 0x0C, 0xB3, 0x90, 0x43, 0xD1, 0x49, 0xCA, 0xAA, 0x88, 0x20, 0x9D, 0xBB, - 0x72, 0xFC, 0xFE, 0x6A, 0x19, 0x92, 0x88, 0x33, 0x54, 0xAA, 0x4E, 0xDC, 0x2C, 0xE2, 0x77, 0xD1, - 0x78, 0x6B, 0xCB, 0x74, 0xDA, 0xD8, 0x42, 0xAB, 0x2B, 0x1A, 0x74, 0x69, 0x70, 0x91, 0x84, 0xE7, - 0xF4, 0xC3, 0xA7, 0x1F, 0x97, 0xF1, 0x5B, 0x4C, 0x3F, 0x86, 0xF4, 0xE3, 0xDD, 0x05, 0xC6, 0x4B, - 0xC8, 0xD2, 0x6F, 0xD3, 0xE5, 0xA9, 0xD6, 0x52, 0xC5, 0x53, 0x20, 0xC2, 0x25, 0xFC, 0x3D, 0x1D, - 0xC8, 0xBA, 0xEF, 0x4B, 0x12, 0x71, 0x0D, 0xB1, 0xD7, 0x32, 0x36, 0x97, 0x9A, 0x81, 0x54, 0x58, - 0x20, 0x71, 0x1E, 0x2F, 0x4B, 0x99, 0x92, 0xF8, 0x1D, 0xA4, 0x24, 0xF1, 0xBB, 0x22, 0xA3, 0x54, - 0x24, 0x66, 0x72, 0x09, 0x5E, 0xBD, 0x84, 0x88, 0x0A, 0x21, 0x83, 0x48, 0x21, 0x6F, 0x7C, 0x15, - 0x0A, 0x45, 0x64, 0xC9, 0x12, 0xA0, 0x96, 0x19, 0x03, 0x59, 0x66, 0xF4, 0x93, 0x2D, 0x49, 0x69, - 0x04, 0x84, 0xF2, 0x7C, 0x72, 0xAA, 0xEC, 0x64, 0xB5, 0x3D, 0xAB, 0x85, 0x12, 0xD3, 0xA1, 0xB1, - 0x07, 0x45, 0xC3, 0x58, 0x33, 0x74, 0x5A, 0xBB, 0x06, 0x3F, 0xCD, 0x51, 0x7F, 0x34, 0xE8, 0xFD, - 0xF9, 0x26, 0xEC, 0xCF, 0xD0, 0x26, 0xEC, 0x83, 0xF6, 0x5F, 0x8E, 0xEF, 0x8D, 0x8A, 0x1B, 0x03, - 0x34, 0x17, 0xCD, 0x77, 0x96, 0x60, 0xFC, 0x23, 0x6C, 0xDE, 0x90, 0x28, 0xC5, 0x49, 0xF6, 0x24, - 0x5E, 0x60, 0xB0, 0x5C, 0x81, 0x96, 0x65, 0x80, 0xF0, 0xEA, 0x6A, 0x49, 0xE6, 0x60, 0x72, 0xE9, - 0x00, 0xF4, 0x9A, 0xBE, 0xC4, 0xD7, 0xE9, 0x78, 0xCB, 0x41, 0x4A, 0xC2, 0x97, 0xF8, 0xFA, 0x2A, - 0x84, 0x37, 0xB8, 0xAF, 0x93, 0x70, 0xFE, 0x06, 0x67, 0x78, 0xF1, 0x3C, 0x4C, 0x33, 0xCC, 0xD1, - 0xA2, 0x38, 0x21, 0xE7, 0x24, 0xA2, 0x21, 0x6E, 0xA3, 0xF2, 0xAB, 0x24, 0xBC, 0x0A, 0xC1, 0xD5, - 0x1E, 0x8D, 0x4C, 0x71, 0xB4, 0x78, 0x14, 0xCF, 0x57, 0x80, 0xF6, 0x9D, 0x92, 0x64, 0xE7, 0xCC, - 0xA5, 0xC3, 0xE2, 0xCE, 0x37, 0x18, 0x4C, 0xFA, 0xEF, 0xB2, 0x18, 0x5E, 0xC6, 0xE7, 0xE5, 0xB5, - 0x70, 0xAC, 0x1D, 0x28, 0x09, 0xCB, 0x5C, 0x24, 0x65, 0xF5, 0x3E, 0x62, 0xC6, 0xCF, 0xC8, 0x8F, - 0x94, 0x97, 0xA4, 0x22, 0xED, 0x0B, 0xB2, 0x58, 0xE0, 0x48, 0xBD, 0x20, 0x01, 0x3F, 0x9B, 0x77, - 0x5E, 0xE0, 0x16, 0xD0, 0x3C, 0x6B, 0xE9, 0x6A, 0xA4, 0xF0, 0xD6, 0x7B, 0x67, 0x94, 0xA5, 0x2C, - 0x2A, 0x92, 0x12, 0x72, 0x36, 0x2B, 0xDC, 0x1D, 0xB3, 0x0A, 0x2F, 0xB3, 0x97, 0x70, 0xBE, 0xC0, - 0x3F, 0xBF, 0xC2, 0x69, 0x76, 0xAC, 0x1D, 0x1F, 0xDE, 0xBD, 0x88, 0x0D, 0xD9, 0x9B, 0x90, 0xAB, - 0x04, 0x5C, 0xC6, 0x0B, 0x9C, 0x06, 0xA6, 0x8D, 0x42, 0x76, 0xE2, 0x6C, 0x99, 0x73, 0x8E, 0x7A, - 0x81, 0xE7, 0xCF, 0x13, 0xD0, 0x92, 0x79, 0x52, 0x81, 0x59, 0x96, 0x2E, 0x42, 0x3E, 0x1A, 0x4B, - 0x65, 0x16, 0x15, 0x77, 0x24, 0x52, 0x23, 0x46, 0x97, 0x34, 0xF5, 0x82, 0x69, 0x41, 0x40, 0xAA, - 0x8F, 0xB3, 0x05, 0x89, 0x74, 0xF5, 0x61, 0x52, 0xBB, 0x42, 0xE3, 0x67, 0xDC, 0x72, 0x8D, 0xD3, - 0x8C, 0x99, 0x9D, 0xA5, 0x3E, 0x2B, 0xC4, 0xA0, 0xDD, 0xE6, 0xC7, 0xEC, 0x5B, 0x41, 0x40, 0xC4, - 0xB1, 0xF3, 0x66, 0x1E, 0x33, 0x67, 0xB0, 0xA8, 0x28, 0x4D, 0x11, 0x2A, 0x91, 0x56, 0xEA, 0x5D, - 0xDD, 0x05, 0x7E, 0xBD, 0x3A, 0x37, 0xBF, 0x4E, 0x99, 0xFF, 0x59, 0xE6, 0x09, 0x9B, 0xAF, 0x99, - 0x99, 0x31, 0x67, 0x0C, 0xF7, 0x1A, 0x99, 0x69, 0x18, 0xDC, 0x61, 0x0C, 0xA6, 0x71, 0x9A, 0xC1, - 0x50, 0x4B, 0x31, 0x52, 0xCD, 0xFA, 0x07, 0x94, 0x86, 0x25, 0xAF, 0xD5, 0x95, 0x4D, 0x61, 0x51, - 0xF1, 0x4E, 0x5C, 0x96, 0x2F, 0x09, 0x9B, 0x69, 0x7E, 0x0D, 0xD8, 0x3F, 0x8D, 0x6A, 0xDE, 0x4D, - 0x38, 0xDD, 0x74, 0xF8, 0x5F, 0xDC, 0xBA, 0x02, 0x78, 0x2C, 0x29, 0xA2, 0x51, 0x6E, 0xED, 0xA1, - 0xF7, 0xA2, 0x3C, 0x2D, 0x2C, 0x72, 0x34, 0xB2, 0x07, 0xFE, 0x27, 0xBA, 0xBA, 0x64, 0x53, 0x2E, - 0x89, 0xA3, 0xDA, 0xD9, 0x06, 0x94, 0xF6, 0xEC, 0x5E, 0x4F, 0x51, 0xDA, 0x03, 0x1F, 0x4A, 0x30, - 0xC7, 0x80, 0x0B, 0x25, 0xC7, 0xEE, 0x5B, 0xDC, 0x7C, 0x91, 0x8D, 0x2E, 0x02, 0xBB, 0x62, 0x71, - 0x3F, 0x6A, 0x1A, 0xC3, 0xCB, 0xC3, 0xF7, 0x42, 0x92, 0xC2, 0x5E, 0xE2, 0xC5, 0xDD, 0x63, 0xB0, - 0x5A, 0xFD, 0x98, 0xA4, 0x19, 0x70, 0x9D, 0xAD, 0x4D, 0xF0, 0x1E, 0xA3, 0x70, 0x8C, 0xBB, 0x97, - 0x61, 0xF2, 0x86, 0x2B, 0xB2, 0xAA, 0x62, 0x23, 0xF1, 0xBC, 0xE0, 0x23, 0x50, 0xAD, 0xB3, 0xFF, - 0xA4, 0x61, 0x84, 0x6E, 0xCC, 0xDD, 0x80, 0xBA, 0x34, 0x20, 0xAA, 0x20, 0x74, 0xED, 0xFB, 0x91, - 0x45, 0x2B, 0x59, 0xEB, 0x90, 0xAA, 0x85, 0xAA, 0xF6, 0xE6, 0xA3, 0x5A, 0x7B, 0xF3, 0xA5, 0x33, - 0x8F, 0x0A, 0xBB, 0xBB, 0xEC, 0xF5, 0x8C, 0xC9, 0xCF, 0x3F, 0x6A, 0x0B, 0xE4, 0xF2, 0xAC, 0x1F, - 0x84, 0x08, 0xB5, 0x42, 0x05, 0x57, 0x79, 0x4F, 0x5E, 0x57, 0x4C, 0xA1, 0x12, 0x26, 0x13, 0xE5, - 0xAE, 0x96, 0xB7, 0x69, 0x55, 0xA7, 0x5E, 0x7D, 0xF5, 0xB8, 0x94, 0x2A, 0xCB, 0x8A, 0xFB, 0x5C, - 0x9E, 0xB3, 0xD0, 0xCF, 0x67, 0xEA, 0x91, 0xC5, 0xBB, 0x02, 0xCB, 0x9A, 0x64, 0xE5, 0xE4, 0x9B, - 0xAC, 0x78, 0x15, 0xAC, 0x50, 0xCA, 0x4C, 0x6E, 0x80, 0xFF, 0xDE, 0x5B, 0x58, 0x92, 0x59, 0x48, - 0x79, 0xBA, 0x40, 0x59, 0x52, 0x15, 0xE7, 0x2E, 0x5B, 0x7C, 0x99, 0xD9, 0x66, 0x21, 0x15, 0x08, - 0x8B, 0x77, 0x92, 0x62, 0x9A, 0xBA, 0x7B, 0x03, 0x2A, 0xB4, 0x4C, 0xAA, 0x60, 0x60, 0x6C, 0xC4, - 0xB4, 0xF2, 0x7B, 0xE7, 0x38, 0x2B, 0x28, 0x48, 0xF7, 0xA5, 0xEE, 0xB2, 0xDC, 0x52, 0xA0, 0x04, - 0xB1, 0x67, 0x0C, 0x71, 0x60, 0xA3, 0x30, 0xB0, 0x95, 0x73, 0xB3, 0x8B, 0x7A, 0x12, 0xCE, 0x71, - 0xF6, 0x25, 0xBE, 0x3E, 0xCA, 0x70, 0x12, 0xC2, 0xEE, 0xC0, 0xB2, 0x62, 0x38, 0xC1, 0xD8, 0x0A, - 0x02, 0x33, 0x0D, 0x2E, 0xBA, 0x7C, 0x90, 0xEE, 0xBE, 0xB7, 0xDA, 0x6D, 0xD6, 0x83, 0xB7, 0x60, - 0x9F, 0x31, 0xA6, 0xF8, 0xE3, 0x8E, 0x29, 0x60, 0x13, 0x05, 0xF6, 0x1D, 0x59, 0x64, 0x17, 0x2A, - 0x7C, 0xB2, 0x97, 0x8C, 0x1D, 0x0B, 0xE1, 0xDD, 0x20, 0x6E, 0xB7, 0xF1, 0x4E, 0xD8, 0x6E, 0x9B, - 0x5B, 0x64, 0xBD, 0x96, 0x99, 0x23, 0x25, 0xF3, 0x32, 0xBC, 0xC6, 0x89, 0x9A, 0x39, 0xDA, 0x8B, - 0xC6, 0xC6, 0x6B, 0x98, 0xE0, 0x0C, 0x0B, 0x4C, 0x0F, 0xB4, 0xDB, 0xE6, 0x35, 0xC1, 0xCB, 0x45, - 0xEB, 0xC2, 0xCA, 0xCF, 0xE2, 0xE4, 0x30, 0x9C, 0x5F, 0x14, 0x6C, 0x51, 0xB9, 0x22, 0xDD, 0xB7, - 0x69, 0x55, 0xE6, 0x59, 0x1E, 0x5C, 0x7F, 0x89, 0xE9, 0x30, 0x6B, 0x66, 0xC1, 0xAE, 0xD8, 0x61, - 0xA1, 0x78, 0x12, 0x06, 0x45, 0x95, 0xB2, 0xFA, 0xEA, 0xD3, 0xEA, 0xD0, 0x51, 0x33, 0xEC, 0x28, - 0x35, 0xC8, 0x9A, 0xAB, 0x4F, 0x6B, 0xC0, 0xAA, 0x1F, 0xD2, 0xEA, 0x5F, 0x94, 0xAB, 0x1F, 0x2B, - 0x99, 0x2B, 0xD5, 0x8F, 0xF7, 0xE2, 0x4A, 0xF5, 0xE1, 0xB6, 0xD5, 0xB2, 0x4A, 0xEF, 0x78, 0xFE, - 0x48, 0xC6, 0x8A, 0xBC, 0x6E, 0xB2, 0x99, 0xF3, 0xE9, 0x62, 0x79, 0xFB, 0x74, 0x51, 0x56, 0x5A, - 0xE2, 0xF5, 0x14, 0xEB, 0x7C, 0xF5, 0x39, 0x8B, 0x53, 0x2C, 0x2F, 0xA3, 0x05, 0x4E, 0xF8, 0x38, - 0x7B, 0xF7, 0x81, 0x98, 0x65, 0x0B, 0xEA, 0x90, 0x94, 0x47, 0x7B, 0xFE, 0x9C, 0xE8, 0xEE, 0x63, - 0xBC, 0x9A, 0xA1, 0x40, 0xA0, 0xA1, 0xE5, 0x3A, 0x2D, 0xE7, 0xEA, 0x99, 0x3A, 0x8B, 0x7B, 0xA4, - 0xC6, 0xB1, 0xF1, 0x2E, 0x10, 0x43, 0xA6, 0xC6, 0x95, 0x6E, 0xFC, 0x96, 0x72, 0x18, 0xBF, 0x7B, - 0xB1, 0x5A, 0xE2, 0x84, 0xAF, 0x25, 0xDA, 0xED, 0xAD, 0x5B, 0x61, 0xBA, 0xC2, 0x6E, 0xA2, 0x18, - 0x16, 0xEF, 0x04, 0x1C, 0x18, 0x67, 0xAB, 0xE5, 0x92, 0x6B, 0x5F, 0xBF, 0x0E, 0xE7, 0x6F, 0xCE, - 0x61, 0x63, 0x07, 0xAE, 0xE7, 0x5F, 0x7C, 0xFE, 0x40, 0x79, 0x2A, 0xC2, 0x8E, 0x17, 0xF4, 0x7A, - 0x96, 0x8B, 0x2A, 0x21, 0xD8, 0x2B, 0x71, 0x25, 0xED, 0xCE, 0xD3, 0xB4, 0x9B, 0xC5, 0x90, 0xB8, - 0x31, 0xA7, 0x3C, 0xF9, 0x12, 0x59, 0x59, 0x5F, 0x28, 0xE9, 0x0E, 0x9D, 0x03, 0xD5, 0x67, 0x71, - 0x82, 0x3F, 0x80, 0xEA, 0x47, 0x15, 0xAA, 0x4B, 0x08, 0xF6, 0x4A, 0xED, 0xB6, 0x81, 0xEA, 0x52, - 0x4E, 0x9D, 0xEA, 0x47, 0xF5, 0x54, 0x3F, 0x3A, 0xAF, 0x58, 0x75, 0x2A, 0x84, 0x89, 0xAF, 0xD0, - 0xA1, 0xBB, 0x28, 0xCF, 0xEA, 0xF2, 0x1C, 0xF9, 0x9E, 0x3F, 0xFC, 0xB4, 0x05, 0xE3, 0x11, 0x3C, - 0x0B, 0xCB, 0x88, 0xD6, 0x8D, 0xB3, 0x2E, 0x0F, 0x1D, 0x30, 0x4B, 0x68, 0x54, 0x24, 0x2A, 0xEB, - 0x48, 0x76, 0x6A, 0x01, 0xEB, 0x48, 0xCF, 0xF7, 0x84, 0x6B, 0xA6, 0x48, 0xEB, 0xE4, 0xDD, 0x6E, - 0xB7, 0x30, 0x77, 0x1E, 0x65, 0x09, 0xC1, 0x6C, 0x2D, 0xF8, 0x24, 0xBC, 0x2A, 0x66, 0xA0, 0x69, - 0x86, 0xC8, 0x2C, 0x3E, 0x6B, 0x71, 0x9B, 0x50, 0xF0, 0xFA, 0x1E, 0x11, 0x30, 0x9C, 0x5E, 0xE7, - 0x26, 0x80, 0xE3, 0x11, 0x2F, 0x9D, 0xB4, 0xD5, 0x89, 0x48, 0x13, 0x59, 0x11, 0x11, 0xF3, 0x00, - 0x1D, 0x6F, 0x2A, 0x25, 0xEA, 0x99, 0xF8, 0x5F, 0x3A, 0xEB, 0x32, 0x02, 0x2E, 0xC2, 0xB4, 0xF2, - 0xB2, 0x4C, 0x00, 0xB3, 0xB4, 0x9C, 0x11, 0x51, 0x0F, 0xC2, 0xD2, 0xE8, 0x40, 0x59, 0xE5, 0x66, - 0xD4, 0xC4, 0xFA, 0x0D, 0xA6, 0xD9, 0x18, 0x04, 0x63, 0xA0, 0x30, 0xFC, 0x22, 0x22, 0xA1, 0xC6, - 0x69, 0xF7, 0xA8, 0x0E, 0x27, 0xD3, 0x5B, 0xCC, 0x0B, 0x9D, 0x17, 0xF5, 0xFA, 0x4A, 0x43, 0x00, - 0xCA, 0xE5, 0xE7, 0x0A, 0x5C, 0xA9, 0x66, 0x12, 0x98, 0x57, 0x8D, 0x19, 0x1A, 0x3B, 0xE2, 0x2F, - 0x0B, 0x4D, 0x8C, 0xBA, 0xDD, 0xAE, 0xD2, 0x5E, 0x60, 0xDC, 0xA5, 0x40, 0xF7, 0x10, 0x5F, 0xD1, - 0xA1, 0x37, 0x9A, 0x13, 0x9C, 0x5A, 0x26, 0xB6, 0xBA, 0x69, 0x9C, 0x64, 0xD2, 0xCD, 0x28, 0x66, - 0xD6, 0xD5, 0xB6, 0x33, 0xF6, 0xD7, 0xB2, 0x50, 0x2A, 0x2C, 0x1E, 0xF0, 0xA5, 0x22, 0x9D, 0xBF, - 0x48, 0xE5, 0x51, 0xB2, 0x4A, 0x52, 0xD6, 0x25, 0x0B, 0x58, 0x48, 0x6E, 0x91, 0xEA, 0x05, 0xD0, - 0x54, 0xA7, 0x76, 0xD6, 0xFA, 0xEC, 0x06, 0x77, 0xA3, 0xF0, 0x12, 0xE7, 0xAD, 0x05, 0x50, 0x96, - 0xB6, 0xE2, 0xA8, 0xF5, 0xF2, 0xE9, 0x97, 0x4F, 0x9F, 0x7D, 0xF5, 0xB4, 0xC5, 0xF1, 0xB6, 0x3E, - 0xBB, 0xA1, 0x48, 0xF3, 0xEE, 0xD7, 0xD6, 0x44, 0xBE, 0x3B, 0xCD, 0xE5, 0xD1, 0x9D, 0x30, 0x1E, - 0x60, 0xEF, 0x91, 0xA9, 0x3D, 0x63, 0x94, 0x8F, 0x33, 0xF9, 0x16, 0xF4, 0xCC, 0x14, 0x61, 0x3A, - 0xD9, 0xDF, 0x81, 0xA4, 0x47, 0x24, 0xA1, 0xBD, 0x8B, 0x97, 0xBD, 0x10, 0x0C, 0xBB, 0xA6, 0x55, - 0x2F, 0xC8, 0x0D, 0xB3, 0x96, 0x18, 0xA9, 0x5B, 0x9F, 0xDD, 0x44, 0x1D, 0x27, 0x6F, 0xCD, 0xE3, - 0xE8, 0x6C, 0x49, 0xE6, 0x59, 0xDA, 0x7A, 0x47, 0xB2, 0x0B, 0xA0, 0x9A, 0xBF, 0x64, 0x6B, 0x71, - 0x93, 0x23, 0xF2, 0x88, 0xB8, 0xF0, 0x6D, 0x43, 0x29, 0xC1, 0xB4, 0x8F, 0x4E, 0x69, 0xBB, 0xD1, - 0xC6, 0x4B, 0x67, 0xEC, 0x71, 0xC1, 0xB0, 0xDF, 0xFF, 0xF3, 0xA3, 0xE9, 0x3F, 0x23, 0x47, 0xD3, - 0xC5, 0x61, 0x45, 0xF5, 0x64, 0x5A, 0x9E, 0x0B, 0xB0, 0xC1, 0x3E, 0x0C, 0x6E, 0xE0, 0x84, 0x65, - 0x1C, 0xD3, 0x5C, 0xA0, 0xC5, 0x76, 0x18, 0xAD, 0x2E, 0xBB, 0x0F, 0x0F, 0x1F, 0xBC, 0xFC, 0x1C, - 0x91, 0xE8, 0x2C, 0x2E, 0xA7, 0x1C, 0x3D, 0x7D, 0xF4, 0x0C, 0xBD, 0x0B, 0x93, 0xA8, 0x9C, 0xF0, - 0xD5, 0xFE, 0x8B, 0xA7, 0x08, 0x4C, 0x3C, 0x97, 0x53, 0x0E, 0x5F, 0xBC, 0x78, 0xF6, 0x02, 0xC5, - 0x67, 0x67, 0xE5, 0x84, 0x67, 0x8F, 0x1E, 0x31, 0x0D, 0x8B, 0x8B, 0xD2, 0xB1, 0xF2, 0x9D, 0xD7, - 0x98, 0xE5, 0x93, 0x62, 0xBE, 0xD6, 0x5C, 0xF2, 0x52, 0x82, 0x6A, 0x81, 0x3C, 0xDF, 0xEA, 0x6A, - 0x11, 0x66, 0x58, 0x24, 0x9A, 0x65, 0xCF, 0x70, 0xB5, 0xC7, 0x56, 0x71, 0x74, 0x7C, 0x85, 0xE7, - 0xE4, 0x8C, 0xCC, 0xD9, 0xF2, 0x8A, 0x5D, 0x8B, 0x9B, 0x86, 0x28, 0xCD, 0x40, 0xCA, 0x7B, 0xBF, - 0x72, 0x01, 0x74, 0x27, 0x5E, 0x89, 0xBC, 0xD1, 0xA9, 0x0D, 0xA7, 0xB7, 0x1D, 0x97, 0x09, 0xD0, - 0x59, 0x7E, 0x8A, 0xDF, 0x86, 0xCB, 0xC7, 0xE1, 0x8F, 0xAE, 0x59, 0x52, 0xB8, 0x2C, 0xAC, 0x51, - 0x94, 0x5D, 0x88, 0xF1, 0xC1, 0x2B, 0xEB, 0x74, 0xAC, 0x9A, 0x3E, 0x85, 0xA7, 0xD9, 0x4C, 0x18, - 0x75, 0xA0, 0x3F, 0x74, 0x8F, 0x7C, 0xBA, 0x8C, 0xCF, 0x75, 0x6B, 0x5F, 0x0D, 0xA5, 0x11, 0xBA, - 0xB9, 0x06, 0x63, 0x31, 0xB4, 0x95, 0xE2, 0x25, 0x46, 0xC6, 0xFB, 0x0C, 0x27, 0x97, 0xDD, 0x1F, - 0xA6, 0xE3, 0x96, 0xD1, 0x81, 0x21, 0x88, 0x58, 0x39, 0x3B, 0xC5, 0x13, 0xB3, 0x89, 0x56, 0xE9, - 0x9D, 0x72, 0x1B, 0x81, 0xE8, 0xC9, 0x9B, 0xE3, 0xF8, 0x5C, 0x60, 0xA6, 0x39, 0x10, 0xCC, 0x67, - 0x54, 0x2C, 0xEF, 0x88, 0x8C, 0x4A, 0x6B, 0x1D, 0x2E, 0x8A, 0x82, 0x21, 0xA3, 0xA2, 0x7C, 0x47, - 0x64, 0x54, 0xC2, 0xEB, 0x90, 0x51, 0x14, 0x0C, 0x19, 0x88, 0xFF, 0x1D, 0xB1, 0x41, 0xAF, 0xA8, - 0x43, 0x07, 0x48, 0x18, 0xBE, 0x7C, 0x72, 0x21, 0x8E, 0x26, 0xE3, 0x9A, 0x13, 0xC7, 0x8B, 0x52, - 0x6F, 0xBF, 0xC8, 0xD1, 0xC0, 0xB3, 0x3F, 0xD5, 0x24, 0xAD, 0xDE, 0xA3, 0xB2, 0x2E, 0xBF, 0xE4, - 0x3E, 0x7D, 0xF6, 0xFC, 0xE4, 0xE8, 0xD9, 0xD3, 0xE3, 0x3A, 0x17, 0xEE, 0x7D, 0x6E, 0x9C, 0xB6, - 0xEF, 0x38, 0x7E, 0x71, 0xFE, 0x38, 0xA9, 0xE6, 0x65, 0x0F, 0x1E, 0x86, 0x36, 0x7B, 0xF1, 0xE0, - 0xFA, 0x88, 0xBD, 0xD0, 0x7F, 0xB0, 0x24, 0xD1, 0x9B, 0xF1, 0x96, 0xC3, 0x3F, 0x8F, 0xB3, 0xEB, - 0x25, 0x1E, 0x1B, 0xAF, 0x97, 0xF1, 0xFC, 0x8D, 0xC1, 0xE3, 0xBE, 0xA2, 0x5B, 0xED, 0x31, 0x85, - 0x48, 0xB3, 0xF8, 0xF2, 0xF3, 0xE5, 0xF5, 0xD5, 0x45, 0x3A, 0xDE, 0xB2, 0xD1, 0x22, 0x09, 0xDF, - 0x3D, 0x88, 0x97, 0x8B, 0x13, 0xFC, 0x3E, 0x3B, 0x8A, 0x1E, 0x24, 0xE4, 0xFC, 0x22, 0x83, 0x55, - 0x3A, 0xA4, 0x9E, 0x85, 0xE2, 0xE4, 0xFC, 0x49, 0xBC, 0x00, 0xB7, 0x45, 0x63, 0x23, 0x5C, 0x66, - 0x86, 0x92, 0x70, 0x8C, 0xC1, 0x51, 0xC1, 0x5B, 0x92, 0x5D, 0x8F, 0x7B, 0xE8, 0x2C, 0x8E, 0xB2, - 0x47, 0xE1, 0x25, 0x59, 0x5E, 0x8F, 0x8D, 0x79, 0xBC, 0x4A, 0x08, 0x4E, 0xB6, 0x23, 0xFC, 0x0E, - 0xB5, 0xF8, 0x07, 0x6A, 0x5D, 0xC6, 0x51, 0x0C, 0x4F, 0xA1, 0x0D, 0x00, 0x3E, 0x26, 0x3F, 0xC2, - 0x63, 0x87, 0x65, 0xFC, 0x0A, 0xD3, 0xD2, 0xC7, 0xE2, 0xAD, 0xB1, 0x12, 0x47, 0x29, 0xA4, 0x7B, - 0xFB, 0xE5, 0xC2, 0x40, 0x4B, 0x12, 0xE1, 0x2F, 0x18, 0xA4, 0x83, 0x96, 0x98, 0xEE, 0x3E, 0x8F, - 0xAF, 0xC2, 0x39, 0x89, 0xCE, 0xC7, 0x36, 0x4D, 0x7C, 0xC3, 0x5F, 0x06, 0xC2, 0x7C, 0x8A, 0x84, - 0xFC, 0x8C, 0x0D, 0x2A, 0xB3, 0x06, 0x62, 0x97, 0x07, 0x74, 0x1F, 0x35, 0x76, 0xB0, 0x87, 0x2A, - 0x77, 0x09, 0xB4, 0xD6, 0x69, 0xA5, 0x62, 0x0E, 0x8D, 0xC3, 0x38, 0x7A, 0x81, 0xC3, 0x05, 0x4E, - 0xC4, 0x6D, 0x60, 0x7A, 0x19, 0xC7, 0xD9, 0x05, 0x63, 0xC3, 0xC3, 0x15, 0xDB, 0xF8, 0x8F, 0x6D, - 0x74, 0x19, 0xF2, 0x01, 0xEE, 0x28, 0x7D, 0x82, 0xB3, 0x90, 0x42, 0xCA, 0xA8, 0x83, 0x25, 0x99, - 0xBF, 0x79, 0x14, 0x27, 0x73, 0x9C, 0x1E, 0x63, 0xBE, 0xF6, 0x05, 0x00, 0x12, 0x91, 0xCB, 0xD5, - 0xE5, 0x41, 0x1C, 0x65, 0x49, 0x98, 0x66, 0x2F, 0x28, 0xAE, 0xB1, 0x83, 0xD4, 0xE3, 0x7D, 0xB8, - 0xAA, 0x5C, 0x2E, 0xE3, 0x77, 0x54, 0x0E, 0xE3, 0x14, 0x2F, 0xF6, 0xAF, 0x88, 0x8C, 0x03, 0xA7, - 0xF8, 0x57, 0x61, 0x42, 0xD7, 0x46, 0x34, 0x32, 0x0B, 0x5F, 0x1F, 0x67, 0xF1, 0x15, 0x6B, 0xF5, - 0x21, 0xCA, 0x2E, 0xF0, 0x25, 0x1E, 0xDF, 0xE4, 0x88, 0xB5, 0x2F, 0x25, 0x82, 0x15, 0x9F, 0x7E, - 0x15, 0x27, 0x8B, 0x71, 0xD2, 0x25, 0xE9, 0x93, 0x70, 0x8E, 0xDE, 0x91, 0x68, 0x11, 0x8B, 0xC1, - 0x92, 0x82, 0xB3, 0x88, 0x54, 0x54, 0xF8, 0x5D, 0x9C, 0x2C, 0x8E, 0x31, 0x9D, 0x87, 0xB3, 0x38, - 0x19, 0x1B, 0x2D, 0xD3, 0x9A, 0xCE, 0x6E, 0xF2, 0x9F, 0x41, 0xAF, 0x8C, 0xAF, 0x0D, 0x14, 0x2E, - 0x19, 0xE2, 0x27, 0xF1, 0x5B, 0xCC, 0x6F, 0x13, 0x29, 0x33, 0xE7, 0x71, 0xF4, 0x16, 0x27, 0xD9, - 0x61, 0xBC, 0x04, 0xBA, 0x70, 0x72, 0xF9, 0x34, 0xBC, 0xC4, 0x63, 0x36, 0xCE, 0x19, 0x68, 0x4E, - 0xD7, 0x79, 0x5C, 0x43, 0x02, 0x6E, 0x58, 0xD5, 0x6D, 0x38, 0x23, 0xDF, 0xCE, 0x27, 0xC2, 0xD9, - 0xC0, 0x54, 0xCA, 0x06, 0x17, 0x06, 0xC3, 0xB1, 0x6D, 0x03, 0x19, 0x2E, 0xFC, 0x7A, 0xF0, 0xEB, - 0xC3, 0x6F, 0x0F, 0x7E, 0xFB, 0xF0, 0x3B, 0x80, 0xDF, 0x21, 0xFC, 0x8E, 0x6C, 0xDB, 0x98, 0xF1, - 0xAD, 0x59, 0xF8, 0x31, 0x13, 0x66, 0xA4, 0x4E, 0x5E, 0x35, 0xE7, 0x22, 0x69, 0xFD, 0xB9, 0x48, - 0x35, 0x57, 0x09, 0x15, 0xD7, 0xFA, 0x13, 0x8B, 0x79, 0x3E, 0xF2, 0x84, 0x69, 0x4A, 0xCE, 0x23, - 0xF3, 0x26, 0x47, 0x95, 0xC1, 0xC0, 0xD2, 0xB6, 0x02, 0x24, 0x6A, 0x81, 0xED, 0x54, 0x08, 0x11, - 0x2B, 0x4B, 0xAE, 0x15, 0x83, 0x77, 0xD9, 0x6C, 0x42, 0x14, 0xA3, 0x43, 0x61, 0x44, 0x32, 0xF2, - 0x23, 0xBC, 0x1F, 0x2D, 0xBE, 0x17, 0x2E, 0x09, 0x9D, 0x52, 0x19, 0x21, 0x66, 0x86, 0x52, 0x2B, - 0x9F, 0x87, 0x19, 0xDB, 0x1D, 0x6A, 0x03, 0x2A, 0x5C, 0x51, 0x41, 0x65, 0xE5, 0x6C, 0x2A, 0xEE, - 0x95, 0xC5, 0x41, 0x55, 0x85, 0x64, 0x69, 0xB3, 0x32, 0xC5, 0xD9, 0xEA, 0x8A, 0xE7, 0x32, 0xAD, - 0xBC, 0x61, 0x21, 0x50, 0x79, 0xED, 0xAB, 0x33, 0xC8, 0x34, 0x49, 0xB0, 0x7B, 0x43, 0x98, 0x12, - 0x3F, 0x7F, 0x9A, 0x5E, 0x10, 0x33, 0xC5, 0x33, 0x38, 0xE8, 0x8B, 0xA3, 0x27, 0xAB, 0x65, 0x46, - 0xAE, 0x96, 0xF8, 0xC3, 0x71, 0x33, 0x13, 0xD6, 0xD2, 0xA8, 0x35, 0xB1, 0x68, 0x39, 0x80, 0xB5, - 0x54, 0x03, 0x79, 0x28, 0x8F, 0x29, 0x45, 0x60, 0x0C, 0x83, 0xB2, 0xBD, 0xDA, 0x44, 0xD5, 0x1D, - 0xCE, 0xD3, 0xB8, 0xC5, 0xF8, 0xC5, 0xF6, 0x25, 0x6F, 0xF0, 0x75, 0xA1, 0x77, 0xA7, 0xBD, 0x74, - 0x56, 0x6B, 0x96, 0x23, 0x12, 0xF0, 0x57, 0xE2, 0xDF, 0x61, 0x71, 0xE4, 0x56, 0x79, 0xC0, 0xB2, - 0x09, 0x35, 0x72, 0xB6, 0xC0, 0xCD, 0x52, 0x4D, 0x0B, 0x48, 0x1F, 0x60, 0x25, 0xD1, 0x96, 0x77, - 0x85, 0x65, 0x91, 0x2D, 0xA1, 0x28, 0x9E, 0x3D, 0xDD, 0x9C, 0xE3, 0x6C, 0x8C, 0xBB, 0xAF, 0x49, - 0xC4, 0x6C, 0x16, 0xA3, 0xCC, 0x42, 0x29, 0xCE, 0xC6, 0x44, 0x8B, 0x6A, 0x5C, 0xDE, 0x2B, 0x62, - 0x89, 0x40, 0xA8, 0xF3, 0x5B, 0x6A, 0x29, 0x5C, 0x77, 0x70, 0xB7, 0x57, 0x86, 0x32, 0x91, 0x1A, - 0x63, 0x72, 0x66, 0x92, 0xF5, 0xDA, 0x24, 0xD5, 0xC9, 0x9C, 0x4A, 0x1D, 0xDA, 0x2A, 0x76, 0x24, - 0x42, 0xC6, 0xF8, 0xDC, 0x4B, 0x65, 0x75, 0xBD, 0x36, 0x56, 0xD1, 0x02, 0x27, 0x74, 0xDA, 0x12, - 0x11, 0xAF, 0xC3, 0x04, 0x82, 0xB9, 0x49, 0x6A, 0xDA, 0xCC, 0xF8, 0xEC, 0x86, 0xE4, 0x06, 0x98, - 0x82, 0x88, 0xB3, 0x56, 0xD8, 0x7A, 0x4B, 0xC9, 0x6D, 0xC1, 0x22, 0x83, 0xEE, 0xC7, 0xE8, 0xBE, - 0x37, 0xFF, 0x5A, 0xF5, 0x50, 0x60, 0x68, 0xE3, 0xB2, 0x31, 0xDE, 0x40, 0xAC, 0x9A, 0xAB, 0x98, - 0x5E, 0x8D, 0x71, 0x29, 0x82, 0xCE, 0xB7, 0x50, 0x6F, 0x23, 0x5A, 0x5D, 0xBE, 0xC6, 0x49, 0xB1, - 0xDC, 0x25, 0xED, 0xB6, 0xB3, 0x43, 0x9B, 0x9F, 0xEC, 0x04, 0x0E, 0xF6, 0x2C, 0x86, 0x8F, 0x04, - 0x71, 0x97, 0x44, 0xF3, 0xE5, 0x6A, 0x81, 0xE9, 0xA2, 0x76, 0x8F, 0x8C, 0xEB, 0x4A, 0x57, 0x0B, - 0x57, 0x56, 0x25, 0xC6, 0x98, 0xB0, 0x97, 0x65, 0x67, 0xCB, 0x38, 0x4E, 0x4C, 0x62, 0x31, 0x88, - 0x62, 0x9E, 0xE7, 0xE4, 0xA9, 0x73, 0x1A, 0x6B, 0x94, 0x9D, 0xAA, 0xA1, 0xBC, 0xAF, 0x29, 0x77, - 0x5A, 0xF3, 0x30, 0xE2, 0x16, 0x54, 0x97, 0x38, 0x4D, 0x99, 0xB9, 0x3C, 0x07, 0x31, 0x1E, 0x8E, - 0x5B, 0x94, 0xBF, 0x3A, 0x03, 0xEB, 0xA6, 0x5F, 0x49, 0xD6, 0x65, 0xF8, 0xDE, 0x74, 0x90, 0x7C, - 0xF2, 0xE6, 0xF2, 0x30, 0x1C, 0x68, 0x9A, 0x8E, 0x7D, 0x8F, 0x58, 0xF7, 0x1D, 0xDB, 0xD2, 0xF0, - 0x15, 0xAB, 0x0C, 0x20, 0xD4, 0x14, 0x98, 0x08, 0xDD, 0xA0, 0xFA, 0xEE, 0xC8, 0x1F, 0xF5, 0x07, - 0xEE, 0xA8, 0x67, 0x59, 0x3B, 0xF6, 0x07, 0xD4, 0xC0, 0xDE, 0x50, 0x83, 0xDA, 0x05, 0x19, 0x67, - 0x5C, 0x65, 0x3D, 0xC3, 0xB9, 0x17, 0x7C, 0x48, 0xE1, 0x71, 0xD2, 0x02, 0x65, 0xC6, 0x56, 0x16, - 0x57, 0x09, 0x81, 0x62, 0xE8, 0x9A, 0x94, 0x97, 0x48, 0x97, 0xA9, 0x50, 0xC8, 0x16, 0x69, 0xB7, - 0x99, 0x61, 0xEB, 0xFA, 0x92, 0x84, 0xEB, 0xE1, 0x68, 0x75, 0x89, 0x13, 0x32, 0x2F, 0xE1, 0x15, - 0x17, 0x85, 0x24, 0xCF, 0x2B, 0x0B, 0xEB, 0x30, 0x47, 0x6E, 0xBF, 0x6F, 0xFF, 0xF9, 0xA9, 0xCC, - 0x9F, 0x91, 0x53, 0x99, 0x67, 0xE9, 0xFC, 0x31, 0x89, 0xDE, 0x6C, 0xD6, 0x19, 0xE4, 0x37, 0xBA, - 0x1B, 0x8C, 0x75, 0xD4, 0xEB, 0xD0, 0x45, 0x74, 0xF7, 0xB3, 0x08, 0x1C, 0xA4, 0x1D, 0x58, 0x7F, - 0x45, 0xB2, 0x8B, 0xA3, 0x85, 0x38, 0x9F, 0x57, 0xEC, 0x6F, 0x3F, 0xB8, 0xA6, 0xA4, 0x14, 0x49, - 0xF2, 0xBE, 0x9F, 0x46, 0x37, 0xD9, 0x23, 0x2B, 0x29, 0x3A, 0xA9, 0xFE, 0x25, 0x71, 0x97, 0x2C, - 0x94, 0x73, 0xDC, 0x6E, 0xB8, 0x58, 0x3C, 0x81, 0x3B, 0x2F, 0x33, 0xE3, 0xEF, 0x9A, 0xB3, 0xEE, - 0xB5, 0x85, 0xD2, 0xE0, 0x86, 0x96, 0x3E, 0xC6, 0x88, 0x2C, 0xC6, 0x2A, 0xE1, 0x9D, 0x0E, 0xEC, - 0x8A, 0xD2, 0xF1, 0x94, 0xCC, 0xF2, 0xC2, 0x7B, 0x47, 0x59, 0x53, 0x00, 0x72, 0x24, 0x70, 0x87, - 0xC9, 0xD0, 0x3F, 0x4A, 0xE2, 0x4B, 0x20, 0x39, 0xA5, 0xC2, 0x60, 0xD5, 0xD4, 0x90, 0x1F, 0xA3, - 0x93, 0x05, 0x62, 0x0F, 0xCF, 0x17, 0xB9, 0xF4, 0x4B, 0x20, 0x2D, 0xED, 0x9F, 0xE3, 0xEC, 0x30, - 0xCA, 0x92, 0xEB, 0xA3, 0xC5, 0x97, 0xF8, 0xDA, 0x24, 0x96, 0x34, 0x96, 0xAF, 0xB1, 0x11, 0xCE, - 0xA3, 0x53, 0x38, 0x8C, 0x4E, 0x74, 0xDB, 0x48, 0x8B, 0xC5, 0x63, 0x12, 0x61, 0x78, 0x53, 0xFB, - 0xC6, 0x4C, 0x68, 0x59, 0x5A, 0xAD, 0x69, 0x8C, 0x6C, 0xE7, 0x46, 0xDE, 0xC4, 0xC1, 0x4D, 0x95, - 0x29, 0x6F, 0xF0, 0xF5, 0xB8, 0x81, 0x46, 0x60, 0x24, 0x11, 0x6C, 0x8B, 0x0A, 0xB6, 0x45, 0x1F, - 0xC0, 0xB6, 0x18, 0x45, 0x05, 0xDB, 0xF4, 0xDA, 0x52, 0xBE, 0xC5, 0xDD, 0x37, 0xF8, 0x9A, 0xF6, - 0x9A, 0x06, 0xBE, 0xC6, 0xB4, 0xAE, 0xB4, 0x53, 0x51, 0xBE, 0xEA, 0x6C, 0xA8, 0xB9, 0xE6, 0xD1, - 0xB2, 0x17, 0x56, 0xED, 0xE8, 0x54, 0xCC, 0x1F, 0xA7, 0xE3, 0xB7, 0x38, 0xB9, 0xE6, 0xFA, 0x5B, - 0x34, 0x66, 0x2B, 0x08, 0x32, 0xCB, 0x52, 0x54, 0x48, 0x1A, 0xA5, 0x51, 0xE5, 0xAA, 0x35, 0xD1, - 0x5E, 0xEF, 0x63, 0x0B, 0xE1, 0x0F, 0x60, 0x09, 0x01, 0x43, 0xEE, 0x39, 0x37, 0xCE, 0xF7, 0xE6, - 0x61, 0x98, 0x85, 0xB4, 0x43, 0xD0, 0xD1, 0x2A, 0x9B, 0xE8, 0xD7, 0x8D, 0x85, 0xCD, 0xD2, 0x6A, - 0xCD, 0xAC, 0xF5, 0xBA, 0xF0, 0x68, 0x23, 0x14, 0xA2, 0xB2, 0x2E, 0x85, 0xCC, 0x4B, 0x8D, 0x29, - 0x17, 0x5D, 0x74, 0x46, 0xA1, 0x9C, 0x9C, 0xC0, 0x1B, 0xB4, 0x55, 0x42, 0xF2, 0xAF, 0xF3, 0x7A, - 0x22, 0x35, 0xEE, 0x62, 0x61, 0xEF, 0xA0, 0xE4, 0xCB, 0x86, 0xC0, 0xAB, 0x4C, 0xCD, 0x5E, 0x01, - 0x41, 0x8E, 0x85, 0x58, 0x87, 0x55, 0x0D, 0x22, 0xB4, 0xDB, 0xA6, 0x54, 0x42, 0xC0, 0x40, 0x63, - 0x97, 0x2C, 0xE4, 0x5B, 0x0D, 0x4D, 0x2C, 0xB8, 0xDE, 0x0D, 0xA6, 0x92, 0x51, 0x2B, 0x17, 0x12, - 0x80, 0x2C, 0x80, 0x8F, 0x93, 0xB8, 0x51, 0xB9, 0x6E, 0x06, 0xA2, 0x55, 0x1E, 0x18, 0xE3, 0x1C, - 0x0D, 0x3D, 0xDF, 0x93, 0x0F, 0xC5, 0xE5, 0x83, 0x4D, 0x22, 0x4F, 0x24, 0xBB, 0x0B, 0xF2, 0x59, - 0x16, 0x26, 0xE7, 0x18, 0x14, 0xF9, 0xF7, 0xE0, 0x7B, 0xA1, 0xDC, 0x45, 0xB1, 0x86, 0xA7, 0xFD, - 0x09, 0x23, 0x76, 0x83, 0x43, 0x72, 0x6B, 0x6C, 0x56, 0xE0, 0x82, 0xA9, 0x0E, 0x33, 0x43, 0x2A, - 0xEA, 0xCC, 0xCA, 0x3F, 0x62, 0x98, 0x67, 0x17, 0x40, 0x5C, 0x91, 0x22, 0x4E, 0x82, 0xAC, 0xE1, - 0xBE, 0x2C, 0xC8, 0xBA, 0xFC, 0x56, 0x88, 0xE9, 0x17, 0x25, 0xD7, 0xC5, 0x83, 0xF6, 0x72, 0x82, - 0x1C, 0xC0, 0x9B, 0x70, 0x55, 0x17, 0xF0, 0x2D, 0x5C, 0xAE, 0xEC, 0x7A, 0x3D, 0x9D, 0xE5, 0x35, - 0x04, 0xAA, 0x79, 0xE1, 0x7E, 0xAB, 0x54, 0x3A, 0xBF, 0x18, 0x2D, 0x5C, 0x22, 0x94, 0xD3, 0x79, - 0x57, 0x16, 0x3B, 0x1F, 0x6D, 0x89, 0x92, 0x48, 0x17, 0x29, 0xE5, 0xF5, 0x49, 0xD5, 0x4E, 0xEA, - 0x5F, 0x3A, 0xE2, 0x55, 0x7B, 0x1A, 0x5E, 0xE2, 0xED, 0x85, 0x20, 0x90, 0x2E, 0xE6, 0x5A, 0x71, - 0xB4, 0xBC, 0xA6, 0xCB, 0xAC, 0x55, 0x8A, 0x17, 0x74, 0x01, 0x27, 0xD6, 0x15, 0xAD, 0xB0, 0x05, - 0xF3, 0x37, 0xCE, 0x70, 0x62, 0x58, 0x13, 0x62, 0xA6, 0x08, 0xA3, 0xC4, 0xCA, 0x0B, 0xB7, 0xF0, - 0x19, 0x37, 0xA5, 0x08, 0x06, 0x65, 0x71, 0x95, 0xB9, 0xFC, 0x9A, 0x94, 0xCE, 0x0E, 0x79, 0x8E, - 0xE8, 0x24, 0xFC, 0x89, 0xD7, 0xEF, 0x55, 0x1D, 0x9A, 0xAC, 0x7B, 0xF4, 0x52, 0xB3, 0x46, 0x45, - 0x63, 0x4A, 0x52, 0x9F, 0x95, 0x8F, 0x77, 0x69, 0x8C, 0x72, 0xB4, 0x9B, 0x69, 0x87, 0xC7, 0x34, - 0xB1, 0xE1, 0x9E, 0xFF, 0xA8, 0x64, 0x0D, 0x21, 0xD3, 0x9E, 0xAF, 0x88, 0x4F, 0xED, 0xE9, 0x4A, - 0x56, 0xEA, 0x98, 0x35, 0x27, 0xBC, 0xA0, 0x0F, 0x00, 0x4B, 0xCD, 0x49, 0x05, 0xDA, 0x04, 0x0B, - 0x28, 0xBA, 0x54, 0x59, 0xA6, 0xA1, 0x01, 0x19, 0xC0, 0x9A, 0x4A, 0xC9, 0x0D, 0x59, 0xCB, 0x70, - 0x45, 0xEE, 0x3B, 0x64, 0xD4, 0xF3, 0xE8, 0xCC, 0x68, 0xCA, 0xA6, 0x41, 0xB1, 0x9C, 0xB5, 0xEC, - 0x6D, 0xC8, 0x5F, 0x07, 0x6B, 0x58, 0x08, 0xD4, 0xCA, 0xD4, 0x66, 0x5B, 0xAF, 0xCD, 0x52, 0x3B, - 0xDE, 0xE4, 0x96, 0x35, 0x4D, 0xD8, 0x9D, 0x47, 0x60, 0xCF, 0x02, 0x03, 0x42, 0x06, 0x4A, 0xA6, - 0x09, 0xDC, 0x5D, 0x04, 0xCE, 0x2C, 0x30, 0x68, 0x80, 0x45, 0x7D, 0xB5, 0xFF, 0xE2, 0x69, 0xE0, - 0xCE, 0x02, 0x83, 0x06, 0x58, 0x14, 0x5C, 0x23, 0x04, 0xDE, 0x2C, 0x30, 0x20, 0xC4, 0x22, 0x9F, - 0x3D, 0x7A, 0x14, 0xF8, 0xB3, 0xC0, 0x78, 0xF6, 0xE8, 0x91, 0x81, 0x74, 0x41, 0x6A, 0xA8, 0x42, - 0x01, 0xC1, 0xAA, 0x5F, 0x12, 0xC6, 0x86, 0x5C, 0x3A, 0x14, 0xCF, 0xA9, 0x0B, 0x76, 0x53, 0x4E, - 0x0D, 0x8A, 0xE5, 0x2C, 0x75, 0x92, 0x86, 0x9C, 0x3A, 0x94, 0xD1, 0xD0, 0xE7, 0x1A, 0x32, 0x57, - 0x00, 0x0D, 0x2B, 0x47, 0x8E, 0x3F, 0xB4, 0x3F, 0xAD, 0xD3, 0x97, 0x28, 0xDF, 0x70, 0x43, 0xE2, - 0xBA, 0x3D, 0x6B, 0x52, 0xC9, 0xD0, 0xAC, 0x23, 0x72, 0x95, 0xC4, 0x6F, 0xC9, 0x62, 0xB3, 0x2B, - 0x38, 0x6E, 0xC8, 0x53, 0xBE, 0xF9, 0x96, 0xC7, 0xB4, 0xD5, 0xE3, 0x5C, 0x71, 0x9A, 0x5B, 0x3A, - 0xC7, 0xAD, 0x39, 0xC1, 0x15, 0xF6, 0x5A, 0x39, 0xA5, 0xDF, 0xEB, 0x4F, 0xF4, 0xA3, 0x62, 0x5C, - 0x2A, 0x5D, 0x5A, 0xF7, 0x2B, 0x3F, 0x54, 0x07, 0xF2, 0x6B, 0x7C, 0xDC, 0xC9, 0x52, 0x0B, 0xFD, - 0xA7, 0x7A, 0x7B, 0x82, 0xEA, 0x0B, 0xF0, 0x12, 0x53, 0xAC, 0xDB, 0x2D, 0x09, 0x72, 0xD3, 0x5D, - 0xB5, 0xE6, 0x02, 0xB5, 0xA7, 0xA3, 0x0C, 0xE3, 0xC6, 0x97, 0xC6, 0x9C, 0x17, 0x82, 0xC6, 0xFA, - 0x07, 0xC7, 0x72, 0x4F, 0x56, 0xE2, 0x40, 0xB5, 0xA0, 0x52, 0x73, 0xC9, 0x97, 0x14, 0x55, 0x43, - 0x8C, 0x4A, 0x2E, 0xC1, 0xE6, 0x59, 0x80, 0xF3, 0x77, 0x73, 0x50, 0x40, 0xAD, 0x68, 0xF5, 0xE8, - 0x25, 0x77, 0x0B, 0x30, 0x50, 0x05, 0x82, 0xE9, 0xF0, 0x00, 0x2F, 0x97, 0x5F, 0x89, 0xCC, 0xE2, - 0xB2, 0x58, 0x59, 0x51, 0xB2, 0x2B, 0xE3, 0xC2, 0x4F, 0x9D, 0x3D, 0x49, 0x77, 0x08, 0xF3, 0xC2, - 0x4D, 0x23, 0x92, 0x40, 0x7B, 0x61, 0xC1, 0xB6, 0x45, 0xBD, 0x9E, 0x3B, 0xEA, 0xEF, 0x04, 0x49, - 0xBB, 0x9D, 0xEC, 0x04, 0xBD, 0xBE, 0xE7, 0x8C, 0x80, 0xC5, 0xE0, 0xD6, 0x5A, 0x7A, 0x71, 0xCB, - 0x3A, 0x40, 0xA3, 0xA0, 0x29, 0xB1, 0xE4, 0xD6, 0xA8, 0x8C, 0xB1, 0xD7, 0xF7, 0x5C, 0x7B, 0x27, - 0x88, 0xDA, 0xED, 0x68, 0x27, 0xE8, 0x0D, 0x3C, 0xDF, 0xDB, 0x4B, 0x02, 0xC7, 0x76, 0xFD, 0x7B, - 0x66, 0xB2, 0x0D, 0x65, 0x59, 0x9D, 0x68, 0x1B, 0xA0, 0x3A, 0xFD, 0x5E, 0xCF, 0xEB, 0x8F, 0xB3, - 0x4E, 0xA0, 0x21, 0x8F, 0xAC, 0xBC, 0x1C, 0x95, 0x28, 0xCA, 0xDB, 0xE0, 0x50, 0x0B, 0x9C, 0x26, - 0x14, 0x4B, 0x4C, 0x71, 0xA2, 0x12, 0x64, 0xD3, 0x74, 0x56, 0xEC, 0x71, 0xC1, 0x69, 0x29, 0xCF, - 0x98, 0x74, 0xF1, 0xFB, 0xAB, 0x38, 0xC9, 0x52, 0x98, 0x10, 0x23, 0x80, 0x0C, 0x6E, 0x78, 0xDC, - 0xF8, 0x26, 0x97, 0x8B, 0x0F, 0x70, 0x3B, 0x06, 0x97, 0xE3, 0x91, 0xC8, 0x82, 0x22, 0x54, 0x84, - 0x89, 0x55, 0x7C, 0xE4, 0xEC, 0xD8, 0xE7, 0x46, 0x64, 0x66, 0xBA, 0xEF, 0x34, 0x12, 0x07, 0x69, - 0xC3, 0x71, 0x03, 0x6E, 0x1E, 0x92, 0x70, 0xF7, 0x04, 0x27, 0x97, 0x24, 0x0A, 0x97, 0xFA, 0x60, - 0x94, 0x05, 0xC4, 0xF4, 0x5C, 0xAF, 0xCF, 0x06, 0xA3, 0x91, 0xED, 0xBB, 0xEC, 0xBA, 0x76, 0x30, - 0x1A, 0xF0, 0x07, 0x8B, 0x03, 0x7B, 0xC4, 0x1F, 0x2C, 0xF6, 0x06, 0xBE, 0xC3, 0x1F, 0x2C, 0xBA, - 0xC3, 0x9E, 0x85, 0xE6, 0xC1, 0x94, 0x9D, 0x8B, 0x21, 0x76, 0x52, 0x36, 0x9B, 0x28, 0xA5, 0xDC, - 0x66, 0x5E, 0x94, 0xF6, 0xA6, 0x4C, 0x82, 0x9B, 0xBA, 0xD1, 0x7A, 0xE1, 0xD0, 0x80, 0x99, 0x18, - 0x54, 0x7D, 0x1C, 0x08, 0xDB, 0x18, 0xAB, 0xD7, 0x4B, 0x71, 0xD9, 0x52, 0x73, 0x4F, 0x53, 0x94, - 0x23, 0x0E, 0xCD, 0x0B, 0x17, 0x39, 0x58, 0xEC, 0xF6, 0xD4, 0x64, 0xDA, 0xF9, 0xD2, 0x40, 0xEC, - 0x30, 0x78, 0xFA, 0x05, 0x9E, 0xBF, 0x79, 0x81, 0xC3, 0x05, 0x5D, 0x6B, 0x8A, 0x9B, 0x12, 0x6C, - 0xD5, 0x20, 0x67, 0x76, 0x21, 0x34, 0x43, 0x15, 0x44, 0x33, 0x5C, 0x1A, 0xEB, 0xB7, 0x01, 0x19, - 0xBB, 0x0D, 0x50, 0x8F, 0xFE, 0x31, 0xBB, 0x0D, 0x48, 0xB5, 0xA8, 0x8D, 0xB7, 0x01, 0x3A, 0x0F, - 0xB8, 0x7A, 0x40, 0x13, 0xD1, 0xB4, 0xDB, 0xCD, 0x8B, 0x03, 0x6D, 0x5C, 0x73, 0x48, 0xCF, 0x80, - 0xF9, 0x10, 0xA6, 0xAD, 0xB1, 0xE9, 0x50, 0x09, 0xF5, 0xC1, 0x2D, 0xA5, 0x3D, 0xBF, 0xB6, 0x78, - 0x69, 0xCA, 0xED, 0xAD, 0xA9, 0x0E, 0xA1, 0x6A, 0xCD, 0x6B, 0x34, 0x57, 0xCA, 0x37, 0xBF, 0xD5, - 0xF5, 0xFF, 0x0F, 0xE2, 0x15, 0x3B, 0x4E, 0xA5, 0x04, 0xD0, 0xD2, 0xCB, 0x59, 0xC4, 0x4D, 0x50, - 0x16, 0xB7, 0xB2, 0x64, 0x85, 0xE9, 0xDF, 0x55, 0x8A, 0x5B, 0x57, 0x1C, 0xA2, 0xB5, 0xFF, 0xFC, - 0x88, 0x6B, 0x38, 0xC7, 0xD1, 0x03, 0xCD, 0x00, 0xBE, 0x4A, 0x21, 0x24, 0x09, 0x28, 0x78, 0x0A, - 0xD6, 0x04, 0x07, 0x89, 0x1C, 0x92, 0xDD, 0x07, 0x3F, 0x89, 0xDF, 0x56, 0x2C, 0x4E, 0x73, 0xE8, - 0x02, 0x80, 0xE7, 0x80, 0x93, 0x83, 0x7A, 0x58, 0xB0, 0xC2, 0xCF, 0xA0, 0xBE, 0xC4, 0x4D, 0xC5, - 0x7F, 0x89, 0x45, 0xD9, 0x8F, 0x49, 0x84, 0x1F, 0xE1, 0xAA, 0x1D, 0x7C, 0x0E, 0x28, 0x92, 0x39, - 0x34, 0xD3, 0x86, 0x6F, 0x80, 0x65, 0x89, 0x12, 0x12, 0xAC, 0x53, 0x36, 0x41, 0xD2, 0x44, 0x0E, - 0xC9, 0x0E, 0xE6, 0x1B, 0x20, 0x59, 0xA2, 0x80, 0x14, 0x4A, 0x01, 0xFC, 0x5E, 0xB2, 0x21, 0x8B, - 0x0E, 0xC5, 0xF3, 0x9E, 0x90, 0x6C, 0x89, 0x37, 0xE6, 0x53, 0x20, 0x78, 0x9E, 0xAF, 0x12, 0x92, - 0x31, 0x8F, 0xCC, 0x4D, 0xEC, 0x51, 0x20, 0x20, 0x0F, 0x66, 0xE6, 0x11, 0x6B, 0xA1, 0x79, 0x1A, - 0xC0, 0x5D, 0x81, 0x31, 0xEF, 0x32, 0x18, 0x8B, 0x95, 0x2F, 0x15, 0xD9, 0x27, 0x53, 0xE0, 0x2D, - 0xCC, 0x7F, 0x2B, 0x66, 0xC7, 0x2D, 0xC5, 0x37, 0x75, 0xCA, 0x39, 0xCF, 0x4D, 0x13, 0x57, 0x28, - 0xA8, 0xF4, 0x2E, 0xC4, 0x5E, 0xD9, 0x15, 0x56, 0x9C, 0x55, 0xC4, 0x80, 0x2A, 0xC3, 0xEF, 0xB3, - 0x30, 0xC1, 0xF5, 0x82, 0x26, 0x12, 0x01, 0x92, 0x0E, 0xD9, 0xB5, 0x50, 0x34, 0x81, 0x39, 0xCB, - 0x88, 0x97, 0xF5, 0x10, 0x34, 0xA1, 0xD9, 0x46, 0x2A, 0x3F, 0x8F, 0x93, 0x2C, 0xE1, 0x9E, 0x3A, - 0x28, 0xE9, 0x17, 0x35, 0xDE, 0x03, 0xEA, 0x78, 0xC3, 0xB2, 0x40, 0x11, 0xEC, 0xA9, 0x44, 0x95, - 0x8E, 0x2A, 0x6F, 0x14, 0x02, 0x79, 0x26, 0x86, 0x20, 0xA6, 0x23, 0x5E, 0xF9, 0xCC, 0x90, 0xD7, - 0xA3, 0xB0, 0xAF, 0x51, 0x7A, 0x38, 0xCC, 0x1D, 0xC2, 0x18, 0x51, 0x1C, 0x61, 0x63, 0xC2, 0xEF, - 0x52, 0x4B, 0x59, 0xD5, 0x1D, 0x69, 0xC9, 0x7C, 0x0C, 0xBF, 0x74, 0xFD, 0xBE, 0x63, 0x1B, 0xE3, - 0x2C, 0x30, 0xDE, 0x3B, 0xB6, 0xA1, 0xDE, 0x6D, 0x81, 0xE1, 0x33, 0x48, 0x79, 0x9B, 0xD1, 0x90, - 0x9A, 0xF6, 0xF0, 0xC5, 0xFE, 0xE7, 0x90, 0xB4, 0x48, 0xC2, 0x73, 0x2D, 0x65, 0xFF, 0xE9, 0x0F, - 0x20, 0x21, 0x8C, 0xAE, 0x0D, 0xBE, 0x68, 0xA9, 0xB7, 0x01, 0x00, 0xDA, 0x2D, 0xCC, 0x2F, 0x4C, - 0x25, 0xAD, 0x6A, 0x1C, 0xA0, 0x0A, 0xCD, 0xE2, 0xEB, 0x2C, 0x06, 0xE0, 0x6E, 0x35, 0x12, 0x29, - 0x86, 0x0A, 0x1A, 0x98, 0x0B, 0x6D, 0xD0, 0x2D, 0xE0, 0xD0, 0x25, 0x65, 0xDD, 0x09, 0x45, 0x45, - 0xA2, 0x73, 0x96, 0x93, 0x9B, 0x22, 0xE0, 0xC5, 0xB0, 0x8F, 0xAA, 0x51, 0x02, 0x9E, 0x5C, 0x89, - 0x2F, 0x2C, 0x15, 0x70, 0x08, 0xF9, 0xAD, 0x98, 0x2D, 0xE0, 0x49, 0x45, 0x44, 0xCE, 0x06, 0x8D, - 0xAB, 0xDA, 0x77, 0x90, 0xDA, 0xFC, 0x0A, 0xFB, 0x85, 0xB8, 0x98, 0x4F, 0x2B, 0x9A, 0x2A, 0x35, - 0x79, 0x84, 0x02, 0x65, 0xFE, 0x7A, 0xB9, 0x2A, 0x36, 0x70, 0xCC, 0xF7, 0x00, 0xC4, 0xE4, 0x67, - 0x94, 0x40, 0x3D, 0x85, 0x47, 0x55, 0x4D, 0x0B, 0x9F, 0xBE, 0xC5, 0x09, 0x39, 0xBB, 0x3E, 0x8A, - 0x32, 0x7C, 0x4E, 0x3B, 0x84, 0x6A, 0x52, 0x97, 0x19, 0xA0, 0x97, 0x19, 0xF2, 0xF8, 0x0A, 0x97, - 0xCD, 0x9F, 0xF3, 0xA8, 0x3C, 0xCC, 0xB2, 0x70, 0x7E, 0x71, 0x00, 0x4A, 0x73, 0x5F, 0x62, 0xF6, - 0x2E, 0xBB, 0xE2, 0xCC, 0x1C, 0x72, 0x6C, 0x86, 0xD4, 0x6E, 0x88, 0xC4, 0xCE, 0xA2, 0xB2, 0xF1, - 0xD0, 0x4C, 0xE3, 0x97, 0x20, 0x0B, 0x8F, 0x07, 0x17, 0x61, 0x12, 0xCE, 0x33, 0x9C, 0xFC, 0xE5, - 0x98, 0x44, 0x75, 0x48, 0x36, 0xF6, 0xF5, 0x66, 0x2C, 0xF9, 0x02, 0x6F, 0x28, 0xE2, 0x2E, 0xB8, - 0x37, 0x21, 0x90, 0xE4, 0xF3, 0x6B, 0x06, 0x1C, 0xD8, 0x25, 0xBA, 0xCB, 0x0D, 0xA6, 0xA1, 0x2E, - 0xEE, 0x27, 0x70, 0xD3, 0xEB, 0x5A, 0xB8, 0x62, 0x40, 0x04, 0xA5, 0x93, 0xBB, 0xB1, 0x83, 0x95, - 0xC7, 0x9C, 0x11, 0xBF, 0xC5, 0xB2, 0x5C, 0xF1, 0xD4, 0x30, 0x0B, 0xB0, 0xFE, 0x96, 0x31, 0xDB, - 0xCB, 0xC6, 0x36, 0x12, 0xC9, 0x74, 0x97, 0x57, 0x79, 0xBE, 0x48, 0xF6, 0x88, 0x02, 0x92, 0x06, - 0xB8, 0x7B, 0x01, 0x0A, 0x0C, 0x95, 0x17, 0xA1, 0xB5, 0x4D, 0xA2, 0x55, 0x07, 0x5C, 0xEE, 0x89, - 0x69, 0xBE, 0x76, 0x5A, 0xD1, 0x01, 0xF2, 0x14, 0xC2, 0xBA, 0xD6, 0x71, 0xB5, 0x0F, 0x14, 0x3A, - 0x59, 0x80, 0x43, 0xCB, 0xC4, 0x1E, 0xBA, 0x6C, 0x2A, 0x52, 0x07, 0xD0, 0xE0, 0x85, 0x53, 0xE7, - 0x5B, 0xF3, 0x15, 0x80, 0x39, 0xBC, 0xD6, 0x55, 0x4B, 0x54, 0xC7, 0xC3, 0x52, 0x1A, 0xAF, 0x1F, - 0x73, 0xD8, 0x57, 0xA9, 0x01, 0x44, 0x73, 0x10, 0x69, 0x46, 0xF9, 0x8E, 0x23, 0x41, 0x39, 0x57, - 0xE5, 0xA4, 0x45, 0xDD, 0x63, 0x15, 0xA7, 0x2D, 0x9A, 0xE0, 0xCB, 0x23, 0x18, 0xCD, 0x6C, 0x71, - 0x13, 0x01, 0x7A, 0xF1, 0x5A, 0x8E, 0x5A, 0x5B, 0xC8, 0x77, 0x41, 0x20, 0x72, 0xD4, 0xD9, 0x46, - 0x56, 0xE1, 0x78, 0x42, 0x83, 0x3D, 0x64, 0x1D, 0x52, 0xA4, 0x55, 0xAC, 0x1E, 0xDF, 0x99, 0x2A, - 0x99, 0x25, 0xE7, 0x2F, 0xB3, 0x2B, 0x4D, 0x6C, 0x5A, 0xF9, 0x3B, 0xBA, 0xC2, 0xD4, 0x0C, 0xF8, - 0xD2, 0xD4, 0x22, 0x96, 0x01, 0x2C, 0xA3, 0x26, 0x10, 0xAD, 0x5C, 0x16, 0x67, 0xBC, 0x4A, 0x5E, - 0x45, 0x06, 0xCD, 0x7B, 0x45, 0xE7, 0xDD, 0xD2, 0x50, 0x2D, 0xE2, 0xF2, 0x04, 0x9F, 0x25, 0x38, - 0xBD, 0xF8, 0xA0, 0x69, 0xA3, 0xC8, 0xA1, 0x1B, 0x59, 0x91, 0xD3, 0x0A, 0x3C, 0x06, 0x86, 0xBA, - 0x9D, 0xE0, 0xF7, 0xD9, 0x2A, 0xC1, 0xFB, 0xD9, 0x32, 0x4C, 0x6B, 0xAA, 0xAE, 0x27, 0xAB, 0x4E, - 0x01, 0xCB, 0xE7, 0x51, 0xAA, 0x00, 0x16, 0x60, 0x62, 0xDB, 0xCB, 0xDF, 0x33, 0xD1, 0xB9, 0x39, - 0x85, 0xC3, 0x29, 0x65, 0x6E, 0x4E, 0xF2, 0x72, 0x8D, 0xD8, 0x0B, 0xC4, 0xD2, 0x2B, 0x32, 0xA6, - 0x3A, 0x1A, 0x04, 0x81, 0x73, 0xDF, 0x5E, 0xAF, 0x49, 0xFA, 0x34, 0x7C, 0x6A, 0x66, 0xD6, 0x7A, - 0x9D, 0xFD, 0xB4, 0xB3, 0x55, 0xA3, 0x25, 0x64, 0x9C, 0x5C, 0x90, 0x94, 0xEE, 0x17, 0xD9, 0xA6, - 0x37, 0x9C, 0xCF, 0xF1, 0x55, 0x96, 0xB6, 0x08, 0x2F, 0xC3, 0xB0, 0xF2, 0xA6, 0xD1, 0x75, 0x43, - 0xE9, 0xE0, 0x68, 0xBC, 0x81, 0x82, 0xF5, 0x3A, 0xDB, 0xB1, 0xAB, 0xBB, 0xF0, 0x06, 0x3A, 0xAE, - 0x78, 0xA9, 0x2A, 0x41, 0x79, 0x6E, 0x99, 0x16, 0x4A, 0xE9, 0x6F, 0x6E, 0x59, 0x93, 0xBF, 0x70, - 0xFF, 0xFE, 0x4F, 0xB5, 0xD2, 0x78, 0x95, 0xCC, 0xF1, 0x93, 0xF0, 0xEA, 0x8A, 0x44, 0xE7, 0x2F, - 0x5F, 0x3C, 0x0E, 0xC4, 0xDB, 0x8B, 0xEE, 0x65, 0x78, 0xF5, 0x17, 0x5A, 0xAD, 0x56, 0xEB, 0xFE, - 0xBD, 0x16, 0x8D, 0xDA, 0xFE, 0x61, 0xBA, 0x8D, 0xA3, 0x45, 0xEB, 0xDE, 0x7D, 0x88, 0xDD, 0xB9, - 0xCF, 0x54, 0x7E, 0x76, 0xD9, 0x97, 0xFA, 0x51, 0x64, 0x61, 0xEB, 0x81, 0x6D, 0xF0, 0x0F, 0x4F, - 0x33, 0x6E, 0xE9, 0x1A, 0x32, 0x15, 0x0D, 0x21, 0x7E, 0x90, 0xD5, 0x6E, 0x57, 0x52, 0x2E, 0xE1, - 0x80, 0x6A, 0x8F, 0xFD, 0x11, 0x07, 0x5E, 0x41, 0x66, 0x5A, 0xE3, 0x1A, 0x65, 0x22, 0x76, 0xF6, - 0xD1, 0x6E, 0xB3, 0xBF, 0xDD, 0xF0, 0x72, 0xB1, 0xC7, 0x82, 0xE6, 0x74, 0x86, 0x32, 0x6B, 0xDC, - 0x54, 0xEE, 0x1E, 0xFF, 0xDB, 0xDD, 0x07, 0xBA, 0x41, 0xC2, 0xA0, 0x0C, 0x5C, 0x8E, 0xC9, 0xCD, - 0x14, 0x2F, 0xCF, 0x90, 0x29, 0xEB, 0x23, 0xDD, 0xC1, 0xC2, 0x99, 0x9B, 0xB1, 0x4A, 0x71, 0x8B, - 0x19, 0x0A, 0x34, 0x26, 0xEC, 0x00, 0xAE, 0xE6, 0x54, 0x2E, 0x0B, 0x70, 0x71, 0x6C, 0xC8, 0x66, - 0xA6, 0x54, 0xB9, 0x7B, 0x0D, 0x17, 0x0B, 0x58, 0x40, 0x3D, 0xA6, 0x13, 0x23, 0x5D, 0x40, 0xD0, - 0x64, 0x74, 0x23, 0x9C, 0x62, 0x02, 0x9A, 0xB4, 0xDD, 0xA6, 0xFD, 0xED, 0x32, 0x7E, 0x8B, 0xAB, - 0xB0, 0x79, 0xFE, 0x31, 0x97, 0xCF, 0x6A, 0x4D, 0x0B, 0x9F, 0xA1, 0x4A, 0xE4, 0x46, 0x6F, 0x8C, - 0x0B, 0xA9, 0x42, 0x5E, 0x58, 0x39, 0x3F, 0x4D, 0x63, 0xBA, 0xFE, 0x97, 0x87, 0xDA, 0xEC, 0xB3, - 0xCB, 0xEC, 0xF0, 0x9C, 0x5C, 0x5F, 0xE1, 0xC0, 0x00, 0xFF, 0xB4, 0x6C, 0x0B, 0x27, 0x6E, 0x20, - 0x5E, 0x93, 0x05, 0x49, 0xD8, 0xCC, 0x17, 0x2E, 0x83, 0x2D, 0xDA, 0x37, 0xB6, 0x1C, 0x66, 0xBD, - 0x4F, 0x4D, 0xB1, 0x72, 0xC5, 0x85, 0x67, 0x95, 0x08, 0xEE, 0x7D, 0xC1, 0x54, 0x4B, 0x46, 0xC6, - 0x25, 0x4E, 0xD3, 0xF0, 0x1C, 0x1B, 0xCC, 0x9A, 0x83, 0x74, 0x33, 0x00, 0x6A, 0x0B, 0x13, 0x39, - 0x7E, 0xB2, 0x81, 0xA4, 0x90, 0x12, 0xBA, 0x6A, 0x11, 0x0E, 0xE0, 0x87, 0xD2, 0x63, 0x7A, 0x5E, - 0x68, 0xBF, 0x68, 0x84, 0x15, 0x26, 0x47, 0xCA, 0xD4, 0x88, 0xE3, 0x1B, 0xD0, 0x52, 0xE1, 0x84, - 0xE1, 0x68, 0xC1, 0xD5, 0x44, 0x14, 0x1D, 0xA4, 0xBA, 0x8C, 0xFC, 0xB8, 0x49, 0xCF, 0xCA, 0x23, - 0xB1, 0xB5, 0x29, 0x77, 0x99, 0x09, 0xF3, 0x65, 0x9C, 0x62, 0xF5, 0xBD, 0x99, 0x62, 0x43, 0xE5, - 0xCE, 0x48, 0x40, 0x2F, 0xBE, 0x09, 0xC9, 0xAD, 0x16, 0x27, 0x0A, 0xEC, 0xAA, 0x4D, 0x93, 0x5C, - 0x65, 0x87, 0xBA, 0xE8, 0x7E, 0x76, 0x85, 0xA3, 0x63, 0x28, 0xD8, 0x94, 0x36, 0x5B, 0xB8, 0x30, - 0xD1, 0x1C, 0xE0, 0xC3, 0x55, 0x63, 0x87, 0x7A, 0xB4, 0x58, 0x46, 0x50, 0x67, 0x72, 0x46, 0x69, - 0x59, 0xE9, 0xC8, 0xB1, 0x74, 0x81, 0xA1, 0xF8, 0xD3, 0x4F, 0x2D, 0x38, 0xB6, 0x77, 0x7B, 0xBD, - 0x76, 0xF9, 0xDE, 0xA1, 0x4A, 0x5B, 0x26, 0xCE, 0x3E, 0x55, 0x1A, 0x6E, 0xB4, 0x53, 0x02, 0x0E, - 0x9E, 0xE0, 0x70, 0x71, 0x7D, 0x9C, 0x85, 0x19, 0xD7, 0xC3, 0x6E, 0x7D, 0x85, 0x5F, 0xB3, 0x0C, - 0xDD, 0x67, 0xCF, 0x0F, 0x9F, 0x8E, 0xB9, 0x65, 0x4B, 0x7B, 0x52, 0x4A, 0x3C, 0x78, 0xF6, 0xF4, - 0xE9, 0xE1, 0xC1, 0xC9, 0xD1, 0xD3, 0xCF, 0xC7, 0x55, 0x07, 0x7B, 0xD0, 0x7F, 0xB9, 0xC7, 0xD8, - 0x77, 0x61, 0xCA, 0x7D, 0xC4, 0xB6, 0x5E, 0xE3, 0xB3, 0x38, 0xC1, 0x2D, 0x56, 0x32, 0x24, 0xD0, - 0x4D, 0x9F, 0x61, 0x55, 0x70, 0x3F, 0x7E, 0x76, 0x4C, 0x11, 0xF3, 0xC1, 0x49, 0x7D, 0xB5, 0x56, - 0x42, 0xCE, 0x51, 0x91, 0xB4, 0x45, 0xE5, 0x8B, 0xF6, 0x1F, 0x0B, 0x6D, 0x39, 0x75, 0xF8, 0x0E, - 0x1F, 0xDE, 0x42, 0xA7, 0x8E, 0x0A, 0x3C, 0xDA, 0x2E, 0xF0, 0x59, 0xB8, 0x5A, 0x66, 0xD5, 0x8C, - 0x2F, 0x23, 0xFC, 0xFE, 0x0A, 0xCF, 0x33, 0xBC, 0x10, 0xD9, 0xE8, 0x8A, 0x00, 0xC3, 0xA4, 0x07, - 0xB3, 0x1E, 0xBE, 0xC3, 0xAC, 0xB7, 0x0D, 0xE5, 0xF2, 0x59, 0xAB, 0x6E, 0x0A, 0xE4, 0xF3, 0xD9, - 0x87, 0x4E, 0x83, 0x67, 0x24, 0xFB, 0xD3, 0x37, 0x07, 0x3E, 0x22, 0x99, 0x3A, 0x01, 0xAA, 0x9F, - 0xDF, 0xD9, 0xEC, 0xF7, 0x11, 0xD3, 0x93, 0xA4, 0x43, 0xCE, 0x4D, 0x32, 0xA6, 0xEE, 0x06, 0xBC, - 0x66, 0x76, 0xC8, 0xC4, 0x7D, 0x93, 0x7A, 0x9F, 0x9C, 0x9F, 0x91, 0xAC, 0x7C, 0xE2, 0xC7, 0x2F, - 0x05, 0x1E, 0x92, 0x4B, 0x1C, 0xF1, 0xFB, 0x64, 0x30, 0x23, 0x80, 0xD7, 0xEB, 0x2D, 0x1D, 0x95, - 0x58, 0xAC, 0xB1, 0x73, 0x4E, 0xAB, 0xF8, 0x04, 0x93, 0xCB, 0xE5, 0x91, 0x46, 0xCF, 0xCB, 0x56, - 0xC3, 0x93, 0x52, 0x24, 0x78, 0x82, 0x0A, 0x02, 0x86, 0x41, 0x8C, 0x75, 0x32, 0x15, 0x4C, 0xBC, - 0xD3, 0x54, 0x66, 0xFC, 0xD9, 0xCC, 0xBA, 0xA7, 0x09, 0x9C, 0xCA, 0x4B, 0xA3, 0xD0, 0x6C, 0x5B, - 0x81, 0xCA, 0x58, 0xF9, 0x81, 0x0F, 0xE4, 0x43, 0x82, 0xBC, 0xBC, 0xA6, 0xA2, 0xCA, 0xC8, 0x29, - 0x72, 0x8B, 0x6A, 0x54, 0x53, 0xC4, 0x99, 0x77, 0x85, 0x2F, 0x22, 0xA1, 0x0B, 0xAF, 0xF2, 0x84, - 0x57, 0x21, 0x9D, 0x1F, 0xB8, 0x96, 0x1F, 0x28, 0x0B, 0x70, 0xB9, 0x52, 0x0B, 0x49, 0x9F, 0xF0, - 0xDD, 0x94, 0x81, 0xBD, 0x95, 0x39, 0x5E, 0x2E, 0xD9, 0x39, 0xC4, 0x7A, 0x5D, 0x8A, 0xE5, 0x47, - 0x0F, 0x5A, 0x81, 0x09, 0x58, 0xF7, 0x2F, 0x15, 0x1A, 0x6B, 0x76, 0x15, 0x5F, 0x87, 0xF3, 0x37, - 0x7B, 0xF6, 0x18, 0x77, 0x85, 0x63, 0x67, 0xE1, 0x39, 0x2A, 0x64, 0xAF, 0x35, 0x10, 0x09, 0xD8, - 0xAB, 0x40, 0xBA, 0xAB, 0x3F, 0x88, 0x2F, 0xAF, 0x56, 0x19, 0x5E, 0xC0, 0x43, 0x19, 0xF3, 0x4E, - 0x0C, 0x40, 0x71, 0x00, 0x67, 0xF9, 0x47, 0x51, 0x66, 0x82, 0xDB, 0x2B, 0x21, 0xFB, 0xDF, 0xA3, - 0xA2, 0x6E, 0x1A, 0x8C, 0x6C, 0x03, 0xCC, 0x5D, 0xC8, 0xE7, 0x17, 0x36, 0xDA, 0x98, 0x07, 0x18, - 0x60, 0xD0, 0xA9, 0x3B, 0xFA, 0x40, 0xE2, 0x2C, 0xB4, 0x0C, 0xE2, 0x6D, 0x53, 0x62, 0x8F, 0x6A, - 0xB0, 0x5F, 0x85, 0x8B, 0x05, 0x89, 0xCE, 0xB7, 0xB3, 0xF8, 0xCA, 0xB0, 0xAC, 0xCE, 0x9D, 0x60, - 0x85, 0x19, 0x2A, 0xCB, 0x42, 0x61, 0x90, 0xDE, 0xB1, 0x80, 0x84, 0xD7, 0xFC, 0x6E, 0x45, 0x2C, - 0xF1, 0x19, 0x05, 0xB6, 0xB6, 0x13, 0x3E, 0xBE, 0xB0, 0xC7, 0xC1, 0x92, 0x67, 0x2E, 0x52, 0x1E, - 0xD5, 0x84, 0xF7, 0xCB, 0xF2, 0x62, 0x59, 0xEC, 0x11, 0x71, 0xF9, 0x89, 0x0B, 0x83, 0x5F, 0xDE, - 0xAF, 0x4A, 0xD2, 0xC7, 0xCC, 0x27, 0x67, 0x24, 0xAB, 0x9B, 0x4C, 0xE8, 0xAC, 0xF0, 0xA1, 0x33, - 0xC9, 0x3B, 0xFC, 0xFA, 0x7C, 0xF9, 0xA7, 0x6F, 0x2E, 0xF9, 0x8A, 0x92, 0xAD, 0xCE, 0x26, 0x7A, - 0xC4, 0x47, 0xCC, 0x27, 0xA3, 0xFE, 0x27, 0xEA, 0x58, 0xC2, 0xEB, 0x6F, 0x76, 0x95, 0x89, 0x93, - 0x1A, 0x8F, 0xF4, 0x43, 0xE1, 0xC3, 0xBA, 0x27, 0xAC, 0x30, 0xF7, 0x46, 0x4C, 0xCF, 0xC1, 0x1B, - 0xF8, 0x5C, 0xB9, 0xC1, 0x06, 0x63, 0xCC, 0x8E, 0x83, 0x96, 0xC1, 0xC5, 0xBD, 0x47, 0xCB, 0x38, - 0xCC, 0x3C, 0x17, 0x56, 0x8F, 0xDD, 0x07, 0x3F, 0x38, 0x39, 0x3C, 0x3E, 0x7D, 0x7E, 0xF8, 0xE2, - 0xF4, 0xF0, 0xF1, 0xE1, 0x93, 0xC3, 0xA7, 0x27, 0xCC, 0x77, 0x23, 0x5A, 0x04, 0x36, 0x3A, 0x0D, - 0x6C, 0xB4, 0x92, 0x36, 0x34, 0xCF, 0xE5, 0xFB, 0xDB, 0xF8, 0x83, 0xEC, 0x20, 0x17, 0xB3, 0x18, - 0x8F, 0x38, 0x5F, 0x4A, 0xD3, 0xC7, 0xC5, 0x40, 0x29, 0x1F, 0x23, 0xB2, 0xBB, 0x26, 0x76, 0x95, - 0x26, 0xBD, 0x57, 0xBD, 0xC5, 0x49, 0x06, 0xC6, 0x83, 0x6E, 0xE6, 0xF1, 0x2A, 0xCA, 0xC6, 0x36, - 0x0A, 0xB3, 0x2C, 0x21, 0xAF, 0x57, 0x19, 0x66, 0x3B, 0x1D, 0xB5, 0x4E, 0xA6, 0x6D, 0x29, 0xC9, - 0x0C, 0x53, 0x3A, 0x9E, 0xD6, 0x81, 0xD5, 0xC4, 0xCD, 0x72, 0x39, 0xFA, 0x0A, 0x72, 0x27, 0x52, - 0xB9, 0x3D, 0xEC, 0xAA, 0xC7, 0x40, 0xB4, 0x23, 0x42, 0x00, 0x8E, 0xF3, 0xDA, 0x6D, 0x73, 0x53, - 0x72, 0xF1, 0xA6, 0xCC, 0x73, 0x11, 0xB3, 0x8D, 0x49, 0x97, 0x86, 0x47, 0x67, 0x8F, 0xC2, 0x65, - 0x7A, 0x6D, 0x99, 0x60, 0x6A, 0xE8, 0xB9, 0x50, 0xEF, 0x35, 0x93, 0xEE, 0x93, 0xFD, 0xEF, 0x9F, - 0x9E, 0x1C, 0x7E, 0xFF, 0xE4, 0xE5, 0x8B, 0xC3, 0xD3, 0xA3, 0x27, 0xFB, 0x9F, 0x1F, 0x9E, 0xBE, - 0x7C, 0x7A, 0x74, 0x72, 0x0C, 0x83, 0x54, 0xA5, 0x1C, 0xFE, 0x7D, 0x4C, 0x7E, 0x04, 0xDA, 0x80, - 0x1F, 0x84, 0xFC, 0xF8, 0xE8, 0xAF, 0x1C, 0x16, 0x1B, 0xA9, 0xAB, 0x24, 0x3E, 0x4F, 0xC2, 0xCB, - 0x3A, 0x2C, 0x8A, 0x9A, 0xE1, 0x73, 0x06, 0x65, 0x99, 0x09, 0x32, 0x7E, 0x4A, 0x68, 0x88, 0x79, - 0xB6, 0xDD, 0xC2, 0xE9, 0xAB, 0x68, 0x19, 0x5E, 0xC7, 0xAB, 0xAC, 0x65, 0x2E, 0x63, 0x76, 0xE5, - 0xD6, 0x0A, 0x5A, 0xB6, 0xD5, 0x22, 0x51, 0xEB, 0x2D, 0x9E, 0xBB, 0xAD, 0xF0, 0x74, 0x15, 0x91, - 0xEC, 0xE7, 0x57, 0xE1, 0x62, 0x52, 0x0B, 0xEA, 0xA8, 0xA0, 0x74, 0x44, 0xBB, 0x8A, 0xD3, 0x7A, - 0x48, 0x57, 0x85, 0x8C, 0xCF, 0xCE, 0x52, 0x9C, 0xD5, 0x03, 0x7A, 0x2A, 0x20, 0x5D, 0x58, 0xD4, - 0x83, 0xF9, 0x00, 0x76, 0x46, 0xE5, 0xA1, 0x15, 0x9E, 0x66, 0xF8, 0xFD, 0x55, 0x78, 0xDE, 0x00, - 0xDA, 0x53, 0x31, 0x66, 0xF8, 0xFD, 0x3C, 0x8E, 0x93, 0x86, 0xFA, 0xF4, 0x4B, 0xA0, 0xBC, 0xFC, - 0x57, 0xD1, 0x2A, 0x22, 0x67, 0x71, 0x72, 0xD9, 0xBA, 0x0C, 0x33, 0xBF, 0xB5, 0xA2, 0x8C, 0xFF, - 0x21, 0xDB, 0x92, 0x4F, 0x8A, 0x34, 0xC8, 0xB6, 0x3A, 0x4D, 0x70, 0x1A, 0x2F, 0x57, 0x3C, 0xED, - 0x55, 0x44, 0x8B, 0x80, 0x94, 0xB7, 0x6A, 0xD9, 0x67, 0xCB, 0x30, 0x6B, 0xD1, 0x24, 0x12, 0x65, - 0x2C, 0x85, 0xD3, 0xFF, 0x2A, 0x02, 0x01, 0xBE, 0x0C, 0x49, 0x64, 0x5A, 0xAD, 0x9B, 0x57, 0x51, - 0x8B, 0xE5, 0xFE, 0x11, 0x4E, 0xE2, 0x93, 0xF8, 0x59, 0x84, 0x5B, 0x41, 0xCB, 0x14, 0x1C, 0x6C, - 0xDD, 0xD7, 0xCA, 0xB3, 0x5A, 0x9D, 0xA2, 0x19, 0x5A, 0x1D, 0x0A, 0x27, 0x9A, 0xAF, 0x75, 0x8F, - 0x73, 0xD3, 0x9A, 0x50, 0x94, 0xE7, 0xCB, 0x53, 0x71, 0x5B, 0xD0, 0x0A, 0xB4, 0xFA, 0xB4, 0xEE, - 0xD1, 0xF2, 0x7C, 0x53, 0x96, 0x87, 0x5A, 0x76, 0xD7, 0x46, 0x2D, 0xA7, 0x6B, 0xB3, 0xAC, 0x92, - 0xD8, 0x56, 0x40, 0x89, 0x37, 0x25, 0xF3, 0x95, 0x64, 0xA8, 0x65, 0x2B, 0x50, 0xD8, 0x0D, 0x94, - 0x69, 0xC4, 0x14, 0xDC, 0xCD, 0x0D, 0xA4, 0xAA, 0xFA, 0xF3, 0x0B, 0x6F, 0x43, 0x6E, 0x91, 0x49, - 0xE0, 0x4C, 0xC8, 0x0E, 0x9E, 0x90, 0x4E, 0xC7, 0xCA, 0x3A, 0xC1, 0xD7, 0x2D, 0x78, 0xA9, 0x47, - 0xCE, 0x5A, 0xA6, 0x42, 0x4B, 0x00, 0x0F, 0x1B, 0xAD, 0xD6, 0x0D, 0xE5, 0x2A, 0x98, 0xD9, 0x68, - 0x05, 0xA0, 0x84, 0xB0, 0x4A, 0xB0, 0xB9, 0x3A, 0xE5, 0xA1, 0x29, 0x05, 0x9A, 0x21, 0x85, 0x4A, - 0x6B, 0xD2, 0xCA, 0xBF, 0x16, 0x6E, 0x97, 0x2A, 0xBD, 0xE3, 0x2A, 0xC1, 0x73, 0x02, 0x31, 0xCB, - 0xF8, 0xDD, 0x15, 0x13, 0x37, 0x68, 0x24, 0x21, 0x25, 0xD5, 0x46, 0x25, 0x51, 0x4D, 0x9B, 0x0A, - 0x11, 0x49, 0xC3, 0xCB, 0xAB, 0x25, 0x4E, 0xDC, 0x87, 0x2D, 0x95, 0x24, 0x9C, 0xCF, 0x54, 0x51, - 0xF1, 0x65, 0x15, 0xEA, 0xE5, 0xA1, 0x52, 0x73, 0x9B, 0x27, 0xB4, 0x36, 0xD7, 0xDD, 0x2E, 0x55, - 0x9C, 0x66, 0xC9, 0x5B, 0x9F, 0xDD, 0x64, 0xF9, 0xAB, 0x28, 0xFF, 0x3A, 0xDF, 0x38, 0x22, 0xCA, - 0x31, 0x47, 0x35, 0x19, 0x1C, 0xD7, 0x99, 0x0C, 0x4E, 0xF8, 0x43, 0x1B, 0x3E, 0xEA, 0x98, 0xDA, - 0x48, 0x65, 0x69, 0x63, 0x17, 0x17, 0xB9, 0xC7, 0xBC, 0xFF, 0x35, 0x0E, 0x86, 0x2F, 0x19, 0xF7, - 0x04, 0x9C, 0x8E, 0x12, 0x19, 0xAA, 0xF8, 0x1A, 0x12, 0x7F, 0xD1, 0x2D, 0x3E, 0x1D, 0x7F, 0x81, - 0xAB, 0xC0, 0xCF, 0xB9, 0xFA, 0xE9, 0xC8, 0x39, 0xA2, 0x02, 0x33, 0x9D, 0x40, 0xF1, 0x7B, 0x98, - 0xE3, 0xD8, 0x12, 0x24, 0x48, 0xF8, 0x48, 0xFE, 0xBD, 0x22, 0xC5, 0xB4, 0x50, 0x02, 0x3A, 0x7A, - 0x6A, 0x5C, 0x43, 0x7E, 0xA1, 0x73, 0x78, 0x11, 0x54, 0xE6, 0xD0, 0xA9, 0x8D, 0x6C, 0xE4, 0x20, - 0xF6, 0xEB, 0x20, 0x67, 0x66, 0xA1, 0xB9, 0x2C, 0xEE, 0x01, 0xD7, 0xAA, 0x99, 0x7C, 0x58, 0xCB, - 0xF3, 0x6C, 0x73, 0x68, 0x6C, 0x46, 0x24, 0x8F, 0x4A, 0xBA, 0xFB, 0x2F, 0x5E, 0xEC, 0xFF, 0xE0, - 0xF4, 0xC1, 0xCB, 0x47, 0x8F, 0x0E, 0x5F, 0xA0, 0x39, 0x24, 0x43, 0x12, 0x9C, 0xCB, 0x95, 0x92, - 0x2F, 0x50, 0xD2, 0x3D, 0x3E, 0xD9, 0x3F, 0x39, 0x3A, 0x38, 0x7D, 0xF8, 0x62, 0xFF, 0x2B, 0x0A, - 0x8C, 0x23, 0x5A, 0x1E, 0xAF, 0x32, 0x2C, 0x1B, 0xE4, 0xF2, 0x20, 0xE9, 0xBE, 0x55, 0xA2, 0x9F, - 0xC7, 0x24, 0xA2, 0xB4, 0xDA, 0xC8, 0x95, 0x2B, 0x99, 0xEE, 0xA3, 0xC7, 0xCF, 0xF6, 0x4F, 0xD0, - 0x16, 0x54, 0x57, 0xF0, 0x64, 0x51, 0x3E, 0xA2, 0x9B, 0x52, 0x4E, 0xB8, 0xC8, 0x9B, 0x59, 0xE8, - 0xF4, 0x3B, 0xE2, 0xC4, 0x69, 0x1D, 0x27, 0xF8, 0x12, 0xEE, 0x54, 0xAB, 0xF2, 0x69, 0x85, 0x23, - 0xB5, 0x60, 0x8B, 0x32, 0x67, 0xF8, 0x72, 0xAC, 0xB4, 0x90, 0xAA, 0x97, 0x49, 0xBD, 0x46, 0x1F, - 0xDA, 0xAD, 0x79, 0xBE, 0xFA, 0x02, 0x6F, 0x6D, 0xF1, 0x86, 0x6C, 0x1B, 0x5A, 0xD6, 0x6D, 0x6A, - 0x59, 0x17, 0xB9, 0x28, 0x29, 0x9A, 0x74, 0x89, 0x2A, 0x32, 0xF0, 0x90, 0xBC, 0x25, 0x69, 0x4C, - 0x21, 0x9D, 0x4D, 0x25, 0x78, 0x4D, 0x25, 0x78, 0xE5, 0x12, 0xDC, 0x5B, 0x96, 0xE3, 0x4D, 0x04, - 0x78, 0x9B, 0x09, 0xF0, 0x9B, 0x08, 0xF0, 0x91, 0xA3, 0x13, 0xE0, 0x7F, 0x24, 0x01, 0xFE, 0x66, - 0x02, 0x7A, 0x4D, 0x04, 0xF4, 0xCA, 0x1C, 0xE8, 0x7D, 0x24, 0x01, 0xBD, 0xCD, 0x04, 0xF4, 0x9B, - 0x08, 0xE8, 0x97, 0x09, 0x18, 0x7C, 0x24, 0x01, 0xFD, 0xCD, 0x04, 0x38, 0x4D, 0x04, 0x38, 0x65, - 0x02, 0x46, 0x1F, 0x49, 0x80, 0xC3, 0x08, 0x58, 0xA5, 0x0D, 0x13, 0x23, 0x1F, 0x8E, 0x56, 0x30, - 0x1C, 0x1D, 0x45, 0x72, 0x80, 0xDE, 0x38, 0x29, 0xCB, 0x25, 0x12, 0x0E, 0xEC, 0x09, 0xDE, 0xD9, - 0x04, 0x3B, 0xC1, 0x9D, 0x8E, 0xB5, 0x9A, 0xE2, 0x59, 0x80, 0x27, 0x49, 0x97, 0xAF, 0x47, 0x1C, - 0xF2, 0xD6, 0xAC, 0x9D, 0xCD, 0xD0, 0x0A, 0x88, 0x65, 0x50, 0x4F, 0xC2, 0x2C, 0x21, 0xEF, 0xFD, - 0xB3, 0xB7, 0x66, 0xD3, 0xCC, 0x4D, 0x59, 0x93, 0x76, 0x9F, 0xBF, 0x78, 0xF6, 0x97, 0x0F, 0x0F, - 0x4E, 0x8E, 0x9E, 0x3D, 0x3D, 0x7D, 0xB2, 0x7F, 0xF2, 0xE2, 0xE8, 0xFB, 0xC5, 0xB8, 0xB4, 0x0C, - 0x53, 0x4E, 0x9A, 0xB4, 0xB4, 0xFA, 0x01, 0x64, 0xDF, 0xA8, 0xB7, 0x29, 0x69, 0xF7, 0xF3, 0xC7, - 0x1C, 0xDE, 0xDC, 0x30, 0xBE, 0x09, 0x10, 0x30, 0xDD, 0xFF, 0x41, 0x23, 0x9C, 0xC8, 0x99, 0x75, - 0x39, 0x53, 0xF8, 0xA8, 0xC6, 0x36, 0xBB, 0x22, 0x35, 0xE9, 0xF2, 0x2D, 0x99, 0xDD, 0xC1, 0x62, - 0xCC, 0xAB, 0xA4, 0x9D, 0xBA, 0x0F, 0x51, 0x81, 0x06, 0x25, 0x34, 0x28, 0x77, 0x76, 0x44, 0x87, - 0x2B, 0x3E, 0xBE, 0x7A, 0xB1, 0xFF, 0xFC, 0xF4, 0x18, 0x25, 0xDD, 0x83, 0xC7, 0xFB, 0x4F, 0x9E, - 0x9F, 0x9E, 0x3C, 0x3B, 0x3D, 0x7C, 0xF8, 0xF9, 0xE1, 0x87, 0x65, 0x3F, 0x69, 0xC8, 0x7E, 0x74, - 0x19, 0x9E, 0x63, 0xF7, 0xA1, 0x9E, 0xD7, 0x46, 0x49, 0xF7, 0xC5, 0xE7, 0x0F, 0xF6, 0x61, 0x09, - 0x20, 0x3F, 0x92, 0xEE, 0xCB, 0xA7, 0xC7, 0x47, 0x9F, 0x3F, 0x3D, 0x7C, 0x78, 0x4A, 0xA5, 0x1C, - 0x95, 0xE7, 0x49, 0xB7, 0xD7, 0x83, 0x75, 0x83, 0xDB, 0xEB, 0xCD, 0xAC, 0xDA, 0xA6, 0x66, 0xCF, - 0x11, 0x44, 0xAF, 0x33, 0x93, 0xEE, 0x83, 0xC7, 0x87, 0x4F, 0x1F, 0x02, 0xB7, 0x96, 0x38, 0x5A, - 0x3C, 0x5A, 0x45, 0x73, 0x33, 0xE9, 0x1E, 0xBF, 0x38, 0x38, 0xDD, 0x7F, 0xFC, 0xFC, 0x0B, 0x5A, - 0xE2, 0xB3, 0xA7, 0x87, 0xA7, 0x4F, 0x8E, 0x9E, 0xBE, 0x3C, 0x3E, 0x95, 0xB1, 0x1C, 0xF3, 0x05, - 0x28, 0xFC, 0x09, 0xC5, 0xF0, 0xFC, 0x35, 0x3E, 0x27, 0xD1, 0x23, 0xCA, 0x0A, 0x79, 0xAC, 0xB3, - 0xA5, 0x50, 0x20, 0xFC, 0xA2, 0xC3, 0x47, 0x57, 0x05, 0xCE, 0x99, 0xA5, 0x4B, 0xD5, 0x3E, 0x3F, - 0x4A, 0x50, 0x8C, 0x22, 0x14, 0x8A, 0xA3, 0x7C, 0x05, 0x42, 0x3F, 0xD1, 0xE8, 0x16, 0x13, 0x17, - 0x2A, 0xE7, 0xCD, 0x4F, 0x6B, 0x10, 0x43, 0x12, 0x5A, 0xA2, 0x73, 0xEB, 0x66, 0x11, 0x98, 0xE4, - 0x5E, 0xCD, 0x81, 0x7B, 0x27, 0xB3, 0xEE, 0x5D, 0xA0, 0x74, 0x2B, 0x08, 0x92, 0xEE, 0xD3, 0x97, - 0x8F, 0x1F, 0x9F, 0x1E, 0x1C, 0xD2, 0x9F, 0x67, 0x0F, 0x0F, 0x35, 0xCD, 0x36, 0xA5, 0x3A, 0xED, - 0xB6, 0x39, 0x0F, 0x96, 0xED, 0xF6, 0x52, 0x58, 0x04, 0x76, 0xD4, 0x54, 0xBA, 0xE4, 0x7C, 0x11, - 0x52, 0x41, 0x27, 0x3F, 0xC2, 0x0B, 0x38, 0x8F, 0x3A, 0x88, 0x2F, 0x5F, 0x93, 0x08, 0x2F, 0x0E, - 0x2E, 0xC2, 0xC4, 0x5C, 0x72, 0x7A, 0xC7, 0x9B, 0xF3, 0x98, 0x9C, 0x78, 0xBA, 0x08, 0x52, 0x0E, - 0x2F, 0xCD, 0xF2, 0x51, 0x50, 0x77, 0x81, 0xD9, 0xD5, 0x80, 0x3C, 0xFD, 0xDC, 0x6E, 0x04, 0xB9, - 0x08, 0x13, 0x7E, 0x40, 0x7A, 0xDF, 0xB5, 0x50, 0xBC, 0x15, 0x04, 0xE7, 0xED, 0xF6, 0xBC, 0xCB, - 0xB6, 0xB2, 0xDD, 0xF7, 0xBB, 0xA7, 0x7B, 0xE6, 0x2A, 0x28, 0xBE, 0xB7, 0x4F, 0x11, 0x9E, 0x2E, - 0x66, 0xC1, 0xB6, 0xA9, 0xC4, 0xAD, 0xAC, 0xCE, 0x46, 0xFC, 0x4B, 0x7C, 0x96, 0xD1, 0x6C, 0x1D, - 0x67, 0x16, 0x6C, 0xCB, 0x7C, 0xD7, 0x9B, 0x33, 0x65, 0xF1, 0x15, 0xE4, 0x71, 0x67, 0x81, 0x39, - 0xEF, 0x52, 0x09, 0x83, 0x92, 0xEE, 0x37, 0x66, 0x0A, 0xA3, 0xB7, 0x21, 0xF7, 0xB1, 0x00, 0x19, - 0xBD, 0x59, 0xC0, 0xF3, 0x5D, 0xDF, 0x96, 0x89, 0x9D, 0xF8, 0x42, 0x2E, 0x9F, 0xE6, 0xE2, 0x83, - 0x03, 0x1D, 0xEC, 0x20, 0xB2, 0xA7, 0x46, 0xF2, 0x2D, 0xFA, 0xC1, 0x92, 0x5C, 0x1D, 0x5F, 0x85, - 0x73, 0xDC, 0x7D, 0xDF, 0x59, 0xDD, 0x57, 0x1B, 0x8E, 0xEE, 0x00, 0xD3, 0xA9, 0x86, 0x65, 0x56, - 0x25, 0xAF, 0xBF, 0x11, 0xE7, 0x35, 0xC0, 0x0C, 0x44, 0x15, 0x94, 0xC2, 0xB6, 0x3F, 0xA6, 0xB0, - 0x61, 0x15, 0xD1, 0xB5, 0x35, 0x36, 0x59, 0x53, 0x16, 0x2D, 0xF9, 0x47, 0xDB, 0x8C, 0xA2, 0x15, - 0x7F, 0x12, 0x9B, 0xF0, 0x93, 0x9A, 0xA4, 0x99, 0xC5, 0xD6, 0x18, 0x77, 0xCF, 0xC8, 0x72, 0x69, - 0xDA, 0x68, 0x81, 0x16, 0x9D, 0x8B, 0x6D, 0x67, 0xDB, 0x2D, 0x94, 0x03, 0xEB, 0x6F, 0xC5, 0xE0, - 0x3E, 0x8C, 0x8E, 0x42, 0xF7, 0xD8, 0xAD, 0xDD, 0xBD, 0x8B, 0x49, 0x69, 0xC4, 0x83, 0x23, 0x5C, - 0xA6, 0xA2, 0xDB, 0x34, 0x14, 0x56, 0x37, 0x95, 0xD2, 0x6F, 0x68, 0x0D, 0x34, 0xA7, 0x91, 0xD9, - 0x13, 0x22, 0xDC, 0x3B, 0xCC, 0x84, 0xEC, 0x34, 0x66, 0xE0, 0x67, 0xC2, 0xD2, 0xD0, 0x79, 0xA7, - 0x63, 0x7D, 0x38, 0x8D, 0x1C, 0xC9, 0x94, 0xCC, 0x3E, 0x8C, 0xDA, 0x22, 0x9F, 0xA4, 0xBB, 0xAE, - 0xF0, 0x20, 0x43, 0xA2, 0x2A, 0xAA, 0x79, 0x63, 0xCA, 0x52, 0x30, 0x6E, 0x5C, 0x56, 0xF6, 0xA0, - 0x2C, 0x9F, 0xA4, 0xD5, 0x9A, 0x14, 0x05, 0x4F, 0x49, 0x67, 0x34, 0x0B, 0xD2, 0xFB, 0xFC, 0x52, - 0x75, 0x13, 0x9C, 0x63, 0xCF, 0x82, 0xEC, 0x3E, 0x2B, 0x0D, 0x91, 0x4E, 0x70, 0x91, 0xEB, 0x73, - 0x65, 0xA9, 0xED, 0xCF, 0x97, 0x93, 0xE2, 0x06, 0xD2, 0xA4, 0x13, 0x78, 0xB9, 0x37, 0xE8, 0x72, - 0x6E, 0x21, 0x2C, 0x16, 0x82, 0xAE, 0xF0, 0x4D, 0x57, 0x3D, 0x5B, 0xB9, 0x15, 0x09, 0x64, 0x14, - 0x7A, 0xA9, 0xEC, 0x06, 0x56, 0x57, 0xA5, 0x81, 0x31, 0xA6, 0xFE, 0x52, 0xFB, 0x7C, 0xF9, 0xFF, - 0x91, 0xF7, 0xE7, 0xDB, 0x8D, 0x23, 0xD9, 0x81, 0x30, 0xFE, 0x7F, 0x3F, 0x05, 0xC5, 0x2E, 0xB3, - 0x10, 0x62, 0x10, 0x02, 0xB8, 0x48, 0x4A, 0x52, 0x21, 0x9D, 0x4C, 0x65, 0x66, 0x57, 0x8E, 0x33, - 0xAB, 0xF2, 0x97, 0x99, 0xE5, 0xB2, 0x8F, 0x8A, 0x3F, 0x15, 0x44, 0x84, 0x48, 0x4C, 0x52, 0x00, - 0x0D, 0x80, 0x5A, 0x5A, 0xC4, 0x77, 0xC6, 0xED, 0xDD, 0x1E, 0x8F, 0xC7, 0x76, 0x57, 0x7B, 0x77, - 0xCF, 0xBE, 0xDB, 0xE3, 0x7D, 0x5F, 0xDE, 0xC5, 0x0F, 0xE0, 0xE3, 0x47, 0xF8, 0x4E, 0xAC, 0x88, - 0x00, 0x02, 0x20, 0x25, 0x55, 0x79, 0x3C, 0xE7, 0xEB, 0x3E, 0x95, 0x22, 0x62, 0xB9, 0x71, 0xE3, - 0xC6, 0x8D, 0x1B, 0x37, 0x22, 0x6E, 0xDC, 0x3B, 0x4A, 0xAB, 0x35, 0x67, 0x98, 0x6E, 0x7C, 0x0E, - 0x62, 0xBA, 0xB6, 0xB0, 0xCA, 0x69, 0x6D, 0x17, 0xFC, 0x40, 0xB7, 0x10, 0x52, 0xAF, 0x86, 0x39, - 0xCA, 0x00, 0xC6, 0x23, 0x31, 0xDA, 0x25, 0x8F, 0xD7, 0x41, 0x88, 0x5F, 0x52, 0x4E, 0x4E, 0x54, - 0xEF, 0xD7, 0xB7, 0xF2, 0x1A, 0xC3, 0xA4, 0x23, 0x6C, 0xCF, 0x60, 0x54, 0x8D, 0x86, 0x9D, 0x2C, - 0xCF, 0xA8, 0xA5, 0x9B, 0x15, 0xC3, 0xB8, 0xAD, 0x35, 0x71, 0x92, 0x8E, 0xB7, 0x67, 0x60, 0x14, - 0x30, 0x9F, 0x48, 0xD4, 0x95, 0x48, 0x1B, 0x45, 0xC2, 0x5D, 0x7F, 0xAA, 0x6E, 0xD4, 0xD3, 0xCD, - 0x36, 0xEA, 0xA9, 0x7A, 0x3A, 0x51, 0xA8, 0x13, 0xE4, 0x98, 0x38, 0xA4, 0xAD, 0xD4, 0x7E, 0xFB, - 0xEE, 0xCD, 0xB3, 0xC7, 0xAF, 0xD8, 0x19, 0x45, 0x41, 0xE9, 0x2F, 0x2D, 0x2C, 0x82, 0x1C, 0x58, - 0x4E, 0x0B, 0x75, 0xD5, 0xC1, 0x63, 0xF1, 0xBC, 0x5C, 0x46, 0x28, 0x2F, 0xAA, 0x9A, 0xA2, 0x80, - 0xB0, 0x6B, 0x20, 0x9D, 0x93, 0x1B, 0x09, 0xA9, 0xD4, 0xAB, 0x7A, 0x2A, 0xC4, 0x60, 0x94, 0xDA, - 0x7E, 0xEC, 0x5D, 0xF1, 0x2B, 0xF4, 0x44, 0x84, 0x47, 0xF0, 0xAD, 0xD4, 0x7E, 0xF7, 0xE6, 0xC5, - 0xE3, 0x8F, 0xBF, 0xF5, 0xF2, 0xD9, 0xE9, 0xDB, 0x77, 0x6F, 0x5E, 0xBC, 0x86, 0x7D, 0x98, 0x16, - 0x14, 0x62, 0x07, 0x26, 0x3B, 0x33, 0x1A, 0xEC, 0x82, 0x19, 0x1A, 0x4B, 0x5B, 0x10, 0x0A, 0x1C, - 0xE1, 0x62, 0xC0, 0x78, 0x03, 0xDA, 0x40, 0xBE, 0x9A, 0x47, 0x1D, 0x37, 0x33, 0xA3, 0xCC, 0x2F, - 0xEA, 0x70, 0x61, 0x03, 0x82, 0xF3, 0x0D, 0x08, 0xF5, 0x75, 0xAE, 0x6E, 0x40, 0xB0, 0xB6, 0x01, - 0x31, 0x50, 0x2B, 0x18, 0xE7, 0xBB, 0x12, 0x5C, 0xD8, 0x56, 0x68, 0x95, 0x71, 0x71, 0x57, 0x82, - 0x8B, 0xDB, 0x8A, 0xBB, 0x54, 0x7F, 0x57, 0x51, 0x5D, 0xEC, 0x4A, 0xB0, 0xBE, 0x2B, 0xC1, 0x6C, - 0x23, 0x22, 0xFF, 0xE8, 0xE4, 0x4F, 0x39, 0x6B, 0x04, 0x42, 0x09, 0x21, 0xC0, 0xA6, 0x38, 0xC4, - 0xB1, 0x97, 0xE2, 0x57, 0xC1, 0xE2, 0xC2, 0x5B, 0x68, 0x00, 0xCD, 0x5B, 0x94, 0x40, 0xF2, 0x0D, - 0x52, 0x00, 0xF2, 0x24, 0x32, 0xB6, 0x8A, 0xFD, 0x8A, 0x62, 0x0A, 0x2A, 0xAF, 0x42, 0x71, 0x96, - 0x15, 0xAF, 0x7D, 0xA7, 0x19, 0xDC, 0xEB, 0x3F, 0xD0, 0xD7, 0xF9, 0x1B, 0x3C, 0x49, 0xBD, 0x70, - 0x4A, 0xA4, 0xF8, 0xDA, 0xCB, 0xE4, 0x9E, 0xEB, 0x14, 0x2E, 0x93, 0xBB, 0xBD, 0x3D, 0x76, 0x99, - 0x4C, 0x6F, 0x95, 0x67, 0x68, 0x7F, 0x93, 0x7B, 0xE4, 0x39, 0x72, 0xE0, 0x04, 0x6D, 0xB9, 0xEA, - 0x75, 0x32, 0x9C, 0x22, 0x07, 0x5E, 0x22, 0x07, 0x9E, 0xCB, 0xAB, 0xE5, 0xE3, 0x0D, 0xAF, 0x96, - 0x61, 0xFC, 0xC0, 0xCB, 0x65, 0xEA, 0x59, 0x5B, 0xF8, 0x21, 0x89, 0xEF, 0x75, 0xB9, 0xEC, 0xEE, - 0x3A, 0x20, 0xCB, 0x3D, 0xDC, 0xC9, 0xC5, 0xA4, 0x78, 0x79, 0xEA, 0x6D, 0x70, 0x79, 0x1A, 0xDE, - 0xE3, 0xF2, 0x54, 0x84, 0x4E, 0xD9, 0xE0, 0xF2, 0xB4, 0xFA, 0xA6, 0x53, 0xDE, 0x9C, 0xF6, 0x1B, - 0xDE, 0xE9, 0x84, 0x5F, 0x0B, 0xAD, 0xBB, 0x38, 0x55, 0xAE, 0x6D, 0xEB, 0x2F, 0x2F, 0x95, 0x5B, - 0xA7, 0x4B, 0x09, 0x7D, 0x93, 0x4B, 0xC8, 0xBC, 0x77, 0x5F, 0xDF, 0x4D, 0xE3, 0x84, 0xDF, 0x65, - 0xE5, 0xFD, 0xCE, 0x9A, 0x86, 0x61, 0x58, 0x73, 0x4B, 0xA7, 0xF7, 0x6C, 0xC3, 0x4B, 0x36, 0xE5, - 0x26, 0xED, 0x52, 0x69, 0x7D, 0xE3, 0xF3, 0xF2, 0xF0, 0x41, 0xD7, 0x60, 0x45, 0x86, 0x0C, 0xEF, - 0x7D, 0x0D, 0x56, 0xBE, 0x4C, 0x0A, 0x8D, 0x97, 0x49, 0xE1, 0x5D, 0x2F, 0x93, 0xE6, 0x1B, 0x5E, - 0x26, 0x85, 0xF7, 0xBB, 0x42, 0x09, 0x4D, 0x97, 0x49, 0xA1, 0xAA, 0xB1, 0x84, 0xA5, 0xCB, 0xA4, - 0x50, 0x55, 0x4E, 0x0A, 0xD9, 0x73, 0x18, 0xEA, 0x57, 0x26, 0x61, 0xDD, 0x85, 0x40, 0x58, 0x79, - 0x21, 0xF0, 0x80, 0xCB, 0xA4, 0xAF, 0x86, 0x12, 0xA7, 0x26, 0x4A, 0x54, 0x5D, 0x26, 0x15, 0x28, - 0x52, 0x71, 0x99, 0x14, 0x6E, 0x7A, 0x99, 0x54, 0x66, 0xCB, 0xFB, 0x5D, 0x26, 0x85, 0x1B, 0x5F, - 0x26, 0xD5, 0x8D, 0x78, 0x95, 0x8E, 0x5A, 0x3D, 0xB2, 0x4E, 0xD5, 0xC8, 0x3A, 0xB0, 0x0B, 0xC3, - 0x7C, 0x48, 0x67, 0xB0, 0x54, 0x52, 0x9C, 0xE3, 0x3B, 0xD0, 0xAD, 0x6B, 0xC1, 0xAD, 0x6A, 0xC1, - 0x2D, 0xB6, 0xB0, 0xFE, 0x32, 0xC9, 0x8C, 0x80, 0x5B, 0x8F, 0x40, 0xB7, 0x0A, 0x81, 0x2E, 0xEC, - 0xEB, 0x08, 0xAC, 0xBF, 0x4C, 0x32, 0x23, 0x40, 0xAF, 0xD3, 0xB4, 0x93, 0x52, 0x1A, 0x56, 0x90, - 0x85, 0x36, 0xB1, 0x62, 0x9B, 0x0A, 0xCB, 0xC4, 0x1C, 0xB7, 0x48, 0x5D, 0xD3, 0xA5, 0xB3, 0x2F, - 0x5E, 0xD3, 0xC2, 0xD2, 0xE3, 0x8D, 0x01, 0x2E, 0xD6, 0xDB, 0xFC, 0x21, 0xBE, 0x81, 0x95, 0x7A, - 0x12, 0x0F, 0x29, 0x1C, 0x0B, 0x1F, 0x23, 0x86, 0x4D, 0x6F, 0xF5, 0x0E, 0x12, 0x6F, 0xBE, 0x83, - 0xC4, 0x5F, 0xC1, 0xAD, 0x08, 0x56, 0x99, 0x1A, 0x6F, 0xC6, 0xD4, 0x58, 0x9D, 0xC9, 0xC6, 0x3A, - 0xC6, 0x53, 0x6A, 0xFB, 0xE9, 0x8F, 0x7C, 0xFC, 0xF8, 0x95, 0x9C, 0xDA, 0xB8, 0x6A, 0xB7, 0x23, - 0xA4, 0x5A, 0x69, 0xD3, 0x53, 0xD4, 0xBA, 0x8B, 0x56, 0x7E, 0xEC, 0x00, 0x04, 0x14, 0xCF, 0x1C, - 0xD6, 0x8D, 0xD5, 0x26, 0x8A, 0xB5, 0x99, 0x0D, 0x84, 0xB7, 0xE9, 0x29, 0xE5, 0x5E, 0xE9, 0x45, - 0x63, 0x1E, 0xC5, 0xEF, 0x22, 0x6D, 0x35, 0xC2, 0x4A, 0x4C, 0x4F, 0x79, 0x3C, 0x6F, 0xC0, 0x25, - 0x7F, 0x8B, 0x2C, 0x13, 0x29, 0x9C, 0x9A, 0xC3, 0x7F, 0x87, 0xFE, 0xDF, 0xB4, 0x53, 0x5F, 0x7F, - 0x3E, 0x5E, 0xB2, 0x9E, 0x8F, 0xAE, 0xD6, 0x54, 0xE3, 0xE7, 0x8D, 0x5A, 0xBF, 0xC5, 0x3D, 0xC6, - 0x13, 0xD9, 0xC5, 0xA4, 0xEC, 0x1D, 0x5B, 0x1E, 0xF3, 0x15, 0x0F, 0x31, 0xD8, 0xF1, 0x04, 0xBF, - 0x9E, 0x98, 0xC1, 0x39, 0x9C, 0x40, 0x1F, 0x9E, 0xC2, 0x25, 0x9C, 0xC2, 0x4B, 0xE4, 0xD2, 0x7D, - 0x2B, 0x3B, 0xAA, 0x4A, 0xD9, 0x19, 0x56, 0xD2, 0x6E, 0xB3, 0xC7, 0x56, 0x64, 0x9B, 0x0A, 0x79, - 0xB8, 0x76, 0x38, 0x27, 0x9B, 0x85, 0x08, 0x39, 0xA3, 0xE8, 0x20, 0x65, 0x47, 0x5A, 0x51, 0xBB, - 0x0D, 0x26, 0xC8, 0x4A, 0xB6, 0xD9, 0x77, 0x3B, 0x02, 0xDB, 0xB1, 0xFD, 0xE6, 0xD9, 0xC7, 0x4F, - 0x9F, 0xBD, 0x39, 0x7D, 0xF5, 0xC9, 0xD3, 0x67, 0x2F, 0x4F, 0x5F, 0x7C, 0xFC, 0xF4, 0xC5, 0xF1, - 0x0B, 0x2E, 0x68, 0x8E, 0x9F, 0xBD, 0x7C, 0x09, 0x7D, 0xC4, 0xBA, 0x99, 0x9C, 0x4C, 0xDA, 0x85, - 0xC2, 0x4F, 0xBE, 0x75, 0xFA, 0xC9, 0xF3, 0xE7, 0x6F, 0x9F, 0xBD, 0x1B, 0xC3, 0xD3, 0xEA, 0x52, - 0xCF, 0xF3, 0x52, 0x4B, 0xB4, 0xB5, 0x65, 0xED, 0xEE, 0xB9, 0xCE, 0xFE, 0xFE, 0x6E, 0xBF, 0x75, - 0x0A, 0xA0, 0xE5, 0x6F, 0x21, 0xE4, 0xAD, 0x56, 0xA7, 0x5B, 0x08, 0xCD, 0x5A, 0x2D, 0x6B, 0xBE, - 0x5A, 0x2D, 0x01, 0x68, 0xB5, 0x2C, 0xCB, 0x61, 0x19, 0x73, 0xE6, 0x44, 0x7F, 0x46, 0xD2, 0xA6, - 0x68, 0x7F, 0xFB, 0xB2, 0xDD, 0xD6, 0xE4, 0x4C, 0xCE, 0x27, 0x01, 0x9C, 0xC2, 0x19, 0xF4, 0x60, - 0x08, 0x23, 0x98, 0x50, 0x7B, 0xF8, 0x08, 0x7A, 0xC8, 0x87, 0x33, 0x74, 0x0A, 0xE7, 0x68, 0x09, - 0x46, 0x0F, 0x01, 0xC9, 0xE8, 0x45, 0xE0, 0x66, 0x01, 0x3F, 0x52, 0xBC, 0xCC, 0x4A, 0xE5, 0xF9, - 0xBE, 0x0A, 0x46, 0x64, 0xD4, 0x98, 0x2B, 0x2D, 0x32, 0x04, 0xB2, 0xC3, 0x01, 0xE0, 0x2F, 0xBF, - 0x06, 0x4E, 0xAF, 0xE7, 0xEE, 0xF6, 0xF7, 0x5B, 0x01, 0x7F, 0xEC, 0xE5, 0xEE, 0xEE, 0xED, 0xED, - 0x75, 0xDD, 0x5D, 0x1A, 0x43, 0xA0, 0xD1, 0xEB, 0x0D, 0x06, 0xFD, 0x7E, 0xAF, 0x3B, 0x9C, 0x23, - 0x83, 0x58, 0x66, 0xF2, 0xDB, 0xF6, 0xC2, 0x24, 0x38, 0xE9, 0x0E, 0x06, 0xAD, 0x60, 0x6C, 0xC7, - 0xD3, 0x33, 0x4F, 0x71, 0x00, 0xD3, 0x10, 0xF0, 0x87, 0x73, 0x64, 0x71, 0xD0, 0x83, 0x56, 0x00, - 0x0E, 0x0E, 0xF6, 0x79, 0x29, 0xF1, 0xA2, 0xAA, 0xAE, 0x81, 0x3C, 0x76, 0x2D, 0x85, 0x9F, 0x51, - 0xAB, 0xBE, 0x62, 0x07, 0xE2, 0xAF, 0xA0, 0x03, 0xF1, 0x86, 0x1D, 0x88, 0xEF, 0xD8, 0x81, 0x5C, - 0xBC, 0x50, 0xF8, 0x64, 0xF3, 0xEC, 0x64, 0x58, 0x3D, 0x99, 0x63, 0x47, 0x5A, 0x07, 0x69, 0xBB, - 0x4F, 0x3D, 0x5E, 0x2B, 0x67, 0xE6, 0x74, 0x87, 0x89, 0xAF, 0x17, 0x5E, 0xE8, 0xAB, 0x42, 0x0B, - 0x68, 0xA5, 0x6A, 0x44, 0x85, 0x2E, 0x75, 0xF6, 0x01, 0x80, 0x3E, 0x8A, 0x36, 0x91, 0x3E, 0xA7, - 0x68, 0xB6, 0x91, 0xB4, 0x59, 0x22, 0x6B, 0x7E, 0x78, 0xD8, 0xED, 0xB7, 0xBA, 0x83, 0x01, 0xD8, - 0xE9, 0x0E, 0x06, 0x70, 0x4A, 0x53, 0xDC, 0xDD, 0x3C, 0xE5, 0x92, 0xA6, 0xEC, 0xE7, 0x09, 0xE7, - 0x68, 0x6B, 0xD2, 0x6A, 0xB9, 0xBD, 0x7E, 0xD7, 0xDD, 0xDB, 0xEB, 0xEE, 0xB7, 0xE2, 0xA3, 0xD0, - 0x7E, 0xFA, 0xE2, 0xD5, 0xE9, 0x27, 0xAF, 0x1F, 0x1F, 0xBF, 0x78, 0xF7, 0x23, 0x43, 0x17, 0x96, - 0x65, 0x6D, 0xA1, 0xC7, 0x54, 0x10, 0x59, 0x5E, 0x27, 0x02, 0x9B, 0xCB, 0xD2, 0x35, 0x3D, 0x21, - 0x52, 0x0D, 0x9E, 0x83, 0xAC, 0xD0, 0xAC, 0x7E, 0x81, 0x4B, 0xC4, 0x20, 0xB8, 0xA5, 0xB1, 0x06, - 0x83, 0x4D, 0x6F, 0x8D, 0xD2, 0xB6, 0x3B, 0x46, 0xC9, 0xC6, 0xD7, 0x45, 0x69, 0xBB, 0x3B, 0x46, - 0xF1, 0xE6, 0xC0, 0x7B, 0x63, 0x14, 0xDD, 0x01, 0x78, 0x7F, 0x8C, 0x42, 0xFA, 0x63, 0x30, 0x46, - 0x1E, 0xFD, 0xB1, 0x3B, 0x46, 0x0C, 0xD2, 0xDE, 0x18, 0xCD, 0x33, 0xC3, 0x0A, 0xA7, 0xD1, 0xE0, - 0xFF, 0xFE, 0xDE, 0x9F, 0x38, 0x63, 0x41, 0x80, 0xF0, 0xC4, 0x1D, 0x0B, 0x1A, 0x84, 0x27, 0xDD, - 0xB1, 0x20, 0x43, 0x78, 0xD2, 0x1B, 0x67, 0x66, 0x75, 0x21, 0x8F, 0xD9, 0x5D, 0xDA, 0xD7, 0x5A, - 0x98, 0xCE, 0x70, 0x7D, 0x3E, 0xC8, 0x44, 0x75, 0x4A, 0xC8, 0x44, 0x65, 0x56, 0x58, 0xEC, 0x2D, - 0x2F, 0x49, 0xA7, 0x09, 0x63, 0x1A, 0xA8, 0xB9, 0x7C, 0xC2, 0x77, 0x9C, 0xC1, 0x9E, 0xFB, 0x40, - 0x7F, 0xBF, 0x0C, 0xD8, 0xAB, 0xC8, 0xC7, 0x73, 0x94, 0xDA, 0xC7, 0x9F, 0xBC, 0x7A, 0xF2, 0x82, - 0xA8, 0x6E, 0xC7, 0x1F, 0x3D, 0x7E, 0x73, 0xFA, 0xE4, 0xC5, 0xBB, 0xD3, 0x57, 0x8F, 0xDF, 0xFE, - 0x20, 0x4A, 0xF5, 0x05, 0xF4, 0xD9, 0x0F, 0xBF, 0xE3, 0x2B, 0x68, 0x31, 0x47, 0x2E, 0xAD, 0xC5, - 0x8C, 0x27, 0x55, 0x19, 0xA5, 0xF5, 0xDD, 0x10, 0xCC, 0xFB, 0xD1, 0x2E, 0x18, 0xAD, 0xAD, 0xD6, - 0x87, 0x95, 0x4D, 0xBA, 0xC5, 0xAC, 0x1C, 0xCD, 0x6E, 0x31, 0x4B, 0xE9, 0x5B, 0x0F, 0x56, 0x12, - 0xA4, 0xEB, 0xF6, 0xF7, 0xFA, 0xFB, 0xBD, 0xDD, 0xFE, 0x7E, 0x81, 0x84, 0x95, 0xEE, 0x8F, 0xA9, - 0x2E, 0x22, 0x77, 0xFB, 0xCA, 0x2B, 0x15, 0x9A, 0xAB, 0x5C, 0xC1, 0x54, 0x96, 0x49, 0x84, 0x07, - 0x1E, 0xD5, 0x23, 0xB4, 0x74, 0xCB, 0xA3, 0x20, 0x01, 0x54, 0x27, 0x5C, 0x41, 0x1E, 0xC8, 0x0B, - 0x6F, 0x07, 0xDB, 0xEB, 0xC8, 0x38, 0x4A, 0xC4, 0x75, 0x09, 0x45, 0x38, 0x8F, 0xAA, 0x50, 0xD3, - 0x89, 0x64, 0x83, 0x4E, 0x04, 0xA0, 0xE0, 0x77, 0x86, 0x81, 0xE7, 0xF7, 0xCF, 0x06, 0x32, 0xE4, - 0x59, 0x59, 0x96, 0xC1, 0xDD, 0xDD, 0xDD, 0x87, 0xB1, 0x39, 0x75, 0x7E, 0xE5, 0x1F, 0xE3, 0xF9, - 0x9C, 0xEC, 0x87, 0x50, 0xCA, 0x9E, 0x7E, 0x55, 0x9F, 0x95, 0xEF, 0x77, 0x85, 0x97, 0xEB, 0x3D, - 0x1E, 0x65, 0x78, 0xB7, 0xBB, 0xC7, 0xCE, 0xCA, 0x07, 0xBB, 0xDA, 0x51, 0x79, 0x60, 0xB9, 0xFD, - 0x3D, 0x00, 0xE7, 0x28, 0xB0, 0xF6, 0xF6, 0xBB, 0x00, 0x4E, 0xC4, 0x6B, 0x2D, 0x9F, 0x94, 0xE9, - 0x0F, 0x00, 0x3C, 0x15, 0x27, 0xED, 0x4B, 0x14, 0x58, 0x8F, 0x76, 0x07, 0x00, 0x4E, 0x49, 0xE1, - 0x7E, 0x17, 0xC0, 0x4B, 0x14, 0x58, 0xFD, 0x5D, 0x17, 0xC0, 0x73, 0x92, 0xD2, 0xEB, 0x01, 0x78, - 0xCC, 0xCF, 0xE7, 0xF9, 0xE1, 0xF9, 0x42, 0x1E, 0x9E, 0x9F, 0xD6, 0x1F, 0x9E, 0xCF, 0xE0, 0x84, - 0x2E, 0x5C, 0x0B, 0x78, 0xB1, 0xF6, 0x18, 0x7D, 0xA2, 0xBB, 0x04, 0x93, 0xCE, 0xF3, 0x95, 0xEC, - 0xB7, 0xC1, 0xB7, 0xE5, 0x51, 0x7A, 0xA0, 0x78, 0xDD, 0x79, 0x42, 0x54, 0x8A, 0xBC, 0x8A, 0x5C, - 0x50, 0x4B, 0x5E, 0xCB, 0x97, 0xE6, 0xA8, 0xC6, 0x53, 0xD3, 0x59, 0xBD, 0x88, 0xE7, 0x73, 0x41, - 0xA7, 0x10, 0x61, 0x9D, 0x63, 0x75, 0x52, 0xF1, 0xDC, 0xAB, 0x28, 0x7E, 0x4F, 0x06, 0x90, 0x16, - 0x98, 0xDB, 0x62, 0x2C, 0x0B, 0xAE, 0xA7, 0x55, 0xCB, 0x40, 0x43, 0x48, 0x48, 0xDF, 0x1C, 0x12, - 0xB2, 0xAA, 0xAE, 0x11, 0x2C, 0x73, 0x2E, 0x2E, 0xDB, 0x7D, 0xEC, 0xFB, 0x6A, 0xEE, 0x31, 0x5D, - 0x69, 0x36, 0x6F, 0xBA, 0xA6, 0x7A, 0x15, 0xF0, 0x02, 0x02, 0x6F, 0xA8, 0xE3, 0x95, 0x87, 0xE0, - 0x50, 0x0F, 0xA1, 0xA6, 0x89, 0x12, 0x26, 0x3F, 0xBA, 0xC4, 0x49, 0xFA, 0x06, 0xFB, 0xB1, 0x77, - 0x75, 0x97, 0xE6, 0x4B, 0xD5, 0x8A, 0xC0, 0x0A, 0x0D, 0x1D, 0x47, 0x61, 0x8A, 0xAF, 0xD3, 0x97, - 0x51, 0x72, 0x97, 0x41, 0x2E, 0x56, 0xD2, 0x01, 0xA9, 0x4D, 0xDC, 0xE5, 0x14, 0x2A, 0x8F, 0xC2, - 0xC3, 0x8E, 0x34, 0x68, 0xBA, 0xF0, 0xFD, 0x9A, 0x9F, 0xDB, 0x13, 0x81, 0x47, 0xB3, 0xDE, 0xE0, - 0x24, 0x9A, 0x5F, 0x72, 0xBF, 0xA2, 0x31, 0xE5, 0x63, 0x2D, 0xBD, 0xF0, 0x3C, 0x5A, 0x9D, 0x1B, - 0xF9, 0x1A, 0x50, 0x35, 0xEF, 0x2A, 0xA7, 0xAA, 0x61, 0xDE, 0xA9, 0xDE, 0xB4, 0x2A, 0x5E, 0xBF, - 0xCF, 0x98, 0xF1, 0x06, 0x99, 0x8A, 0x2F, 0xBD, 0x1B, 0x1C, 0x27, 0x88, 0xBE, 0xB4, 0x3C, 0xB7, - 0x5F, 0x06, 0xE1, 0xFB, 0x37, 0x79, 0xBA, 0xEA, 0x60, 0x94, 0x85, 0xE7, 0xE5, 0x47, 0x46, 0xF2, - 0x00, 0xBC, 0xD0, 0x1D, 0x5A, 0x72, 0x1E, 0x84, 0xEF, 0x69, 0x24, 0xE3, 0x6E, 0x35, 0xDA, 0x26, - 0x81, 0xC1, 0x9E, 0x76, 0x5E, 0xDA, 0xCC, 0x37, 0xA8, 0x8A, 0x06, 0x86, 0x95, 0x88, 0xF4, 0xCC, - 0x5C, 0x5A, 0xDD, 0xF2, 0xC4, 0xDC, 0x36, 0xF7, 0x26, 0xA4, 0x1C, 0x3C, 0xD1, 0x73, 0x6E, 0xB6, - 0x1C, 0x33, 0x5C, 0xF2, 0x83, 0x2A, 0x20, 0x85, 0x30, 0xD3, 0x43, 0x5F, 0x07, 0xD7, 0x78, 0x4E, - 0x43, 0x1A, 0xA2, 0xAA, 0x76, 0x6D, 0x7F, 0x11, 0x6B, 0xDB, 0x7F, 0xD5, 0x1F, 0x42, 0x81, 0x3B, - 0xA7, 0xA5, 0xD8, 0xA9, 0x45, 0x66, 0xE4, 0x0E, 0x3D, 0x59, 0xB6, 0xAF, 0xF1, 0x23, 0x9B, 0xE1, - 0x7E, 0x34, 0xA1, 0xC1, 0x6C, 0x78, 0x07, 0x38, 0xB5, 0xAC, 0x26, 0xCB, 0x6E, 0x8A, 0x8B, 0x8A, - 0x6B, 0x74, 0x4B, 0xC3, 0x82, 0xCC, 0x03, 0x8F, 0xC6, 0x06, 0xF6, 0xF1, 0x22, 0x9D, 0x91, 0x1F, - 0x8B, 0x18, 0x27, 0x38, 0xBE, 0xC4, 0x4F, 0x63, 0xEF, 0x2A, 0x08, 0xA7, 0xEC, 0xF4, 0x71, 0x78, - 0x91, 0x8D, 0x82, 0x73, 0x79, 0x48, 0x88, 0xD4, 0x16, 0x99, 0x3B, 0x00, 0x3A, 0xEB, 0xAC, 0x26, - 0x7D, 0x48, 0xDE, 0x6D, 0xC2, 0x6B, 0x00, 0xB7, 0x44, 0xE9, 0xB2, 0x6B, 0xB1, 0xCF, 0xF0, 0xD9, - 0xB7, 0x5E, 0x76, 0x69, 0x08, 0xCE, 0x64, 0xB9, 0x58, 0x44, 0x71, 0x8A, 0xFD, 0x46, 0xB3, 0x2D, - 0x2B, 0x94, 0xEF, 0x45, 0x68, 0x28, 0xB3, 0x7C, 0xBD, 0x7C, 0x1A, 0x5D, 0x08, 0x97, 0x54, 0xC0, - 0x52, 0x91, 0x81, 0x0C, 0x83, 0x09, 0xC3, 0x67, 0x1E, 0x25, 0x69, 0x13, 0xD2, 0x63, 0x65, 0x25, - 0x52, 0xBB, 0x55, 0x2A, 0xD3, 0xA0, 0x92, 0xA2, 0x11, 0xE3, 0x09, 0x0E, 0x2E, 0xB1, 0xDF, 0x04, - 0x10, 0xDB, 0x8B, 0x98, 0x26, 0x3E, 0x65, 0xC7, 0x00, 0x8A, 0x4F, 0x42, 0x5A, 0xEB, 0x0D, 0x4E, - 0x52, 0x3E, 0x51, 0xDF, 0x05, 0x17, 0x38, 0x5A, 0xA6, 0x28, 0xC1, 0x29, 0xFF, 0xC9, 0x46, 0xED, - 0x76, 0x5D, 0x05, 0xEE, 0x69, 0x44, 0x77, 0x7A, 0x43, 0x51, 0x6B, 0xF0, 0x4A, 0x94, 0x42, 0x31, - 0xAD, 0x89, 0xFD, 0x51, 0xE3, 0x3C, 0x88, 0x83, 0x70, 0xDA, 0xD0, 0x84, 0x5C, 0x13, 0x98, 0x64, - 0xA8, 0x8C, 0xD7, 0x00, 0x60, 0x0F, 0xF7, 0x14, 0x5F, 0x52, 0x0F, 0xA7, 0xA9, 0x40, 0xA7, 0x40, - 0x57, 0x05, 0xFB, 0x42, 0xC1, 0x32, 0x71, 0x99, 0x87, 0x3E, 0x4E, 0xAB, 0x35, 0x54, 0x5A, 0x4F, - 0x77, 0x4E, 0x46, 0x7A, 0xD3, 0x14, 0xF3, 0x65, 0x8D, 0x89, 0xA6, 0xE7, 0x71, 0x74, 0x41, 0xCF, - 0x8E, 0x41, 0x41, 0x04, 0x0B, 0xA0, 0x41, 0x18, 0xD0, 0x29, 0xF0, 0x6D, 0x4C, 0x39, 0x92, 0x3A, - 0x47, 0xB2, 0xF2, 0xE7, 0x83, 0x8A, 0x54, 0x11, 0xA7, 0xC6, 0x56, 0x05, 0x2D, 0x43, 0x3B, 0x3A, - 0x63, 0xD3, 0x26, 0x17, 0x0B, 0xAA, 0xD4, 0xD0, 0xE8, 0x59, 0x29, 0x29, 0x98, 0x7F, 0x0D, 0x68, - 0x71, 0xEF, 0xFF, 0xAC, 0x5C, 0x82, 0x53, 0xB6, 0x36, 0x1B, 0x41, 0xD3, 0xA2, 0x8A, 0x10, 0x28, - 0xC9, 0x49, 0xDB, 0x5B, 0x2C, 0x70, 0xE8, 0x1F, 0xCF, 0x82, 0xB9, 0xAF, 0xA1, 0x01, 0xE0, 0x89, - 0xE8, 0x68, 0x61, 0x1F, 0x2A, 0xAF, 0x38, 0x15, 0x9B, 0x16, 0x11, 0xE0, 0xBA, 0x96, 0x64, 0x41, - 0xC2, 0x1C, 0x2D, 0x61, 0xBF, 0x5A, 0x1A, 0x72, 0x1F, 0x22, 0x52, 0x4C, 0x9D, 0x45, 0xFE, 0x8D, - 0x4D, 0x46, 0xD7, 0x0B, 0xC2, 0xA4, 0x72, 0xD9, 0x31, 0x90, 0xFC, 0xD4, 0x74, 0xAF, 0xC8, 0xC2, - 0x52, 0x98, 0xED, 0xAE, 0xD4, 0x65, 0x4F, 0xF5, 0x0B, 0x36, 0x12, 0x31, 0xF3, 0xB0, 0x2E, 0xD7, - 0x74, 0xDF, 0x2A, 0x4A, 0xD0, 0x3C, 0xBC, 0x5A, 0x09, 0xEF, 0x78, 0x26, 0xB2, 0xDE, 0x89, 0x13, - 0xE9, 0x9D, 0x95, 0x70, 0x97, 0xAE, 0x38, 0xB4, 0x64, 0xFD, 0x28, 0x04, 0xF5, 0x93, 0x08, 0xCE, - 0xBC, 0x98, 0x16, 0xD4, 0xB0, 0x12, 0xA1, 0xFC, 0x30, 0xB7, 0x62, 0x72, 0x84, 0x59, 0x54, 0x66, - 0x52, 0x64, 0x6E, 0x05, 0x51, 0xA8, 0xD3, 0xCD, 0x63, 0x01, 0x31, 0x17, 0x74, 0x64, 0x92, 0x52, - 0x75, 0xDD, 0xDA, 0x72, 0xC4, 0xED, 0xCE, 0xD3, 0xC2, 0xA2, 0x57, 0x00, 0x56, 0x5C, 0x13, 0xA5, - 0xA5, 0x9E, 0x79, 0x55, 0xCC, 0x5D, 0xD9, 0xDD, 0x7D, 0x2D, 0xD5, 0x6E, 0x9B, 0x0C, 0x27, 0xA2, - 0xA6, 0x93, 0x53, 0x50, 0xB8, 0xA4, 0x52, 0xFC, 0x0B, 0x56, 0xAD, 0xCC, 0x5C, 0x4D, 0x8B, 0xEF, - 0xD6, 0xCE, 0x46, 0xFC, 0x67, 0x84, 0x59, 0xD4, 0x45, 0x84, 0xB5, 0xB1, 0x7A, 0x38, 0x86, 0x0A, - 0x65, 0x8C, 0x07, 0x68, 0x5A, 0x35, 0x76, 0x4A, 0xB6, 0xA6, 0x9E, 0x76, 0xC9, 0xC4, 0xD3, 0x92, - 0xF4, 0x66, 0xCE, 0x7D, 0x31, 0xA3, 0x2F, 0x3E, 0xB8, 0x2D, 0x02, 0xA0, 0x5E, 0x6C, 0x94, 0x56, - 0xB3, 0xC5, 0xF5, 0x17, 0x26, 0x00, 0xBC, 0xFD, 0x7A, 0x08, 0xAC, 0x90, 0x0A, 0xA2, 0x2C, 0xCB, - 0x1E, 0x80, 0x4F, 0x15, 0xB0, 0xFB, 0xE1, 0x56, 0x92, 0x99, 0xB6, 0x7E, 0x9F, 0x59, 0x1C, 0xC6, - 0xCA, 0x6A, 0xFA, 0xAD, 0xA9, 0x49, 0xF2, 0x6E, 0x06, 0x59, 0xAF, 0x62, 0x84, 0xBA, 0xD1, 0x54, - 0x77, 0xC5, 0x1C, 0x39, 0xE6, 0x87, 0x06, 0x52, 0xD3, 0xBC, 0xBD, 0xFF, 0xBC, 0xE3, 0x20, 0x9F, - 0x30, 0xE7, 0xF3, 0x9B, 0x4C, 0x0E, 0xA5, 0x42, 0x41, 0x60, 0x8E, 0xEA, 0x57, 0x67, 0x56, 0xF1, - 0x39, 0xF7, 0x66, 0xBF, 0x79, 0x53, 0xAC, 0xC6, 0x7D, 0xDA, 0x2A, 0x04, 0x0C, 0xF1, 0x85, 0xB9, - 0x6E, 0xDE, 0x76, 0x52, 0xD1, 0xB6, 0xA0, 0x66, 0x09, 0x42, 0x41, 0x26, 0x30, 0x80, 0x23, 0xE3, - 0xBE, 0xD1, 0x66, 0x92, 0xCB, 0x5C, 0x65, 0x8D, 0x26, 0xC3, 0x07, 0x5A, 0x0D, 0x1F, 0xB3, 0x39, - 0xC1, 0x94, 0x6A, 0xC5, 0x25, 0xAD, 0x62, 0xAB, 0xB2, 0x4E, 0xD4, 0x96, 0xF9, 0x33, 0xAB, 0x50, - 0x37, 0xD8, 0xEA, 0x08, 0x4B, 0x41, 0x6F, 0xC5, 0xFA, 0x58, 0x9A, 0x66, 0xA5, 0xD5, 0x3B, 0x77, - 0x35, 0x5E, 0x0C, 0x98, 0xAB, 0x4D, 0x24, 0x2D, 0x54, 0xEE, 0x6A, 0x95, 0x96, 0x5C, 0x94, 0x97, - 0x5A, 0x32, 0x9C, 0x5E, 0x4C, 0xCB, 0x27, 0xFD, 0xE6, 0x23, 0x81, 0x69, 0x49, 0xFC, 0x9B, 0xF6, - 0xAB, 0xC6, 0x19, 0x6F, 0x68, 0x76, 0xA9, 0x1B, 0x25, 0x6F, 0xDA, 0x24, 0xD0, 0x9E, 0x5B, 0x96, - 0xA4, 0xC0, 0xDD, 0x94, 0xC6, 0xCC, 0x30, 0xA8, 0x5C, 0xB5, 0x11, 0xDB, 0xC9, 0xBA, 0x67, 0x82, - 0x07, 0xC8, 0xE1, 0xB6, 0xFC, 0x15, 0xA5, 0x98, 0x5C, 0x3E, 0x40, 0x8E, 0x08, 0x80, 0x46, 0x46, - 0xCB, 0x2A, 0x29, 0xA3, 0x5B, 0x2E, 0x90, 0x0F, 0x4A, 0xA8, 0x76, 0xE6, 0x4D, 0x7E, 0x74, 0x19, - 0xC4, 0xDA, 0xF9, 0x57, 0x51, 0x33, 0x33, 0x1E, 0x77, 0x2A, 0x51, 0xA3, 0x0C, 0x43, 0xC3, 0xAF, - 0x85, 0x8B, 0x14, 0xAD, 0xBA, 0xB5, 0xDC, 0xC0, 0xD8, 0xA3, 0x8E, 0x38, 0xB5, 0x25, 0xF4, 0xC5, - 0xDC, 0xA8, 0x47, 0x49, 0xD5, 0x42, 0x0C, 0x0D, 0xD1, 0xD6, 0x5A, 0x2D, 0xAB, 0x52, 0xD9, 0x54, - 0x94, 0xED, 0xEA, 0xE9, 0x24, 0x37, 0xA3, 0xE5, 0x53, 0x56, 0xBA, 0x27, 0x4D, 0x8B, 0xCA, 0x29, - 0x80, 0x95, 0xCD, 0x20, 0xAA, 0xE5, 0x4F, 0xC9, 0xF2, 0x47, 0xC1, 0xD3, 0x9B, 0x07, 0x55, 0xE5, - 0x3F, 0xB1, 0x1C, 0xE8, 0xDB, 0xE7, 0x51, 0x7C, 0xE5, 0xC5, 0xCC, 0xA9, 0x35, 0xB0, 0xD2, 0xAA, - 0x23, 0xD8, 0xFA, 0xF3, 0x5D, 0xAA, 0xB6, 0x9B, 0x60, 0x55, 0x9D, 0x94, 0xAE, 0x3D, 0xAD, 0x05, - 0xF9, 0x9B, 0x68, 0xD9, 0x37, 0xED, 0x48, 0x9E, 0x51, 0xE5, 0xCA, 0x8B, 0x2F, 0x3E, 0x5D, 0x54, - 0x2F, 0xFD, 0x6C, 0xD6, 0x14, 0xF5, 0xFE, 0x4C, 0x5D, 0xB4, 0xA5, 0x49, 0x14, 0x5B, 0x1B, 0x84, - 0x93, 0x4E, 0x2C, 0xDE, 0xC1, 0xE8, 0x30, 0xC5, 0x13, 0x2C, 0x93, 0x1B, 0x7D, 0x36, 0x35, 0x37, - 0xDB, 0x6E, 0x90, 0x71, 0x57, 0x61, 0x54, 0xEC, 0x1C, 0xD6, 0xAC, 0x41, 0x85, 0xD8, 0x05, 0x5A, - 0xD5, 0x4D, 0xD5, 0x68, 0x9C, 0x96, 0x96, 0xA0, 0xB5, 0x01, 0x5D, 0x3A, 0x6E, 0x7D, 0x4C, 0x16, - 0xFE, 0xA2, 0xDC, 0xE5, 0xF6, 0x84, 0x6F, 0xA2, 0x2B, 0x1E, 0xF7, 0x22, 0x7F, 0xAF, 0x96, 0x0B, - 0x18, 0x96, 0x6A, 0x7D, 0xD5, 0x7B, 0x5E, 0x31, 0x7E, 0x85, 0xFB, 0x1B, 0x36, 0xFD, 0xAB, 0x32, - 0x85, 0x43, 0x49, 0xFE, 0x8E, 0xEE, 0xCE, 0x6B, 0x6E, 0x79, 0x2B, 0xBF, 0xE5, 0x64, 0xF9, 0x40, - 0x04, 0x15, 0x03, 0x11, 0xF0, 0x05, 0xE3, 0x5B, 0x71, 0xE0, 0x57, 0xAB, 0x31, 0x42, 0xE6, 0xE8, - 0x1C, 0xA9, 0xBE, 0xCE, 0x97, 0xDD, 0x32, 0x31, 0x11, 0xEB, 0x06, 0x67, 0xFA, 0x3C, 0x7A, 0x44, - 0x59, 0xAB, 0x16, 0x46, 0xA0, 0xC6, 0x49, 0xC5, 0x33, 0x95, 0x29, 0x23, 0x8D, 0x03, 0x73, 0xD0, - 0xB7, 0xFA, 0xE3, 0x3F, 0xEA, 0x4B, 0x97, 0xD9, 0xCC, 0x29, 0xE6, 0x22, 0xB9, 0xCD, 0x1C, 0x3C, - 0x87, 0x0B, 0x5E, 0x54, 0x5C, 0x6B, 0x51, 0xEE, 0x8D, 0x11, 0x1E, 0xC5, 0x07, 0x54, 0xAE, 0x46, - 0x28, 0x6E, 0x07, 0xDC, 0x86, 0xD3, 0xBE, 0x21, 0x12, 0x13, 0x86, 0x48, 0x26, 0xB0, 0x98, 0xF7, - 0x53, 0x9C, 0x5A, 0x11, 0x80, 0x21, 0x18, 0xC5, 0xFC, 0xD1, 0xA8, 0x3A, 0xB1, 0xD5, 0x77, 0x7D, - 0xF1, 0x18, 0x39, 0xD0, 0x53, 0x26, 0x68, 0xF9, 0xFE, 0x8F, 0x40, 0xE3, 0xD7, 0xA4, 0x22, 0x3F, - 0x21, 0xD0, 0x2F, 0x91, 0x33, 0xBA, 0x3C, 0x08, 0x98, 0xC1, 0xDE, 0x65, 0xBB, 0x0D, 0x82, 0x73, - 0x4B, 0x5C, 0xA0, 0x94, 0x2E, 0x35, 0xC8, 0xFC, 0x5A, 0xCE, 0x53, 0xFB, 0x6C, 0x0A, 0x43, 0x1A, - 0x1F, 0x83, 0xBA, 0x37, 0xB8, 0x84, 0x0B, 0x16, 0xAC, 0xFF, 0xB2, 0xD5, 0xDA, 0xA4, 0x2E, 0x80, - 0x33, 0xB4, 0xE5, 0xC2, 0x39, 0xBA, 0x84, 0x9E, 0x70, 0x5A, 0xE0, 0xB4, 0x5A, 0x97, 0x08, 0x21, - 0xEF, 0xC4, 0x19, 0x9F, 0x38, 0xE3, 0x56, 0xCB, 0x9A, 0xA1, 0x2D, 0x07, 0xFA, 0xC8, 0xB3, 0x93, - 0x59, 0x70, 0x9E, 0x5A, 0x00, 0x2E, 0xE8, 0x8D, 0xCA, 0x85, 0xB5, 0x80, 0xA1, 0x9D, 0xC6, 0x5E, - 0x98, 0xCC, 0xBD, 0x14, 0xBF, 0xE3, 0x41, 0xD3, 0x2D, 0x52, 0xF8, 0xC4, 0x19, 0x43, 0xFF, 0xC4, - 0x1D, 0x03, 0xFA, 0x6F, 0x87, 0x7C, 0x03, 0x38, 0x47, 0xF4, 0xC3, 0x05, 0xF0, 0x14, 0x2D, 0xE8, - 0xE9, 0xF4, 0xCC, 0x8B, 0x09, 0x67, 0x2F, 0xF9, 0x27, 0x0D, 0x70, 0x07, 0xA7, 0xC8, 0x8A, 0xB7, - 0x19, 0x15, 0xDA, 0x97, 0x60, 0xFB, 0x78, 0x9D, 0x99, 0x62, 0x4D, 0x27, 0xC9, 0x0F, 0x6B, 0x01, - 0x2F, 0x61, 0x04, 0xE0, 0x72, 0x0B, 0xA1, 0x49, 0xC9, 0x91, 0x43, 0xDD, 0x38, 0x5E, 0xB6, 0x5D, - 0x00, 0xB5, 0x02, 0xCC, 0xCE, 0x71, 0x3A, 0xDE, 0x42, 0x68, 0x29, 0x1C, 0x59, 0x68, 0x39, 0xED, - 0xE3, 0x2A, 0x3B, 0xC9, 0xFC, 0xC8, 0xA5, 0x7A, 0x34, 0x36, 0x02, 0xF9, 0xFC, 0x0E, 0x20, 0xCF, - 0x37, 0x03, 0x99, 0x9B, 0x62, 0x6C, 0x00, 0x13, 0x5F, 0x13, 0x01, 0x68, 0x9D, 0x4A, 0x1F, 0x17, - 0xAD, 0x96, 0xB5, 0x5C, 0xA1, 0xE3, 0x0A, 0x0B, 0x0E, 0xFD, 0xBC, 0x46, 0x10, 0x50, 0xDE, 0x5A, - 0x6F, 0x48, 0xBD, 0x0D, 0x66, 0xC1, 0x9D, 0x48, 0xB7, 0x9E, 0x70, 0x9B, 0xC0, 0x53, 0xE8, 0xB6, - 0x01, 0xD5, 0x8C, 0x32, 0x4F, 0x71, 0x4D, 0x72, 0x09, 0x63, 0xB8, 0xAC, 0xE3, 0x66, 0xAD, 0xA3, - 0xEB, 0x51, 0xAF, 0xC5, 0xE5, 0x14, 0x26, 0x00, 0xCE, 0x00, 0x15, 0x65, 0x45, 0x01, 0x09, 0x2F, - 0xDB, 0xED, 0xD1, 0xE5, 0xC1, 0x9C, 0xCA, 0xA0, 0xF3, 0x7B, 0xCD, 0xC6, 0xDA, 0x4E, 0x16, 0x67, - 0x21, 0x37, 0xDA, 0xD6, 0x92, 0x3F, 0x7A, 0xFC, 0x46, 0x1A, 0xAB, 0x68, 0x83, 0x70, 0x3E, 0x2E, - 0xCD, 0x62, 0x53, 0xA9, 0xAF, 0x98, 0x95, 0x4A, 0xF0, 0x1E, 0xC8, 0x4A, 0x25, 0x78, 0x77, 0x63, - 0xA5, 0x51, 0xD5, 0xFA, 0x5A, 0x36, 0x3D, 0x37, 0xAD, 0xA6, 0x9A, 0xE3, 0xF7, 0x7B, 0xAB, 0x32, - 0x42, 0x78, 0xD6, 0xED, 0x85, 0x54, 0x0F, 0x35, 0x35, 0x0D, 0x09, 0x83, 0xD2, 0xC2, 0x71, 0x33, - 0xD8, 0x60, 0x2B, 0xC5, 0x5A, 0x98, 0xE0, 0x60, 0x5E, 0xD1, 0x00, 0x2B, 0x76, 0xE7, 0x16, 0xF2, - 0x1D, 0x5F, 0xA9, 0x0F, 0xB5, 0xF8, 0x6C, 0xAF, 0xD9, 0x9E, 0xD2, 0x45, 0xE6, 0x23, 0xD5, 0xF5, - 0x42, 0xB5, 0xCF, 0x14, 0xE4, 0x4A, 0xC7, 0xF5, 0x9B, 0xC0, 0x3B, 0x72, 0x98, 0x63, 0x73, 0x3A, - 0xF2, 0x56, 0x25, 0xAE, 0x79, 0xCF, 0x3A, 0xEB, 0xBB, 0x43, 0x1D, 0x02, 0xAD, 0xDD, 0x37, 0x57, - 0x9E, 0x60, 0x4B, 0x46, 0x68, 0x2B, 0x98, 0xAD, 0xED, 0x11, 0x4E, 0x53, 0x1C, 0xBF, 0x5D, 0x78, - 0x93, 0x20, 0x9C, 0xD6, 0x13, 0x69, 0x8E, 0xCF, 0xCB, 0xE3, 0xB3, 0x29, 0xE8, 0xBA, 0xAE, 0x95, - 0xCF, 0xE7, 0x4D, 0xC6, 0xDE, 0xF7, 0x3B, 0x29, 0x28, 0x5D, 0x19, 0x98, 0x5E, 0xAA, 0xDC, 0xE9, - 0x98, 0xA2, 0x74, 0x22, 0x8E, 0x8A, 0xE4, 0x5E, 0xD3, 0xC5, 0x9D, 0x4D, 0xA7, 0x47, 0xF1, 0x24, - 0x7F, 0xF3, 0x86, 0x68, 0xF1, 0xBB, 0xB5, 0xA3, 0xCC, 0xC1, 0xF5, 0xE4, 0xAE, 0x00, 0x5D, 0x0D, - 0xB9, 0x9E, 0x73, 0x65, 0x89, 0x2A, 0x94, 0xB3, 0x4D, 0x2E, 0x80, 0x85, 0x74, 0x55, 0x29, 0x86, - 0x90, 0x3C, 0x00, 0xD0, 0xC7, 0x8C, 0x1E, 0x65, 0x5A, 0x86, 0x1A, 0xD8, 0x7C, 0x6B, 0x54, 0xBF, - 0x83, 0x07, 0x59, 0x55, 0xCE, 0x6D, 0x7E, 0x42, 0xA2, 0x1A, 0x7E, 0xD1, 0x63, 0xA0, 0x5B, 0x1A, - 0x6B, 0x60, 0xE8, 0x40, 0x1C, 0xFA, 0x43, 0x03, 0xDF, 0x77, 0xDC, 0x8C, 0xDA, 0x48, 0xEB, 0x56, - 0x9D, 0x0B, 0x6E, 0x44, 0x79, 0x21, 0x8D, 0x28, 0x67, 0xF6, 0x63, 0xF1, 0x74, 0xE0, 0xA9, 0x97, - 0x7A, 0x6B, 0xFD, 0xDB, 0x53, 0x33, 0x82, 0x30, 0x15, 0xAE, 0xEA, 0x27, 0xDC, 0x31, 0x1A, 0xB5, - 0x21, 0x6D, 0xF2, 0x10, 0x61, 0xE7, 0x53, 0x84, 0xE5, 0x72, 0x7A, 0x46, 0x3E, 0xC4, 0x5A, 0xAD, - 0x15, 0x17, 0x74, 0x61, 0xB4, 0x0B, 0xB2, 0x20, 0x11, 0x6E, 0xD6, 0xF2, 0x10, 0x81, 0x5D, 0xE7, - 0xD1, 0x9E, 0x3B, 0xE8, 0x66, 0x53, 0x9C, 0xD2, 0x00, 0x1F, 0xC5, 0x08, 0x9E, 0xEC, 0x96, 0x2A, - 0xDF, 0xA2, 0x68, 0xB9, 0x6A, 0x6B, 0x99, 0xDC, 0xB7, 0xE8, 0xA0, 0xDD, 0x2C, 0xC1, 0x29, 0xBD, - 0x5D, 0x9E, 0x79, 0x71, 0x1E, 0xDA, 0xAA, 0x60, 0x6F, 0x13, 0x46, 0x69, 0x23, 0xB8, 0x58, 0xB0, - 0x63, 0x05, 0xEC, 0xB3, 0x48, 0xF4, 0x8F, 0x13, 0x59, 0x47, 0x00, 0x3D, 0xE1, 0xFD, 0x67, 0x3D, - 0x53, 0x76, 0x4E, 0xE2, 0x9B, 0x77, 0x22, 0xCF, 0xA7, 0x28, 0x8D, 0xC9, 0x48, 0x15, 0x0C, 0x72, - 0x2F, 0x32, 0xD8, 0xDB, 0x77, 0x1F, 0x18, 0x4B, 0x41, 0xB8, 0x79, 0x44, 0xA9, 0xE1, 0xA5, 0x0C, - 0x12, 0x26, 0x4E, 0x6F, 0x67, 0x9E, 0x8F, 0x63, 0xF9, 0xC9, 0x5F, 0x78, 0xA2, 0xB4, 0xFC, 0xF0, - 0xD2, 0xE0, 0x42, 0x63, 0xAF, 0x0F, 0xF2, 0x60, 0x79, 0x92, 0x67, 0x84, 0x33, 0x1E, 0x6A, 0x25, - 0xA3, 0xBF, 0x78, 0xC6, 0x5A, 0xAB, 0x56, 0x0A, 0x68, 0xF0, 0x1E, 0x6C, 0x27, 0xF4, 0xFB, 0x2D, - 0x0D, 0xD8, 0x61, 0xC5, 0x90, 0x7A, 0x64, 0x99, 0x44, 0x17, 0x8B, 0x60, 0x2E, 0x8A, 0xC6, 0xCC, - 0x3D, 0x49, 0xCA, 0x3E, 0x15, 0xFF, 0xFE, 0x10, 0x93, 0x4D, 0xCD, 0xEB, 0x17, 0xF4, 0xD1, 0xE5, - 0xE3, 0x77, 0x9F, 0xBE, 0x15, 0xA7, 0x37, 0x8D, 0x78, 0x24, 0xEC, 0x6B, 0x68, 0x40, 0x34, 0x4B, - 0xA9, 0xFF, 0x22, 0x3C, 0x8F, 0x5E, 0x46, 0x53, 0x2B, 0x06, 0xF4, 0x51, 0x27, 0x7D, 0x4D, 0x2D, - 0x1B, 0xCA, 0x4C, 0x9D, 0x2F, 0xBF, 0x6A, 0xE8, 0x72, 0x95, 0xD8, 0x81, 0x9D, 0xFC, 0xA7, 0x4B, - 0x3E, 0x99, 0x1F, 0x48, 0xB2, 0xB1, 0x2E, 0x92, 0x55, 0x0D, 0x0D, 0x92, 0x93, 0x2A, 0xAA, 0x23, - 0x95, 0x78, 0x73, 0x2B, 0x48, 0xC5, 0xC2, 0x5D, 0x71, 0x64, 0x23, 0x68, 0xA8, 0x49, 0x06, 0x02, - 0xDB, 0x3F, 0xF4, 0xEC, 0xCD, 0xBB, 0x67, 0x3F, 0x7C, 0xFA, 0xF6, 0xA3, 0xC7, 0x4F, 0x9F, 0xBD, - 0xA1, 0x66, 0x2E, 0x70, 0xF3, 0xCA, 0xCF, 0xDF, 0x3C, 0xFE, 0x16, 0x7D, 0xEA, 0xCE, 0xAB, 0x07, - 0xAC, 0xFA, 0x9C, 0x45, 0x7E, 0xA6, 0xF8, 0x44, 0x7C, 0x40, 0xF8, 0x77, 0x3E, 0x22, 0x11, 0xC4, - 0xF6, 0xCB, 0x17, 0x1F, 0xFF, 0x60, 0x71, 0x38, 0x22, 0xD3, 0x70, 0xF0, 0xDA, 0x62, 0x3C, 0x22, - 0x65, 0x3C, 0xF2, 0x86, 0x32, 0x58, 0xE0, 0xD6, 0x18, 0x1A, 0x79, 0x5A, 0x0F, 0xBC, 0x22, 0xCE, - 0xA0, 0x64, 0x30, 0x8A, 0xEE, 0xB6, 0x88, 0x13, 0x07, 0x53, 0x00, 0x0D, 0x8E, 0xD7, 0x02, 0x50, - 0x76, 0x38, 0x95, 0x3B, 0x99, 0x92, 0x71, 0xC0, 0xC5, 0xC5, 0x59, 0x92, 0x69, 0xD3, 0xCC, 0x10, - 0x82, 0x91, 0x4B, 0x71, 0x6E, 0x9D, 0x22, 0x96, 0x08, 0xC5, 0x65, 0x51, 0x96, 0xC1, 0xC1, 0xA3, - 0x07, 0xFA, 0xBA, 0x79, 0xE2, 0x25, 0x58, 0xB1, 0xFA, 0x2C, 0x4F, 0x53, 0x6A, 0xAB, 0x1F, 0x0B, - 0xBF, 0x36, 0x91, 0x30, 0xD6, 0x0F, 0xB9, 0x21, 0x3E, 0x5F, 0x16, 0x3C, 0xB9, 0x2C, 0x84, 0xF5, - 0xB6, 0xF5, 0x49, 0xFE, 0x84, 0x52, 0xB7, 0xAC, 0xE7, 0x67, 0xB2, 0x44, 0x9A, 0xF0, 0x14, 0x6F, - 0xBE, 0x98, 0x79, 0xD2, 0xF9, 0x8C, 0xC1, 0x62, 0x3E, 0x32, 0x5E, 0x14, 0x21, 0xCF, 0x70, 0x3F, - 0xA4, 0x58, 0xD7, 0x93, 0x4F, 0x22, 0x5C, 0xA9, 0x40, 0x95, 0x81, 0x53, 0xF2, 0x74, 0xA6, 0x69, - 0x17, 0x33, 0xF0, 0x7C, 0x6E, 0xAC, 0x80, 0xE7, 0x73, 0x73, 0x85, 0x99, 0x17, 0xBF, 0x24, 0xAA, - 0x6B, 0x39, 0xF9, 0x5D, 0xB4, 0x90, 0xA9, 0x1B, 0x5A, 0x8E, 0xEA, 0xDA, 0x01, 0x25, 0xF9, 0xCB, - 0x20, 0x49, 0x6D, 0xCF, 0xF7, 0xAD, 0x2F, 0x58, 0x60, 0xA2, 0x0F, 0x6E, 0x83, 0xAC, 0x33, 0x27, - 0x63, 0xF8, 0x05, 0x30, 0x19, 0x82, 0x7C, 0xFB, 0x45, 0xE8, 0xE3, 0x6B, 0x94, 0xD8, 0xA9, 0x38, - 0xC5, 0x53, 0x4D, 0xF1, 0x98, 0x96, 0x53, 0x1E, 0x8C, 0x1A, 0x13, 0x36, 0xFA, 0x75, 0x17, 0xE3, - 0xEE, 0x54, 0x1A, 0x66, 0x96, 0x8E, 0xBE, 0xF3, 0x13, 0x65, 0x76, 0xA7, 0x80, 0x2B, 0x6D, 0xFD, - 0xAA, 0x0D, 0xCF, 0xB4, 0x3E, 0x33, 0x1B, 0x30, 0xE5, 0x8E, 0x79, 0xFD, 0x85, 0x4A, 0x1E, 0xAC, - 0x12, 0x00, 0x7E, 0xFD, 0x2D, 0xA8, 0x22, 0x74, 0xBC, 0xF4, 0x9A, 0xDD, 0x61, 0xEA, 0x42, 0x4F, - 0x6B, 0x58, 0xB5, 0xC8, 0xED, 0xFA, 0x4D, 0x78, 0x4B, 0xB9, 0x78, 0xA8, 0x70, 0x74, 0x96, 0xFB, - 0xEB, 0x25, 0x9F, 0xE2, 0xF8, 0x8E, 0x9E, 0xBA, 0xB3, 0x80, 0xDF, 0x8A, 0x05, 0x06, 0x06, 0xB7, - 0x9A, 0x5D, 0x45, 0xFE, 0xAD, 0x18, 0x01, 0xE4, 0x89, 0xEA, 0x15, 0x00, 0x5F, 0x24, 0x6A, 0x4D, - 0x25, 0x60, 0x82, 0xB6, 0x5C, 0x70, 0x4B, 0x15, 0xDD, 0x77, 0xB1, 0x17, 0x26, 0xD4, 0xF0, 0x6E, - 0x72, 0x23, 0xEF, 0x5B, 0x52, 0xB9, 0x3D, 0xA5, 0xC8, 0xEA, 0x2E, 0x02, 0x03, 0xCD, 0x68, 0x6F, - 0xA4, 0xCE, 0x5A, 0xDD, 0x98, 0x09, 0x15, 0xD8, 0x37, 0x0A, 0xF1, 0xC7, 0xEC, 0x24, 0x78, 0x03, - 0x0E, 0x8C, 0xF1, 0x62, 0xEE, 0x4D, 0x0C, 0xE6, 0x7E, 0xAA, 0x95, 0x45, 0x99, 0x9F, 0xCA, 0xFC, - 0xA8, 0xF9, 0xC6, 0x30, 0xD1, 0xCB, 0xE1, 0xF1, 0xF3, 0x3A, 0x2E, 0x30, 0xDC, 0x9E, 0xAB, 0x21, - 0x71, 0x75, 0x21, 0x92, 0xDF, 0x95, 0x97, 0xC4, 0xC8, 0x01, 0x72, 0x72, 0x85, 0x5F, 0x5E, 0x45, - 0x32, 0x0B, 0x60, 0xD3, 0x45, 0x38, 0x5E, 0x7F, 0xF7, 0x6D, 0x96, 0x4B, 0x15, 0x52, 0xC9, 0x2C, - 0xF5, 0x2A, 0x64, 0x5E, 0xFD, 0x9D, 0x75, 0xE5, 0xF5, 0xA9, 0xF2, 0x42, 0xAE, 0x48, 0x21, 0x29, - 0x35, 0xD3, 0xEA, 0xF7, 0xC3, 0x45, 0x39, 0x9A, 0x56, 0xFB, 0x5F, 0x28, 0x0A, 0xEF, 0xB4, 0xEA, - 0x6A, 0xBE, 0x2C, 0xCE, 0xD3, 0xEA, 0x3B, 0xFA, 0x82, 0xC0, 0x4E, 0xCB, 0xCE, 0x70, 0x4D, 0x12, - 0x3C, 0x2D, 0xB9, 0xBF, 0x35, 0x6C, 0xEB, 0xD2, 0xCD, 0x0D, 0x04, 0xEF, 0x61, 0x12, 0x78, 0x1F, - 0x23, 0xC0, 0x5A, 0xD3, 0xBA, 0x0A, 0x81, 0x74, 0x9F, 0x59, 0x96, 0x9D, 0x9E, 0x07, 0xF3, 0x39, - 0x19, 0xD6, 0x44, 0x88, 0x1A, 0x45, 0x8C, 0xD2, 0x17, 0x89, 0x6F, 0xF0, 0x24, 0xB5, 0xF0, 0x76, - 0x05, 0x3B, 0x97, 0xD2, 0x39, 0x8F, 0x06, 0x15, 0x15, 0x92, 0x8A, 0x0A, 0x1C, 0x13, 0x16, 0xF4, - 0xFF, 0x65, 0x10, 0xE2, 0xC7, 0xA9, 0x82, 0x15, 0x72, 0xEF, 0x84, 0x95, 0x95, 0xB6, 0x5D, 0x50, - 0xD1, 0x50, 0xA7, 0x6E, 0xF6, 0x74, 0xDC, 0x4A, 0xC4, 0x6B, 0x27, 0x1D, 0x43, 0x9E, 0xF0, 0x65, - 0x8E, 0xBA, 0x90, 0xEC, 0x5F, 0x05, 0x35, 0xEB, 0x1A, 0xDF, 0x0E, 0x2A, 0xA6, 0x28, 0xC8, 0x4E, - 0x93, 0x34, 0x8E, 0xDE, 0x53, 0xEF, 0x18, 0x2A, 0x4E, 0xFA, 0x18, 0xCF, 0x83, 0x10, 0x7F, 0xA6, - 0x1C, 0x81, 0xD5, 0xBE, 0xCF, 0x21, 0x15, 0x72, 0xA0, 0x55, 0x1D, 0x69, 0xD7, 0x41, 0xDA, 0xE9, - 0x56, 0xF6, 0x73, 0x5D, 0xBD, 0x8A, 0xB1, 0xA9, 0x1D, 0xD2, 0x4A, 0x8E, 0xAB, 0xAD, 0x25, 0xCC, - 0x47, 0xE8, 0xC4, 0xBA, 0x55, 0xA6, 0xDD, 0x51, 0x4E, 0x07, 0x5A, 0x80, 0x92, 0x21, 0xF7, 0x74, - 0xB3, 0x4E, 0x80, 0x80, 0xA1, 0xA5, 0xF3, 0x03, 0x0D, 0x0F, 0xBA, 0x99, 0x03, 0x8D, 0x49, 0x92, - 0x40, 0x03, 0x33, 0xDD, 0xA1, 0x71, 0xD1, 0x2B, 0xE3, 0x7C, 0xAF, 0xEE, 0xDE, 0xD7, 0x3F, 0xF9, - 0xBF, 0x7A, 0xAA, 0x7C, 0xFD, 0x38, 0x0B, 0xD9, 0x49, 0x16, 0x9A, 0x78, 0xC9, 0xD4, 0x67, 0xA3, - 0x0C, 0x8D, 0x42, 0x69, 0x39, 0x89, 0xD3, 0xE7, 0x51, 0x98, 0x5A, 0x18, 0x6E, 0xB9, 0x70, 0x4B, - 0xBA, 0x08, 0x23, 0xA5, 0x88, 0x2A, 0x4A, 0x36, 0x79, 0x64, 0x36, 0x22, 0x16, 0x79, 0xE2, 0xF4, - 0xC9, 0xE3, 0xB7, 0xCF, 0x5E, 0xBE, 0xF8, 0xF8, 0x99, 0xB4, 0x1A, 0x0A, 0x16, 0x74, 0x12, 0x93, - 0xED, 0x59, 0xAA, 0x1C, 0x36, 0x81, 0x02, 0x01, 0x88, 0xAE, 0x62, 0xA5, 0xEA, 0xE9, 0x54, 0x45, - 0xE7, 0xDA, 0xA6, 0x95, 0xB5, 0xB2, 0xC7, 0xA5, 0xD2, 0xEF, 0xA2, 0x45, 0x29, 0x4D, 0x8A, 0x1E, - 0x89, 0x6D, 0x49, 0x0C, 0x52, 0x63, 0x96, 0xD7, 0x5E, 0x7E, 0x4C, 0x46, 0x53, 0xE3, 0xAF, 0x74, - 0xD4, 0x2A, 0xC6, 0x0C, 0xAA, 0xEC, 0x1D, 0x2C, 0x2C, 0x90, 0x29, 0x63, 0x42, 0xD1, 0xE4, 0x51, - 0xEE, 0x3E, 0xB8, 0x0D, 0x8E, 0x9A, 0x41, 0xEA, 0xCD, 0x83, 0x49, 0x73, 0xD8, 0x6C, 0xD2, 0x10, - 0x70, 0x47, 0x58, 0x06, 0x2B, 0x26, 0x63, 0xFA, 0x19, 0x05, 0xF9, 0x24, 0x9A, 0xFB, 0x43, 0x53, - 0x06, 0xA9, 0xA2, 0xA7, 0xBF, 0x0D, 0xBE, 0x2D, 0xFA, 0x67, 0x16, 0x3A, 0xD9, 0xE2, 0xBA, 0x54, - 0xE9, 0xB9, 0x77, 0x11, 0xCC, 0x6F, 0xB2, 0x2F, 0xB2, 0xAC, 0x7C, 0x08, 0xE0, 0x65, 0xB0, 0xBF, - 0xFB, 0xC0, 0x13, 0xC4, 0xD2, 0x83, 0xD2, 0xF2, 0xD1, 0xC2, 0xE0, 0x51, 0x97, 0x1D, 0x2D, 0xD0, - 0xC7, 0xFE, 0x91, 0x7E, 0xA2, 0x10, 0xCA, 0x13, 0x85, 0xA4, 0x88, 0x9F, 0xF1, 0x58, 0x41, 0xBA, - 0x91, 0x61, 0xC7, 0x0A, 0x24, 0xB9, 0x39, 0xA1, 0x38, 0x34, 0x61, 0x00, 0xB7, 0x1C, 0x18, 0xD2, - 0x6C, 0xC5, 0x76, 0x90, 0x9F, 0x8C, 0x53, 0xA5, 0xE6, 0x4D, 0x74, 0x95, 0x50, 0xCB, 0x43, 0xA4, - 0xBE, 0x11, 0x2B, 0x9E, 0x28, 0x4C, 0xC4, 0x93, 0xF9, 0xB8, 0xF8, 0x64, 0x9E, 0x86, 0xA6, 0x47, - 0xB7, 0xD7, 0x43, 0x07, 0xDE, 0x0C, 0x1D, 0x18, 0x24, 0x74, 0xBB, 0x86, 0xFD, 0xE1, 0x96, 0x0B, - 0xA9, 0x0E, 0x36, 0x6C, 0x36, 0x21, 0x95, 0x9F, 0x43, 0x27, 0x13, 0xD0, 0x14, 0x0A, 0xE1, 0x38, - 0x41, 0xB7, 0x67, 0x5E, 0x3C, 0x14, 0xAA, 0x16, 0x49, 0x7C, 0xE2, 0xC5, 0x8C, 0x8A, 0xD4, 0x65, - 0x1D, 0x95, 0x64, 0x00, 0x9E, 0xCD, 0xA3, 0xC9, 0x7B, 0xBD, 0x18, 0x49, 0x29, 0x17, 0x5C, 0x92, - 0x3C, 0x32, 0xEB, 0xB5, 0xC2, 0x9F, 0x8A, 0xD4, 0x52, 0x05, 0x81, 0x96, 0xD1, 0x82, 0x1C, 0x17, - 0x37, 0xE3, 0xB3, 0xBB, 0x3E, 0x97, 0xC5, 0x60, 0xF3, 0x30, 0x86, 0x55, 0xC6, 0x90, 0x14, 0xE5, - 0x27, 0xF3, 0x20, 0x7C, 0x4F, 0xAD, 0xD1, 0x5F, 0x79, 0xA1, 0x37, 0xAD, 0xB5, 0x30, 0xAF, 0xAD, - 0xC7, 0x19, 0x92, 0xBB, 0x2E, 0xCC, 0x77, 0x30, 0x94, 0x81, 0x6C, 0x25, 0xE5, 0x3E, 0x63, 0x9C, - 0x89, 0x83, 0x0C, 0x16, 0x19, 0x7F, 0xA4, 0xE8, 0xD4, 0x8C, 0xF2, 0x06, 0xFB, 0xF7, 0x0D, 0xFA, - 0x47, 0x2D, 0xE1, 0x63, 0x4C, 0xAF, 0x70, 0x68, 0xC1, 0xC7, 0x61, 0x70, 0xE1, 0xF1, 0xE8, 0x9D, - 0xF5, 0x03, 0x58, 0x38, 0x56, 0x60, 0x68, 0xDD, 0x17, 0x85, 0x85, 0xB7, 0xD4, 0x6C, 0x8E, 0x2B, - 0x66, 0x93, 0x76, 0xE3, 0x24, 0xBC, 0x28, 0x72, 0x5F, 0xEA, 0x36, 0x6B, 0xEB, 0x47, 0xE8, 0x3D, - 0x54, 0x45, 0x5E, 0x06, 0x8A, 0xA7, 0x1F, 0x0F, 0x43, 0x3B, 0xC6, 0xC9, 0xF2, 0x02, 0xE7, 0xA4, - 0xFA, 0x3A, 0x11, 0xAF, 0x1A, 0x07, 0xDE, 0x85, 0x5C, 0x1A, 0x2B, 0xC8, 0x1F, 0xD5, 0x76, 0x27, - 0x3F, 0x49, 0xA8, 0x60, 0x68, 0x22, 0x9A, 0x3C, 0xED, 0x09, 0xB4, 0x08, 0xF6, 0x00, 0xB7, 0x1C, - 0x90, 0x81, 0x4A, 0x75, 0x1F, 0x80, 0xA1, 0x75, 0x5F, 0x9A, 0xDE, 0x6D, 0xB6, 0xFD, 0xD3, 0xB1, - 0x8C, 0x7E, 0x40, 0xF6, 0x60, 0xBE, 0x31, 0xCE, 0xB8, 0xEA, 0x63, 0xB7, 0xAD, 0x35, 0x23, 0x59, - 0x9B, 0x6D, 0x07, 0xC9, 0x6B, 0x32, 0xC1, 0xFC, 0xA3, 0xE2, 0x28, 0xBA, 0x22, 0x5E, 0x4A, 0x55, - 0xCD, 0x4A, 0x4C, 0x73, 0x20, 0x9A, 0x25, 0xB5, 0xB2, 0xCC, 0xD9, 0x41, 0xC2, 0x68, 0xF6, 0x42, - 0xBE, 0xFC, 0xF1, 0x25, 0xA2, 0x86, 0x62, 0x1F, 0x05, 0xBE, 0x8F, 0x43, 0xF5, 0xF9, 0x47, 0xC3, - 0x20, 0xE5, 0xE4, 0x59, 0x61, 0x71, 0xBC, 0xCE, 0xBC, 0x04, 0xFF, 0x48, 0xBB, 0x6A, 0x84, 0x13, - 0x14, 0x74, 0x8A, 0x79, 0x22, 0x70, 0xCA, 0x8F, 0xC0, 0x38, 0xBF, 0x97, 0x31, 0x03, 0xF8, 0x61, - 0xC8, 0x82, 0xB7, 0x74, 0x5C, 0x7A, 0xF1, 0x95, 0x1C, 0x38, 0xAB, 0x55, 0x72, 0x88, 0xD8, 0xF9, - 0x1E, 0x30, 0xA1, 0xC9, 0xE3, 0x1A, 0x5B, 0x98, 0xDB, 0x83, 0x97, 0x8C, 0x83, 0x03, 0x90, 0x1B, - 0xE1, 0xC6, 0x8A, 0x42, 0x00, 0xA0, 0x0C, 0x15, 0x96, 0x27, 0x8A, 0xDB, 0xEE, 0x22, 0xA9, 0x0B, - 0xBA, 0x99, 0x5C, 0x43, 0x34, 0x2B, 0x7C, 0xB9, 0x40, 0x28, 0x5B, 0x63, 0xEF, 0x12, 0x5B, 0x45, - 0x75, 0x7C, 0xDD, 0x66, 0x86, 0x91, 0x82, 0x6C, 0x64, 0xE4, 0x13, 0x9C, 0xA2, 0xD4, 0xA1, 0x20, - 0xC4, 0x95, 0x54, 0xDA, 0x6A, 0x35, 0xA9, 0x7A, 0xD1, 0x54, 0x02, 0xFA, 0x14, 0xB4, 0x94, 0x93, - 0x74, 0x6C, 0x61, 0x18, 0xC3, 0x44, 0xA5, 0x40, 0x41, 0x1D, 0x59, 0x8A, 0x1E, 0x94, 0x0A, 0x6A, - 0x6A, 0x39, 0xF5, 0x51, 0x60, 0x69, 0xAB, 0xAB, 0x7D, 0x2D, 0xEF, 0x7B, 0xD8, 0xF7, 0x8D, 0xD4, - 0xC7, 0xD8, 0xB7, 0x24, 0x18, 0xDA, 0x72, 0xB5, 0x8C, 0x84, 0xD1, 0x02, 0x2A, 0xAF, 0x90, 0x58, - 0x86, 0x6A, 0x84, 0x43, 0x47, 0x46, 0xD9, 0xDE, 0x64, 0xCA, 0xE0, 0xDC, 0x77, 0xA2, 0xB2, 0xAE, - 0xFE, 0x50, 0x90, 0x04, 0x44, 0x7F, 0xB9, 0x95, 0xAE, 0x3A, 0x68, 0xEB, 0xC5, 0x6F, 0xFB, 0x1A, - 0x21, 0x14, 0x8B, 0xC3, 0x62, 0xD1, 0x45, 0x84, 0x12, 0x3D, 0x29, 0xEF, 0x65, 0xCD, 0x2B, 0x6E, - 0x59, 0x48, 0xAF, 0xCB, 0x08, 0x81, 0xCC, 0x23, 0xAD, 0x17, 0x15, 0xC6, 0x2A, 0x66, 0xE2, 0x68, - 0xAF, 0x18, 0x34, 0xBE, 0xCC, 0xAA, 0xF8, 0xB2, 0xC0, 0x2A, 0x46, 0x14, 0x56, 0x2B, 0xCE, 0x63, - 0x06, 0x3E, 0xFA, 0xBA, 0xD9, 0xC3, 0x88, 0x10, 0xDC, 0x90, 0x5B, 0x98, 0x8F, 0x54, 0x13, 0x39, - 0x32, 0xFD, 0xFB, 0x56, 0x01, 0x28, 0xCD, 0xCF, 0xCD, 0x1B, 0xB3, 0x03, 0x11, 0x3E, 0x30, 0x3F, - 0x13, 0x1A, 0xAA, 0x2D, 0xD0, 0xE3, 0x14, 0x8D, 0x00, 0x7A, 0xF7, 0xCB, 0xB8, 0xE7, 0xFE, 0xC1, - 0xEF, 0xA4, 0xAE, 0xCA, 0xF5, 0x41, 0xEE, 0x39, 0x4C, 0x27, 0x0E, 0x0F, 0x94, 0x42, 0xBC, 0xA2, - 0xE1, 0x44, 0x93, 0xB4, 0xC4, 0xF5, 0x82, 0x4A, 0xC3, 0x3E, 0x06, 0x87, 0x0E, 0x86, 0x91, 0x51, - 0xB2, 0xF2, 0x76, 0xE8, 0xEB, 0xED, 0x03, 0x1F, 0x1D, 0xD2, 0x80, 0x6A, 0xA0, 0xE3, 0xDE, 0x0F, - 0xF8, 0xE3, 0xC9, 0x84, 0x5E, 0x00, 0xEB, 0x4D, 0x14, 0xCE, 0x80, 0x12, 0xF5, 0x6D, 0xB1, 0xB1, - 0xF7, 0x85, 0xFD, 0xDD, 0xD7, 0x4B, 0x81, 0xF2, 0xA1, 0xFA, 0x3A, 0xF4, 0xB4, 0xC5, 0x61, 0x3D, - 0x66, 0xEC, 0x44, 0xF8, 0xCE, 0xB8, 0x95, 0x4E, 0xA7, 0xEB, 0x07, 0x29, 0xC7, 0x32, 0x33, 0x9D, - 0x5B, 0x84, 0xC2, 0xC6, 0xA1, 0x78, 0xEE, 0x00, 0x34, 0x25, 0xFB, 0xD8, 0x9B, 0xCF, 0xCF, 0xBC, - 0xC9, 0x7B, 0x54, 0xED, 0x38, 0x4C, 0x5C, 0x8B, 0x16, 0x56, 0x0D, 0xB4, 0xE5, 0x54, 0x1F, 0xC4, - 0x97, 0xC4, 0x3C, 0xD7, 0xF0, 0x5E, 0x84, 0x29, 0x8E, 0x2F, 0xBD, 0xB9, 0xC5, 0x7C, 0x98, 0x08, - 0x8D, 0x31, 0x8F, 0xC8, 0xCA, 0xE5, 0xC6, 0x19, 0x5F, 0xB3, 0x62, 0xE1, 0x22, 0x49, 0x2C, 0x69, - 0x34, 0x43, 0x40, 0x01, 0x99, 0x54, 0xE3, 0x6F, 0x0D, 0xD9, 0x75, 0x62, 0x8C, 0xBF, 0xB0, 0xA3, - 0x02, 0x4B, 0x22, 0x65, 0x6A, 0x02, 0x1A, 0x12, 0x0B, 0xBB, 0x82, 0x12, 0xB2, 0x9B, 0x36, 0xAC, - 0xBB, 0x34, 0x2A, 0x81, 0xA9, 0x84, 0x5F, 0x68, 0xDF, 0x13, 0x1A, 0x33, 0x7D, 0x12, 0xB7, 0x49, - 0xE3, 0x5E, 0x38, 0xC1, 0xF3, 0xC7, 0x5A, 0x35, 0xCB, 0x04, 0xCB, 0xDC, 0x82, 0x68, 0x3E, 0xAB, - 0x52, 0xDB, 0x6F, 0x39, 0xBF, 0xB0, 0xC1, 0x95, 0x1B, 0x40, 0x09, 0x85, 0x74, 0xE3, 0x0D, 0xAB, - 0x8B, 0x7D, 0xF4, 0x94, 0x2C, 0x03, 0x61, 0x74, 0x25, 0xE6, 0x50, 0x25, 0x9F, 0xE9, 0x58, 0x94, - 0xC1, 0x32, 0xE4, 0xD6, 0x75, 0x9E, 0x1B, 0x9F, 0x16, 0x7A, 0x5F, 0xDE, 0x7E, 0x8A, 0x99, 0x61, - 0xD5, 0x12, 0x21, 0x03, 0x80, 0x59, 0xB4, 0xEA, 0xEC, 0x8D, 0xD1, 0xAE, 0xE3, 0xFC, 0xF3, 0x62, - 0xCA, 0xB5, 0x84, 0x29, 0xF9, 0x23, 0x93, 0x5A, 0xA0, 0x79, 0xE0, 0xF2, 0x88, 0x19, 0xBB, 0x8E, - 0xD3, 0xB1, 0xF2, 0x61, 0xEC, 0xD4, 0xD6, 0x1A, 0xAD, 0x01, 0x2B, 0xFC, 0x73, 0xE1, 0x43, 0xC7, - 0xB0, 0x4B, 0x2B, 0x11, 0x9A, 0xEB, 0x75, 0x25, 0xA6, 0x71, 0xCD, 0xA3, 0xF6, 0x4F, 0xCE, 0x1D, - 0xC6, 0xA1, 0xDA, 0x60, 0x28, 0x64, 0x0F, 0xBF, 0xD6, 0xB1, 0xD0, 0x8C, 0x8B, 0xEB, 0xC7, 0xE3, - 0x3E, 0x83, 0x60, 0x4A, 0xFD, 0x67, 0x32, 0x2E, 0x19, 0x80, 0x64, 0x8A, 0x66, 0x00, 0x62, 0x90, - 0xF1, 0x83, 0xC1, 0xDB, 0x7A, 0xF9, 0xF3, 0xCF, 0x63, 0x1E, 0xFF, 0x7F, 0x68, 0x71, 0x61, 0xA7, - 0x9E, 0x6C, 0x54, 0xF4, 0xB3, 0xDB, 0x7A, 0x56, 0xAD, 0x50, 0x39, 0xA4, 0xAD, 0x9E, 0xF9, 0xAC, - 0x29, 0xCB, 0xE0, 0x5E, 0xAF, 0xF7, 0xB0, 0xFB, 0xA3, 0x82, 0x57, 0xD4, 0xF2, 0xED, 0x91, 0xFB, - 0xA8, 0x68, 0x98, 0x3A, 0x78, 0xD4, 0x2D, 0xDF, 0x1E, 0x45, 0x1B, 0xDD, 0x1E, 0x71, 0x27, 0xFC, - 0xEC, 0xEE, 0x28, 0x80, 0x18, 0x36, 0x49, 0xA7, 0x9A, 0x30, 0x85, 0x5B, 0x0E, 0xCF, 0x2C, 0xDC, - 0x5D, 0x24, 0x76, 0x14, 0xBE, 0x9D, 0x45, 0x57, 0x04, 0x4F, 0xA9, 0x74, 0xD3, 0x38, 0x4A, 0x8C, - 0x66, 0xDC, 0xEC, 0xAE, 0x54, 0xC2, 0x74, 0x0F, 0x42, 0x60, 0x7D, 0x14, 0xF8, 0xB8, 0x1E, 0x56, - 0xB9, 0x04, 0x85, 0x75, 0x87, 0xBB, 0x0B, 0x3E, 0x65, 0xE5, 0xD5, 0x84, 0xBE, 0x99, 0x8D, 0x71, - 0x48, 0xF6, 0x64, 0xEF, 0x2D, 0x90, 0x19, 0xD2, 0x4A, 0x27, 0x1B, 0xF5, 0xFB, 0x54, 0x7D, 0xFB, - 0x7D, 0xA3, 0x7F, 0xD2, 0x93, 0xB9, 0x42, 0x71, 0xE9, 0x27, 0x46, 0x48, 0x30, 0x5E, 0xB3, 0xDB, - 0xD1, 0x01, 0x75, 0xDC, 0x11, 0x3E, 0x74, 0x34, 0x5F, 0x05, 0xAC, 0x79, 0xA7, 0xD0, 0x62, 0xBB, - 0xDC, 0x26, 0xC4, 0x9A, 0xA3, 0x0C, 0x63, 0xBD, 0xAE, 0x7E, 0xE0, 0xD0, 0x2D, 0x6E, 0xA8, 0x39, - 0x0D, 0xB3, 0x9A, 0x01, 0xBE, 0xA5, 0xC7, 0x88, 0xE7, 0x53, 0x84, 0x50, 0x6C, 0xBF, 0xF8, 0x98, - 0xDA, 0xD2, 0x3F, 0x3D, 0x7D, 0xFA, 0xEC, 0xF9, 0xE3, 0x4F, 0x5F, 0xBE, 0x3B, 0x3D, 0xFE, 0xE4, - 0xE5, 0x27, 0x6F, 0x8E, 0xEE, 0xB6, 0xFB, 0xD2, 0xCD, 0x12, 0x86, 0xF2, 0xC0, 0x91, 0xB4, 0xD2, - 0x6A, 0x51, 0x73, 0xC2, 0x20, 0xE9, 0x0E, 0x76, 0xE9, 0x3E, 0x11, 0xD0, 0xC6, 0xC1, 0x1D, 0x9B, - 0xA0, 0x11, 0x5B, 0x48, 0xC5, 0x31, 0x6D, 0xE2, 0x6E, 0x95, 0x95, 0x70, 0x32, 0x64, 0x17, 0x46, - 0xC8, 0x4F, 0x8F, 0xA0, 0x6E, 0xBA, 0xA0, 0x6E, 0xB7, 0x48, 0x07, 0x9E, 0x72, 0x07, 0xA1, 0x74, - 0x87, 0x7C, 0xB2, 0x83, 0xD8, 0xDB, 0x4D, 0x6B, 0x51, 0x4E, 0x62, 0xF5, 0x72, 0xE3, 0x7B, 0x36, - 0xFA, 0xD4, 0x02, 0xFF, 0xA6, 0x4B, 0xAD, 0xEF, 0xEB, 0xC0, 0x39, 0x30, 0xE5, 0x80, 0x84, 0x8B, - 0x8C, 0xAA, 0x72, 0x94, 0x3B, 0x08, 0xA6, 0xE2, 0x04, 0x8C, 0x71, 0x04, 0xCE, 0x6A, 0x26, 0x68, - 0xF5, 0x1C, 0xCB, 0xCA, 0x32, 0x2E, 0xCC, 0xE0, 0x7E, 0x97, 0x05, 0xA1, 0xB8, 0xA7, 0xD4, 0xAC, - 0x72, 0x2B, 0x2B, 0xE5, 0x79, 0x75, 0x09, 0xFD, 0x75, 0x09, 0xD9, 0x98, 0x63, 0x52, 0x98, 0x5E, - 0xCA, 0x88, 0x42, 0x6C, 0x23, 0xCD, 0xE2, 0xC7, 0xC7, 0x68, 0xCB, 0xE5, 0x5A, 0xCF, 0x2D, 0xDF, - 0x3C, 0x0E, 0xA9, 0x12, 0x11, 0xAF, 0x56, 0x56, 0x4C, 0xD6, 0x7A, 0xE1, 0xA9, 0xD3, 0x04, 0x82, - 0x2C, 0x12, 0x19, 0xEC, 0xEE, 0xF5, 0x1F, 0xD2, 0xDB, 0x92, 0xBF, 0x6F, 0xB1, 0x4A, 0xD0, 0xF8, - 0xF6, 0x30, 0x41, 0x0E, 0x8C, 0x91, 0x03, 0x23, 0xA2, 0xC3, 0x86, 0xE4, 0x1F, 0x8F, 0xE0, 0x6C, - 0xAA, 0x67, 0x78, 0x7E, 0x21, 0x56, 0x06, 0x31, 0x84, 0x25, 0xD7, 0xFF, 0x89, 0x21, 0x5E, 0x44, - 0x1E, 0x53, 0xB7, 0xE4, 0xC5, 0xBF, 0xC6, 0xF5, 0xBF, 0xC9, 0xA3, 0x95, 0x38, 0xE9, 0x64, 0x4F, - 0xC2, 0xD1, 0xED, 0xF9, 0x74, 0xE8, 0xC0, 0x33, 0xF2, 0x0F, 0xBE, 0x4E, 0xF9, 0x05, 0x33, 0x75, - 0x7E, 0x41, 0x10, 0x9D, 0x71, 0x24, 0xE5, 0x03, 0x77, 0xE5, 0xE5, 0x9C, 0x7C, 0xA4, 0xAE, 0x3C, - 0xAD, 0xCB, 0xDF, 0x99, 0xA3, 0xEE, 0xEE, 0x7E, 0xBF, 0x37, 0xE8, 0x0F, 0x76, 0x5B, 0xA4, 0xCA, - 0x11, 0xB6, 0xD9, 0xC2, 0x89, 0x7D, 0x9B, 0xB6, 0x43, 0x09, 0x48, 0x08, 0x19, 0xB2, 0x80, 0x63, - 0x9C, 0x88, 0x32, 0xAA, 0x59, 0xA5, 0x13, 0xAE, 0x32, 0x05, 0x88, 0x94, 0x78, 0xE6, 0x4D, 0x66, - 0x4F, 0x65, 0x86, 0x3C, 0x9D, 0x99, 0xC1, 0xE6, 0x19, 0x9D, 0x70, 0xDC, 0xB5, 0xB1, 0x1A, 0x3E, - 0x8E, 0x0D, 0xD4, 0xB7, 0x9E, 0xB4, 0x5A, 0x56, 0x8C, 0x4C, 0x19, 0x32, 0xE8, 0x8B, 0x08, 0x26, - 0x45, 0x70, 0x75, 0x00, 0xC4, 0x8A, 0x58, 0x52, 0x80, 0x24, 0xC8, 0x94, 0x51, 0x06, 0x12, 0x21, - 0x7A, 0x67, 0x0A, 0xA4, 0xAB, 0x17, 0xD3, 0x78, 0x13, 0x15, 0x17, 0xCF, 0xE7, 0xCC, 0xBA, 0xBE, - 0xEC, 0x77, 0x87, 0x8C, 0x0C, 0xF4, 0x28, 0xE6, 0xD5, 0xDA, 0x9E, 0x3C, 0xE1, 0x39, 0x0A, 0x72, - 0xE7, 0x82, 0xF9, 0x03, 0xFF, 0x4F, 0x16, 0xDE, 0x8F, 0x2E, 0xF1, 0x50, 0xC9, 0x7B, 0x11, 0xF2, - 0x78, 0xF7, 0x85, 0x32, 0xC0, 0x4C, 0x09, 0xA8, 0x54, 0x7D, 0x2E, 0x3B, 0x4E, 0x29, 0x61, 0xCC, - 0xA9, 0x20, 0x05, 0xB8, 0xDF, 0xB8, 0xA6, 0xD1, 0xE2, 0x9F, 0xE3, 0xA0, 0x86, 0xB4, 0x65, 0xEF, - 0xA8, 0x23, 0x82, 0x9B, 0x51, 0xF6, 0x6F, 0x75, 0x44, 0xFC, 0xAC, 0x47, 0xAB, 0x78, 0x25, 0x03, - 0x95, 0xE9, 0x85, 0x94, 0x1C, 0x00, 0x23, 0xDA, 0xB8, 0x5A, 0xE0, 0x7C, 0xDA, 0xEA, 0xF0, 0xA8, - 0x70, 0x83, 0x55, 0xA2, 0x14, 0x95, 0xA1, 0xE2, 0xF4, 0x69, 0xD9, 0x6A, 0x59, 0x61, 0xAB, 0xB5, - 0xC5, 0x00, 0x39, 0x08, 0xE5, 0xF1, 0xD7, 0xF4, 0x29, 0x0D, 0x8E, 0x3A, 0x79, 0x70, 0x2F, 0x1D, - 0xC4, 0x2A, 0x8F, 0x03, 0x57, 0x0C, 0x8C, 0x76, 0x78, 0xB8, 0xAF, 0xF6, 0xA3, 0x0A, 0x00, 0xC7, - 0xAD, 0x57, 0x68, 0x93, 0xD1, 0x0B, 0x6E, 0x85, 0xAD, 0x56, 0x44, 0x09, 0x56, 0x89, 0x1F, 0x51, - 0x38, 0x3A, 0xC6, 0x1E, 0x9E, 0x69, 0xE8, 0x9D, 0x97, 0xD8, 0x4C, 0x41, 0xAF, 0xAA, 0xBE, 0x11, - 0xBB, 0xF3, 0x29, 0x63, 0x09, 0x00, 0x03, 0x6D, 0xB7, 0x92, 0xCB, 0xC0, 0xF0, 0x88, 0xDB, 0x53, - 0x15, 0xFC, 0x7E, 0xE4, 0x12, 0x31, 0x3A, 0x4A, 0x86, 0x7A, 0x12, 0x8D, 0x90, 0xD3, 0xDD, 0x7B, - 0xD8, 0xDE, 0xA5, 0xC2, 0x03, 0x35, 0x4A, 0x4D, 0x8F, 0x3E, 0x0C, 0x76, 0x71, 0xCE, 0x23, 0xB6, - 0xB3, 0xA1, 0x5B, 0x9C, 0x08, 0x9D, 0x8C, 0x47, 0xE6, 0x9A, 0x85, 0x25, 0x5B, 0x06, 0x94, 0x14, - 0x67, 0x18, 0x3E, 0xB2, 0x1C, 0x18, 0xCB, 0xB8, 0xFC, 0xC7, 0x51, 0x78, 0x1E, 0x4C, 0x81, 0x25, - 0xCA, 0x91, 0x3A, 0x93, 0xE2, 0xAB, 0xC5, 0x48, 0x7D, 0xB5, 0x28, 0x9F, 0x41, 0x46, 0x27, 0xE9, - 0x18, 0x12, 0x79, 0x11, 0x5D, 0x85, 0xD8, 0x7F, 0x72, 0x63, 0x07, 0xA1, 0x8F, 0xAF, 0x3F, 0x39, - 0xB7, 0x30, 0xBB, 0x5F, 0x3F, 0x44, 0x0E, 0x55, 0x7B, 0x69, 0x7B, 0x13, 0xDA, 0xCE, 0xB3, 0x1F, - 0x5D, 0x7A, 0xF3, 0x04, 0x58, 0x01, 0xFF, 0x86, 0xBE, 0x7C, 0xCC, 0x19, 0xD8, 0x1E, 0xC1, 0x7F, - 0x44, 0x94, 0xC4, 0x1C, 0x24, 0x6B, 0xF7, 0xC8, 0xE2, 0xB9, 0x8A, 0x61, 0x49, 0x64, 0x27, 0x8B, - 0x79, 0x30, 0xC1, 0x56, 0x0A, 0x5D, 0x00, 0x86, 0x79, 0x15, 0x9E, 0x9C, 0x90, 0xDD, 0x03, 0x8D, - 0x1D, 0x98, 0x65, 0x9B, 0xF6, 0x66, 0x74, 0x07, 0x6C, 0x45, 0x73, 0x8B, 0x65, 0x32, 0xB3, 0x30, - 0x80, 0x1C, 0xC3, 0x8C, 0xC1, 0x3B, 0x45, 0xDC, 0x66, 0x00, 0x2E, 0xD1, 0x2D, 0xCD, 0xA0, 0xC1, - 0xF0, 0x13, 0x5B, 0xF3, 0xF0, 0x27, 0x9E, 0xF8, 0x41, 0x1F, 0x9E, 0xDA, 0xCB, 0x30, 0x98, 0x44, - 0x7E, 0x1E, 0x83, 0x83, 0xB5, 0x39, 0xF4, 0x21, 0x6F, 0x69, 0x78, 0x82, 0xC7, 0x99, 0x38, 0x52, - 0x8A, 0x58, 0xBB, 0x4B, 0x00, 0x97, 0xBC, 0xDD, 0x1A, 0x16, 0xCB, 0x59, 0x82, 0x79, 0x94, 0xDD, - 0x84, 0x14, 0x15, 0x83, 0xDA, 0x71, 0xB7, 0x10, 0x0A, 0xC0, 0x2D, 0x19, 0x25, 0xAD, 0x98, 0x18, - 0x28, 0x9A, 0xB8, 0x66, 0xAC, 0xB4, 0x8A, 0x3C, 0x27, 0x50, 0x86, 0x2B, 0xCB, 0xA0, 0xFB, 0xE8, - 0x81, 0xD3, 0x2D, 0xDF, 0xFA, 0xA0, 0x54, 0x1B, 0x4E, 0x94, 0x16, 0x78, 0xDF, 0x70, 0x8A, 0xB0, - 0xEB, 0x80, 0x51, 0xA9, 0x58, 0x61, 0x62, 0x71, 0xBF, 0x73, 0x82, 0x6A, 0x33, 0x74, 0x9B, 0x8B, - 0xB1, 0x61, 0xA8, 0xC8, 0x34, 0x98, 0x4B, 0xDF, 0x61, 0xA8, 0x88, 0x62, 0xC8, 0xAE, 0xA8, 0x86, - 0x09, 0xF7, 0x6B, 0x44, 0xB6, 0x80, 0x50, 0xBD, 0xF7, 0xD3, 0x73, 0x0C, 0x8B, 0x72, 0x45, 0x81, - 0x5C, 0x05, 0xC8, 0x9F, 0xEF, 0x55, 0x01, 0x2B, 0xA9, 0x14, 0xE6, 0x62, 0x65, 0xED, 0x62, 0x3D, - 0xE8, 0x2A, 0x8D, 0x44, 0x2F, 0x4E, 0xB6, 0x98, 0xC3, 0x90, 0xEE, 0x34, 0xED, 0x84, 0x72, 0x02, - 0xE5, 0xFC, 0x34, 0xF6, 0x92, 0x94, 0x72, 0xEF, 0x30, 0xB4, 0xB5, 0x6F, 0x31, 0x05, 0x6E, 0x27, - 0xCB, 0x24, 0x8D, 0x2E, 0xA8, 0x53, 0xDD, 0x64, 0x18, 0xD9, 0xEA, 0x27, 0x2C, 0xBA, 0xED, 0x18, - 0x7A, 0x50, 0xF3, 0x01, 0x33, 0x8C, 0x74, 0x9F, 0x30, 0x30, 0x77, 0xA7, 0x43, 0xB2, 0xE4, 0x07, - 0x2C, 0x98, 0x7A, 0x0F, 0x31, 0x2C, 0x9A, 0x79, 0x0F, 0x65, 0x21, 0xF1, 0x04, 0x6D, 0x18, 0xC0, - 0xA2, 0x89, 0xFA, 0x30, 0x86, 0xB9, 0x7D, 0xF5, 0x30, 0x52, 0x8C, 0xAD, 0xA1, 0x30, 0xD6, 0xE6, - 0xA9, 0xE4, 0x27, 0xCC, 0x0D, 0xBB, 0x79, 0x2A, 0xFB, 0x80, 0x05, 0x4B, 0xF0, 0xA8, 0x60, 0x1A, - 0x0E, 0xBD, 0xF9, 0x3C, 0xBA, 0x52, 0xDF, 0x6C, 0x0E, 0x23, 0xBB, 0x94, 0x06, 0xFD, 0xD8, 0xBB, - 0x22, 0xC5, 0x89, 0x28, 0x7A, 0x11, 0x3E, 0x89, 0x49, 0x75, 0xF6, 0x1E, 0x77, 0x18, 0xD9, 0xD5, - 0x99, 0xF0, 0x22, 0x08, 0x83, 0x8B, 0xE5, 0xC5, 0x31, 0x1F, 0x0D, 0x46, 0xD8, 0xC8, 0x36, 0x25, - 0x43, 0xA6, 0xF5, 0x0F, 0x67, 0x19, 0x7D, 0x69, 0xAF, 0x4E, 0x3F, 0xFD, 0x49, 0xBD, 0x10, 0x47, - 0x01, 0x72, 0x46, 0xC1, 0x81, 0x76, 0xF0, 0x20, 0x44, 0x53, 0xC0, 0x5C, 0x22, 0xEA, 0x87, 0x12, - 0x3C, 0x06, 0xEE, 0x16, 0xA2, 0xB3, 0xBB, 0x94, 0x0E, 0x84, 0xBF, 0x50, 0x21, 0x2F, 0xB1, 0x5D, - 0x0A, 0x6A, 0x80, 0xE4, 0xFB, 0xBA, 0x3C, 0xB1, 0xD5, 0xC2, 0x1A, 0x23, 0xD1, 0x42, 0x6A, 0x02, - 0x29, 0x90, 0xB3, 0x07, 0xCD, 0xCE, 0x3F, 0x69, 0xA6, 0xCA, 0x56, 0x2C, 0x5F, 0x4D, 0x21, 0x45, - 0xF2, 0xC1, 0xA7, 0xF9, 0xF9, 0xA7, 0xC8, 0x24, 0x3C, 0x20, 0xB3, 0xC8, 0x87, 0xC8, 0xF8, 0x2C, - 0x6F, 0x35, 0xFF, 0xD4, 0x33, 0xC9, 0xD8, 0x15, 0x0A, 0x90, 0x24, 0x52, 0xA8, 0xC4, 0x09, 0xB4, - 0x5C, 0x29, 0x95, 0x14, 0x2D, 0x3E, 0xAA, 0xCC, 0x69, 0x25, 0xD3, 0xF4, 0x62, 0x0A, 0x3D, 0x8A, - 0x89, 0xB4, 0x60, 0x25, 0x57, 0xB1, 0x2A, 0x95, 0xD9, 0xA4, 0xB2, 0x89, 0xC1, 0x68, 0x35, 0x53, - 0x06, 0x1D, 0x41, 0x63, 0x3C, 0x63, 0xA4, 0xF0, 0x4A, 0x21, 0x4B, 0xA9, 0x54, 0x50, 0x95, 0xD5, - 0x4A, 0x85, 0xAC, 0x4C, 0x5F, 0x65, 0xD4, 0x45, 0x96, 0x33, 0x9D, 0xD8, 0x00, 0xA8, 0xFA, 0x31, - 0x06, 0xAB, 0x95, 0x88, 0x96, 0xAC, 0xA7, 0x67, 0x19, 0xEC, 0xF6, 0x1E, 0xB8, 0xEA, 0x69, 0x2F, - 0x79, 0x50, 0xAA, 0xC6, 0xFA, 0x45, 0x69, 0xC5, 0xB1, 0xA3, 0xC1, 0x0B, 0xCB, 0xA3, 0x47, 0x64, - 0xFD, 0xAB, 0x28, 0xDE, 0x1D, 0xEC, 0x41, 0x1D, 0xB2, 0x3D, 0x28, 0x35, 0x9D, 0x90, 0x1D, 0x6C, - 0x10, 0xE3, 0xF3, 0xE8, 0x7A, 0xB5, 0x22, 0x1F, 0x2F, 0xF1, 0xD4, 0x9B, 0xDC, 0x3C, 0xF3, 0xA7, - 0xF8, 0x48, 0x6C, 0xEB, 0x87, 0xCD, 0xC0, 0xC7, 0xD1, 0x34, 0xF6, 0x16, 0xB3, 0x60, 0xD2, 0xCC, - 0xE0, 0xFE, 0xEE, 0x03, 0x63, 0xAD, 0xA6, 0xF1, 0xCD, 0xD3, 0xD8, 0xBB, 0x3A, 0xA6, 0xF3, 0x95, - 0x30, 0x20, 0x4A, 0xED, 0x45, 0x74, 0xC5, 0xCE, 0xDD, 0x9E, 0x12, 0x40, 0x01, 0x35, 0x1B, 0x42, - 0xA9, 0x7D, 0x16, 0x5D, 0xF3, 0x88, 0x5A, 0x85, 0xF4, 0x79, 0x34, 0x79, 0xCF, 0x5D, 0x2D, 0xA8, - 0x39, 0x66, 0x4F, 0x35, 0xD5, 0xE5, 0x6F, 0x9B, 0x7F, 0xFF, 0xBD, 0x7F, 0xD5, 0x1C, 0x9E, 0x48, - 0x53, 0xAB, 0xAB, 0xE1, 0x3E, 0x9C, 0x0D, 0xFB, 0xD9, 0x18, 0x36, 0xFF, 0xFE, 0x7B, 0x3F, 0x96, - 0xE7, 0xEC, 0xF1, 0x1C, 0x97, 0xE5, 0x7C, 0x27, 0xCF, 0xD9, 0xE5, 0x39, 0x5D, 0x96, 0xF3, 0xE3, - 0x79, 0xCE, 0x80, 0xE7, 0xF4, 0x58, 0xCE, 0x4F, 0xE4, 0x39, 0x7D, 0xBD, 0x9D, 0x9F, 0xCC, 0x73, - 0x7A, 0x3C, 0x67, 0xC0, 0x72, 0x7E, 0x2A, 0xCF, 0xE9, 0xF2, 0x9C, 0x5D, 0x96, 0xF3, 0xD3, 0x79, - 0x8E, 0xCB, 0x73, 0xF6, 0x58, 0xCE, 0xCF, 0x94, 0xFB, 0xB3, 0xCF, 0x72, 0x7E, 0x56, 0xCF, 0xD9, - 0xCB, 0x73, 0x7E, 0x4E, 0xCF, 0xD9, 0xCD, 0x73, 0x7E, 0x5E, 0xCF, 0x19, 0xE4, 0x39, 0xFF, 0x5A, - 0xCF, 0xE9, 0xE7, 0x39, 0xBF, 0xA0, 0xE7, 0xF4, 0xF2, 0x9C, 0x7F, 0xA3, 0xE7, 0x74, 0xF3, 0x9C, - 0x5F, 0xD4, 0x73, 0xDC, 0x3C, 0xE7, 0xDF, 0xB2, 0x9C, 0x7E, 0xB9, 0x9D, 0xEF, 0x96, 0x7B, 0xCA, - 0xC7, 0xE7, 0x4B, 0x96, 0xB3, 0x57, 0x86, 0xF6, 0x3D, 0x7D, 0x14, 0xFA, 0xF9, 0x28, 0xFC, 0x6A, - 0xDE, 0x4E, 0x21, 0xE7, 0xD7, 0xCA, 0x3D, 0xE5, 0x39, 0xBF, 0x6E, 0xA2, 0x01, 0x34, 0x8F, 0xF2, - 0x6F, 0x98, 0xA0, 0x40, 0x73, 0x8B, 0xBF, 0x59, 0x05, 0xB7, 0x5F, 0xC6, 0xE1, 0xB7, 0x4C, 0xFC, - 0x5B, 0x2C, 0xCB, 0x7B, 0xFF, 0xDB, 0x65, 0x5A, 0x72, 0x28, 0xBF, 0x63, 0xCA, 0x81, 0x66, 0x4A, - 0x7D, 0xDF, 0x34, 0x22, 0xC6, 0x5E, 0xFF, 0xE3, 0xF7, 0x7F, 0xF7, 0xF7, 0x59, 0x61, 0xB7, 0x38, - 0x14, 0xFF, 0xF8, 0xFD, 0xDF, 0xFD, 0x03, 0x96, 0xD5, 0x35, 0x64, 0xFD, 0x21, 0xCB, 0xEA, 0x19, - 0xB2, 0xFE, 0x48, 0x6F, 0x5D, 0xCD, 0xFA, 0x63, 0x96, 0x35, 0x30, 0x64, 0xFD, 0x09, 0xCB, 0xDA, - 0x35, 0x64, 0xFD, 0x69, 0x79, 0x2A, 0xB9, 0x3C, 0xEB, 0xCF, 0xCA, 0xF3, 0x4F, 0x64, 0xFD, 0x79, - 0x79, 0xD2, 0x8A, 0xAC, 0xBF, 0x28, 0xCF, 0x74, 0x91, 0xF5, 0x97, 0x65, 0xF1, 0x20, 0xB2, 0xFE, - 0xAA, 0x2C, 0x53, 0x44, 0xD6, 0x5F, 0x9B, 0x26, 0x07, 0x34, 0x89, 0xA6, 0x7F, 0xFC, 0xFE, 0xEF, - 0xFE, 0x4D, 0x5D, 0x61, 0xA7, 0x50, 0xF8, 0x6F, 0x4D, 0x13, 0xA5, 0xAA, 0xF0, 0xDF, 0xD5, 0x15, - 0x2E, 0xA0, 0xF1, 0x7B, 0x06, 0xB1, 0xEA, 0x56, 0x16, 0xFE, 0xB1, 0xBA, 0xC2, 0xDD, 0x52, 0x4A, - 0x7F, 0x2D, 0xC0, 0xEF, 0x94, 0x01, 0x76, 0x79, 0xD6, 0x8F, 0x97, 0xB3, 0x7A, 0x3C, 0xEB, 0x27, - 0xCA, 0x59, 0x03, 0x9E, 0xF5, 0x93, 0xE5, 0xAC, 0x5D, 0x9E, 0xF5, 0x53, 0xE5, 0xAC, 0x3D, 0x9E, - 0xF5, 0xD3, 0x3A, 0xD7, 0x75, 0x73, 0xAE, 0xFB, 0xBD, 0x9F, 0xD1, 0x79, 0xB5, 0xA7, 0x64, 0xFD, - 0xAC, 0xCE, 0xFC, 0x03, 0x25, 0xEB, 0xE7, 0xF4, 0x29, 0xB3, 0xAB, 0x64, 0xFD, 0xBC, 0x3E, 0xD1, - 0xF6, 0x94, 0xAC, 0x2F, 0xCB, 0x62, 0xB7, 0xAB, 0x89, 0x88, 0x3C, 0xA5, 0xCB, 0x09, 0x9E, 0xA7, - 0xEC, 0x96, 0x52, 0xC4, 0x10, 0xE8, 0x70, 0xFA, 0x25, 0x38, 0xBB, 0x25, 0x38, 0x79, 0x0A, 0x43, - 0xEC, 0x7B, 0x7A, 0x77, 0xF4, 0xC2, 0x4E, 0xA9, 0xD1, 0x6E, 0xA9, 0xD1, 0x6E, 0xA9, 0xD1, 0x7E, - 0x09, 0x4E, 0xBF, 0x04, 0x67, 0xB7, 0x04, 0xA7, 0x88, 0xD8, 0xAF, 0x96, 0x27, 0xBE, 0x5E, 0x9D, - 0x73, 0x54, 0x36, 0x12, 0x4E, 0xEF, 0x88, 0x2A, 0xF1, 0x4B, 0xCD, 0xE1, 0xC9, 0x89, 0xCB, 0x3C, - 0xC2, 0x8D, 0xE1, 0x89, 0xA3, 0xFD, 0x72, 0xB5, 0x34, 0x2A, 0x48, 0x7F, 0x99, 0x97, 0x67, 0xE9, - 0xF4, 0x5F, 0x97, 0xFF, 0xA6, 0xF9, 0xBF, 0x42, 0xF2, 0x59, 0x9A, 0xCB, 0xFF, 0x75, 0xF8, 0xEF, - 0x71, 0x36, 0xAA, 0x52, 0x8F, 0x6E, 0x9B, 0x7F, 0xFF, 0xDD, 0x7F, 0xD5, 0x1C, 0xDE, 0xBA, 0xC3, - 0xE6, 0x2B, 0x07, 0xDA, 0x83, 0xC6, 0x4B, 0x17, 0xDA, 0x83, 0x66, 0x06, 0x9B, 0x7F, 0xFF, 0xDD, - 0x1F, 0x6B, 0x0E, 0x6F, 0x7B, 0x86, 0xF4, 0xEF, 0xF0, 0xF2, 0xF6, 0x00, 0x3A, 0x8D, 0x97, 0xF6, - 0x00, 0xBA, 0x2C, 0xFD, 0xC7, 0x79, 0xF9, 0x62, 0xFA, 0xBF, 0x16, 0xF0, 0x49, 0x12, 0xCD, 0xD0, - 0xE1, 0xFD, 0xA2, 0x68, 0xA7, 0x22, 0xFF, 0xDF, 0x6A, 0xF8, 0xF1, 0xEC, 0x1C, 0xFC, 0xAF, 0x68, - 0x68, 0x96, 0xB2, 0xBF, 0x5B, 0xC4, 0x56, 0x07, 0xFE, 0xAB, 0x45, 0xA4, 0xF5, 0xEC, 0x5F, 0x33, - 0xD5, 0x76, 0x64, 0xF6, 0x6F, 0x9A, 0x6A, 0xE7, 0xD9, 0xBF, 0x55, 0xA2, 0x54, 0xE3, 0x55, 0xA9, - 0x89, 0xFF, 0x58, 0x22, 0x9B, 0xA1, 0xD0, 0x7F, 0xAA, 0x86, 0x94, 0x37, 0xF7, 0x3F, 0xAB, 0x21, - 0xE5, 0x85, 0xFE, 0x57, 0x69, 0xB4, 0x65, 0xA1, 0x9C, 0x68, 0x7F, 0x54, 0x1A, 0x7A, 0x43, 0xA1, - 0x3F, 0xAE, 0x85, 0xE4, 0xB0, 0x42, 0x7F, 0x55, 0x0B, 0x89, 0x17, 0xFA, 0x6B, 0x33, 0x24, 0x95, - 0x8B, 0xBE, 0xFC, 0x79, 0x33, 0x20, 0xAD, 0xCC, 0x1F, 0xE7, 0x54, 0xD2, 0x3A, 0xFD, 0xE5, 0x9F, - 0xE7, 0x94, 0xD1, 0x33, 0xFE, 0x44, 0xAF, 0x21, 0x51, 0xFA, 0xF2, 0x2F, 0xF4, 0x1A, 0x79, 0xC6, - 0x9F, 0xEA, 0x35, 0xE4, 0x10, 0x7D, 0xF9, 0x97, 0x7A, 0x8D, 0x3C, 0xE3, 0xCF, 0x4A, 0x6D, 0x70, - 0x74, 0xFF, 0xAA, 0xD4, 0x06, 0xCF, 0x60, 0x1C, 0xCF, 0x6F, 0xCC, 0xBF, 0x78, 0xE5, 0xC0, 0x0F, - 0x6E, 0xED, 0x41, 0x27, 0xCD, 0x08, 0x54, 0xF1, 0x93, 0xA7, 0xB6, 0xF3, 0xD4, 0x76, 0x9A, 0x7D, - 0x41, 0xAB, 0xFF, 0x92, 0x5E, 0x9D, 0xD6, 0xC0, 0x19, 0x21, 0x95, 0xF8, 0xE9, 0x36, 0x68, 0x6A, - 0x3B, 0x4F, 0x25, 0x3F, 0x5D, 0x56, 0xFD, 0x97, 0xF5, 0xEA, 0x72, 0x56, 0x9A, 0x90, 0xE0, 0xC9, - 0x26, 0x2C, 0x7E, 0xC5, 0x8C, 0x85, 0x9B, 0x63, 0x91, 0x0F, 0xA4, 0xC0, 0x80, 0xA4, 0x14, 0xB0, - 0xF9, 0xAE, 0x0E, 0x26, 0x6F, 0x5B, 0x82, 0x29, 0x25, 0xB8, 0x8D, 0x57, 0x6E, 0x8E, 0x96, 0x80, - 0x57, 0x4A, 0xE0, 0x0D, 0x7C, 0x59, 0x49, 0x6C, 0xB5, 0xCF, 0x6C, 0x36, 0x29, 0x34, 0xCF, 0x7B, - 0xCE, 0xC0, 0x7C, 0xAF, 0xDC, 0xDD, 0x76, 0xDE, 0x5D, 0xD1, 0x39, 0x47, 0x76, 0xB7, 0xA3, 0x74, - 0xB7, 0x93, 0x63, 0xF3, 0xAB, 0x26, 0x6C, 0xDA, 0xC5, 0xEE, 0xB6, 0x0B, 0xDD, 0x75, 0x74, 0x22, - 0xB4, 0x8B, 0x54, 0x51, 0xBA, 0xFB, 0x6B, 0xA5, 0xD1, 0x75, 0xD4, 0xCE, 0x28, 0xC3, 0x28, 0x47, - 0x57, 0x1F, 0x74, 0x06, 0xE6, 0xD7, 0x8B, 0xC3, 0xA2, 0xF6, 0x45, 0xFD, 0xED, 0x98, 0x47, 0xD7, - 0x61, 0x60, 0x7E, 0xA3, 0x76, 0x74, 0x8D, 0xFD, 0x70, 0x4A, 0xA3, 0x6B, 0xA4, 0x0A, 0x6F, 0xE0, - 0x37, 0x2B, 0xE9, 0xA9, 0xF6, 0x99, 0x52, 0xC1, 0x3C, 0xF4, 0x0C, 0xCC, 0x6F, 0x15, 0xC1, 0xA8, - 0x7D, 0xD1, 0xFA, 0x65, 0x1E, 0x5D, 0x8E, 0xCD, 0x6F, 0x57, 0xF2, 0x5A, 0x25, 0x33, 0x3B, 0x8D, - 0x22, 0x13, 0x18, 0x99, 0x99, 0x37, 0xF0, 0x3B, 0x15, 0xA3, 0xEB, 0x56, 0x0C, 0x66, 0xED, 0x0C, - 0xFE, 0xFE, 0x7D, 0xE5, 0x88, 0x3E, 0xE4, 0x84, 0x37, 0x18, 0xC0, 0x7F, 0xB7, 0x09, 0xC0, 0x8D, - 0xA6, 0x6E, 0x63, 0x33, 0x56, 0x61, 0xCD, 0xFE, 0xFB, 0x6A, 0xA2, 0x98, 0x67, 0x7B, 0xDD, 0x3C, - 0xFF, 0x0F, 0x55, 0x9C, 0xC0, 0x87, 0xFC, 0xCE, 0xE2, 0xF6, 0x3F, 0x9A, 0x05, 0x87, 0x4E, 0xCF, - 0xFB, 0xC9, 0x01, 0x33, 0x43, 0xB1, 0x66, 0xFF, 0xD3, 0x7D, 0xD7, 0x18, 0x9D, 0x65, 0x08, 0x19, - 0x19, 0xC0, 0xFF, 0x6C, 0x22, 0x8C, 0x5B, 0x2D, 0xEF, 0x6A, 0xA5, 0xFE, 0x7F, 0xB9, 0x23, 0x76, - 0x75, 0x44, 0xB9, 0xC3, 0x5A, 0xF0, 0x5F, 0x6B, 0x84, 0xA3, 0xD2, 0xE4, 0xE6, 0x4B, 0xF1, 0x7F, - 0xBB, 0x1B, 0x51, 0xEA, 0x85, 0xE5, 0x7F, 0xAF, 0x94, 0x65, 0xCA, 0xE0, 0x6C, 0x28, 0x53, 0xEE, - 0x30, 0x7D, 0xFE, 0xC7, 0x46, 0xD3, 0x67, 0x23, 0x72, 0xFC, 0xCF, 0xF5, 0xE4, 0xD8, 0x74, 0xDA, - 0xFC, 0xAF, 0x7B, 0x2D, 0x94, 0x1B, 0x0A, 0x97, 0xAF, 0x9E, 0x88, 0x7F, 0xC0, 0x95, 0x40, 0x97, - 0x74, 0xC5, 0x11, 0x8A, 0xDE, 0x1F, 0x4A, 0xC5, 0xD7, 0x21, 0x74, 0xE0, 0xA9, 0x7F, 0x54, 0x28, - 0xDB, 0x28, 0xE4, 0xFF, 0xB5, 0x41, 0xCD, 0x85, 0x46, 0xD5, 0xF3, 0x6F, 0x0C, 0xEA, 0x2D, 0x34, - 0xAA, 0x9C, 0x7F, 0x6B, 0x50, 0x6B, 0xA1, 0x51, 0x65, 0xFE, 0x3B, 0x83, 0x3A, 0x0B, 0x4D, 0xAA, - 0xF2, 0x77, 0x7F, 0x61, 0x4D, 0xC9, 0x7C, 0x7B, 0xF3, 0x6F, 0xD6, 0xB4, 0x9E, 0x6F, 0x3A, 0x7E, - 0x69, 0x0D, 0xCC, 0x7C, 0xA3, 0xF3, 0xCB, 0x6B, 0xA8, 0x94, 0xC3, 0xFC, 0x72, 0x0D, 0x95, 0x72, - 0x3C, 0xBF, 0xB7, 0x1E, 0x4F, 0xDE, 0xF7, 0x5F, 0x5F, 0x03, 0x33, 0xC7, 0xF3, 0x37, 0xD6, 0xE3, - 0xC9, 0x61, 0xFE, 0x76, 0x79, 0xE3, 0x6D, 0x46, 0xF3, 0x77, 0xAA, 0x77, 0xDC, 0x66, 0xC8, 0xDF, - 0xAF, 0xDC, 0x24, 0x9B, 0x29, 0xF6, 0xEF, 0x6A, 0xE8, 0xA0, 0xED, 0xFD, 0xFF, 0x7D, 0xCD, 0x70, - 0x99, 0xF6, 0xDB, 0xFF, 0xA1, 0x8A, 0x6C, 0x55, 0x87, 0x03, 0xFF, 0xB9, 0x9E, 0x26, 0x39, 0x99, - 0xFF, 0x4B, 0xE5, 0x29, 0x82, 0x99, 0x24, 0xFF, 0xB5, 0x72, 0xE7, 0x6F, 0x26, 0xC9, 0x7F, 0xAB, - 0x19, 0x46, 0x8D, 0x24, 0xFF, 0x7D, 0x23, 0x92, 0xE4, 0x88, 0xFF, 0x8F, 0x4A, 0x92, 0x98, 0x0F, - 0x3C, 0x7E, 0x77, 0xB3, 0xC1, 0xCF, 0x1B, 0xF8, 0xBD, 0x8D, 0x28, 0x93, 0x93, 0xFC, 0x7F, 0x57, - 0x75, 0xA0, 0x78, 0x50, 0xF4, 0xFB, 0xE5, 0x83, 0x25, 0x33, 0xED, 0xFE, 0xA0, 0x8A, 0x9D, 0x2A, - 0xBA, 0xF8, 0x87, 0x55, 0xB4, 0xAE, 0xE2, 0x92, 0x3F, 0xD9, 0x88, 0xBF, 0x73, 0x92, 0xFC, 0xE9, - 0x46, 0x83, 0x9F, 0xC3, 0x2F, 0x6F, 0xF1, 0x1D, 0x33, 0x49, 0xFE, 0x7C, 0x2D, 0x49, 0x38, 0xFB, - 0xFD, 0xC5, 0xDA, 0x19, 0xA6, 0x63, 0xFC, 0x97, 0x6B, 0xD9, 0x4F, 0x47, 0xE4, 0x6F, 0xD6, 0x1C, - 0x4D, 0x99, 0xE9, 0xF2, 0xB7, 0x6B, 0x8E, 0xA1, 0xCC, 0xD4, 0xF9, 0xBB, 0x8A, 0x39, 0x5A, 0x20, - 0xCE, 0x97, 0xE5, 0x83, 0xC8, 0xC6, 0xFA, 0x55, 0xE6, 0xCB, 0x1F, 0x2B, 0xD3, 0xBE, 0xB1, 0x96, - 0xE5, 0xBE, 0xFC, 0x4E, 0xF5, 0x40, 0x68, 0x47, 0x4A, 0x3F, 0xBE, 0x7E, 0x36, 0x19, 0x86, 0xE3, - 0xCB, 0x9F, 0x58, 0x3B, 0xA7, 0x0C, 0x83, 0xF2, 0xE5, 0x4F, 0xD6, 0xB3, 0xA9, 0x79, 0x36, 0x7C, - 0xF9, 0x53, 0xF5, 0xCC, 0x5A, 0x31, 0x27, 0xBE, 0xFC, 0xE9, 0x0D, 0xD6, 0xF1, 0x46, 0x69, 0x8C, - 0x7E, 0x66, 0x3D, 0xA7, 0x97, 0x8F, 0x0A, 0xBF, 0xFC, 0xD9, 0xF5, 0xEB, 0x45, 0xF9, 0xA8, 0xF2, - 0xCB, 0x9F, 0x5B, 0x2F, 0x52, 0xCB, 0x47, 0xA5, 0x5F, 0x8A, 0xE3, 0x66, 0x9B, 0x9D, 0x49, 0xD8, - 0x7D, 0x86, 0xD2, 0x2E, 0xFB, 0x7A, 0x24, 0xCB, 0xFD, 0x82, 0x38, 0x7D, 0xAB, 0x2F, 0xF7, 0x5D, - 0x31, 0x94, 0xB6, 0xB3, 0xBB, 0xBB, 0xC7, 0x32, 0xBB, 0xFC, 0xD7, 0x2B, 0x56, 0xE9, 0x25, 0xAB, - 0xF4, 0xCA, 0xDE, 0xEB, 0xF5, 0x7A, 0xBC, 0x3A, 0xFB, 0xC5, 0x20, 0xFC, 0xA4, 0x68, 0xE9, 0xDE, - 0x10, 0x24, 0xD5, 0x1D, 0x4E, 0xD9, 0x2E, 0x2B, 0xCE, 0xCB, 0xF6, 0x07, 0x9C, 0xEC, 0x3C, 0x97, - 0x83, 0xDE, 0xE7, 0x90, 0x06, 0x12, 0xCE, 0xCF, 0x4A, 0x4C, 0x1E, 0x04, 0xE7, 0x4B, 0x55, 0x5F, - 0xE3, 0xBC, 0xD5, 0x67, 0x43, 0xB1, 0xCB, 0xBE, 0x1E, 0xB1, 0x72, 0xBF, 0xA8, 0x9C, 0x70, 0xD6, - 0x94, 0xFB, 0xAE, 0xC2, 0xC2, 0x94, 0x48, 0x2C, 0x93, 0x10, 0x89, 0x95, 0xEE, 0xB3, 0x84, 0x5D, - 0xF6, 0x45, 0x88, 0xC4, 0xAB, 0xF7, 0x7A, 0x3D, 0x06, 0xE1, 0xA7, 0x95, 0x96, 0xEE, 0x07, 0x41, - 0xE5, 0x36, 0x87, 0xCF, 0xB3, 0x2E, 0x2B, 0xCE, 0xCB, 0xF6, 0xC5, 0xEC, 0xE3, 0x2C, 0xCE, 0x1B, - 0x79, 0xC4, 0x89, 0xFB, 0xF3, 0x2A, 0x0A, 0xF7, 0x00, 0xF0, 0xE5, 0xEF, 0xD6, 0x1C, 0xBC, 0xB6, - 0xD3, 0x1D, 0xDB, 0x1D, 0x6C, 0xDB, 0x83, 0xAC, 0x71, 0x5C, 0x4A, 0x82, 0x14, 0x28, 0xCC, 0x0F, - 0x5A, 0x7E, 0xEF, 0x81, 0x90, 0x1C, 0x09, 0xE9, 0x7F, 0xD7, 0xEE, 0x88, 0x4B, 0x90, 0x3A, 0xD5, - 0x90, 0x7E, 0xFF, 0x81, 0x90, 0x58, 0xEF, 0x32, 0x58, 0x61, 0x00, 0x74, 0xDB, 0xFC, 0x87, 0xEF, - 0x90, 0x26, 0xFC, 0x7C, 0x3B, 0xC5, 0x84, 0x86, 0xDB, 0x84, 0xE9, 0xCD, 0x02, 0x0F, 0x1D, 0x48, - 0x8D, 0xD0, 0x5E, 0x7B, 0xBE, 0x1F, 0x84, 0xD3, 0x61, 0x37, 0x83, 0xCD, 0x7F, 0xF8, 0xCE, 0x1F, - 0xF0, 0x1A, 0x1D, 0x17, 0x76, 0xA4, 0xFC, 0x7A, 0xD9, 0x71, 0xA1, 0x4B, 0x64, 0x0D, 0xAD, 0xE7, - 0xC2, 0x39, 0x3E, 0x97, 0xD5, 0x5C, 0x1D, 0x8A, 0x4B, 0xA1, 0xFC, 0x21, 0x87, 0xC2, 0x37, 0x6C, - 0x0C, 0x50, 0xDE, 0xAE, 0x5A, 0x9F, 0x35, 0xFB, 0x47, 0xBC, 0x42, 0x97, 0xB5, 0xCA, 0xAA, 0x74, - 0xEF, 0xD6, 0xE8, 0x1F, 0xAB, 0x9D, 0x25, 0xBB, 0xC4, 0x63, 0xC7, 0x1E, 0x0C, 0xBA, 0x90, 0x06, - 0x96, 0xB2, 0xF7, 0xF6, 0x76, 0x29, 0xC5, 0x1A, 0xC7, 0xE4, 0xAB, 0xDB, 0xED, 0x43, 0x96, 0x4B, - 0x6F, 0x14, 0xCD, 0x14, 0x61, 0x60, 0xFF, 0x44, 0x82, 0xBD, 0x07, 0x44, 0x23, 0xA2, 0x7F, 0xAA, - 0x52, 0xC7, 0x65, 0x60, 0xFB, 0xFD, 0x7D, 0x1A, 0xFF, 0x8A, 0x81, 0xA5, 0xFD, 0x3F, 0x76, 0x24, - 0x58, 0x92, 0x4B, 0x2F, 0x41, 0x8D, 0x24, 0x64, 0x50, 0xFF, 0x4C, 0x42, 0xBD, 0x07, 0x40, 0xD7, - 0x00, 0xF0, 0xCF, 0x05, 0x2B, 0xD8, 0x03, 0xCE, 0x0B, 0x84, 0xE9, 0x28, 0x3B, 0xB0, 0x1F, 0x02, - 0x19, 0x5A, 0xFA, 0x2F, 0x2A, 0x4A, 0x6F, 0x3E, 0x7E, 0x7F, 0x29, 0x3A, 0x20, 0x20, 0x74, 0x44, - 0x7B, 0xAE, 0xA1, 0xBD, 0xBF, 0xAE, 0x2C, 0xCD, 0x31, 0xD0, 0x4A, 0xFF, 0x4D, 0x45, 0xE9, 0xCD, - 0xB1, 0xFB, 0xDB, 0x4A, 0x6A, 0xB8, 0x85, 0xF6, 0xAA, 0x66, 0xE4, 0x49, 0xF3, 0x1F, 0xBE, 0xF3, - 0x57, 0xCD, 0x71, 0x85, 0xC1, 0xDE, 0x09, 0xA5, 0xE1, 0xB8, 0xA6, 0xEE, 0xDF, 0xD5, 0xD6, 0xFD, - 0x1B, 0x5A, 0xB7, 0x6C, 0x1E, 0xA8, 0xD8, 0x22, 0x07, 0x30, 0x84, 0x73, 0x38, 0x61, 0x21, 0xE4, - 0x85, 0x51, 0xFF, 0xB4, 0xDA, 0x22, 0xF0, 0x24, 0xA0, 0xAF, 0x45, 0xA6, 0xE2, 0x41, 0x48, 0xF1, - 0xA5, 0x2C, 0x8C, 0x61, 0x94, 0x9B, 0x37, 0x87, 0xC8, 0x19, 0x85, 0x07, 0xA9, 0x30, 0x69, 0x0E, - 0xF3, 0xD7, 0x16, 0x1E, 0x4A, 0x4F, 0xC2, 0x31, 0x9C, 0xA1, 0x78, 0x67, 0x1F, 0xCE, 0x51, 0xB4, - 0xB3, 0x3F, 0xC2, 0xB9, 0x63, 0xF9, 0xA0, 0xED, 0xD9, 0xD7, 0xDB, 0x33, 0x98, 0xB4, 0x3D, 0xFB, - 0x66, 0x7B, 0x0E, 0x3D, 0xFB, 0x6A, 0x7B, 0x06, 0x3D, 0x7B, 0xB6, 0x3D, 0x07, 0x59, 0x66, 0x61, - 0x38, 0x15, 0x68, 0x03, 0xB8, 0x25, 0xCC, 0x13, 0x2F, 0x51, 0xCC, 0xB1, 0xBB, 0xAC, 0xC0, 0x2E, - 0x66, 0x2F, 0x17, 0x08, 0x66, 0x33, 0x14, 0x51, 0x4F, 0x96, 0x29, 0x18, 0xCD, 0x56, 0x2B, 0x6B, - 0x46, 0xFD, 0xC5, 0xBE, 0xF2, 0x16, 0x30, 0xB2, 0x13, 0x92, 0x0C, 0x67, 0x40, 0x3C, 0xC2, 0x9F, - 0x23, 0x9C, 0x3F, 0xFC, 0x26, 0xE0, 0x9B, 0x09, 0x0D, 0x1A, 0xD5, 0xDC, 0x42, 0x64, 0x74, 0xA3, - 0xF3, 0xC6, 0x1C, 0x14, 0x63, 0x1D, 0x7E, 0xF1, 0x69, 0x88, 0xAF, 0x17, 0xF4, 0x1D, 0x64, 0x43, - 0xD6, 0x6D, 0x90, 0xE2, 0x8D, 0xE6, 0x07, 0xB7, 0xF3, 0xAC, 0xF9, 0x05, 0x7B, 0x38, 0x3C, 0x41, - 0x33, 0x8A, 0xC6, 0x9C, 0xBE, 0x32, 0xD9, 0x9A, 0x28, 0x01, 0xFF, 0x4F, 0x9C, 0xB1, 0x08, 0xB2, - 0x16, 0x23, 0x41, 0x42, 0x18, 0xAD, 0x8D, 0x8F, 0x35, 0x8A, 0xB8, 0xE7, 0xBE, 0x00, 0x46, 0x22, - 0xDA, 0x49, 0xCC, 0xBB, 0x12, 0x9A, 0xE2, 0xE3, 0x45, 0xC5, 0x40, 0x4D, 0xF4, 0x9D, 0x27, 0xE9, - 0xCB, 0x8B, 0x0B, 0x6F, 0x4A, 0x03, 0x5A, 0x5A, 0x01, 0x8C, 0x19, 0xC2, 0x94, 0x4F, 0xE0, 0x94, - 0x60, 0x3B, 0xB7, 0xA9, 0xCB, 0x8B, 0xE4, 0xB3, 0x20, 0x9D, 0x59, 0xCD, 0x6F, 0x36, 0x01, 0xF0, - 0xD1, 0xC2, 0x8B, 0x13, 0xFC, 0x22, 0x4C, 0x49, 0x26, 0x7D, 0xD5, 0xE0, 0xC2, 0x1E, 0x80, 0xEE, - 0x2E, 0x0D, 0x82, 0x5F, 0xCC, 0xEB, 0xC1, 0x01, 0xCB, 0x5B, 0x96, 0xF3, 0x06, 0x70, 0x8F, 0xE5, - 0x4D, 0xD1, 0x5C, 0xC4, 0x5E, 0xDF, 0x6B, 0xB5, 0x4A, 0xE5, 0xF6, 0xE0, 0x23, 0x5A, 0x6E, 0xB5, - 0x72, 0xD9, 0x6B, 0x79, 0x42, 0x46, 0x1D, 0xB3, 0x78, 0x7A, 0xE6, 0x35, 0xC1, 0x86, 0x43, 0x44, - 0x6D, 0x9E, 0x1B, 0xE7, 0x51, 0x7C, 0xE1, 0xA5, 0x7C, 0xA8, 0x1A, 0x57, 0x33, 0x1C, 0x36, 0x7C, - 0x66, 0x17, 0xD2, 0x58, 0x78, 0x69, 0x8A, 0xE3, 0xB0, 0x41, 0x63, 0x7E, 0x7F, 0x01, 0x46, 0x27, - 0x9C, 0x22, 0x63, 0x34, 0xB7, 0x93, 0xE5, 0x19, 0x63, 0x0D, 0x6B, 0x00, 0x05, 0xD6, 0x1D, 0x17, - 0xD0, 0xB7, 0x3E, 0xA9, 0xD5, 0x84, 0x4D, 0x60, 0x5F, 0x78, 0x0B, 0xEA, 0xCC, 0x82, 0x76, 0x84, - 0xC6, 0xCC, 0xA3, 0x9E, 0x2B, 0xE4, 0x53, 0x2D, 0x8C, 0x9C, 0x11, 0x3E, 0x88, 0x47, 0xB8, 0xDD, - 0x06, 0x22, 0x2D, 0x41, 0xCE, 0x28, 0x39, 0x08, 0x46, 0x49, 0xBB, 0x0D, 0x3C, 0xDB, 0xF7, 0x52, - 0xEF, 0xA4, 0xBF, 0x6D, 0xE1, 0xED, 0xA0, 0x9D, 0x80, 0x31, 0xF2, 0x61, 0x31, 0xAD, 0xED, 0x8E, - 0xD1, 0x69, 0x39, 0xB5, 0x3B, 0x46, 0xCB, 0x72, 0x6A, 0x6F, 0x8C, 0xD2, 0x13, 0x3C, 0x3E, 0x49, - 0xC6, 0xDB, 0x56, 0x77, 0x30, 0xD8, 0x9E, 0x82, 0x51, 0x68, 0x2F, 0x96, 0x69, 0x3E, 0xF6, 0x1E, - 0x59, 0x31, 0x00, 0x9C, 0xD4, 0xC6, 0x56, 0x64, 0x54, 0xB1, 0x22, 0xEA, 0xC8, 0x1B, 0x00, 0x38, - 0xA3, 0xD3, 0x68, 0x0E, 0x27, 0x20, 0x53, 0x66, 0x0F, 0x9A, 0x40, 0x75, 0x96, 0xF3, 0x09, 0x49, - 0x26, 0xF4, 0xA5, 0x61, 0x42, 0x9F, 0x57, 0x19, 0x2C, 0xF3, 0x69, 0x7E, 0x5E, 0x27, 0x84, 0x60, - 0x08, 0x6E, 0xB1, 0xE6, 0x34, 0x4F, 0x9D, 0xC5, 0x84, 0xB4, 0xB4, 0x91, 0x93, 0x39, 0x9C, 0x8C, - 0xA3, 0xF3, 0x06, 0x37, 0xBB, 0xC6, 0x61, 0x1A, 0x07, 0x38, 0xB1, 0x52, 0xC0, 0xC4, 0x44, 0x3A, - 0xC2, 0x5A, 0x28, 0x05, 0xAC, 0x44, 0x72, 0x09, 0xB7, 0x3F, 0x5E, 0x5E, 0x9C, 0xE1, 0xD8, 0xCE, - 0x99, 0x12, 0xC0, 0x14, 0x35, 0x05, 0x36, 0x4D, 0x24, 0xE4, 0xC3, 0xE4, 0x68, 0x62, 0xD9, 0x2E, - 0x51, 0xEF, 0x07, 0x3B, 0xD1, 0x76, 0x0C, 0x86, 0x93, 0x1C, 0x81, 0xC6, 0xBC, 0x11, 0x9D, 0x37, - 0x52, 0xC1, 0x23, 0x8D, 0x26, 0x10, 0x32, 0x20, 0x45, 0xF3, 0x13, 0x67, 0x0C, 0x27, 0xC8, 0xE3, - 0x4F, 0xF4, 0x84, 0x78, 0xC8, 0x23, 0x3F, 0x7E, 0x71, 0x1C, 0x2D, 0xE7, 0x7E, 0x23, 0x8C, 0xD2, - 0xC6, 0x79, 0x10, 0xFA, 0x92, 0x49, 0x03, 0xFE, 0x76, 0x9F, 0x10, 0x8B, 0x30, 0x33, 0xE1, 0xE4, - 0x94, 0x0A, 0x9D, 0x49, 0x14, 0xA6, 0x41, 0xB8, 0xC4, 0x99, 0x78, 0x15, 0xA9, 0x72, 0xAD, 0xC6, - 0xAA, 0x23, 0xFF, 0xC4, 0x19, 0xB7, 0x5A, 0xFE, 0x89, 0x3B, 0x6E, 0xB5, 0x26, 0x16, 0x86, 0x33, - 0xCB, 0xA7, 0x84, 0x25, 0x04, 0xDE, 0x72, 0x60, 0x08, 0xC8, 0xD0, 0x32, 0x02, 0x53, 0xCA, 0x4C, - 0xE6, 0x51, 0x82, 0x19, 0x9D, 0xA8, 0x8C, 0x3E, 0x97, 0x4B, 0xCB, 0x52, 0x19, 0xD4, 0xE3, 0xAA, - 0xF5, 0x2A, 0x10, 0xE1, 0x20, 0xB7, 0xB6, 0x8E, 0x5B, 0x2D, 0xCB, 0x3C, 0xA6, 0x70, 0xCE, 0xDC, - 0x57, 0x4F, 0xA0, 0x3F, 0x12, 0x2F, 0x0E, 0xC9, 0x94, 0x26, 0xCD, 0x76, 0x9F, 0x8E, 0x4E, 0x59, - 0x84, 0x0B, 0xB1, 0x0E, 0x51, 0xA4, 0x82, 0x85, 0x75, 0x4A, 0x7E, 0x29, 0xC3, 0xC8, 0xAB, 0x2E, - 0x51, 0xB8, 0xE3, 0x76, 0x47, 0xEA, 0x98, 0xCE, 0xB7, 0x97, 0xCA, 0xD0, 0x84, 0x6C, 0x68, 0x7C, - 0xC3, 0xE0, 0x9C, 0xA2, 0x90, 0x0C, 0xCE, 0x14, 0x79, 0x27, 0xA7, 0x6C, 0x70, 0xA6, 0x0F, 0x19, - 0x9C, 0x53, 0xD3, 0xE0, 0x5C, 0xA2, 0xB0, 0x72, 0x70, 0x2E, 0xE9, 0xE0, 0x5C, 0xD2, 0xC1, 0x99, - 0xD2, 0xC1, 0xB9, 0xCC, 0x07, 0xC7, 0x85, 0x73, 0x48, 0x7D, 0x98, 0x6F, 0x21, 0x64, 0x4D, 0xE8, - 0xE2, 0x21, 0x35, 0x19, 0xD0, 0x6A, 0x49, 0x97, 0x29, 0x93, 0xA3, 0xC9, 0xD0, 0x01, 0xDB, 0xD6, - 0x72, 0xA7, 0x0B, 0xF2, 0x0A, 0x3E, 0x4A, 0x6D, 0x55, 0xD9, 0x51, 0x6B, 0xF8, 0x47, 0xBE, 0xAC, - 0x01, 0x40, 0x46, 0x23, 0xB6, 0xDB, 0x84, 0xCB, 0x8F, 0xAC, 0xCA, 0xC9, 0x06, 0x73, 0x2E, 0x01, - 0x43, 0x96, 0x5E, 0xE2, 0x17, 0x0B, 0xC3, 0x63, 0x4D, 0x13, 0xA1, 0x4E, 0xDA, 0x47, 0x22, 0xAA, - 0x2B, 0x5F, 0x9C, 0xF3, 0x10, 0xB9, 0x9C, 0x2D, 0x90, 0x23, 0x1F, 0x9D, 0x30, 0x27, 0xD8, 0xDE, - 0xB5, 0x95, 0x7B, 0xC3, 0x86, 0x29, 0x80, 0x01, 0xC8, 0x84, 0xC2, 0x71, 0x7B, 0x2C, 0x36, 0x56, - 0x84, 0x19, 0xBE, 0x1D, 0xE0, 0xF8, 0x78, 0x19, 0x5F, 0xE2, 0x77, 0x91, 0x45, 0xD6, 0x5A, 0x98, - 0x9E, 0xB8, 0xE4, 0x9F, 0x2E, 0xF9, 0xA7, 0x47, 0xFE, 0xE9, 0x93, 0x7F, 0x06, 0x63, 0x00, 0x5F, - 0xE6, 0xF5, 0x08, 0xA7, 0xA8, 0x15, 0x00, 0x7C, 0x95, 0x67, 0xD2, 0x57, 0xA8, 0x6A, 0x66, 0x96, - 0x23, 0x3C, 0x2B, 0xC6, 0xFC, 0x44, 0x0E, 0x9C, 0x13, 0xF4, 0x19, 0x76, 0x13, 0x84, 0xCD, 0x4B, - 0xC3, 0x6A, 0x25, 0xA5, 0x0B, 0x59, 0x27, 0x08, 0xA7, 0x4D, 0xF8, 0xCA, 0x72, 0xD0, 0x2D, 0xAD, - 0x69, 0xCD, 0x77, 0x51, 0xD4, 0x38, 0xC7, 0x57, 0x0D, 0x2F, 0x9E, 0x52, 0x25, 0x81, 0x31, 0x98, - 0xC2, 0x71, 0xCD, 0xFC, 0x8D, 0x33, 0x5B, 0x6A, 0x04, 0xB4, 0x11, 0x6E, 0xA3, 0x2E, 0x98, 0x9C, - 0xE0, 0xF1, 0x36, 0x4A, 0x3B, 0xB3, 0x6D, 0xAF, 0x33, 0xDF, 0xF6, 0x60, 0xD4, 0x6A, 0x51, 0x46, - 0x39, 0xC1, 0xE3, 0x56, 0xCB, 0x22, 0x7F, 0x50, 0x68, 0x29, 0x41, 0xD0, 0x49, 0x4A, 0xDB, 0x1E, - 0x00, 0xA2, 0x01, 0xA7, 0xD0, 0x01, 0x00, 0xD2, 0x14, 0x94, 0xB4, 0x67, 0xDB, 0x9E, 0xD2, 0x92, - 0x5B, 0xD1, 0x52, 0x70, 0xA7, 0x16, 0x02, 0xA5, 0x85, 0x58, 0x3C, 0x71, 0x9B, 0x64, 0x19, 0x1C, - 0xEC, 0x3E, 0xEC, 0x05, 0x4D, 0x74, 0x96, 0xE0, 0xF8, 0x12, 0x1B, 0x23, 0x9B, 0x97, 0xDF, 0xC0, - 0xD0, 0xC8, 0x2C, 0x6B, 0x2A, 0x15, 0xE3, 0x13, 0x33, 0x2F, 0x31, 0x64, 0xA4, 0x52, 0xFB, 0x0D, - 0x75, 0x49, 0xF5, 0x09, 0xAB, 0x1E, 0xB3, 0x60, 0xA0, 0x02, 0x7A, 0x6A, 0x13, 0x59, 0x41, 0xD3, - 0x52, 0x3B, 0xF5, 0xE2, 0x29, 0x4E, 0x11, 0x42, 0x98, 0x8D, 0xFC, 0x56, 0x22, 0x3C, 0x51, 0x93, - 0x0F, 0xAB, 0xA9, 0x3C, 0xE3, 0x3B, 0x66, 0x3E, 0xD6, 0x9F, 0x44, 0xD7, 0x6F, 0x83, 0x6F, 0xE3, - 0x66, 0x10, 0x36, 0x12, 0xF9, 0x68, 0x9B, 0x79, 0xFA, 0x8F, 0x57, 0xAB, 0xD8, 0xF6, 0x83, 0x64, - 0x12, 0x85, 0x21, 0x11, 0x92, 0xCC, 0x57, 0xBB, 0x25, 0x83, 0x11, 0xC8, 0xC9, 0x96, 0xD8, 0x95, - 0x70, 0x89, 0x4E, 0x1A, 0x84, 0x64, 0x12, 0xD0, 0xF7, 0x9A, 0xE1, 0xBA, 0xB2, 0x74, 0x13, 0x41, - 0x3E, 0x46, 0xD1, 0xA1, 0xD3, 0x6A, 0x85, 0xE4, 0x9F, 0x80, 0x28, 0x09, 0x20, 0x03, 0x60, 0x94, - 0xC6, 0x37, 0xB7, 0xB1, 0x20, 0xA3, 0x85, 0xE1, 0xED, 0x59, 0x74, 0x3D, 0x3C, 0xE1, 0xBD, 0xEA, - 0x2C, 0x08, 0xC8, 0x0E, 0xF7, 0x1D, 0xDF, 0x39, 0x8B, 0xAE, 0x9B, 0xE3, 0x0C, 0x64, 0x13, 0x2F, - 0x9D, 0xCC, 0xE8, 0x5B, 0x33, 0xBD, 0x2F, 0x71, 0xEE, 0xD0, 0x8B, 0xF4, 0x99, 0xA9, 0x2A, 0xE5, - 0x68, 0x2A, 0x9C, 0x14, 0x47, 0xAC, 0xF0, 0x50, 0x07, 0x02, 0x40, 0x96, 0xC1, 0x9E, 0xE2, 0x86, - 0x47, 0xCE, 0xDE, 0x40, 0x79, 0xDD, 0x36, 0xD8, 0x1B, 0x38, 0xFB, 0x07, 0x08, 0xB7, 0x5A, 0xF8, - 0x00, 0x0D, 0xF6, 0x06, 0x83, 0xFD, 0xEC, 0x1E, 0x1C, 0xC7, 0xD4, 0x26, 0xE6, 0x3D, 0x45, 0x61, - 0x9B, 0xD4, 0xC6, 0xD7, 0x93, 0xF9, 0xD2, 0xC7, 0xF4, 0x15, 0xBB, 0xFA, 0xC0, 0xEF, 0x29, 0xBE, - 0xF0, 0x42, 0x9F, 0x94, 0x08, 0x92, 0x37, 0x98, 0xAC, 0x09, 0x44, 0x73, 0x7D, 0x2D, 0x56, 0x52, - 0xFA, 0x4C, 0x93, 0x66, 0x96, 0x92, 0x54, 0x8D, 0x2D, 0xF7, 0x7D, 0xA4, 0xA5, 0xAA, 0x8F, 0xF8, - 0x08, 0x6B, 0xE1, 0xB2, 0x64, 0xA1, 0xD8, 0x37, 0x2E, 0x96, 0x64, 0x59, 0x8C, 0xD2, 0xC6, 0x19, - 0x6E, 0x9C, 0x93, 0xAA, 0x4D, 0xE9, 0xED, 0x11, 0xB3, 0x87, 0x81, 0x85, 0xE6, 0x03, 0x58, 0x8B, - 0xB0, 0xE1, 0xF5, 0xE0, 0x60, 0x6F, 0xD0, 0x75, 0x14, 0xFA, 0x76, 0xF7, 0x32, 0xB8, 0x9E, 0x2C, - 0x06, 0x40, 0x01, 0x15, 0x9F, 0x86, 0x8C, 0x47, 0xFD, 0xBD, 0xAE, 0x68, 0xE0, 0xD1, 0x6E, 0xCF, - 0xCD, 0x2C, 0xAC, 0x44, 0xC6, 0x2E, 0x8D, 0x89, 0x84, 0x20, 0x00, 0xDC, 0x4E, 0x92, 0x64, 0x78, - 0xCB, 0xF6, 0x5B, 0xC3, 0x5B, 0xEE, 0x36, 0x1C, 0xB2, 0xAD, 0xD6, 0xD0, 0xC9, 0xE0, 0x04, 0xCF, - 0xE7, 0x86, 0xF4, 0x8C, 0x3F, 0x8F, 0xBE, 0x47, 0x55, 0x38, 0x99, 0x79, 0x71, 0x39, 0x9D, 0x9E, - 0x50, 0x0C, 0x1D, 0x98, 0x46, 0x0B, 0x02, 0x9F, 0x7A, 0x91, 0x7A, 0xB4, 0xFB, 0x10, 0x2F, 0x52, - 0x3C, 0x38, 0xB8, 0xC9, 0x9B, 0x93, 0x10, 0x83, 0xD4, 0xA7, 0x60, 0xA0, 0xF9, 0x87, 0xE2, 0x1E, - 0x97, 0xA8, 0x63, 0x2F, 0x0B, 0x64, 0xFC, 0x2F, 0x4B, 0x9C, 0x79, 0x89, 0x04, 0x27, 0xFD, 0xA7, - 0x4E, 0xA2, 0xF9, 0xF2, 0x22, 0x64, 0xE9, 0x04, 0xBA, 0xCC, 0x10, 0x61, 0x2D, 0xA8, 0xEB, 0xC8, - 0x37, 0xD1, 0x95, 0x08, 0x0E, 0x2D, 0xD2, 0x9F, 0x85, 0xBE, 0x21, 0xF5, 0xD8, 0x5B, 0x2C, 0xB0, - 0x5F, 0x55, 0x87, 0xE5, 0xEA, 0x35, 0xE9, 0xFE, 0xF0, 0x38, 0x9A, 0x8B, 0x6F, 0x4C, 0x1D, 0xE5, - 0xC8, 0x5C, 0x81, 0x30, 0x05, 0xA9, 0x79, 0x54, 0x91, 0x59, 0xCF, 0x42, 0xE1, 0x18, 0x32, 0x5B, - 0x2E, 0x7C, 0x2F, 0xC5, 0x5A, 0x14, 0x61, 0xE1, 0x20, 0xB0, 0x00, 0x29, 0x35, 0x00, 0x09, 0xE0, - 0x56, 0xBA, 0x5A, 0x6D, 0x05, 0xAB, 0x15, 0x51, 0x1C, 0x10, 0x42, 0x01, 0x55, 0xED, 0x88, 0x02, - 0x41, 0x3F, 0xDC, 0x71, 0xD9, 0x61, 0x2D, 0xA7, 0xB0, 0x7C, 0x2B, 0x41, 0x0A, 0xD7, 0x84, 0x08, - 0x89, 0x28, 0x98, 0x9A, 0x02, 0x21, 0x92, 0xEA, 0x53, 0x4C, 0xF6, 0x7A, 0x5E, 0x1E, 0x53, 0x24, - 0xCA, 0x03, 0x01, 0x8F, 0x42, 0x11, 0x35, 0x64, 0xB5, 0xF2, 0x0E, 0x9C, 0x23, 0x15, 0x15, 0x1E, - 0x5C, 0x50, 0x1F, 0x6D, 0xA7, 0x62, 0xB4, 0x93, 0x8A, 0xC1, 0x8E, 0x8D, 0x83, 0x1D, 0xD5, 0x0E, - 0x76, 0x58, 0x33, 0xD8, 0x5E, 0x61, 0xB0, 0x99, 0x66, 0xA6, 0x8C, 0x37, 0x21, 0x35, 0xC8, 0x0A, - 0x7E, 0xAB, 0xB4, 0x20, 0x75, 0x5B, 0x5B, 0xA5, 0x7E, 0xB5, 0x5A, 0x56, 0xD0, 0x29, 0x85, 0x70, - 0xC9, 0x89, 0x69, 0xEC, 0xF3, 0x91, 0x86, 0xC9, 0x01, 0x52, 0xB0, 0x38, 0x4A, 0x0F, 0x91, 0x96, - 0xDB, 0x6A, 0x05, 0x3C, 0xC5, 0xDC, 0xE7, 0x56, 0x2B, 0x3D, 0x50, 0xEA, 0xB7, 0x5A, 0xC1, 0x81, - 0xA9, 0x38, 0x23, 0xC2, 0x90, 0x97, 0xBD, 0x03, 0xF0, 0x43, 0xB4, 0x39, 0xF4, 0xE0, 0xD0, 0x38, - 0x94, 0xA4, 0x96, 0x61, 0x2C, 0xB9, 0xBF, 0xF5, 0xD2, 0xC0, 0x23, 0x64, 0x28, 0xDC, 0x6A, 0x05, - 0xC5, 0x8C, 0x32, 0x92, 0x79, 0xB7, 0x34, 0x9A, 0x54, 0x34, 0x64, 0xC2, 0xC9, 0xD0, 0x8C, 0xC8, - 0xF8, 0x0A, 0x41, 0x56, 0x63, 0x4E, 0xBD, 0x1F, 0xD6, 0xC8, 0xDD, 0xD2, 0xF2, 0x43, 0x57, 0xE5, - 0x80, 0x68, 0xBD, 0xCE, 0xA3, 0x07, 0x3E, 0x9B, 0xAF, 0x75, 0xBD, 0x44, 0x7D, 0xC9, 0xC6, 0x54, - 0xDF, 0x1D, 0x30, 0xA7, 0xB2, 0x6E, 0x7F, 0x0F, 0xC0, 0x90, 0x7B, 0x8A, 0x81, 0x1E, 0xC9, 0x22, - 0x3F, 0x66, 0xFC, 0x5D, 0x38, 0x9C, 0xA3, 0xC0, 0xEA, 0xEF, 0x0F, 0x00, 0x9C, 0x90, 0x14, 0xF2, - 0xC3, 0x27, 0x3F, 0xFA, 0x03, 0x00, 0x4F, 0xD1, 0x6D, 0xCA, 0x5A, 0x7B, 0xED, 0x4D, 0x31, 0x59, - 0xB3, 0xF8, 0x57, 0x94, 0xD0, 0xFD, 0xFF, 0x50, 0x3C, 0xA7, 0xCB, 0x8A, 0x39, 0xC7, 0xF3, 0x60, - 0xF1, 0x76, 0xE1, 0x91, 0x75, 0x53, 0x16, 0x89, 0xCE, 0xCF, 0x13, 0x9C, 0x2A, 0x09, 0x44, 0xA1, - 0x2E, 0x7C, 0x1A, 0xEA, 0x65, 0xF4, 0x08, 0x73, 0xC9, 0xD7, 0xB0, 0x69, 0xD9, 0xC7, 0xA1, 0x0C, - 0xD9, 0xCD, 0xCF, 0x58, 0x95, 0xF8, 0x05, 0xD4, 0x17, 0x8E, 0xF0, 0x68, 0xA8, 0xFB, 0x2C, 0x92, - 0xEE, 0x0C, 0xFD, 0xC0, 0xFF, 0x8C, 0x06, 0x02, 0xCF, 0x1D, 0x85, 0x4F, 0xBC, 0xC9, 0x0C, 0xBF, - 0xF2, 0x16, 0x54, 0xF5, 0x9F, 0xDB, 0xCF, 0xA3, 0x65, 0xFC, 0x83, 0xF8, 0xE6, 0x95, 0xB7, 0x28, - 0xE4, 0x1F, 0x47, 0x17, 0x67, 0x41, 0x88, 0xFD, 0xAA, 0x72, 0x0B, 0x6F, 0x8A, 0x13, 0x74, 0x32, - 0x16, 0x9E, 0x8A, 0xA9, 0xD0, 0x79, 0xAD, 0x27, 0x5E, 0x45, 0xF1, 0xFB, 0x27, 0x64, 0xD3, 0x14, - 0x84, 0xD3, 0x27, 0xD1, 0x35, 0xBA, 0xA5, 0x7A, 0x81, 0x50, 0x12, 0x98, 0xF7, 0x01, 0x71, 0x9F, - 0x95, 0x87, 0x5E, 0x24, 0xB5, 0x1E, 0xA7, 0x69, 0x1C, 0x9C, 0x2D, 0x53, 0x7A, 0xE0, 0x47, 0x51, - 0x88, 0x6C, 0x2D, 0x4D, 0x38, 0x65, 0x64, 0x43, 0x43, 0x1D, 0x75, 0x0C, 0xDC, 0xAE, 0x8C, 0x5F, - 0xF6, 0xD8, 0xF7, 0x55, 0x5E, 0x62, 0xF1, 0xEB, 0x29, 0x1C, 0xDF, 0xA6, 0x1E, 0x2F, 0x9F, 0x5D, - 0x04, 0x69, 0x8A, 0xB9, 0x7C, 0xAF, 0x2A, 0x5F, 0x0B, 0xCD, 0xC6, 0x04, 0x8E, 0x12, 0x31, 0x8D, - 0xF9, 0x7C, 0xBA, 0x43, 0xA3, 0x95, 0x55, 0xD6, 0xC1, 0xD4, 0x9A, 0xE6, 0x2E, 0xC3, 0x8F, 0xC9, - 0xB2, 0xC7, 0x26, 0x68, 0x3E, 0xD6, 0x74, 0x12, 0x7F, 0x8C, 0xAF, 0xC8, 0xB8, 0x48, 0xA7, 0xD2, - 0xE9, 0xC5, 0x82, 0xB7, 0x73, 0x6C, 0x61, 0xD8, 0xDF, 0x56, 0x19, 0xCA, 0x2E, 0xC6, 0x8A, 0xED, - 0xC3, 0x8A, 0x6C, 0x1E, 0x1D, 0xB6, 0xAF, 0x42, 0x4D, 0xAF, 0x91, 0xE5, 0xC0, 0x59, 0xE1, 0x48, - 0xB6, 0xD0, 0x6A, 0xF1, 0x70, 0x1F, 0xDE, 0xD2, 0x18, 0xC4, 0x43, 0xAD, 0x9D, 0xB2, 0xB3, 0x9C, - 0x2B, 0x7A, 0x48, 0xEB, 0xF9, 0xCF, 0x69, 0x7F, 0xC3, 0x74, 0x7E, 0x43, 0x85, 0x06, 0x0B, 0xB0, - 0x41, 0x99, 0x31, 0x97, 0x47, 0x0A, 0x87, 0x2A, 0xA1, 0x33, 0xF2, 0x63, 0x34, 0x4C, 0x8F, 0xD1, - 0x66, 0xD4, 0xDD, 0xF6, 0x14, 0x27, 0x40, 0x06, 0x76, 0x67, 0x8E, 0xBB, 0x2C, 0xE1, 0x6B, 0xB6, - 0x6A, 0xE4, 0x25, 0xCC, 0x4C, 0x84, 0xD9, 0xBF, 0x2D, 0xCC, 0x37, 0x19, 0xB5, 0xC1, 0x8F, 0x3E, - 0xE3, 0x45, 0xCA, 0x53, 0xD2, 0x01, 0x99, 0x92, 0x2F, 0x5D, 0xDB, 0x13, 0x86, 0x99, 0xD8, 0x2F, - 0xFC, 0x39, 0x7E, 0xE7, 0x25, 0xEF, 0xFF, 0x7F, 0x4B, 0xBC, 0xC4, 0x8A, 0x1B, 0xB8, 0x5E, 0x6F, - 0x94, 0x1E, 0xB8, 0xDD, 0x5D, 0xEA, 0x29, 0x0C, 0xDB, 0x38, 0xFC, 0x51, 0x52, 0x20, 0x77, 0x9F, - 0xBF, 0xA5, 0x4F, 0x63, 0x76, 0xA7, 0x04, 0x63, 0x5B, 0xF3, 0x1D, 0x52, 0xF3, 0xFD, 0xEC, 0x87, - 0xDF, 0x81, 0x1C, 0x17, 0x8E, 0x73, 0xEC, 0x5D, 0xBD, 0x8B, 0xA8, 0xD7, 0xA7, 0x3B, 0xC3, 0x1A, - 0x15, 0xF0, 0x49, 0xEE, 0x8E, 0x0F, 0xC4, 0x20, 0x23, 0x23, 0x4D, 0x0F, 0x4C, 0x99, 0xA3, 0xF5, - 0xC2, 0x50, 0x97, 0xE6, 0x00, 0x53, 0xF9, 0xF9, 0xD0, 0x31, 0xFF, 0xD8, 0x79, 0x0C, 0x38, 0x3A, - 0xE8, 0x27, 0xCE, 0xD8, 0x9E, 0x30, 0x9F, 0xBF, 0x6F, 0xA2, 0x2B, 0xFB, 0x7A, 0xB5, 0xAA, 0x2F, - 0x70, 0x63, 0x66, 0xA0, 0x53, 0xC9, 0x41, 0x5C, 0x03, 0x2E, 0x74, 0x97, 0x27, 0x57, 0x08, 0xD7, - 0x42, 0xB6, 0x2A, 0xAE, 0xB3, 0xAC, 0x38, 0x7D, 0x6F, 0xA7, 0x44, 0x1F, 0xA6, 0x7C, 0x48, 0xE5, - 0xAC, 0x70, 0xB3, 0x4D, 0x31, 0x10, 0x57, 0x52, 0xB9, 0xDE, 0xDC, 0x87, 0x85, 0xF2, 0x3B, 0x5D, - 0xD0, 0x6A, 0x51, 0x6E, 0x79, 0x15, 0x4C, 0xE2, 0x28, 0xF5, 0x92, 0xF7, 0x9C, 0x6D, 0xF4, 0xD1, - 0x66, 0xF0, 0xCE, 0x83, 0x39, 0x8D, 0x02, 0x8B, 0xD1, 0x61, 0x77, 0x5B, 0x4E, 0x10, 0xBA, 0xE1, - 0x3B, 0x40, 0x16, 0x05, 0xFD, 0x2E, 0x17, 0xBE, 0xAB, 0x55, 0xDF, 0x79, 0xB4, 0x0B, 0x00, 0xB0, - 0x93, 0x28, 0x4E, 0x2D, 0x8B, 0xEF, 0xF8, 0x52, 0xAD, 0x1E, 0xF5, 0x89, 0xAD, 0x26, 0x1C, 0xE9, - 0xF9, 0x1D, 0x3D, 0x77, 0x98, 0xDA, 0x0B, 0x1C, 0x4F, 0x70, 0x98, 0x7A, 0x53, 0xFC, 0x69, 0x82, - 0xFD, 0x0E, 0x2E, 0x24, 0x00, 0x76, 0x05, 0x98, 0xA2, 0x8E, 0x0B, 0x03, 0xE4, 0x8C, 0xF4, 0xFB, - 0x29, 0x2C, 0x8E, 0xF7, 0x12, 0xEE, 0xB8, 0xEA, 0x24, 0x19, 0x17, 0xF1, 0x09, 0x40, 0x8A, 0x12, - 0x18, 0xA0, 0x52, 0x9E, 0x0C, 0x39, 0x98, 0x74, 0x52, 0x84, 0x7A, 0x80, 0x7A, 0xC4, 0x93, 0xBA, - 0x08, 0xE6, 0x97, 0x7D, 0x29, 0xA4, 0x12, 0x30, 0x46, 0x89, 0x3C, 0x2C, 0xC5, 0x36, 0xBD, 0x88, - 0xA3, 0xEC, 0xA3, 0x28, 0x18, 0x45, 0xCA, 0xE0, 0xC3, 0xF4, 0xC8, 0x1D, 0x76, 0x5C, 0x40, 0x14, - 0x99, 0x98, 0x6C, 0x03, 0x42, 0x4E, 0xFE, 0x0B, 0x1C, 0x4F, 0xD9, 0x42, 0x6A, 0x25, 0x30, 0x02, - 0xA3, 0xD0, 0xBE, 0xC4, 0x31, 0xD9, 0xF8, 0xB7, 0xDB, 0xEA, 0xD2, 0x7B, 0x12, 0x8D, 0x51, 0xA8, - 0x1C, 0x68, 0xC6, 0xF2, 0x7A, 0x6F, 0x84, 0x0F, 0x91, 0x3B, 0xC2, 0x9D, 0x0E, 0x10, 0x3E, 0x61, - 0xE7, 0x38, 0xA5, 0x10, 0xAD, 0xF8, 0x04, 0x8F, 0x05, 0x8B, 0x1A, 0xD6, 0x0D, 0xA7, 0x7E, 0xFD, - 0x64, 0xD1, 0x3F, 0x43, 0x4E, 0x27, 0x7A, 0x62, 0xA6, 0xCA, 0xAC, 0x4B, 0x4B, 0xD7, 0x55, 0xCA, - 0x4B, 0x74, 0x21, 0x10, 0x07, 0x63, 0x34, 0xE1, 0xB7, 0xB1, 0xA4, 0x47, 0x14, 0x72, 0x6A, 0x91, - 0x12, 0x9C, 0x03, 0x20, 0xCE, 0x54, 0x0A, 0x52, 0xDF, 0x66, 0xE2, 0x06, 0xBB, 0xBB, 0x4D, 0xCF, - 0x00, 0xB5, 0x80, 0xF9, 0x89, 0x19, 0xF5, 0x00, 0x62, 0xA0, 0xDC, 0xC9, 0xC5, 0x30, 0x1A, 0x47, - 0xE7, 0x0D, 0x2C, 0xAF, 0xE3, 0x14, 0x11, 0x19, 0x6F, 0x47, 0x1A, 0xC8, 0x1F, 0x08, 0xC4, 0xEE, - 0xF5, 0x7C, 0x1E, 0x45, 0xB1, 0x15, 0xEF, 0x74, 0x41, 0x5E, 0x84, 0x9D, 0x94, 0x8C, 0x12, 0x7B, - 0x92, 0x5E, 0x53, 0x77, 0x5B, 0xF4, 0x5A, 0xD3, 0x12, 0xF9, 0x10, 0xC3, 0x50, 0x69, 0xB8, 0x91, - 0x10, 0x41, 0x13, 0x71, 0x96, 0x02, 0x89, 0xCA, 0x51, 0x28, 0x85, 0x89, 0xAD, 0xE9, 0x95, 0xF6, - 0x35, 0x62, 0x29, 0xF6, 0xF5, 0x4E, 0x50, 0xCA, 0xBC, 0x11, 0x99, 0x37, 0x34, 0xB3, 0xA0, 0xD4, - 0xDA, 0xD7, 0x6D, 0x84, 0x0D, 0xC9, 0x37, 0x6D, 0x14, 0x96, 0x93, 0xF5, 0x26, 0x4B, 0xA0, 0x4C, - 0x0D, 0xE8, 0x88, 0x94, 0x9A, 0xD9, 0x09, 0x46, 0x6B, 0xB5, 0x1E, 0x3A, 0xD2, 0x82, 0x52, 0x82, - 0xF7, 0x84, 0x03, 0x68, 0x95, 0x71, 0x84, 0xAB, 0xCC, 0x08, 0x8C, 0xA8, 0x9F, 0x4C, 0x4F, 0x88, - 0x4A, 0xB5, 0x10, 0xF7, 0x77, 0xE9, 0x41, 0x17, 0xF0, 0x33, 0xDA, 0x46, 0x92, 0xA9, 0x93, 0x45, - 0xFA, 0x87, 0x5F, 0xA8, 0xE5, 0x31, 0xD4, 0xDD, 0xD9, 0x8F, 0xF8, 0x9E, 0x4C, 0x13, 0xC3, 0xAA, - 0x1B, 0x4F, 0x4D, 0xAC, 0x9E, 0xA4, 0x63, 0x65, 0x74, 0xD3, 0x06, 0x65, 0x2A, 0x3E, 0xBA, 0xA9, - 0x3A, 0xBA, 0x9D, 0xCE, 0x08, 0xE7, 0x13, 0x3F, 0x23, 0x5A, 0xCE, 0x1B, 0x2F, 0x49, 0x71, 0x1C, - 0x7C, 0x1B, 0xFB, 0xF4, 0xA8, 0x52, 0xAC, 0x21, 0xC7, 0x33, 0x4F, 0x89, 0xD7, 0xA6, 0x4D, 0xB0, - 0x29, 0x4E, 0xA5, 0xF3, 0xD1, 0x57, 0xDE, 0xC2, 0x32, 0x2F, 0x42, 0x50, 0x54, 0x36, 0x34, 0x72, - 0x2F, 0xC0, 0x39, 0xC0, 0x52, 0x41, 0xC5, 0x71, 0x3B, 0x07, 0xB8, 0x44, 0x98, 0xEB, 0x28, 0x2C, - 0x1D, 0x2E, 0x57, 0x2B, 0x6B, 0x69, 0x54, 0x3C, 0x78, 0x01, 0xCC, 0x75, 0x08, 0x76, 0x77, 0xB5, - 0x04, 0x00, 0x2E, 0x69, 0x43, 0xD4, 0xFD, 0x1B, 0x69, 0xED, 0x71, 0x98, 0x04, 0x2F, 0x08, 0x0B, - 0x88, 0x70, 0x0F, 0x87, 0x48, 0x53, 0x2E, 0xCB, 0xBE, 0x0D, 0xCB, 0xA7, 0xCB, 0x1F, 0x47, 0xD2, - 0xF2, 0x62, 0x19, 0xFA, 0xEC, 0xD2, 0xCA, 0xBF, 0x6E, 0x34, 0xDB, 0x45, 0x21, 0x56, 0x86, 0x79, - 0x82, 0xC7, 0x14, 0x9F, 0x27, 0xBA, 0xDF, 0x6C, 0x61, 0xF2, 0xA3, 0x04, 0xEB, 0xA8, 0x52, 0x76, - 0xE5, 0x3D, 0x89, 0xE2, 0xA0, 0x93, 0xAE, 0x74, 0xDE, 0x28, 0xB9, 0x0A, 0xF8, 0x7D, 0xC3, 0xC4, - 0x4B, 0xB0, 0xF4, 0x6C, 0x37, 0xA4, 0x5F, 0xC2, 0x9F, 0xDD, 0x50, 0x4C, 0x0A, 0x33, 0x55, 0x52, - 0xEE, 0xE0, 0x75, 0x44, 0x2B, 0x49, 0x0F, 0xCF, 0x82, 0x5D, 0x0B, 0x3B, 0x2D, 0x3B, 0x8D, 0x84, - 0xCB, 0x6E, 0x52, 0xD3, 0x43, 0x21, 0xF5, 0xBA, 0x27, 0x92, 0x2D, 0x22, 0x53, 0x21, 0x3E, 0x71, - 0xC9, 0x3F, 0xDD, 0xB1, 0x00, 0xED, 0xE3, 0x73, 0x6F, 0x39, 0x4F, 0x87, 0x1E, 0x0A, 0x8E, 0x4C, - 0x84, 0x52, 0x7C, 0xB4, 0x9A, 0xB2, 0x73, 0x17, 0x7F, 0x62, 0x6E, 0xC6, 0xAD, 0x96, 0x45, 0xDA, - 0xA6, 0x05, 0xEC, 0xB3, 0x39, 0x0E, 0x7D, 0xAB, 0xBE, 0x26, 0x14, 0x85, 0x2F, 0x96, 0xF3, 0x34, - 0x58, 0xCC, 0x6F, 0x3E, 0x59, 0x78, 0x93, 0x20, 0xBD, 0xB1, 0x3C, 0x98, 0xA8, 0x6E, 0xF3, 0x00, - 0x00, 0xD0, 0x63, 0xAC, 0xAA, 0x3B, 0x29, 0x97, 0x46, 0x5A, 0xDC, 0x73, 0x33, 0xF4, 0xE1, 0xA9, - 0x98, 0xD5, 0xCB, 0x9C, 0xC2, 0xAF, 0x74, 0xEF, 0x87, 0xE5, 0xAA, 0x5B, 0x2E, 0xAD, 0x39, 0x0A, - 0xCE, 0xAD, 0xA5, 0x18, 0xDA, 0x25, 0x1D, 0xCF, 0xA9, 0x18, 0x4F, 0xAF, 0x7E, 0x3C, 0xF5, 0x3D, - 0x58, 0x8D, 0x93, 0x46, 0xBF, 0xD5, 0x9A, 0x1D, 0xEC, 0xB7, 0x5A, 0xD6, 0xAC, 0x8D, 0xF6, 0x01, - 0x9C, 0xD6, 0xF2, 0xC1, 0xEC, 0xDE, 0x7C, 0x30, 0x03, 0xA3, 0xE9, 0xDD, 0xF8, 0x60, 0x8A, 0xE6, - 0x46, 0x3E, 0x50, 0x7C, 0xF2, 0xD6, 0xB3, 0x49, 0x66, 0x9A, 0x75, 0x06, 0x9F, 0x99, 0xD6, 0x54, - 0x32, 0x49, 0x44, 0xDD, 0xDC, 0x5A, 0x53, 0x00, 0xE0, 0x44, 0xCB, 0x28, 0x32, 0xC4, 0xB4, 0xC8, - 0x10, 0x70, 0x4A, 0x63, 0xDD, 0x45, 0x73, 0xD5, 0x6B, 0xEE, 0x9B, 0xE9, 0x99, 0x27, 0x4E, 0x65, - 0x36, 0x9B, 0x86, 0x45, 0x99, 0x69, 0x9C, 0x8B, 0x94, 0x8A, 0x85, 0x21, 0x10, 0x15, 0x0F, 0x0E, - 0xF6, 0x25, 0x05, 0xC5, 0x25, 0xD2, 0x9A, 0xE9, 0x44, 0xC1, 0xAD, 0x99, 0x53, 0xCC, 0x6D, 0xA6, - 0xEC, 0x62, 0xCE, 0xF6, 0x79, 0x17, 0x89, 0xC8, 0xBF, 0x47, 0x27, 0x37, 0x60, 0x51, 0xB2, 0x6F, - 0xA1, 0x2C, 0x9A, 0x52, 0x16, 0xFD, 0x27, 0x20, 0x4E, 0xA1, 0xE3, 0x6B, 0x18, 0x4D, 0x10, 0xA7, - 0x7E, 0x66, 0x4B, 0xB3, 0x09, 0x38, 0xA7, 0x02, 0xDD, 0x55, 0xA2, 0x41, 0x53, 0xB8, 0x26, 0x9F, - 0xA8, 0xAB, 0xD5, 0x5C, 0xDC, 0x97, 0x0B, 0x2B, 0x0B, 0x13, 0x2E, 0x9A, 0x9B, 0x65, 0x5B, 0x90, - 0xC6, 0xC2, 0x30, 0xA1, 0x32, 0x24, 0xB7, 0x96, 0x11, 0xC2, 0x64, 0x22, 0x42, 0xE2, 0x8F, 0x84, - 0x11, 0x95, 0x50, 0xF1, 0x4D, 0x2C, 0x4C, 0xD0, 0xF7, 0x00, 0x3C, 0xD5, 0x0B, 0x15, 0x98, 0x80, - 0xF7, 0x0E, 0xC0, 0xA5, 0x98, 0xE7, 0x38, 0x4C, 0x96, 0x31, 0xD6, 0xFA, 0x63, 0xF9, 0xF0, 0x14, - 0xAE, 0xED, 0x35, 0xB3, 0x14, 0x58, 0x9A, 0x62, 0xD1, 0xD7, 0x74, 0x3B, 0x51, 0xBA, 0xCD, 0x6C, - 0xF8, 0x46, 0xC2, 0x16, 0xB8, 0x20, 0x78, 0x96, 0x87, 0x87, 0xDD, 0x7E, 0xAB, 0x3B, 0x18, 0xC0, - 0xE5, 0xE1, 0xA1, 0xBB, 0x2B, 0x7E, 0xED, 0x93, 0x1F, 0xB5, 0x8B, 0x75, 0x4D, 0x83, 0x53, 0x2A, - 0x02, 0x54, 0xF5, 0x43, 0xAE, 0xDE, 0xC2, 0x70, 0xB5, 0x19, 0x52, 0x63, 0xBB, 0xDC, 0xA8, 0x0E, - 0x1F, 0xBD, 0xA5, 0x86, 0x51, 0xF6, 0x79, 0xCC, 0xCC, 0x9A, 0x8F, 0x23, 0x9F, 0x68, 0x91, 0x43, - 0x0C, 0xE7, 0xA8, 0xEE, 0x90, 0x6D, 0x5B, 0xEE, 0xD9, 0x43, 0x61, 0x55, 0xDB, 0x05, 0xED, 0xFE, - 0xA8, 0x78, 0x70, 0xC6, 0x36, 0xDF, 0x79, 0x48, 0xBE, 0x42, 0x0E, 0x92, 0x24, 0x9A, 0x54, 0x35, - 0xC7, 0x0F, 0xED, 0xF6, 0xF3, 0xE0, 0x94, 0x39, 0x0C, 0xB6, 0x33, 0x39, 0x98, 0x18, 0xC0, 0x73, - 0xA3, 0xDD, 0x89, 0x7E, 0xD6, 0xA7, 0x47, 0x04, 0x2E, 0x9D, 0xDA, 0xDA, 0xE7, 0x53, 0x79, 0x0E, - 0x5D, 0xCE, 0x3C, 0xCB, 0xCF, 0xAE, 0xCB, 0x99, 0x6A, 0x94, 0x1B, 0x19, 0x54, 0xBC, 0x5C, 0x2C, - 0x48, 0x5E, 0x84, 0x97, 0x2C, 0x7A, 0xA1, 0x0C, 0x89, 0xDE, 0x38, 0x95, 0x73, 0x80, 0xDF, 0x94, - 0x19, 0x2B, 0x12, 0xE1, 0x64, 0x11, 0xE6, 0xAE, 0x2B, 0xF4, 0x22, 0x24, 0x0A, 0x38, 0xE9, 0xE2, - 0xB4, 0xB6, 0xDC, 0xD3, 0xE0, 0xC2, 0x02, 0xF0, 0xB2, 0x1E, 0x56, 0xEA, 0xCD, 0x83, 0x89, 0x05, - 0xE0, 0x71, 0x6D, 0xB1, 0x3C, 0x3A, 0x15, 0x80, 0x8B, 0xDA, 0x92, 0x84, 0xD7, 0xDE, 0x63, 0xA2, - 0xB7, 0x2E, 0xA7, 0x33, 0x8B, 0x1D, 0x84, 0x5C, 0xA0, 0xAA, 0xF2, 0x44, 0xB9, 0x99, 0x32, 0xF6, - 0x06, 0xF0, 0x7A, 0x83, 0x62, 0xAF, 0x08, 0xEF, 0x02, 0xF8, 0xB2, 0xAE, 0xE8, 0x13, 0x09, 0xF1, - 0x6A, 0x83, 0x62, 0x0C, 0x22, 0x53, 0x82, 0xE4, 0xD6, 0xE8, 0x62, 0x74, 0x81, 0x5E, 0xC2, 0x97, - 0x08, 0x8F, 0x84, 0x89, 0xE9, 0xF5, 0xE8, 0x1A, 0x5D, 0x11, 0x80, 0xDC, 0x4C, 0xEE, 0x2C, 0x57, - 0x61, 0x8A, 0x0A, 0xF5, 0x15, 0x7C, 0x09, 0x97, 0x70, 0x0A, 0x46, 0x1A, 0x57, 0x4E, 0xE7, 0xD1, - 0x99, 0x37, 0x3F, 0x8E, 0x2E, 0x16, 0x64, 0x73, 0x89, 0x3F, 0x59, 0x60, 0x16, 0xF7, 0x06, 0x35, - 0x27, 0xD1, 0xE2, 0xA6, 0xA9, 0xB3, 0x70, 0x6E, 0x08, 0x7C, 0xA6, 0x84, 0xA8, 0x56, 0x32, 0xA9, - 0x5D, 0xB0, 0x03, 0x9D, 0xE2, 0xD9, 0x39, 0x3F, 0x3E, 0x30, 0xCF, 0x94, 0xC2, 0x3C, 0xA9, 0xC6, - 0x28, 0x89, 0x96, 0xF1, 0x04, 0x77, 0xA2, 0x4B, 0x1C, 0x37, 0x39, 0x05, 0x5E, 0x21, 0x5F, 0x5F, - 0xC4, 0x0A, 0xBE, 0xE6, 0x2B, 0xF2, 0xE0, 0x1B, 0x74, 0x79, 0xD4, 0x0C, 0x28, 0x97, 0x35, 0x87, - 0xCD, 0xA6, 0x4E, 0x13, 0x52, 0x0E, 0x7D, 0xF1, 0xC1, 0xED, 0x9B, 0xAC, 0xF1, 0xC1, 0xED, 0x2B, - 0xF2, 0x4F, 0x09, 0xCC, 0xDB, 0xE0, 0xDB, 0xD8, 0x74, 0x15, 0x90, 0xFB, 0x64, 0xCF, 0x16, 0xD7, - 0xA6, 0x8A, 0xCC, 0x65, 0x7A, 0xF6, 0x85, 0xDE, 0x67, 0xB2, 0x95, 0x7D, 0xE2, 0x25, 0x98, 0xF0, - 0x32, 0x4A, 0x74, 0xA7, 0xD4, 0xBC, 0xA7, 0x37, 0x88, 0x2C, 0x9A, 0x42, 0xE4, 0xD1, 0x48, 0x79, - 0xB3, 0x92, 0xBD, 0x0E, 0xB0, 0x42, 0x7B, 0xC2, 0x65, 0xE9, 0xE3, 0xD4, 0x72, 0x00, 0x80, 0x8F, - 0xCD, 0xF5, 0xAA, 0x4C, 0x7A, 0x0C, 0x10, 0x9E, 0xE5, 0x3C, 0x55, 0x54, 0xF9, 0x53, 0x48, 0xB8, - 0x2A, 0x80, 0xD7, 0xF0, 0x82, 0xF0, 0x16, 0xF4, 0x21, 0x05, 0xBF, 0xC6, 0xDA, 0xA7, 0xDC, 0x46, - 0x81, 0x29, 0x73, 0x3E, 0x7B, 0x46, 0xF8, 0x8C, 0x53, 0xE0, 0x1D, 0x7A, 0x7C, 0xE4, 0x0C, 0xFB, - 0x74, 0xEE, 0xBE, 0x45, 0x5B, 0xEE, 0x68, 0xCB, 0xDD, 0x2A, 0xA8, 0x11, 0xBA, 0xCF, 0x7B, 0xEB, - 0x2D, 0xB2, 0x1C, 0xE8, 0x95, 0x5F, 0xD0, 0xA8, 0xB7, 0x2C, 0xE9, 0x35, 0x0C, 0xE1, 0x3B, 0xF8, - 0xAE, 0xEA, 0xE6, 0xE6, 0x33, 0x85, 0x73, 0x2B, 0x56, 0x08, 0x68, 0x64, 0x0F, 0x53, 0x9D, 0x9C, - 0x3D, 0xF8, 0x61, 0xEC, 0x53, 0xF8, 0x04, 0x6D, 0xDD, 0x90, 0x69, 0xFE, 0xD4, 0xB4, 0x44, 0x32, - 0x10, 0xFA, 0x75, 0xA5, 0x7D, 0x35, 0xA1, 0xB3, 0x89, 0xAC, 0x95, 0xC6, 0xFC, 0x29, 0x4E, 0xD9, - 0xD2, 0x2A, 0xD1, 0xB7, 0x30, 0x80, 0xC7, 0x32, 0xF8, 0x9B, 0xBA, 0x1C, 0xC9, 0x23, 0x49, 0xB9, - 0xA8, 0xBA, 0x50, 0x39, 0x8D, 0xBB, 0x07, 0xDF, 0xEF, 0xB8, 0x03, 0x00, 0x60, 0x8A, 0xF0, 0x0F, - 0x74, 0x11, 0x72, 0x8F, 0xEC, 0xC1, 0xD0, 0xD1, 0xD7, 0xCF, 0xF4, 0x5A, 0x31, 0xD8, 0xC6, 0x35, - 0xCB, 0x55, 0x1E, 0xFF, 0x9F, 0xF0, 0xDA, 0x53, 0xA6, 0xBB, 0x5A, 0x00, 0xE8, 0xDD, 0x28, 0x87, - 0xD5, 0x2F, 0xF0, 0x90, 0x3C, 0x9B, 0xDE, 0xB4, 0x25, 0xB2, 0x65, 0x03, 0xE0, 0x49, 0x7E, 0x31, - 0x68, 0x68, 0xEA, 0x8B, 0x78, 0x7A, 0x66, 0x7D, 0x70, 0x5B, 0xB7, 0xF9, 0xAF, 0x16, 0xF1, 0x7A, - 0x73, 0x16, 0x00, 0xF6, 0xBF, 0x8C, 0x82, 0x90, 0x1A, 0x86, 0x67, 0xE0, 0x0B, 0xF6, 0x0E, 0x86, - 0x34, 0x3F, 0x62, 0x67, 0xD5, 0x77, 0x80, 0x34, 0xDA, 0x78, 0x5F, 0xB1, 0x6E, 0xB1, 0x6F, 0xB5, - 0x30, 0xDD, 0x76, 0x60, 0x65, 0xDB, 0x51, 0x49, 0xF2, 0xAA, 0xE3, 0x24, 0x32, 0x79, 0x33, 0xAD, - 0x6E, 0xD9, 0x8A, 0x3F, 0x40, 0xEF, 0x60, 0xC2, 0xD8, 0x6F, 0x82, 0x83, 0xB9, 0xF5, 0xAE, 0x6D, - 0x9A, 0x6B, 0x32, 0x2C, 0x03, 0xE8, 0xA4, 0x30, 0x46, 0x6B, 0x0A, 0xB5, 0x71, 0x27, 0x15, 0x46, - 0x50, 0x9B, 0x00, 0x6D, 0x77, 0xB7, 0x31, 0xE8, 0xA4, 0xF2, 0xA0, 0x32, 0x42, 0xCE, 0x28, 0x3A, - 0x78, 0x3A, 0x8A, 0xDA, 0xED, 0xBA, 0x59, 0x13, 0xA2, 0xA0, 0x1D, 0xD5, 0x5E, 0x08, 0xC3, 0x19, - 0x0A, 0xDA, 0x56, 0xD4, 0x76, 0x41, 0x7D, 0xB1, 0x39, 0x0A, 0x8D, 0x18, 0x8A, 0x02, 0x3B, 0x5D, - 0x71, 0xF4, 0xB1, 0x56, 0x09, 0x5C, 0x0A, 0x96, 0xA0, 0x03, 0xC4, 0x37, 0xA3, 0xE2, 0x4C, 0x84, - 0xF7, 0x82, 0x5B, 0xBA, 0x87, 0x30, 0x29, 0x0C, 0x2D, 0xB7, 0x8F, 0x9F, 0x95, 0x32, 0x64, 0x0D, - 0xAF, 0xAA, 0x86, 0xA7, 0x1D, 0x8F, 0xF4, 0x86, 0x62, 0x74, 0xF1, 0x01, 0x72, 0x8F, 0xBC, 0xE1, - 0xC6, 0x63, 0xD1, 0xC1, 0x3B, 0x5D, 0x32, 0xC8, 0x11, 0xAB, 0x99, 0x6C, 0x5E, 0xB3, 0xCD, 0x6B, - 0x4E, 0xD4, 0x27, 0x25, 0x13, 0xF6, 0xA4, 0x24, 0x84, 0x49, 0xBD, 0x80, 0xF7, 0x3A, 0xC5, 0x2E, - 0xD3, 0xA7, 0x27, 0x45, 0x25, 0x5E, 0xD0, 0xA1, 0x53, 0x3F, 0x5A, 0x30, 0x2E, 0xD4, 0xD3, 0x1F, - 0x2C, 0xAC, 0xAD, 0x1E, 0xC1, 0x90, 0xFE, 0xB7, 0x06, 0x0C, 0x0C, 0xE0, 0x9C, 0xFE, 0x57, 0x5F, - 0x6E, 0x0E, 0x23, 0x38, 0xA3, 0xFF, 0xD5, 0x97, 0x9B, 0xC1, 0x00, 0xCE, 0xD6, 0xF0, 0xE1, 0x26, - 0x45, 0x62, 0x8D, 0x15, 0xFA, 0x3A, 0xEF, 0x25, 0x38, 0x7D, 0x19, 0x84, 0xF8, 0xA9, 0x97, 0xCC, - 0xAC, 0x93, 0x6E, 0xFD, 0x5A, 0x52, 0xBF, 0x84, 0x8E, 0xAB, 0x78, 0xB4, 0x86, 0xAB, 0xB5, 0x23, - 0xBC, 0x1A, 0xC4, 0x8C, 0x76, 0x1E, 0x0A, 0x62, 0xBD, 0xFA, 0xFC, 0x07, 0xA0, 0x26, 0xCE, 0x68, - 0xEE, 0x5C, 0x3F, 0x33, 0x08, 0x69, 0xAB, 0x50, 0x3C, 0xC6, 0x49, 0x1A, 0xC5, 0xD8, 0x02, 0x59, - 0x71, 0x49, 0x96, 0x39, 0x70, 0xEB, 0xAD, 0x8C, 0x48, 0xAD, 0xAF, 0xFB, 0x87, 0xC8, 0xED, 0xB6, - 0x5A, 0x5B, 0xEB, 0x8E, 0x14, 0x9B, 0x8D, 0xE6, 0x16, 0x42, 0xA1, 0x51, 0x70, 0xD6, 0x68, 0xBD, - 0x4D, 0x6A, 0xD7, 0x72, 0x86, 0xD3, 0x60, 0xD2, 0x94, 0xDB, 0x1B, 0x9D, 0x08, 0xD8, 0x4B, 0x96, - 0x2C, 0x6C, 0xA0, 0x15, 0x82, 0x92, 0x52, 0x91, 0xF7, 0xA0, 0xE9, 0x4D, 0xD2, 0xA5, 0x37, 0x57, - 0x6C, 0xA9, 0x9E, 0xE2, 0x64, 0x82, 0xC3, 0xB4, 0x19, 0x84, 0x8D, 0xB4, 0xD5, 0x4A, 0xED, 0xAA, - 0x02, 0x87, 0x4E, 0x9D, 0xBC, 0x4F, 0x55, 0xC1, 0x92, 0xCA, 0xB7, 0x6A, 0x9D, 0x5C, 0x42, 0x11, - 0x09, 0xB4, 0x56, 0xCE, 0xB4, 0xF5, 0xF2, 0x26, 0xB1, 0x53, 0xDC, 0x13, 0xE5, 0x0A, 0xD3, 0x1A, - 0xC6, 0xAB, 0x5E, 0xA9, 0x0D, 0x3B, 0x36, 0x96, 0xCD, 0xE8, 0x49, 0x54, 0xE0, 0x35, 0x2B, 0x6F, - 0x15, 0x2B, 0x65, 0x84, 0x99, 0xDE, 0x72, 0xFB, 0x4A, 0x55, 0xFD, 0xDA, 0x1C, 0x72, 0xF3, 0xB4, - 0x49, 0x36, 0x29, 0x6B, 0xB9, 0x8B, 0x3D, 0xC4, 0xC1, 0xA8, 0x30, 0xF4, 0x53, 0xAC, 0xBC, 0x77, - 0x7D, 0x98, 0x2E, 0x0F, 0xE0, 0x19, 0x7C, 0x06, 0x9F, 0x50, 0xF6, 0xC2, 0x20, 0xBF, 0xB9, 0x74, - 0x47, 0xE9, 0x01, 0x1A, 0x68, 0xA7, 0x3D, 0x15, 0x5C, 0xFD, 0x4F, 0xB2, 0x49, 0xCE, 0x99, 0xFD, - 0xDE, 0x54, 0xEF, 0xA4, 0x00, 0xFE, 0x53, 0x50, 0x12, 0x62, 0x40, 0x2F, 0x78, 0x47, 0x84, 0x4D, - 0x16, 0xF9, 0x61, 0xC6, 0x57, 0xB8, 0xE3, 0xA0, 0x11, 0x7D, 0x91, 0x79, 0xC6, 0x28, 0xDB, 0x90, - 0x35, 0x7B, 0x90, 0x8D, 0x77, 0x14, 0xC5, 0x35, 0x34, 0x7F, 0x5F, 0x6C, 0x12, 0xDA, 0x64, 0x20, - 0xAA, 0x3A, 0x58, 0x1C, 0x13, 0xAA, 0xC0, 0x98, 0x45, 0x7C, 0xE5, 0x68, 0xB2, 0x43, 0xD1, 0xA7, - 0x0F, 0x6C, 0x45, 0xAC, 0x17, 0x99, 0x99, 0xCD, 0xB8, 0x04, 0x7C, 0x8D, 0xAA, 0xB9, 0xE5, 0xCE, - 0x1C, 0x4D, 0xB7, 0x37, 0xCF, 0xC9, 0x44, 0x7B, 0x8E, 0xEA, 0xA7, 0xFD, 0x51, 0x75, 0x28, 0x50, - 0x4C, 0x1F, 0xC4, 0xE7, 0x86, 0x04, 0xA8, 0xCF, 0xA2, 0xEE, 0xD1, 0x67, 0xF2, 0x69, 0xBB, 0x37, - 0x3E, 0x74, 0x8A, 0x51, 0xF5, 0xB6, 0x9C, 0xCC, 0x7A, 0x0D, 0x86, 0xE7, 0xD6, 0x6B, 0xC1, 0xA1, - 0xCF, 0x8B, 0xC7, 0xA1, 0x2F, 0x38, 0x42, 0xE7, 0x41, 0xC8, 0x6E, 0xF6, 0x95, 0xA5, 0xC2, 0x7A, - 0x6D, 0xB6, 0xD7, 0x85, 0x73, 0xF8, 0x18, 0xBE, 0x85, 0xEF, 0x58, 0xBF, 0x3E, 0x80, 0xEF, 0xE9, - 0x76, 0x62, 0x34, 0x62, 0xE6, 0x74, 0xF2, 0xC2, 0x43, 0x35, 0xAA, 0xE0, 0xD7, 0xE9, 0x05, 0xD3, - 0x87, 0x82, 0x21, 0xDB, 0xE8, 0x03, 0x84, 0xE1, 0x7B, 0x84, 0x15, 0xF3, 0x3A, 0xF8, 0x5E, 0x1C, - 0x32, 0xBF, 0xE0, 0x46, 0x2A, 0x3C, 0x06, 0xE9, 0x07, 0xE5, 0x46, 0x4E, 0xAA, 0x9A, 0xED, 0xB8, - 0x63, 0xF8, 0x1E, 0x7D, 0xA0, 0x80, 0x1D, 0x19, 0x4D, 0xF6, 0x94, 0x9A, 0x40, 0x34, 0x77, 0xA0, - 0xA1, 0xC3, 0x91, 0x69, 0xB5, 0xAC, 0x32, 0xAA, 0xEA, 0x7B, 0xD5, 0x6A, 0x4C, 0x46, 0xF8, 0x10, - 0x39, 0xD4, 0x08, 0xAB, 0x60, 0xEE, 0x51, 0xEE, 0x0E, 0x1E, 0xDB, 0xE7, 0xC1, 0x35, 0xF6, 0xDF, - 0x44, 0x57, 0x09, 0x48, 0xC5, 0x39, 0x3C, 0x7A, 0x2F, 0x91, 0xC8, 0x71, 0x4C, 0x55, 0xC4, 0x4C, - 0x90, 0xE0, 0x7B, 0x94, 0x52, 0x49, 0xFF, 0xDE, 0xBE, 0x69, 0x8B, 0x7A, 0x87, 0x84, 0x26, 0x2A, - 0xA3, 0xAE, 0x56, 0x02, 0xF8, 0xA1, 0x28, 0xD3, 0xEE, 0x8A, 0x95, 0x68, 0xCB, 0x25, 0xF5, 0x3F, - 0xD0, 0x6C, 0x1F, 0xDB, 0x1F, 0x94, 0x89, 0x53, 0x0D, 0x5E, 0x78, 0x2A, 0x58, 0x4B, 0x7C, 0x16, - 0x4D, 0x52, 0x6D, 0xC7, 0x30, 0x08, 0xB2, 0x9D, 0x03, 0x5C, 0x6C, 0x26, 0x45, 0x98, 0xB3, 0x09, - 0x51, 0x9D, 0xC0, 0x07, 0x28, 0x65, 0x47, 0x0D, 0xBA, 0xB2, 0x55, 0xE6, 0xBE, 0x94, 0x90, 0xA9, - 0x96, 0xFB, 0x20, 0x46, 0x5B, 0x4E, 0x96, 0xE1, 0xD5, 0xCA, 0x32, 0x74, 0xFD, 0xD0, 0x69, 0xB5, - 0x3E, 0xC8, 0x07, 0x8D, 0x19, 0xAA, 0xA9, 0xE5, 0x00, 0x7C, 0x8F, 0xB8, 0x91, 0xFF, 0x7A, 0x42, - 0x8A, 0xD7, 0x73, 0xA2, 0xED, 0x0C, 0x96, 0x60, 0xBF, 0x07, 0x50, 0xAD, 0x28, 0x60, 0x93, 0x41, - 0x7E, 0x5F, 0x80, 0xE2, 0x64, 0x54, 0x15, 0x7E, 0x6F, 0x5F, 0x0B, 0xC2, 0x5D, 0x1F, 0xE4, 0x03, - 0x44, 0xC5, 0x17, 0x37, 0x66, 0x7C, 0x8F, 0x90, 0x36, 0x59, 0x8E, 0x48, 0x25, 0xE4, 0x40, 0x02, - 0x55, 0x72, 0x5F, 0x4E, 0x1A, 0x07, 0x0C, 0x55, 0xBC, 0xB8, 0x39, 0x94, 0x9A, 0x24, 0xCC, 0xAE, - 0xDE, 0x03, 0xC5, 0xA6, 0xEA, 0x85, 0x6E, 0xB3, 0x46, 0x47, 0x64, 0xA1, 0x59, 0x69, 0x7D, 0x00, - 0xE0, 0x8B, 0xB2, 0x0D, 0x19, 0x7A, 0x6F, 0x5F, 0x1B, 0xD2, 0x6F, 0xD0, 0x7B, 0xFB, 0xA6, 0x9C, - 0xAE, 0x1A, 0xA4, 0xBD, 0xB7, 0xAF, 0x77, 0xF4, 0x0E, 0xD7, 0x95, 0xA7, 0x00, 0x77, 0x0A, 0x1C, - 0x0C, 0x5F, 0x14, 0x2D, 0xEB, 0x76, 0x50, 0x09, 0x64, 0xC1, 0xBC, 0x6E, 0xA7, 0x38, 0x0D, 0x72, - 0xD2, 0x49, 0xC5, 0xE0, 0xBD, 0x0E, 0xDF, 0xBE, 0x01, 0x90, 0x0C, 0x94, 0x60, 0xBB, 0x6B, 0x32, - 0xCA, 0xE9, 0xB5, 0xEE, 0xED, 0xE4, 0xB5, 0x89, 0x3A, 0x1D, 0xA3, 0xC0, 0xA6, 0x6E, 0x15, 0x4C, - 0x44, 0xAB, 0x28, 0x9E, 0x46, 0x0B, 0xB3, 0xE4, 0x67, 0x80, 0xAA, 0x2B, 0x49, 0x7C, 0xF3, 0x7E, - 0x7C, 0x60, 0x7B, 0x3E, 0xB7, 0x19, 0x7B, 0x41, 0xBE, 0x72, 0xA3, 0xD5, 0x17, 0x99, 0x79, 0xD5, - 0xD1, 0x1C, 0x34, 0xA5, 0x04, 0x2E, 0x72, 0xE4, 0x39, 0x54, 0x72, 0x54, 0xAB, 0x8A, 0x0D, 0xCD, - 0x2B, 0x30, 0xF4, 0xAA, 0x2B, 0xF2, 0x90, 0xC0, 0x23, 0xE6, 0x6C, 0x69, 0xCB, 0x1D, 0xE9, 0x21, - 0x6F, 0x43, 0x1A, 0xDF, 0xF6, 0x56, 0x37, 0x21, 0xF6, 0xA8, 0xED, 0xF0, 0xAD, 0x78, 0xD5, 0x18, - 0x6C, 0x1B, 0xD5, 0x81, 0xED, 0x7E, 0xBB, 0xBF, 0x9D, 0xB4, 0x7B, 0x23, 0x6E, 0x65, 0xCE, 0xD7, - 0xEA, 0x78, 0x2C, 0xBA, 0x15, 0xC0, 0x19, 0xDA, 0x72, 0x44, 0x54, 0xED, 0xE0, 0xDC, 0xE2, 0x53, - 0x30, 0x63, 0x8E, 0x30, 0x90, 0x03, 0x0D, 0x08, 0x45, 0x6D, 0xCF, 0x84, 0x52, 0xA8, 0xA3, 0x94, - 0xD4, 0xA0, 0x14, 0x54, 0xA0, 0x44, 0xDB, 0xAC, 0xC1, 0x89, 0x1E, 0xAB, 0x22, 0xAF, 0x88, 0x54, - 0xD4, 0xF6, 0x3A, 0xEE, 0x28, 0x38, 0x44, 0xD1, 0x28, 0xE8, 0x74, 0xBE, 0x06, 0xBC, 0x58, 0xBB, - 0x35, 0x88, 0xB1, 0x17, 0x43, 0x28, 0x2C, 0x62, 0x16, 0x32, 0xBC, 0x1C, 0x13, 0x5E, 0x5F, 0xC1, - 0x10, 0xF2, 0x66, 0x2B, 0x11, 0xE3, 0x8F, 0xB0, 0xBF, 0xC2, 0xE7, 0x64, 0xE2, 0xF5, 0x18, 0xA7, - 0x49, 0x87, 0x8D, 0x59, 0xDB, 0x85, 0x37, 0x43, 0x81, 0x4E, 0x87, 0xB2, 0x56, 0xDB, 0x35, 0xBC, - 0x2D, 0xDB, 0xA8, 0x56, 0xFE, 0x62, 0x4D, 0x94, 0x8B, 0xDA, 0x56, 0xB2, 0x5A, 0xC5, 0x47, 0x8A, - 0xD2, 0x6D, 0xD4, 0xBA, 0xC5, 0x5C, 0x32, 0x1E, 0xF9, 0x09, 0xF5, 0x1D, 0xEC, 0x74, 0xC1, 0xD0, - 0x01, 0xF0, 0x66, 0xC8, 0x9B, 0x14, 0xD0, 0x4B, 0x86, 0x32, 0x79, 0xD8, 0xE6, 0x23, 0x67, 0xA8, - 0xF8, 0xD9, 0xA8, 0x6A, 0x5B, 0xEC, 0xF5, 0x6A, 0xF7, 0xDF, 0xAC, 0xF5, 0x2C, 0xCB, 0xB2, 0xC2, - 0xA3, 0xC2, 0x29, 0x7F, 0x6B, 0x77, 0x69, 0x7A, 0x6B, 0x27, 0x0F, 0x60, 0x96, 0x09, 0xF6, 0xE9, - 0x76, 0x2C, 0x11, 0x2F, 0xB0, 0x4F, 0x99, 0x91, 0xAE, 0x7C, 0xDB, 0xC6, 0xC5, 0x9B, 0xC8, 0x2E, - 0xAF, 0xCD, 0xEA, 0x63, 0x79, 0x5A, 0x44, 0xAE, 0x93, 0x04, 0x46, 0x00, 0x0A, 0xCA, 0x51, 0x00, - 0xD4, 0x66, 0xD8, 0xAA, 0x6F, 0xDB, 0xB6, 0x34, 0x0E, 0x86, 0x45, 0xC4, 0xDA, 0x08, 0xAB, 0x9F, - 0x6C, 0x2B, 0x38, 0xC9, 0xDF, 0x75, 0xA5, 0x50, 0x6C, 0x88, 0x26, 0x35, 0xCF, 0xB2, 0x26, 0xB5, - 0x4F, 0xB2, 0x94, 0x07, 0x56, 0xDA, 0xBB, 0x8B, 0xE2, 0xF3, 0x9B, 0x1C, 0x8D, 0x1D, 0x0D, 0x2C, - 0x9B, 0x5A, 0x6A, 0x0A, 0xD7, 0xDC, 0x28, 0x4C, 0xD6, 0xB3, 0x22, 0x2C, 0x96, 0x9A, 0xC9, 0xC5, - 0x44, 0x5A, 0x61, 0xAB, 0x94, 0xC1, 0x66, 0x7A, 0xB0, 0x45, 0x69, 0x1B, 0x0B, 0x45, 0x4A, 0x7B, - 0xF7, 0x3F, 0xA1, 0x47, 0x51, 0xD8, 0x8B, 0xF5, 0xD3, 0x8A, 0x49, 0x69, 0x5F, 0x37, 0x31, 0x9C, - 0x52, 0xA8, 0x2F, 0x85, 0xCA, 0x63, 0x6E, 0xDF, 0x18, 0xD2, 0x84, 0xDA, 0x54, 0x18, 0x7D, 0xBE, - 0x43, 0x90, 0x3E, 0x01, 0x72, 0x13, 0x6F, 0xE9, 0xDC, 0xE3, 0x3C, 0x37, 0xC1, 0x93, 0xEF, 0xE9, - 0xA9, 0xC9, 0xD3, 0xE1, 0xE1, 0x61, 0xB7, 0x0F, 0xA3, 0xFC, 0x8B, 0x5B, 0x3B, 0x85, 0x79, 0x0A, - 0xB5, 0x7A, 0x82, 0x1E, 0x0A, 0x94, 0x0A, 0xB3, 0xFC, 0x8B, 0x57, 0x98, 0xE7, 0x29, 0xAC, 0xC2, - 0x44, 0x7D, 0xB1, 0xC0, 0xBC, 0xDD, 0x78, 0x67, 0x89, 0x15, 0x77, 0x3C, 0xD0, 0x96, 0x5F, 0x51, - 0x67, 0xA6, 0x7C, 0x85, 0x9D, 0x39, 0x00, 0x3B, 0x6E, 0x97, 0xBB, 0xE1, 0x23, 0xA2, 0x71, 0xED, - 0x46, 0x56, 0xEC, 0x62, 0xC7, 0x08, 0xA1, 0x98, 0xC6, 0x23, 0x67, 0x9B, 0x5A, 0xEA, 0x59, 0x20, - 0x52, 0x12, 0xBA, 0x24, 0x21, 0x5C, 0xAD, 0x92, 0x56, 0x4B, 0x36, 0x28, 0x2B, 0x77, 0x62, 0x05, - 0x0D, 0x05, 0x46, 0x27, 0x32, 0xA5, 0x77, 0xC7, 0x9D, 0x10, 0x1C, 0x4C, 0x8E, 0x94, 0x1D, 0x34, - 0x72, 0x86, 0x3E, 0xCA, 0x63, 0xD2, 0xFB, 0x39, 0xE9, 0x8F, 0x85, 0x28, 0xC8, 0x5F, 0xFA, 0x54, - 0x79, 0x35, 0x14, 0x6F, 0x06, 0xB8, 0xF1, 0x55, 0x0A, 0xA5, 0x9D, 0x54, 0x00, 0x93, 0x2C, 0x83, - 0xEE, 0x43, 0xA3, 0x68, 0x4F, 0xB4, 0x38, 0xEB, 0x44, 0x8A, 0xBE, 0xF6, 0x7C, 0x1F, 0xFB, 0x1F, - 0xE1, 0x6B, 0x3E, 0xDE, 0xEC, 0x0F, 0xD9, 0xCA, 0x24, 0x89, 0x08, 0x8F, 0x4E, 0xFE, 0xCE, 0xBC, - 0x30, 0x24, 0xB2, 0x2B, 0x55, 0xEC, 0xC7, 0x2B, 0xA2, 0x8B, 0x33, 0x37, 0x40, 0x0E, 0x8C, 0x90, - 0x03, 0x89, 0x34, 0xF3, 0x90, 0x33, 0xBA, 0xF4, 0xE2, 0x06, 0x35, 0x78, 0xCE, 0xBD, 0x45, 0xF9, - 0xD4, 0x0A, 0x94, 0x6F, 0xAB, 0xB0, 0x9D, 0x46, 0x6F, 0xB9, 0x0F, 0xB0, 0xDD, 0xDC, 0xC2, 0x4E, - 0x7A, 0x81, 0x3A, 0x6A, 0x3A, 0xCD, 0x76, 0x3A, 0x4C, 0x73, 0xB2, 0x9E, 0xB2, 0x87, 0x38, 0xC2, - 0x31, 0xCB, 0x41, 0x7A, 0x64, 0xA5, 0x6D, 0xDB, 0x19, 0x80, 0x1D, 0x0B, 0xD3, 0xBF, 0x43, 0xFE, - 0x77, 0x87, 0xA7, 0x67, 0x1A, 0xEA, 0xD4, 0xBF, 0x49, 0xF3, 0x9B, 0x0E, 0xFF, 0x5F, 0x13, 0x52, - 0x33, 0x4E, 0x27, 0x83, 0xEA, 0x29, 0x0A, 0xC1, 0xEA, 0x38, 0x29, 0x3A, 0x3A, 0x52, 0x9E, 0x2E, - 0x48, 0xBB, 0xC9, 0xE4, 0xE8, 0x8B, 0x6F, 0x7E, 0x70, 0x4B, 0xBA, 0x94, 0x91, 0x3F, 0x29, 0xFB, - 0x13, 0xB0, 0x3F, 0x09, 0xC8, 0xBE, 0x18, 0x56, 0xE4, 0x7F, 0x91, 0x41, 0xD2, 0xCA, 0x1B, 0x42, - 0xFA, 0x62, 0x33, 0xA8, 0x3B, 0x18, 0x88, 0xA6, 0x2C, 0x7C, 0x70, 0xD0, 0xED, 0xAF, 0xD2, 0x83, - 0x03, 0x77, 0x77, 0x15, 0x1C, 0x1C, 0xEC, 0xAF, 0x12, 0x70, 0x78, 0x78, 0xE8, 0x64, 0x99, 0x35, - 0x53, 0xC6, 0x67, 0xB5, 0xB2, 0x94, 0xC1, 0xBA, 0xCD, 0x00, 0xD0, 0x3A, 0x24, 0xA9, 0x97, 0x6A, - 0xD4, 0xE3, 0xB7, 0xC0, 0x6C, 0x91, 0xEC, 0x0E, 0x06, 0xDB, 0x29, 0x80, 0x27, 0xD4, 0x17, 0xDD, - 0x18, 0x4D, 0x08, 0x0D, 0x38, 0x40, 0x0B, 0x53, 0x1E, 0x01, 0x90, 0x52, 0x6F, 0xC6, 0xA8, 0x63, - 0x31, 0xA7, 0x75, 0x1E, 0x60, 0x24, 0x9C, 0xF1, 0xDE, 0xC8, 0xE4, 0x2C, 0xC3, 0xCC, 0xB6, 0x5E, - 0xEB, 0x1F, 0x5D, 0x19, 0x3D, 0x44, 0x5A, 0x6B, 0x31, 0xCE, 0x03, 0x3B, 0x44, 0x6A, 0x90, 0xB5, - 0xDC, 0x03, 0x8A, 0x0F, 0x1A, 0xCA, 0x89, 0x0C, 0x34, 0x2B, 0x97, 0xC9, 0x3B, 0x71, 0x21, 0xA1, - 0xB8, 0xA9, 0x66, 0x22, 0x13, 0xA4, 0x48, 0x12, 0x09, 0x42, 0x22, 0x61, 0xBD, 0x86, 0x2F, 0x13, - 0x78, 0x8D, 0x53, 0x99, 0x40, 0x6B, 0x08, 0x3E, 0x8C, 0xD1, 0xA4, 0xAD, 0xAA, 0x11, 0x41, 0x67, - 0x02, 0xB6, 0x3D, 0x00, 0x23, 0xE4, 0x6B, 0xE9, 0x49, 0xC7, 0xA7, 0xE9, 0x21, 0x3A, 0xD5, 0xD2, - 0xE7, 0x9D, 0x53, 0x9A, 0x5E, 0x26, 0x9B, 0x91, 0x68, 0x20, 0x23, 0x4C, 0x11, 0x24, 0x9F, 0x50, - 0x63, 0x73, 0x93, 0xDB, 0x9F, 0xEE, 0x60, 0x80, 0x18, 0xED, 0xF8, 0x88, 0x90, 0x0A, 0x06, 0x6B, - 0xDA, 0x92, 0x8B, 0x2E, 0x31, 0x55, 0x27, 0x46, 0xDB, 0x5B, 0x06, 0x0C, 0x32, 0xAA, 0xC1, 0x80, - 0x9E, 0xFA, 0x24, 0xD2, 0x22, 0x58, 0x5A, 0xC7, 0x26, 0x39, 0xC9, 0x25, 0xE5, 0x12, 0x61, 0x1D, - 0x4B, 0x30, 0x89, 0xCA, 0x88, 0x8B, 0x89, 0x4E, 0x90, 0x5E, 0x71, 0xA4, 0x09, 0xFF, 0x72, 0x12, - 0x1B, 0xB9, 0x2D, 0xAD, 0xA1, 0x58, 0x9A, 0xF1, 0x86, 0x26, 0x41, 0x7A, 0x83, 0x52, 0x88, 0x8B, - 0x16, 0xF8, 0x9A, 0x03, 0x60, 0x85, 0xD3, 0x73, 0xA2, 0x41, 0x32, 0x09, 0xBC, 0xED, 0x60, 0x47, - 0xA0, 0x9D, 0x1B, 0xA6, 0x18, 0x68, 0x7E, 0x52, 0xE0, 0x9D, 0x02, 0xE7, 0x68, 0x7C, 0x33, 0xCE, - 0x32, 0x8B, 0xCB, 0x4E, 0x36, 0x21, 0xA9, 0x14, 0x2D, 0xCD, 0x46, 0xBA, 0xAE, 0xC1, 0x80, 0x79, - 0x3D, 0xB3, 0x83, 0xE4, 0xE3, 0xC8, 0xC7, 0xF9, 0x39, 0xE7, 0x5A, 0x1F, 0xB8, 0x98, 0x2F, 0x13, - 0x2E, 0xC4, 0x62, 0x99, 0x70, 0x95, 0xE7, 0xA4, 0x25, 0x05, 0xAC, 0xE2, 0xB9, 0xFB, 0x28, 0x69, - 0xB5, 0xAC, 0x14, 0x25, 0x30, 0x5D, 0x6B, 0xE7, 0x48, 0xA6, 0x1C, 0xC3, 0xE6, 0x65, 0x10, 0x62, - 0x2F, 0xFE, 0x56, 0xEC, 0xF9, 0x01, 0x41, 0x8A, 0x85, 0x2A, 0x76, 0xA9, 0xB7, 0x4C, 0x4E, 0xC5, - 0xA2, 0xBF, 0x2D, 0x6C, 0x5F, 0x50, 0xB7, 0x66, 0x3B, 0xDF, 0x3C, 0xF9, 0xDC, 0xF7, 0x3A, 0xE7, - 0xE3, 0xDB, 0x1E, 0xDC, 0xCF, 0x76, 0x02, 0x00, 0xC4, 0x9B, 0x80, 0xFC, 0xA4, 0x97, 0xDD, 0x88, - 0xCB, 0xC9, 0x97, 0x7B, 0x07, 0x94, 0x0E, 0x77, 0xBB, 0xC0, 0x8E, 0xF1, 0x02, 0x7B, 0xA9, 0xD5, - 0x65, 0x2E, 0x74, 0xA3, 0x72, 0xA9, 0x2E, 0xEC, 0x15, 0x4B, 0x85, 0xE5, 0x52, 0x3D, 0xD8, 0x2F, - 0x96, 0xCA, 0x39, 0x9D, 0x71, 0x9C, 0xB8, 0x09, 0xFF, 0x3F, 0x86, 0x90, 0x57, 0x2E, 0xD5, 0x87, - 0x83, 0x35, 0x68, 0x43, 0x8F, 0x23, 0xBE, 0x37, 0x54, 0xC4, 0x29, 0x66, 0xD3, 0xC7, 0x2A, 0x77, - 0x81, 0x02, 0x21, 0x0B, 0x0B, 0x99, 0x0E, 0x74, 0x69, 0x61, 0xD5, 0x1F, 0x19, 0xAA, 0x57, 0xD4, - 0x66, 0x0B, 0x52, 0xCE, 0x82, 0x7C, 0xC4, 0x49, 0x95, 0xA3, 0xCF, 0xAD, 0xCF, 0x93, 0x6D, 0xEB, - 0x73, 0xFF, 0xD6, 0x85, 0xBD, 0x0C, 0x7C, 0x9E, 0x6C, 0xC3, 0x35, 0xDF, 0x16, 0x4D, 0x70, 0x56, - 0xEE, 0xEA, 0x73, 0xFF, 0xE8, 0x73, 0xDB, 0xFA, 0xDC, 0x6F, 0x03, 0x92, 0x0E, 0x8E, 0x3E, 0x07, - 0x3B, 0xBA, 0x68, 0x52, 0x46, 0x24, 0xA1, 0x0E, 0x2B, 0x23, 0x35, 0xA1, 0x3B, 0xD6, 0xE8, 0x9C, - 0x9C, 0xF4, 0xC6, 0xD2, 0xFB, 0x53, 0xBE, 0xE4, 0xF1, 0x37, 0x10, 0x08, 0xA1, 0xE4, 0x64, 0x30, - 0x3E, 0x72, 0x87, 0x8A, 0x8B, 0x4A, 0x92, 0x02, 0x80, 0x91, 0xC2, 0xD4, 0x3D, 0xC2, 0x6A, 0xB5, - 0x15, 0x94, 0xDF, 0xFB, 0x4D, 0x92, 0x44, 0x94, 0x1F, 0x36, 0x3E, 0x0D, 0x93, 0xE5, 0x62, 0x11, - 0xC5, 0x29, 0xF6, 0x1B, 0x93, 0x24, 0xE1, 0xDE, 0x97, 0x9B, 0xEC, 0x86, 0x5E, 0xB9, 0x0E, 0x0D, - 0xA0, 0xFA, 0x85, 0x61, 0xC9, 0x0F, 0xB7, 0x92, 0xFD, 0xE0, 0x26, 0xE5, 0xB6, 0x85, 0xCC, 0x5D, - 0xBE, 0xE2, 0x43, 0x6F, 0x8C, 0xD2, 0xF2, 0xA5, 0x15, 0x29, 0x41, 0xB5, 0x5D, 0xD8, 0x1D, 0x0C, - 0xB6, 0xC8, 0x1A, 0x7D, 0xCF, 0xC6, 0x39, 0x33, 0x99, 0x75, 0x05, 0x48, 0x79, 0x2C, 0x63, 0xE2, - 0x33, 0xE1, 0xDA, 0x4C, 0xB2, 0x56, 0x91, 0xD1, 0xB4, 0x6B, 0xAA, 0x46, 0xC4, 0x28, 0xA5, 0x7F, - 0x23, 0x44, 0xC5, 0x3B, 0x6F, 0xD5, 0xEE, 0xBA, 0xDD, 0xDD, 0x6D, 0x2B, 0x39, 0x40, 0xB6, 0xD3, - 0x7B, 0xD4, 0xDD, 0x3F, 0x4A, 0x76, 0xDC, 0xAE, 0xFD, 0xA8, 0xCB, 0xCE, 0x08, 0x16, 0xD1, 0x95, - 0x65, 0x25, 0x44, 0x57, 0x1C, 0x80, 0x1D, 0x97, 0xFC, 0x81, 0x5D, 0xBB, 0x0F, 0x40, 0xDB, 0xDE, - 0x73, 0x07, 0xDD, 0x6D, 0x2B, 0x96, 0xD5, 0xE2, 0x52, 0xB5, 0xD8, 0x54, 0xCD, 0xD9, 0xEB, 0x76, - 0xB7, 0xAD, 0x48, 0x56, 0x8B, 0x4A, 0xD5, 0xA2, 0x72, 0xB5, 0x0C, 0xDB, 0x31, 0x9E, 0x7B, 0x69, - 0x70, 0x89, 0x5F, 0x2E, 0x2F, 0x82, 0xD0, 0x0B, 0x27, 0x46, 0x15, 0x20, 0xB5, 0x70, 0xBE, 0xF8, - 0x08, 0x0D, 0x87, 0x2E, 0x6E, 0x74, 0x2D, 0x2B, 0xC1, 0xE8, 0xA2, 0x34, 0xB3, 0xB8, 0x46, 0x44, - 0xE9, 0x4A, 0xD4, 0xFC, 0xBB, 0xD0, 0x55, 0xAE, 0x7C, 0x31, 0xCA, 0x5B, 0x8E, 0x90, 0x68, 0x7B, - 0xC4, 0x7C, 0xE1, 0xA7, 0xB2, 0x98, 0x47, 0x7E, 0xF3, 0x62, 0x33, 0xF2, 0x5B, 0x28, 0x61, 0xA7, - 0xD6, 0xDC, 0x80, 0x9E, 0x15, 0xB2, 0xC7, 0x41, 0xC6, 0x3C, 0x76, 0xA2, 0xCB, 0xAE, 0xC9, 0x46, - 0x93, 0x83, 0xA0, 0xD5, 0xB2, 0xC2, 0x43, 0x67, 0xB5, 0xF2, 0xC8, 0x3F, 0xB3, 0x43, 0x07, 0x8C, - 0x40, 0xD8, 0xC9, 0xCF, 0xC4, 0x1D, 0x98, 0x5B, 0x8F, 0xD8, 0xEE, 0x76, 0x08, 0x00, 0xF4, 0xAA, - 0xB3, 0x3D, 0x00, 0xE0, 0xAC, 0x3A, 0x7B, 0x46, 0x26, 0xFE, 0x43, 0x90, 0xE6, 0x0A, 0x7C, 0x48, - 0x15, 0x78, 0x8F, 0x2A, 0xF0, 0x33, 0x4D, 0xCE, 0xAA, 0x2E, 0x38, 0xFF, 0x99, 0x13, 0xFD, 0x80, - 0xA8, 0x6F, 0x2B, 0x8F, 0xFD, 0x99, 0x1D, 0xD0, 0xE7, 0x50, 0x20, 0xCC, 0x3D, 0xE9, 0xD1, 0xA3, - 0x83, 0xB6, 0x46, 0x3F, 0x92, 0xD6, 0x09, 0xE9, 0x8B, 0x58, 0xBD, 0x9C, 0x67, 0x28, 0xE7, 0x91, - 0x72, 0x33, 0xBD, 0xDC, 0xCC, 0x50, 0x6E, 0x06, 0xBE, 0xF6, 0x51, 0x59, 0xAB, 0x50, 0x27, 0xF9, - 0xD3, 0xAD, 0x08, 0x19, 0xDA, 0x22, 0x13, 0x74, 0x9F, 0x2C, 0x3D, 0xA6, 0x3C, 0xA2, 0x2F, 0x53, - 0x49, 0x7C, 0x4A, 0x5D, 0xC5, 0x1E, 0xB0, 0x37, 0xDC, 0xE1, 0x41, 0x94, 0xBF, 0x06, 0x4B, 0x79, - 0x1B, 0xD0, 0x43, 0xA4, 0x90, 0x09, 0x4A, 0x48, 0xA0, 0x50, 0x30, 0xDE, 0x41, 0x9C, 0x2B, 0xD9, - 0x01, 0xAF, 0x29, 0xF6, 0x2F, 0xDE, 0x61, 0x15, 0x80, 0x94, 0x02, 0x38, 0x0A, 0x87, 0xA9, 0xB8, - 0x5C, 0x0B, 0xA5, 0x2F, 0x69, 0x01, 0x05, 0xCE, 0x2A, 0xDB, 0xF7, 0x64, 0xFB, 0xB3, 0xBC, 0xFD, - 0x40, 0x62, 0x2E, 0xDA, 0x9F, 0x55, 0xB6, 0x1F, 0xB0, 0xF6, 0xBD, 0x61, 0x20, 0xDA, 0xF7, 0x32, - 0x26, 0xBE, 0xFC, 0xE5, 0x44, 0x11, 0x80, 0x44, 0xC1, 0x0F, 0x42, 0xA2, 0x7B, 0x26, 0x4A, 0x6A, - 0xC0, 0x94, 0x76, 0xB1, 0xDD, 0x35, 0x29, 0xED, 0xB9, 0xBE, 0x5E, 0x21, 0x2D, 0xC7, 0x8A, 0xE6, - 0x5F, 0xB9, 0xD1, 0xD7, 0xB6, 0x21, 0x22, 0xAF, 0xB0, 0x75, 0x93, 0x1E, 0x0A, 0xB2, 0x8C, 0xFA, - 0x23, 0x27, 0xB9, 0x42, 0xD0, 0x7A, 0x4C, 0xD2, 0xEA, 0x07, 0x2E, 0x7E, 0xE9, 0x40, 0xE6, 0x34, - 0x83, 0xBD, 0xFE, 0xE0, 0x21, 0xBE, 0x4D, 0xCF, 0xA3, 0xF8, 0xCA, 0x8B, 0x7D, 0xEA, 0x1A, 0x0C, - 0xA5, 0x9A, 0x8B, 0xB0, 0xDC, 0x2D, 0xAE, 0x96, 0x4A, 0xCF, 0xAE, 0x4D, 0x9E, 0x4E, 0x4F, 0xE7, - 0x41, 0x92, 0xE2, 0x10, 0xC7, 0x8A, 0xF7, 0x35, 0xEE, 0xA5, 0xCA, 0x47, 0x5B, 0x2E, 0x3D, 0x6F, - 0xA5, 0x4E, 0xC3, 0x8A, 0xC7, 0xAD, 0x34, 0x51, 0x7A, 0xAB, 0xA2, 0x5F, 0x08, 0xA3, 0x43, 0xAB, - 0x00, 0x55, 0x1E, 0xBB, 0xDE, 0x72, 0xA8, 0xC3, 0x82, 0xBF, 0x29, 0xD1, 0x18, 0xD0, 0xCF, 0x00, - 0x8B, 0x60, 0x14, 0xF7, 0x18, 0xF2, 0xB0, 0x5D, 0xE6, 0xB2, 0x73, 0x41, 0x6C, 0x78, 0x28, 0x9A, - 0x03, 0xE0, 0xD7, 0xCE, 0x29, 0x74, 0xA9, 0x4F, 0x28, 0xA8, 0xE0, 0x9D, 0x31, 0x4F, 0x30, 0xAA, - 0xC7, 0x97, 0x93, 0x71, 0xC1, 0xB9, 0x78, 0x05, 0x3E, 0x98, 0xE0, 0xC3, 0xFA, 0x58, 0xC4, 0x09, - 0x8F, 0x41, 0xC1, 0xAF, 0x50, 0xA0, 0xF9, 0x15, 0x62, 0x8E, 0x83, 0xE6, 0x73, 0xAE, 0x92, 0x42, - 0xD2, 0xBE, 0xE2, 0x74, 0xAC, 0x00, 0x4E, 0x9A, 0xDB, 0x15, 0x51, 0x40, 0x0E, 0x28, 0x0D, 0x1B, - 0x8B, 0xD2, 0xA3, 0x71, 0x89, 0x7E, 0x2A, 0x23, 0xCE, 0xD3, 0xA8, 0xE3, 0xA1, 0x94, 0x7B, 0xC2, - 0x61, 0x5E, 0xA3, 0xF7, 0x07, 0x8F, 0x2A, 0xBC, 0x46, 0x17, 0xDD, 0x8F, 0x80, 0x34, 0xF7, 0x67, - 0x36, 0xC2, 0x12, 0x9D, 0xFB, 0xF8, 0x90, 0x9E, 0xE2, 0x94, 0x39, 0xB8, 0xC6, 0x8F, 0xE3, 0xD8, - 0xBB, 0xC9, 0x9D, 0x5D, 0x23, 0xD9, 0x06, 0xCD, 0xA0, 0x87, 0x99, 0x5A, 0xAE, 0xF2, 0x21, 0x39, - 0x5F, 0x49, 0xAB, 0xE6, 0x7B, 0x5F, 0x16, 0x52, 0x38, 0x3F, 0x48, 0x9E, 0x2A, 0xBC, 0x5F, 0x1C, - 0x0C, 0x35, 0xD7, 0x31, 0x1B, 0xA9, 0x28, 0x50, 0x01, 0x56, 0xC8, 0x53, 0xCA, 0xCD, 0xC9, 0x15, - 0xE3, 0x29, 0x19, 0xD2, 0x58, 0xD5, 0xFA, 0x4A, 0xA5, 0xC5, 0x2C, 0xC2, 0xD9, 0x32, 0x54, 0x2B, - 0xE8, 0x06, 0x2B, 0x6A, 0x0D, 0x61, 0x24, 0x81, 0xB9, 0x2B, 0x9B, 0x54, 0x98, 0x32, 0xAB, 0x85, - 0xB4, 0x49, 0x01, 0x0B, 0xC4, 0x2D, 0x0B, 0x5A, 0x39, 0x87, 0x31, 0x2D, 0xAD, 0x8D, 0x4C, 0x50, - 0x3B, 0x8C, 0x35, 0xB0, 0x88, 0x3C, 0x20, 0xFC, 0x95, 0x65, 0x19, 0xEC, 0xEF, 0x3F, 0x48, 0x2E, - 0xE6, 0xBE, 0x26, 0x51, 0x6A, 0xBF, 0xBB, 0x8A, 0xF8, 0xEF, 0xF5, 0xFE, 0x9E, 0x4F, 0xC9, 0x9E, - 0x07, 0xDD, 0x66, 0x59, 0x82, 0xD3, 0x82, 0xFF, 0x4C, 0x2F, 0xF5, 0x4E, 0xF0, 0x38, 0x77, 0xCB, - 0xC7, 0xBE, 0x89, 0xA4, 0x87, 0x5A, 0x0A, 0x91, 0x41, 0x01, 0x11, 0x97, 0xDA, 0x0C, 0xD3, 0x8A, - 0x1C, 0x15, 0x2B, 0x0C, 0xB9, 0xDB, 0x65, 0xED, 0xBA, 0x49, 0xE2, 0x92, 0xA9, 0x7D, 0x08, 0xF4, - 0xEE, 0xD5, 0xF0, 0xB5, 0xF0, 0x7B, 0x19, 0xC8, 0xCE, 0x08, 0x4B, 0x09, 0x99, 0x6F, 0x0B, 0x34, - 0x85, 0xA5, 0x32, 0x4D, 0x14, 0xC5, 0x69, 0x65, 0xB5, 0x77, 0xB2, 0x38, 0x2D, 0xC2, 0xA0, 0x89, - 0x9E, 0xB2, 0xF5, 0xF3, 0xD2, 0x8B, 0x1B, 0x32, 0x8C, 0x01, 0xF3, 0x4C, 0x8F, 0xAC, 0x18, 0x19, - 0x40, 0x00, 0xE1, 0x71, 0x00, 0x69, 0xCE, 0xEB, 0x49, 0x36, 0x5D, 0x56, 0xCB, 0xA4, 0x90, 0xCE, - 0xB8, 0xB3, 0x0C, 0xF6, 0x1E, 0x3D, 0x7A, 0x08, 0x7F, 0x04, 0xC9, 0xF1, 0x2C, 0x8E, 0x2E, 0xF0, - 0x27, 0x6F, 0xA9, 0x7F, 0xF9, 0x97, 0x41, 0xB8, 0xBC, 0xA6, 0xBF, 0x3E, 0x0B, 0x42, 0x3F, 0xBA, - 0x62, 0x2E, 0xE9, 0x5F, 0x2C, 0x66, 0x51, 0x88, 0xF9, 0x4F, 0xCF, 0xA7, 0x3F, 0x5E, 0x79, 0x13, - 0xB6, 0x5D, 0x7E, 0xEB, 0x9D, 0x7B, 0x71, 0xF0, 0x43, 0xFC, 0x0E, 0x97, 0x64, 0xB1, 0x14, 0x06, - 0x0F, 0x4F, 0xBD, 0xC9, 0xCD, 0x33, 0x7F, 0xCA, 0x6A, 0x3F, 0x0F, 0x62, 0x7C, 0x1E, 0xB1, 0x06, - 0x3E, 0x8E, 0x7C, 0x45, 0x40, 0xF1, 0xEF, 0xE6, 0x32, 0x64, 0xD8, 0xFB, 0xF9, 0x43, 0xC7, 0xD0, - 0xBB, 0x0C, 0xA6, 0x5E, 0x1A, 0xC5, 0xCA, 0xF9, 0x37, 0x2B, 0x7E, 0xD4, 0x0C, 0x23, 0x1F, 0x37, - 0x87, 0xB2, 0x84, 0xBD, 0x4C, 0x70, 0xFC, 0x78, 0x8A, 0xC3, 0x14, 0x26, 0x35, 0xA5, 0x16, 0x73, - 0x2F, 0x25, 0xFB, 0xF2, 0x91, 0x8A, 0x53, 0x40, 0xF4, 0xAC, 0xF9, 0xD2, 0xC7, 0x89, 0xD5, 0xE4, - 0x69, 0x4D, 0x46, 0x21, 0xA5, 0x13, 0x6A, 0x21, 0x92, 0xC0, 0x4B, 0xF0, 0x1E, 0xEF, 0xFC, 0xFF, - 0x2D, 0xEB, 0x68, 0x6B, 0x42, 0x09, 0xBA, 0xF2, 0x42, 0x3F, 0x8E, 0x02, 0x1F, 0xD8, 0x60, 0x3B, - 0xA1, 0xD9, 0x3B, 0x81, 0x9D, 0xE2, 0x24, 0xB5, 0x02, 0x2E, 0xDE, 0x75, 0xC2, 0x29, 0x9E, 0x80, - 0xA9, 0x26, 0x20, 0xA1, 0x8A, 0x25, 0xDC, 0x91, 0xAF, 0x31, 0x03, 0x71, 0xBE, 0xC4, 0xEB, 0x7E, - 0xBE, 0x43, 0xCF, 0x88, 0x76, 0x40, 0x81, 0xDD, 0xF0, 0x6A, 0x85, 0xF3, 0x8B, 0x24, 0x47, 0x39, - 0xBC, 0xA2, 0xF1, 0x4B, 0xA0, 0x18, 0xC6, 0x93, 0xE6, 0x2B, 0x6F, 0x12, 0x84, 0x69, 0x94, 0xCC, - 0x9A, 0x90, 0xFC, 0x7E, 0x11, 0xA6, 0x78, 0xCE, 0x7E, 0xBE, 0x7E, 0x7D, 0xCC, 0x7E, 0xEC, 0xEE, - 0xFF, 0x60, 0x73, 0x9C, 0xF7, 0x3E, 0x61, 0x1D, 0xA7, 0xEC, 0xD0, 0x0C, 0x5E, 0x7B, 0x64, 0xBC, - 0xE8, 0x51, 0xAA, 0xE4, 0x96, 0x66, 0xF0, 0x9A, 0xFC, 0xCD, 0xD3, 0x05, 0x47, 0x9D, 0x34, 0xF9, - 0xAF, 0x26, 0x24, 0xBF, 0xDC, 0x5D, 0xF6, 0xB7, 0xD7, 0x65, 0x7F, 0x8F, 0x9F, 0x19, 0xDA, 0x61, - 0x7C, 0x99, 0x8B, 0xF0, 0x26, 0x4D, 0x68, 0x82, 0x43, 0xE4, 0xE8, 0x4C, 0xBC, 0xF3, 0xF9, 0xD9, - 0x71, 0xFC, 0xC9, 0xDB, 0xCF, 0xCF, 0x76, 0x04, 0xB1, 0x33, 0xD8, 0xE3, 0x22, 0xF4, 0xDE, 0xB7, - 0x87, 0x4F, 0xF1, 0x59, 0xB4, 0x0C, 0x27, 0xD8, 0x17, 0x8E, 0x44, 0x51, 0xAA, 0xFB, 0x14, 0x45, - 0xA9, 0xFD, 0x3A, 0x0E, 0xA2, 0x38, 0x48, 0x6F, 0xF2, 0x34, 0xF3, 0x25, 0x21, 0x13, 0xB9, 0xB1, - 0x51, 0x50, 0xA5, 0x5E, 0xF2, 0x5E, 0x5D, 0x7A, 0x91, 0x93, 0x09, 0x9F, 0xA4, 0x58, 0x2B, 0x53, - 0xB8, 0xB9, 0xA7, 0xDE, 0xA6, 0x2D, 0x90, 0x9D, 0xCF, 0x49, 0x32, 0x53, 0x4B, 0xF8, 0xFA, 0xCA, - 0x3D, 0x75, 0xF3, 0x6A, 0x5C, 0xD9, 0x02, 0x4A, 0x1A, 0xB7, 0x00, 0x0E, 0xC6, 0x96, 0x14, 0x7D, - 0x41, 0xBB, 0xCD, 0x4D, 0x20, 0x4C, 0x3E, 0xFF, 0x4F, 0x03, 0x7F, 0x8E, 0x8F, 0xBD, 0xF9, 0xFC, - 0xCC, 0x9B, 0xBC, 0x97, 0x3A, 0xD8, 0x84, 0xEC, 0x4B, 0xE6, 0x22, 0xD9, 0x2A, 0x97, 0x14, 0xB8, - 0xAA, 0x69, 0x22, 0x3A, 0x49, 0xDE, 0x5F, 0x58, 0xC6, 0x16, 0x39, 0x99, 0xE8, 0xA0, 0x01, 0x01, - 0xB9, 0x0A, 0x69, 0x70, 0x59, 0x92, 0xF0, 0xCA, 0xA8, 0x23, 0xB5, 0x88, 0xA3, 0x09, 0x4E, 0x12, - 0xFB, 0x2C, 0xE0, 0x5E, 0xAF, 0x88, 0x92, 0x27, 0x52, 0x73, 0x3A, 0x1B, 0xF0, 0xE4, 0x0E, 0x32, - 0x1D, 0x48, 0x10, 0x4D, 0x10, 0xB6, 0xD3, 0xE0, 0x02, 0xBF, 0xC1, 0x17, 0x5E, 0x10, 0x06, 0xE1, - 0x94, 0xC6, 0x29, 0x61, 0x3A, 0x50, 0x2D, 0xED, 0xA9, 0x65, 0x0C, 0x7A, 0xEA, 0xA5, 0xD8, 0x0E, - 0xA3, 0xAB, 0xFC, 0x59, 0x40, 0xF5, 0x60, 0xC0, 0x54, 0x7D, 0x0E, 0x91, 0xD7, 0xEC, 0xA4, 0x00, - 0x06, 0x79, 0x16, 0xE1, 0x6F, 0x18, 0x1B, 0xD0, 0x72, 0xED, 0xC1, 0x76, 0x70, 0x18, 0x0B, 0x41, - 0x92, 0x74, 0xD2, 0x83, 0x4E, 0xD7, 0x69, 0xB5, 0x44, 0x44, 0xAB, 0x2B, 0x2F, 0x0E, 0xAD, 0x2F, - 0x08, 0x02, 0x0D, 0xCA, 0x6C, 0x0D, 0x7C, 0x3D, 0xC1, 0xD8, 0xC7, 0x7E, 0xC3, 0x9B, 0xCF, 0xA3, - 0x34, 0xC5, 0x7E, 0xC3, 0xC7, 0x9E, 0x3F, 0x0F, 0x42, 0xDC, 0x38, 0xBB, 0x69, 0x7C, 0x70, 0x2B, - 0x0D, 0x03, 0x94, 0xA3, 0xE4, 0xA4, 0x93, 0x02, 0x90, 0x5D, 0x24, 0x5F, 0xB0, 0xD0, 0x33, 0x0D, - 0x8D, 0x33, 0x47, 0x09, 0x8A, 0x33, 0x8D, 0xA5, 0x32, 0x36, 0x0F, 0xA2, 0x06, 0x7B, 0x9A, 0x4A, - 0x66, 0x44, 0x69, 0xBC, 0x72, 0xED, 0x2F, 0xC1, 0xE9, 0xBB, 0xE0, 0x02, 0x47, 0xCB, 0x94, 0x79, - 0x59, 0xC5, 0x96, 0x6A, 0x8E, 0xFC, 0x94, 0x23, 0x67, 0xB9, 0xBB, 0x80, 0x0E, 0x66, 0x81, 0x19, - 0x89, 0x52, 0x48, 0x5D, 0xD8, 0x72, 0x10, 0x18, 0x64, 0xC5, 0x9A, 0x8A, 0xDE, 0x98, 0xD3, 0xB7, - 0x8D, 0xC5, 0xA1, 0xAD, 0x46, 0x51, 0xAA, 0x9E, 0x29, 0x87, 0x66, 0x69, 0x27, 0xAF, 0x02, 0xA8, - 0x8E, 0x52, 0x96, 0x05, 0x11, 0x2C, 0x4A, 0x0C, 0x79, 0xF1, 0xD5, 0x6A, 0x35, 0x79, 0xC7, 0x5F, - 0x28, 0x2C, 0xD7, 0x0C, 0xC2, 0xC6, 0x15, 0x15, 0x93, 0x47, 0x8C, 0x52, 0x1B, 0xD1, 0xC9, 0x00, - 0x88, 0xF5, 0xB6, 0x4C, 0x10, 0x9A, 0x52, 0x2C, 0x98, 0x0D, 0x23, 0xA3, 0xB8, 0xAB, 0xD6, 0xAD, - 0x28, 0xC3, 0xF0, 0xD0, 0x47, 0x5A, 0x07, 0x99, 0xAA, 0xA5, 0x15, 0x2B, 0x78, 0xE8, 0x65, 0x69, - 0xB9, 0x80, 0x93, 0xE2, 0x4B, 0xCD, 0xE6, 0x69, 0x44, 0xD3, 0x71, 0xFB, 0x7B, 0x0F, 0xD1, 0x74, - 0x9E, 0xF1, 0x37, 0xD0, 0x8F, 0xD3, 0x34, 0x26, 0xCA, 0x81, 0xEE, 0x16, 0x7D, 0xBD, 0x42, 0x7C, - 0x3E, 0x15, 0xE2, 0xE9, 0x4C, 0xFE, 0x12, 0xEF, 0xAA, 0x29, 0x01, 0x92, 0x2C, 0x49, 0xBD, 0x34, - 0x98, 0x34, 0x94, 0x77, 0xFE, 0xDA, 0x81, 0x8C, 0x72, 0x0E, 0xA3, 0x1F, 0xC4, 0xF0, 0x7A, 0xD4, - 0xD7, 0x51, 0xA9, 0x26, 0xBB, 0xED, 0x3E, 0x71, 0xC6, 0x80, 0x9E, 0xD5, 0xF1, 0x4F, 0x77, 0x2C, - 0xAE, 0xAC, 0x5A, 0xF8, 0xA4, 0x3B, 0xCE, 0x26, 0xF3, 0x28, 0xC4, 0x05, 0xC7, 0xD7, 0x81, 0x8C, - 0xDE, 0x43, 0x90, 0xE7, 0x9D, 0x80, 0x98, 0xFA, 0x0B, 0x62, 0xFD, 0x80, 0x38, 0xEF, 0x82, 0xD6, - 0x21, 0x9B, 0xC3, 0x83, 0x38, 0x53, 0x7C, 0xF7, 0x08, 0x36, 0xDB, 0xDD, 0x73, 0x9D, 0xFD, 0xFD, - 0xDD, 0x7E, 0x8B, 0xC3, 0xCC, 0x84, 0x5F, 0x00, 0x51, 0xC0, 0xED, 0xF5, 0xBB, 0xEE, 0xDE, 0x5E, - 0x77, 0x5F, 0x29, 0xA1, 0xB8, 0xE3, 0xD1, 0xB6, 0x02, 0x33, 0x2F, 0xD1, 0x86, 0xC6, 0x02, 0x2C, - 0x68, 0x98, 0x8E, 0x8F, 0xFE, 0x70, 0xFD, 0xC8, 0x1D, 0x76, 0x77, 0xF7, 0xFB, 0xBD, 0x41, 0x7F, - 0xB0, 0xAB, 0x22, 0x31, 0x0F, 0xC2, 0xF7, 0x39, 0xF8, 0x41, 0x6F, 0x77, 0x7F, 0xCF, 0x79, 0xE4, - 0x76, 0x95, 0x22, 0x8A, 0x97, 0x23, 0x89, 0xAC, 0xB3, 0xD7, 0xDB, 0xEB, 0xBB, 0xFB, 0x5D, 0xB5, - 0x3F, 0xC2, 0xC7, 0x90, 0xB9, 0xCB, 0x67, 0xA4, 0x08, 0x75, 0x55, 0x54, 0xD1, 0x63, 0x5A, 0xA0, - 0xE0, 0x56, 0x48, 0xDA, 0x30, 0xB8, 0xFD, 0xBD, 0xFE, 0x7E, 0x6F, 0xB7, 0xAF, 0x52, 0xE7, 0x75, - 0x1C, 0xA5, 0x2C, 0x42, 0x49, 0x15, 0xFA, 0x67, 0xD3, 0xAC, 0xE8, 0x52, 0x48, 0x96, 0xE4, 0xEE, - 0xDC, 0x24, 0xBC, 0xA2, 0xA7, 0x20, 0x73, 0x41, 0x8A, 0xE4, 0xF3, 0x29, 0xF5, 0x68, 0x51, 0x2C, - 0x81, 0x90, 0x55, 0x84, 0x0A, 0x08, 0x85, 0x37, 0x2C, 0x7D, 0x46, 0x4B, 0x3F, 0x9F, 0xBE, 0xF6, - 0xE6, 0x38, 0x4D, 0x55, 0x62, 0x73, 0xC7, 0x77, 0x26, 0xF8, 0xAB, 0x95, 0x70, 0x84, 0x57, 0xD9, - 0xFA, 0xE6, 0xF0, 0xCE, 0x6A, 0xE1, 0x09, 0xFC, 0xA4, 0xDF, 0x10, 0x01, 0xCF, 0xA9, 0x6C, 0x7A, - 0x83, 0xA2, 0x0C, 0x6A, 0x2E, 0x58, 0x0C, 0x35, 0xC4, 0x34, 0x6C, 0xB5, 0xE4, 0x87, 0x36, 0xB0, - 0x96, 0x74, 0x15, 0x58, 0xC2, 0x62, 0x13, 0xCF, 0x81, 0xD4, 0xAA, 0x88, 0x95, 0x37, 0x7B, 0xFA, - 0xE3, 0xD5, 0xF3, 0x52, 0xBA, 0xD7, 0xBF, 0x8E, 0x9B, 0x65, 0xAA, 0x37, 0x2A, 0x33, 0x32, 0x67, - 0x77, 0x44, 0xE6, 0x6C, 0x23, 0x64, 0xCE, 0x4C, 0xC8, 0x94, 0xA5, 0x83, 0x9C, 0x46, 0xBA, 0x00, - 0x38, 0x9B, 0xF2, 0x50, 0x4D, 0xA2, 0xB8, 0x90, 0xDB, 0x52, 0x84, 0x04, 0xC9, 0xB3, 0x8B, 0x45, - 0x7A, 0x63, 0x81, 0x23, 0x5E, 0xA1, 0x85, 0x3A, 0x02, 0xC8, 0xDE, 0x90, 0xA7, 0xAD, 0x90, 0x84, - 0x9B, 0x19, 0x5C, 0xA8, 0x10, 0xE5, 0xAD, 0xD4, 0x70, 0xAB, 0xF5, 0xFF, 0x54, 0x08, 0x2B, 0x5A, - 0x0B, 0x18, 0x69, 0x58, 0x55, 0xF8, 0x4E, 0x84, 0xAD, 0x00, 0xB2, 0x09, 0xB5, 0xAB, 0xAA, 0x16, - 0xBC, 0x40, 0xD2, 0xB2, 0x2A, 0x7B, 0x66, 0x95, 0x19, 0x25, 0x72, 0xE9, 0xB2, 0xE7, 0xAE, 0x64, - 0x3B, 0xDA, 0x88, 0x5E, 0xC3, 0x02, 0x1E, 0xAC, 0xCD, 0xCC, 0xE8, 0xB5, 0xE7, 0xC1, 0x98, 0x94, - 0x26, 0x7C, 0xD5, 0x20, 0x32, 0xAC, 0xA4, 0x70, 0x2D, 0xA1, 0x53, 0x12, 0x63, 0x77, 0x46, 0xA9, - 0x52, 0xEE, 0x55, 0xA1, 0x54, 0x23, 0x0C, 0xD7, 0xF7, 0x42, 0xE2, 0x5B, 0xEA, 0x49, 0x49, 0xC6, - 0xDD, 0xB9, 0x27, 0x65, 0x31, 0xBA, 0x1E, 0x1F, 0xD9, 0xAA, 0xC6, 0x74, 0x54, 0x35, 0xA8, 0xC4, - 0xE4, 0x7C, 0x7A, 0x54, 0xC2, 0xED, 0xA8, 0x4E, 0xC9, 0x18, 0xBA, 0x43, 0x87, 0x68, 0xF3, 0xBA, - 0xA2, 0x18, 0x70, 0x1D, 0x51, 0x57, 0x87, 0x31, 0xD1, 0x08, 0x91, 0xF4, 0x0F, 0x81, 0xAF, 0xA5, - 0xB1, 0xFA, 0xE9, 0x32, 0x9E, 0xBF, 0xF0, 0xE5, 0x17, 0xC9, 0xC1, 0x5A, 0x4E, 0xCA, 0x2E, 0x94, - 0xAE, 0x4B, 0xD7, 0x49, 0x34, 0xFB, 0xA8, 0xD3, 0xDF, 0x7D, 0xB4, 0xB7, 0xDB, 0x75, 0xFA, 0x8F, - 0x5A, 0x12, 0x02, 0xDB, 0x1A, 0xEA, 0xD8, 0x1E, 0x1C, 0x74, 0x77, 0x87, 0xB2, 0x04, 0xD1, 0xBE, - 0x29, 0x4C, 0xAC, 0xA2, 0x84, 0x69, 0x53, 0xCB, 0x0A, 0x7A, 0xA9, 0xAD, 0x0E, 0x86, 0x96, 0x68, - 0x77, 0x3F, 0x6F, 0x17, 0x1C, 0x1E, 0x76, 0x77, 0x29, 0xE8, 0x02, 0x0C, 0xB5, 0x95, 0x16, 0xCA, - 0x51, 0xCE, 0x3B, 0xBD, 0x42, 0x14, 0xC3, 0x96, 0x84, 0xAA, 0xA3, 0x22, 0xC4, 0xAB, 0xAE, 0x6D, - 0xF5, 0x5A, 0x7A, 0x87, 0x0A, 0xC5, 0x0B, 0xAD, 0x0A, 0x15, 0x4D, 0x6D, 0x54, 0x02, 0xE2, 0x5D, - 0x27, 0x9D, 0x33, 0xF6, 0x98, 0xC1, 0xA7, 0xD9, 0x12, 0x2C, 0x1B, 0x1F, 0x2C, 0x75, 0x6B, 0x25, - 0x42, 0x57, 0x62, 0xC9, 0x46, 0xD4, 0xC1, 0x24, 0xF3, 0x83, 0x2F, 0x32, 0xA5, 0x35, 0x5F, 0x27, - 0x99, 0xB2, 0xFE, 0x73, 0x04, 0xB2, 0xE2, 0x16, 0x25, 0xC9, 0xE0, 0xDE, 0x7E, 0xF7, 0x61, 0x27, - 0x57, 0xC7, 0x78, 0x3E, 0xD7, 0xF6, 0x37, 0xF2, 0x30, 0xCA, 0xED, 0xF5, 0x0C, 0x01, 0xC0, 0x38, - 0x73, 0x87, 0x72, 0xBB, 0x59, 0xF0, 0x61, 0x56, 0xD8, 0x18, 0x25, 0xCB, 0x05, 0x8E, 0x2D, 0xDB, - 0xB6, 0x65, 0x48, 0x62, 0xF1, 0xC6, 0x83, 0x45, 0x76, 0x95, 0x2F, 0x36, 0xD6, 0xED, 0x9D, 0x22, - 0xBD, 0xEF, 0x02, 0x08, 0x73, 0xAA, 0x4F, 0x3B, 0xD0, 0x6C, 0x6A, 0xDB, 0xA4, 0x99, 0x17, 0x53, - 0x13, 0x2D, 0x65, 0xE3, 0x4E, 0xE0, 0x84, 0xB9, 0x05, 0x7D, 0xC2, 0xDD, 0xE5, 0xE7, 0x25, 0x61, - 0x9A, 0x05, 0x89, 0xF0, 0xD4, 0xAF, 0xC8, 0x09, 0xE7, 0xD1, 0x9E, 0x3B, 0xE0, 0x5A, 0x36, 0x47, - 0x9C, 0x70, 0x0B, 0x73, 0x8E, 0xA7, 0x33, 0x0B, 0xCF, 0x3E, 0x3C, 0xEC, 0x76, 0x49, 0x11, 0x02, - 0x3C, 0xA9, 0x87, 0x74, 0x54, 0xEA, 0xCA, 0x90, 0x15, 0x73, 0xF5, 0x62, 0x34, 0xA8, 0x2D, 0xB3, - 0x79, 0x63, 0x9E, 0x11, 0x7D, 0xFC, 0x3A, 0x0A, 0xC2, 0x14, 0x58, 0xA6, 0xE2, 0x60, 0xD8, 0x6C, - 0x52, 0x04, 0xB4, 0x25, 0x96, 0xCB, 0xC7, 0xBC, 0x8B, 0xE5, 0xC6, 0x55, 0xD7, 0x8A, 0xE5, 0x4C, - 0xF1, 0xE2, 0x1E, 0x18, 0x71, 0xCC, 0xCA, 0x24, 0x95, 0x5B, 0x63, 0x7C, 0x12, 0xDB, 0xC7, 0x1F, - 0x3D, 0x7E, 0x73, 0xFA, 0xF4, 0xF1, 0xBB, 0xC7, 0xA7, 0x8F, 0xDF, 0xBD, 0x7B, 0x73, 0xFA, 0xE2, - 0xE3, 0xA7, 0xCF, 0x7E, 0x78, 0x9C, 0x0F, 0x3B, 0x3F, 0x3E, 0x63, 0x6F, 0xE2, 0xF5, 0xF2, 0xF4, - 0x17, 0x2B, 0x2F, 0x82, 0xEF, 0x74, 0x41, 0x8A, 0xB6, 0x1C, 0xE9, 0x9E, 0xAF, 0x8B, 0x10, 0x5A, - 0x57, 0x27, 0xBF, 0xAB, 0xAE, 0x2E, 0xA9, 0x79, 0x96, 0x24, 0x88, 0x0C, 0x06, 0xDD, 0x47, 0xBB, - 0x07, 0x28, 0xA0, 0xA1, 0x10, 0x07, 0xBB, 0x3D, 0xF7, 0x91, 0x62, 0x85, 0xB4, 0x09, 0x18, 0x17, - 0x8C, 0x06, 0xBB, 0xBD, 0xAE, 0x73, 0x80, 0x92, 0x56, 0x2B, 0x39, 0x40, 0x83, 0xBD, 0x5E, 0xBF, - 0x77, 0xA4, 0xCD, 0x02, 0xD7, 0xE9, 0xF6, 0xB7, 0xAD, 0xA0, 0x43, 0xDB, 0x02, 0xED, 0xA4, 0x43, - 0x2B, 0xB4, 0x77, 0x07, 0x83, 0xDE, 0xEE, 0x4A, 0x6F, 0xE4, 0xB3, 0x17, 0x4F, 0xDF, 0x7D, 0xC4, - 0x5B, 0x39, 0x38, 0xE8, 0x76, 0x87, 0x84, 0x0A, 0x19, 0xA5, 0x82, 0xF2, 0x4B, 0x05, 0xBE, 0x61, - 0x5F, 0xD7, 0xB4, 0x33, 0x4A, 0xC5, 0x51, 0xAE, 0x36, 0xEB, 0x2A, 0x81, 0xEB, 0xD3, 0x9C, 0x33, - 0xFE, 0x9A, 0x36, 0xE8, 0x6A, 0xFD, 0x38, 0x91, 0xEC, 0x23, 0xCF, 0x46, 0xC4, 0xD1, 0x84, 0xD0, - 0xE5, 0xF8, 0xB4, 0x92, 0xDF, 0x7C, 0x26, 0xE6, 0xF9, 0x94, 0xEB, 0xC7, 0x44, 0x64, 0x4A, 0x01, - 0x17, 0x66, 0x70, 0x7F, 0xF0, 0xA0, 0xAB, 0xD2, 0xCF, 0x3E, 0x7A, 0xF1, 0xEE, 0xD9, 0xDB, 0xD7, - 0x8F, 0x8F, 0x9F, 0x9D, 0x1E, 0x3F, 0xA3, 0xEF, 0x65, 0x9E, 0x3E, 0x43, 0xE5, 0x64, 0xDA, 0x2B, - 0x43, 0x3A, 0xE9, 0xB7, 0x7C, 0x25, 0xA4, 0xD4, 0xCF, 0x13, 0x44, 0x4D, 0xA5, 0x08, 0xAB, 0xA3, - 0x50, 0xF8, 0x93, 0xA7, 0xCF, 0x18, 0xC5, 0xB4, 0x64, 0x85, 0x92, 0x7A, 0x71, 0x39, 0x20, 0x5A, - 0x72, 0x3E, 0xFD, 0x50, 0xAA, 0x06, 0xFF, 0x52, 0xBE, 0x48, 0x11, 0xE5, 0x53, 0x7D, 0xD6, 0x04, - 0x8B, 0xC9, 0x6A, 0x0A, 0xAD, 0xD7, 0x1D, 0xEC, 0xAE, 0x0A, 0x85, 0x0E, 0x0E, 0x1E, 0x41, 0xBD, - 0x2D, 0x52, 0xCB, 0x88, 0x92, 0x9E, 0xA1, 0x74, 0xC1, 0x85, 0x55, 0x7D, 0xEE, 0xC2, 0x0A, 0x22, - 0xF5, 0x60, 0x89, 0x9C, 0xCD, 0x26, 0x2C, 0x13, 0xDD, 0x85, 0xA5, 0x91, 0x71, 0x4C, 0x43, 0x4E, - 0x01, 0x34, 0x9A, 0x86, 0xAC, 0x1C, 0x8E, 0x91, 0x4F, 0x7A, 0xDD, 0x0C, 0xBA, 0xBD, 0xDE, 0x43, - 0xF8, 0xEF, 0xD3, 0xF4, 0x7C, 0xFF, 0x5D, 0xF4, 0x69, 0x7A, 0xDE, 0xEB, 0xA2, 0xD4, 0x66, 0x8F, - 0xC2, 0xF2, 0xEF, 0x25, 0xF9, 0xFB, 0x8E, 0xBF, 0x15, 0x43, 0xA9, 0x69, 0xA9, 0xC8, 0xC7, 0xCF, - 0x94, 0x69, 0x30, 0xA5, 0xC5, 0x87, 0x44, 0x04, 0x0D, 0x8E, 0x2C, 0xDC, 0x41, 0x54, 0x18, 0x41, - 0x93, 0xD7, 0x75, 0x2A, 0xB5, 0xDA, 0xD4, 0xEA, 0xD6, 0x01, 0xA0, 0x6D, 0x74, 0xCC, 0xFE, 0x03, - 0x44, 0xC4, 0xB5, 0xA9, 0x58, 0x03, 0x60, 0x68, 0xF6, 0xDD, 0x9E, 0xC1, 0x62, 0x2F, 0x54, 0x0B, - 0x1C, 0x7A, 0xAD, 0x92, 0x3F, 0x85, 0x60, 0x26, 0x42, 0xCD, 0xA6, 0xB4, 0x17, 0x8A, 0x51, 0x3A, - 0x8A, 0x0F, 0x82, 0x51, 0xBB, 0x1D, 0xF3, 0x07, 0x24, 0x44, 0x38, 0x8D, 0x47, 0xA9, 0xE8, 0x43, - 0x2A, 0xFA, 0x90, 0xB4, 0x51, 0x4D, 0x37, 0xD2, 0x9A, 0x6E, 0xA4, 0x7A, 0x37, 0x2A, 0x00, 0xA5, - 0x4A, 0x8C, 0x23, 0x58, 0x1C, 0xA8, 0xEA, 0x93, 0xF2, 0x20, 0x4C, 0x71, 0x1C, 0x5C, 0xA0, 0xA2, - 0x6D, 0x43, 0x9E, 0xEE, 0xE3, 0x09, 0xA5, 0x94, 0x6A, 0x75, 0x25, 0x03, 0xAF, 0x05, 0xE7, 0xD6, - 0x96, 0x72, 0x17, 0xCC, 0x4D, 0xA8, 0xE8, 0x95, 0x93, 0xB4, 0xFE, 0xE2, 0xA0, 0xD4, 0xDA, 0xCA, - 0x1A, 0x10, 0xB7, 0xDB, 0x72, 0xA9, 0xE2, 0xCB, 0x1D, 0x5B, 0xAA, 0x4E, 0x92, 0x76, 0x7B, 0xCC, - 0x17, 0x29, 0x0D, 0x90, 0x58, 0xB0, 0x02, 0x75, 0xC1, 0x1A, 0x5A, 0xBC, 0x82, 0x56, 0x14, 0xF2, - 0x44, 0x69, 0x25, 0x91, 0x77, 0x2B, 0xF7, 0x9B, 0x1A, 0x8F, 0x22, 0x3A, 0x82, 0x51, 0xFE, 0x18, - 0x57, 0xC3, 0x30, 0x52, 0x57, 0xE4, 0xB8, 0xD5, 0x8A, 0xE5, 0x8A, 0x1C, 0x9C, 0x5B, 0xED, 0x76, - 0x74, 0x88, 0x24, 0x05, 0xF4, 0x46, 0x62, 0x98, 0x48, 0x6F, 0x17, 0x45, 0x88, 0xBC, 0xC7, 0x61, - 0xAB, 0x15, 0x1A, 0x7B, 0x1C, 0x8B, 0x5E, 0x86, 0xC6, 0x5E, 0xC6, 0xA2, 0x67, 0x21, 0x60, 0x8B, - 0xEF, 0xEE, 0xA0, 0xBB, 0xF7, 0x68, 0x8B, 0xBE, 0xB9, 0x95, 0x65, 0x14, 0x8E, 0xC8, 0x0A, 0x33, - 0xB9, 0x92, 0x21, 0x04, 0xEE, 0x44, 0x6D, 0xFD, 0x34, 0x08, 0xD3, 0x7D, 0x6A, 0x20, 0x64, 0xF5, - 0x0A, 0xD7, 0xAD, 0xBC, 0x18, 0x7D, 0xB6, 0x60, 0x39, 0xE0, 0xEE, 0x4C, 0x02, 0xF9, 0x1B, 0x03, - 0xEA, 0x19, 0xC3, 0x81, 0x73, 0x85, 0x61, 0x38, 0xEC, 0x13, 0x67, 0x2C, 0x26, 0xDC, 0x96, 0x0B, - 0xB9, 0x8D, 0x4A, 0x9E, 0x37, 0x8A, 0x5B, 0xC8, 0x7D, 0xD4, 0x45, 0xC8, 0xEA, 0x76, 0xFB, 0xAD, - 0x18, 0x1C, 0xF5, 0xDC, 0x61, 0xB7, 0xDB, 0x27, 0xDF, 0x7D, 0x87, 0x7C, 0xBB, 0x83, 0xE1, 0x1E, - 0x6D, 0x2B, 0x82, 0xA1, 0xB8, 0x01, 0xB5, 0x22, 0x24, 0xB6, 0x6F, 0x02, 0x52, 0xBB, 0x1D, 0x8E, - 0x01, 0x19, 0x85, 0xFE, 0x08, 0xC4, 0x07, 0x07, 0x68, 0x17, 0xC6, 0x2B, 0x14, 0xF1, 0x71, 0x9B, - 0x29, 0x4D, 0x14, 0x71, 0x3B, 0xEA, 0x2A, 0xED, 0x95, 0x32, 0x7B, 0xC3, 0x3E, 0x9C, 0xA0, 0x59, - 0x87, 0x05, 0xF0, 0x1B, 0xCD, 0x0F, 0x26, 0xEC, 0x8E, 0x75, 0xAE, 0x70, 0x0B, 0xED, 0x72, 0x84, - 0xF0, 0xC9, 0xBC, 0xDD, 0x1E, 0x43, 0xB7, 0xBB, 0xBF, 0x85, 0x2C, 0xF7, 0x51, 0xB7, 0x15, 0x01, - 0x70, 0x3B, 0xEF, 0x74, 0x60, 0x92, 0x3B, 0xA3, 0xD0, 0xE0, 0x87, 0x64, 0x74, 0x23, 0x28, 0xB1, - 0xDD, 0xED, 0xB5, 0xA2, 0x2C, 0x59, 0xAD, 0xA8, 0x3A, 0x3A, 0x3B, 0x8A, 0x0F, 0xDC, 0xEE, 0xFE, - 0xD1, 0xBC, 0xD3, 0x19, 0xA6, 0x27, 0x1E, 0x65, 0x84, 0x61, 0x8F, 0x67, 0x90, 0x2D, 0xEE, 0x6A, - 0x15, 0x1F, 0x22, 0xCA, 0x5C, 0x8C, 0x95, 0x09, 0xEF, 0xAD, 0x56, 0x94, 0x7F, 0x10, 0x42, 0xF4, - 0x85, 0x1C, 0xAF, 0x06, 0x86, 0xF1, 0x01, 0xD3, 0x06, 0x57, 0xF1, 0xA1, 0xEB, 0xBA, 0x7D, 0xD7, - 0x75, 0xD5, 0x6C, 0x3E, 0xA9, 0x8A, 0xBC, 0x20, 0x22, 0x54, 0x04, 0x9D, 0x3E, 0x7F, 0x38, 0x3E, - 0x67, 0x44, 0xF0, 0x0F, 0x82, 0x11, 0x37, 0x03, 0xD8, 0xB2, 0xB6, 0x2C, 0xFF, 0x60, 0x02, 0x56, - 0x2B, 0xB7, 0xBB, 0xDF, 0xB2, 0x88, 0x52, 0xEB, 0x8F, 0xC5, 0x57, 0x4C, 0xBE, 0xDA, 0xAE, 0xFC, - 0x8E, 0xE8, 0x77, 0x57, 0x7E, 0x87, 0xF4, 0xBB, 0x37, 0x06, 0x60, 0x04, 0x38, 0x32, 0x09, 0x14, - 0x58, 0x89, 0x1F, 0x91, 0xF8, 0x11, 0x42, 0xBF, 0x8D, 0xFA, 0xF4, 0x81, 0x12, 0xAD, 0xD7, 0x1E, - 0xC3, 0x84, 0x50, 0x48, 0x56, 0x95, 0xDA, 0x7C, 0x3E, 0xD6, 0x09, 0xA0, 0x83, 0xE5, 0x17, 0xA7, - 0x76, 0x3E, 0xC2, 0x28, 0x81, 0x1E, 0x81, 0x19, 0x0B, 0x98, 0xF9, 0xF0, 0xC5, 0x00, 0xDC, 0xFA, - 0x9D, 0x0E, 0x61, 0xA1, 0x34, 0x08, 0x97, 0x98, 0x3A, 0x12, 0x41, 0x56, 0xCF, 0x6D, 0x25, 0xE0, - 0xE0, 0x60, 0x77, 0xB5, 0xDB, 0x6B, 0xC5, 0x70, 0x46, 0x51, 0xD0, 0xCB, 0x71, 0x84, 0x66, 0x99, - 0xDC, 0x5E, 0x48, 0xFE, 0xFA, 0xCA, 0x11, 0xAA, 0x87, 0xA4, 0xA5, 0xB8, 0x84, 0xAA, 0x9E, 0xE0, - 0x55, 0xBF, 0xCC, 0xAB, 0x86, 0xCE, 0xBA, 0x03, 0xDA, 0x59, 0xB7, 0xBB, 0xB2, 0x48, 0x77, 0x45, - 0xBF, 0x23, 0x38, 0xE3, 0x3C, 0x38, 0x93, 0x3C, 0x38, 0x2B, 0xF1, 0xE0, 0x0C, 0x08, 0x68, 0xA3, - 0x32, 0x49, 0xFA, 0x0E, 0x25, 0xC9, 0xFE, 0xFF, 0x5D, 0x24, 0xB9, 0x2B, 0x6C, 0x2D, 0xA5, 0x4B, - 0xB8, 0x99, 0xB6, 0x16, 0x96, 0x5B, 0x0B, 0xCD, 0x03, 0xB0, 0xC7, 0xE8, 0xBF, 0x2F, 0xE9, 0xCF, - 0x87, 0x22, 0x12, 0x43, 0x11, 0xC2, 0x99, 0x98, 0xDC, 0x33, 0x31, 0xB9, 0x0D, 0x74, 0x57, 0xDE, - 0x01, 0x90, 0x45, 0x04, 0xDD, 0x66, 0x23, 0xC5, 0xD8, 0x58, 0x58, 0x14, 0xA2, 0xF4, 0x24, 0x19, - 0x6B, 0x91, 0x8B, 0xA4, 0x5D, 0x47, 0x6C, 0xE3, 0xEB, 0x45, 0x14, 0xA7, 0x09, 0x75, 0x3A, 0x10, - 0xD1, 0x92, 0xE8, 0x96, 0xA7, 0x0D, 0x6F, 0xB3, 0x4C, 0x5E, 0x07, 0x9F, 0x24, 0x63, 0x2B, 0x82, - 0x91, 0x28, 0x0F, 0x03, 0x90, 0x7F, 0x64, 0xA4, 0x72, 0x42, 0x5A, 0xE7, 0xD7, 0xCF, 0xD4, 0x38, - 0x9D, 0x24, 0x62, 0x94, 0x8C, 0xCC, 0x6A, 0x2D, 0xAE, 0x56, 0x6B, 0xB1, 0xFD, 0x19, 0x3E, 0x9B, - 0xCE, 0x1F, 0xFB, 0x7E, 0x14, 0xEA, 0x87, 0x50, 0xA9, 0x88, 0x1E, 0xCF, 0x0E, 0xA1, 0x1E, 0xB1, - 0x43, 0xA8, 0xDE, 0xA3, 0x47, 0x2C, 0x0A, 0xFD, 0xEE, 0xEE, 0xAE, 0x38, 0x8D, 0xF2, 0x72, 0xE3, - 0x07, 0xC5, 0x90, 0x59, 0x3F, 0x7F, 0xA5, 0x1C, 0x1A, 0x49, 0xA3, 0x39, 0x1A, 0xC9, 0x22, 0x2A, - 0x59, 0xD9, 0x01, 0x0B, 0x1C, 0xB8, 0xBB, 0xE5, 0x17, 0x7C, 0x14, 0xC7, 0x6E, 0x23, 0x48, 0x1A, - 0x51, 0x38, 0xBF, 0x69, 0xE4, 0x2F, 0xF8, 0xA2, 0xB0, 0xC1, 0x00, 0x34, 0xDC, 0xDD, 0x86, 0x17, - 0xFA, 0x0D, 0xEF, 0x2C, 0xBA, 0xC4, 0x4D, 0x30, 0x62, 0x27, 0x5F, 0x42, 0xD9, 0x59, 0xC4, 0x38, - 0xC1, 0xF1, 0x25, 0x7E, 0x1A, 0x7B, 0x57, 0x41, 0x38, 0x7D, 0xB2, 0x3C, 0x3F, 0xC7, 0xB1, 0x3C, - 0xE7, 0x8D, 0xC2, 0xE3, 0x99, 0x17, 0x4E, 0xB5, 0x30, 0x9C, 0x6C, 0x91, 0x95, 0x76, 0xCB, 0xCC, - 0x80, 0x42, 0x7D, 0x9F, 0xC0, 0x41, 0x57, 0xD7, 0x35, 0x82, 0x2D, 0x04, 0x52, 0xAF, 0x09, 0xC5, - 0xBE, 0x49, 0xD3, 0x5F, 0x63, 0x24, 0xF7, 0x8D, 0x71, 0xF8, 0x6A, 0x02, 0xBB, 0x47, 0x21, 0x7F, - 0x12, 0xFE, 0x32, 0x4A, 0xEE, 0x42, 0xFB, 0x62, 0x25, 0x1D, 0x10, 0x6B, 0x22, 0xA3, 0x6E, 0x18, - 0xBD, 0x54, 0xB1, 0x22, 0x22, 0x2A, 0xD9, 0xE9, 0x24, 0x8A, 0x31, 0xD5, 0xC8, 0xB0, 0x8D, 0xD9, - 0x1B, 0xF6, 0xF2, 0x6B, 0x0C, 0x89, 0x44, 0x60, 0x47, 0xE1, 0x67, 0xC1, 0x7C, 0xFE, 0xC9, 0x02, - 0x87, 0xCC, 0xC6, 0x89, 0xE6, 0x2B, 0xA0, 0x95, 0x38, 0x28, 0x38, 0xBE, 0x08, 0x42, 0x6F, 0x2E, - 0x23, 0xFD, 0x24, 0x28, 0xB0, 0x49, 0x6B, 0x3C, 0xC6, 0x07, 0x99, 0x48, 0x76, 0xB4, 0x20, 0x92, - 0x23, 0x11, 0x49, 0x1E, 0x75, 0xB9, 0xE5, 0xD9, 0xA7, 0x31, 0x0E, 0x7D, 0x1C, 0x8B, 0xE4, 0x39, - 0x49, 0x22, 0xFA, 0xB2, 0x37, 0x49, 0x71, 0xFC, 0x2F, 0xA2, 0x20, 0xCC, 0xF3, 0x26, 0x22, 0xEF, - 0x6D, 0xF0, 0x6D, 0x09, 0xDA, 0xA7, 0x89, 0x51, 0x8C, 0x9F, 0xC4, 0xD1, 0x55, 0x92, 0x17, 0x3E, - 0x25, 0xE9, 0x44, 0x37, 0x65, 0x0F, 0xE7, 0x45, 0xF2, 0x92, 0x24, 0xA7, 0x33, 0x7C, 0x21, 0x00, - 0xC8, 0x80, 0xC9, 0x04, 0x0B, 0x1C, 0x1B, 0x86, 0x22, 0x64, 0x12, 0xE3, 0x0D, 0x2F, 0x61, 0x61, - 0x1E, 0x2E, 0x32, 0x81, 0xA7, 0x30, 0x82, 0xCB, 0xBA, 0x19, 0x27, 0xF4, 0x24, 0x09, 0xCF, 0x72, - 0x0A, 0x8F, 0x3E, 0x44, 0x6C, 0x17, 0xD1, 0xBE, 0x3E, 0xC6, 0x26, 0x66, 0xB9, 0x1F, 0xCC, 0xD2, - 0xC4, 0xAC, 0x11, 0x05, 0xF7, 0x6A, 0xC1, 0x38, 0xF9, 0xEA, 0xE7, 0xFD, 0xBD, 0xDA, 0xA9, 0x9A, - 0x5D, 0x6B, 0x67, 0x38, 0x00, 0x70, 0x66, 0x27, 0x38, 0x95, 0xE3, 0xA8, 0x83, 0x36, 0xE0, 0x12, - 0x6B, 0x6F, 0x2D, 0x80, 0x16, 0x4F, 0x5D, 0xFA, 0x6F, 0xE6, 0xAC, 0xCF, 0x78, 0xB0, 0xC0, 0xCD, - 0xA3, 0xD4, 0xD0, 0x60, 0xB1, 0x06, 0x33, 0xFC, 0x93, 0x85, 0xE8, 0xE3, 0xB4, 0x99, 0x17, 0xFA, - 0x73, 0xFC, 0x06, 0x27, 0xC1, 0xB7, 0x69, 0xF8, 0xEB, 0x68, 0x9E, 0x40, 0x6C, 0x13, 0x06, 0x07, - 0x19, 0xE0, 0x5E, 0xBB, 0x52, 0xA5, 0x87, 0x16, 0x5B, 0x8C, 0x71, 0xD1, 0xBC, 0x1F, 0xA3, 0x42, - 0x27, 0x15, 0xCB, 0x7E, 0x2C, 0x2C, 0xFB, 0xB1, 0xAD, 0x82, 0xD2, 0x82, 0xEB, 0xEB, 0xC0, 0x37, - 0x82, 0xBA, 0x5A, 0x71, 0xB3, 0x3A, 0x1D, 0x44, 0x96, 0x69, 0x0B, 0xAF, 0x97, 0x01, 0x0B, 0xC0, - 0x84, 0xFC, 0x9B, 0x01, 0x30, 0xFA, 0xC6, 0xCE, 0xCE, 0x37, 0x1B, 0x2C, 0x5E, 0xD6, 0x2B, 0x6F, - 0xB1, 0x08, 0xC2, 0xE9, 0xA7, 0x6F, 0x5E, 0xA2, 0x6B, 0x42, 0xAA, 0x8E, 0x47, 0x2A, 0x74, 0xAE, - 0x48, 0x5D, 0xFB, 0x5F, 0xD2, 0x50, 0xEC, 0xDF, 0x68, 0x34, 0x1A, 0x8D, 0x9D, 0xED, 0x06, 0xCD, - 0xA6, 0x19, 0x1D, 0x1C, 0xFA, 0x8D, 0xED, 0x1D, 0x9A, 0x71, 0xB0, 0x93, 0x4C, 0xE2, 0x60, 0x91, - 0x1E, 0x7E, 0x83, 0x7D, 0x6E, 0x75, 0x3A, 0xF4, 0x47, 0xA3, 0xD1, 0xE9, 0x34, 0xB6, 0xEE, 0xFE, - 0xBF, 0xAF, 0xA8, 0xF2, 0xBB, 0x19, 0x6E, 0xD0, 0x0E, 0x35, 0xC8, 0x76, 0xB9, 0x41, 0xB5, 0x87, - 0x19, 0x8E, 0xB1, 0xFD, 0x7F, 0x18, 0xB9, 0x4E, 0xA7, 0x23, 0x28, 0x95, 0xA4, 0x37, 0x73, 0x7C, - 0xC8, 0x41, 0xCE, 0xD2, 0x8B, 0x39, 0x6C, 0x9C, 0x45, 0xFE, 0x4D, 0xE3, 0x96, 0x27, 0x35, 0x1A, - 0x17, 0x5E, 0x3C, 0x0D, 0xC2, 0x61, 0xC3, 0x19, 0xC9, 0xA4, 0x85, 0xE7, 0xFB, 0x41, 0x38, 0xD5, - 0xD2, 0xCE, 0xA2, 0xD8, 0xC7, 0xB1, 0x96, 0xC4, 0xFD, 0xE5, 0x35, 0x5C, 0xC7, 0xF9, 0x01, 0x91, - 0x9A, 0x7D, 0xE3, 0x1B, 0xA2, 0xBC, 0xD6, 0x8A, 0x12, 0x36, 0xB6, 0xF1, 0x4D, 0xC7, 0x51, 0xA0, - 0x44, 0x97, 0x38, 0x3E, 0x9F, 0x47, 0x57, 0xC3, 0xC6, 0x2C, 0xF0, 0x7D, 0x1C, 0x96, 0x20, 0xD1, - 0x0B, 0x00, 0x8F, 0x2C, 0x1A, 0x0A, 0xBC, 0x85, 0x70, 0xD3, 0xD8, 0xF0, 0xCE, 0x92, 0x68, 0xBE, - 0x4C, 0x71, 0x0E, 0x31, 0x8D, 0x16, 0xC3, 0x86, 0xB3, 0xB8, 0x56, 0x91, 0x4F, 0xD3, 0xE8, 0xA2, - 0x90, 0x38, 0xC7, 0xE7, 0x69, 0x21, 0x29, 0x66, 0x1D, 0x52, 0xD2, 0x72, 0x2C, 0xD8, 0x40, 0xE7, - 0x18, 0xF8, 0x41, 0xB2, 0x98, 0x7B, 0x37, 0xC3, 0x06, 0xBF, 0x9F, 0x48, 0xF2, 0x2A, 0x9C, 0x65, - 0x05, 0xE9, 0x0F, 0x76, 0x66, 0xD8, 0xF3, 0xE9, 0x88, 0x1C, 0x50, 0xB2, 0x04, 0x3E, 0x6A, 0x92, - 0x1F, 0x4D, 0x36, 0x30, 0x07, 0x7E, 0x70, 0xD9, 0xA0, 0xA5, 0x51, 0xD3, 0xD0, 0xAF, 0xBC, 0x3F, - 0x5A, 0x3F, 0x14, 0xFC, 0x55, 0xBC, 0x9B, 0x14, 0xBA, 0x10, 0x48, 0x4D, 0x31, 0xF4, 0xA4, 0x8D, - 0xC3, 0x83, 0x1D, 0xF2, 0x2F, 0x47, 0x2F, 0xFF, 0x29, 0xE6, 0x16, 0x2B, 0x39, 0xB2, 0xF2, 0x57, - 0x22, 0x4A, 0x77, 0x89, 0xB8, 0xA0, 0x14, 0x40, 0x54, 0x12, 0x8D, 0xB4, 0x8C, 0x24, 0x9A, 0xBC, - 0xC7, 0xA9, 0x31, 0xEB, 0x3C, 0x48, 0xA9, 0x78, 0x30, 0x66, 0xC6, 0x78, 0x12, 0x85, 0x21, 0x9E, - 0xA4, 0x8F, 0xD3, 0x14, 0x5F, 0x2C, 0xD2, 0xA4, 0x81, 0x54, 0x06, 0x23, 0x45, 0x2E, 0xBC, 0xEB, - 0x37, 0x86, 0x52, 0x83, 0x0A, 0x40, 0x4F, 0xF1, 0xDC, 0xBB, 0x69, 0xA0, 0x46, 0x97, 0xF2, 0x98, - 0x2C, 0x23, 0x37, 0x39, 0xBC, 0x98, 0xD6, 0x35, 0x06, 0x62, 0x11, 0x47, 0x69, 0x34, 0x89, 0xE6, - 0x0D, 0xD4, 0xB0, 0xE6, 0xD1, 0x84, 0x6A, 0x18, 0x76, 0x9E, 0x88, 0x1A, 0xCD, 0x59, 0x9A, 0x2E, - 0x92, 0x61, 0x13, 0x34, 0x8E, 0x1A, 0xCD, 0xAB, 0x24, 0x69, 0x36, 0x86, 0xE4, 0x6F, 0x73, 0xA4, - 0x00, 0xCA, 0x09, 0x81, 0xAF, 0x1A, 0x9F, 0xE1, 0xB3, 0xB7, 0xF4, 0xDB, 0x92, 0x60, 0xDA, 0x8D, - 0xE6, 0x70, 0x67, 0xA7, 0xD9, 0x68, 0x37, 0x64, 0x13, 0xB3, 0x28, 0x49, 0xD5, 0xEF, 0x85, 0x97, - 0xCE, 0x42, 0xEF, 0x02, 0xAB, 0x69, 0x09, 0xF6, 0xE2, 0xC9, 0x0C, 0x94, 0x5B, 0xB2, 0xCF, 0x82, - 0xD0, 0x8B, 0x6F, 0xDE, 0xDD, 0x2C, 0x70, 0x03, 0x35, 0x3E, 0xF4, 0xE2, 0xD8, 0xBB, 0x39, 0xA3, - 0x6A, 0xCA, 0x87, 0x4A, 0xEF, 0x65, 0xE9, 0x28, 0x8C, 0x16, 0x98, 0x0C, 0x85, 0x71, 0x88, 0xE9, - 0x0C, 0xA8, 0x1F, 0x11, 0x3A, 0xBD, 0x70, 0x7C, 0x61, 0x5F, 0xC5, 0x41, 0x8A, 0xAD, 0x0F, 0x3F, - 0x8F, 0x3F, 0x0F, 0x3F, 0xBF, 0x76, 0xCF, 0x4E, 0x7A, 0xDD, 0x8B, 0x63, 0x56, 0x11, 0xFB, 0x36, - 0x4D, 0x71, 0x2E, 0x48, 0xE6, 0x87, 0x40, 0xAF, 0xBC, 0xB3, 0xD3, 0x78, 0x4B, 0x04, 0x7B, 0x10, - 0x06, 0x69, 0xE0, 0xCD, 0x1B, 0x82, 0x51, 0x1B, 0x64, 0x59, 0xD4, 0x4A, 0x26, 0x38, 0xF4, 0xF9, - 0x6A, 0xA9, 0xC1, 0xC8, 0xCC, 0x1D, 0xBB, 0xC0, 0x49, 0xE2, 0x4D, 0xB1, 0xDA, 0x37, 0xAA, 0x38, - 0x17, 0x3B, 0x18, 0x9C, 0x37, 0x58, 0x06, 0xF5, 0xB7, 0xD2, 0x08, 0xC2, 0x24, 0xF5, 0xC2, 0x09, - 0x8E, 0xCE, 0x1B, 0xF4, 0x68, 0x94, 0xEB, 0x78, 0x85, 0x4A, 0x5A, 0xA7, 0x0B, 0x67, 0xA9, 0x39, - 0x30, 0x50, 0xE8, 0x6B, 0xD6, 0xA0, 0xC7, 0x1C, 0x35, 0xA0, 0x94, 0xBA, 0x85, 0xAA, 0xEB, 0x3B, - 0x3C, 0x99, 0x47, 0xC9, 0xFA, 0xEE, 0x9A, 0x07, 0xCB, 0xBD, 0x78, 0x1A, 0x24, 0x93, 0x4D, 0xC6, - 0xCB, 0x63, 0x6C, 0x20, 0xA7, 0xE0, 0x46, 0x63, 0x81, 0xC9, 0x86, 0x57, 0x43, 0x8D, 0x24, 0x14, - 0x51, 0x13, 0x2F, 0x43, 0x68, 0xA6, 0xF5, 0xA1, 0x9C, 0x2D, 0x0D, 0x9A, 0x30, 0xFC, 0x10, 0xB2, - 0x1F, 0xC5, 0x06, 0x73, 0x12, 0x95, 0x67, 0x77, 0x19, 0x5B, 0xAD, 0x4D, 0x32, 0xF6, 0x65, 0x06, - 0x3F, 0x30, 0xCA, 0x98, 0xB5, 0x13, 0xA3, 0xDD, 0xAE, 0x99, 0x16, 0x94, 0xCA, 0xBD, 0x0B, 0x09, - 0x35, 0x08, 0xA7, 0x0D, 0x8B, 0x63, 0xD7, 0xF8, 0xB0, 0xD1, 0x36, 0xCC, 0xB3, 0x76, 0xE3, 0xC3, - 0x1D, 0x92, 0x63, 0x14, 0x78, 0xED, 0xC6, 0x87, 0xC0, 0xB6, 0xEB, 0x06, 0x4A, 0x79, 0xBD, 0xC2, - 0x2B, 0xC3, 0x82, 0x54, 0xD4, 0x09, 0x69, 0xE2, 0xCD, 0x72, 0x17, 0xDC, 0x8B, 0xE7, 0x5E, 0x30, - 0xC7, 0x7E, 0x23, 0x8D, 0x72, 0x68, 0x76, 0xE3, 0xF5, 0x1C, 0x7B, 0x09, 0x6E, 0xC4, 0xF8, 0x3C, - 0xC6, 0xC9, 0xAC, 0x91, 0xCE, 0x70, 0x63, 0xE1, 0x4D, 0x71, 0x35, 0x7E, 0x59, 0xED, 0xB0, 0xA9, - 0x53, 0xBD, 0x34, 0x60, 0x5C, 0xA4, 0xB6, 0x5A, 0x82, 0xBF, 0x62, 0xEC, 0xF9, 0x37, 0x6F, 0x53, - 0x2F, 0xC5, 0x0D, 0x84, 0x50, 0x2E, 0x65, 0xED, 0x4F, 0x5E, 0x3F, 0xFB, 0x98, 0x94, 0x23, 0xDD, - 0x28, 0x0E, 0x1F, 0x5D, 0x4A, 0x92, 0x69, 0x03, 0x35, 0xFE, 0xC5, 0xDB, 0x4F, 0x3E, 0xE6, 0x77, - 0x97, 0xC1, 0xF9, 0x8D, 0x55, 0x9A, 0x9D, 0x37, 0x0B, 0x3C, 0x6C, 0x7C, 0x18, 0x53, 0x74, 0x3E, - 0x84, 0x85, 0x5C, 0xA2, 0xB5, 0x0F, 0x19, 0x9D, 0xA8, 0x02, 0x5F, 0xC8, 0x26, 0xDA, 0x3C, 0xCF, - 0x26, 0x3F, 0xF5, 0x29, 0x5D, 0x1C, 0x30, 0x86, 0x34, 0xE9, 0xBB, 0x75, 0x91, 0x4C, 0xD7, 0x93, - 0x8B, 0xBD, 0xD4, 0xB1, 0xA3, 0x70, 0x1E, 0x79, 0x7E, 0xB5, 0x0C, 0xDF, 0xD9, 0x69, 0x1C, 0xD3, - 0xED, 0x07, 0x1D, 0x16, 0x29, 0x5F, 0x23, 0x7A, 0xA8, 0xD6, 0xB8, 0x0A, 0xD2, 0x59, 0x83, 0x6F, - 0xDB, 0xBF, 0xA1, 0x8F, 0x3C, 0x5F, 0xB5, 0xDE, 0xF1, 0x1A, 0x05, 0xCA, 0x4C, 0x96, 0x71, 0x12, - 0xC5, 0xF4, 0xF1, 0xC3, 0xB0, 0x91, 0xC6, 0x4B, 0xAC, 0xF7, 0x5D, 0xC4, 0xC9, 0x19, 0x36, 0xDC, - 0x7E, 0x39, 0x87, 0x85, 0x9C, 0x1D, 0x36, 0x3E, 0x7C, 0x85, 0xC3, 0x79, 0x04, 0x1B, 0xAF, 0xA2, - 0xD0, 0x9B, 0x44, 0xB0, 0xD1, 0x3C, 0x8E, 0x96, 0x71, 0x80, 0xE3, 0xC6, 0xC7, 0xF8, 0xAA, 0x09, - 0x1B, 0x17, 0x51, 0x18, 0x25, 0x0B, 0x6F, 0x52, 0xA4, 0x3B, 0xDD, 0xDB, 0x0F, 0x4B, 0x82, 0x54, - 0xD5, 0x29, 0x3F, 0xFC, 0xA6, 0x8B, 0xC9, 0xFF, 0x4B, 0x23, 0x96, 0xC7, 0x89, 0x27, 0x85, 0xFC, - 0x3E, 0xF9, 0x7F, 0x79, 0x58, 0x69, 0xE7, 0xD6, 0x16, 0x78, 0x3C, 0x99, 0xE0, 0x30, 0xAD, 0x69, - 0x2C, 0xC1, 0x73, 0x3C, 0x61, 0xEA, 0xDB, 0x87, 0xF1, 0xF4, 0xCC, 0xA3, 0x1E, 0x76, 0x1A, 0xF9, - 0x3F, 0x8E, 0xDD, 0x03, 0x1F, 0x56, 0x0B, 0x7A, 0xA0, 0x89, 0xD3, 0x9D, 0x9D, 0xC6, 0xEB, 0x18, - 0x2F, 0xBC, 0x18, 0x93, 0xD9, 0x77, 0x1E, 0xA4, 0xE4, 0x0F, 0x63, 0x02, 0xA5, 0x94, 0xAA, 0x5F, - 0xE1, 0xAB, 0xC6, 0x73, 0xFE, 0x69, 0x8B, 0x1F, 0xBA, 0xC0, 0xA6, 0xAC, 0x49, 0xF8, 0x87, 0xE5, - 0x89, 0xCA, 0xA5, 0x86, 0x3F, 0x21, 0x6A, 0x82, 0xCA, 0x3F, 0x05, 0x65, 0x29, 0x57, 0xC9, 0x51, - 0x43, 0xBA, 0x52, 0x9C, 0xE2, 0x94, 0xFB, 0x51, 0x7C, 0x72, 0xF3, 0xC2, 0xB7, 0x3E, 0x14, 0x75, - 0x3F, 0x2C, 0xA3, 0x40, 0xD4, 0x10, 0x4B, 0x02, 0xD1, 0xF2, 0x05, 0x4E, 0xF6, 0x79, 0x40, 0x57, - 0x1B, 0x1D, 0xB1, 0x97, 0x84, 0xF7, 0x3F, 0xC3, 0x67, 0xDF, 0x7A, 0xD9, 0xA0, 0x9B, 0x48, 0x32, - 0xBE, 0x8D, 0x33, 0x9C, 0xA6, 0x98, 0x28, 0x81, 0x64, 0xEF, 0x4A, 0x44, 0xED, 0x02, 0xC7, 0xD4, - 0x25, 0x5A, 0x38, 0xC1, 0x0D, 0x2B, 0x38, 0x6F, 0x78, 0x97, 0x5E, 0x30, 0xA7, 0x1B, 0x7E, 0x15, - 0x91, 0xF8, 0xC6, 0xA0, 0x1B, 0xF0, 0xF7, 0xE0, 0xF9, 0xBE, 0xB6, 0xB1, 0x85, 0x50, 0xE3, 0x43, - 0xF9, 0x64, 0xFC, 0xC3, 0xB2, 0x6E, 0x40, 0x08, 0x72, 0x95, 0x97, 0x97, 0xCA, 0x1F, 0x4F, 0x50, - 0xF6, 0xC8, 0x56, 0x41, 0x06, 0x34, 0x94, 0x7A, 0xFA, 0x29, 0x91, 0x59, 0x09, 0x37, 0xD4, 0xCA, - 0x7D, 0x5D, 0x14, 0x4A, 0x15, 0xE5, 0x4D, 0x69, 0xF0, 0x73, 0x20, 0x75, 0xCA, 0x47, 0x63, 0xE2, - 0xA5, 0x93, 0x59, 0xC3, 0xC2, 0x55, 0xCB, 0x37, 0x7D, 0xD8, 0xF9, 0xA1, 0x36, 0x24, 0x72, 0xC9, - 0x20, 0x8D, 0xC1, 0xC6, 0x32, 0x21, 0x63, 0xC2, 0x3C, 0x6B, 0x36, 0xC4, 0x01, 0x03, 0x5D, 0xDF, - 0x0B, 0x42, 0x4F, 0x1F, 0xEA, 0x8F, 0xE8, 0x81, 0x49, 0x63, 0x99, 0xE0, 0xB8, 0x11, 0x84, 0x8B, - 0x65, 0xDA, 0xE8, 0xD0, 0x95, 0x82, 0x00, 0xA6, 0xC7, 0x72, 0x71, 0x89, 0xAB, 0x42, 0x6A, 0xF2, - 0x25, 0x49, 0x47, 0x15, 0x2B, 0xC3, 0x18, 0xDF, 0x6D, 0x49, 0x29, 0x0F, 0x80, 0x2A, 0xBA, 0xD7, - 0x29, 0x6F, 0x25, 0x0E, 0x7E, 0x83, 0xBD, 0x09, 0x9D, 0xCA, 0x64, 0x81, 0x69, 0x4C, 0xE8, 0x49, - 0x5D, 0x52, 0x98, 0x5E, 0x6C, 0xF5, 0xE1, 0xEB, 0x79, 0x69, 0xE7, 0x24, 0x97, 0x02, 0xCF, 0x67, - 0x47, 0x6A, 0x2F, 0xB9, 0x6F, 0x1A, 0x4B, 0x2E, 0x5B, 0xD5, 0x0A, 0xFE, 0xCE, 0x4E, 0x43, 0x3C, - 0xBD, 0xE4, 0xCD, 0x30, 0x3F, 0x43, 0xFA, 0x62, 0xA5, 0x3D, 0x65, 0xD5, 0xB0, 0x29, 0xF4, 0xB5, - 0x88, 0xA9, 0xA2, 0x86, 0xD4, 0x70, 0x70, 0x71, 0x8E, 0x17, 0xC8, 0x5B, 0xA1, 0xF9, 0x37, 0x1A, - 0x19, 0x6C, 0xB8, 0x8E, 0xA3, 0x73, 0x4D, 0x89, 0xC0, 0x7C, 0x1F, 0x42, 0x48, 0x4C, 0x24, 0x18, - 0x59, 0x25, 0x3A, 0x38, 0xF4, 0x8B, 0xCC, 0x52, 0x50, 0xD5, 0x8E, 0xA5, 0xA2, 0x56, 0xA7, 0x67, - 0x19, 0xB4, 0x60, 0xA9, 0x92, 0x66, 0x80, 0xF9, 0x15, 0x4A, 0x67, 0x41, 0xC2, 0xF3, 0xF3, 0x73, - 0x2B, 0xF2, 0x9B, 0x6C, 0xF9, 0x0F, 0xBF, 0x71, 0xB0, 0x33, 0x4B, 0x2F, 0xE6, 0x87, 0xDF, 0xF8, - 0x7F, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0xAC, 0x7C, 0x20, 0xF1, 0xF9, 0xD7, 0x05, 0x00, - })) + gz, err := gzip.NewReader(bytes.NewBuffer(termHTMLGz)) if err != nil { return 0, err } diff --git a/pkg/dmsgpty/whitelist_test.go b/pkg/dmsgpty/whitelist_test.go new file mode 100644 index 000000000..2af18ae12 --- /dev/null +++ b/pkg/dmsgpty/whitelist_test.go @@ -0,0 +1,475 @@ +// Package dmsgpty_test provides tests for whitelist and RPC components. +package dmsgpty_test + +import ( + "bytes" + "net" + "net/rpc" + "os" + "path/filepath" + "testing" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/dmsg/pkg/dmsgpty" +) + +// --- MemoryWhitelist tests --- + +func TestMemoryWhitelist_AddGetRemoveAll(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + pk3, _ := cipher.GenerateKeyPair() + + // Initially empty. + all, err := wl.All() + require.NoError(t, err) + require.Len(t, all, 0) + + // Get on missing key returns false. + ok, err := wl.Get(pk1) + require.NoError(t, err) + require.False(t, ok) + + // Add single key. + require.NoError(t, wl.Add(pk1)) + ok, err = wl.Get(pk1) + require.NoError(t, err) + require.True(t, ok) + + // Add multiple keys at once. + require.NoError(t, wl.Add(pk2, pk3)) + all, err = wl.All() + require.NoError(t, err) + require.Len(t, all, 3) + require.True(t, all[pk1]) + require.True(t, all[pk2]) + require.True(t, all[pk3]) + + // Remove one key. + require.NoError(t, wl.Remove(pk2)) + ok, err = wl.Get(pk2) + require.NoError(t, err) + require.False(t, ok) + + all, err = wl.All() + require.NoError(t, err) + require.Len(t, all, 2) + + // Remove remaining keys. + require.NoError(t, wl.Remove(pk1, pk3)) + all, err = wl.All() + require.NoError(t, err) + require.Len(t, all, 0) +} + +func TestMemoryWhitelist_AddDuplicate(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + pk, _ := cipher.GenerateKeyPair() + + require.NoError(t, wl.Add(pk)) + require.NoError(t, wl.Add(pk)) // duplicate add should not error + + all, err := wl.All() + require.NoError(t, err) + require.Len(t, all, 1) +} + +func TestMemoryWhitelist_RemoveNonExistent(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + pk, _ := cipher.GenerateKeyPair() + + // Removing a key that was never added should not error. + require.NoError(t, wl.Remove(pk)) +} + +// --- ConfigWhitelist tests --- + +func TestConfigWhitelist_AddGetRemoveAll(t *testing.T) { + tmpDir := t.TempDir() + confPath := filepath.Join(tmpDir, "test_wl_config.json") + + wl, err := dmsgpty.NewConfigWhitelist(confPath) + require.NoError(t, err) + + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + + // Record initial count (global state may carry over from other tests). + initAll, err := wl.All() + require.NoError(t, err) + initCount := len(initAll) + + // Get on missing key. + ok, err := wl.Get(pk1) + require.NoError(t, err) + require.False(t, ok) + + // Add key and verify. + require.NoError(t, wl.Add(pk1)) + ok, err = wl.Get(pk1) + require.NoError(t, err) + require.True(t, ok) + + // Add second key. + require.NoError(t, wl.Add(pk2)) + all, err := wl.All() + require.NoError(t, err) + require.Len(t, all, initCount+2) + + // Remove first key. + require.NoError(t, wl.Remove(pk1)) + ok, err = wl.Get(pk1) + require.NoError(t, err) + require.False(t, ok) + + all, err = wl.All() + require.NoError(t, err) + require.Len(t, all, initCount+1) + require.True(t, all[pk2]) +} + +func TestConfigWhitelist_Persistence(t *testing.T) { + tmpDir := t.TempDir() + confPath := filepath.Join(tmpDir, "persist_config.json") + + pk1, _ := cipher.GenerateKeyPair() + + // Create whitelist and add a key. + wl1, err := dmsgpty.NewConfigWhitelist(confPath) + require.NoError(t, err) + require.NoError(t, wl1.Add(pk1)) + + // Create a new whitelist instance pointing to the same file. + wl2, err := dmsgpty.NewConfigWhitelist(confPath) + require.NoError(t, err) + + ok, err := wl2.Get(pk1) + require.NoError(t, err) + require.True(t, ok, "key should persist across whitelist instances") +} + +func TestConfigWhitelist_AddDuplicate(t *testing.T) { + tmpDir := t.TempDir() + confPath := filepath.Join(tmpDir, "dup_config.json") + + wl, err := dmsgpty.NewConfigWhitelist(confPath) + require.NoError(t, err) + + pk, _ := cipher.GenerateKeyPair() + require.NoError(t, wl.Add(pk)) + + // Adding the same key again should return an error about duplicate. + err = wl.Add(pk) + require.Error(t, err) + assert.Contains(t, err.Error(), "Already exists") +} + +func TestConfigWhitelist_FileCreatedIfMissing(t *testing.T) { + tmpDir := t.TempDir() + confPath := filepath.Join(tmpDir, "subdir", "auto_config.json") + + wl, err := dmsgpty.NewConfigWhitelist(confPath) + require.NoError(t, err) + + // The file should be created after first operation. + _, err = wl.All() + require.NoError(t, err) + + _, err = os.Stat(confPath) + require.NoError(t, err, "config file should exist after first operation") +} + +// --- WhitelistGateway RPC method tests --- + +func TestWhitelistGateway_Whitelist(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + gw := dmsgpty.NewWhitelistGateway(wl) + + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + require.NoError(t, wl.Add(pk1, pk2)) + + var out []cipher.PubKey + err := gw.Whitelist(nil, &out) + require.NoError(t, err) + require.Len(t, out, 2) + + // Verify both keys are present. + found := make(map[cipher.PubKey]bool) + for _, pk := range out { + found[pk] = true + } + require.True(t, found[pk1]) + require.True(t, found[pk2]) +} + +func TestWhitelistGateway_WhitelistAdd(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + gw := dmsgpty.NewWhitelistGateway(wl) + + pk, _ := cipher.GenerateKeyPair() + pks := []cipher.PubKey{pk} + + var empty struct{} + err := gw.WhitelistAdd(&pks, &empty) + require.NoError(t, err) + + ok, err := wl.Get(pk) + require.NoError(t, err) + require.True(t, ok) +} + +func TestWhitelistGateway_WhitelistRemove(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + gw := dmsgpty.NewWhitelistGateway(wl) + + pk, _ := cipher.GenerateKeyPair() + require.NoError(t, wl.Add(pk)) + + pks := []cipher.PubKey{pk} + var empty struct{} + err := gw.WhitelistRemove(&pks, &empty) + require.NoError(t, err) + + ok, err := wl.Get(pk) + require.NoError(t, err) + require.False(t, ok) +} + +func TestWhitelistGateway_EmptyWhitelist(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + gw := dmsgpty.NewWhitelistGateway(wl) + + var out []cipher.PubKey + err := gw.Whitelist(nil, &out) + require.NoError(t, err) + require.Len(t, out, 0) +} + +// --- WhitelistClient + WhitelistGateway integration over net.Pipe --- + +func TestWhitelistClientGateway_Integration(t *testing.T) { + wl := dmsgpty.NewMemoryWhitelist() + gw := dmsgpty.NewWhitelistGateway(wl) + + connServer, connClient := net.Pipe() + + // Server side: read the request, write response, then serve RPC. + serverReady := make(chan error, 1) + go func() { + defer connServer.Close() //nolint:errcheck,gosec + + // Read the length-prefixed URI request. + prefix := make([]byte, 1) + if _, err := connServer.Read(prefix); err != nil { + serverReady <- err + return + } + uri := make([]byte, prefix[0]) + if _, err := connServer.Read(uri); err != nil { + serverReady <- err + return + } + + // Write accept response (0 byte). + if _, err := connServer.Write([]byte{0}); err != nil { + serverReady <- err + return + } + serverReady <- nil + + // Serve RPC on the connection. + rpcServer := rpc.NewServer() + if err := rpcServer.RegisterName("whitelist", gw); err != nil { + return + } + rpcServer.ServeConn(connServer) + }() + + // Client side. + wlClient, err := dmsgpty.NewWhitelistClient(connClient) + require.NoError(t, err) + require.NoError(t, <-serverReady) + + // View empty whitelist. + pks, err := wlClient.ViewWhitelist() + require.NoError(t, err) + require.Len(t, pks, 0) + + // Add keys. + pk1, _ := cipher.GenerateKeyPair() + pk2, _ := cipher.GenerateKeyPair() + require.NoError(t, wlClient.WhitelistAdd(pk1, pk2)) + + pks, err = wlClient.ViewWhitelist() + require.NoError(t, err) + require.Len(t, pks, 2) + + // Remove one key. + require.NoError(t, wlClient.WhitelistRemove(pk1)) + + pks, err = wlClient.ViewWhitelist() + require.NoError(t, err) + require.Len(t, pks, 1) + + require.NoError(t, connClient.Close()) +} + +// --- RPC util round-trip tests --- +// writeRequest/readRequest and writeResponse/readResponse are unexported, +// so we test them indirectly through the WhitelistClient handshake protocol. + +func TestRPCUtil_RequestResponseRoundTrip(t *testing.T) { + // Test the request/response protocol by simulating what NewWhitelistClient does. + connA, connB := net.Pipe() + + done := make(chan error, 1) + go func() { + defer connA.Close() //nolint:errcheck,gosec + + // Read length-prefixed request. + prefix := make([]byte, 1) + if _, err := connA.Read(prefix); err != nil { + done <- err + return + } + uri := make([]byte, prefix[0]) + if _, err := connA.Read(uri); err != nil { + done <- err + return + } + + // Verify the URI matches expected. + assert.Equal(t, "dmsgpty/whitelist", string(uri)) + + // Write accept (0). + _, err := connA.Write([]byte{0}) + done <- err + }() + + // Client side sends the request and reads the response. + // Write length prefix + URI (same as writeRequest). + uriStr := "dmsgpty/whitelist" + buf := make([]byte, 0, 1+len(uriStr)) + buf = append(buf, byte(len(uriStr))) //nolint:gosec + buf = append(buf, []byte(uriStr)...) + _, err := connB.Write(buf) + require.NoError(t, err) + + // Read response (same as readResponse). + resp := make([]byte, 1) + _, err = connB.Read(resp) + require.NoError(t, err) + require.Equal(t, byte(0), resp[0], "response should be accept (0)") + + require.NoError(t, <-done) + require.NoError(t, connB.Close()) +} + +func TestRPCUtil_RejectResponse(t *testing.T) { + // Test that a rejection byte (non-zero) is correctly detected. + connA, connB := net.Pipe() + + go func() { + defer connA.Close() //nolint:errcheck,gosec + // Read and discard the request. + prefix := make([]byte, 1) + connA.Read(prefix) //nolint:errcheck,gosec + uri := make([]byte, prefix[0]) + connA.Read(uri) //nolint:errcheck,gosec + + // Write reject (1). + connA.Write([]byte{1}) //nolint:errcheck,gosec + }() + + // NewWhitelistClient should fail when server rejects. + _, err := dmsgpty.NewWhitelistClient(connB) + require.Error(t, err) + assert.Contains(t, err.Error(), "rejected") + + require.NoError(t, connB.Close()) +} + +// --- Config tests --- + +func TestDefaultConfig(t *testing.T) { + c := dmsgpty.DefaultConfig() + require.NotEmpty(t, c.DmsgDisc) + require.NotZero(t, c.DmsgSessions) + require.Equal(t, uint16(22), c.DmsgPort) + require.NotEmpty(t, c.CLINet) + require.NotEmpty(t, c.CLIAddr) +} + +func TestWriteConfig(t *testing.T) { + tmpDir := t.TempDir() + confPath := filepath.Join(tmpDir, "write_test_config.json") + + c := dmsgpty.DefaultConfig() + c.PK = "testpk" + c.SK = "testsk" + + err := dmsgpty.WriteConfig(c, confPath) + require.NoError(t, err) + + // Verify file was written. + data, err := os.ReadFile(confPath) //nolint:gosec + require.NoError(t, err) + require.Contains(t, string(data), "testpk") + require.Contains(t, string(data), "testsk") +} + +func TestParseWindowsEnv_NonWindows(t *testing.T) { + // On non-Windows, ParseWindowsEnv should return the input unchanged. + input := "%HOMEDRIVE%%HOMEPATH%\\dmsgpty.sock" + result := dmsgpty.ParseWindowsEnv(input) + require.NotEmpty(t, result) +} + +// --- Additional edge case: large write/read round-trip --- + +func TestRPCUtil_LargeURI(t *testing.T) { + // Test with a URI close to the 255-byte limit. + connA, connB := net.Pipe() + + // Create a URI of exactly 255 bytes. + largeURI := bytes.Repeat([]byte("a"), 255) + + done := make(chan error, 1) + go func() { + defer connA.Close() //nolint:errcheck,gosec + prefix := make([]byte, 1) + if _, err := connA.Read(prefix); err != nil { + done <- err + return + } + uri := make([]byte, prefix[0]) + if _, err := connA.Read(uri); err != nil { + done <- err + return + } + assert.Equal(t, string(largeURI), string(uri)) + _, err := connA.Write([]byte{0}) + done <- err + }() + + // Write: length prefix (255) + URI. + buf := make([]byte, 0, 256) + buf = append(buf, byte(255)) + buf = append(buf, largeURI...) + _, err := connB.Write(buf) + require.NoError(t, err) + + resp := make([]byte, 1) + _, err = connB.Read(resp) + require.NoError(t, err) + require.Equal(t, byte(0), resp[0]) + + require.NoError(t, <-done) + require.NoError(t, connB.Close()) +} diff --git a/internal/dmsg-server/api/api.go b/pkg/dmsgserver/api.go similarity index 85% rename from internal/dmsg-server/api/api.go rename to pkg/dmsgserver/api.go index 4249e497e..536ffc684 100644 --- a/internal/dmsg-server/api/api.go +++ b/pkg/dmsgserver/api.go @@ -1,5 +1,5 @@ -// Package api internal/dmsg-server/api/api.go -package api +// Package dmsgserver pkg/dmsgserver/api.go +package dmsgserver import ( "context" @@ -19,13 +19,13 @@ import ( "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil" "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" - "github.com/skycoin/dmsg/internal/servermetrics" dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsg/metrics" ) -// API main object of the server -type API struct { - metrics servermetrics.Metrics +// ServerAPI main object of the server +type ServerAPI struct { + metrics metrics.Metrics startedAt time.Time dmsgServer *dmsg.Server sMu sync.Mutex @@ -36,9 +36,9 @@ type API struct { router *chi.Mux } -// New returns a new API object, which can be started as a server -func New(r *chi.Mux, log *logging.Logger, m servermetrics.Metrics) *API { - api := &API{ +// NewServerAPI returns a new ServerAPI object, which can be started as a server +func NewServerAPI(r *chi.Mux, log *logging.Logger, m metrics.Metrics) *ServerAPI { + api := &ServerAPI{ metrics: m, startedAt: time.Now(), minuteDecValues: make(map[*dmsg.SessionCommon]uint64), @@ -53,7 +53,7 @@ func New(r *chi.Mux, log *logging.Logger, m servermetrics.Metrics) *API { } // RunBackgroundTasks is function which runs periodic tasks of dmsg-server. -func (a *API) RunBackgroundTasks(ctx context.Context) { +func (a *ServerAPI) RunBackgroundTasks(ctx context.Context) { ticker := time.NewTicker(time.Second * 10) //tickerEverySecond := time.NewTicker(time.Second * 1) tickerEveryMinute := time.NewTicker(time.Second * 60) @@ -75,13 +75,15 @@ func (a *API) RunBackgroundTasks(ctx context.Context) { } } -// SetDmsgServer saves srv in the API -func (a *API) SetDmsgServer(srv *dmsg.Server) { +// SetDmsgServer saves srv in the ServerAPI +func (a *ServerAPI) SetDmsgServer(srv *dmsg.Server) { + a.sMu.Lock() a.dmsgServer = srv + a.sMu.Unlock() } // ListenAndServe runs dmsg Serve function alongside health endpoint -func (a *API) ListenAndServe(lAddr, pAddr, httpAddr string) error { +func (a *ServerAPI) ListenAndServe(lAddr, pAddr, httpAddr string) error { errCh := make(chan error, 2) dmsgLn, err := net.Listen("tcp", lAddr) @@ -115,12 +117,12 @@ func (a *API) ListenAndServe(lAddr, pAddr, httpAddr string) error { } // Close closes connection to both http server and dmsg server -func (a *API) Close() error { +func (a *ServerAPI) Close() error { return a.dmsgServer.Close() } // Health serves health page -func (a *API) health(w http.ResponseWriter, r *http.Request) { +func (a *ServerAPI) health(w http.ResponseWriter, r *http.Request) { info := buildinfo.Get() a.writeJSON(w, r, http.StatusOK, httputil.HealthCheckResponse{ BuildInfo: info, @@ -129,7 +131,7 @@ func (a *API) health(w http.ResponseWriter, r *http.Request) { } // writeJSON writes a json object on a http.ResponseWriter with the given code. -func (a *API) writeJSON(w http.ResponseWriter, r *http.Request, code int, object interface{}) { +func (a *ServerAPI) writeJSON(w http.ResponseWriter, r *http.Request, code int, object interface{}) { jsonObject, err := json.Marshal(object) if err != nil { a.log(r).Warnf("Failed to encode json response: %s", err) @@ -144,19 +146,19 @@ func (a *API) writeJSON(w http.ResponseWriter, r *http.Request, code int, object } } -func (a *API) log(r *http.Request) logrus.FieldLogger { +func (a *ServerAPI) log(r *http.Request) logrus.FieldLogger { return httputil.GetLogger(r) } // UpdateInternalState is background function which updates numbers of clients. -func (a *API) updateInternalState() { +func (a *ServerAPI) updateInternalState() { if a.dmsgServer != nil { a.metrics.SetClientsCount(int64(len(a.dmsgServer.GetSessions()))) } } // UpdateAverageNumberOfPacketsPerMinute is function which needs to called every minute. -func (a *API) updateAverageNumberOfPacketsPerMinute() { +func (a *ServerAPI) updateAverageNumberOfPacketsPerMinute() { if a.dmsgServer != nil { a.sMu.Lock() defer a.sMu.Unlock() @@ -176,7 +178,7 @@ func (a *API) updateAverageNumberOfPacketsPerMinute() { // TODO (darkrengarius): reimplement efficiently /*// UpdateAverageNumberOfPacketsPerSecond is function which needs to called every second. -func (a *API) updateAverageNumberOfPacketsPerSecond() { +func (a *ServerAPI) updateAverageNumberOfPacketsPerSecond() { if a.dmsgServer != nil { newDecValues, newEncValues, average := calculateThroughput( a.dmsgServer.GetSessions(), diff --git a/pkg/dmsgserver/api_test.go b/pkg/dmsgserver/api_test.go new file mode 100644 index 000000000..ccfbc76b6 --- /dev/null +++ b/pkg/dmsgserver/api_test.go @@ -0,0 +1,46 @@ +package dmsgserver_test + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-chi/chi/v5" + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + dmsg "github.com/skycoin/dmsg/pkg/dmsg" + "github.com/skycoin/dmsg/pkg/dmsg/metrics" + "github.com/skycoin/dmsg/pkg/dmsgserver" +) + +func TestNew_HealthEndpoint(t *testing.T) { + r := chi.NewRouter() + log := logging.MustGetLogger("test") + m := metrics.NewEmpty() + + a := dmsgserver.NewServerAPI(r, log, m) + require.NotNil(t, a) + + req := httptest.NewRequest(http.MethodGet, "/health", nil) + rec := httptest.NewRecorder() + r.ServeHTTP(rec, req) + + assert.Equal(t, http.StatusOK, rec.Code) + assert.Equal(t, "application/json", rec.Header().Get("Content-Type")) +} + +func TestSetDmsgServer(t *testing.T) { + r := chi.NewRouter() + log := logging.MustGetLogger("test") + m := metrics.NewEmpty() + + a := dmsgserver.NewServerAPI(r, log, m) + require.NotNil(t, a) + + // SetDmsgServer should not panic with a nil server + assert.NotPanics(t, func() { + a.SetDmsgServer((*dmsg.Server)(nil)) + }) +} diff --git a/pkg/dmsgserver/config_test.go b/pkg/dmsgserver/config_test.go new file mode 100644 index 000000000..17ca4c751 --- /dev/null +++ b/pkg/dmsgserver/config_test.go @@ -0,0 +1,61 @@ +package dmsgserver_test + +import ( + "encoding/json" + "os" + "path/filepath" + "testing" + + "github.com/skycoin/skycoin/src/util/logging" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/dmsg/pkg/dmsgserver" +) + +func TestGenerateDefaultConfig(t *testing.T) { + var c dmsgserver.Config + dmsgserver.GenerateDefaultConfig(&c) + + assert.Equal(t, dmsgserver.DefaultConfigPath, c.Path) + assert.False(t, c.PubKey.Null(), "PubKey should be populated") + assert.False(t, c.SecKey.Null(), "SecKey should be populated") + assert.NotEmpty(t, c.Discovery, "Discovery URL should be set") + assert.Equal(t, "127.0.0.1:8081", c.PublicAddress) + assert.Equal(t, ":8081", c.LocalAddress) + assert.Equal(t, ":8082", c.HTTPAddress) + assert.Equal(t, "info", c.LogLevel) + assert.Equal(t, 2048, c.MaxSessions) +} + +func TestConfigFlush(t *testing.T) { + var c dmsgserver.Config + dmsgserver.GenerateDefaultConfig(&c) + + tmpDir := t.TempDir() + c.Path = filepath.Join(tmpDir, "test_config.json") + + log := logging.MustGetLogger("test") + err := c.Flush(log) + require.NoError(t, err) + + data, err := os.ReadFile(c.Path) + require.NoError(t, err) + + var loaded dmsgserver.Config + err = json.Unmarshal(data, &loaded) + require.NoError(t, err) + + assert.Equal(t, c.PubKey, loaded.PubKey) + assert.Equal(t, c.SecKey, loaded.SecKey) + assert.Equal(t, c.Discovery, loaded.Discovery) + assert.Equal(t, c.PublicAddress, loaded.PublicAddress) + assert.Equal(t, c.LocalAddress, loaded.LocalAddress) + assert.Equal(t, c.HTTPAddress, loaded.HTTPAddress) + assert.Equal(t, c.LogLevel, loaded.LogLevel) + assert.Equal(t, c.MaxSessions, loaded.MaxSessions) +} + +func TestDefaultConfigPath(t *testing.T) { + assert.Equal(t, "config.json", dmsgserver.DefaultConfigPath) +} diff --git a/pkg/dmsgtest/env.go b/pkg/dmsgtest/env.go index 5f4cf2343..291eb630a 100644 --- a/pkg/dmsgtest/env.go +++ b/pkg/dmsgtest/env.go @@ -147,7 +147,7 @@ func (env *Env) newClientWithKeys(ctx context.Context, pk cipher.PubKey, sk ciph env.c[pk] = c env.cWg.Add(1) - go func() { + go func() { //nolint:gosec c.Serve(context.Background()) env.mx.Lock() delete(env.c, pk) diff --git a/pkg/ioutil/close.go b/pkg/ioutil/close.go new file mode 100644 index 000000000..e20bfdb9c --- /dev/null +++ b/pkg/ioutil/close.go @@ -0,0 +1,18 @@ +// Package ioutil pkg/ioutil/close.go +package ioutil + +import ( + "io" + + "github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging" +) + +// CloseQuietly closes c, logging any error at debug level. +// Use this for deferred Close() calls where the error is not actionable. +func CloseQuietly(c io.Closer, log *logging.Logger) { + if err := c.Close(); err != nil { + if log != nil { + log.WithError(err).Debug("Close error") + } + } +} diff --git a/vendor/github.com/VictoriaMetrics/metrics/histogram.go b/vendor/github.com/VictoriaMetrics/metrics/histogram.go index f2257bc0f..8a5ee9e13 100644 --- a/vendor/github.com/VictoriaMetrics/metrics/histogram.go +++ b/vendor/github.com/VictoriaMetrics/metrics/histogram.go @@ -266,5 +266,13 @@ func (h *Histogram) getSum() float64 { } func (h *Histogram) metricType() string { - return "histogram" + // The Prometheus data model requires histogram metrics to expose "le" labels. + // Some collectors, such as the OpenTelemetry (OTEL) Collector, strictly enforce + // this data model and apply transformations based on the metric type. + // + // Because Prometheus metric types are strongly typed and we don't have control over it, + // introducing a custom "vm_histogram" type is not possible. + // + // So it's better to use untyped metric type. + return "untyped" } diff --git a/vendor/github.com/VictoriaMetrics/metrics/metrics.go b/vendor/github.com/VictoriaMetrics/metrics/metrics.go index fc121f81b..0525ddcfe 100644 --- a/vendor/github.com/VictoriaMetrics/metrics/metrics.go +++ b/vendor/github.com/VictoriaMetrics/metrics/metrics.go @@ -13,6 +13,7 @@ package metrics import ( + "bytes" "fmt" "io" "sort" @@ -42,6 +43,11 @@ func init() { var ( registeredSets = make(map[*Set]struct{}) registeredSetsLock sync.Mutex + bufPool = sync.Pool{ + New: func() any { + return bytes.NewBuffer(make([]byte, 0, 64*1024)) + }, + } ) // RegisterSet registers the given set s for metrics export via global WritePrometheus() call. @@ -248,6 +254,23 @@ func WriteProcessMetrics(w io.Writer) { writePushMetrics(w) } +// WriteGoMetrics writes Go runtime metrics to w. +// This includes runtime/metrics such as memory stats, GC stats, goroutine counts, etc. +func WriteGoMetrics(w io.Writer) { + writeGoMetrics(w) +} + +// WriteProcMetrics writes OS-level process metrics to w by reading +// the /proc filesystem (CPU, memory, file descriptors, PSI, etc.). +func WriteProcMetrics(w io.Writer) { + writeProcessMetrics(w) +} + +// WritePushMetrics writes push-mode related metrics to w. +func WritePushMetrics(w io.Writer) { + writePushMetrics(w) +} + // WriteFDMetrics writes `process_max_fds` and `process_open_fds` metrics to w. func WriteFDMetrics(w io.Writer) { writeFDMetrics(w) diff --git a/vendor/github.com/VictoriaMetrics/metrics/set.go b/vendor/github.com/VictoriaMetrics/metrics/set.go index b8b81b92c..b75d208d5 100644 --- a/vendor/github.com/VictoriaMetrics/metrics/set.go +++ b/vendor/github.com/VictoriaMetrics/metrics/set.go @@ -35,7 +35,10 @@ func NewSet() *Set { // WritePrometheus writes all the metrics from s to w in Prometheus format. func (s *Set) WritePrometheus(w io.Writer) { // Collect all the metrics in in-memory buffer in order to prevent from long locking due to slow w. - var bb bytes.Buffer + bb := bufPool.Get().(*bytes.Buffer) + bb.Reset() + defer bufPool.Put(bb) + lessFunc := func(i, j int) bool { // the sorting must be stable. // see edge cases why we can't simply do `s.a[i].name < s.a[j].name` here: @@ -77,7 +80,7 @@ func (s *Set) WritePrometheus(w io.Writer) { if !isMetadataEnabled() { // Call marshalTo without the global lock, since certain metric types such as Gauge // can call a callback, which, in turn, can try calling s.mu.Lock again. - nm.metric.marshalTo(nm.name, &bb) + nm.metric.marshalTo(nm.name, bb) continue } @@ -93,7 +96,7 @@ func (s *Set) WritePrometheus(w io.Writer) { if metricFamily != prevMetricFamily { // write metadata only once per metric family metricType := nm.metric.metricType() - writeMetadata(&bb, metricFamily, metricType) + writeMetadata(bb, metricFamily, metricType) prevMetricFamily = metricFamily } bb.Write(metricsWithMetadataBuf.Bytes()) diff --git a/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes.go b/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes.go index 1daa27904..d539b3b2f 100644 --- a/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes.go +++ b/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes.go @@ -12,6 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !tinygo + +// Bytes provides optimized memory allocation using runtime.mallocgc. +// This implementation is excluded from TinyGo builds (including WASM environments) +// because TinyGo doesn't support the same unsafe operations and runtime symbols +// as standard Go. For TinyGo compatibility, use the implementation in bytes_tinygo.go. + package dirtmake import ( diff --git a/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes_tinygo.go b/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes_tinygo.go new file mode 100644 index 000000000..3d90240c7 --- /dev/null +++ b/vendor/github.com/bytedance/gopkg/lang/dirtmake/bytes_tinygo.go @@ -0,0 +1,24 @@ +// Copyright 2024 ByteDance Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build tinygo + +package dirtmake + +// Bytes allocates a byte slice for TinyGo environment. +// Uses make() to avoid go:linkname with runtime.mallocgc, which causes +// "undefined symbol: runtime.mallocgc" errors in TinyGo. +func Bytes(len, cap int) (b []byte) { + return make([]byte, len, cap) +} diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go index ee39b408e..d3906bfbd 100644 --- a/vendor/github.com/fatih/color/color.go +++ b/vendor/github.com/fatih/color/color.go @@ -19,15 +19,15 @@ var ( // set (regardless of its value). This is a global option and affects all // colors. For more control over each color block use the methods // DisableColor() individually. - NoColor = noColorIsSet() || os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd())) + NoColor = noColorIsSet() || os.Getenv("TERM") == "dumb" || !stdoutIsTerminal() // Output defines the standard output of the print functions. By default, - // os.Stdout is used. - Output = colorable.NewColorableStdout() + // stdOut() is used. + Output = stdOut() - // Error defines a color supporting writer for os.Stderr. - Error = colorable.NewColorableStderr() + // Error defines the standard error of the print functions. By default, + // stdErr() is used. + Error = stdErr() // colorsCache is used to reduce the count of created Color objects and // allows to reuse already created objects with required Attribute. @@ -40,6 +40,33 @@ func noColorIsSet() bool { return os.Getenv("NO_COLOR") != "" } +// stdoutIsTerminal returns true if os.Stdout is a terminal. +// Returns false if os.Stdout is nil (e.g., when running as a Windows service). +func stdoutIsTerminal() bool { + if os.Stdout == nil { + return false + } + return isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) +} + +// stdOut returns a writer for color output. +// Returns io.Discard if os.Stdout is nil (e.g., when running as a Windows service). +func stdOut() io.Writer { + if os.Stdout == nil { + return io.Discard + } + return colorable.NewColorableStdout() +} + +// stdErr returns a writer for color error output. +// Returns io.Discard if os.Stderr is nil (e.g., when running as a Windows service). +func stdErr() io.Writer { + if os.Stderr == nil { + return io.Discard + } + return colorable.NewColorableStderr() +} + // Color defines a custom color object which is defined by SGR parameters. type Color struct { params []Attribute @@ -220,26 +247,30 @@ func (c *Color) unset() { // a low-level function, and users should use the higher-level functions, such // as color.Fprint, color.Print, etc. func (c *Color) SetWriter(w io.Writer) *Color { + _, _ = c.setWriter(w) + return c +} + +func (c *Color) setWriter(w io.Writer) (int, error) { if c.isNoColorSet() { - return c + return 0, nil } - fmt.Fprint(w, c.format()) - return c + return fmt.Fprint(w, c.format()) } // UnsetWriter resets all escape attributes and clears the output with the give // io.Writer. Usually should be called after SetWriter(). func (c *Color) UnsetWriter(w io.Writer) { - if c.isNoColorSet() { - return - } + _, _ = c.unsetWriter(w) +} - if NoColor { - return +func (c *Color) unsetWriter(w io.Writer) (int, error) { + if c.isNoColorSet() { + return 0, nil } - fmt.Fprintf(w, "%s[%dm", escape, Reset) + return fmt.Fprintf(w, "%s[%dm", escape, Reset) } // Add is used to chain SGR parameters. Use as many as parameters to combine @@ -255,10 +286,20 @@ func (c *Color) Add(value ...Attribute) *Color { // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.SetWriter(w) - defer c.UnsetWriter(w) + n, err = c.setWriter(w) + if err != nil { + return n, err + } + + nn, err := fmt.Fprint(w, a...) + n += nn + if err != nil { + return + } - return fmt.Fprint(w, a...) + nn, err = c.unsetWriter(w) + n += nn + return n, err } // Print formats using the default formats for its operands and writes to @@ -278,10 +319,20 @@ func (c *Color) Print(a ...interface{}) (n int, err error) { // On Windows, users should wrap w with colorable.NewColorable() if w is of // type *os.File. func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.SetWriter(w) - defer c.UnsetWriter(w) + n, err = c.setWriter(w) + if err != nil { + return n, err + } + + nn, err := fmt.Fprintf(w, format, a...) + n += nn + if err != nil { + return + } - return fmt.Fprintf(w, format, a...) + nn, err = c.unsetWriter(w) + n += nn + return n, err } // Printf formats according to a format specifier and writes to standard output. @@ -475,27 +526,24 @@ func (c *Color) Equals(c2 *Color) bool { if c == nil || c2 == nil { return false } + if len(c.params) != len(c2.params) { return false } + counts := make(map[Attribute]int, len(c.params)) for _, attr := range c.params { - if !c2.attrExists(attr) { - return false - } + counts[attr]++ } - return true -} - -func (c *Color) attrExists(a Attribute) bool { - for _, attr := range c.params { - if attr == a { - return true + for _, attr := range c2.params { + if counts[attr] == 0 { + return false } + counts[attr]-- } - return false + return true } func boolPtr(v bool) *bool { diff --git a/vendor/github.com/fatih/color/color_windows.go b/vendor/github.com/fatih/color/color_windows.go index be01c558e..97e5a765a 100644 --- a/vendor/github.com/fatih/color/color_windows.go +++ b/vendor/github.com/fatih/color/color_windows.go @@ -9,6 +9,9 @@ import ( func init() { // Opt-in for ansi color support for current process. // https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences + if os.Stdout == nil { + return + } var outMode uint32 out := windows.Handle(os.Stdout.Fd()) if err := windows.GetConsoleMode(out, &outMode); err != nil { diff --git a/vendor/github.com/goccy/go-json/internal/encoder/code.go b/vendor/github.com/goccy/go-json/internal/encoder/code.go index 5b08faefc..fec45a4b8 100644 --- a/vendor/github.com/goccy/go-json/internal/encoder/code.go +++ b/vendor/github.com/goccy/go-json/internal/encoder/code.go @@ -518,6 +518,7 @@ func (c *StructCode) ToAnonymousOpcode(ctx *compileContext) Opcodes { prevField = firstField codes = codes.Add(fieldCodes...) } + ctx.structTypeToCodes[uintptr(unsafe.Pointer(c.typ))] = codes return codes } diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go deleted file mode 100644 index 0c321c410..000000000 --- a/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58_old.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2011 ThePiachu. All rights reserved. -// Copyright 2019 gz-c, Skycoin developers. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package base58 - -import ( - "errors" - "fmt" - "math/big" -) - -// alphabet used by Bitcoins -var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" - -var ( - // errInvalidBase58Char Invalid base58 character - errInvalidBase58Char = errors.New("Invalid base58 character") - // errInvalidBase58String Invalid base58 string - errInvalidBase58String = errors.New("Invalid base58 string") - // errInvalidBase58Length Invalid base58 length - errInvalidBase58Length = errors.New("base58 invalid length") -) - -// oldBase58 type to hold the oldBase58 string -type oldBase58 string - -// reverse alphabet used for quckly converting base58 strings into numbers -var revalp = map[string]int{ - "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, - "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, - "M": 20, "N": 21, "P": 22, "Q": 23, "R": 24, "S": 25, "T": 26, "U": 27, "V": 28, "W": 29, - "X": 30, "Y": 31, "Z": 32, "a": 33, "b": 34, "c": 35, "d": 36, "e": 37, "f": 38, "g": 39, - "h": 40, "i": 41, "j": 42, "k": 43, "m": 44, "n": 45, "o": 46, "p": 47, "q": 48, "r": 49, - "s": 50, "t": 51, "u": 52, "v": 53, "w": 54, "x": 55, "y": 56, "z": 57, -} - -// oldHex2Big converts hex to big -func oldHex2Big(b []byte) *big.Int { - answer := big.NewInt(0) - - for i := 0; i < len(b); i++ { - answer.Lsh(answer, 8) - answer.Add(answer, big.NewInt(int64(b[i]))) - } - - return answer -} - -// ToBig convert base58 to big.Int -func (b oldBase58) ToBig() (*big.Int, error) { - answer := new(big.Int) - for i := 0; i < len(b); i++ { - answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 - c, ok := revalp[string(b[i:i+1])] - if !ok { - return nil, errInvalidBase58Char - } - answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter - } - return answer, nil -} - -// ToInt converts base58 to int -func (b oldBase58) ToInt() (int, error) { - answer := 0 - for i := 0; i < len(b); i++ { - answer *= 58 //multiply current value by 58 - c, ok := revalp[string(b[i:i+1])] - if !ok { - return 0, errInvalidBase58Char - } - answer += c //add value of the current letter - } - return answer, nil -} - -// ToHex converts base58 to hex bytes -func (b oldBase58) ToHex() ([]byte, error) { - value, err := b.ToBig() //convert to big.Int - if err != nil { - return nil, err - } - oneCount := 0 - bs := string(b) - if len(bs) == 0 { - return nil, fmt.Errorf("%v - len(bs) == 0", errInvalidBase58String) - } - for bs[oneCount] == '1' { - oneCount++ - if oneCount >= len(bs) { - return nil, fmt.Errorf("%v - oneCount >= len(bs)", errInvalidBase58String) - } - } - //convert big.Int to bytes - return append(make([]byte, oneCount), value.Bytes()...), nil -} - -// Base582Big converts base58 to big -func (b oldBase58) Base582Big() (*big.Int, error) { - answer := new(big.Int) - for i := 0; i < len(b); i++ { - answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 - c, ok := revalp[string(b[i:i+1])] - if !ok { - return nil, errInvalidBase58Char - } - answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter - } - return answer, nil -} - -// Base582Int converts base58 to int -func (b oldBase58) Base582Int() (int, error) { - answer := 0 - for i := 0; i < len(b); i++ { - answer *= 58 //multiply current value by 58 - c, ok := revalp[string(b[i:i+1])] - if !ok { - return 0, errInvalidBase58Char - } - answer += c //add value of the current letter - } - return answer, nil -} - -// oldBase582Hex converts base58 to hex bytes -func oldBase582Hex(b string) ([]byte, error) { - return oldBase58(b).ToHex() -} - -// BitHex converts base58 to hexes used by Bitcoins (keeping the zeroes on the front, 25 bytes long) -func (b oldBase58) BitHex() ([]byte, error) { - value, err := b.ToBig() //convert to big.Int - if err != nil { - return nil, err - } - - tmp := value.Bytes() //convert to hex bytes - if len(tmp) == 25 { //if it is exactly 25 bytes, return - return tmp, nil - } else if len(tmp) > 25 { //if it is longer than 25, return nothing - return nil, errInvalidBase58Length - } - answer := make([]byte, 25) //make 25 byte container - for i := 0; i < len(tmp); i++ { //copy converted bytes - answer[24-i] = tmp[len(tmp)-1-i] - } - return answer, nil -} - -// oldBig2Base58 encodes big.Int to base58 string -func oldBig2Base58(val *big.Int) oldBase58 { - answer := "" - valCopy := new(big.Int).Abs(val) //copies big.Int - - if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string - return oldBase58("") - } - - tmpStr := "" - tmp := new(big.Int) - for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 - tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value - valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 - tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes - } - for i := (len(tmpStr) - 1); i > -1; i-- { - answer += tmpStr[i : i+1] //reverses the order - } - return oldBase58(answer) //returns -} - -// oldHex2Base58 encodes hex bytes into base58 -func oldHex2Base58(val []byte) oldBase58 { - tmp := oldBig2Base58(oldHex2Big(val)) //encoding of the number without zeroes in front - - //looking for zeros at the beginning - i := 0 - for i = 0; val[i] == 0 && i < len(val); i++ { //nolint:revive - } - answer := "" - for j := 0; j < i; j++ { //adds zeroes from the front - answer += alphabet[0:1] - } - answer += string(tmp) //concatenates - - return oldBase58(answer) //returns -} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bech32/bech32.go b/vendor/github.com/skycoin/skycoin/src/cipher/bech32/bech32.go new file mode 100644 index 000000000..4f54929de --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bech32/bech32.go @@ -0,0 +1,212 @@ +// Package bech32 implements BIP173 bech32 encoding for segwit addresses. +package bech32 + +import ( + "fmt" + "strings" +) + +const charset = "qpzry9x8gf2tvdw0s3jn54khce6mua7l" + +var charsetRev = [128]int8{ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 15, -1, 10, 17, 21, 20, 26, 30, 7, 5, -1, -1, -1, -1, -1, -1, + -1, 29, -1, 24, 13, 25, 9, 8, 23, -1, 18, 22, 31, 27, 19, -1, + 1, 0, 3, 16, 11, 28, 12, 14, 6, 4, 2, -1, -1, -1, -1, -1, + -1, 29, -1, 24, 13, 25, 9, 8, 23, -1, 18, 22, 31, 27, 19, -1, + 1, 0, 3, 16, 11, 28, 12, 14, 6, 4, 2, -1, -1, -1, -1, -1, +} + +func polymod(values []int) uint32 { + gen := [5]uint32{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3} + chk := uint32(1) + for _, v := range values { + b := chk >> 25 + chk = ((chk & 0x1ffffff) << 5) ^ uint32(v) //nolint:gosec // v is a 5-bit value (0-31) + for i := 0; i < 5; i++ { + if (b>>uint(i))&1 == 1 { //nolint:gosec // i is 0-4 + chk ^= gen[i] + } + } + } + return chk +} + +func hrpExpand(hrp string) []int { + ret := make([]int, 0, len(hrp)*2+1) + for _, c := range hrp { + ret = append(ret, int(c>>5)) + } + ret = append(ret, 0) + for _, c := range hrp { + ret = append(ret, int(c&31)) + } + return ret +} + +func verifyChecksum(hrp string, data []int) bool { + values := append(hrpExpand(hrp), data...) + return polymod(values) == 1 +} + +func createChecksum(hrp string, data []int) []int { + values := append(hrpExpand(hrp), data...) + values = append(values, 0, 0, 0, 0, 0, 0) + mod := polymod(values) ^ 1 + ret := make([]int, 6) + for i := 0; i < 6; i++ { + ret[i] = int((mod >> uint(5*(5-i))) & 31) //nolint:gosec // result fits in int + } + return ret +} + +// Encode encodes a bech32 string from HRP and 5-bit data values. +func Encode(hrp string, data []int) (string, error) { + chk := createChecksum(hrp, data) + combined := append(data, chk...) + + var ret strings.Builder + ret.WriteString(hrp) + ret.WriteByte('1') + for _, d := range combined { + if d < 0 || d >= 32 { + return "", fmt.Errorf("invalid data value: %d", d) + } + ret.WriteByte(charset[d]) + } + return ret.String(), nil +} + +// Decode decodes a bech32 string into its HRP and 5-bit data values. +func Decode(s string) (string, []int, error) { + if len(s) > 90 { + return "", nil, fmt.Errorf("bech32 string too long: %d", len(s)) + } + + // Find separator + pos := strings.LastIndex(s, "1") + if pos < 1 || pos+7 > len(s) { + return "", nil, fmt.Errorf("invalid bech32 separator position") + } + + hrp := strings.ToLower(s[:pos]) + dataStr := strings.ToLower(s[pos+1:]) + + data := make([]int, len(dataStr)) + for i, c := range dataStr { + if c >= 128 || charsetRev[c] == -1 { + return "", nil, fmt.Errorf("invalid bech32 character: %c", c) + } + data[i] = int(charsetRev[c]) + } + + if !verifyChecksum(hrp, data) { + return "", nil, fmt.Errorf("invalid bech32 checksum") + } + + return hrp, data[:len(data)-6], nil +} + +// ConvertBits converts a byte slice from one bit grouping to another. +func ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) { + acc := 0 + bits := uint8(0) + maxv := (1 << toBits) - 1 + var ret []byte + + for _, value := range data { + if value>>fromBits != 0 { + return nil, fmt.Errorf("invalid data: value %d exceeds %d bits", value, fromBits) + } + acc = (acc << fromBits) | int(value) + bits += fromBits + for bits >= toBits { + bits -= toBits + ret = append(ret, byte((acc>>bits)&maxv)) + } + } + + if pad { + if bits > 0 { + ret = append(ret, byte((acc<<(toBits-bits))&maxv)) + } + } else if bits >= fromBits { + return nil, fmt.Errorf("invalid padding") + } else if (acc<<(toBits-bits))&maxv != 0 { + return nil, fmt.Errorf("non-zero padding") + } + + return ret, nil +} + +// SegwitEncode encodes a segwit address from HRP, witness version, and witness program. +func SegwitEncode(hrp string, version byte, program []byte) (string, error) { + if version > 16 { + return "", fmt.Errorf("invalid witness version: %d", version) + } + if len(program) < 2 || len(program) > 40 { + return "", fmt.Errorf("invalid witness program length: %d", len(program)) + } + if version == 0 && len(program) != 20 && len(program) != 32 { + return "", fmt.Errorf("invalid witness v0 program length: %d", len(program)) + } + + conv, err := ConvertBits(program, 8, 5, true) + if err != nil { + return "", err + } + + data := append([]int{int(version)}, intsFromBytes(conv)...) + return Encode(hrp, data) +} + +// SegwitDecode decodes a segwit address into witness version and program. +func SegwitDecode(hrp, addr string) (byte, []byte, error) { + decHRP, data, err := Decode(addr) + if err != nil { + return 0, nil, err + } + if decHRP != hrp { + return 0, nil, fmt.Errorf("HRP mismatch: expected %q, got %q", hrp, decHRP) + } + if len(data) < 1 { + return 0, nil, fmt.Errorf("empty data") + } + + version := byte(data[0]) + if version > 16 { + return 0, nil, fmt.Errorf("invalid witness version: %d", version) + } + + program, err := ConvertBits(bytesFromInts(data[1:]), 5, 8, false) + if err != nil { + return 0, nil, err + } + + if len(program) < 2 || len(program) > 40 { + return 0, nil, fmt.Errorf("invalid witness program length: %d", len(program)) + } + if version == 0 && len(program) != 20 && len(program) != 32 { + return 0, nil, fmt.Errorf("invalid witness v0 program length: %d", len(program)) + } + + return version, program, nil +} + +func intsFromBytes(b []byte) []int { + r := make([]int, len(b)) + for i, v := range b { + r[i] = int(v) + } + return r +} + +func bytesFromInts(ints []int) []byte { + b := make([]byte, len(ints)) + for i, v := range ints { + b[i] = byte(v) + } + return b +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin_segwit.go b/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin_segwit.go new file mode 100644 index 000000000..5f8aaea8e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/bitcoin_segwit.go @@ -0,0 +1,115 @@ +package cipher + +import ( + "fmt" + "log" + "strings" + + "github.com/skycoin/skycoin/src/cipher/bech32" +) + +// BitcoinSegwitAddress is a native segwit (P2WPKH) bitcoin address (bc1q...). +type BitcoinSegwitAddress struct { + Version byte // Witness version (0 for P2WPKH) + Key Ripemd160 // 20-byte witness program (hash160 of compressed pubkey) +} + +// BitcoinSegwitAddressFromPubKey creates a P2WPKH address from a compressed public key. +// The witness program is RIPEMD160(SHA256(pubkey)), same as P2PKH but encoded as bech32. +func BitcoinSegwitAddressFromPubKey(pubKey PubKey) BitcoinSegwitAddress { + return BitcoinSegwitAddress{ + Version: 0, + Key: BitcoinPubKeyRipemd160(pubKey), + } +} + +// BitcoinSegwitAddressFromSecKey generates a BitcoinSegwitAddress from SecKey. +func BitcoinSegwitAddressFromSecKey(secKey SecKey) (BitcoinSegwitAddress, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return BitcoinSegwitAddress{}, err + } + return BitcoinSegwitAddressFromPubKey(p), nil +} + +// MustBitcoinSegwitAddressFromSecKey generates a BitcoinSegwitAddress from SecKey, panics on error. +func MustBitcoinSegwitAddressFromSecKey(secKey SecKey) BitcoinSegwitAddress { + return BitcoinSegwitAddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBech32BitcoinAddress decodes a bech32 segwit address string into a BitcoinSegwitAddress. +func DecodeBech32BitcoinAddress(addr string) (BitcoinSegwitAddress, error) { + hrp := "bc" + if strings.HasPrefix(strings.ToLower(addr), "tb1") { + hrp = "tb" + } + + version, program, err := bech32.SegwitDecode(hrp, addr) + if err != nil { + return BitcoinSegwitAddress{}, fmt.Errorf("invalid bech32 address: %w", err) + } + + if version != 0 { + return BitcoinSegwitAddress{}, fmt.Errorf("unsupported witness version: %d", version) + } + if len(program) != 20 { + return BitcoinSegwitAddress{}, fmt.Errorf("invalid P2WPKH program length: %d (expected 20)", len(program)) + } + + a := BitcoinSegwitAddress{Version: version} + copy(a.Key[:], program) + return a, nil +} + +// MustDecodeBech32BitcoinAddress decodes a bech32 segwit address, panics on error. +func MustDecodeBech32BitcoinAddress(addr string) BitcoinSegwitAddress { + a, err := DecodeBech32BitcoinAddress(addr) + if err != nil { + log.Panicf("Invalid bech32 bitcoin address %s: %v", addr, err) + } + return a +} + +// Null returns true if the address is null. +func (addr BitcoinSegwitAddress) Null() bool { + return addr == BitcoinSegwitAddress{} +} + +// Bytes returns the raw witness program with version prefix. +func (addr BitcoinSegwitAddress) Bytes() []byte { + b := make([]byte, 1+20) + b[0] = addr.Version + copy(b[1:], addr.Key[:]) + return b +} + +// Verify checks that the address is valid for the given public key. +func (addr BitcoinSegwitAddress) Verify(key PubKey) error { + if addr.Version != 0 { + return ErrAddressInvalidVersion + } + if addr.Key != BitcoinPubKeyRipemd160(key) { + return ErrAddressInvalidPubKey + } + return nil +} + +// String returns the bech32-encoded address (bc1q...). +func (addr BitcoinSegwitAddress) String() string { + s, err := bech32.SegwitEncode("bc", addr.Version, addr.Key[:]) + if err != nil { + log.Panicf("BitcoinSegwitAddress.String failed: %v", err) + } + return s +} + +// Checksum returns the first 4 bytes of SHA256(version+key). +// This satisfies the Addresser interface. For bech32 addresses, the real +// checksum is embedded in the bech32 encoding, but this provides compatibility. +func (addr BitcoinSegwitAddress) Checksum() Checksum { + r := append([]byte{addr.Version}, addr.Key[:]...) + h := SumSHA256(r) + c := Checksum{} + copy(c[:], h[:4]) + return c +} diff --git a/vendor/github.com/skycoin/skywire/deployment/dmsghttp-config.json b/vendor/github.com/skycoin/skywire/deployment/dmsghttp-config.json index 1bc7d8b0d..ccc6d44e3 100644 --- a/vendor/github.com/skycoin/skywire/deployment/dmsghttp-config.json +++ b/vendor/github.com/skycoin/skywire/deployment/dmsghttp-config.json @@ -2,15 +2,15 @@ "test": { "dmsg_servers": [ { - "static": "0326978f5a53aff537dbb47fed58b1f123af3b00132d365f1309a14db4168dcff7", + "static": "02a49bc0aa1b5b78f638e9189be4ed095bac5d6839c828465a8350f80ac07629c0", "server": { - "address": "70.121.13.123:9082" + "address": "45.79.213.251:30080" } }, { - "static": "024716428e6315d954356e9ad72bea32bb2b41aab5a54a9b5cb4313964016e64d8", + "static": "0326978f5a53aff537dbb47fed58b1f123af3b00132d365f1309a14db4168dcff7", "server": { - "address": "45.79.213.251:30080" + "address": "70.121.13.123:9082" } } ], @@ -24,39 +24,39 @@ "prod": { "dmsg_servers": [ { - "static": "0371ab4bcff7b121f4b91f6856d6740c6f9dc1fe716977850aeb5d84378b300a13", + "static": "0281a102c82820e811368c8d028cf11b1a985043b726b1bcdb8fce89b27384b2cb", "server": { - "address": "172.105.179.5:30087" + "address": "139.162.160.227:30086" } }, { - "static": "0326978f5a53aff537dbb47fed58b1f123af3b00132d365f1309a14db4168dcff7", + "static": "0371ab4bcff7b121f4b91f6856d6740c6f9dc1fe716977850aeb5d84378b300a13", "server": { - "address": "70.121.13.123:9083" + "address": "139.162.160.227:30087" } }, { - "static": "0281a102c82820e811368c8d028cf11b1a985043b726b1bcdb8fce89b27384b2cb", + "static": "02a49bc0aa1b5b78f638e9189be4ed095bac5d6839c828465a8350f80ac07629c0", "server": { - "address": "172.104.166.8:30086" + "address": "139.162.160.227:30081" } }, { - "static": "03717576ada5b1744e395c66c2bb11cea73b0e23d0dcd54422139b1a7f12e962c4", + "static": "0326978f5a53aff537dbb47fed58b1f123af3b00132d365f1309a14db4168dcff7", "server": { - "address": "139.162.173.101:30083" + "address": "70.121.13.123:9083" } }, { - "static": "02a49bc0aa1b5b78f638e9189be4ed095bac5d6839c828465a8350f80ac07629c0", + "static": "02a2d4c346dabd165fd555dfdba4a7f4d18786fe7e055e562397cd5102bdd7f8dd", "server": { - "address": "74.207.231.164:30081" + "address": "139.162.173.101:30082" } }, { - "static": "02a2d4c346dabd165fd555dfdba4a7f4d18786fe7e055e562397cd5102bdd7f8dd", + "static": "03717576ada5b1744e395c66c2bb11cea73b0e23d0dcd54422139b1a7f12e962c4", "server": { - "address": "139.162.173.101:30082" + "address": "139.162.173.101:30083" } } ], diff --git a/vendor/github.com/skycoin/skywire/deployment/services-config.json b/vendor/github.com/skycoin/skywire/deployment/services-config.json index 1e44e3f19..ad54bf252 100644 --- a/vendor/github.com/skycoin/skywire/deployment/services-config.json +++ b/vendor/github.com/skycoin/skywire/deployment/services-config.json @@ -24,8 +24,8 @@ "uptime_tracker": "http://ut.skywire.dev", "service_discovery": "http://sd.skywire.dev", "stun_servers": [ - "139.162.160.227:3479", - "172.104.145.184:3479" + "139.162.160.227:3478", + "172.104.247.120:3478" ], "dns_server": "1.1.1.1", "survey_whitelist": [ @@ -63,8 +63,8 @@ "uptime_tracker": "http://ut.skywire.skycoin.com", "service_discovery": "http://sd.skycoin.com", "stun_servers": [ - "139.162.160.227:3479", - "172.104.145.184:3479" + "139.162.160.227:3478", + "172.104.247.120:3478" ], "dns_server": "1.1.1.1", "survey_whitelist": [ diff --git a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo/buildinfo.go b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo/buildinfo.go index b89d870be..46d4711ec 100644 --- a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo/buildinfo.go +++ b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo/buildinfo.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "regexp" + "runtime" "runtime/debug" "strings" ) @@ -138,11 +139,23 @@ func DebugBuildInfo() *debug.BuildInfo { // Get returns a summary of build information. func Get() *Info { + // Build complete version string with commit + ver := Version() + if c := Commit(); c != "" && c != unknown && !strings.Contains(ver, c) { + // Append commit to version if not already present + if len(c) > 12 { + c = c[:12] + } + ver = ver + "-" + c + } + // Note: Go's module system already adds +dirty to version when built from dirty repo return &Info{ - Version: Version(), + Version: ver, Commit: Commit(), Date: Date(), Go: Go(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, } } @@ -166,6 +179,8 @@ type Info struct { Version string `json:"version"` Commit string `json:"commit"` Date string `json:"date"` + OS string `json:"os"` + Arch string `json:"arch"` } // WriteTo writes build info summary to an io.Writer. diff --git a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/health.go b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/health.go index 0b66108e7..09d9f6e2a 100644 --- a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/health.go +++ b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/health.go @@ -13,6 +13,7 @@ var path = "/health" // HealthCheckResponse is struct of /health endpoint type HealthCheckResponse struct { + ServiceName string `json:"service_name,omitempty"` BuildInfo *buildinfo.Info `json:"build_info,omitempty"` StartedAt time.Time `json:"started_at"` DmsgAddr string `json:"dmsg_address,omitempty"` diff --git a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/httputil.go b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/httputil.go index 758362244..170a06656 100644 --- a/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/httputil.go +++ b/vendor/github.com/skycoin/skywire/pkg/skywire-utilities/pkg/httputil/httputil.go @@ -3,7 +3,9 @@ package httputil import ( "context" + "errors" "fmt" + "net" "net/http" "strconv" "strings" @@ -19,8 +21,9 @@ var json = jsoniter.ConfigFastest var log = logging.MustGetLogger("httputil") -// WriteJSON writes a json object on a http.ResponseWriter with the given code, -// panics on marshaling error +// WriteJSON writes a json object on a http.ResponseWriter with the given code. +// I/O errors (client disconnect, timeout) are logged but don't cause panics. +// Marshaling errors panic as they indicate a programming error. func WriteJSON(w http.ResponseWriter, r *http.Request, code int, v interface{}) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(code) @@ -36,10 +39,37 @@ func WriteJSON(w http.ResponseWriter, r *http.Request, code int, v interface{}) v = map[string]interface{}{"error": err.Error()} } if err := json.NewEncoder(w).Encode(v); err != nil { + // Check if it's an I/O error (client disconnect, timeout, etc.) + if isIOError(err) { + log.WithError(err).Debug("Failed to write JSON response (client likely disconnected)") + return + } + // Marshaling errors indicate programming bugs, so panic panic(err) } } +// isIOError checks if an error is related to I/O (network issues, timeouts, etc.) +func isIOError(err error) bool { + if err == nil { + return false + } + // Check for common I/O error patterns + errStr := err.Error() + if strings.Contains(errStr, "i/o timeout") || + strings.Contains(errStr, "connection reset") || + strings.Contains(errStr, "broken pipe") || + strings.Contains(errStr, "use of closed network connection") { + return true + } + // Check for net.Error (timeout or temporary) + var netErr net.Error + if ok := errors.As(err, &netErr); ok { + return netErr.Timeout() + } + return false +} + // ReadJSON reads the request body to a json object. func ReadJSON(r *http.Request, v interface{}) error { dec := json.NewDecoder(r.Body) diff --git a/vendor/github.com/xtaci/smux/alloc.go b/vendor/github.com/xtaci/smux/alloc.go index 32629349d..9bf935e67 100644 --- a/vendor/github.com/xtaci/smux/alloc.go +++ b/vendor/github.com/xtaci/smux/alloc.go @@ -29,7 +29,7 @@ import ( var ( defaultAllocator *Allocator - debruijinPos = [...]byte{0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31} + debruijnPos = [...]byte{0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31} ) func init() { @@ -88,7 +88,7 @@ func (alloc *Allocator) Put(p *[]byte) error { return nil } -// msb return the pos of most significiant bit +// msb returns the pos of most significant bit // http://supertech.csail.mit.edu/papers/debruijn.pdf func msb(size int) byte { v := uint32(size) @@ -97,5 +97,5 @@ func msb(size int) byte { v |= v >> 4 v |= v >> 8 v |= v >> 16 - return debruijinPos[(v*0x07C4ACDD)>>27] + return debruijnPos[(v*0x07C4ACDD)>>27] } diff --git a/vendor/github.com/xtaci/smux/session.go b/vendor/github.com/xtaci/smux/session.go index 65ed5ff43..085547d01 100644 --- a/vendor/github.com/xtaci/smux/session.go +++ b/vendor/github.com/xtaci/smux/session.go @@ -544,7 +544,7 @@ func (s *Session) keepalive() { // shaperLoop implements a priority queue and bandwidth shaping for write requests. // Eg: Control messages are prioritized over data messages, and shaper tries -// it's best to keep fair bandwidth among streams. +// its best to keep fair bandwidth among streams. func (s *Session) shaperLoop() { chShaper := s.shaper diff --git a/vendor/github.com/xtaci/smux/stream.go b/vendor/github.com/xtaci/smux/stream.go index 0a80b8019..ec1177cff 100644 --- a/vendor/github.com/xtaci/smux/stream.go +++ b/vendor/github.com/xtaci/smux/stream.go @@ -577,7 +577,7 @@ func (s *stream) writeV2(b []byte) (n int, err error) { // eg1: uint32(0) - uint32(math.MaxUint32) = 1 // eg2: int32(uint32(0) - uint32(1)) = -1 // - // basicially, you can take it as a MODULAR ARITHMETIC + // basically, you can take it as a MODULAR ARITHMETIC inflight := int32(atomic.LoadUint32(&s.numWritten) - atomic.LoadUint32(&s.peerConsumed)) if inflight < 0 { // security check for malformed data return 0, ErrConsumed diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 6320f4eb4..0b99d832f 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -4,13 +4,17 @@ // Package http2 implements the HTTP/2 protocol. // -// This package is low-level and intended to be used directly by very -// few people. Most users will use it indirectly through the automatic -// use by the net/http package (from Go 1.6 and later). -// For use in earlier Go versions see ConfigureServer. (Transport support -// requires Go 1.6 or later) +// Almost no users should need to import this package directly. +// The net/http package supports HTTP/2 natively. // -// See https://http2.github.io/ for more information on HTTP/2. +// To enable or disable HTTP/2 support in net/http clients and servers, see +// [http.Transport.Protocols] and [http.Server.Protocols]. +// +// To configure HTTP/2 parameters, see +// [http.Transport.HTTP2] and [http.Server.HTTP2]. +// +// To create HTTP/1 or HTTP/2 connections, see +// [http.Transport.NewClientConn]. package http2 // import "golang.org/x/net/http2" import ( diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 7ef807f79..65da5175c 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -164,6 +164,8 @@ type Server struct { // NewWriteScheduler constructs a write scheduler for a connection. // If nil, a default scheduler is chosen. + // + // Deprecated: User-provided write schedulers are deprecated. NewWriteScheduler func() WriteScheduler // CountError, if non-nil, is called on HTTP/2 server errors. diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 8cf64b78e..2e9c2f6a5 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -712,10 +712,6 @@ func canRetryError(err error) bool { return true } if se, ok := err.(StreamError); ok { - if se.Code == ErrCodeProtocol && se.Cause == errFromPeer { - // See golang/go#47635, golang/go#42777 - return true - } return se.Code == ErrCodeRefusedStream } return false @@ -3233,10 +3229,6 @@ func (gz *gzipReader) Close() error { return gz.body.Close() } -type errorReader struct{ err error } - -func (r errorReader) Read(p []byte) (int, error) { return 0, r.err } - // isConnectionCloseRequest reports whether req should use its own // connection for a single request and then close the connection. func isConnectionCloseRequest(req *http.Request) bool { diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index 7de27be52..551545f31 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -8,6 +8,8 @@ import "fmt" // WriteScheduler is the interface implemented by HTTP/2 write schedulers. // Methods are never called concurrently. +// +// Deprecated: User-provided write schedulers are deprecated. type WriteScheduler interface { // OpenStream opens a new stream in the write scheduler. // It is illegal to call this with streamID=0 or with a streamID that is @@ -38,6 +40,8 @@ type WriteScheduler interface { } // OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. +// +// Deprecated: User-provided write schedulers are deprecated. type OpenStreamOptions struct { // PusherID is zero if the stream was initiated by the client. Otherwise, // PusherID names the stream that pushed the newly opened stream. @@ -47,6 +51,8 @@ type OpenStreamOptions struct { } // FrameWriteRequest is a request to write a frame. +// +// Deprecated: User-provided write schedulers are deprecated. type FrameWriteRequest struct { // write is the interface value that does the writing, once the // WriteScheduler has selected this frame to write. The write diff --git a/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go index 7803a9261..c3d3e9bed 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc7540.go @@ -14,6 +14,8 @@ import ( const priorityDefaultWeightRFC7540 = 15 // 16 = 15 + 1 // PriorityWriteSchedulerConfig configures a priorityWriteScheduler. +// +// Deprecated: User-provided write schedulers are deprecated. type PriorityWriteSchedulerConfig struct { // MaxClosedNodesInTree controls the maximum number of closed streams to // retain in the priority tree. Setting this to zero saves a small amount @@ -55,6 +57,9 @@ type PriorityWriteSchedulerConfig struct { // NewPriorityWriteScheduler constructs a WriteScheduler that schedules // frames by following HTTP/2 priorities as described in RFC 7540 Section 5.3. // If cfg is nil, default options are used. +// +// Deprecated: The RFC 7540 write scheduler has known bugs and performance issues, +// and RFC 7540 prioritization was deprecated in RFC 9113. func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { return newPriorityWriteSchedulerRFC7540(cfg) } diff --git a/vendor/golang.org/x/net/http2/writesched_random.go b/vendor/golang.org/x/net/http2/writesched_random.go index f2e55e05c..d5d4e2214 100644 --- a/vendor/golang.org/x/net/http2/writesched_random.go +++ b/vendor/golang.org/x/net/http2/writesched_random.go @@ -10,6 +10,8 @@ import "math" // priorities. Control frames like SETTINGS and PING are written before DATA // frames, but if no control frames are queued and multiple streams have queued // HEADERS or DATA frames, Pop selects a ready stream arbitrarily. +// +// Deprecated: User-provided write schedulers are deprecated. func NewRandomWriteScheduler() WriteScheduler { return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} } diff --git a/vendor/golang.org/x/sys/cpu/asm_darwin_arm64_gc.s b/vendor/golang.org/x/sys/cpu/asm_darwin_arm64_gc.s new file mode 100644 index 000000000..e07fa75eb --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/asm_darwin_arm64_gc.s @@ -0,0 +1,12 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && arm64 && gc + +#include "textflag.h" + +TEXT libc_sysctlbyname_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_sysctlbyname(SB) +GLOBL ·libc_sysctlbyname_trampoline_addr(SB), RODATA, $8 +DATA ·libc_sysctlbyname_trampoline_addr(SB)/8, $libc_sysctlbyname_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go index 6d8eb784b..5fc09e293 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -44,14 +44,11 @@ func initOptions() { } func archInit() { - switch runtime.GOOS { - case "freebsd": + if runtime.GOOS == "freebsd" { readARM64Registers() - case "linux", "netbsd", "openbsd", "windows": + } else { + // Most platforms don't seem to allow directly reading these registers. doinit() - default: - // Many platforms don't seem to allow reading these registers. - setMinimalFeatures() } } diff --git a/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64.go new file mode 100644 index 000000000..0b470744a --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64.go @@ -0,0 +1,67 @@ +// Copyright 2026 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && arm64 && gc + +package cpu + +func doinit() { + setMinimalFeatures() + + // The feature flags are explained in [Instruction Set Detection]. + // There are some differences between MacOS versions: + // + // MacOS 11 and 12 do not have "hw.optional" sysctl values for some of the features. + // + // MacOS 13 changed some of the naming conventions to align with ARM Architecture Reference Manual. + // For example "hw.optional.armv8_2_sha512" became "hw.optional.arm.FEAT_SHA512". + // It currently checks both to stay compatible with MacOS 11 and 12. + // The old names also work with MacOS 13, however it's not clear whether + // they will continue working with future OS releases. + // + // Once MacOS 12 is no longer supported the old names can be removed. + // + // [Instruction Set Detection]: https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics + + // Encryption, hashing and checksum capabilities + + // For the following flags there are no MacOS 11 sysctl flags. + ARM64.HasAES = true || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_AES\x00")) + ARM64.HasPMULL = true || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_PMULL\x00")) + ARM64.HasSHA1 = true || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SHA1\x00")) + ARM64.HasSHA2 = true || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SHA256\x00")) + + ARM64.HasSHA3 = darwinSysctlEnabled([]byte("hw.optional.armv8_2_sha3\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SHA3\x00")) + ARM64.HasSHA512 = darwinSysctlEnabled([]byte("hw.optional.armv8_2_sha512\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SHA512\x00")) + + ARM64.HasCRC32 = darwinSysctlEnabled([]byte("hw.optional.armv8_crc32\x00")) + + // Atomic and memory ordering + ARM64.HasATOMICS = darwinSysctlEnabled([]byte("hw.optional.armv8_1_atomics\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_LSE\x00")) + ARM64.HasLRCPC = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_LRCPC\x00")) + + // SIMD and floating point capabilities + ARM64.HasFPHP = darwinSysctlEnabled([]byte("hw.optional.neon_fp16\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_FP16\x00")) + ARM64.HasASIMDHP = darwinSysctlEnabled([]byte("hw.optional.neon_hpfp\x00")) || darwinSysctlEnabled([]byte("hw.optional.AdvSIMD_HPFPCvt\x00")) + ARM64.HasASIMDRDM = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_RDM\x00")) + ARM64.HasASIMDDP = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_DotProd\x00")) + ARM64.HasASIMDFHM = darwinSysctlEnabled([]byte("hw.optional.armv8_2_fhm\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_FHM\x00")) + ARM64.HasI8MM = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_I8MM\x00")) + + ARM64.HasJSCVT = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_JSCVT\x00")) + ARM64.HasFCMA = darwinSysctlEnabled([]byte("hw.optional.armv8_3_compnum\x00")) || darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_FCMA\x00")) + + // Miscellaneous + ARM64.HasDCPOP = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_DPB\x00")) + ARM64.HasEVTSTRM = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_ECV\x00")) + ARM64.HasDIT = darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_DIT\x00")) + + // Not supported, but added for completeness + ARM64.HasCPUID = false + + ARM64.HasSM3 = false // darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SM3\x00")) + ARM64.HasSM4 = false // darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SM4\x00")) + ARM64.HasSVE = false // darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SVE\x00")) + ARM64.HasSVE2 = false // darwinSysctlEnabled([]byte("hw.optional.arm.FEAT_SVE2\x00")) +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64_other.go b/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64_other.go new file mode 100644 index 000000000..4ee68e38d --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64_other.go @@ -0,0 +1,29 @@ +// Copyright 2026 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && arm64 && !gc + +package cpu + +func doinit() { + setMinimalFeatures() + + ARM64.HasASIMD = true + ARM64.HasFP = true + + // Go already assumes these to be available because they were on the M1 + // and these are supported on all Apple arm64 chips. + ARM64.HasAES = true + ARM64.HasPMULL = true + ARM64.HasSHA1 = true + ARM64.HasSHA2 = true + + if runtime.GOOS != "ios" { + // Apple A7 processors do not support these, however + // M-series SoCs are at least armv8.4-a + ARM64.HasCRC32 = true // armv8.1 + ARM64.HasATOMICS = true // armv8.2 + ARM64.HasJSCVT = true // armv8.3, if HasFP + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go index 7f1946780..05913081e 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go @@ -9,3 +9,4 @@ package cpu func getisar0() uint64 { return 0 } func getisar1() uint64 { return 0 } func getpfr0() uint64 { return 0 } +func getzfr0() uint64 { return 0 } diff --git a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go index ff74d7afa..6c7c5bfd5 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !linux && !netbsd && !openbsd && !windows && arm64 +//go:build !darwin && !linux && !netbsd && !openbsd && !windows && arm64 package cpu -func doinit() {} +func doinit() { + setMinimalFeatures() +} diff --git a/vendor/golang.org/x/sys/cpu/syscall_darwin_arm64_gc.go b/vendor/golang.org/x/sys/cpu/syscall_darwin_arm64_gc.go new file mode 100644 index 000000000..7b4e67ff9 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/syscall_darwin_arm64_gc.go @@ -0,0 +1,54 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Minimal copy from internal/cpu and runtime to make sysctl calls. + +//go:build darwin && arm64 && gc + +package cpu + +import ( + "syscall" + "unsafe" +) + +type Errno = syscall.Errno + +// adapted from internal/cpu/cpu_arm64_darwin.go +func darwinSysctlEnabled(name []byte) bool { + out := int32(0) + nout := unsafe.Sizeof(out) + if ret := sysctlbyname(&name[0], (*byte)(unsafe.Pointer(&out)), &nout, nil, 0); ret != nil { + return false + } + return out > 0 +} + +//go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + +var libc_sysctlbyname_trampoline_addr uintptr + +// adapted from runtime/sys_darwin.go in the pattern of sysctl() above, as defined in x/sys/unix +func sysctlbyname(name *byte, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error { + if _, _, err := syscall_syscall6( + libc_sysctlbyname_trampoline_addr, + uintptr(unsafe.Pointer(name)), + uintptr(unsafe.Pointer(old)), + uintptr(unsafe.Pointer(oldlen)), + uintptr(unsafe.Pointer(new)), + uintptr(newlen), + 0, + ); err != 0 { + return err + } + + return nil +} + +//go:cgo_import_dynamic libc_sysctlbyname sysctlbyname "/usr/lib/libSystem.B.dylib" + +// Implemented in the runtime package (runtime/sys_darwin.go) +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +//go:linkname syscall_syscall6 syscall.syscall6 diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go index d079d8116..761912237 100644 --- a/vendor/golang.org/x/sys/plan9/syscall_plan9.go +++ b/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -19,13 +19,7 @@ import ( // A Note is a string describing a process note. // It implements the os.Signal interface. -type Note string - -func (n Note) Signal() {} - -func (n Note) String() string { - return string(n) -} +type Note = syscall.Note var ( Stdin = 0 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index c1a467017..45476a73c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -593,110 +593,115 @@ const ( ) const ( - NDA_UNSPEC = 0x0 - NDA_DST = 0x1 - NDA_LLADDR = 0x2 - NDA_CACHEINFO = 0x3 - NDA_PROBES = 0x4 - NDA_VLAN = 0x5 - NDA_PORT = 0x6 - NDA_VNI = 0x7 - NDA_IFINDEX = 0x8 - NDA_MASTER = 0x9 - NDA_LINK_NETNSID = 0xa - NDA_SRC_VNI = 0xb - NTF_USE = 0x1 - NTF_SELF = 0x2 - NTF_MASTER = 0x4 - NTF_PROXY = 0x8 - NTF_EXT_LEARNED = 0x10 - NTF_OFFLOADED = 0x20 - NTF_ROUTER = 0x80 - NUD_INCOMPLETE = 0x1 - NUD_REACHABLE = 0x2 - NUD_STALE = 0x4 - NUD_DELAY = 0x8 - NUD_PROBE = 0x10 - NUD_FAILED = 0x20 - NUD_NOARP = 0x40 - NUD_PERMANENT = 0x80 - NUD_NONE = 0x0 - IFA_UNSPEC = 0x0 - IFA_ADDRESS = 0x1 - IFA_LOCAL = 0x2 - IFA_LABEL = 0x3 - IFA_BROADCAST = 0x4 - IFA_ANYCAST = 0x5 - IFA_CACHEINFO = 0x6 - IFA_MULTICAST = 0x7 - IFA_FLAGS = 0x8 - IFA_RT_PRIORITY = 0x9 - IFA_TARGET_NETNSID = 0xa - IFAL_LABEL = 0x2 - IFAL_ADDRESS = 0x1 - RT_SCOPE_UNIVERSE = 0x0 - RT_SCOPE_SITE = 0xc8 - RT_SCOPE_LINK = 0xfd - RT_SCOPE_HOST = 0xfe - RT_SCOPE_NOWHERE = 0xff - RT_TABLE_UNSPEC = 0x0 - RT_TABLE_COMPAT = 0xfc - RT_TABLE_DEFAULT = 0xfd - RT_TABLE_MAIN = 0xfe - RT_TABLE_LOCAL = 0xff - RT_TABLE_MAX = 0xffffffff - RTA_UNSPEC = 0x0 - RTA_DST = 0x1 - RTA_SRC = 0x2 - RTA_IIF = 0x3 - RTA_OIF = 0x4 - RTA_GATEWAY = 0x5 - RTA_PRIORITY = 0x6 - RTA_PREFSRC = 0x7 - RTA_METRICS = 0x8 - RTA_MULTIPATH = 0x9 - RTA_FLOW = 0xb - RTA_CACHEINFO = 0xc - RTA_TABLE = 0xf - RTA_MARK = 0x10 - RTA_MFC_STATS = 0x11 - RTA_VIA = 0x12 - RTA_NEWDST = 0x13 - RTA_PREF = 0x14 - RTA_ENCAP_TYPE = 0x15 - RTA_ENCAP = 0x16 - RTA_EXPIRES = 0x17 - RTA_PAD = 0x18 - RTA_UID = 0x19 - RTA_TTL_PROPAGATE = 0x1a - RTA_IP_PROTO = 0x1b - RTA_SPORT = 0x1c - RTA_DPORT = 0x1d - RTN_UNSPEC = 0x0 - RTN_UNICAST = 0x1 - RTN_LOCAL = 0x2 - RTN_BROADCAST = 0x3 - RTN_ANYCAST = 0x4 - RTN_MULTICAST = 0x5 - RTN_BLACKHOLE = 0x6 - RTN_UNREACHABLE = 0x7 - RTN_PROHIBIT = 0x8 - RTN_THROW = 0x9 - RTN_NAT = 0xa - RTN_XRESOLVE = 0xb - SizeofNlMsghdr = 0x10 - SizeofNlMsgerr = 0x14 - SizeofRtGenmsg = 0x1 - SizeofNlAttr = 0x4 - SizeofRtAttr = 0x4 - SizeofIfInfomsg = 0x10 - SizeofIfAddrmsg = 0x8 - SizeofIfAddrlblmsg = 0xc - SizeofIfaCacheinfo = 0x10 - SizeofRtMsg = 0xc - SizeofRtNexthop = 0x8 - SizeofNdUseroptmsg = 0x10 - SizeofNdMsg = 0xc + NDA_UNSPEC = 0x0 + NDA_DST = 0x1 + NDA_LLADDR = 0x2 + NDA_CACHEINFO = 0x3 + NDA_PROBES = 0x4 + NDA_VLAN = 0x5 + NDA_PORT = 0x6 + NDA_VNI = 0x7 + NDA_IFINDEX = 0x8 + NDA_MASTER = 0x9 + NDA_LINK_NETNSID = 0xa + NDA_SRC_VNI = 0xb + NTF_USE = 0x1 + NTF_SELF = 0x2 + NTF_MASTER = 0x4 + NTF_PROXY = 0x8 + NTF_EXT_LEARNED = 0x10 + NTF_OFFLOADED = 0x20 + NTF_ROUTER = 0x80 + NUD_INCOMPLETE = 0x1 + NUD_REACHABLE = 0x2 + NUD_STALE = 0x4 + NUD_DELAY = 0x8 + NUD_PROBE = 0x10 + NUD_FAILED = 0x20 + NUD_NOARP = 0x40 + NUD_PERMANENT = 0x80 + NUD_NONE = 0x0 + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFA_FLAGS = 0x8 + IFA_RT_PRIORITY = 0x9 + IFA_TARGET_NETNSID = 0xa + IFAL_LABEL = 0x2 + IFAL_ADDRESS = 0x1 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + PREFIX_UNSPEC = 0x0 + PREFIX_ADDRESS = 0x1 + PREFIX_CACHEINFO = 0x2 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofPrefixmsg = 0xc + SizeofPrefixCacheinfo = 0x8 + SizeofIfAddrmsg = 0x8 + SizeofIfAddrlblmsg = 0xc + SizeofIfaCacheinfo = 0x10 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 + SizeofNdMsg = 0xc ) type NlMsghdr struct { @@ -735,6 +740,22 @@ type IfInfomsg struct { Change uint32 } +type Prefixmsg struct { + Family uint8 + Pad1 uint8 + Pad2 uint16 + Ifindex int32 + Type uint8 + Len uint8 + Flags uint8 + Pad3 uint8 +} + +type PrefixCacheinfo struct { + Preferred_time uint32 + Valid_time uint32 +} + type IfAddrmsg struct { Family uint8 Prefixlen uint8 diff --git a/vendor/golang.org/x/sys/windows/aliases.go b/vendor/golang.org/x/sys/windows/aliases.go index 16f90560a..96317966e 100644 --- a/vendor/golang.org/x/sys/windows/aliases.go +++ b/vendor/golang.org/x/sys/windows/aliases.go @@ -8,5 +8,6 @@ package windows import "syscall" +type Signal = syscall.Signal type Errno = syscall.Errno type SysProcAttr = syscall.SysProcAttr diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 738a9f212..d76643658 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -1490,20 +1490,6 @@ func Getgid() (gid int) { return -1 } func Getegid() (egid int) { return -1 } func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } -type Signal int - -func (s Signal) Signal() {} - -func (s Signal) String() string { - if 0 <= s && int(s) < len(signals) { - str := signals[s] - if str != "" { - return str - } - } - return "signal " + itoa(int(s)) -} - func LoadCreateSymbolicLink() error { return procCreateSymbolicLinkW.Find() } diff --git a/vendor/modules.txt b/vendor/modules.txt index b0e654f5b..41338b223 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -12,13 +12,13 @@ github.com/Microsoft/go-winio/internal/fs github.com/Microsoft/go-winio/internal/socket github.com/Microsoft/go-winio/internal/stringbuffer github.com/Microsoft/go-winio/pkg/guid -# github.com/VictoriaMetrics/metrics v1.41.2 +# github.com/VictoriaMetrics/metrics v1.42.0 ## explicit; go 1.24.0 github.com/VictoriaMetrics/metrics # github.com/bitfield/script v0.24.1 ## explicit; go 1.18 github.com/bitfield/script -# github.com/bytedance/gopkg v0.1.3 +# github.com/bytedance/gopkg v0.1.4 ## explicit; go 1.18 github.com/bytedance/gopkg/lang/dirtmake # github.com/bytedance/sonic v1.15.0 @@ -140,8 +140,8 @@ github.com/docker/go-connections/tlsconfig # github.com/docker/go-units v0.4.0 ## explicit github.com/docker/go-units -# github.com/fatih/color v1.18.0 -## explicit; go 1.17 +# github.com/fatih/color v1.19.0 +## explicit; go 1.25.0 github.com/fatih/color # github.com/felixge/httpsnoop v1.0.4 ## explicit; go 1.13 @@ -197,7 +197,7 @@ github.com/go-redis/redis/v8/internal/pool github.com/go-redis/redis/v8/internal/proto github.com/go-redis/redis/v8/internal/rand github.com/go-redis/redis/v8/internal/util -# github.com/goccy/go-json v0.10.5 +# github.com/goccy/go-json v0.10.6 ## explicit; go 1.19 github.com/goccy/go-json github.com/goccy/go-json/internal/decoder @@ -321,16 +321,17 @@ github.com/sirupsen/logrus/hooks/syslog # github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6 ## explicit github.com/skycoin/noise -# github.com/skycoin/skycoin v0.28.3 -## explicit; go 1.25.4 +# github.com/skycoin/skycoin v0.28.5-alpha1.0.20260323015226-90b668188f85 +## explicit; go 1.26.1 github.com/skycoin/skycoin/src/cipher github.com/skycoin/skycoin/src/cipher/base58 +github.com/skycoin/skycoin/src/cipher/bech32 github.com/skycoin/skycoin/src/cipher/ripemd160 github.com/skycoin/skycoin/src/cipher/secp256k1-go github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2 github.com/skycoin/skycoin/src/util/logging -# github.com/skycoin/skywire v1.3.35-0.20260222235451-f11c46808634 -## explicit; go 1.25.6 +# github.com/skycoin/skywire v1.3.37 +## explicit; go 1.26.1 github.com/skycoin/skywire/deployment github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin @@ -384,7 +385,7 @@ github.com/valyala/fastrand # github.com/valyala/histogram v1.2.0 ## explicit; go 1.12 github.com/valyala/histogram -# github.com/xtaci/smux v1.5.56 +# github.com/xtaci/smux v1.5.57 ## explicit; go 1.18 github.com/xtaci/smux # go.mongodb.org/mongo-driver/v2 v2.5.0 @@ -433,11 +434,11 @@ go.opentelemetry.io/otel/trace go.opentelemetry.io/otel/trace/embedded go.opentelemetry.io/otel/trace/internal/telemetry go.opentelemetry.io/otel/trace/noop -# golang.org/x/arch v0.24.0 -## explicit; go 1.24.0 +# golang.org/x/arch v0.25.0 +## explicit; go 1.25.0 golang.org/x/arch/x86/x86asm -# golang.org/x/crypto v0.48.0 -## explicit; go 1.24.0 +# golang.org/x/crypto v0.49.0 +## explicit; go 1.25.0 golang.org/x/crypto/blake2b golang.org/x/crypto/blake2s golang.org/x/crypto/chacha20 @@ -447,7 +448,7 @@ golang.org/x/crypto/hkdf golang.org/x/crypto/internal/alias golang.org/x/crypto/internal/poly1305 golang.org/x/crypto/sha3 -# golang.org/x/net v0.51.0 +# golang.org/x/net v0.52.0 ## explicit; go 1.25.0 golang.org/x/net/bpf golang.org/x/net/context @@ -465,17 +466,17 @@ golang.org/x/net/ipv4 golang.org/x/net/ipv6 golang.org/x/net/nettest golang.org/x/net/proxy -# golang.org/x/sys v0.41.0 -## explicit; go 1.24.0 +# golang.org/x/sys v0.42.0 +## explicit; go 1.25.0 golang.org/x/sys/cpu golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.40.0 -## explicit; go 1.24.0 +# golang.org/x/term v0.41.0 +## explicit; go 1.25.0 golang.org/x/term -# golang.org/x/text v0.34.0 -## explicit; go 1.24.0 +# golang.org/x/text v0.35.0 +## explicit; go 1.25.0 golang.org/x/text/internal/language golang.org/x/text/internal/language/compact golang.org/x/text/internal/tag @@ -484,8 +485,6 @@ golang.org/x/text/secure/bidirule golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm -# google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d -## explicit; go 1.25.0 # google.golang.org/protobuf v1.36.11 ## explicit; go 1.23 google.golang.org/protobuf/encoding/protowire @@ -506,10 +505,11 @@ google.golang.org/protobuf/runtime/protoiface gopkg.in/yaml.v3 # gotest.tools/v3 v3.5.2 ## explicit; go 1.17 -# mvdan.cc/sh/v3 v3.12.0 -## explicit; go 1.23.0 +# mvdan.cc/sh/v3 v3.13.0 +## explicit; go 1.25.0 mvdan.cc/sh/v3/expand mvdan.cc/sh/v3/fileutil +mvdan.cc/sh/v3/internal mvdan.cc/sh/v3/pattern mvdan.cc/sh/v3/shell mvdan.cc/sh/v3/syntax diff --git a/vendor/mvdan.cc/sh/v3/expand/arith.go b/vendor/mvdan.cc/sh/v3/expand/arith.go index f01856136..6865a8840 100644 --- a/vendor/mvdan.cc/sh/v3/expand/arith.go +++ b/vendor/mvdan.cc/sh/v3/expand/arith.go @@ -67,8 +67,10 @@ func Arithm(cfg *Config, expr syntax.ArithmExpr) (int, error) { return ^val, nil case syntax.Plus: return val, nil - default: // syntax.Minus + case syntax.Minus: return -val, nil + default: + return 0, fmt.Errorf("unsupported unary arithmetic operator: %q", expr.Op) } case *syntax.BinaryArithm: switch expr.Op { @@ -218,8 +220,10 @@ func binArit(op syntax.BinAritOperator, x, y int) (int, error) { return oneIf(x != 0 && y != 0), nil case syntax.OrArit: return oneIf(x != 0 || y != 0), nil - default: // syntax.Comma + case syntax.Comma: // x is executed but its result discarded return y, nil + default: + return 0, fmt.Errorf("unsupported binary arithmetic operator: %q", op) } } diff --git a/vendor/mvdan.cc/sh/v3/expand/environ.go b/vendor/mvdan.cc/sh/v3/expand/environ.go index b7305d065..51fea7354 100644 --- a/vendor/mvdan.cc/sh/v3/expand/environ.go +++ b/vendor/mvdan.cc/sh/v3/expand/environ.go @@ -54,7 +54,7 @@ type WriteEnviron interface { Set(name string, vr Variable) error } -//go:generate stringer -type=ValueKind +//go:generate go tool stringer -type=ValueKind // ValueKind describes which kind of value the variable holds. // While most unset variables will have an [Unknown] kind, an unset variable may @@ -116,6 +116,27 @@ func (v Variable) Declared() bool { return v.Set || v.Local || v.Exported || v.ReadOnly || v.Kind != Unknown } +// Flags returns the variable's attribute flags in the order used by bash's +// declare builtin and ${var@a}: type (a/A/n), readonly (r), exported (x). +func (v Variable) Flags() string { + var flags []byte + switch v.Kind { + case Indexed: + flags = append(flags, 'a') + case Associative: + flags = append(flags, 'A') + case NameRef: + flags = append(flags, 'n') + } + if v.ReadOnly { + flags = append(flags, 'r') + } + if v.Exported { + flags = append(flags, 'x') + } + return string(flags) +} + // String returns the variable's value as a string. In general, this only makes // sense if the variable has a string value or no value at all. func (v Variable) String() string { @@ -179,23 +200,14 @@ func (f funcEnviron) Each(func(name string, vr Variable) bool) {} // On Windows, where environment variable names are case-insensitive, the // resulting variable names will all be uppercase. func ListEnviron(pairs ...string) Environ { - return listEnvironWithUpper(runtime.GOOS == "windows", pairs...) + return listEnviron_(runtime.GOOS == "windows", pairs...) } -// listEnvironWithUpper implements [ListEnviron], but letting the tests specify +// listEnviron_ implements [ListEnviron], but letting the tests specify // whether to uppercase all names or not. -func listEnvironWithUpper(upper bool, pairs ...string) Environ { +func listEnviron_(caseInsensitive bool, pairs ...string) Environ { list := slices.Clone(pairs) - if upper { - // Uppercase before sorting, so that we can remove duplicates - // without the need for linear search nor a map. - for i, s := range list { - if name, val, ok := strings.Cut(s, "="); ok { - list[i] = strings.ToUpper(name) + "=" + val - } - } - } - + env := listEnviron{caseInsensitive: caseInsensitive} slices.SortStableFunc(list, func(a, b string) int { isep := strings.IndexByte(a, '=') jsep := strings.IndexByte(b, '=') @@ -209,7 +221,7 @@ func listEnvironWithUpper(upper bool, pairs ...string) Environ { } else { jsep += 1 } - return strings.Compare(a[:isep], b[:jsep]) + return env.compare(a[:isep], b[:jsep]) }) last := "" @@ -220,7 +232,7 @@ func listEnvironWithUpper(upper bool, pairs ...string) Environ { list = slices.Delete(list, i, i+1) continue } - if last == name { + if env.compare(last, name) == 0 { // duplicate; the last one wins list = slices.Delete(list, i-1, i) continue @@ -228,36 +240,50 @@ func listEnvironWithUpper(upper bool, pairs ...string) Environ { last = name i++ } - return listEnviron(list) + env.pairs = list + return env } // listEnviron is a sorted list of "name=value" strings. -type listEnviron []string +type listEnviron struct { + caseInsensitive bool + pairs []string +} + +func (l listEnviron) compare(a, b string) int { + if l.caseInsensitive { + // This is not particularly efficient, but it does the job. + // If we had a cmp-compatible version of [strings.EqualFold], we'd use it. + a = strings.ToUpper(a) + b = strings.ToUpper(b) + } + return strings.Compare(a, b) +} func (l listEnviron) Get(name string) Variable { eqpos := len(name) endpos := len(name) + 1 - i, ok := slices.BinarySearchFunc(l, name, func(l, name string) int { - if len(l) < endpos { + i, ok := slices.BinarySearchFunc(l.pairs, name, func(pair, name string) int { + if len(pair) < endpos { // Too short; see if we are before or after the name. - return strings.Compare(l, name) + return l.compare(pair, name) } // Compare the name prefix, then the equal character. - c := strings.Compare(l[:eqpos], name) - eq := l[eqpos] + c := l.compare(pair[:eqpos], name) + eq := pair[eqpos] if c == 0 { return cmp.Compare(eq, '=') } return c }) if ok { - return Variable{Set: true, Exported: true, Kind: String, Str: l[i][endpos:]} + return Variable{Set: true, Exported: true, Kind: String, Str: l.pairs[i][endpos:]} } return Variable{} } func (l listEnviron) Each(fn func(name string, vr Variable) bool) { - for _, pair := range l { + for _, pair := range l.pairs { name, value, ok := strings.Cut(pair, "=") if !ok { // should never happen; see listEnvironWithUpper diff --git a/vendor/mvdan.cc/sh/v3/expand/expand.go b/vendor/mvdan.cc/sh/v3/expand/expand.go index 48ebfbfcb..b51c1b21f 100644 --- a/vendor/mvdan.cc/sh/v3/expand/expand.go +++ b/vendor/mvdan.cc/sh/v3/expand/expand.go @@ -20,6 +20,7 @@ import ( "strconv" "strings" + "mvdan.cc/sh/v3/internal" "mvdan.cc/sh/v3/pattern" "mvdan.cc/sh/v3/syntax" ) @@ -49,9 +50,6 @@ type Config struct { CmdSubst func(io.Writer, *syntax.CmdSubst) error // ProcSubst expands a process substitution node. - // - // Note that this feature is a work in progress, and the signature of - // this field might change until #451 is completely fixed. ProcSubst func(*syntax.ProcSubst) (string, error) // TODO(v4): replace ReadDir with ReadDir2. @@ -66,22 +64,29 @@ type Config struct { // Use [os.ReadDir] to use the filesystem directly. ReadDir2 func(string) ([]fs.DirEntry, error) - // GlobStar corresponds to the shell option that allows globbing with - // "**". + // GlobStar corresponds to the shell option which allows globbing with "**". GlobStar bool - // NoCaseGlob corresponds to the shell option that causes case-insensitive + // DotGlob corresponds to the shell option which allows filenames beginning + // with a dot to be matched by a pattern which does not begin with a dot. + DotGlob bool + + // NoCaseGlob corresponds to the shell option which causes case-insensitive // pattern matching in pathname expansion. NoCaseGlob bool - // NullGlob corresponds to the shell option that allows globbing + // NullGlob corresponds to the shell option which allows globbing // patterns which match nothing to result in zero fields. NullGlob bool - // NoUnset corresponds to the shell option that treats unset variables + // NoUnset corresponds to the shell option which treats unset variables // as errors. NoUnset bool + // ExtGlob corresponds to the shell option which allows using extended + // pattern matching features when performing pathname expansion (globbing). + ExtGlob bool + bufferAlloc strings.Builder fieldAlloc [4]fieldPart fieldsAlloc [4][]fieldPart @@ -233,6 +238,9 @@ func Pattern(cfg *Config, word *syntax.Word) (string, error) { // shell's format specifications. These include printf(1), among others. // // The resulting string is returned, along with the number of arguments used. +// Note that the resulting string may contain null bytes, for example +// if the format string used `\x00`. The caller should terminate the string +// at the first null byte if needed, such as when expanding for `$'foo\x00bar'`. // // The config specifies shell expansion options; nil behaves the same as an // empty config. @@ -252,13 +260,12 @@ func formatInto(sb *strings.Builder, format string, args []string) (int, error) var fmts []byte initialArgs := len(args) -formatLoop: for i := 0; i < len(format); i++ { // readDigits reads from 0 to max digits, either octal or // hexadecimal. readDigits := func(max int, hex bool) string { j := 0 - for ; j < max; j++ { + for ; j < max && i+j < len(format); j++ { c := format[i+j] if (c >= '0' && c <= '9') || (hex && c >= 'a' && c <= 'f') || @@ -276,6 +283,10 @@ formatLoop: switch { case c == '\\': // escaped i++ + if i >= len(format) { + sb.WriteByte('\\') + break + } switch c = format[i]; c { case 'a': // bell sb.WriteByte('\a') @@ -313,11 +324,6 @@ formatLoop: if len(digits) > 0 { // can't error n, _ := strconv.ParseUint(digits, 16, 32) - if n == 0 { - // If we're about to print \x00, - // stop the entire loop, like bash. - break formatLoop - } if c == 'x' { // always as a single byte sb.WriteByte(byte(n)) @@ -449,7 +455,7 @@ func Fields(cfg *Config, words ...*syntax.Word) ([]string, error) { // FieldsSeq expands a number of words as if they were arguments in a shell // command. This includes brace expansion, tilde expansion, parameter expansion, -// command substitution, arithmetic expansion, and quote removal. +// command substitution, arithmetic expansion, quote removal, and globbing. func FieldsSeq(cfg *Config, words ...*syntax.Word) iter.Seq2[string, error] { cfg = prepareConfig(cfg) dir := cfg.envGet("PWD") @@ -544,12 +550,13 @@ func (cfg *Config) wordField(wps []syntax.WordPart, ql quoteLevel) ([]fieldPart, } s = sb.String() } - s, _, _ = strings.Cut(s, "\x00") + s, _, _ = strings.Cut(s, "\x00") // TODO: why is this needed? field = append(field, fieldPart{val: s}) case *syntax.SglQuoted: fp := fieldPart{quote: quoteSingle, val: wp.Value} if wp.Dollar { fp.val, _, _ = Format(cfg, fp.val, nil) + fp.val, _, _ = strings.Cut(fp.val, "\x00") // cut the string if format included \x00 } field = append(field, fp) case *syntax.DblQuoted: @@ -586,7 +593,10 @@ func (cfg *Config) wordField(wps []syntax.WordPart, ql quoteLevel) ([]fieldPart, } field = append(field, fieldPart{val: path}) case *syntax.ExtGlob: - return nil, fmt.Errorf("extended globbing is not supported") + // Like how [Config.wordFields] deals with [syntax.ExtGlob], + // except that we allow these through even when [Config.ExtGlob] + // is false, as it only applies to pathname expansion. + field = append(field, fieldPart{val: wp.Op.String() + wp.Pattern.Value + ")"}) default: panic(fmt.Sprintf("unhandled word part: %T", wp)) } @@ -669,6 +679,7 @@ func (cfg *Config) wordFields(wps []syntax.WordPart) ([][]fieldPart, error) { fp := fieldPart{quote: quoteSingle, val: wp.Value} if wp.Dollar { fp.val, _, _ = Format(cfg, fp.val, nil) + fp.val, _, _ = strings.Cut(fp.val, "\x00") // cut the string if format included \x00 } curField = append(curField, fp) case *syntax.DblQuoted: @@ -721,7 +732,17 @@ func (cfg *Config) wordFields(wps []syntax.WordPart) ([][]fieldPart, error) { } splitAdd(path) case *syntax.ExtGlob: - return nil, fmt.Errorf("extended globbing is not supported") + if !cfg.ExtGlob { + return nil, fmt.Errorf("extended globbing operator used without the \"extglob\" option set") + } + // We don't translate or interpret the pattern here in any way; + // that's done later when globbing takes place via [pattern.Regexp]. + // Here, all we do is keep the extended globbing expression in string form. + // + // TODO(v4): perhaps the syntax parser should keep extended globbing expressions + // as plain literal strings, because a custom node is not particularly helpful. + // It's not like other globbing operators like `*` or `**` get their own nodes. + curField = append(curField, fieldPart{val: wp.Op.String() + wp.Pattern.Value + ")"}) default: panic(fmt.Sprintf("unhandled word part: %T", wp)) } @@ -736,7 +757,7 @@ func (cfg *Config) wordFields(wps []syntax.WordPart) ([][]fieldPart, error) { // quotedElemFields returns the list of elements resulting from a quoted // parameter expansion that should be treated especially, like "${foo[@]}". func (cfg *Config) quotedElemFields(pe *syntax.ParamExp) []string { - if pe == nil || pe.Length || pe.Width { + if pe == nil || pe.Length || pe.Width || pe.IsSet { return nil } name := pe.Param.Value @@ -765,27 +786,74 @@ func (cfg *Config) quotedElemFields(pe *syntax.ParamExp) []string { return nil } switch name { - case "*": // "${*}" - return []string{cfg.ifsJoin(cfg.Env.Get(name).List)} - case "@": // "${@}" - return cfg.Env.Get(name).List + case "*": // "${*}" or "${*:offset:length}" + return []string{cfg.ifsJoin(cfg.sliceElems(pe, cfg.Env.Get(name).List, true))} + case "@": // "${@}" or "${@:offset:length}" + return cfg.sliceElems(pe, cfg.Env.Get(name).List, true) } switch nodeLit(pe.Index) { case "@": // "${name[@]}" - switch vr := cfg.Env.Get(name); vr.Kind { + vr := cfg.Env.Get(name) + switch vr.Kind { case Indexed: - return vr.List + return cfg.sliceElems(pe, vr.List, false) case Associative: return slices.Collect(maps.Values(vr.Map)) + case Unknown: + if !vr.IsSet() { + // An unset variable expanded as "${name[@]}" produces + // zero fields, just like an empty array. + return []string{} + } } case "*": // "${name[*]}" if vr := cfg.Env.Get(name); vr.Kind == Indexed { - return []string{cfg.ifsJoin(vr.List)} + return []string{cfg.ifsJoin(cfg.sliceElems(pe, vr.List, false))} } } return nil } +// sliceElems applies ${var:offset:length} slicing to a list of elements. +// When positional is true, $0 is prepended to the list before slicing. +// In bash, positional parameter offsets ($@ and $*) are 1-based and +// offset 0 includes $0 (the shell or script name). Negative offsets +// count from $# + 1, so $0 is reachable via large enough negative values. +func (cfg *Config) sliceElems(pe *syntax.ParamExp, elems []string, positional bool) []string { + if pe.Slice == nil { + return elems + } + if positional { + elems = append([]string{cfg.Env.Get("0").Str}, elems...) + } + slicePos := func(n int) int { + if n < 0 { + n = len(elems) + n + if n < 0 { + n = len(elems) + } + } else if n > len(elems) { + n = len(elems) + } + return n + } + if pe.Slice.Offset != nil { + offset, err := Arithm(cfg, pe.Slice.Offset) + if err != nil { + return elems + } + elems = elems[slicePos(offset):] + } + if pe.Slice.Length != nil { + length, err := Arithm(cfg, pe.Slice.Length) + if err != nil { + return elems + } + elems = elems[:slicePos(length)] + } + return elems +} + func (cfg *Config) expandUser(field string, moreFields bool) (prefix, rest string) { name, ok := strings.CutPrefix(field, "~") if !ok { @@ -843,7 +911,10 @@ func findAllIndex(pat, name string, n int) [][]int { return rx.FindAllStringIndex(name, n) } -var rxGlobStar = regexp.MustCompile(".*") +var ( + rxGlobStar = regexp.MustCompile(`^[^/.][^/]*$`) + rxGlobStarDotGlob = regexp.MustCompile(`^[^/]*$`) +) // pathJoin2 is a simpler version of [filepath.Join] without cleaning the result, // since that's needed for globbing. @@ -940,7 +1011,7 @@ func (cfg *Config) glob(base, pat string) ([]string, error) { stack := make([]string, 0, len(matches)) for _, match := range slices.Backward(matches) { // "a/**" should match "a/ a/b a/b/cfg ..."; - // note how the zero-match case has a trailing separator. + // note how the zero-match case there has a trailing separator. stack = append(stack, pathJoin2(match, "")) } matches = matches[:0] @@ -948,15 +1019,15 @@ func (cfg *Config) glob(base, pat string) ([]string, error) { for len(stack) > 0 { dir := stack[len(stack)-1] stack = stack[:len(stack)-1] - - // Don't include the original "" match as it's not a valid path. - if dir != "" { - matches = append(matches, dir) - } + matches = append(matches, dir) // If dir is not a directory, we keep the stack as-is and continue. newMatches = newMatches[:0] - newMatches, _ = cfg.globDir(base, dir, rxGlobStar, wantDir, newMatches) + rx := rxGlobStar.MatchString + if cfg.DotGlob { + rx = rxGlobStarDotGlob.MatchString + } + newMatches, _ = cfg.globDir(base, dir, rx, wantDir, newMatches) for _, match := range slices.Backward(newMatches) { stack = append(stack, match) } @@ -967,24 +1038,36 @@ func (cfg *Config) glob(base, pat string) ([]string, error) { if cfg.NoCaseGlob { mode |= pattern.NoGlobCase } - expr, err := pattern.Regexp(part, mode) + if cfg.DotGlob { + mode |= pattern.GlobLeadingDot + } + if cfg.ExtGlob { + mode |= pattern.ExtendedOperators + } + matcher, err := internal.ExtendedPatternMatcher(part, mode) if err != nil { return nil, err } - rx := regexp.MustCompile(expr) var newMatches []string for _, dir := range matches { - newMatches, err = cfg.globDir(base, dir, rx, wantDir, newMatches) + newMatches, err = cfg.globDir(base, dir, matcher, wantDir, newMatches) if err != nil { return nil, err } } matches = newMatches } + // Note that the results need to be sorted. + // TODO: above we do a BFS; if we did a DFS, the matches would already be sorted. + slices.Sort(matches) + // Remove any empty matches left behind from "**". + if len(matches) > 0 && matches[0] == "" { + matches = matches[1:] + } return matches, nil } -func (cfg *Config) globDir(base, dir string, rx *regexp.Regexp, wantDir bool, matches []string) ([]string, error) { +func (cfg *Config) globDir(base, dir string, matcher func(string) bool, wantDir bool, matches []string) ([]string, error) { fullDir := dir if !filepath.IsAbs(dir) { fullDir = filepath.Join(base, dir) @@ -1011,7 +1094,7 @@ func (cfg *Config) globDir(base, dir string, rx *regexp.Regexp, wantDir bool, ma // Not a symlink nor a directory. continue } - if rx.MatchString(name) { + if matcher(name) { matches = append(matches, pathJoin2(dir, name)) } } diff --git a/vendor/mvdan.cc/sh/v3/expand/param.go b/vendor/mvdan.cc/sh/v3/expand/param.go index 757a5dff0..c248d117b 100644 --- a/vendor/mvdan.cc/sh/v3/expand/param.go +++ b/vendor/mvdan.cc/sh/v3/expand/param.go @@ -24,6 +24,8 @@ func nodeLit(node syntax.Node) string { return "" } +// UnsetParameterError is returned when a parameter expansion encounters an +// unset variable and [Config.NoUnset] has been set. type UnsetParameterError struct { Node *syntax.ParamExp Message string @@ -113,24 +115,7 @@ func (cfg *Config) paramExp(pe *syntax.ParamExp) (string, error) { case Indexed: indexAllElements = true callVarInd = false - elems = vr.List - slicePos := func(n int) int { - if n < 0 { - n = len(elems) + n - if n < 0 { - n = len(elems) - } - } else if n > len(elems) { - n = len(elems) - } - return n - } - if pe.Slice != nil && pe.Slice.Offset != nil { - elems = elems[slicePos(sliceOffset):] - } - if pe.Slice != nil && pe.Slice.Length != nil { - elems = elems[:slicePos(sliceLen)] - } + elems = cfg.sliceElems(pe, vr.List, name == "@" || name == "*") str = strings.Join(elems, " ") } } @@ -179,6 +164,10 @@ func (cfg *Config) paramExp(pe *syntax.ParamExp) (string, error) { } slices.Sort(strs) str = strings.Join(strs, " ") + case pe.Width: + return "", fmt.Errorf("unsupported") + case pe.IsSet: + return "", fmt.Errorf("unsupported") case pe.Slice != nil: if callVarInd { slicePos := func(n int) int { @@ -328,8 +317,24 @@ func (cfg *Config) paramExp(pe *syntax.ParamExp) (string, error) { rns = append(rns, rn) } str = string(rns) - case "P", "A", "a": - panic(fmt.Sprintf("unhandled @%s param expansion", arg)) + case "a": + // ${var@a} returns variable attribute flags. + // We use orig (before nameref resolve) for the attributes. + str = orig.Flags() + case "A": + // ${var@A} returns a declare statement that recreates the variable. + flags := orig.Flags() + quoted, err := syntax.Quote(str, syntax.LangBash) + if err != nil { + return "", err + } + if flags == "" { + str = fmt.Sprintf("%s=%s", name, quoted) + } else { + str = fmt.Sprintf("declare -%s %s=%s", flags, name, quoted) + } + case "P": + // TODO: implement prompt expansion (\u, \h, \w, etc.). default: panic(fmt.Sprintf("unexpected @%s param expansion", arg)) } diff --git a/vendor/mvdan.cc/sh/v3/expand/valuekind_string.go b/vendor/mvdan.cc/sh/v3/expand/valuekind_string.go index b98f03ef3..f5a6d1095 100644 --- a/vendor/mvdan.cc/sh/v3/expand/valuekind_string.go +++ b/vendor/mvdan.cc/sh/v3/expand/valuekind_string.go @@ -21,8 +21,9 @@ const _ValueKind_name = "UnknownStringNameRefIndexedAssociativeKeepValue" var _ValueKind_index = [...]uint8{0, 7, 13, 20, 27, 38, 47} func (i ValueKind) String() string { - if i >= ValueKind(len(_ValueKind_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_ValueKind_index)-1 { return "ValueKind(" + strconv.FormatInt(int64(i), 10) + ")" } - return _ValueKind_name[_ValueKind_index[i]:_ValueKind_index[i+1]] + return _ValueKind_name[_ValueKind_index[idx]:_ValueKind_index[idx+1]] } diff --git a/vendor/mvdan.cc/sh/v3/internal/pattern.go b/vendor/mvdan.cc/sh/v3/internal/pattern.go new file mode 100644 index 000000000..d25796753 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/internal/pattern.go @@ -0,0 +1,77 @@ +// Copyright (c) 2026, Daniel Martí +// See LICENSE for licensing information + +package internal + +import ( + "errors" + "fmt" + "regexp" + "strings" + + "mvdan.cc/sh/v3/pattern" +) + +// ExtendedPatternMatcher returns a [regexp.Regexp.MatchString]-like function +// to support !(pattern-list) extended patterns where possible. +// It can be used instead of [pattern.Regexp] for narrow use cases. +func ExtendedPatternMatcher(pat string, mode pattern.Mode) (func(string) bool, error) { + if mode&pattern.ExtendedOperators != 0 && mode&pattern.EntireString == 0 { + // In the future we could try to support !(pattern) without matching + // the entire input, ensuring we add enough test cases. + panic("ExtendedOperators is only supported with EntireString") + } + + // Extended pattern matching operators are always on outside of pathname expansion. + expr, err := pattern.Regexp(pat, mode) + if err != nil { + // Handle !(pattern-list) negation: when Regexp returns NegExtglobError, + // match the inner pattern and negate the result. + var negErr *pattern.NegExtGlobError + if !errors.As(err, &negErr) { + return nil, err + } + return extNegatedMatcher(pat, negErr.Groups) + } + rx := regexp.MustCompile(expr) + return rx.MatchString, nil +} + +// extNegatedMatcher handles !(pattern-list) extglob negation. +// Only a single !(...) group with fixed-string prefix and suffix is supported. +func extNegatedMatcher(pat string, groups []pattern.NegExtGlobGroup) (func(string) bool, error) { + if len(groups) != 1 { + return nil, fmt.Errorf("multiple extglob !(...) groups are not supported yet") + } + g := groups[0] + prefix := pat[:g.Start] + suffix := pat[g.End:] + + if pattern.HasMeta(prefix, 0) || pattern.HasMeta(suffix, 0) { + return nil, fmt.Errorf("extglob !(...) is only supported with a fixed prefix and suffix") + } + + // Use @(inner) to compile the pattern list, then negate the match. + inner := pat[g.Start+len("!(") : g.End-len(")")] + expr, err := pattern.Regexp("@("+inner+")", pattern.EntireString|pattern.ExtendedOperators) + if err != nil { + return nil, err + } + rx := regexp.MustCompile(expr) + + return func(name string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if !strings.HasSuffix(name, suffix) { + return false + } + end := len(name) - len(suffix) + if end < len(prefix) { + return false // prefix and suffix overlap in name + } + middle := name[len(prefix):end] + + return !rx.MatchString(middle) + }, nil +} diff --git a/vendor/mvdan.cc/sh/v3/internal/testing.go b/vendor/mvdan.cc/sh/v3/internal/testing.go new file mode 100644 index 000000000..d9907c809 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/internal/testing.go @@ -0,0 +1,52 @@ +// Copyright (c) 2026, Daniel Martí +// See LICENSE for licensing information + +package internal + +import ( + "os" + "os/exec" + "path/filepath" + "strings" +) + +// TestMainSetup is used by the integration tests running shell scripts +// either via our interpreter or via real shells, +// to ensure a reasonably clean and consistent environment. +func TestMainSetup() { + // Set the locale to computer-friendly English and UTF-8. + // Some systems like macOS miss C.UTF8, so fall back to the US English locale. + if out, _ := exec.Command("locale", "-a").Output(); strings.Contains( + strings.ToLower(string(out)), "c.utf", + ) { + os.Setenv("LANGUAGE", "C.UTF-8") + os.Setenv("LC_ALL", "C.UTF-8") + } else { + os.Setenv("LANGUAGE", "en_US.UTF-8") + os.Setenv("LC_ALL", "en_US.UTF-8") + } + + // Bash prints the pwd after changing directories when CDPATH is set. + os.Unsetenv("CDPATH") + + pathDir, err := os.MkdirTemp("", "interp-bin-") + if err != nil { + panic(err) + } + + // These short names are commonly used as variables. + // Ensure they are unset as env vars. + // We can't easily remove names from $PATH, + // so do the next best thing: override each name with a failing script. + for _, s := range []string{ + "a", "b", "c", "d", "e", "f", "foo", "bar", + } { + os.Unsetenv(s) + pathFile := filepath.Join(pathDir, s) + if err := os.WriteFile(pathFile, []byte("#!/bin/sh\necho NO_SUCH_COMMAND; exit 1"), 0o777); err != nil { + panic(err) + } + } + + os.Setenv("PATH", pathDir+string(os.PathListSeparator)+os.Getenv("PATH")) +} diff --git a/vendor/mvdan.cc/sh/v3/pattern/pattern.go b/vendor/mvdan.cc/sh/v3/pattern/pattern.go index 6c8847673..51118b8b5 100644 --- a/vendor/mvdan.cc/sh/v3/pattern/pattern.go +++ b/vendor/mvdan.cc/sh/v3/pattern/pattern.go @@ -29,16 +29,36 @@ func (e SyntaxError) Error() string { return e.msg } func (e SyntaxError) Unwrap() error { return e.err } +// NegExtGlobGroup represents the byte offset range of a single !(expr) group +// within a pattern string. Start is the offset of '!', End is one past ')'. +type NegExtGlobGroup struct { + Start, End int +} + +// NegExtGlobError is returned by [Regexp] when an extglob negation operator +// !(pattern-list) is encountered, as Go's [regexp] package does not support +// negative lookahead. Callers can handle this by negating the result of +// matching the inner pattern. +type NegExtGlobError struct { + Groups []NegExtGlobGroup +} + +func (e *NegExtGlobError) Error() string { + return "extglob !(...) is not supported in this scenario" +} + // TODO(v4): flip NoGlobStar to be opt-in via GlobStar, matching bash // TODO(v4): flip EntireString to be opt-out via PartialMatch, as EntireString causes subtle bugs when forgotten // TODO(v4): rename NoGlobCase to CaseInsensitive for readability const ( - Shortest Mode = 1 << iota // prefer the shortest match. - Filenames // "*" and "?" don't match slashes; only "**" does - EntireString // match the entire string using ^$ delimiters - NoGlobCase // Do case-insensitive match (that is, use (?i) in the regexp) - NoGlobStar // Do not support "**" + Shortest Mode = 1 << iota // prefer the shortest match. + Filenames // "*" and "?" don't match slashes; only "**" does; only makes sense with EntireString too + EntireString // match the entire string using ^$ delimiters + NoGlobCase // do case-insensitive match (that is, use (?i) in the regexp); shopt "nocaseglob" + NoGlobStar // do not support "**"; negated shopt "globstar" + GlobLeadingDot // let wildcards match leading dots in filenames; shopt "dotglob" + ExtendedOperators // support extended pattern matching operators; shopt "extglob" for pathname expansion ) // Regexp turns a shell pattern into a regular expression that can be used with @@ -73,27 +93,35 @@ func Regexp(pat string, mode Mode) (string, error) { } var sb strings.Builder // Enable matching `\n` with the `.` metacharacter as globs match `\n` - sb.WriteString("(?s") + sb.WriteString(`(?s`) if mode&NoGlobCase != 0 { - sb.WriteString("i") + sb.WriteString(`i`) } if mode&Shortest != 0 { - sb.WriteString("U") + sb.WriteString(`U`) } - sb.WriteString(")") + sb.WriteString(`)`) if mode&EntireString != 0 { - sb.WriteString("^") + sb.WriteString(`^`) } sl := stringLexer{s: pat} + var negGroups []NegExtGlobGroup for { if err := regexpNext(&sb, &sl, mode); err == io.EOF { break } else if err != nil { - return "", err + negErr, ok := err.(*NegExtGlobError) + if !ok { + return "", err + } + negGroups = append(negGroups, negErr.Groups...) } } + if len(negGroups) > 0 { + return "", &NegExtGlobError{Groups: negGroups} + } if mode&EntireString != 0 { - sb.WriteString("$") + sb.WriteString(`$`) } return sb.String(), nil } @@ -134,13 +162,53 @@ func (sl *stringLexer) peekRest() string { } func regexpNext(sb *strings.Builder, sl *stringLexer, mode Mode) error { - switch c := sl.next(); c { + c := sl.next() + if mode&ExtendedOperators != 0 { + // Handle extended pattern matching operators separately, + // given that they can be one of many two-character prefixes. + // Note that we recurse into the same function in a loop, + // as each of the patterns in the list separated by '|' is a regular pattern. + switch op := c; op { + case '!', '?', '*', '+', '@': + if sl.peekNext() != '(' { + break + } + start := sl.i - 1 // position of the operator + sb.WriteByte(sl.next()) // ( + nestedLoop: + for { + switch sl.peekNext() { + case ')': + break nestedLoop + case '|': + // extended operators support a list of "or" separated expressions + sb.WriteByte(sl.next()) + continue + } + if err := regexpNext(sb, sl, mode); err == io.EOF { + break + } else if err != nil { + return err + } + } + sb.WriteByte(sl.next()) // ) + if op == '!' { + return &NegExtGlobError{Groups: []NegExtGlobGroup{{Start: start, End: sl.i}}} + } + if op != '@' { + // @( is [syntax.GlobOne] for matching once; no suffix needed + sb.WriteByte(op) + } + return nil + } + } + switch c { case '\x00': return io.EOF case '*': if mode&Filenames == 0 { // * - matches anything when not in filename mode - sb.WriteString(".*") + sb.WriteString(`.*`) break } // "**" only acts as globstar if it is alone as a path element. @@ -149,27 +217,37 @@ func regexpNext(sb *strings.Builder, sl *stringLexer, mode Mode) error { sl.i++ singleAfter := sl.i == len(sl.s) || sl.peekNext() == '/' if mode&NoGlobStar == 0 && singleBefore && singleAfter { - if sl.peekNext() == '/' { + // ** - match any number of slashes or "*" path elements + slashSuffix := sl.peekNext() == '/' + if slashSuffix { // **/ - like "**" but requiring a trailing slash when matching sl.i++ - sb.WriteString("((/|[^/.][^/]*)*/)?") + // wrap the expression to ensure that any match has a slash suffix + sb.WriteString(`(`) + } + if mode&GlobLeadingDot == 0 { + sb.WriteString(`(/|[^/.][^/]*)*`) } else { - // ** - match any number of slashes or "*" path elements - sb.WriteString("(/|[^/.][^/]*)*") + // with GlobLeadingDot (dotglob), match anything at all + sb.WriteString(`.*`) + } + if slashSuffix { + sb.WriteString(`/)?`) } break } // foo**, **bar, or NoGlobStar - behaves like "*" below } // * - matches anything except slashes and leading dots - if singleBefore { - sb.WriteString("([^/.][^/]*)?") + if singleBefore && mode&GlobLeadingDot == 0 { + sb.WriteString(`([^/.][^/]*)?`) } else { - sb.WriteString("[^/]*") + // with GlobLeadingDot (dotglob), match anything except slashes + sb.WriteString(`[^/]*`) } case '?': if mode&Filenames != 0 { - sb.WriteString("[^/]") + sb.WriteString(`[^/]`) } else { sb.WriteByte('.') } @@ -190,11 +268,11 @@ func regexpNext(sb *strings.Builder, sl *stringLexer, mode Mode) error { break } if mode&Filenames != 0 { - for _, c := range sl.peekRest() { - if c == ']' { + for i, c := range sl.peekRest() { + if i > 0 && c == ']' { break } else if c == '/' { - sb.WriteString("\\[") + sb.WriteString(`\[`) return nil } } diff --git a/vendor/mvdan.cc/sh/v3/shell/expand.go b/vendor/mvdan.cc/sh/v3/shell/expand.go index d0114ba6f..f8468cbf8 100644 --- a/vendor/mvdan.cc/sh/v3/shell/expand.go +++ b/vendor/mvdan.cc/sh/v3/shell/expand.go @@ -17,10 +17,10 @@ import ( // // If env is nil, the current environment variables are used. Empty variables // are treated as unset; to support variables which are set but empty, use the -// expand package directly. +// [expand] package directly. // -// Command substitutions like $(echo foo) aren't supported to avoid running -// arbitrary code. To support those, use an interpreter with the expand package. +// Other forms of expansion are not supported in this simple API, such as +// command substitutions like $(echo foo). To support them, use the [expand] package. // // An error will be reported if the input string had invalid syntax. func Expand(s string, env func(string) string) (string, error) { @@ -38,11 +38,15 @@ func Expand(s string, env func(string) string) (string, error) { // Fields performs shell expansion on s as if it were a command's arguments, // using env to resolve variables. It is similar to Expand, but includes brace -// expansion, tilde expansion, and globbing. +// expansion, tilde expansion, and word splitting. // // If env is nil, the current environment variables are used. Empty variables // are treated as unset; to support variables which are set but empty, use the -// expand package directly. +// [expand] package directly. +// +// Other forms of expansion are not supported in this simple API, such as +// globbing and command substitutions like $(echo foo). +// To support them, use the [expand] package. // // An error will be reported if the input string had invalid syntax. func Fields(s string, env func(string) string) ([]string, error) { diff --git a/vendor/mvdan.cc/sh/v3/syntax/braces.go b/vendor/mvdan.cc/sh/v3/syntax/braces.go index 0d32199fb..743b188d1 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/braces.go +++ b/vendor/mvdan.cc/sh/v3/syntax/braces.go @@ -4,6 +4,7 @@ package syntax import ( + "slices" "strconv" "strings" ) @@ -15,10 +16,10 @@ var ( litRightBrace = &Lit{Value: "}"} ) -// SplitBraces parses brace expansions within a word's literal parts. If any -// valid brace expansions are found, they are replaced with BraceExp nodes, and -// the function returns true. Otherwise, the word is left untouched and the -// function returns false. +// SplitBraces parses brace expansions within a word's literal parts. +// If any valid brace expansions are found, they are replaced with BraceExp nodes, +// and the function returns true. +// Otherwise, the word is left untouched and the function returns false. // // For example, a literal word "foo{bar,baz}" will result in a word containing // the literal "foo", and a brace expansion with the elements "bar" and "baz". @@ -26,7 +27,10 @@ var ( // It does not return an error; malformed brace expansions are simply skipped. // For example, the literal word "a{b" is left unchanged. func SplitBraces(word *Word) bool { - if !strings.Contains(word.Lit(), "{") { + if !slices.ContainsFunc(word.Parts, func(part WordPart) bool { + lit, ok := part.(*Lit) + return ok && strings.Contains(lit.Value, "{") + }) { // In the common case where a word has no braces, skip any allocs. return false } @@ -114,9 +118,7 @@ func SplitBraces(word *Word) bool { for i, elem := range br.Elems[:2] { val := elem.Lit() if _, err := strconv.Atoi(val); err == nil { - } else if len(val) == 1 && - (('a' <= val[0] && val[0] <= 'z') || - ('A' <= val[0] && val[0] <= 'Z')) { + } else if len(val) == 1 && asciiLetter(val[0]) { chars[i] = true } else { broken = true diff --git a/vendor/mvdan.cc/sh/v3/syntax/lexer.go b/vendor/mvdan.cc/sh/v3/syntax/lexer.go index f518cf199..3ac72bdff 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/lexer.go +++ b/vendor/mvdan.cc/sh/v3/syntax/lexer.go @@ -9,6 +9,14 @@ import ( "unicode/utf8" ) +func asciiLetter[T rune | byte](r T) bool { + return ('a' <= r && r <= 'z') || ('A' <= r && r <= 'Z') +} + +func asciiDigit[T rune | byte](r T) bool { + return r >= '0' && r <= '9' +} + // bytes that form or start a token func regOps(r rune) bool { switch r { @@ -28,20 +36,11 @@ func paramOps(r rune) bool { return false } -// these start a parameter expansion name -func paramNameOp(r rune) bool { - switch r { - case '}', ':', '+', '=', '%', '[', ']', '/', '^', ',': - return false - } - return true -} - // tokenize these inside arithmetic expansions func arithmOps(r rune) bool { switch r { case '+', '-', '!', '~', '*', '/', '%', '(', ')', '^', '<', '>', ':', '=', - ',', '?', '|', '&', '[', ']', '#': + ',', '?', '|', '&', '[', ']', '#', '.': return true } return false @@ -67,80 +66,91 @@ func (p *Parser) rune() rune { p.col += int64(p.w) bquotes := 0 retry: - if p.bsp < uint(len(p.bs)) { - if b := p.bs[p.bsp]; b < utf8.RuneSelf { - p.bsp++ - switch b { - case '\x00': - // Ignore null bytes while parsing, like bash. + if p.bsp >= uint(len(p.bs)) && p.fill() == 0 { + if len(p.bs) == 0 { + // Necessary for the last position to be correct. + // TODO: this is not exactly intuitive; figure out a better way. + p.bsp = 1 + } + p.r = utf8.RuneSelf + p.w = 1 + return p.r + } + if b := p.bs[p.bsp]; b < utf8.RuneSelf { + p.bsp++ + switch b { + case '\x00': + // Ignore null bytes while parsing, like bash. + p.col++ + goto retry + case '\r': + if p.peek() == '\n' { // \r\n turns into \n p.col++ goto retry - case '\r': - if p.peekByte('\n') { // \r\n turns into \n - p.col++ - goto retry - } - case '\\': - if p.r == '\\' { - } else if p.peekByte('\n') { - p.bsp++ - p.w, p.r = 1, escNewl - return escNewl - } else if p.peekBytes("\r\n") { // \\\r\n turns into \\\n - p.col++ - p.bsp += 2 - p.w, p.r = 2, escNewl - return escNewl - } - if p.openBquotes > 0 && bquotes < p.openBquotes && - p.bsp < uint(len(p.bs)) && bquoteEscaped(p.bs[p.bsp]) { - // We turn backquote command substitutions into $(), - // so we remove the extra backslashes needed by the backquotes. - bquotes++ - p.col++ - goto retry - } } - if b == '`' { - p.lastBquoteEsc = bquotes + case '\\': + if p.r == '\\' { + } else if p.peek() == '\n' { + p.bsp++ + p.w, p.r = 1, escNewl + return escNewl + } else if p1, p2 := p.peekTwo(); p1 == '\r' && p2 == '\n' { // \\\r\n turns into \\\n + p.col++ + p.bsp += 2 + p.w, p.r = 2, escNewl + return escNewl } - if p.litBs != nil { - p.litBs = append(p.litBs, b) + // TODO: why is this necessary to ensure correct position info? + p.readEOF = false + if p.openBquotes > 0 && bquotes < p.openBquotes && + p.bsp < uint(len(p.bs)) && bquoteEscaped(p.bs[p.bsp]) { + // We turn backquote command substitutions into $(), + // so we remove the extra backslashes needed by the backquotes. + bquotes++ + p.col++ + goto retry } - p.w, p.r = 1, rune(b) - return p.r } - if !utf8.FullRune(p.bs[p.bsp:]) { - // we need more bytes to read a full non-ascii rune - p.fill() + if b == '`' { + p.lastBquoteEsc = bquotes } - var w int - p.r, w = utf8.DecodeRune(p.bs[p.bsp:]) if p.litBs != nil { - p.litBs = append(p.litBs, p.bs[p.bsp:p.bsp+uint(w)]...) + p.litBs = append(p.litBs, b) } - p.bsp += uint(w) - if p.r == utf8.RuneError && w == 1 { - p.posErr(p.nextPos(), "invalid UTF-8 encoding") - } - p.w = w - } else { - if p.r == utf8.RuneSelf { - } else if p.fill(); p.bs == nil { - p.bsp++ - p.r = utf8.RuneSelf - p.w = 1 - } else { - goto retry + p.w, p.r = 1, rune(b) + return p.r + } +decodeRune: + var w int + p.r, w = utf8.DecodeRune(p.bs[p.bsp:]) + if p.r == utf8.RuneError && !utf8.FullRune(p.bs[p.bsp:]) { + // we need more bytes to read a full non-ascii rune + if p.fill() > 0 { + goto decodeRune } } + if p.litBs != nil { + p.litBs = append(p.litBs, p.bs[p.bsp:p.bsp+uint(w)]...) + } + p.bsp += uint(w) + if p.r == utf8.RuneError && w == 1 { + p.posErr(p.nextPos(), "invalid UTF-8 encoding") + } + p.w = w return p.r } -// fill reads more bytes from the input src into readBuf. Any bytes that -// had not yet been used at the end of the buffer are slid into the -// beginning of the buffer. -func (p *Parser) fill() { +// fill reads more bytes from the input src into readBuf. +// Any bytes that had not yet been used at the end of the buffer +// are slid into the beginning of the buffer. +// The number of read bytes is returned, which is at least one +// unless a read error occurred, such as [io.EOF]. +func (p *Parser) fill() (n int) { + if p.readEOF || p.r == utf8.RuneSelf { + // If the reader already gave us [io.EOF], do not try again. + // If we decided to stop for any reason, do not bother reading either. + return 0 + } p.offs += int64(p.bsp) left := len(p.bs) - int(p.bsp) copy(p.readBuf[:left], p.readBuf[p.bsp:]) @@ -149,6 +159,9 @@ readAgain: if err == nil { n, err = p.src.Read(p.readBuf[left:]) p.readErr = err + if err == io.EOF { + p.readEOF = true + } } if n == 0 { if err == nil { @@ -167,28 +180,21 @@ readAgain: p.bs = p.readBuf[:left+n] } p.bsp = 0 + return n } func (p *Parser) nextKeepSpaces() { r := p.r if p.quote != hdocBody && p.quote != hdocBodyTabs { - // Heredocs handle escaped newlines in a special way, but others - // do not. + // Heredocs handle escaped newlines in a special way, but others do not. for r == escNewl { r = p.rune() } } p.pos = p.nextPos() switch p.quote { - case paramExpRepl: - switch r { - case '}', '/': - p.tok = p.paramToken(r) - case '`', '"', '$', '\'': - p.tok = p.regToken(r) - default: - p.advanceLitOther(r) - } + case runeByRune: + p.tok = illegalTok case dblQuotes: switch r { case '`', '"', '$': @@ -203,7 +209,14 @@ func (p *Parser) nextKeepSpaces() { default: p.advanceLitHdoc(r) } - default: // paramExpExp: + case paramExpRepl: + if r == '/' { + p.rune() + p.tok = slash + break + } + fallthrough + case paramExpExp: switch r { case '}': p.tok = p.paramToken(r) @@ -213,7 +226,7 @@ func (p *Parser) nextKeepSpaces() { p.advanceLitOther(r) } } - if p.err != nil && p.tok != _EOF { + if p.err != nil { p.tok = _EOF } } @@ -273,19 +286,17 @@ skipSpace: case p.quote&allRegTokens != 0: switch r { case ';', '"', '\'', '(', ')', '$', '|', '&', '>', '<', '`': + if r == '<' && p.lang.in(LangZsh) && p.zshNumRange() { + p.advanceLitNone(r) + return + } p.tok = p.regToken(r) case '#': // If we're parsing $foo#bar, ${foo}#bar, 'foo'#bar, or "foo"#bar, // #bar is a continuation of the same word, not a comment. - // TODO: support $(foo)#bar and `foo`#bar as well, which is slightly tricky, - // as we can't easily tell them apart from (foo)#bar and `#bar`, - // where #bar should remain a comment. - if !p.spaced { - switch p.tok { - case _LitWord, rightBrace, sglQuote, dblQuote: - p.advanceLitNone(r) - return - } + if p.quote == unquotedWordCont && !p.spaced { + p.advanceLitNone(r) + return } r = p.rune() p.newLit(r) @@ -313,9 +324,21 @@ skipSpace: p.litBs = nil } p.next() - case '[', '=': + case '[': if p.quote == arrayElems { - p.tok = p.paramToken(r) + p.rune() + p.tok = leftBrack + } else { + p.advanceLitNone(r) + } + case '=': + if p.peek() == '(' { + p.rune() + p.rune() + p.tok = assgnParen + } else if p.quote == arrayElems { + p.rune() + p.tok = assgn } else { p.advanceLitNone(r) } @@ -330,7 +353,7 @@ skipSpace: p.tok = globPlus case '@': p.tok = globAt - default: // '!' + case '!': p.tok = globExcl } p.rune() @@ -347,7 +370,7 @@ skipSpace: p.tok = p.paramToken(r) case p.quote == testExprRegexp: if !p.rxFirstPart && p.spaced { - p.quote = noState + p.quote = testExpr goto skipSpace } p.rxFirstPart = false @@ -360,7 +383,7 @@ skipSpace: p.advanceLitRe(r) } else { p.tok = rightParen - p.quote = noState + p.quote = testExpr p.rune() // we are tokenizing manually } default: // including '(', '|' @@ -371,7 +394,7 @@ skipSpace: default: p.advanceLitOther(r) } - if p.err != nil && p.tok != _EOF { + if p.err != nil { p.tok = _EOF } } @@ -379,36 +402,53 @@ skipSpace: // extendedGlob determines whether we're parsing a Bash extended globbing expression. // For example, whether `*` or `@` are followed by `(` to form `@(foo)`. func (p *Parser) extendedGlob() bool { + if p.lang.in(LangZsh) { + // Zsh supports Bash extended globs via the KSH_GLOB option. + // In Bash we would parse extended globs as [ExtGlob] nodes, + // but trying to do that in Zsh would cause ambiguity with glob qualifiers. + // Just like glob qualifiers, parse extended globs as literals in Zsh. + return false + } if p.val == "function" { + // We don't support e.g. `function @() { ... }` at the moment, but we could. return false } - if p.peekByte('(') { + if p.peek() == '(' { // NOTE: empty pattern list is a valid globbing syntax like `@()`, // but we'll operate on the "likelihood" that it is a function; // only tokenize if its a non-empty pattern list. // We do this after peeking for just one byte, so that the input `echo *` // followed by a newline does not hang an interactive shell parser until // another byte is input. - return !p.peekBytes("()") + _, p2 := p.peekTwo() + return p2 != ')' } return false } -func (p *Parser) peekBytes(s string) bool { - peekEnd := int(p.bsp) + len(s) - // TODO: This should loop for slow readers, e.g. those providing one byte at - // a time. Use a loop and test it with [testing/iotest.OneByteReader]. - if peekEnd > len(p.bs) { +func (p *Parser) peek() byte { + if int(p.bsp) >= len(p.bs) { p.fill() } - return peekEnd <= len(p.bs) && bytes.HasPrefix(p.bs[p.bsp:peekEnd], []byte(s)) + if int(p.bsp) >= len(p.bs) { + return utf8.RuneSelf + } + return p.bs[p.bsp] } -func (p *Parser) peekByte(b byte) bool { - if p.bsp == uint(len(p.bs)) { +func (p *Parser) peekTwo() (byte, byte) { + // TODO: This should loop for slow readers, e.g. those providing one byte at + // a time. Use a loop and test it with [testing/iotest.OneByteReader]. + if int(p.bsp+1) >= len(p.bs) { p.fill() } - return p.bsp < uint(len(p.bs)) && p.bs[p.bsp] == b + if int(p.bsp) >= len(p.bs) { + return utf8.RuneSelf, utf8.RuneSelf + } + if int(p.bsp+1) >= len(p.bs) { + return p.bs[p.bsp], utf8.RuneSelf + } + return p.bs[p.bsp], p.bs[p.bsp+1] } func (p *Parser) regToken(r rune) token { @@ -429,11 +469,39 @@ func (p *Parser) regToken(r rune) token { p.rune() return andAnd case '>': - if p.rune() == '>' { + switch p.rune() { + case '|': p.rune() + return rdrAllClob + case '!': + if p.lang.in(LangZsh) { + p.rune() + return rdrAllClob + } + case '>': + switch p.rune() { + case '|': + p.rune() + return appAllClob + case '!': + if p.lang.in(LangZsh) { + p.rune() + return appAllClob + } + } return appAll } return rdrAll + case '|': + if p.lang.in(LangZsh) { + p.rune() + return andPipe + } + case '!': + if p.lang.in(LangZsh) { + p.rune() + return andBang + } } return and case '|': @@ -442,7 +510,7 @@ func (p *Parser) regToken(r rune) token { p.rune() return orOr case '&': - if p.lang == LangPOSIX { + if !p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { break } p.rune() @@ -452,13 +520,13 @@ func (p *Parser) regToken(r rune) token { case '$': switch p.rune() { case '\'': - if p.lang == LangPOSIX { + if !p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { break } p.rune() return dollSglQuote case '"': - if p.lang == LangPOSIX { + if !p.lang.in(langBashLike | LangMirBSDKorn) { break } p.rune() @@ -467,7 +535,7 @@ func (p *Parser) regToken(r rune) token { p.rune() return dollBrace case '[': - if !p.lang.isBash() || p.quote == paramExpName { + if !p.lang.in(langBashLike) { // latter to not tokenise ${$[@]} as $[ break } @@ -482,7 +550,7 @@ func (p *Parser) regToken(r rune) token { } return dollar case '(': - if p.rune() == '(' && p.lang != LangPOSIX && p.quote != testExpr { + if p.rune() == '(' && p.lang.in(langBashLike|LangMirBSDKorn|LangZsh) && p.quote != testExpr { p.rune() return dblLeftParen } @@ -493,19 +561,19 @@ func (p *Parser) regToken(r rune) token { case ';': switch p.rune() { case ';': - if p.rune() == '&' && p.lang.isBash() { + if p.rune() == '&' && p.lang.in(langBashLike) { p.rune() return dblSemiAnd } return dblSemicolon case '&': - if p.lang == LangPOSIX { + if !p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { break } p.rune() return semiAnd case '|': - if p.lang != LangMirBSDKorn { + if !p.lang.in(LangMirBSDKorn) { break } p.rune() @@ -515,10 +583,11 @@ func (p *Parser) regToken(r rune) token { case '<': switch p.rune() { case '<': - if r = p.rune(); r == '-' { + switch p.rune() { + case '-': p.rune() return dashHdoc - } else if r == '<' { + case '<': p.rune() return wordHdoc } @@ -530,26 +599,63 @@ func (p *Parser) regToken(r rune) token { p.rune() return dplIn case '(': - if !p.lang.isBash() { + if !p.lang.in(langBashLike | LangZsh) { break } p.rune() return cmdIn } return rdrIn - default: // '>' + case '>': switch p.rune() { case '>': - p.rune() + switch p.rune() { + case '|': + p.rune() + return appClob + case '!': + if p.lang.in(LangZsh) { + p.rune() + return appClob + } + case '&': + if !p.lang.in(LangZsh) { + break + } + switch p.rune() { + case '|': + p.rune() + return appAllClob // >>&| is an alias for &>>| + case '!': + p.rune() + return appAllClob // >>&! is an alias for &>>| + } + return appAll // >>& is an alias for &>> + } return appOut case '&': - p.rune() + r = p.rune() + if p.lang.in(LangZsh) { + switch r { + case '|': + p.rune() + return rdrAllClob // >&| is an alias for &>| + case '!': + p.rune() + return rdrAllClob // >&! is an alias for &>| + } + } return dplOut case '|': p.rune() - return clbOut + return rdrClob + case '!': + if p.lang.in(LangZsh) { + p.rune() + return rdrClob + } case '(': - if !p.lang.isBash() { + if !p.lang.in(langBashLike | LangZsh) { break } p.rune() @@ -557,6 +663,7 @@ func (p *Parser) regToken(r rune) token { } return rdrOut } + panic("unreachable") } func (p *Parser) dqToken(r rune) token { @@ -568,13 +675,13 @@ func (p *Parser) dqToken(r rune) token { // Don't call p.rune, as we need to work out p.openBquotes to // properly handle backslashes in the lexer. return bckQuote - default: // '$' + case '$': switch p.rune() { case '{': p.rune() return dollBrace case '[': - if !p.lang.isBash() { + if !p.lang.in(langBashLike) { break } p.rune() @@ -588,6 +695,7 @@ func (p *Parser) dqToken(r rune) token { } return dollar } + panic("unreachable") } func (p *Parser) paramToken(r rune) token { @@ -609,6 +717,15 @@ func (p *Parser) paramToken(r rune) token { case '=': p.rune() return colAssgn + case '#': + p.rune() + return colHash + case '|': + p.rune() + return colPipe + case '*': + p.rune() + return colStar } return colon case '+': @@ -638,14 +755,11 @@ func (p *Parser) paramToken(r rune) token { case '!': p.rune() return exclMark - case '[': - p.rune() - return leftBrack case ']': p.rune() return rightBrack case '/': - if p.rune() == '/' && p.quote != paramExpRepl { + if p.rune() == '/' { p.rune() return dblSlash } @@ -665,9 +779,16 @@ func (p *Parser) paramToken(r rune) token { case '@': p.rune() return at - default: // '*' + case '*': p.rune() return star + + // This func gets called by the parser in [runeByRune] mode; + // we need to handle EOF and unexpected runes. + case utf8.RuneSelf: + return _EOF + default: + return illegalTok } } @@ -697,7 +818,10 @@ func (p *Parser) arithmToken(r rune) token { case '&': switch p.rune() { case '&': - p.rune() + if p.rune() == '=' && p.lang.in(LangZsh) { + p.rune() + return andBoolAssgn + } return andAnd case '=': p.rune() @@ -707,7 +831,10 @@ func (p *Parser) arithmToken(r rune) token { case '|': switch p.rune() { case '|': - p.rune() + if p.rune() == '=' && p.lang.in(LangZsh) { + p.rune() + return orBoolAssgn + } return orOr case '=': p.rune() @@ -769,7 +896,10 @@ func (p *Parser) arithmToken(r rune) token { case '*': switch p.rune() { case '*': - p.rune() + if p.rune() == '=' && p.lang.in(LangZsh) { + p.rune() + return powAssgn + } return power case '=': p.rune() @@ -783,7 +913,14 @@ func (p *Parser) arithmToken(r rune) token { } return slash case '^': - if p.rune() == '=' { + switch p.rune() { + case '^': + if p.rune() == '=' && p.lang.in(LangZsh) { + p.rune() + return xorBoolAssgn + } + return dblCaret + case '=': p.rune() return xorAssgn } @@ -803,10 +940,14 @@ func (p *Parser) arithmToken(r rune) token { case ':': p.rune() return colon - default: // '#' + case '#': p.rune() return hash + case '.': + p.rune() + return period } + panic("unreachable") } func (p *Parser) newLit(r rune) { @@ -831,7 +972,7 @@ func (p *Parser) endLit() (s string) { s = string(p.litBs[:len(p.litBs)-p.w]) } p.litBs = nil - return + return s } func (p *Parser) isLitRedir() bool { @@ -839,31 +980,20 @@ func (p *Parser) isLitRedir() bool { if lit[0] == '{' && lit[len(lit)-1] == '}' { return ValidName(string(lit[1 : len(lit)-1])) } - for _, b := range lit { - switch b { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - default: - return false - } - } - return true + return numberLiteral(lit) } -func (p *Parser) advanceNameCont(r rune) { - // we know that r is a letter or underscore -loop: - for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { - switch { - case 'a' <= r && r <= 'z': - case 'A' <= r && r <= 'Z': - case r == '_': - case '0' <= r && r <= '9': - case r == escNewl: - default: - break loop - } +func singleRuneParam[T rune | byte](r T) bool { + switch r { + case '@', '*', '#', '$', '?', '!', '-', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + return true } - p.tok, p.val = _LitWord, p.endLit() + return false +} + +func paramNameRune[T rune | byte](r T) bool { + return asciiLetter(r) || asciiDigit(r) || r == '_' } func (p *Parser) advanceLitOther(r rune) { @@ -885,18 +1015,18 @@ loop: break loop } case ':', '=', '%', '^', ',', '?', '!', '~', '*': - if p.quote&allArithmExpr != 0 || p.quote == paramExpName { + if p.quote&allArithmExpr != 0 { break loop } - case '[', ']': - if p.lang != LangPOSIX && p.quote&allArithmExpr != 0 { + case '.': + if !p.lang.in(LangZsh) && p.quote&allArithmExpr != 0 { break loop } - fallthrough - case '#', '@': - if p.quote&allParamReg != 0 { + case '[', ']': + if p.lang.in(langBashLike|LangMirBSDKorn|LangZsh) && p.quote&allArithmExpr != 0 { break loop } + fallthrough case '+', '-', ' ', '\t', ';', '&', '>', '<', '|', '(', ')', '\n', '\r': if p.quote&allKeepSpaces == 0 { break loop @@ -906,18 +1036,52 @@ loop: p.tok, p.val = tok, p.endLit() } +// zshNumRange peeks at the bytes after '<' to check for a zsh numeric +// range glob pattern like <->, <5->, <-10>, or <5-10>. +func (p *Parser) zshNumRange() bool { + // Peeking a handful of bytes here should be enough. + // TODO: This should loop for slow readers, e.g. those providing one byte at + // a time. Use a loop and test it with [testing/iotest.OneByteReader]. + if int(p.bsp) >= len(p.bs) { + p.fill() + } + rest := p.bs[p.bsp:] + for len(rest) > 0 && rest[0] >= '0' && rest[0] <= '9' { + rest = rest[1:] + } + if len(rest) == 0 || rest[0] != '-' { + return false + } + rest = rest[1:] + for len(rest) > 0 && rest[0] >= '0' && rest[0] <= '9' { + rest = rest[1:] + } + return len(rest) > 0 && rest[0] == '>' +} + func (p *Parser) advanceLitNone(r rune) { p.eqlOffs = -1 tok := _LitWord loop: for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { switch r { - case ' ', '\t', '\n', '\r', '&', '|', ';', '(', ')': + case ' ', '\t', '\n', '\r', '&', '|', ';', ')': + break loop + case '(': break loop case '\\': // escaped byte follows p.rune() case '>', '<': - if p.peekByte('(') { + if r == '<' && p.lang.in(LangZsh) && p.zshNumRange() { + // Zsh numeric range glob like <-> or <1-100>; consume until '>'. + for { + if r = p.rune(); r == '>' || r == utf8.RuneSelf { + break + } + } + continue + } + if p.peek() == '(' { tok = _Lit } else if p.isLitRedir() { tok = _LitRedir @@ -941,7 +1105,7 @@ loop: p.eqlOffs = len(p.litBs) - 1 } case '[': - if p.lang != LangPOSIX && len(p.litBs) > 1 && p.litBs[0] != '[' { + if p.lang.in(langBashLike|LangMirBSDKorn|LangZsh) && len(p.litBs) > 1 && p.litBs[0] != '[' { tok = _Lit break loop } @@ -980,10 +1144,8 @@ func (p *Parser) advanceLitHdoc(r rune) { p.tok = _Lit p.newLit(r) - if p.quote == hdocBodyTabs { - for r == '\t' { - r = p.rune() - } + for p.quote == hdocBodyTabs && r == '\t' { + r = p.rune() } lStart := len(p.litBs) - 1 stop := p.hdocStops[len(p.hdocStops)-1] @@ -1029,10 +1191,8 @@ func (p *Parser) advanceLitHdoc(r rune) { if r != '\n' { return // hit an unexpected EOF or closing backquote } - if p.quote == hdocBodyTabs { - for p.peekByte('\t') { - p.rune() - } + for p.quote == hdocBodyTabs && p.peek() == '\t' { + p.rune() } lStart = len(p.litBs) } @@ -1048,10 +1208,8 @@ func (p *Parser) quotedHdocWord() *Word { if r == utf8.RuneSelf { return nil } - if p.quote == hdocBodyTabs { - for r == '\t' { - r = p.rune() - } + for p.quote == hdocBodyTabs && r == '\t' { + r = p.rune() } lStart := len(p.litBs) - 1 runeLoop: @@ -1098,13 +1256,13 @@ func (p *Parser) advanceLitRe(r rune) { case ')': if p.rxOpenParens--; p.rxOpenParens < 0 { p.tok, p.val = _LitWord, p.endLit() - p.quote = noState + p.quote = testExpr return } case ' ', '\t', '\r', '\n', ';', '&', '>', '<': if p.rxOpenParens <= 0 { p.tok, p.val = _LitWord, p.endLit() - p.quote = noState + p.quote = testExpr return } case '"', '\'', '$', '`': diff --git a/vendor/mvdan.cc/sh/v3/syntax/nodes.go b/vendor/mvdan.cc/sh/v3/syntax/nodes.go index 902e32509..e50dc8246 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/nodes.go +++ b/vendor/mvdan.cc/sh/v3/syntax/nodes.go @@ -219,6 +219,7 @@ type Stmt struct { Negated bool // ! stmt Background bool // stmt & Coprocess bool // mksh's |& + Disown bool // zsh's &| or &! Redirs []*Redirect // stmt >a w.lastLine { - if w.Incomplete() { + // by [Parser.Stmts]. + if (w.p.r == '\n' || w.p.r == escNewl) && w.p.line > w.lastLine { + if w.p.Incomplete() { // Incomplete statement; call back to print "> ". - if !w.fn(w.accumulated) { + if !w.yield(w.accumulated, w.p.err) { return 0, io.EOF } } else if len(w.accumulated) == 0 { // Nothing was parsed; call back to print another "$ ". - if !w.fn(nil) { + if !w.yield(nil, w.p.err) { return 0, io.EOF } } - w.lastLine = w.line + w.lastLine = w.p.line } - return w.Reader.Read(p) + return w.rd.Read(p) } -// Interactive implements what is necessary to parse statements in an +// Interactive is a pre-iterators API which now wraps [Parser.InteractiveSeq]. +// +// Deprecated: use [Parser.InteractiveSeq]. +func (p *Parser) Interactive(r io.Reader, fn func([]*Stmt) bool) error { + for stmts, err := range p.InteractiveSeq(r) { + if err != nil { + return err + } + if !fn(stmts) { + break + } + } + return nil +} + +// InteractiveSeq implements what is necessary to parse statements in an // interactive shell. The parser will call the given function under two // circumstances outlined below. // @@ -268,28 +362,39 @@ func (w *wrappedReader) Read(p []byte) (n int, err error) { // // If the callback function returns false, parsing is stopped and the function // is not called again. -func (p *Parser) Interactive(r io.Reader, fn func([]*Stmt) bool) error { - w := wrappedReader{Parser: p, Reader: r, fn: fn} - return p.Stmts(&w, func(stmt *Stmt) bool { - w.accumulated = append(w.accumulated, stmt) - // We finished parsing a statement and we're at a newline token, - // so we finished fully parsing a number of statements. Call - // back to run the statements and print "$ ". - if p.tok == _Newl { - if !fn(w.accumulated) { - return false +func (p *Parser) InteractiveSeq(r io.Reader) iter.Seq2[[]*Stmt, error] { + return func(yield func([]*Stmt, error) bool) { + w := wrappedReader{p: p, rd: r, yield: yield} + for stmts, err := range p.StmtsSeq(&w) { + w.accumulated = append(w.accumulated, stmts) + if err != nil { + if !yield(w.accumulated, err) { + break + } + // If the caller wishes, they can continue in the presence of parse errors. + // TODO: does this even work? Write tests for it. This only came up + continue + } + // We finished parsing a statement and we're at a newline token, + // so we finished fully parsing a number of statements. Call + // back to run the statements and print "$ ". + if p.tok == _Newl { + if !yield(w.accumulated, nil) { + break + } + w.accumulated = w.accumulated[:0] + // The callback above would already print "$ ", so we + // don't want the subsequent wrappedReader.Read to cause + // another "$ " print thinking that nothing was parsed. + w.lastLine = w.p.line + 1 } - w.accumulated = w.accumulated[:0] - // The callback above would already print "$ ", so we - // don't want the subsequent wrappedReader.Read to cause - // another "$ " print thinking that nothing was parsed. - w.lastLine = w.line + 1 } - return true - }) + } } // Words is a pre-iterators API which now wraps [Parser.WordsSeq]. +// +// Deprecated: use [Parser.WordsSeq]. func (p *Parser) Words(r io.Reader, fn func(*Word) bool) error { for w, err := range p.WordsSeq(r) { if err != nil { @@ -323,7 +428,7 @@ func (p *Parser) WordsSeq(r io.Reader) iter.Seq2[*Word, error] { w := p.getWord() if w == nil { if p.tok != _EOF { - p.curErr("%s is not a valid word", p.tok) + p.curErr("%#q is not a valid word", p.tok) } if p.err != nil { yield(nil, p.err) @@ -375,27 +480,28 @@ func (p *Parser) Arithmetic(r io.Reader) (ArithmExpr, error) { type Parser struct { src io.Reader bs []byte // current chunk of read bytes - bsp uint // pos within chunk for the rune after r; uint helps eliminate bounds checks - r rune // next rune - w int // width of r + bsp uint // offset within [Parser.bs] for the rune after [Parser.r] + r rune // next rune; [utf8.RuneSelf] when it went past EOF, or we stopped + w int // width of [Parser.r] f *File - spaced bool // whether tok has whitespace on its left + spaced bool // whether [Parser.tok] has whitespace on its left err error // lexer/parser error readErr error // got a read error, but bytes left + readEOF bool // [Parser.src] already gave us an [io.EOF] error tok token // current token val string // current value (valid if tok is _Lit*) - // position of r, to be converted to Parser.pos later + // position of [Parser.r], to be converted to [Parser.pos] later offs, line, col int64 pos Pos // position of tok quote quoteState // current lexer state - eqlOffs int // position of '=' in val (a literal) + eqlOffs int // position of '=' in [Parser.val] (a literal) keepComments bool lang LangVariant @@ -413,7 +519,7 @@ type Parser struct { hdocStops [][]byte // stack of end words for open heredocs - parsingDoc bool // true if using Parser.Document + parsingDoc bool // true if using [Parser.Document] // openNodes tracks how many entire statements or words we're currently parsing. // A non-zero number means that we require certain tokens or words before @@ -458,7 +564,7 @@ func (p *Parser) reset() { p.bs, p.bsp = nil, 0 p.offs, p.line, p.col = 0, 1, 1 p.r, p.w = 0, 0 - p.err, p.readErr = nil, nil + p.err, p.readErr, p.readEOF = nil, nil, false p.quote, p.forbidNested = noState, false p.openNodes = 0 p.recoveredErrors = 0 @@ -473,6 +579,7 @@ func (p *Parser) reset() { p.litBs = nil } +// nextPos returns the position of the next rune, [Parser.r]. func (p *Parser) nextPos() Pos { // Basic protection against offset overflow; // note that an offset of 0 is valid, so we leave the maximum. @@ -538,12 +645,20 @@ func (p *Parser) call(w *Word) *CallExpr { return ce } -//go:generate stringer -type=quoteState - type quoteState uint32 const ( + // The initial state of the parser. noState quoteState = 1 << iota + + // Used when parsing parameter expansions; use with [Parser.rune], + // [Parser.next] always returns [illegalTok]. + runeByRune + + // unquotedWordCont exists purely so that the '#' in $foo#bar does not + // get parsed as a comment; it's a tiny variation on [noState]. + unquotedWordCont + subCmd subCmdBckquo dblQuotes @@ -553,24 +668,20 @@ const ( arithmExpr arithmExprLet arithmExprCmd - arithmExprBrack testExpr testExprRegexp switchCase - paramExpName - paramExpSlice + paramExpArithm paramExpRepl paramExpExp arrayElems - allKeepSpaces = paramExpRepl | dblQuotes | hdocBody | - hdocBodyTabs | paramExpExp - allRegTokens = noState | subCmd | subCmdBckquo | hdocWord | + allKeepSpaces = runeByRune | paramExpRepl | dblQuotes | hdocBody | + hdocBodyTabs | paramExpRepl | paramExpExp + allRegTokens = noState | unquotedWordCont | subCmd | subCmdBckquo | hdocWord | switchCase | arrayElems | testExpr - allArithmExpr = arithmExpr | arithmExprLet | arithmExprCmd | - arithmExprBrack | paramExpSlice - allParamReg = paramExpName | paramExpSlice - allParamExp = allParamReg | paramExpRepl | paramExpExp | arithmExprBrack + allArithmExpr = arithmExpr | arithmExprLet | arithmExprCmd | paramExpArithm + allParamExp = paramExpArithm | paramExpRepl | paramExpExp ) type saveState struct { @@ -581,7 +692,7 @@ type saveState struct { func (p *Parser) preNested(quote quoteState) (s saveState) { s.quote, s.buriedHdocs = p.quote, p.buriedHdocs p.buriedHdocs, p.quote = len(p.heredocs), quote - return + return s } func (p *Parser) postNested(s saveState) { @@ -644,28 +755,14 @@ func (p *Parser) doHeredocs() { if i > 0 && p.r == '\n' { p.rune() } - lastLine := p.line if quoted { r.Hdoc = p.quotedHdocWord() } else { p.next() r.Hdoc = p.getWord() } - if r.Hdoc != nil { - lastLine = int64(r.Hdoc.End().Line()) - } - if lastLine < p.line { - // TODO: It seems like this triggers more often than it - // should. Look into it. - l := p.lit(p.nextPos(), "") - if r.Hdoc == nil { - r.Hdoc = p.wordOne(l) - } else { - r.Hdoc.Parts = append(r.Hdoc.Parts, l) - } - } if stop := p.hdocStops[len(p.hdocStops)-1]; stop != nil { - p.posErr(r.Pos(), "unclosed here-document '%s'", stop) + p.posErr(r.Pos(), "unclosed here-document %#q", stop) } p.hdocStops = p.hdocStops[:len(p.hdocStops)-1] } @@ -697,26 +794,33 @@ func (p *Parser) recoverError() bool { return false } -func readableStr(s string) string { - // don't quote tokens like & or } - if s != "" && s[0] >= 'a' && s[0] <= 'z' { - return strconv.Quote(s) +type noQuote string + +func (s noQuote) Format(f fmt.State, verb rune) { + f.Write([]byte(s)) +} + +func (t token) Format(f fmt.State, verb rune) { + if t < _realTokenBoundary && verb == 'q' { + // EOF, Lit and the others should not be quoted in error messages + // as they are not real shell syntax like `if` or `{`. + f.Write([]byte(t.String())) + } else { + fmt.Fprintf(f, fmt.FormatString(f, verb), t.String()) } - return s } -func (p *Parser) followErr(pos Pos, left, right string) { - leftStr := readableStr(left) - p.posErr(pos, "%s must be followed by %s", leftStr, right) +func (p *Parser) followErr(pos Pos, left, right any) { + p.posErr(pos, "%#q must be followed by %#q", left, right) } -func (p *Parser) followErrExp(pos Pos, left string) { - p.followErr(pos, left, "an expression") +func (p *Parser) followErrExp(pos Pos, left any) { + p.followErr(pos, left, noQuote("an expression")) } func (p *Parser) follow(lpos Pos, left string, tok token) { if !p.got(tok) { - p.followErr(lpos, left, tok.String()) + p.followErr(lpos, left, tok) } } @@ -726,22 +830,36 @@ func (p *Parser) followRsrv(lpos Pos, left, val string) Pos { if p.recoverError() { return recoveredPos } - p.followErr(lpos, left, fmt.Sprintf("%q", val)) + p.followErr(lpos, left, val) } return pos } func (p *Parser) followStmts(left string, lpos Pos, stops ...string) ([]*Stmt, []Comment) { + // Language variants disallowing empty command lists: + // * [LangPOSIX]: "A list is a sequence of one or more AND-OR lists...". + // * [LangBash]: "A list is a sequence of one or more pipelines..." + // + // Language variants allowing empty command lists: + // * [LangZsh]: "A list is a sequence of zero or more sublists...". + // * [LangMirBSDKorn]: "Lists of commands can be created by separating pipelines..."; + // note that the man page is not explicit, but the shell clearly allows e.g. `{ }`. if p.got(semicolon) { + if p.lang.in(LangZsh | LangMirBSDKorn) { + return nil, nil // allow an empty list + } + p.followErr(lpos, left, noQuote("a statement list")) return nil, nil } - newLine := p.got(_Newl) stmts, last := p.stmtList(stops...) - if len(stmts) < 1 && !newLine { + if len(stmts) < 1 { + if p.lang.in(LangZsh | LangMirBSDKorn) { + return nil, nil // allow an empty list + } if p.recoverError() { return []*Stmt{{Position: recoveredPos}}, nil } - p.followErr(lpos, left, "a statement list") + p.followErr(lpos, left, noQuote("a statement list")) } return stmts, last } @@ -752,7 +870,7 @@ func (p *Parser) followWordTok(tok token, pos Pos) *Word { if p.recoverError() { return p.wordOne(&Lit{ValuePos: recoveredPos}) } - p.followErr(pos, tok.String(), "a word") + p.followErr(pos, tok, noQuote("a word")) } return w } @@ -763,19 +881,17 @@ func (p *Parser) stmtEnd(n Node, start, end string) Pos { if p.recoverError() { return recoveredPos } - p.posErr(n.Pos(), "%s statement must end with %q", start, end) + p.posErr(n.Pos(), "%#q statement must end with %#q", start, end) } return pos } func (p *Parser) quoteErr(lpos Pos, quote token) { - p.posErr(lpos, "reached %s without closing quote %s", - p.tok.String(), quote) + p.posErr(lpos, "reached %#q without closing quote %#q", p.tok, quote) } -func (p *Parser) matchingErr(lpos Pos, left, right any) { - p.posErr(lpos, "reached %s without matching %s with %s", - p.tok.String(), left, right) +func (p *Parser) matchingErr(lpos Pos, left, right token) { + p.posErr(lpos, "reached %#q without matching %#q with %#q", p.tok, left, right) } func (p *Parser) matched(lpos Pos, left, right token) Pos { @@ -807,9 +923,14 @@ func IsIncomplete(err error) bool { return ok && perr.Incomplete } -// IsKeyword returns true if the given word is part of the language keywords. +// TODO: probably redo with a [LangVariant] argument. +// Perhaps offer an iterator version as well. + +// IsKeyword returns true if the given word is a language keyword +// in POSIX Shell or Bash. func IsKeyword(word string) bool { // This list has been copied from the bash 5.1 source code, file y.tab.c +4460 + // TODO: should we include entries for zsh here? e.g. "{}", "repeat", "always", ... switch word { case "!", @@ -850,9 +971,9 @@ type ParseError struct { func (e ParseError) Error() string { if e.Filename == "" { - return fmt.Sprintf("%s: %s", e.Pos.String(), e.Text) + return fmt.Sprintf("%s: %s", e.Pos, e.Text) } - return fmt.Sprintf("%s:%s: %s", e.Filename, e.Pos.String(), e.Text) + return fmt.Sprintf("%s:%s: %s", e.Filename, e.Pos, e.Text) } // LangError is returned when the parser encounters code that is only valid in @@ -862,6 +983,8 @@ type LangError struct { Filename string Pos Pos + // TODO: consider replacing the Langs slice with a bitset. + // Feature briefly describes which language feature caused the error. Feature string // Langs lists some of the language variants which support the feature. @@ -873,9 +996,11 @@ type LangError struct { func (e LangError) Error() string { var sb strings.Builder if e.Filename != "" { - sb.WriteString(e.Filename + ":") + sb.WriteString(e.Filename) + sb.WriteString(":") } - sb.WriteString(e.Pos.String() + ": ") + sb.WriteString(e.Pos.String()) + sb.WriteString(": ") sb.WriteString(e.Feature) if strings.HasSuffix(e.Feature, "s") { sb.WriteString(" are a ") @@ -893,30 +1018,43 @@ func (e LangError) Error() string { return sb.String() } -func (p *Parser) posErr(pos Pos, format string, a ...any) { +func (p *Parser) posErr(pos Pos, format string, args ...any) { + // for i, arg := range args { + // if arg, ok := arg.(fmt.Stringer); ok && arg != _EOF { + // args[i] = quotedToken(arg) + // } + // } p.errPass(ParseError{ Filename: p.f.Name, Pos: pos, - Text: fmt.Sprintf(format, a...), + Text: fmt.Sprintf(format, args...), Incomplete: p.tok == _EOF && p.Incomplete(), }) } -func (p *Parser) curErr(format string, a ...any) { - p.posErr(p.pos, format, a...) +func (p *Parser) curErr(format string, args ...any) { + p.posErr(p.pos, format, args...) } -func (p *Parser) langErr(pos Pos, feature string, langs ...LangVariant) { +func (p *Parser) checkLang(pos Pos, langSet LangVariant, format string, a ...any) { + if p.lang.in(langSet) { + return + } + if langBashLike.in(langSet) { + // If we're reporting an error because a feature is for bash-like funcs, + // just mention "bash" rather than "bash/bats" for the sake of clarity. + langSet &^= LangBats + } p.errPass(LangError{ Filename: p.f.Name, Pos: pos, - Feature: feature, - Langs: langs, + Feature: fmt.Sprintf(format, a...), + Langs: slices.Collect(langSet.bits()), LangUsed: p.lang, }) } -func (p *Parser) stmts(fn func(*Stmt) bool, stops ...string) { +func (p *Parser) stmts(yield func(*Stmt, error) bool, stops ...string) { gotEnd := true loop: for p.tok != _EOF { @@ -928,6 +1066,9 @@ loop: break loop } } + if p.val == "}" { + p.curErr(`%#q can only be used to close a block`, rightBrace) + } case rightParen: if p.quote == subCmd { break loop @@ -940,7 +1081,7 @@ loop: if p.quote == switchCase { break loop } - p.curErr("%s can only be used in a case clause", p.tok) + p.curErr("%#q can only be used in a case clause", p.tok) } if !newLine && !gotEnd { p.curErr("statements must be separated by &, ; or a newline") @@ -956,7 +1097,7 @@ loop: break } gotEnd = s.Semicolon.IsValid() - if !fn(s) { + if !yield(s, p.err) { break } } @@ -965,7 +1106,7 @@ loop: func (p *Parser) stmtList(stops ...string) ([]*Stmt, []Comment) { var stmts []*Stmt var last []Comment - fn := func(s *Stmt) bool { + fn := func(s *Stmt, err error) bool { stmts = append(stmts, s) return true } @@ -998,12 +1139,12 @@ func (p *Parser) stmtList(stops ...string) ([]*Stmt, []Comment) { func (p *Parser) invalidStmtStart() { switch p.tok { - case semicolon, and, or, andAnd, orOr: - p.curErr("%s can only immediately follow a statement", p.tok) + case semicolon, and, or, andAnd, orOr, andPipe, andBang: + p.curErr("%#q can only immediately follow a statement", p.tok) case rightParen: - p.curErr("%s can only be used to close a subshell", p.tok) + p.curErr("%#q can only be used to close a subshell", p.tok) default: - p.curErr("%s is not a valid start for a statement", p.tok) + p.curErr("%#q is not a valid start for a statement", p.tok) } } @@ -1025,6 +1166,10 @@ func (p *Parser) getLit() *Lit { } func (p *Parser) wordParts(wps []WordPart) []WordPart { + if p.quote == noState { + p.quote = unquotedWordCont + defer func() { p.quote = noState }() + } for { p.openNodes++ n := p.wordPart() @@ -1042,9 +1187,9 @@ func (p *Parser) wordParts(wps []WordPart) []WordPart { } } -func (p *Parser) ensureNoNested() { +func (p *Parser) ensureNoNested(pos Pos) { if p.forbidNested { - p.curErr("expansions not allowed in heredoc words") + p.posErr(pos, "expansions not allowed in heredoc words") } } @@ -1055,17 +1200,13 @@ func (p *Parser) wordPart() WordPart { p.next() return l case dollBrace: - p.ensureNoNested() + p.ensureNoNested(p.pos) switch p.r { case '|': - if p.lang != LangMirBSDKorn { - p.langErr(p.pos, `"${|stmts;}"`, LangMirBSDKorn) - } + p.checkLang(p.pos, langBashLike|LangMirBSDKorn, "`${|stmts;}`") fallthrough case ' ', '\t', '\n': - if p.lang != LangMirBSDKorn { - p.langErr(p.pos, `"${ stmts;}"`, LangMirBSDKorn) - } + p.checkLang(p.pos, langBashLike|LangMirBSDKorn, "`${ stmts;}`") cs := &CmdSubst{ Left: p.pos, TempFile: p.r != '|', @@ -1078,7 +1219,7 @@ func (p *Parser) wordPart() WordPart { p.postNested(old) pos, ok := p.gotRsrv("}") if !ok { - p.matchingErr(cs.Left, "${", "}") + p.matchingErr(cs.Left, dollBrace, rightBrace) } cs.Right = pos return cs @@ -1086,20 +1227,13 @@ func (p *Parser) wordPart() WordPart { return p.paramExp() } case dollDblParen, dollBrack: - p.ensureNoNested() + p.ensureNoNested(p.pos) left := p.tok ar := &ArithmExp{Left: p.pos, Bracket: left == dollBrack} - var old saveState - if ar.Bracket { - old = p.preNested(arithmExprBrack) - } else { - old = p.preNested(arithmExpr) - } + old := p.preNested(arithmExpr) p.next() if p.got(hash) { - if p.lang != LangMirBSDKorn { - p.langErr(ar.Pos(), "unsigned expressions", LangMirBSDKorn) - } + p.checkLang(ar.Pos(), LangMirBSDKorn, "unsigned expressions") ar.Unsigned = true } ar.X = p.followArithm(left, ar.Left) @@ -1115,42 +1249,22 @@ func (p *Parser) wordPart() WordPart { } return ar case dollParen: - p.ensureNoNested() - cs := &CmdSubst{Left: p.pos} - old := p.preNested(subCmd) - p.next() - cs.Stmts, cs.Last = p.stmtList() - p.postNested(old) - cs.Right = p.matched(cs.Left, leftParen, rightParen) - return cs + p.ensureNoNested(p.pos) + return p.cmdSubst() case dollar: - r := p.r - switch { - case singleRuneParam(r): - p.tok, p.val = _LitWord, string(r) - p.rune() - case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', - '0' <= r && r <= '9', r == '_', r == '\\': - p.advanceNameCont(r) - default: + pe := p.paramExp() + if pe == nil { // was not actually a parameter expansion, like: "foo$" l := p.lit(p.pos, "$") p.next() return l } - p.ensureNoNested() - pe := &ParamExp{Dollar: p.pos, Short: true} - p.pos = posAddCol(p.pos, 1) - pe.Param = p.getLit() - if pe.Param != nil && pe.Param.Value == "" { - l := p.lit(pe.Dollar, "$") - // e.g. "$\\\"" within double quotes, so we must - // keep the rest of the literal characters. - l.ValueEnd = posAddCol(l.ValuePos, 1) - return l - } + p.ensureNoNested(pe.Dollar) return pe + case assgnParen: + p.checkLang(p.pos, LangZsh, `%#q process substitutions`, p.tok) + fallthrough case cmdIn, cmdOut: - p.ensureNoNested() + p.ensureNoNested(p.pos) ps := &ProcSubst{Op: ProcOperator(p.tok), OpPos: p.pos} old := p.preNested(subCmd) p.next() @@ -1196,7 +1310,7 @@ func (p *Parser) wordPart() WordPart { if p.backquoteEnd() { return nil } - p.ensureNoNested() + p.ensureNoNested(p.pos) cs := &CmdSubst{Left: p.pos, Backquotes: true} old := p.preNested(subCmdBckquo) p.openBquotes++ @@ -1226,10 +1340,28 @@ func (p *Parser) wordPart() WordPart { } } return cs - case globQuest, globStar, globPlus, globAt, globExcl: - if p.lang == LangPOSIX { - p.langErr(p.pos, "extended globs", LangBash, LangMirBSDKorn) + case leftParen: + if p.lang.in(LangZsh) && p.r != ')' { + // Zsh glob qualifier like *(N) or .(:a); the only case where + // ( immediately after a word is not a glob qualifier is () + // for a function declaration, which the parser handles earlier. + pos := p.pos + p.pos = p.nextPos() + for p.newLit(p.r); p.r != utf8.RuneSelf && p.r != ')'; p.rune() { + } + if p.r != ')' { + p.tok = _EOF // we can only get here due to EOF + p.matchingErr(pos, leftParen, rightParen) + } + p.rune() + p.val = p.endLit() + l := p.lit(pos, "("+p.val) + p.next() + return l } + return nil + case globQuest, globStar, globPlus, globAt, globExcl: + p.checkLang(p.pos, langBashLike|LangMirBSDKorn, "extended globs") eg := &ExtGlob{Op: GlobOperator(p.tok), OpPos: p.pos} lparens := 1 r := p.r @@ -1250,7 +1382,7 @@ func (p *Parser) wordPart() WordPart { p.rune() p.next() if lparens != 0 { - p.matchingErr(eg.OpPos, eg.Op, rightParen) + p.matchingErr(eg.OpPos, token(eg.Op), rightParen) } return eg default: @@ -1258,6 +1390,16 @@ func (p *Parser) wordPart() WordPart { } } +func (p *Parser) cmdSubst() *CmdSubst { + cs := &CmdSubst{Left: p.pos} + old := p.preNested(subCmd) + p.next() + cs.Stmts, cs.Last = p.stmtList() + p.postNested(old) + cs.Right = p.matched(cs.Left, dollParen, rightParen) + return cs +} + func (p *Parser) dblQuoted() *DblQuoted { alloc := &struct { quoted DblQuoted @@ -1282,104 +1424,107 @@ func (p *Parser) dblQuoted() *DblQuoted { return q } -func singleRuneParam(r rune) bool { - switch r { - case '@', '*', '#', '$', '?', '!', '-', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - return true - } - return false -} - +// paramExp parses a short or full parameter expansion, depending on whether +// [Parser.tok] is [dollar] or [dollBrace]. It returns nil if a [dollar] token +// does not form a valid parameter expansion, in which case it should be parsed +// as a literal. func (p *Parser) paramExp() *ParamExp { - pe := &ParamExp{Dollar: p.pos} old := p.quote - p.quote = paramExpName - if p.r == '#' { - p.tok = hash - p.pos = p.nextPos() + p.quote = runeByRune + // [ParamExp.Short] means we are parsing $exp rather than ${exp}. + pe := &ParamExp{ + Dollar: p.pos, + Short: p.tok == dollar, + } + if !pe.Short && p.r == '(' { + p.checkLang(pe.Pos(), LangZsh, `parameter expansion flags`) + // For now, for simplicity, we parse flags as just a literal. + // In the future, parsing as a word is better for cases like + // `${(ps.$sep.)val}`. + lparen := p.nextPos() p.rune() - } else { - p.next() - } - switch p.tok { - case hash: - if paramNameOp(p.r) { - pe.Length = true - p.next() - } - case perc: - if p.lang != LangMirBSDKorn { - p.langErr(pe.Pos(), `"${%foo}"`, LangMirBSDKorn) - } - if paramNameOp(p.r) { - pe.Width = true - p.next() + p.pos = p.nextPos() + for p.newLit(p.r); p.r != utf8.RuneSelf && p.r != ')'; p.rune() { } - case exclMark: - if paramNameOp(p.r) { - pe.Excl = true - p.next() + p.val = p.endLit() + if p.r != ')' { + p.tok = _EOF // we can only get here due to EOF + p.matchingErr(lparen, leftParen, rightParen) } + pe.Flags = p.lit(p.pos, p.val) + p.rune() } - op := p.tok - switch p.tok { - case _Lit, _LitWord: - if !numberLiteral(p.val) && !ValidName(p.val) { - p.curErr("invalid parameter name") - } - pe.Param = p.lit(p.pos, p.val) - p.next() - case quest, minus: - if pe.Length && p.r != '}' { - // actually ${#-default}, not ${#-}; fix the ambiguity - pe.Length = false - pe.Param = p.lit(posAddCol(p.pos, -1), "#") - pe.Param.ValueEnd = p.pos - break + if !pe.Short || p.lang.in(LangZsh) { + // Prefixes, like ${#name} to get the length of a variable. + // Note that in Zsh, the short form like $#name is allowed too. + switch p.r { + case '#': + if r := p.peek(); r == utf8.RuneSelf || singleRuneParam(r) || paramNameRune(r) || r == '"' { + pe.Length = true + p.rune() + } + case '%': + if r := p.peek(); r == utf8.RuneSelf || singleRuneParam(r) || paramNameRune(r) || r == '"' { + p.checkLang(pe.Pos(), LangMirBSDKorn, "`${%%foo}`") + pe.Width = true + p.rune() + } + case '!': + if r := p.peek(); r == utf8.RuneSelf || singleRuneParam(r) || paramNameRune(r) || r == '"' { + p.checkLang(pe.Pos(), langBashLike|LangMirBSDKorn, "`${!foo}`") + pe.Excl = true + p.rune() + } + case '+': + if r := p.peek(); r == utf8.RuneSelf || singleRuneParam(r) || paramNameRune(r) || r == '"' { + p.checkLang(pe.Pos(), LangZsh, "`${+foo}`") + pe.IsSet = true + p.rune() + } } - fallthrough - case at, star, hash, exclMark, dollar: - pe.Param = p.lit(p.pos, p.tok.String()) - p.next() - default: - p.curErr("parameter expansion requires a literal") } - switch p.tok { - case _Lit, _LitWord: - p.curErr("%s cannot be followed by a word", op) - case rightBrace: - if pe.Excl && p.lang == LangPOSIX { - p.langErr(pe.Pos(), `"${!foo}"`, LangBash, LangMirBSDKorn) + if pe = p.paramExpParameter(pe); pe == nil { + p.quote = old + return nil // just "$" + } + // In short mode, any indexing or suffixes is not allowed, and we don't require '}'. + // Zsh is an exception: $foo[1] and $foo[1,3] are valid. + if pe.Short { + if p.lang.in(LangZsh) && p.r == '[' { + p.pos = p.nextPos() + p.rune() + pe.Index = p.eitherIndex() } - pe.Rbrace = p.pos p.quote = old p.next() return pe - case leftBrack: - if p.lang == LangPOSIX { - p.langErr(p.pos, "arrays", LangBash, LangMirBSDKorn) - } - if !ValidName(pe.Param.Value) { - p.curErr("cannot index a special parameter name") + } + // Index expressions like ${foo[1]}. Note that expansion suffixes can be combined, + // like ${foo[@]//replace/with}. + if p.r == '[' { + p.checkLang(p.nextPos(), langBashLike|LangMirBSDKorn|LangZsh, "arrays") + if pe.Param != nil && !ValidName(pe.Param.Value) { + p.posErr(p.nextPos(), "cannot index a special parameter name") } + p.pos = p.nextPos() + p.rune() pe.Index = p.eitherIndex() } + tokRune := p.r + p.pos = p.nextPos() + p.tok = p.paramToken(p.r) if p.tok == rightBrace { pe.Rbrace = p.pos p.quote = old p.next() return pe } - if p.tok != _EOF && (pe.Length || pe.Width) { + if p.tok != _EOF && (pe.Length || pe.Width || pe.IsSet) { p.curErr("cannot combine multiple parameter expansion operators") } switch p.tok { - case slash, dblSlash: - // pattern search and replace - if p.lang == LangPOSIX { - p.langErr(p.pos, "search and replace", LangBash, LangMirBSDKorn) - } + case slash, dblSlash: // pattern search and replace + p.checkLang(p.pos, langBashLike|LangMirBSDKorn|LangZsh, "search and replace") pe.Repl = &Replace{All: p.tok == dblSlash} p.quote = paramExpRepl p.next() @@ -1388,14 +1533,36 @@ func (p *Parser) paramExp() *ParamExp { if p.got(slash) { pe.Repl.With = p.getWord() } - case colon: - // slicing - if p.lang == LangPOSIX { - p.langErr(p.pos, "slicing", LangBash, LangMirBSDKorn) + case colon: // slicing + if p.lang.in(LangZsh) && (p.r == '&' || asciiLetter(p.r)) { + pos := p.pos + loop: + for p.newLit(p.r); ; p.rune() { + switch p.r { + case utf8.RuneSelf: + p.tok = _EOF + p.matchingErr(pe.Dollar, dollBrace, rightBrace) + break loop + case '}': + pe.Modifiers = append(pe.Modifiers, p.lit(pos, p.endLit())) + pe.Rbrace = p.nextPos() + p.rune() + break loop + case ':': + pe.Modifiers = append(pe.Modifiers, p.lit(pos, p.endLit())) + p.rune() + pos = p.nextPos() + p.newLit(p.r) + } + } + p.quote = old + p.next() + return pe } + p.checkLang(p.pos, langBashLike|LangMirBSDKorn|LangZsh, "slicing") pe.Slice = &Slice{} colonPos := p.pos - p.quote = paramExpSlice + p.quote = paramExpArithm if p.next(); p.tok != colon { pe.Slice.Offset = p.followArithm(colon, colonPos) } @@ -1409,41 +1576,159 @@ func (p *Parser) paramExp() *ParamExp { pe.Rbrace = p.pos p.matchedArithm(pe.Dollar, dollBrace, rightBrace) return pe - case caret, dblCaret, comma, dblComma: - // upper/lower case - if !p.lang.isBash() { - p.langErr(p.pos, "this expansion operator", LangBash) - } + case caret, dblCaret, comma, dblComma: // upper/lower case + p.checkLang(p.pos, langBashLike, "this expansion operator") pe.Exp = p.paramExpExp() case at, star: switch { - case p.tok == at && p.lang == LangPOSIX: - p.langErr(p.pos, "this expansion operator", LangBash, LangMirBSDKorn) case p.tok == star && !pe.Excl: - p.curErr("not a valid parameter expansion operator: %v", p.tok) + p.curErr("not a valid parameter expansion operator: %#q", p.tok) case pe.Excl && p.r == '}': - if !p.lang.isBash() { - p.langErr(pe.Pos(), fmt.Sprintf(`"${!foo%s}"`, p.tok), LangBash) - } + p.checkLang(pe.Pos(), langBashLike, "`${!foo%s}`", p.tok) pe.Names = ParNamesOperator(p.tok) p.next() + case p.tok == at: + p.checkLang(p.pos, langBashLike|LangMirBSDKorn, "this expansion operator") + fallthrough default: pe.Exp = p.paramExpExp() } case plus, colPlus, minus, colMinus, quest, colQuest, assgn, colAssgn, - perc, dblPerc, hash, dblHash: + perc, dblPerc, hash, dblHash, colHash, colPipe, colStar: pe.Exp = p.paramExpExp() case _EOF: default: - p.curErr("not a valid parameter expansion operator: %v", p.tok) + if paramNameRune(tokRune) { + if pe.Param != nil { + p.curErr("%#q cannot be followed by a word", pe.Param.Value) + } else { + p.curErr("nested parameter expansion cannot be followed by a word") + } + } else { + p.curErr("not a valid parameter expansion operator: %#q", string(tokRune)) + } + } + if p.tok != _EOF && p.tok != rightBrace { + p.tok = p.paramToken(p.r) } p.quote = old pe.Rbrace = p.matched(pe.Dollar, dollBrace, rightBrace) return pe } +func (p *Parser) nestedParameterStart(pe *ParamExp) (left token, quotePos Pos) { + if pe.Short { + return illegalTok, Pos{} + } + if p.r == '"' { + quotePos = p.nextPos() + p.rune() + } + if p.r != '$' { + if quotePos.IsValid() { + return dollar, quotePos + } + return illegalTok, Pos{} + } + switch p1 := p.peek(); p1 { + case '{', '(': + p.pos = p.nextPos() + p.checkLang(p.pos, LangZsh, "nested parameter expansions") + if p.err != nil { + return illegalTok, Pos{} // xxx given that we overwrite p.tok below + } + p.rune() + p.rune() + if p1 == '{' { + left = dollBrace + } else { // '(' + left = dollParen + } + } + return left, quotePos +} + +func (p *Parser) paramExpParameter(pe *ParamExp) *ParamExp { + // Check for Zsh nested parameter expressions like ${(f)"$(foo)"}. + if left, quotePos := p.nestedParameterStart(pe); left != illegalTok { + var wp WordPart + switch p.tok = left; p.tok { + case dollBrace: // ${#${nested parameter}} + p.tok = dollBrace + wp = p.paramExp() + case dollParen: // ${#$(nested command)} + wp = p.cmdSubst() + default: // dollar + p.posErr(pe.Pos(), "invalid nested parameter expansion") + } + if quotePos.IsValid() { + if p.r != '"' { + p.tok = p.paramToken(p.r) + if p.tok == illegalTok { + p.posErr(pe.Pos(), "invalid nested parameter expansion") + } else { + p.quoteErr(quotePos, dblQuote) + } + } + pe.NestedParam = &DblQuoted{ + Left: quotePos, + Right: p.nextPos(), + Parts: []WordPart{wp}, + } + p.rune() + } else { + pe.NestedParam = wp + } + return pe + } + // The parameter name itself, like $foo or $?. + switch p.r { + case '?', '-': + if pe.Length && p.peek() != '}' { + // actually ${#-default}, not ${#-}; fix the ambiguity + pe.Length = false + pos := p.nextPos() + pe.Param = p.lit(posAddCol(pos, -1), "#") + pe.Param.ValueEnd = pos + break + } + fallthrough + case '@', '*', '#', '!', '$': + r, pos := p.r, p.nextPos() + p.rune() + pe.Param = p.lit(pos, string(r)) + default: + // Note that $1a is equivalent to ${1}a, but ${1a} is not. + // POSIX Shell says the latter is unspecified behavior, so match Bash's behavior. + pos := p.nextPos() + if pe.Short && singleRuneParam(p.r) { + p.val = string(p.r) + p.rune() + } else { + for p.newLit(p.r); p.r != utf8.RuneSelf; p.rune() { + if !paramNameRune(p.r) && p.r != escNewl { + break + } + } + p.val = p.endLit() + if !numberLiteral(p.val) && !ValidName(p.val) { + if pe.Short { + return nil // just "$" + } + p.posErr(pos, "invalid parameter name") + } + } + pe.Param = p.lit(pos, p.val) + } + return pe +} + func (p *Parser) paramExpExp() *Expansion { op := ParExpOperator(p.tok) + switch op { + case MatchEmpty, ArrayExclude, ArrayIntersect: + p.checkLang(p.pos, LangZsh, "${name%sarg}", op) + } p.quote = paramExpExp p.next() if op == OtherParamOps { @@ -1454,16 +1739,12 @@ func (p *Parser) paramExpExp() *Expansion { } switch p.val { case "a", "k", "u", "A", "E", "K", "L", "P", "U": - if !p.lang.isBash() { - p.langErr(p.pos, "this expansion operator", LangBash) - } + p.checkLang(p.pos, langBashLike, "this expansion operator") case "#": - if p.lang != LangMirBSDKorn { - p.langErr(p.pos, "this expansion operator", LangMirBSDKorn) - } + p.checkLang(p.pos, LangMirBSDKorn, "this expansion operator") case "Q": default: - p.curErr("invalid @ expansion operator %q", p.val) + p.curErr("invalid @ expansion operator %#q", p.val) } } return &Expansion{Op: op, Word: p.getWord()} @@ -1472,7 +1753,7 @@ func (p *Parser) paramExpExp() *Expansion { func (p *Parser) eitherIndex() ArithmExpr { old := p.quote lpos := p.pos - p.quote = arithmExprBrack + p.quote = paramExpArithm p.next() if p.tok == star || p.tok == at { p.tok, p.val = _LitWord, p.tok.String() @@ -1483,10 +1764,36 @@ func (p *Parser) eitherIndex() ArithmExpr { return expr } +func (p *Parser) zshSubFlags() *FlagsArithm { + zf := &FlagsArithm{} + // Lex flags as raw text, like paramExp does for ${(flags)...}. + lparen := p.pos + old := p.quote + p.quote = runeByRune + p.pos = p.nextPos() + for p.newLit(p.r); p.r != utf8.RuneSelf && p.r != ')'; p.rune() { + } + p.val = p.endLit() + if p.r != ')' { + p.tok = _EOF + p.matchingErr(lparen, leftParen, rightParen) + } + zf.Flags = p.lit(p.pos, p.val) + p.rune() + p.quote = old + // Parse the expression; use arithmExprAssign so commas are left for ranges. + p.next() + if p.tok == star || p.tok == at { + p.tok, p.val = _LitWord, p.tok.String() + } + zf.X = p.arithmExprAssign(false) + return zf +} + func (p *Parser) stopToken() bool { switch p.tok { - case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, dblSemicolon, - semiAnd, dblSemiAnd, semiOr, rightParen: + case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, andPipe, andBang, + dblSemicolon, semiAnd, dblSemiAnd, semiOr, rightParen: return true case bckQuote: return p.backquoteEnd() @@ -1505,10 +1812,8 @@ func ValidName(val string) bool { } for i, r := range val { switch { - case 'a' <= r && r <= 'z': - case 'A' <= r && r <= 'Z': - case r == '_': - case i > 0 && '0' <= r && r <= '9': + case asciiLetter(r), r == '_': + case i > 0 && asciiDigit(r): default: return false } @@ -1516,9 +1821,12 @@ func ValidName(val string) bool { return true } -func numberLiteral(val string) bool { - for _, r := range val { - if '0' > r || r > '9' { +func numberLiteral[T string | []byte](val T) bool { + if len(val) == 0 { + return false + } + for _, r := range string(val) { + if !asciiDigit(r) { return false } } @@ -1530,7 +1838,7 @@ func (p *Parser) hasValidIdent() bool { return false } if end := p.eqlOffs; end > 0 { - if p.val[end-1] == '+' && p.lang != LangPOSIX { + if p.val[end-1] == '+' && p.lang.in(langBashLike|LangMirBSDKorn|LangZsh) { end-- // a+=x } if ValidName(p.val[:end]) { @@ -1546,7 +1854,7 @@ func (p *Parser) getAssign(needEqual bool) *Assign { as := &Assign{} if p.eqlOffs > 0 { // foo=bar nameEnd := p.eqlOffs - if p.lang != LangPOSIX && p.val[p.eqlOffs-1] == '+' { + if p.lang.in(langBashLike|LangMirBSDKorn|LangZsh) && p.val[p.eqlOffs-1] == '+' { // a+=b as.Append = true nameEnd-- @@ -1568,44 +1876,51 @@ func (p *Parser) getAssign(needEqual bool) *Assign { as.Index = p.eitherIndex() if p.spaced || p.stopToken() { if needEqual { - p.followErr(as.Pos(), "a[b]", "=") + p.followErr(as.Pos(), "a[b]", assgn) } else { as.Naked = true return as } } - if len(p.val) > 0 && p.val[0] == '+' { - as.Append = true - p.val = p.val[1:] + if p.tok == assgnParen { + if !p.lang.in(LangZsh) { + p.curErr("arrays cannot be nested") + return nil + } + // zsh allows a[i]=(values...). + // assgnParen consumed both '=' and '(', + // so rewrite as leftParen for array parsing below. + p.tok = leftParen p.pos = posAddCol(p.pos, 1) - } - if len(p.val) < 1 || p.val[0] != '=' { - if as.Append { - p.followErr(as.Pos(), "a[b]+", "=") - } else { - p.followErr(as.Pos(), "a[b]", "=") + } else { + if len(p.val) > 0 && p.val[0] == '+' { + as.Append = true + p.val = p.val[1:] + p.pos = posAddCol(p.pos, 1) + } + if len(p.val) < 1 || p.val[0] != '=' { + if as.Append { + p.followErr(as.Pos(), "a[b]+", assgn) + } else { + p.followErr(as.Pos(), "a[b]", assgn) + } + return nil + } + p.pos = posAddCol(p.pos, 1) + p.val = p.val[1:] + if p.val == "" { + p.next() } - return nil - } - p.pos = posAddCol(p.pos, 1) - p.val = p.val[1:] - if p.val == "" { - p.next() } } if p.spaced || p.stopToken() { return as } if as.Value == nil && p.tok == leftParen { - if p.lang == LangPOSIX { - p.langErr(p.pos, "arrays", LangBash, LangMirBSDKorn) - } - if as.Index != nil { - p.curErr("arrays cannot be nested") - } + p.checkLang(p.pos, langBashLike|LangMirBSDKorn|LangZsh, "arrays") as.Array = &ArrayExpr{Lparen: p.pos} newQuote := p.quote - if p.lang.isBash() { + if p.lang.in(langBashLike | LangZsh) { newQuote = arrayElems } old := p.preNested(newQuote) @@ -1617,13 +1932,14 @@ func (p *Parser) getAssign(needEqual bool) *Assign { if p.tok == leftBrack { left := p.pos ae.Index = p.eitherIndex() - p.follow(left, `"[x]"`, assgn) + if p.tok == assgnParen { + p.curErr("arrays cannot be nested") + return nil + } + p.follow(left, `[x]`, assgn) } if ae.Value = p.getWord(); ae.Value == nil { switch p.tok { - case leftParen: - p.curErr("arrays cannot be nested") - return nil case _Newl, rightParen, leftBrack: // TODO: support [index]=[ default: @@ -1656,8 +1972,9 @@ func (p *Parser) getAssign(needEqual bool) *Assign { func (p *Parser) peekRedir() bool { switch p.tok { - case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, - hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: + case _LitRedir, rdrOut, appOut, rdrIn, rdrInOut, dplIn, dplOut, + rdrClob, appClob, hdoc, dashHdoc, wordHdoc, + rdrAll, rdrAllClob, appAll, appAllClob: return true } return false @@ -1678,13 +1995,16 @@ func (p *Parser) doRedirect(s *Stmt) { s.Redirs = append(s.Redirs, r) } r.N = p.getLit() - if !p.lang.isBash() && r.N != nil && r.N.Value[0] == '{' { - p.langErr(r.N.Pos(), "{varname} redirects", LangBash) - } - if p.lang == LangPOSIX && (p.tok == rdrAll || p.tok == appAll) { - p.langErr(p.pos, "&> redirects", LangBash, LangMirBSDKorn) + if r.N != nil && r.N.Value[0] == '{' { + p.checkLang(r.N.Pos(), langBashLike, "`{varname}` redirects") } r.Op, r.OpPos = RedirOperator(p.tok), p.pos + switch r.Op { + case RdrAll, AppAll: + p.checkLang(p.pos, langBashLike|LangMirBSDKorn|LangZsh, "%#q redirects", r.Op) + case AppClob, RdrAllClob, AppAllClob: + p.checkLang(p.pos, LangZsh, "%#q redirects", r.Op) + } p.next() switch r.Op { case Hdoc, DashHdoc: @@ -1704,9 +2024,7 @@ func (p *Parser) doRedirect(s *Stmt) { p.doHeredocs() } case WordHdoc: - if p.lang == LangPOSIX { - p.langErr(r.OpPos, "herestrings", LangBash, LangMirBSDKorn) - } + p.checkLang(r.OpPos, langBashLike|LangMirBSDKorn|LangZsh, "herestrings") fallthrough default: r.Word = p.followWordTok(token(r.Op), r.OpPos) @@ -1719,7 +2037,7 @@ func (p *Parser) getStmt(readEnd, binCmd, fnBody bool) *Stmt { if ok { s.Negated = true if p.stopToken() { - p.posErr(s.Pos(), `"!" cannot form a statement alone`) + p.posErr(s.Pos(), `%#q cannot form a statement alone`, exclMark) } if _, ok := p.gotRsrv("!"); ok { p.posErr(s.Pos(), `cannot negate a command multiple times`) @@ -1747,7 +2065,7 @@ func (p *Parser) getStmt(readEnd, binCmd, fnBody bool) *Stmt { if p.recoverError() { b.Y = &Stmt{Position: recoveredPos} } else { - p.followErr(b.OpPos, b.Op.String(), "a statement") + p.followErr(b.OpPos, b.Op, noQuote("a statement")) return nil } } @@ -1768,6 +2086,10 @@ func (p *Parser) getStmt(readEnd, binCmd, fnBody bool) *Stmt { s.Semicolon = p.pos p.next() s.Coprocess = true + case andPipe, andBang: + s.Semicolon = p.pos + p.next() + s.Disown = true } } if len(p.accComs) > 0 && !binCmd && !fnBody { @@ -1782,76 +2104,86 @@ func (p *Parser) getStmt(readEnd, binCmd, fnBody bool) *Stmt { func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { s.Comments, p.accComs = p.accComs, nil + for p.peekRedir() { + p.doRedirect(s) + } + redirsStart := len(s.Redirs) switch p.tok { case _LitWord: switch p.val { case "{": p.block(s) + case "{}": + // Zsh treats closing braces in a special way, allowing this. + if p.lang.in(LangZsh) { + s.Cmd = &Block{Lbrace: p.pos, Rbrace: posAddCol(p.pos, 1)} + p.next() + } case "if": p.ifClause(s) case "while", "until": + // TODO(zsh): "repeat" p.whileClause(s, p.val == "until") case "for": p.forClause(s) case "case": p.caseClause(s) + // TODO(zsh): { try-list } "always" { always-list } case "}": - p.curErr(`%q can only be used to close a block`, p.val) - case "then": - p.curErr(`%q can only be used in an if`, p.val) - case "elif": - p.curErr(`%q can only be used in an if`, p.val) + p.curErr(`%#q can only be used to close a block`, rightBrace) + case "then", "elif": + p.curErr("%#q can only be used in an `if`", p.val) case "fi": - p.curErr(`%q can only be used to end an if`, p.val) + p.curErr("%#q can only be used to end an `if`", p.val) case "do": - p.curErr(`%q can only be used in a loop`, p.val) + p.curErr(`%#q can only be used in a loop`, p.val) case "done": - p.curErr(`%q can only be used to end a loop`, p.val) + p.curErr(`%#q can only be used to end a loop`, p.val) case "esac": - p.curErr(`%q can only be used to end a case`, p.val) + p.curErr("%#q can only be used to end a `case`", p.val) case "!": if !s.Negated { - p.curErr(`"!" can only be used in full statements`) + p.curErr(`%#q can only be used in full statements`, exclMark) break } case "[[": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.testClause(s) } case "]]": - if p.lang != LangPOSIX { - p.curErr(`%q can only be used to close a test`, p.val) + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { + p.curErr(`%#q can only be used to close a test`, dblRightBrack) } case "let": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.letClause(s) } case "function": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.bashFuncDecl(s) } case "declare": - if p.lang.isBash() { // Note that mksh lacks this one. + if p.lang.in(langBashLike | LangZsh) { // Note that mksh lacks this one. p.declClause(s) } case "local", "export", "readonly", "typeset", "nameref": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.declClause(s) } case "time": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.timeClause(s) } case "coproc": - if p.lang.isBash() { // Note that mksh lacks this one. + if p.lang.in(langBashLike) { // Note that mksh lacks this one. p.coprocClause(s) } case "select": - if p.lang != LangPOSIX { + if p.lang.in(langBashLike | LangMirBSDKorn | LangZsh) { p.selectClause(s) } case "@test": - if p.lang == LangBats { + if p.lang.in(LangBats) { p.testDecl(s) } } @@ -1863,25 +2195,29 @@ func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { break } name := p.lit(p.pos, p.val) - if p.next(); p.got(leftParen) { + p.next() + // In zsh, ( after a word is a glob qualifier unless followed + // immediately by ), which is the func declaration syntax. + if p.tok == leftParen && (!p.lang.in(LangZsh) || p.r == ')') { + p.next() p.follow(name.ValuePos, "foo(", rightParen) - if p.lang == LangPOSIX && !ValidName(name.Value) { + if p.lang.in(LangPOSIX) && !ValidName(name.Value) { p.posErr(name.Pos(), "invalid func name") } - p.funcDecl(s, name, name.ValuePos, true) + p.funcDecl(s, name.ValuePos, false, true, name) } else { - p.callExpr(s, p.wordOne(name), false) + w := p.wordOne(name) + if p.lang.in(LangZsh) && !p.spaced { + w.Parts = append(w.Parts, p.wordParts(nil)...) + } + p.callExpr(s, w, false) } - case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, - hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: - p.doRedirect(s) - p.callExpr(s, nil, false) case bckQuote: if p.backquoteEnd() { - return nil + break } fallthrough - case _Lit, dollBrace, dollDblParen, dollParen, dollar, cmdIn, cmdOut, + case _Lit, dollBrace, dollDblParen, dollParen, dollar, cmdIn, assgnParen, cmdOut, sglQuote, dollSglQuote, dblQuote, dollDblQuote, dollBrack, globQuest, globStar, globPlus, globAt, globExcl: if p.hasValidIdent() { @@ -1894,12 +2230,26 @@ func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { } p.callExpr(s, w, false) case leftParen: + if p.r == ')' { + p.rune() + fpos := p.pos + p.next() + if p.tok == _LitWord && p.val == "{" { + p.checkLang(fpos, LangZsh, "anonymous functions") + } + p.funcDecl(s, fpos, false, true) + break + } p.subshell(s) case dblLeftParen: p.arithmExpCmd(s) - default: - if len(s.Redirs) == 0 { - return nil + } + if s.Cmd == nil && len(s.Redirs) == 0 { + return nil // no statement found + } + if redirsStart > 0 && s.Cmd != nil { + if _, ok := s.Cmd.(*CallExpr); !ok { + p.checkLang(s.Pos(), LangZsh, "redirects before compound commands") } } for p.peekRedir() { @@ -1912,7 +2262,7 @@ func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { // right recursion should only read a single element return s } - if p.tok == orAnd && p.lang == LangMirBSDKorn { + if p.tok == orAnd && p.lang.in(LangMirBSDKorn) { // No need to check for LangPOSIX, as on that language // we parse |& as two tokens. break @@ -1924,7 +2274,7 @@ func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { if p.recoverError() { b.Y = &Stmt{Position: recoveredPos} } else { - p.followErr(b.OpPos, b.Op.String(), "a statement") + p.followErr(b.OpPos, b.Op, noQuote("a statement")) break } } @@ -1942,7 +2292,7 @@ func (p *Parser) subshell(s *Stmt) { sub := &Subshell{Lparen: p.pos} old := p.preNested(subCmd) p.next() - sub.Stmts, sub.Last = p.stmtList() + sub.Stmts, sub.Last = p.followStmts("(", sub.Lparen) p.postNested(old) sub.Rparen = p.matched(sub.Lparen, leftParen, rightParen) s.Cmd = sub @@ -1953,9 +2303,7 @@ func (p *Parser) arithmExpCmd(s *Stmt) { old := p.preNested(arithmExprCmd) p.next() if p.got(hash) { - if p.lang != LangMirBSDKorn { - p.langErr(ar.Pos(), "unsigned expressions", LangMirBSDKorn) - } + p.checkLang(ar.Pos(), LangMirBSDKorn, "unsigned expressions") ar.Unsigned = true } ar.X = p.followArithm(dblLeftParen, ar.Left) @@ -1966,13 +2314,13 @@ func (p *Parser) arithmExpCmd(s *Stmt) { func (p *Parser) block(s *Stmt) { b := &Block{Lbrace: p.pos} p.next() - b.Stmts, b.Last = p.stmtList("}") + b.Stmts, b.Last = p.followStmts("{", b.Lbrace, "}") if pos, ok := p.gotRsrv("}"); ok { b.Rbrace = pos } else if p.recoverError() { b.Rbrace = recoveredPos } else { - p.matchingErr(b.Lbrace, "{", "}") + p.matchingErr(b.Lbrace, leftBrace, rightBrace) } s.Cmd = b } @@ -2036,9 +2384,7 @@ func (p *Parser) forClause(s *Stmt) { start, end := "do", "done" if pos, ok := p.gotRsrv("{"); ok { - if p.lang == LangPOSIX { - p.langErr(pos, "for loops with braces", LangBash, LangMirBSDKorn) - } + p.checkLang(pos, langBashLike|LangMirBSDKorn, "for loops with braces") fc.DoPos = pos fc.Braces = true start, end = "{", "}" @@ -2054,11 +2400,9 @@ func (p *Parser) forClause(s *Stmt) { } func (p *Parser) loop(fpos Pos) Loop { - if !p.lang.isBash() { - switch p.tok { - case leftParen, dblLeftParen: - p.langErr(p.pos, "c-style fors", LangBash) - } + switch p.tok { + case leftParen, dblLeftParen: + p.checkLang(p.pos, langBashLike|LangZsh, "c-style fors") } if p.tok == dblLeftParen { cl := &CStyleLoop{Lparen: p.pos} @@ -2082,7 +2426,7 @@ func (p *Parser) loop(fpos Pos) Loop { func (p *Parser) wordIter(ftok string, fpos Pos) *WordIter { wi := &WordIter{} if wi.Name = p.getLit(); wi.Name == nil { - p.followErr(fpos, ftok, "a literal") + p.followErr(fpos, ftok, noQuote("a literal")) } if p.got(semicolon) { p.got(_Newl) @@ -2102,7 +2446,7 @@ func (p *Parser) wordIter(ftok string, fpos Pos) *WordIter { p.got(_Newl) } else if p.tok == _LitWord && p.val == "do" { } else { - p.followErr(fpos, ftok+" foo", `"in", "do", ;, or a newline`) + p.followErr(fpos, ftok+" foo", noQuote("`in`, `do`, `;`, or a newline")) } return wi } @@ -2122,16 +2466,14 @@ func (p *Parser) caseClause(s *Stmt) { p.next() cc.Word = p.getWord() if cc.Word == nil { - p.followErr(cc.Case, "case", "a word") + p.followErr(cc.Case, "case", noQuote("a word")) } end := "esac" p.got(_Newl) if pos, ok := p.gotRsrv("{"); ok { cc.In = pos cc.Braces = true - if p.lang != LangMirBSDKorn { - p.langErr(cc.Pos(), `"case i {"`, LangMirBSDKorn) - } + p.checkLang(cc.Pos(), LangMirBSDKorn, "`case i {`") end = "}" } else { cc.In = p.followRsrv(cc.Case, "case x", "in") @@ -2158,7 +2500,7 @@ func (p *Parser) caseItems(stop string) (items []*CaseItem) { break } if !p.got(or) { - p.curErr("case patterns must be separated with |") + p.curErr("case patterns must be separated with %#q", or) } } old := p.preNested(switchCase) @@ -2170,7 +2512,7 @@ func (p *Parser) caseItems(stop string) (items []*CaseItem) { default: ci.Op = Break items = append(items, ci) - return + return items } ci.Last = append(ci.Last, p.accComs...) p.accComs = nil @@ -2201,35 +2543,31 @@ func (p *Parser) caseItems(stop string) (items []*CaseItem) { items = append(items, ci) } - return + return items } func (p *Parser) testClause(s *Stmt) { tc := &TestClause{Left: p.pos} old := p.preNested(testExpr) p.next() - if _, ok := p.gotRsrv("]]"); ok || p.tok == _EOF { - p.posErr(tc.Left, "test clause requires at least one expression") - } - tc.X = p.testExpr(false) - if tc.X == nil { - p.followErrExp(tc.Left, "[[") + if tc.X = p.testExprBinary(false); tc.X == nil { + p.followErrExp(tc.Left, dblLeftBrack) } tc.Right = p.pos if _, ok := p.gotRsrv("]]"); !ok { - p.matchingErr(tc.Left, "[[", "]]") + p.matchingErr(tc.Left, dblLeftBrack, dblRightBrack) } p.postNested(old) s.Cmd = tc } -func (p *Parser) testExpr(pastAndOr bool) TestExpr { +func (p *Parser) testExprBinary(pastAndOr bool) TestExpr { p.got(_Newl) var left TestExpr if pastAndOr { - left = p.testExprBase() + left = p.testExprUnary() } else { - left = p.testExpr(true) + left = p.testExprBinary(true) } if left == nil { return left @@ -2242,7 +2580,7 @@ func (p *Parser) testExpr(pastAndOr bool) TestExpr { return left } if p.tok = token(testBinaryOp(p.val)); p.tok == illegalTok { - p.curErr("not a valid test operator: %s", p.val) + p.curErr("not a valid test operator: %#q", p.val) } case rdrIn, rdrOut: case _EOF, rightParen: @@ -2250,26 +2588,21 @@ func (p *Parser) testExpr(pastAndOr bool) TestExpr { case _Lit: p.curErr("test operator words must consist of a single literal") default: - p.curErr("not a valid test operator: %v", p.tok) + p.curErr("not a valid test operator: %#q", p.tok) } b := &BinaryTest{ OpPos: p.pos, Op: BinTestOperator(p.tok), X: left, } - // Save the previous quoteState, since we change it in TsReMatch. - oldQuote := p.quote - switch b.Op { case AndTest, OrTest: p.next() - if b.Y = p.testExpr(false); b.Y == nil { - p.followErrExp(b.OpPos, b.Op.String()) + if b.Y = p.testExprBinary(false); b.Y == nil { + p.followErrExp(b.OpPos, b.Op) } case TsReMatch: - if !p.lang.isBash() { - p.langErr(p.pos, "regex tests", LangBash) - } + p.checkLang(p.pos, langBashLike|LangZsh, "regex tests") p.rxOpenParens = 0 p.rxFirstPart = true // TODO(mvdan): Using nested states within a regex will break in @@ -2279,17 +2612,16 @@ func (p *Parser) testExpr(pastAndOr bool) TestExpr { fallthrough default: if _, ok := b.X.(*Word); !ok { - p.posErr(b.OpPos, "expected %s, %s or %s after complex expr", - AndTest, OrTest, "]]") + p.posErr(b.OpPos, "expected %#q, %#q or %#q after complex expr", + AndTest, OrTest, dblRightBrack) } p.next() b.Y = p.followWordTok(token(b.Op), b.OpPos) } - p.quote = oldQuote return b } -func (p *Parser) testExprBase() TestExpr { +func (p *Parser) testExprUnary() TestExpr { switch p.tok { case _EOF, rightParen: return nil @@ -2298,7 +2630,7 @@ func (p *Parser) testExprBase() TestExpr { switch op { case illegalTok: case tsRefVar, tsModif: // not available in mksh - if p.lang.isBash() { + if p.lang.in(langBashLike) { p.tok = op } default: @@ -2309,8 +2641,8 @@ func (p *Parser) testExprBase() TestExpr { case exclMark: u := &UnaryTest{OpPos: p.pos, Op: TsNot} p.next() - if u.X = p.testExpr(false); u.X == nil { - p.followErrExp(u.OpPos, u.Op.String()) + if u.X = p.testExprBinary(false); u.X == nil { + p.followErrExp(u.OpPos, u.Op) } return u case tsExists, tsRegFile, tsDirect, tsCharSp, tsBlckSp, tsNmPipe, @@ -2324,8 +2656,8 @@ func (p *Parser) testExprBase() TestExpr { case leftParen: pe := &ParenTest{Lparen: p.pos} p.next() - if pe.X = p.testExpr(false); pe.X == nil { - p.followErrExp(pe.Lparen, "(") + if pe.X = p.testExprBinary(false); pe.X == nil { + p.followErrExp(pe.Lparen, leftParen) } pe.Rparen = p.matched(pe.Lparen, leftParen, rightParen) return pe @@ -2349,7 +2681,7 @@ func (p *Parser) declClause(s *Stmt) { for !p.stopToken() && !p.peekRedir() { if p.hasValidIdent() { ds.Args = append(ds.Args, p.getAssign(false)) - } else if p.eqlOffs > 0 { + } else if p.eqlOffs > 0 && !strings.Contains(p.val[:p.eqlOffs], "{") { p.curErr("invalid var name") } else if p.tok == _LitWord && ValidName(p.val) { ds.Args = append(ds.Args, &Assign{ @@ -2362,7 +2694,7 @@ func (p *Parser) declClause(s *Stmt) { Value: w, }) } else { - p.followErr(p.pos, ds.Variant.Value, "names or assignments") + p.followErr(p.pos, ds.Variant.Value, noQuote("names or assignments")) } } s.Cmd = ds @@ -2442,26 +2774,40 @@ func (p *Parser) letClause(s *Stmt) { func (p *Parser) bashFuncDecl(s *Stmt) { fpos := p.pos - if p.next(); p.tok != _LitWord { - p.followErr(fpos, "function", "a name") + p.next() + names := make([]*Lit, 0, 1) + for p.tok == _LitWord && p.val != "{" { + names = append(names, p.lit(p.pos, p.val)) + p.next() } - name := p.lit(p.pos, p.val) - hasParens := false - if p.next(); p.got(leftParen) { - hasParens = true - p.follow(name.ValuePos, "foo(", rightParen) + hasParens := p.got(leftParen) + switch len(names) { + case 0: + if hasParens || (p.tok == _LitWord && p.val == "{") { + p.checkLang(fpos, LangZsh, "anonymous functions") + } else if !p.lang.in(LangZsh) { + p.followErr(fpos, "function", noQuote("a name")) + } + names = nil // avoid non-nil zero-length slices + case 1: + // allowed in all variants + default: + p.checkLang(fpos, LangZsh, "multi-name functions") } - p.funcDecl(s, name, fpos, hasParens) + if hasParens { + p.follow(fpos, "function foo(", rightParen) + } + p.funcDecl(s, fpos, true, hasParens, names...) } func (p *Parser) testDecl(s *Stmt) { td := &TestDecl{Position: p.pos} p.next() if td.Description = p.getWord(); td.Description == nil { - p.followErr(td.Position, "@test", "a description word") + p.followErr(td.Position, "@test", noQuote("a description word")) } if td.Body = p.getStmt(false, false, true); td.Body == nil { - p.followErr(td.Position, `@test "desc"`, "a statement") + p.followErr(td.Position, `@test "desc"`, noQuote("a statement")) } s.Cmd = td } @@ -2477,7 +2823,7 @@ func (p *Parser) callExpr(s *Stmt, w *Word, assign bool) { loop: for { switch p.tok { - case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, + case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, andPipe, andBang, dblSemicolon, semiAnd, dblSemiAnd, semiOr: break loop case _LitWord: @@ -2486,11 +2832,19 @@ loop: break } // Avoid failing later with the confusing "} can only be used to close a block". - if p.lang == LangPOSIX && p.val == "{" && w != nil && w.Lit() == "function" { - p.langErr(p.pos, `the "function" builtin`, LangBash) + if p.val == "{" && w != nil && w.Lit() == "function" { + p.checkLang(p.pos, langBashLike, `the "function" builtin`) + } + // Zsh does not require a semicolon to close a block. + if p.lang.in(LangZsh) && p.val == "}" { + break loop } - ce.Args = append(ce.Args, p.wordOne(p.lit(p.pos, p.val))) + w := p.wordOne(p.lit(p.pos, p.val)) p.next() + if p.lang.in(LangZsh) && !p.spaced { + w.Parts = append(w.Parts, p.wordParts(nil)...) + } + ce.Args = append(ce.Args, w) case _Lit: if len(ce.Args) == 0 && p.hasValidIdent() { ce.Assigns = append(ce.Assigns, p.getAssign(true)) @@ -2502,33 +2856,31 @@ loop: break loop } fallthrough - case dollBrace, dollDblParen, dollParen, dollar, cmdIn, cmdOut, + case dollBrace, dollDblParen, dollParen, dollar, cmdIn, assgnParen, cmdOut, sglQuote, dollSglQuote, dblQuote, dollDblQuote, dollBrack, globQuest, globStar, globPlus, globAt, globExcl: ce.Args = append(ce.Args, p.wordAnyNumber()) - case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, - hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: - p.doRedirect(s) case dblLeftParen: - p.curErr("%s can only be used to open an arithmetic cmd", p.tok) + p.curErr("%#q can only be used to open an arithmetic cmd", p.tok) case rightParen: if p.quote == subCmd { break loop } fallthrough default: + if p.peekRedir() { + p.doRedirect(s) + continue + } // Note that we'll only keep the first error that happens. if len(ce.Args) > 0 { - if cmd := ce.Args[0].Lit(); p.lang == LangPOSIX && isBashCompoundCommand(_LitWord, cmd) { - p.langErr(p.pos, fmt.Sprintf("the %q builtin", cmd), LangBash) + if cmd := ce.Args[0].Lit(); isBashCompoundCommand(_LitWord, cmd) { + p.checkLang(p.pos, langBashLike, "the %#q builtin", cmd) } } - p.curErr("a command can only contain words and redirects; encountered %s", p.tok) + p.curErr("a command can only contain words and redirects; encountered %#q", p.tok) } } - if len(ce.Assigns) == 0 && len(ce.Args) == 0 { - return - } if len(ce.Args) == 0 { ce.Args = nil } else { @@ -2541,16 +2893,21 @@ loop: s.Cmd = ce } -func (p *Parser) funcDecl(s *Stmt, name *Lit, pos Pos, withParens bool) { +func (p *Parser) funcDecl(s *Stmt, pos Pos, long, withParens bool, names ...*Lit) { fd := &FuncDecl{ Position: pos, - RsrvWord: pos != name.ValuePos, + RsrvWord: long, Parens: withParens, - Name: name, + } + if len(names) == 1 { + fd.Name = names[0] + } else { + fd.Names = names } p.got(_Newl) + // TODO: reject any body which isn't a compound command, like a quoted word if fd.Body = p.getStmt(false, false, true); fd.Body == nil { - p.followErr(fd.Pos(), "foo()", "a statement") + p.followErr(fd.Pos(), "foo()", noQuote("a statement")) } s.Cmd = fd } diff --git a/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go b/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go index d04f3d896..970b6bfaf 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go +++ b/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go @@ -18,19 +18,20 @@ func (p *Parser) arithmExprAssign(compact bool) ArithmExpr { value := p.arithmExprTernary(compact) switch BinAritOperator(p.tok) { case AddAssgn, SubAssgn, MulAssgn, QuoAssgn, RemAssgn, AndAssgn, - OrAssgn, XorAssgn, ShlAssgn, ShrAssgn, Assgn: + OrAssgn, XorAssgn, ShlAssgn, ShrAssgn, Assgn, + AndBoolAssgn, OrBoolAssgn, XorBoolAssgn, PowAssgn: if compact && p.spaced { return value } if !isArithName(value) { - p.posErr(p.pos, "%s must follow a name", p.tok.String()) + p.posErr(p.pos, "%#q must follow a name", p.tok) } pos := p.pos tok := p.tok p.nextArithOp(compact) y := p.arithmExprAssign(compact) if y == nil { - p.followErrExp(pos, tok.String()) + p.followErrExp(pos, tok) } return &BinaryArithm{ OpPos: pos, @@ -49,25 +50,25 @@ func (p *Parser) arithmExprTernary(compact bool) ArithmExpr { } if value == nil { - p.curErr("%s must follow an expression", p.tok.String()) + p.curErr("%#q must follow an expression", p.tok) } questPos := p.pos p.nextArithOp(compact) if BinAritOperator(p.tok) == TernColon { - p.followErrExp(questPos, TernQuest.String()) + p.followErrExp(questPos, TernQuest) } trueExpr := p.arithmExpr(compact) if trueExpr == nil { - p.followErrExp(questPos, TernQuest.String()) + p.followErrExp(questPos, TernQuest) } if BinAritOperator(p.tok) != TernColon { - p.posErr(questPos, "ternary operator missing : after ?") + p.posErr(questPos, "ternary operator missing %#q after %#q", colon, quest) } colonPos := p.pos p.nextArithOp(compact) falseExpr := p.arithmExprTernary(compact) if falseExpr == nil { - p.followErrExp(colonPos, TernColon.String()) + p.followErrExp(colonPos, TernColon) } return &BinaryArithm{ OpPos: questPos, @@ -83,7 +84,7 @@ func (p *Parser) arithmExprTernary(compact bool) ArithmExpr { } func (p *Parser) arithmExprLor(compact bool) ArithmExpr { - return p.arithmExprBinary(compact, p.arithmExprLand, OrArit) + return p.arithmExprBinary(compact, p.arithmExprLand, OrArit, XorBool) } func (p *Parser) arithmExprLand(compact bool) ArithmExpr { @@ -130,7 +131,7 @@ func (p *Parser) arithmExprPower(compact bool) ArithmExpr { } if value == nil { - p.curErr("%s must follow an expression", p.tok.String()) + p.curErr("%#q must follow an expression", p.tok) } op := p.tok @@ -138,7 +139,7 @@ func (p *Parser) arithmExprPower(compact bool) ArithmExpr { p.nextArithOp(compact) y := p.arithmExprPower(compact) if y == nil { - p.followErrExp(pos, op.String()) + p.followErrExp(pos, op) } return &BinaryArithm{ OpPos: pos, @@ -158,7 +159,7 @@ func (p *Parser) arithmExprUnary(compact bool) ArithmExpr { ue := &UnaryArithm{OpPos: p.pos, Op: UnAritOperator(p.tok)} p.nextArithOp(compact) if ue.X = p.arithmExprUnary(compact); ue.X == nil { - p.followErrExp(ue.OpPos, ue.Op.String()) + p.followErrExp(ue.OpPos, ue.Op) } return ue } @@ -172,27 +173,34 @@ func (p *Parser) arithmExprValue(compact bool) ArithmExpr { ue := &UnaryArithm{OpPos: p.pos, Op: UnAritOperator(p.tok)} p.nextArith(compact) if p.tok != _LitWord { - p.followErr(ue.OpPos, token(ue.Op).String(), "a literal") + p.followErr(ue.OpPos, ue.Op, noQuote("a literal")) } ue.X = p.arithmExprValue(compact) return ue case leftParen: + if p.quote == paramExpArithm && p.lang.in(LangZsh) { + x = p.zshSubFlags() + break + } pe := &ParenArithm{Lparen: p.pos} p.nextArithOp(compact) pe.X = p.followArithm(leftParen, pe.Lparen) pe.Rparen = p.matched(pe.Lparen, leftParen, rightParen) + if p.quote == paramExpArithm && p.tok == _LitWord { + p.checkLang(pe.Lparen, LangZsh, "subscript flags") + } x = pe case leftBrack: - p.curErr("[ must follow a name") + p.curErr("%#q must follow a name", p.tok) case colon: - p.curErr("ternary operator missing ? before :") + p.curErr("ternary operator missing %#q before %#q", quest, colon) case _LitWord: l := p.getLit() if p.tok != leftBrack { x = p.wordOne(l) break } - pe := &ParamExp{Dollar: l.ValuePos, Short: true, Param: l} + pe := &ParamExp{Short: true, Param: l} pe.Index = p.eitherIndex() x = p.wordOne(pe) case bckQuote: @@ -219,7 +227,7 @@ func (p *Parser) arithmExprValue(compact bool) ArithmExpr { // sets the type to non-nil and then x != nil if p.tok == addAdd || p.tok == subSub { if !isArithName(x) { - p.curErr("%s must follow a name", p.tok.String()) + p.curErr("%#q must follow a name", p.tok) } u := &UnaryArithm{ Post: true, @@ -250,7 +258,7 @@ func (p *Parser) nextArithOp(compact bool) { pos := p.pos tok := p.tok if p.nextArith(compact) { - p.followErrExp(pos, tok.String()) + p.followErrExp(pos, tok) } } @@ -271,14 +279,14 @@ func (p *Parser) arithmExprBinary(compact bool, nextOp func(bool) ArithmExpr, op } if value == nil { - p.curErr("%s must follow an expression", p.tok.String()) + p.curErr("%#q must follow an expression", p.tok) } pos := p.pos p.nextArithOp(compact) y := nextOp(compact) if y == nil { - p.followErrExp(pos, foundOp.String()) + p.followErrExp(pos, foundOp) } value = &BinaryArithm{ @@ -308,7 +316,7 @@ func isArithName(left ArithmExpr) bool { func (p *Parser) followArithm(ftok token, fpos Pos) ArithmExpr { x := p.arithmExpr(false) if x == nil { - p.followErrExp(fpos, ftok.String()) + p.followErrExp(fpos, ftok) } return x } @@ -320,16 +328,18 @@ func (p *Parser) peekArithmEnd() bool { func (p *Parser) arithmMatchingErr(pos Pos, left, right token) { switch p.tok { case _Lit, _LitWord: - p.curErr("not a valid arithmetic operator: %s", p.val) + p.curErr("not a valid arithmetic operator: %#q", p.val) case leftBrack: - p.curErr("[ must follow a name") + p.curErr("%#q must follow a name", leftBrack) case colon: - p.curErr("ternary operator missing ? before :") + p.curErr("ternary operator missing %#q before %#q", quest, colon) case rightParen, _EOF: p.matchingErr(pos, left, right) + case period: + p.checkLang(p.pos, LangZsh, `floating point arithmetic`) default: - if p.quote == arithmExpr { - p.curErr("not a valid arithmetic operator: %v", p.tok) + if p.quote&allArithmExpr != 0 { + p.curErr("not a valid arithmetic operator: %#q", p.tok) } p.matchingErr(pos, left, right) } diff --git a/vendor/mvdan.cc/sh/v3/syntax/printer.go b/vendor/mvdan.cc/sh/v3/syntax/printer.go index 74675ad9c..1f0727d23 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/printer.go +++ b/vendor/mvdan.cc/sh/v3/syntax/printer.go @@ -65,13 +65,13 @@ func KeepPadding(enabled bool) PrinterOption { if enabled && !p.keepPadding { // Enable the flag, and set up the writer wrapper. p.keepPadding = true - p.cols.Writer = p.bufWriter.(*bufio.Writer) - p.bufWriter = &p.cols + p.cols.Writer = p.w.(*bufio.Writer) + p.w = &p.cols } else if !enabled && p.keepPadding { // Ensure we reset the state to that of NewPrinter. p.keepPadding = false - p.bufWriter = p.cols.Writer + p.w = p.cols.Writer p.cols = colCounter{} } } @@ -102,7 +102,7 @@ func FunctionNextLine(enabled bool) PrinterOption { // NewPrinter allocates a new Printer and applies any number of options. func NewPrinter(opts ...PrinterOption) *Printer { p := &Printer{ - bufWriter: bufio.NewWriter(nil), + w: bufio.NewWriter(nil), tabWriter: new(tabwriter.Writer), } for _, opt := range opts { @@ -138,7 +138,7 @@ func (p *Printer) Print(w io.Writer, node Node) error { p.tabWriter.Init(w, 0, tabwidth, 1, ' ', twmode) w = p.tabWriter - p.bufWriter.Reset(w) + p.w.Reset(w) switch node := node.(type) { case *File: p.stmtList(node.Stmts, node.Last) @@ -163,7 +163,7 @@ func (p *Printer) Print(w io.Writer, node Node) error { p.flushComments() // flush the writers - if err := p.bufWriter.Flush(); err != nil { + if err := p.w.Flush(); err != nil { return err } if tw, _ := w.(*tabwriter.Writer); tw != nil { @@ -221,9 +221,9 @@ func (c *colCounter) Reset(w io.Writer) { // Printer holds the internal state of the printing mechanism of a // program. type Printer struct { - bufWriter // TODO: embedding this makes the methods part of the API, which we did not intend + w bufWriter tabWriter *tabwriter.Writer - cols colCounter + cols colCounter // used for [KeepPadding] indentSpaces uint binNextLine bool @@ -286,12 +286,12 @@ func (p *Printer) reset() { func (p *Printer) spaces(n uint) { for range n { - p.WriteByte(' ') + p.w.WriteByte(' ') } } func (p *Printer) space() { - p.WriteByte(' ') + p.w.WriteByte(' ') p.wantSpace = spaceWritten } @@ -302,11 +302,11 @@ func (p *Printer) spacePad(pos Pos) { return } if p.wantSpace == spaceRequired { - p.WriteByte(' ') + p.w.WriteByte(' ') p.wantSpace = spaceWritten } for p.cols.column > 0 && p.cols.column < int(pos.Col()) { - p.WriteByte(' ') + p.w.WriteByte(' ') } } @@ -336,25 +336,25 @@ func (p *Printer) bslashNewl() { if p.wantSpace == spaceRequired { p.space() } - p.WriteString("\\\n") + p.w.WriteString("\\\n") p.line++ p.indent() } func (p *Printer) spacedString(s string, pos Pos) { p.spacePad(pos) - p.WriteString(s) + p.w.WriteString(s) p.wantSpace = spaceRequired } func (p *Printer) spacedToken(s string, pos Pos) { if p.minify { - p.WriteString(s) + p.w.WriteString(s) p.wantSpace = spaceNotRequired return } p.spacePad(pos) - p.WriteString(s) + p.w.WriteString(s) p.wantSpace = spaceRequired } @@ -364,14 +364,14 @@ func (p *Printer) semiOrNewl(s string, pos Pos) { p.indent() } else { if !p.wroteSemi { - p.WriteByte(';') + p.w.WriteByte(';') } if !p.minify { p.space() } p.advanceLine(pos.Line()) } - p.WriteString(s) + p.w.WriteString(s) p.wantSpace = spaceRequired } @@ -380,10 +380,10 @@ func (p *Printer) writeLit(s string) { // <<- heredoc bodies, so the parent printer will add the escape bytes // later. if p.tabWriter != nil && strings.Contains(s, "\t") { - p.WriteByte(tabwriter.Escape) - defer p.WriteByte(tabwriter.Escape) + p.w.WriteByte(tabwriter.Escape) + defer p.w.WriteByte(tabwriter.Escape) } - p.WriteString(s) + p.w.WriteString(s) } func (p *Printer) incLevel() { @@ -413,11 +413,11 @@ func (p *Printer) indent() { switch { case p.level == 0: case p.indentSpaces == 0: - p.WriteByte(tabwriter.Escape) + p.w.WriteByte(tabwriter.Escape) for i := uint(0); i < p.level; i++ { - p.WriteByte('\t') + p.w.WriteByte('\t') } - p.WriteByte(tabwriter.Escape) + p.w.WriteByte(tabwriter.Escape) default: p.spaces(p.indentSpaces * p.level) } @@ -429,7 +429,7 @@ func (p *Printer) indent() { func (p *Printer) newline(pos Pos) { p.flushHeredocs() p.flushComments() - p.WriteByte('\n') + p.w.WriteByte('\n') p.wantSpace = spaceWritten p.wantNewline, p.mustNewline = false, false p.advanceLine(pos.Line()) @@ -467,18 +467,18 @@ func (p *Printer) flushHeredocs() { for _, r := range hdocs { p.line++ - p.WriteByte('\n') + p.w.WriteByte('\n') p.wantSpace = spaceWritten p.wantNewline, p.wantNewline = false, false if r.Op == DashHdoc && p.indentSpaces == 0 && !p.minify { if r.Hdoc != nil { extra := extraIndenter{ - bufWriter: p.bufWriter, + bufWriter: p.w, baseIndent: int(p.level + 1), firstIndent: -1, } p.tabsPrinter = &Printer{ - bufWriter: &extra, + w: &extra, // The options need to persist. indentSpaces: p.indentSpaces, @@ -522,13 +522,13 @@ func (p *Printer) newlines(pos Pos) { } p.flushHeredocs() p.flushComments() - p.WriteByte('\n') + p.w.WriteByte('\n') p.wantSpace = spaceWritten p.wantNewline, p.mustNewline = false, false l := pos.Line() if l > p.line+1 && !p.minify { - p.WriteByte('\n') // preserve single empty lines + p.w.WriteByte('\n') // preserve single empty lines } p.advanceLine(l) p.indent() @@ -538,7 +538,7 @@ func (p *Printer) rightParen(pos Pos) { if len(p.pendingHdocs) > 0 || !p.minify { p.newlines(pos) } - p.WriteByte(')') + p.w.WriteByte(')') p.wantSpace = spaceRequired } @@ -547,13 +547,13 @@ func (p *Printer) semiRsrv(s string, pos Pos) { p.newlines(pos) } else { if !p.wroteSemi { - p.WriteByte(';') + p.w.WriteByte(';') } if !p.minify { p.spacePad(pos) } } - p.WriteString(s) + p.w.WriteString(s) p.wantSpace = spaceRequired } @@ -570,9 +570,9 @@ func (p *Printer) flushComments() { cline := c.Hash.Line() switch { case p.mustNewline, i > 0, cline > p.line && p.line > 0: - p.WriteByte('\n') + p.w.WriteByte('\n') if cline > p.line+1 { - p.WriteByte('\n') + p.w.WriteByte('\n') } p.indent() p.wantSpace = spaceWritten @@ -581,14 +581,14 @@ func (p *Printer) flushComments() { if p.keepPadding { p.spacePad(c.Pos()) } else { - p.WriteByte('\t') + p.w.WriteByte('\t') } case p.wantSpace != spaceWritten: p.space() } // don't go back one line, which may happen in some edge cases p.advanceLine(cline) - p.WriteByte('#') + p.w.WriteByte('#') p.writeLit(strings.TrimRightFunc(c.Text, unicode.IsSpace)) p.wantNewline = true p.mustNewline = true @@ -600,8 +600,8 @@ func (p *Printer) comments(comments ...Comment) { if p.minify { for _, c := range comments { if fileutil.Shebang([]byte("#"+c.Text)) != "" && c.Hash.Col() == 1 && c.Hash.Line() == 1 { - p.WriteString(strings.TrimRightFunc("#"+c.Text, unicode.IsSpace)) - p.WriteString("\n") + p.w.WriteString(strings.TrimRightFunc("#"+c.Text, unicode.IsSpace)) + p.w.WriteString("\n") p.line++ } } @@ -631,7 +631,7 @@ func (p *Printer) wordParts(wps []WordPart, quoted bool) { // Can't use p.wantsNewline here, since this is only about // escaped newlines. for quoted && !p.singleLine && wp.Pos().Line() > p.line { - p.WriteString("\\\n") + p.w.WriteString("\\\n") p.line++ } p.wordPart(wp, next) @@ -645,81 +645,52 @@ func (p *Printer) wordPart(wp, next WordPart) { p.writeLit(wp.Value) case *SglQuoted: if wp.Dollar { - p.WriteByte('$') + p.w.WriteByte('$') } - p.WriteByte('\'') + p.w.WriteByte('\'') p.writeLit(wp.Value) - p.WriteByte('\'') + p.w.WriteByte('\'') p.advanceLine(wp.End().Line()) case *DblQuoted: p.dblQuoted(wp) case *CmdSubst: p.advanceLine(wp.Pos().Line()) - switch { - case wp.TempFile: - p.WriteString("${") - p.wantSpace = spaceRequired - p.nestedStmts(wp.Stmts, wp.Last, wp.Right) - p.wantSpace = spaceNotRequired - p.semiRsrv("}", wp.Right) - case wp.ReplyVar: - p.WriteString("${|") - p.nestedStmts(wp.Stmts, wp.Last, wp.Right) - p.wantSpace = spaceNotRequired - p.semiRsrv("}", wp.Right) - // Special case: `# inline comment` - case wp.Backquotes && len(wp.Stmts) == 0 && - len(wp.Last) == 1 && wp.Right.Line() == p.line: - p.WriteString("`#") - p.WriteString(wp.Last[0].Text) - p.WriteString("`") - default: - p.WriteString("$(") - if len(wp.Stmts) > 0 && startsWithLparen(wp.Stmts[0]) { - p.wantSpace = spaceRequired - } else { - p.wantSpace = spaceNotRequired - } - p.nestedStmts(wp.Stmts, wp.Last, wp.Right) - p.rightParen(wp.Right) - } + p.cmdSubst(wp) case *ParamExp: litCont := ";" if nextLit, ok := next.(*Lit); ok && nextLit.Value != "" { litCont = nextLit.Value[:1] } - name := wp.Param.Value - switch { - case !p.minify: - case wp.Excl, wp.Length, wp.Width: - case wp.Index != nil, wp.Slice != nil: - case wp.Repl != nil, wp.Exp != nil: - case len(name) > 1 && !ValidName(name): // ${10} - case ValidName(name + litCont): // ${var}cont - default: - x2 := *wp - x2.Short = true - p.paramExp(&x2) - return + if p.minify && !wp.Short && wp.simple() { + name := wp.Param.Value + switch { + case len(name) > 1 && !ValidName(name): // ${10} + case ValidName(name + litCont): // ${var}cont + default: + x2 := *wp + x2.Short = true + p.paramExp(&x2) + return + } } p.paramExp(wp) case *ArithmExp: - p.WriteString("$((") + p.w.WriteString("$((") if wp.Unsigned { - p.WriteString("# ") + p.w.WriteString("# ") } p.arithmExpr(wp.X, false, false) - p.WriteString("))") + p.w.WriteString("))") case *ExtGlob: - p.WriteString(wp.Op.String()) + p.w.WriteString(wp.Op.String()) p.writeLit(wp.Pattern.Value) - p.WriteByte(')') + p.w.WriteByte(')') case *ProcSubst: // avoid conflict with << and others if p.wantSpace == spaceRequired { p.space() } - p.WriteString(wp.Op.String()) + p.w.WriteString(wp.Op.String()) p.nestedStmts(wp.Stmts, wp.Last, wp.Rparen) p.rightParen(wp.Rparen) } @@ -727,27 +698,29 @@ func (p *Printer) wordPart(wp, next WordPart) { func (p *Printer) dblQuoted(dq *DblQuoted) { if dq.Dollar { - p.WriteByte('$') + p.w.WriteByte('$') } - p.WriteByte('"') + p.w.WriteByte('"') if len(dq.Parts) > 0 { p.wordParts(dq.Parts, true) } // Add any trailing escaped newlines. for p.line < dq.Right.Line() { - p.WriteString("\\\n") + p.w.WriteString("\\\n") p.line++ } - p.WriteByte('"') + p.w.WriteByte('"') } func (p *Printer) wroteIndex(index ArithmExpr) bool { if index == nil { return false } - p.WriteByte('[') - p.arithmExpr(index, false, false) - p.WriteByte(']') + p.w.WriteByte('[') + // Note that e.g. foo[1,3]=$bar in Zsh does not allow any spaces around the comma, + // as that breaks the assignment word. + p.arithmExpr(index, true, false) + p.w.WriteByte(']') return true } @@ -757,52 +730,103 @@ func (p *Printer) paramExp(pe *ParamExp) { p.wroteIndex(pe.Index) return } - if pe.Short { // $var - p.WriteByte('$') - p.writeLit(pe.Param.Value) - return + p.w.WriteByte('$') + if !pe.Short { + p.w.WriteByte('{') + } + if pe.Flags != nil { + p.w.WriteByte('(') + p.writeLit(pe.Flags.Value) + p.w.WriteByte(')') } - // ${var...} - p.WriteString("${") switch { case pe.Length: - p.WriteByte('#') + p.w.WriteByte('#') case pe.Width: - p.WriteByte('%') + p.w.WriteByte('%') + case pe.IsSet: + p.w.WriteByte('+') case pe.Excl: - p.WriteByte('!') + p.w.WriteByte('!') + } + if pe.Param != nil { + p.writeLit(pe.Param.Value) + } else { + // Note that Zsh supports ${${nested}} but not ${$nested}, + // so we need to avoid that simplification here. + saved := p.minify + p.minify = false + p.wordPart(pe.NestedParam, nil) + p.minify = saved } - p.writeLit(pe.Param.Value) p.wroteIndex(pe.Index) switch { + case len(pe.Modifiers) > 0: + for _, lit := range pe.Modifiers { + p.w.WriteByte(':') + p.w.WriteString(lit.Value) + } case pe.Slice != nil: - p.WriteByte(':') + p.w.WriteByte(':') p.arithmExpr(pe.Slice.Offset, true, true) if pe.Slice.Length != nil { - p.WriteByte(':') + p.w.WriteByte(':') p.arithmExpr(pe.Slice.Length, true, false) } case pe.Repl != nil: if pe.Repl.All { - p.WriteByte('/') + p.w.WriteByte('/') } - p.WriteByte('/') + p.w.WriteByte('/') if pe.Repl.Orig != nil { p.word(pe.Repl.Orig) } - p.WriteByte('/') + p.w.WriteByte('/') if pe.Repl.With != nil { p.word(pe.Repl.With) } case pe.Names != 0: p.writeLit(pe.Names.String()) case pe.Exp != nil: - p.WriteString(pe.Exp.Op.String()) + p.w.WriteString(pe.Exp.Op.String()) if pe.Exp.Word != nil { p.word(pe.Exp.Word) } } - p.WriteByte('}') + if !pe.Short { + p.w.WriteByte('}') + } +} + +func (p *Printer) cmdSubst(cs *CmdSubst) { + switch { + case cs.TempFile: + p.w.WriteString("${") + p.wantSpace = spaceRequired + p.nestedStmts(cs.Stmts, cs.Last, cs.Right) + p.wantSpace = spaceNotRequired + p.semiRsrv("}", cs.Right) + case cs.ReplyVar: + p.w.WriteString("${|") + p.nestedStmts(cs.Stmts, cs.Last, cs.Right) + p.wantSpace = spaceNotRequired + p.semiRsrv("}", cs.Right) + // Special case: `# inline comment` + case cs.Backquotes && len(cs.Stmts) == 0 && + len(cs.Last) == 1 && cs.Right.Line() == p.line: + p.w.WriteString("`#") + p.w.WriteString(cs.Last[0].Text) + p.w.WriteString("`") + default: + p.w.WriteString("$(") + if len(cs.Stmts) > 0 && startsWithLparen(cs.Stmts[0]) { + p.wantSpace = spaceRequired + } else { + p.wantSpace = spaceNotRequired + } + p.nestedStmts(cs.Stmts, cs.Last, cs.Right) + p.rightParen(cs.Right) + } } func (p *Printer) loop(loop Loop) { @@ -814,16 +838,16 @@ func (p *Printer) loop(loop Loop) { p.wordJoin(loop.Items) } case *CStyleLoop: - p.WriteString("((") + p.w.WriteString("((") if loop.Init == nil { p.space() } p.arithmExpr(loop.Init, false, false) - p.WriteString("; ") + p.w.WriteString("; ") p.arithmExpr(loop.Cond, false, false) - p.WriteString("; ") + p.w.WriteString("; ") p.arithmExpr(loop.Post, false, false) - p.WriteString("))") + p.w.WriteString("))") } } @@ -831,27 +855,31 @@ func (p *Printer) arithmExpr(expr ArithmExpr, compact, spacePlusMinus bool) { if p.minify { compact = true } + p.arithmExprRecurse(expr, compact, spacePlusMinus) +} + +func (p *Printer) arithmExprRecurse(expr ArithmExpr, compact, spacePlusMinus bool) { switch expr := expr.(type) { case *Word: p.word(expr) case *BinaryArithm: if compact { - p.arithmExpr(expr.X, compact, spacePlusMinus) - p.WriteString(expr.Op.String()) - p.arithmExpr(expr.Y, compact, false) + p.arithmExprRecurse(expr.X, compact, spacePlusMinus) + p.w.WriteString(expr.Op.String()) + p.arithmExprRecurse(expr.Y, compact, false) } else { - p.arithmExpr(expr.X, compact, spacePlusMinus) + p.arithmExprRecurse(expr.X, compact, spacePlusMinus) if expr.Op != Comma { p.space() } - p.WriteString(expr.Op.String()) + p.w.WriteString(expr.Op.String()) p.space() - p.arithmExpr(expr.Y, compact, false) + p.arithmExprRecurse(expr.Y, compact, false) } case *UnaryArithm: if expr.Post { - p.arithmExpr(expr.X, compact, spacePlusMinus) - p.WriteString(expr.Op.String()) + p.arithmExprRecurse(expr.X, compact, spacePlusMinus) + p.w.WriteString(expr.Op.String()) } else { if spacePlusMinus { switch expr.Op { @@ -859,13 +887,20 @@ func (p *Printer) arithmExpr(expr ArithmExpr, compact, spacePlusMinus bool) { p.space() } } - p.WriteString(expr.Op.String()) - p.arithmExpr(expr.X, compact, false) + p.w.WriteString(expr.Op.String()) + p.arithmExprRecurse(expr.X, compact, false) } case *ParenArithm: - p.WriteByte('(') - p.arithmExpr(expr.X, false, false) - p.WriteByte(')') + p.w.WriteByte('(') + p.arithmExprRecurse(expr.X, false, false) + p.w.WriteByte(')') + case *FlagsArithm: + p.w.WriteByte('(') + p.w.WriteString(expr.Flags.Value) + p.w.WriteByte(')') + if expr.X != nil { + p.arithmExprRecurse(expr.X, compact, false) + } } } @@ -888,7 +923,7 @@ func (p *Printer) testExprSameLine(expr TestExpr) { case *BinaryTest: p.testExprSameLine(expr.X) p.space() - p.WriteString(expr.Op.String()) + p.w.WriteString(expr.Op.String()) switch expr.Op { case AndTest, OrTest: p.wantSpace = spaceRequired @@ -898,18 +933,18 @@ func (p *Printer) testExprSameLine(expr TestExpr) { p.testExprSameLine(expr.Y) } case *UnaryTest: - p.WriteString(expr.Op.String()) + p.w.WriteString(expr.Op.String()) p.space() p.testExprSameLine(expr.X) case *ParenTest: - p.WriteByte('(') + p.w.WriteByte('(') if startsWithLparen(expr.X) { p.wantSpace = spaceRequired } else { p.wantSpace = spaceNotRequired } p.testExpr(expr.X) - p.WriteByte(')') + p.w.WriteByte(')') } } @@ -929,10 +964,10 @@ func (p *Printer) unquotedWord(w *Word) { for i := 0; i < len(wp.Value); i++ { if b := wp.Value[i]; b == '\\' { if i++; i < len(wp.Value) { - p.WriteByte(wp.Value[i]) + p.w.WriteByte(wp.Value[i]) } } else { - p.WriteByte(b) + p.w.WriteByte(b) } } } @@ -960,6 +995,10 @@ func (p *Printer) wordJoin(ws []*Word) { func (p *Printer) casePatternJoin(pats []*Word) { anyNewline := false for i, w := range pats { + // Only valid situation for a literal 'esac' here is with a preceding left paran. + if i == 0 && w.Lit() == "esac" { + p.w.WriteString("(") + } if i > 0 { p.spacedToken("|", Pos{}) } @@ -998,7 +1037,7 @@ func (p *Printer) elemJoin(elems []*ArrayElem, last []Comment) { p.space() } if p.wroteIndex(el.Index) { - p.WriteByte('=') + p.w.WriteByte('=') } if el.Value != nil { p.word(el.Value) @@ -1032,7 +1071,7 @@ func (p *Printer) stmt(s *Stmt) { if r.N != nil { p.writeLit(r.N.Value) } - p.WriteString(r.Op.String()) + p.w.WriteString(r.Op.String()) if p.spaceRedirects && (r.Op != DplIn && r.Op != DplOut) { p.space() } else { @@ -1044,18 +1083,20 @@ func (p *Printer) stmt(s *Stmt) { } } sep := s.Semicolon.IsValid() && s.Semicolon.Line() > p.line && !p.singleLine - if sep || s.Background || s.Coprocess { + if sep || s.Background || s.Coprocess || s.Disown { if sep { p.bslashNewl() } else if !p.minify { p.space() } if s.Background { - p.WriteString("&") + p.w.WriteString("&") } else if s.Coprocess { - p.WriteString("|&") + p.w.WriteString("|&") + } else if s.Disown { + p.w.WriteString("&|") } else { - p.WriteString(";") + p.w.WriteString(";") } p.wroteSemi = true p.wantSpace = spaceRequired @@ -1074,7 +1115,7 @@ func (p *Printer) printRedirsUntil(redirs []*Redirect, startRedirs int, pos Pos) if r.N != nil { p.writeLit(r.N.Value) } - p.WriteString(r.Op.String()) + p.w.WriteString(r.Op.String()) if p.spaceRedirects && (r.Op != DplIn && r.Op != DplOut) { p.space() } else { @@ -1103,7 +1144,9 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { startRedirs = p.printRedirsUntil(redirs, startRedirs, cmd.Args[1].Pos()) p.wordJoin(cmd.Args[1:]) case *Block: - p.WriteByte('{') + p.w.WriteByte('{') + // avoid ; in an empty block + p.wroteSemi = true p.wantSpace = spaceRequired // Forbid "foo()\n{ bar; }" p.wantNewline = p.wantNewline || p.funcNextLine @@ -1112,7 +1155,7 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { case *IfClause: p.ifClause(cmd, false) case *Subshell: - p.WriteByte('(') + p.w.WriteByte('(') stmts := cmd.Stmts if len(stmts) > 0 && startsWithLparen(stmts[0]) { p.wantSpace = spaceRequired @@ -1125,6 +1168,10 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { p.mustNewline = true } } + } else if len(stmts) == 0 { + // Zsh allows empty subshells, but prevent `()` + // from looking like `() { anon-func; }`. + p.wantSpace = spaceRequired } else { p.wantSpace = spaceNotRequired } @@ -1146,9 +1193,9 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { p.semiRsrv("done", cmd.DonePos) case *ForClause: if cmd.Select { - p.WriteString("select ") + p.w.WriteString("select ") } else { - p.WriteString("for ") + p.w.WriteString("for ") } p.loop(cmd.Loop) p.semiOrNewl("do", cmd.DoPos) @@ -1196,11 +1243,18 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { p.nestedBinary = false case *FuncDecl: if cmd.RsrvWord { - p.WriteString("function ") + p.spacedString("function", Pos{}) + } + if cmd.Name != nil { + p.spacedString(cmd.Name.Value, Pos{}) + } else { + for _, name := range cmd.Names { + p.spacedString(name.Value, Pos{}) + } } - p.writeLit(cmd.Name.Value) if !cmd.RsrvWord || cmd.Parens { - p.WriteString("()") + p.w.WriteString("()") + p.wantSpace = spaceNotRequired } if p.funcNextLine { p.newline(Pos{}) @@ -1212,9 +1266,9 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { p.comments(cmd.Body.Comments...) p.stmt(cmd.Body) case *CaseClause: - p.WriteString("case ") + p.w.WriteString("case ") p.word(cmd.Word) - p.WriteString(" in") + p.w.WriteString(" in") p.advanceLine(cmd.In.Line()) p.wantSpace = spaceRequired if p.swtCaseIndent { @@ -1236,7 +1290,7 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { p.newlines(ci.Pos()) p.spacePad(ci.Pos()) p.casePatternJoin(ci.Patterns) - p.WriteByte(')') + p.w.WriteByte(')') if !p.minify { p.wantSpace = spaceRequired } else { @@ -1270,14 +1324,14 @@ func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { } p.semiRsrv("esac", cmd.Esac) case *ArithmCmd: - p.WriteString("((") + p.w.WriteString("((") if cmd.Unsigned { - p.WriteString("# ") + p.w.WriteString("# ") } p.arithmExpr(cmd.X, false, false) - p.WriteString("))") + p.w.WriteString("))") case *TestClause: - p.WriteString("[[ ") + p.w.WriteString("[[ ") p.incLevel() p.testExpr(cmd.X) p.decLevel() @@ -1363,7 +1417,7 @@ func (p *Printer) stmtList(stmts []*Stmt, last []Comment) { if i > 0 && p.singleLine && p.wantNewline && !p.wroteSemi { // In singleLine mode, ensure we use semicolons between // statements. - p.WriteByte(';') + p.w.WriteByte(';') p.wantSpace = spaceRequired } pos := s.Pos() @@ -1438,10 +1492,10 @@ func (p *Printer) assigns(assigns []*Assign) { p.writeLit(a.Name.Value) p.wroteIndex(a.Index) if a.Append { - p.WriteByte('+') + p.w.WriteByte('+') } if !a.Naked { - p.WriteByte('=') + p.w.WriteByte('=') } } if a.Value != nil { @@ -1452,7 +1506,7 @@ func (p *Printer) assigns(assigns []*Assign) { p.word(a.Value) } else if a.Array != nil { p.wantSpace = spaceNotRequired - p.WriteByte('(') + p.w.WriteByte('(') p.elemJoin(a.Array.Elems, a.Array.Last) p.rightParen(a.Array.Rparen) } diff --git a/vendor/mvdan.cc/sh/v3/syntax/quote.go b/vendor/mvdan.cc/sh/v3/syntax/quote.go index 6f27eba12..8f7f57eac 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/quote.go +++ b/vendor/mvdan.cc/sh/v3/syntax/quote.go @@ -78,7 +78,7 @@ func Quote(s string, lang LangVariant) (string, error) { return "", &QuoteError{ByteOffset: offs, Message: quoteErrNull} } if r == utf8.RuneError || !unicode.IsPrint(r) { - if lang == LangPOSIX { + if lang.in(LangPOSIX) { return "", &QuoteError{ByteOffset: offs, Message: quoteErrPOSIX} } nonPrintable = true @@ -132,13 +132,13 @@ func Quote(s string, lang LangVariant) (string, error) { fmt.Fprintf(&b, "\\x%02x", rem[0]) // Unfortunately, mksh allows \x to consume more hex characters. // Ensure that we don't allow it to read more than two. - if lang == LangMirBSDKorn { + if lang.in(LangMirBSDKorn) { nextRequoteIfHex = true } case r > utf8.MaxRune: // Not a valid Unicode code point? return "", &QuoteError{ByteOffset: offs, Message: quoteErrRange} - case lang == LangMirBSDKorn && r > 0xFFFD: + case lang.in(LangMirBSDKorn) && r > 0xFFFD: // From the CAVEATS section in R59's man page: // // mksh currently uses OPTU-16 internally, which is the same as @@ -180,6 +180,5 @@ func Quote(s string, lang LangVariant) (string, error) { func isHex(r rune) bool { return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') + (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F') } diff --git a/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go b/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go deleted file mode 100644 index d43466f8f..000000000 --- a/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go +++ /dev/null @@ -1,61 +0,0 @@ -// Code generated by "stringer -type=quoteState"; DO NOT EDIT. - -package syntax - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[noState-1] - _ = x[subCmd-2] - _ = x[subCmdBckquo-4] - _ = x[dblQuotes-8] - _ = x[hdocWord-16] - _ = x[hdocBody-32] - _ = x[hdocBodyTabs-64] - _ = x[arithmExpr-128] - _ = x[arithmExprLet-256] - _ = x[arithmExprCmd-512] - _ = x[arithmExprBrack-1024] - _ = x[testExpr-2048] - _ = x[testExprRegexp-4096] - _ = x[switchCase-8192] - _ = x[paramExpName-16384] - _ = x[paramExpSlice-32768] - _ = x[paramExpRepl-65536] - _ = x[paramExpExp-131072] - _ = x[arrayElems-262144] -} - -const _quoteState_name = "noStatesubCmdsubCmdBckquodblQuoteshdocWordhdocBodyhdocBodyTabsarithmExprarithmExprLetarithmExprCmdarithmExprBracktestExprtestExprRegexpswitchCaseparamExpNameparamExpSliceparamExpReplparamExpExparrayElems" - -var _quoteState_map = map[quoteState]string{ - 1: _quoteState_name[0:7], - 2: _quoteState_name[7:13], - 4: _quoteState_name[13:25], - 8: _quoteState_name[25:34], - 16: _quoteState_name[34:42], - 32: _quoteState_name[42:50], - 64: _quoteState_name[50:62], - 128: _quoteState_name[62:72], - 256: _quoteState_name[72:85], - 512: _quoteState_name[85:98], - 1024: _quoteState_name[98:113], - 2048: _quoteState_name[113:121], - 4096: _quoteState_name[121:135], - 8192: _quoteState_name[135:145], - 16384: _quoteState_name[145:157], - 32768: _quoteState_name[157:170], - 65536: _quoteState_name[170:182], - 131072: _quoteState_name[182:193], - 262144: _quoteState_name[193:203], -} - -func (i quoteState) String() string { - if str, ok := _quoteState_map[i]; ok { - return str - } - return "quoteState(" + strconv.FormatInt(int64(i), 10) + ")" -} diff --git a/vendor/mvdan.cc/sh/v3/syntax/simplify.go b/vendor/mvdan.cc/sh/v3/syntax/simplify.go index 7eef65ef2..3d44c3597 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/simplify.go +++ b/vendor/mvdan.cc/sh/v3/syntax/simplify.go @@ -156,8 +156,7 @@ func (s *simplifier) inlineSimpleParams(x ArithmExpr) ArithmExpr { // Not a parameter expansion, or not a valid name, like $3. return x } - if pe.Excl || pe.Length || pe.Width || pe.Slice != nil || - pe.Repl != nil || pe.Exp != nil || pe.Index != nil { + if !pe.simple() { // A complex parameter expansion can't be simplified. // // Note that index expressions can't generally be simplified @@ -172,7 +171,7 @@ func (s *simplifier) inlineSimpleParams(x ArithmExpr) ArithmExpr { func (s *simplifier) inlineSubshell(stmts []*Stmt) []*Stmt { for len(stmts) == 1 { st := stmts[0] - if st.Negated || st.Background || st.Coprocess || + if st.Negated || st.Background || st.Coprocess || st.Disown || len(st.Redirs) > 0 { break } diff --git a/vendor/mvdan.cc/sh/v3/syntax/token_string.go b/vendor/mvdan.cc/sh/v3/syntax/token_string.go index ab5c83aca..ef5c8c6f3 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/token_string.go +++ b/vendor/mvdan.cc/sh/v3/syntax/token_string.go @@ -14,136 +14,154 @@ func _() { _ = x[_Lit-3] _ = x[_LitWord-4] _ = x[_LitRedir-5] - _ = x[sglQuote-6] - _ = x[dblQuote-7] - _ = x[bckQuote-8] - _ = x[and-9] - _ = x[andAnd-10] - _ = x[orOr-11] - _ = x[or-12] - _ = x[orAnd-13] - _ = x[dollar-14] - _ = x[dollSglQuote-15] - _ = x[dollDblQuote-16] - _ = x[dollBrace-17] - _ = x[dollBrack-18] - _ = x[dollParen-19] - _ = x[dollDblParen-20] - _ = x[leftBrack-21] - _ = x[dblLeftBrack-22] - _ = x[leftParen-23] - _ = x[dblLeftParen-24] - _ = x[rightBrace-25] - _ = x[rightBrack-26] - _ = x[rightParen-27] - _ = x[dblRightParen-28] - _ = x[semicolon-29] - _ = x[dblSemicolon-30] - _ = x[semiAnd-31] - _ = x[dblSemiAnd-32] - _ = x[semiOr-33] - _ = x[exclMark-34] - _ = x[tilde-35] - _ = x[addAdd-36] - _ = x[subSub-37] - _ = x[star-38] - _ = x[power-39] - _ = x[equal-40] - _ = x[nequal-41] - _ = x[lequal-42] - _ = x[gequal-43] - _ = x[addAssgn-44] - _ = x[subAssgn-45] - _ = x[mulAssgn-46] - _ = x[quoAssgn-47] - _ = x[remAssgn-48] - _ = x[andAssgn-49] - _ = x[orAssgn-50] - _ = x[xorAssgn-51] - _ = x[shlAssgn-52] - _ = x[shrAssgn-53] - _ = x[rdrOut-54] - _ = x[appOut-55] - _ = x[rdrIn-56] - _ = x[rdrInOut-57] - _ = x[dplIn-58] - _ = x[dplOut-59] - _ = x[clbOut-60] - _ = x[hdoc-61] - _ = x[dashHdoc-62] - _ = x[wordHdoc-63] - _ = x[rdrAll-64] - _ = x[appAll-65] - _ = x[cmdIn-66] - _ = x[cmdOut-67] - _ = x[plus-68] - _ = x[colPlus-69] - _ = x[minus-70] - _ = x[colMinus-71] - _ = x[quest-72] - _ = x[colQuest-73] - _ = x[assgn-74] - _ = x[colAssgn-75] - _ = x[perc-76] - _ = x[dblPerc-77] - _ = x[hash-78] - _ = x[dblHash-79] - _ = x[caret-80] - _ = x[dblCaret-81] - _ = x[comma-82] - _ = x[dblComma-83] - _ = x[at-84] - _ = x[slash-85] - _ = x[dblSlash-86] - _ = x[colon-87] - _ = x[tsExists-88] - _ = x[tsRegFile-89] - _ = x[tsDirect-90] - _ = x[tsCharSp-91] - _ = x[tsBlckSp-92] - _ = x[tsNmPipe-93] - _ = x[tsSocket-94] - _ = x[tsSmbLink-95] - _ = x[tsSticky-96] - _ = x[tsGIDSet-97] - _ = x[tsUIDSet-98] - _ = x[tsGrpOwn-99] - _ = x[tsUsrOwn-100] - _ = x[tsModif-101] - _ = x[tsRead-102] - _ = x[tsWrite-103] - _ = x[tsExec-104] - _ = x[tsNoEmpty-105] - _ = x[tsFdTerm-106] - _ = x[tsEmpStr-107] - _ = x[tsNempStr-108] - _ = x[tsOptSet-109] - _ = x[tsVarSet-110] - _ = x[tsRefVar-111] - _ = x[tsReMatch-112] - _ = x[tsNewer-113] - _ = x[tsOlder-114] - _ = x[tsDevIno-115] - _ = x[tsEql-116] - _ = x[tsNeq-117] - _ = x[tsLeq-118] - _ = x[tsGeq-119] - _ = x[tsLss-120] - _ = x[tsGtr-121] - _ = x[globQuest-122] - _ = x[globStar-123] - _ = x[globPlus-124] - _ = x[globAt-125] - _ = x[globExcl-126] + _ = x[_realTokenBoundary-6] + _ = x[sglQuote-7] + _ = x[dblQuote-8] + _ = x[bckQuote-9] + _ = x[and-10] + _ = x[andAnd-11] + _ = x[orOr-12] + _ = x[or-13] + _ = x[orAnd-14] + _ = x[andPipe-15] + _ = x[andBang-16] + _ = x[dollar-17] + _ = x[dollSglQuote-18] + _ = x[dollDblQuote-19] + _ = x[dollBrace-20] + _ = x[dollBrack-21] + _ = x[dollParen-22] + _ = x[dollDblParen-23] + _ = x[leftBrace-24] + _ = x[leftBrack-25] + _ = x[dblLeftBrack-26] + _ = x[leftParen-27] + _ = x[dblLeftParen-28] + _ = x[rightBrace-29] + _ = x[rightBrack-30] + _ = x[dblRightBrack-31] + _ = x[rightParen-32] + _ = x[dblRightParen-33] + _ = x[semicolon-34] + _ = x[dblSemicolon-35] + _ = x[semiAnd-36] + _ = x[dblSemiAnd-37] + _ = x[semiOr-38] + _ = x[exclMark-39] + _ = x[tilde-40] + _ = x[addAdd-41] + _ = x[subSub-42] + _ = x[star-43] + _ = x[power-44] + _ = x[equal-45] + _ = x[nequal-46] + _ = x[lequal-47] + _ = x[gequal-48] + _ = x[addAssgn-49] + _ = x[subAssgn-50] + _ = x[mulAssgn-51] + _ = x[quoAssgn-52] + _ = x[remAssgn-53] + _ = x[andAssgn-54] + _ = x[orAssgn-55] + _ = x[xorAssgn-56] + _ = x[shlAssgn-57] + _ = x[shrAssgn-58] + _ = x[andBoolAssgn-59] + _ = x[orBoolAssgn-60] + _ = x[xorBoolAssgn-61] + _ = x[powAssgn-62] + _ = x[rdrOut-63] + _ = x[appOut-64] + _ = x[rdrIn-65] + _ = x[rdrInOut-66] + _ = x[dplIn-67] + _ = x[dplOut-68] + _ = x[rdrClob-69] + _ = x[appClob-70] + _ = x[hdoc-71] + _ = x[dashHdoc-72] + _ = x[wordHdoc-73] + _ = x[rdrAll-74] + _ = x[rdrAllClob-75] + _ = x[appAll-76] + _ = x[appAllClob-77] + _ = x[cmdIn-78] + _ = x[assgnParen-79] + _ = x[cmdOut-80] + _ = x[plus-81] + _ = x[colPlus-82] + _ = x[minus-83] + _ = x[colMinus-84] + _ = x[quest-85] + _ = x[colQuest-86] + _ = x[assgn-87] + _ = x[colAssgn-88] + _ = x[perc-89] + _ = x[dblPerc-90] + _ = x[hash-91] + _ = x[dblHash-92] + _ = x[colHash-93] + _ = x[colPipe-94] + _ = x[colStar-95] + _ = x[caret-96] + _ = x[dblCaret-97] + _ = x[comma-98] + _ = x[dblComma-99] + _ = x[at-100] + _ = x[slash-101] + _ = x[dblSlash-102] + _ = x[period-103] + _ = x[colon-104] + _ = x[tsExists-105] + _ = x[tsRegFile-106] + _ = x[tsDirect-107] + _ = x[tsCharSp-108] + _ = x[tsBlckSp-109] + _ = x[tsNmPipe-110] + _ = x[tsSocket-111] + _ = x[tsSmbLink-112] + _ = x[tsSticky-113] + _ = x[tsGIDSet-114] + _ = x[tsUIDSet-115] + _ = x[tsGrpOwn-116] + _ = x[tsUsrOwn-117] + _ = x[tsModif-118] + _ = x[tsRead-119] + _ = x[tsWrite-120] + _ = x[tsExec-121] + _ = x[tsNoEmpty-122] + _ = x[tsFdTerm-123] + _ = x[tsEmpStr-124] + _ = x[tsNempStr-125] + _ = x[tsOptSet-126] + _ = x[tsVarSet-127] + _ = x[tsRefVar-128] + _ = x[tsReMatch-129] + _ = x[tsNewer-130] + _ = x[tsOlder-131] + _ = x[tsDevIno-132] + _ = x[tsEql-133] + _ = x[tsNeq-134] + _ = x[tsLeq-135] + _ = x[tsGeq-136] + _ = x[tsLss-137] + _ = x[tsGtr-138] + _ = x[globQuest-139] + _ = x[globStar-140] + _ = x[globPlus-141] + _ = x[globAt-142] + _ = x[globExcl-143] } -const _token_name = "illegalTokEOFNewlLitLitWordLitRedir'\"`&&&||||&$$'$\"${$[$($(([[[(((}])));;;;&;;&;|!~++--***==!=<=>=+=-=*=/=%=&=|=^=<<=>>=>>><<><&>&>|<<<<-<<<&>&>><(>(+:+-:-?:?=:=%%%###^^^,,,@///:-e-f-d-c-b-p-S-L-k-g-u-G-O-N-r-w-x-s-t-z-n-o-v-R=~-nt-ot-ef-eq-ne-le-ge-lt-gt?(*(+(@(!(" +const _token_name = "illegalTokEOFNewlLitLitWordLitRedirrealTokenBoundary'\"`&&&||||&&|&!$$'$\"${$[$($(({[[[(((}]]])));;;;&;;&;|!~++--***==!=<=>=+=-=*=/=%=&=|=^=<<=>>=&&=||=^^=**=>>><<><&>&>|>>|<<<<-<<<&>&>|&>>&>>|<(=(>(+:+-:-?:?=:=%%%###:#:|:*^^^,,,@///.:-e-f-d-c-b-p-S-L-k-g-u-G-O-N-r-w-x-s-t-z-n-o-v-R=~-nt-ot-ef-eq-ne-le-ge-lt-gt?(*(+(@(!(" -var _token_index = [...]uint16{0, 10, 13, 17, 20, 27, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 49, 51, 53, 55, 57, 60, 61, 63, 64, 66, 67, 68, 69, 71, 72, 74, 76, 79, 81, 82, 83, 85, 87, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 117, 120, 121, 123, 124, 126, 128, 130, 132, 134, 137, 140, 142, 145, 147, 149, 150, 152, 153, 155, 156, 158, 159, 161, 162, 164, 165, 167, 168, 170, 171, 173, 174, 175, 177, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 257, 259, 261, 263, 265} +var _token_index = [...]uint16{0, 10, 13, 17, 20, 27, 35, 52, 53, 54, 55, 56, 58, 60, 61, 63, 65, 67, 68, 70, 72, 74, 76, 78, 81, 82, 83, 85, 86, 88, 89, 90, 92, 93, 95, 96, 98, 100, 103, 105, 106, 107, 109, 111, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 141, 144, 147, 150, 153, 156, 157, 159, 160, 162, 164, 166, 168, 171, 173, 176, 179, 181, 184, 187, 191, 193, 195, 197, 198, 200, 201, 203, 204, 206, 207, 209, 210, 212, 213, 215, 217, 219, 221, 222, 224, 225, 227, 228, 229, 231, 232, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 286, 289, 292, 295, 298, 301, 304, 307, 310, 312, 314, 316, 318, 320} func (i token) String() string { - if i >= token(len(_token_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_token_index)-1 { return "token(" + strconv.FormatInt(int64(i), 10) + ")" } - return _token_name[_token_index[i]:_token_index[i+1]] + return _token_name[_token_index[idx]:_token_index[idx+1]] } diff --git a/vendor/mvdan.cc/sh/v3/syntax/tokens.go b/vendor/mvdan.cc/sh/v3/syntax/tokens.go index 97dec5433..51e9aadb8 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/tokens.go +++ b/vendor/mvdan.cc/sh/v3/syntax/tokens.go @@ -3,7 +3,7 @@ package syntax -//go:generate stringer -type token -linecomment -trimprefix _ +//go:generate go tool stringer -type token -linecomment -trimprefix _ type token uint32 @@ -17,15 +17,20 @@ const ( _LitWord _LitRedir + // Token values beyond this point stringify as exact source. + _realTokenBoundary + sglQuote // ' dblQuote // " bckQuote // ` - and // & - andAnd // && - orOr // || - or // | - orAnd // |& + and // & + andAnd // && + orOr // || + or // | + orAnd // |& + andPipe // &| + andBang // &! dollar // $ dollSglQuote // $' @@ -34,6 +39,7 @@ const ( dollBrack // $[ dollParen // $( dollDblParen // $(( + leftBrace // { leftBrack // [ dblLeftBrack // [[ leftParen // ( @@ -41,6 +47,7 @@ const ( rightBrace // } rightBrack // ] + dblRightBrack // ]] rightParen // ) dblRightParen // )) semicolon // ; @@ -61,32 +68,40 @@ const ( lequal // <= gequal // >= - addAssgn // += - subAssgn // -= - mulAssgn // *= - quoAssgn // /= - remAssgn // %= - andAssgn // &= - orAssgn // |= - xorAssgn // ^= - shlAssgn // <<= - shrAssgn // >>= - - rdrOut // > - appOut // >> - rdrIn // < - rdrInOut // <> - dplIn // <& - dplOut // >& - clbOut // >| - hdoc // << - dashHdoc // <<- - wordHdoc // <<< - rdrAll // &> - appAll // &>> - - cmdIn // <( - cmdOut // >( + addAssgn // += + subAssgn // -= + mulAssgn // *= + quoAssgn // /= + remAssgn // %= + andAssgn // &= + orAssgn // |= + xorAssgn // ^= + shlAssgn // <<= + shrAssgn // >>= + andBoolAssgn // &&= + orBoolAssgn // ||= + xorBoolAssgn // ^^= + powAssgn // **= + + rdrOut // > + appOut // >> + rdrIn // < + rdrInOut // <> + dplIn // <& + dplOut // >& + rdrClob // >| + appClob // >>| + hdoc // << + dashHdoc // <<- + wordHdoc // <<< + rdrAll // &> + rdrAllClob // &>| + appAll // &>> + appAllClob // &>>| + + cmdIn // <( + assgnParen // =( + cmdOut // >( plus // + colPlus // :+ @@ -100,6 +115,9 @@ const ( dblPerc // %% hash // # dblHash // ## + colHash // :# + colPipe // :| + colStar // :* caret // ^ dblCaret // ^^ comma // , @@ -107,6 +125,7 @@ const ( at // @ slash // / dblSlash // // + period // . colon // : tsExists // -e @@ -155,25 +174,34 @@ const ( type RedirOperator token const ( - RdrOut = RedirOperator(rdrOut) + iota // > - AppOut // >> - RdrIn // < - RdrInOut // <> - DplIn // <& - DplOut // >& - ClbOut // >| - Hdoc // << - DashHdoc // <<- - WordHdoc // <<< - RdrAll // &> - AppAll // &>> + RdrOut = RedirOperator(rdrOut) + iota // > + AppOut // >> + RdrIn // < + RdrInOut // <> + DplIn // <& + DplOut // >& + RdrClob // >| + AppClob // >>| with [LangZsh] + Hdoc // << + DashHdoc // <<- + WordHdoc // <<< + RdrAll // &> + RdrAllClob // &>| with [LangZsh] + AppAll // &>> + AppAllClob // &>>| with [LangZsh] + + // Deprecated: use [RdrClob] + // + //go:fix inline + ClbOut = RdrClob ) type ProcOperator token const ( - CmdIn = ProcOperator(cmdIn) + iota // <( - CmdOut // >( + CmdIn = ProcOperator(cmdIn) + iota // <( + CmdInTemp // =( + CmdOut // >( ) type GlobOperator token @@ -226,6 +254,9 @@ const ( RemLargeSuffix // %% RemSmallPrefix // # RemLargePrefix // ## + MatchEmpty // :# with [LangZsh] + ArrayExclude // :| with [LangZsh] + ArrayIntersect // :* with [LangZsh] UpperFirst // ^ UpperAll // ^^ LowerFirst // , @@ -265,23 +296,30 @@ const ( Shr = BinAritOperator(appOut) // >> Shl = BinAritOperator(hdoc) // << - AndArit = BinAritOperator(andAnd) // && - OrArit = BinAritOperator(orOr) // || - Comma = BinAritOperator(comma) // , - TernQuest = BinAritOperator(quest) // ? - TernColon = BinAritOperator(colon) // : - - Assgn = BinAritOperator(assgn) // = - AddAssgn = BinAritOperator(addAssgn) // += - SubAssgn = BinAritOperator(subAssgn) // -= - MulAssgn = BinAritOperator(mulAssgn) // *= - QuoAssgn = BinAritOperator(quoAssgn) // /= - RemAssgn = BinAritOperator(remAssgn) // %= - AndAssgn = BinAritOperator(andAssgn) // &= - OrAssgn = BinAritOperator(orAssgn) // |= - XorAssgn = BinAritOperator(xorAssgn) // ^= - ShlAssgn = BinAritOperator(shlAssgn) // <<= - ShrAssgn = BinAritOperator(shrAssgn) // >>= + // TODO: use "Bool" consistently for logical operators like AndArit and OrArit; use //go:fix inline? + + AndArit = BinAritOperator(andAnd) // && + OrArit = BinAritOperator(orOr) // || + XorBool = BinAritOperator(dblCaret) // ^^ + Comma = BinAritOperator(comma) // , + TernQuest = BinAritOperator(quest) // ? + TernColon = BinAritOperator(colon) // : + + Assgn = BinAritOperator(assgn) // = + AddAssgn = BinAritOperator(addAssgn) // += + SubAssgn = BinAritOperator(subAssgn) // -= + MulAssgn = BinAritOperator(mulAssgn) // *= + QuoAssgn = BinAritOperator(quoAssgn) // /= + RemAssgn = BinAritOperator(remAssgn) // %= + AndAssgn = BinAritOperator(andAssgn) // &= + OrAssgn = BinAritOperator(orAssgn) // |= + XorAssgn = BinAritOperator(xorAssgn) // ^= + ShlAssgn = BinAritOperator(shlAssgn) // <<= + ShrAssgn = BinAritOperator(shrAssgn) // >>= + AndBoolAssgn = BinAritOperator(andBoolAssgn) // &&= + OrBoolAssgn = BinAritOperator(orBoolAssgn) // ||= + XorBoolAssgn = BinAritOperator(xorBoolAssgn) // ^^= + PowAssgn = BinAritOperator(powAssgn) // **= ) type UnTestOperator token diff --git a/vendor/mvdan.cc/sh/v3/syntax/walk.go b/vendor/mvdan.cc/sh/v3/syntax/walk.go index 105f1ce0d..8a67dc55c 100644 --- a/vendor/mvdan.cc/sh/v3/syntax/walk.go +++ b/vendor/mvdan.cc/sh/v3/syntax/walk.go @@ -79,7 +79,8 @@ func Walk(node Node, f func(Node) bool) { Walk(node.X, f) Walk(node.Y, f) case *FuncDecl: - Walk(node.Name, f) + walkNilable(node.Name, f) + walkList(node.Names, f) Walk(node.Body, f) case *Word: walkList(node.Parts, f) @@ -91,8 +92,14 @@ func Walk(node Node, f func(Node) bool) { walkList(node.Stmts, f) walkComments(node.Last, f) case *ParamExp: - Walk(node.Param, f) + walkNilable(node.Flags, f) + walkNilable(node.Param, f) + walkNilable(node.NestedParam, f) walkNilable(node.Index, f) + if node.Slice != nil { + walkNilable(node.Slice.Offset, f) + walkNilable(node.Slice.Length, f) + } if node.Repl != nil { walkNilable(node.Repl.Orig, f) walkNilable(node.Repl.With, f) @@ -116,6 +123,11 @@ func Walk(node Node, f func(Node) bool) { Walk(node.X, f) case *ParenArithm: Walk(node.X, f) + case *FlagsArithm: + Walk(node.Flags, f) + if node.X != nil { + Walk(node.X, f) + } case *ParenTest: Walk(node.X, f) case *CaseClause: @@ -234,7 +246,7 @@ func (p *debugPrinter) print(x reflect.Value) { return } p.print(x.Elem()) - case reflect.Ptr: + case reflect.Pointer: if x.IsNil() { p.printf("nil") return