From 2c748885f2445b1a8e51869af2ecd13705458dcf Mon Sep 17 00:00:00 2001 From: George Date: Fri, 19 Jul 2024 13:47:11 -0700 Subject: [PATCH 01/18] Use `TransactionInfo` within `GetTransactionResponse` (#251) * Encode createdAt as a string for JS support --- .../internal/methods/get_transaction.go | 24 +----- .../internal/methods/get_transaction_test.go | 86 +++++++++++-------- .../internal/methods/get_transactions.go | 2 +- 3 files changed, 51 insertions(+), 61 deletions(-) diff --git a/cmd/soroban-rpc/internal/methods/get_transaction.go b/cmd/soroban-rpc/internal/methods/get_transaction.go index ac6ac8b2..7c6cef4d 100644 --- a/cmd/soroban-rpc/internal/methods/get_transaction.go +++ b/cmd/soroban-rpc/internal/methods/get_transaction.go @@ -29,8 +29,6 @@ const ( // GetTransactionResponse is the response for the Soroban-RPC getTransaction() endpoint type GetTransactionResponse struct { - // Status is one of: TransactionSuccess, TransactionNotFound, or TransactionFailed. - Status string `json:"status"` // LatestLedger is the latest ledger stored in Soroban-RPC. LatestLedger uint32 `json:"latestLedger"` // LatestLedgerCloseTime is the unix timestamp of when the latest ledger was closed. @@ -41,27 +39,7 @@ type GetTransactionResponse struct { OldestLedgerCloseTime int64 `json:"oldestLedgerCloseTime,string"` // The fields below are only present if Status is not TransactionNotFound. - - // ApplicationOrder is the index of the transaction among all the transactions - // for that ledger. - ApplicationOrder int32 `json:"applicationOrder,omitempty"` - // FeeBump indicates whether the transaction is a feebump transaction - FeeBump bool `json:"feeBump,omitempty"` - // EnvelopeXdr is the TransactionEnvelope XDR value. - EnvelopeXdr string `json:"envelopeXdr,omitempty"` - // ResultXdr is the TransactionResult XDR value. - ResultXdr string `json:"resultXdr,omitempty"` - // ResultMetaXdr is the TransactionMeta XDR value. - ResultMetaXdr string `json:"resultMetaXdr,omitempty"` - - // Ledger is the sequence of the ledger which included the transaction. - Ledger uint32 `json:"ledger,omitempty"` - // LedgerCloseTime is the unix timestamp of when the transaction was included in the ledger. - LedgerCloseTime int64 `json:"createdAt,string,omitempty"` - - // DiagnosticEventsXDR is present only if Status is equal to TransactionFailed. - // DiagnosticEventsXDR is a base64-encoded slice of xdr.DiagnosticEvent - DiagnosticEventsXDR []string `json:"diagnosticEventsXdr,omitempty"` + TransactionInfo } type GetTransactionRequest struct { diff --git a/cmd/soroban-rpc/internal/methods/get_transaction_test.go b/cmd/soroban-rpc/internal/methods/get_transaction_test.go index 1bc6f2b9..66089ddc 100644 --- a/cmd/soroban-rpc/internal/methods/get_transaction_test.go +++ b/cmd/soroban-rpc/internal/methods/get_transaction_test.go @@ -33,7 +33,11 @@ func TestGetTransaction(t *testing.T) { hash := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" tx, err := GetTransaction(ctx, log, store, ledgerReader, GetTransactionRequest{hash}) require.NoError(t, err) - require.Equal(t, GetTransactionResponse{Status: TransactionStatusNotFound}, tx) + require.Equal(t, GetTransactionResponse{ + TransactionInfo: TransactionInfo{ + Status: TransactionStatusNotFound, + }, + }, tx) meta := txMeta(1, true) require.NoError(t, store.InsertTransactions(meta)) @@ -50,19 +54,21 @@ func TestGetTransaction(t *testing.T) { expectedTxMeta, err := xdr.MarshalBase64(meta.V1.TxProcessing[0].TxApplyProcessing) require.NoError(t, err) require.Equal(t, GetTransactionResponse{ - Status: TransactionStatusSuccess, LatestLedger: 101, LatestLedgerCloseTime: 2625, OldestLedger: 101, OldestLedgerCloseTime: 2625, - ApplicationOrder: 1, - FeeBump: false, - EnvelopeXdr: expectedEnvelope, - ResultXdr: expectedTxResult, - ResultMetaXdr: expectedTxMeta, - Ledger: 101, - LedgerCloseTime: 2625, - DiagnosticEventsXDR: []string{}, + TransactionInfo: TransactionInfo{ + Status: TransactionStatusSuccess, + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXdr: expectedEnvelope, + ResultXdr: expectedTxResult, + ResultMetaXdr: expectedTxMeta, + Ledger: 101, + LedgerCloseTime: 2625, + DiagnosticEventsXDR: []string{}, + }, }, tx) // ingest another (failed) transaction @@ -73,19 +79,21 @@ func TestGetTransaction(t *testing.T) { tx, err = GetTransaction(ctx, log, store, ledgerReader, GetTransactionRequest{hash}) require.NoError(t, err) require.Equal(t, GetTransactionResponse{ - Status: TransactionStatusSuccess, LatestLedger: 102, LatestLedgerCloseTime: 2650, OldestLedger: 101, OldestLedgerCloseTime: 2625, - ApplicationOrder: 1, - FeeBump: false, - EnvelopeXdr: expectedEnvelope, - ResultXdr: expectedTxResult, - ResultMetaXdr: expectedTxMeta, - Ledger: 101, - LedgerCloseTime: 2625, - DiagnosticEventsXDR: []string{}, + TransactionInfo: TransactionInfo{ + Status: TransactionStatusSuccess, + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXdr: expectedEnvelope, + ResultXdr: expectedTxResult, + ResultMetaXdr: expectedTxMeta, + Ledger: 101, + LedgerCloseTime: 2625, + DiagnosticEventsXDR: []string{}, + }, }, tx) // the new transaction should also be there @@ -102,19 +110,21 @@ func TestGetTransaction(t *testing.T) { tx, err = GetTransaction(ctx, log, store, ledgerReader, GetTransactionRequest{hash}) require.NoError(t, err) require.Equal(t, GetTransactionResponse{ - Status: TransactionStatusFailed, LatestLedger: 102, LatestLedgerCloseTime: 2650, OldestLedger: 101, OldestLedgerCloseTime: 2625, - ApplicationOrder: 1, - FeeBump: false, - EnvelopeXdr: expectedEnvelope, - ResultXdr: expectedTxResult, - ResultMetaXdr: expectedTxMeta, - Ledger: 102, - LedgerCloseTime: 2650, - DiagnosticEventsXDR: []string{}, + TransactionInfo: TransactionInfo{ + Status: TransactionStatusFailed, + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXdr: expectedEnvelope, + ResultXdr: expectedTxResult, + ResultMetaXdr: expectedTxMeta, + Ledger: 102, + LedgerCloseTime: 2650, + DiagnosticEventsXDR: []string{}, + }, }, tx) // Test Txn with events @@ -139,19 +149,21 @@ func TestGetTransaction(t *testing.T) { tx, err = GetTransaction(ctx, log, store, ledgerReader, GetTransactionRequest{hash}) require.NoError(t, err) require.Equal(t, GetTransactionResponse{ - Status: TransactionStatusSuccess, + TransactionInfo: TransactionInfo{ + Status: TransactionStatusSuccess, + ApplicationOrder: 1, + FeeBump: false, + EnvelopeXdr: expectedEnvelope, + ResultXdr: expectedTxResult, + ResultMetaXdr: expectedTxMeta, + Ledger: 103, + LedgerCloseTime: 2675, + DiagnosticEventsXDR: []string{expectedEventsMeta}, + }, LatestLedger: 103, LatestLedgerCloseTime: 2675, OldestLedger: 101, OldestLedgerCloseTime: 2625, - ApplicationOrder: 1, - FeeBump: false, - EnvelopeXdr: expectedEnvelope, - ResultXdr: expectedTxResult, - ResultMetaXdr: expectedTxMeta, - Ledger: 103, - LedgerCloseTime: 2675, - DiagnosticEventsXDR: []string{expectedEventsMeta}, }, tx) } diff --git a/cmd/soroban-rpc/internal/methods/get_transactions.go b/cmd/soroban-rpc/internal/methods/get_transactions.go index 1d16f259..547b6053 100644 --- a/cmd/soroban-rpc/internal/methods/get_transactions.go +++ b/cmd/soroban-rpc/internal/methods/get_transactions.go @@ -72,7 +72,7 @@ type TransactionInfo struct { // Ledger is the sequence of the ledger which included the transaction. Ledger uint32 `json:"ledger"` // LedgerCloseTime is the unix timestamp of when the transaction was included in the ledger. - LedgerCloseTime int64 `json:"createdAt"` + LedgerCloseTime int64 `json:"createdAt,string"` } // GetTransactionsResponse encapsulates the response structure for getTransactions queries. From 2daf0237c19adce9891f2b71a5055bb316cd1a71 Mon Sep 17 00:00:00 2001 From: overcat <4catcode@gmail.com> Date: Thu, 9 May 2024 15:24:43 +0800 Subject: [PATCH 02/18] Change API field naming style to Camel Case. --- cmd/soroban-rpc/internal/methods/get_version_info.go | 11 +++++------ .../internal/methods/simulate_transaction.go | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cmd/soroban-rpc/internal/methods/get_version_info.go b/cmd/soroban-rpc/internal/methods/get_version_info.go index 2af129de..038bf54a 100644 --- a/cmd/soroban-rpc/internal/methods/get_version_info.go +++ b/cmd/soroban-rpc/internal/methods/get_version_info.go @@ -14,12 +14,11 @@ import ( ) type GetVersionInfoResponse struct { - Version string `json:"version"` - // TODO: casing to be fixed by https://github.com/stellar/soroban-rpc/pull/164 - CommitHash string `json:"commit_hash"` //nolint:tagliatelle - BuildTimestamp string `json:"build_time_stamp"` //nolint:tagliatelle - CaptiveCoreVersion string `json:"captive_core_version"` //nolint:tagliatelle - ProtocolVersion uint32 `json:"protocol_version"` //nolint:tagliatelle + Version string `json:"version"` + CommitHash string `json:"commitHash"` + BuildTimestamp string `json:"buildTimestamp"` + CaptiveCoreVersion string `json:"captiveCoreVersion"` + ProtocolVersion uint32 `json:"protocolVersion"` } func NewGetVersionInfoHandler( diff --git a/cmd/soroban-rpc/internal/methods/simulate_transaction.go b/cmd/soroban-rpc/internal/methods/simulate_transaction.go index 2a26b08a..1e945b01 100644 --- a/cmd/soroban-rpc/internal/methods/simulate_transaction.go +++ b/cmd/soroban-rpc/internal/methods/simulate_transaction.go @@ -190,7 +190,7 @@ func (l *LedgerEntryChange) jsonXdrDiff(diff preflight.XDRDiff, key xdr.LedgerKe } // LedgerEntryChange designates a change in a ledger entry. Before and After cannot be omitted at the same time. -// If Before is omitted, it constitutes a creation, if After is omitted, it constitutes a delation. +// If Before is omitted, it constitutes a creation, if After is omitted, it constitutes a deletion. type LedgerEntryChange struct { Type LedgerEntryChangeType `json:"type"` From b6683615b546665f2e921577a71d590204ea77a7 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Fri, 30 Aug 2024 02:47:48 +0200 Subject: [PATCH 03/18] itests: use `docker compose` if `docker-compose` is unavailable (#279) --- .../internal/integrationtest/infrastructure/test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/soroban-rpc/internal/integrationtest/infrastructure/test.go b/cmd/soroban-rpc/internal/integrationtest/infrastructure/test.go index 25e0fa4b..0a7b91ee 100644 --- a/cmd/soroban-rpc/internal/integrationtest/infrastructure/test.go +++ b/cmd/soroban-rpc/internal/integrationtest/infrastructure/test.go @@ -468,6 +468,11 @@ func (i *Test) getComposeCommand(args ...string) *exec.Cmd { cmdline = append([]string{"-p", projectName}, cmdline...) cmdline = append(cmdline, args...) cmd := exec.Command("docker-compose", cmdline...) + _, err := exec.LookPath("docker-compose") + if err != nil { + cmdline = append([]string{"compose"}, cmdline...) + cmd = exec.Command("docker", cmdline...) + } if img := os.Getenv("SOROBAN_RPC_INTEGRATION_TESTS_DOCKER_IMG"); img != "" { cmd.Env = append( From 7913265938a8f5bc8b5fbdb4b83774eb5c78359b Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Fri, 30 Aug 2024 10:13:37 -0700 Subject: [PATCH 04/18] Cleanup old retention window and upgrade history-retention-window (#277) * Cleanup old retention-windows and increase history-retention-window to 7 days * fix tests --- cmd/soroban-rpc/internal/config/main.go | 9 ---- cmd/soroban-rpc/internal/config/options.go | 28 ++-------- cmd/soroban-rpc/internal/config/toml_test.go | 6 +-- cmd/soroban-rpc/internal/db/db.go | 54 ++++++++++---------- 4 files changed, 33 insertions(+), 64 deletions(-) diff --git a/cmd/soroban-rpc/internal/config/main.go b/cmd/soroban-rpc/internal/config/main.go index 4282d824..26a38802 100644 --- a/cmd/soroban-rpc/internal/config/main.go +++ b/cmd/soroban-rpc/internal/config/main.go @@ -26,7 +26,6 @@ type Config struct { CoreRequestTimeout time.Duration DefaultEventsLimit uint DefaultTransactionsLimit uint - EventLedgerRetentionWindow uint32 FriendbotURL string HistoryArchiveURLs []string HistoryArchiveUserAgent string @@ -42,7 +41,6 @@ type Config struct { PreflightEnableDebug bool SQLiteDBPath string HistoryRetentionWindow uint32 - TransactionLedgerRetentionWindow uint32 SorobanFeeStatsLedgerRetentionWindow uint32 ClassicFeeStatsLedgerRetentionWindow uint32 RequestBacklogGlobalQueueLimit uint @@ -115,13 +113,6 @@ func (cfg *Config) SetValues(lookupEnv func(string) (string, bool)) error { } } - // Set to the maximum as a compromise until we deprecate the transaction/event flags - cfg.HistoryRetentionWindow = max( - cfg.HistoryRetentionWindow, - cfg.EventLedgerRetentionWindow, - cfg.TransactionLedgerRetentionWindow, - ) - return nil } diff --git a/cmd/soroban-rpc/internal/config/options.go b/cmd/soroban-rpc/internal/config/options.go index 58df85e2..74a4931b 100644 --- a/cmd/soroban-rpc/internal/config/options.go +++ b/cmd/soroban-rpc/internal/config/options.go @@ -218,32 +218,10 @@ func (cfg *Config) options() Options { Name: "history-retention-window", Usage: fmt.Sprintf( "configures history retention window for transactions and events, expressed in number of ledgers,"+ - " the default value is %d which corresponds to about 24 hours of history", - OneDayOfLedgers), + " the default value is %d which corresponds to about 7 days of history", + SevenDayOfLedgers), ConfigKey: &cfg.HistoryRetentionWindow, - DefaultValue: uint32(OneDayOfLedgers), - Validate: positive, - }, - // TODO: remove - { - Name: "event-retention-window", - Usage: fmt.Sprintf( - "(Deprecated, overidden by history-retention-window) configures the event retention window expressed in number of ledgers,"+ - " the default value is %d which corresponds to about 24 hours of history", - OneDayOfLedgers), - ConfigKey: &cfg.EventLedgerRetentionWindow, - DefaultValue: uint32(OneDayOfLedgers), - Validate: positive, - }, - // TODO: remove - { - Name: "transaction-retention-window", - Usage: fmt.Sprintf( - "(Deprecated, overidden by history-retention-window) configures the transaction retention window expressed in number of ledgers,"+ - " the default value is %d which corresponds to about 24 hours of history", - OneDayOfLedgers), - ConfigKey: &cfg.TransactionLedgerRetentionWindow, - DefaultValue: uint32(OneDayOfLedgers), + DefaultValue: uint32(SevenDayOfLedgers), Validate: positive, }, { diff --git a/cmd/soroban-rpc/internal/config/toml_test.go b/cmd/soroban-rpc/internal/config/toml_test.go index ae762567..74c0ac41 100644 --- a/cmd/soroban-rpc/internal/config/toml_test.go +++ b/cmd/soroban-rpc/internal/config/toml_test.go @@ -93,9 +93,9 @@ func TestBasicTomlWriting(t *testing.T) { // comment when outputting multi-line comments, which go-toml does *not* do // by default. assert.Contains(t, out, - `# (Deprecated, overidden by history-retention-window) configures the event -# retention window expressed in number of ledgers, the default value is 17280 -# which corresponds to about 24 hours of history`) + `# configures history retention window for transactions and events, expressed in +# number of ledgers, the default value is 120960 which corresponds to about 7 +# days of history`) } func TestRoundTrip(t *testing.T) { diff --git a/cmd/soroban-rpc/internal/db/db.go b/cmd/soroban-rpc/internal/db/db.go index ccdf5c14..f41aeff6 100644 --- a/cmd/soroban-rpc/internal/db/db.go +++ b/cmd/soroban-rpc/internal/db/db.go @@ -163,11 +163,11 @@ type ReadWriterMetrics struct { } type readWriter struct { - log *log.Entry - db *DB - maxBatchSize int - ledgerRetentionWindow uint32 - passphrase string + log *log.Entry + db *DB + maxBatchSize int + historyRetentionWindow uint32 + passphrase string metrics ReadWriterMetrics } @@ -181,7 +181,7 @@ func NewReadWriter( db *DB, daemon interfaces.Daemon, maxBatchSize int, - ledgerRetentionWindow uint32, + historyRetentionWindow uint32, networkPassphrase string, ) ReadWriter { // a metric for measuring latency of transaction store operations @@ -203,11 +203,11 @@ func NewReadWriter( daemon.MetricsRegistry().MustRegister(txDurationMetric, txCountMetric) return &readWriter{ - log: log, - db: db, - maxBatchSize: maxBatchSize, - ledgerRetentionWindow: ledgerRetentionWindow, - passphrase: networkPassphrase, + log: log, + db: db, + maxBatchSize: maxBatchSize, + historyRetentionWindow: historyRetentionWindow, + passphrase: networkPassphrase, metrics: ReadWriterMetrics{ TxIngestDuration: txDurationMetric.With(prometheus.Labels{"operation": "ingest"}), TxCount: txCountMetric, @@ -234,10 +234,10 @@ func (rw *readWriter) NewTx(ctx context.Context) (WriteTx, error) { _, err := db.ExecRaw(ctx, "PRAGMA wal_checkpoint(TRUNCATE)") return err }, - tx: txSession, - stmtCache: stmtCache, - ledgerRetentionWindow: rw.ledgerRetentionWindow, - ledgerWriter: ledgerWriter{stmtCache: stmtCache}, + tx: txSession, + stmtCache: stmtCache, + historyRetentionWindow: rw.historyRetentionWindow, + ledgerWriter: ledgerWriter{stmtCache: stmtCache}, ledgerEntryWriter: ledgerEntryWriter{ stmtCache: stmtCache, buffer: xdr.NewEncodingBuffer(), @@ -266,15 +266,15 @@ func (rw *readWriter) NewTx(ctx context.Context) (WriteTx, error) { } type writeTx struct { - globalCache *dbCache - postCommit func() error - tx db.SessionInterface - stmtCache *sq.StmtCache - ledgerEntryWriter ledgerEntryWriter - ledgerWriter ledgerWriter - txWriter transactionHandler - eventWriter eventHandler - ledgerRetentionWindow uint32 + globalCache *dbCache + postCommit func() error + tx db.SessionInterface + stmtCache *sq.StmtCache + ledgerEntryWriter ledgerEntryWriter + ledgerWriter ledgerWriter + txWriter transactionHandler + eventWriter eventHandler + historyRetentionWindow uint32 } func (w writeTx) LedgerEntryWriter() LedgerEntryWriter { @@ -298,14 +298,14 @@ func (w writeTx) Commit(ledgerSeq uint32) error { return err } - if err := w.ledgerWriter.trimLedgers(ledgerSeq, w.ledgerRetentionWindow); err != nil { + if err := w.ledgerWriter.trimLedgers(ledgerSeq, w.historyRetentionWindow); err != nil { return err } - if err := w.txWriter.trimTransactions(ledgerSeq, w.ledgerRetentionWindow); err != nil { + if err := w.txWriter.trimTransactions(ledgerSeq, w.historyRetentionWindow); err != nil { return err } - if err := w.eventWriter.trimEvents(ledgerSeq, w.ledgerRetentionWindow); err != nil { + if err := w.eventWriter.trimEvents(ledgerSeq, w.historyRetentionWindow); err != nil { return err } From e1107328b9a17e69ad4c57fb8922f1767d5f87cb Mon Sep 17 00:00:00 2001 From: George Date: Wed, 4 Sep 2024 12:27:53 -0700 Subject: [PATCH 05/18] Improve startup by eliminating unnecessary migration ranges (#282) Speed up startup time in "already migrated" cases by eliminating unnecessary ledger range traversals. Specifically, this includes the following changes: - Fee stats windows cannot exceed the history retention window, as this doesn't make sense. - Migrations that are already applied are not added to the list of "multi-migrations". - Fee stats window building conforms to the migration interface to simplify code. - LedgerSeqRange has been refactored to always use a value reference. As a result, if all migrations have occurred, the traversal only occurs over the fee window. --- cmd/soroban-rpc/internal/daemon/daemon.go | 102 +++++++++++++----- cmd/soroban-rpc/internal/db/event.go | 6 +- cmd/soroban-rpc/internal/db/migration.go | 76 ++++++++----- cmd/soroban-rpc/internal/db/transaction.go | 6 +- .../internal/feewindow/feewindow.go | 37 ++++++- 5 files changed, 165 insertions(+), 62 deletions(-) diff --git a/cmd/soroban-rpc/internal/daemon/daemon.go b/cmd/soroban-rpc/internal/daemon/daemon.go index dfb8e84b..07ca7992 100644 --- a/cmd/soroban-rpc/internal/daemon/daemon.go +++ b/cmd/soroban-rpc/internal/daemon/daemon.go @@ -34,11 +34,15 @@ import ( ) const ( - prometheusNamespace = "soroban_rpc" - maxLedgerEntryWriteBatchSize = 150 - defaultReadTimeout = 5 * time.Second - defaultShutdownGracePeriod = 10 * time.Second - inMemoryInitializationLedgerLogPeriod = 1_000_000 + prometheusNamespace = "soroban_rpc" + maxLedgerEntryWriteBatchSize = 150 + defaultReadTimeout = 5 * time.Second + defaultShutdownGracePeriod = 10 * time.Second + + // Since our default retention window will be 7 days (7*17,280 ledgers), + // choose a random 5-digit prime to have irregular logging intervals at each + // halfish-day of processing + inMemoryInitializationLedgerLogPeriod = 10_099 ) type Daemon struct { @@ -289,6 +293,29 @@ func MustNew(cfg *config.Config, logger *supportlog.Entry) *Daemon { // mustInitializeStorage initializes the storage using what was on the DB func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows { + // + // There's some complex "ledger window math" here so we should clarify it + // beforehand. + // + // There are two windows in play here: + // - the ledger retention window, which describes the range of txmeta + // to keep relative to the latest "ledger tip" of the network + // - the fee stats window, which describes a *subset* of the prior + // ledger retention window on which to perform fee analysis + // + // If the fee window *exceeds* the retention window, this doesn't make any + // sense since it implies the user wants to store N amount of actual + // historical data and M > N amount of ledgers just for fee processing, + // which is nonsense from a performance standpoint. We prevent this: + maxFeeRetentionWindow := max( + cfg.ClassicFeeStatsLedgerRetentionWindow, + cfg.SorobanFeeStatsLedgerRetentionWindow) + if maxFeeRetentionWindow > cfg.HistoryRetentionWindow { + d.logger.Fatalf( + "Fee stat analysis window (%d) cannot exceed history retention window (%d).", + maxFeeRetentionWindow, cfg.HistoryRetentionWindow) + } + feeWindows := feewindow.NewFeeWindows( cfg.ClassicFeeStatsLedgerRetentionWindow, cfg.SorobanFeeStatsLedgerRetentionWindow, @@ -299,27 +326,42 @@ func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows readTxMetaCtx, cancelReadTxMeta := context.WithTimeout(context.Background(), cfg.IngestionTimeout) defer cancelReadTxMeta() - var initialSeq, currentSeq uint32 - applicableRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, cfg.HistoryRetentionWindow) + // To combine these windows, we launch as follows: + // + // 1. First, identify the ledger range for database migrations based on the + // ledger retention window. Since we don't do "partial" migrations (all or + // nothing), this represents the entire range of ledger metas we store. + // + retentionRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, cfg.HistoryRetentionWindow) if err != nil { d.logger.WithError(err).Fatal("could not get ledger range for migration") } - maxFeeRetentionWindow := max(cfg.ClassicFeeStatsLedgerRetentionWindow, cfg.SorobanFeeStatsLedgerRetentionWindow) - feeStatsRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, maxFeeRetentionWindow) + dataMigrations, err := db.BuildMigrations( + readTxMetaCtx, d.logger, d.db, cfg.NetworkPassphrase, retentionRange) if err != nil { - d.logger.WithError(err).Fatal("could not get ledger range for fee stats") + d.logger.WithError(err).Fatal("could not build migrations") } - // Combine the ledger range for fees, events and transactions - ledgerSeqRange := feeStatsRange.Merge(applicableRange) - - dataMigrations, err := db.BuildMigrations(readTxMetaCtx, d.logger, d.db, cfg.NetworkPassphrase, ledgerSeqRange) + // 2. Then, incorporate the fee analysis window. If there are migrations to + // do, this has no effect, since migration windows are larger than the fee + // window. In the absence of migrations, though, this means the ingestion + // range is just the fee stat range. + // + feeStatsRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, maxFeeRetentionWindow) if err != nil { - d.logger.WithError(err).Fatal("could not build migrations") + d.logger.WithError(err).Fatal("could not get ledger range for fee stats") } - // Apply migration for events, transactions and fee stats + // Additionally, by treating the fee window *as if* it's a migration, we can + // make the interface here really clean. + dataMigrations.Append(feeWindows.AsMigration(feeStatsRange)) + ledgerSeqRange := dataMigrations.ApplicableRange() + + // + // 3. Apply all migrations, including fee stat analysis. + // + var initialSeq, currentSeq uint32 err = db.NewLedgerReader(d.db).StreamLedgerRange( readTxMetaCtx, ledgerSeqRange.First, @@ -328,32 +370,36 @@ func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows currentSeq = txMeta.LedgerSequence() if initialSeq == 0 { initialSeq = currentSeq - d.logger.WithField("seq", currentSeq). - Info("initializing in-memory store") + d.logger. + WithField("first", initialSeq). + WithField("last", ledgerSeqRange.Last). + Info("Initializing in-memory store") } else if (currentSeq-initialSeq)%inMemoryInitializationLedgerLogPeriod == 0 { - d.logger.WithField("seq", currentSeq). - Debug("still initializing in-memory store") - } - - if err = feeWindows.IngestFees(txMeta); err != nil { - d.logger.WithError(err).Fatal("could not initialize fee stats") + d.logger. + WithField("seq", currentSeq). + WithField("last", ledgerSeqRange.Last). + Debug("Still initializing in-memory store") } if err := dataMigrations.Apply(readTxMetaCtx, txMeta); err != nil { d.logger.WithError(err).Fatal("could not apply migration for ledger ", currentSeq) } + return nil }) if err != nil { - d.logger.WithError(err).Fatal("could not obtain txmeta cache from the database") + d.logger.WithError(err).Fatal("Could not obtain txmeta cache from the database") } + if err := dataMigrations.Commit(readTxMetaCtx); err != nil { - d.logger.WithError(err).Fatal("could not commit data migrations") + d.logger.WithError(err).Fatal("Could not commit data migrations") } if currentSeq != 0 { - d.logger.WithField("seq", currentSeq). - Info("finished initializing in-memory store and applying DB data migrations") + d.logger. + WithField("first", retentionRange.First). + WithField("last", retentionRange.Last). + Info("Finished initializing in-memory store and applying DB data migrations") } return feeWindows diff --git a/cmd/soroban-rpc/internal/db/event.go b/cmd/soroban-rpc/internal/db/event.go index bf956219..faeae767 100644 --- a/cmd/soroban-rpc/internal/db/event.go +++ b/cmd/soroban-rpc/internal/db/event.go @@ -311,8 +311,8 @@ type eventTableMigration struct { writer EventWriter } -func (e *eventTableMigration) ApplicableRange() *LedgerSeqRange { - return &LedgerSeqRange{ +func (e *eventTableMigration) ApplicableRange() LedgerSeqRange { + return LedgerSeqRange{ First: e.firstLedger, Last: e.lastLedger, } @@ -326,7 +326,7 @@ func newEventTableMigration( _ context.Context, logger *log.Entry, passphrase string, - ledgerSeqRange *LedgerSeqRange, + ledgerSeqRange LedgerSeqRange, ) migrationApplierFactory { return migrationApplierFactoryF(func(db *DB) (MigrationApplier, error) { migration := eventTableMigration{ diff --git a/cmd/soroban-rpc/internal/db/migration.go b/cmd/soroban-rpc/internal/db/migration.go index 9f7aabd9..8ab14e77 100644 --- a/cmd/soroban-rpc/internal/db/migration.go +++ b/cmd/soroban-rpc/internal/db/migration.go @@ -19,38 +19,40 @@ type LedgerSeqRange struct { Last uint32 } -func (mlr *LedgerSeqRange) IsLedgerIncluded(ledgerSeq uint32) bool { - if mlr == nil { - return false - } +func (mlr LedgerSeqRange) IsLedgerIncluded(ledgerSeq uint32) bool { return ledgerSeq >= mlr.First && ledgerSeq <= mlr.Last } -func (mlr *LedgerSeqRange) Merge(other *LedgerSeqRange) *LedgerSeqRange { - if mlr == nil { +func (mlr LedgerSeqRange) Merge(other LedgerSeqRange) LedgerSeqRange { + if mlr.Empty() { return other } - if other == nil { + if other.Empty() { return mlr } + // TODO: using min/max can result in a much larger range than needed, // as an optimization, we should probably use a sequence of ranges instead. - return &LedgerSeqRange{ + return LedgerSeqRange{ First: min(mlr.First, other.First), Last: max(mlr.Last, other.Last), } } +func (mlr LedgerSeqRange) Empty() bool { + return mlr.First == 0 && mlr.Last == 0 +} + type MigrationApplier interface { // ApplicableRange returns the closed ledger sequence interval, - // where Apply() should be called. A null result indicates the empty range - ApplicableRange() *LedgerSeqRange + // where Apply() should be called. + ApplicableRange() LedgerSeqRange // Apply applies the migration on a ledger. It should never be applied // in ledgers outside the ApplicableRange() Apply(ctx context.Context, meta xdr.LedgerCloseMeta) error } -type migrationApplierF func(context.Context, *log.Entry, string, *LedgerSeqRange) migrationApplierFactory +type migrationApplierF func(context.Context, *log.Entry, string, LedgerSeqRange) migrationApplierFactory type migrationApplierFactory interface { New(db *DB) (MigrationApplier, error) @@ -72,8 +74,15 @@ type MultiMigration struct { db *DB } -func (mm MultiMigration) ApplicableRange() *LedgerSeqRange { - var result *LedgerSeqRange +func (mm *MultiMigration) Append(m Migration) { + r := m.ApplicableRange() + if !r.Empty() { + mm.migrations = append(mm.migrations, m) + } +} + +func (mm MultiMigration) ApplicableRange() LedgerSeqRange { + var result LedgerSeqRange for _, m := range mm.migrations { result = m.ApplicableRange().Merge(result) } @@ -117,13 +126,18 @@ type guardedMigration struct { } func newGuardedDataMigration( - ctx context.Context, uniqueMigrationName string, logger *log.Entry, factory migrationApplierFactory, db *DB, + ctx context.Context, uniqueMigrationName string, + logger *log.Entry, factory migrationApplierFactory, db *DB, ) (Migration, error) { metaKey := "Migration" + uniqueMigrationName + "Done" previouslyMigrated, err := getMetaBool(ctx, db, metaKey) if err != nil && !errors.Is(err, ErrEmptyDB) { return nil, err } + if previouslyMigrated { + //nolint:nilnil // a sentinel value here would be stupid + return nil, nil + } applier, err := factory.New(db) if err != nil { return nil, err @@ -145,15 +159,15 @@ func (g *guardedMigration) Apply(ctx context.Context, meta xdr.LedgerCloseMeta) return nil } if !g.applyLogged { - g.logger.WithField("ledger", meta.LedgerSequence()).Info("applying migration") + g.logger.WithField("ledger", meta.LedgerSequence()).Info("Applying migration") g.applyLogged = true } return g.migration.Apply(ctx, meta) } -func (g *guardedMigration) ApplicableRange() *LedgerSeqRange { +func (g *guardedMigration) ApplicableRange() LedgerSeqRange { if g.alreadyMigrated { - return nil + return LedgerSeqRange{} } return g.migration.ApplicableRange() } @@ -165,23 +179,24 @@ func (g *guardedMigration) Commit(ctx context.Context) error { return setMetaBool(ctx, g.db, g.guardMetaKey, true) } -func GetMigrationLedgerRange(ctx context.Context, db *DB, retentionWindow uint32) (*LedgerSeqRange, error) { +func GetMigrationLedgerRange(ctx context.Context, db *DB, retentionWindow uint32) (LedgerSeqRange, error) { firstLedgerToMigrate := firstLedger latestLedger, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(ctx) if err != nil && !errors.Is(err, ErrEmptyDB) { - return nil, fmt.Errorf("failed to get latest ledger sequence: %w", err) + return LedgerSeqRange{}, fmt.Errorf("failed to get latest ledger sequence: %w", err) } if latestLedger > retentionWindow { firstLedgerToMigrate = latestLedger - retentionWindow } - return &LedgerSeqRange{ + return LedgerSeqRange{ First: firstLedgerToMigrate, Last: latestLedger, }, nil } -func BuildMigrations(ctx context.Context, logger *log.Entry, db *DB, networkPassphrase string, - ledgerSeqRange *LedgerSeqRange, +func BuildMigrations( + ctx context.Context, logger *log.Entry, db *DB, networkPassphrase string, + ledgerSeqRange LedgerSeqRange, ) (MultiMigration, error) { // Start a common db transaction for the entire migration duration err := db.Begin(ctx) @@ -189,14 +204,16 @@ func BuildMigrations(ctx context.Context, logger *log.Entry, db *DB, networkPass return MultiMigration{}, errors.Join(err, db.Rollback()) } - migrationNameToFunc := map[string]migrationApplierF{ + // + // Add new DB migrations here: + // + currentMigrations := map[string]migrationApplierF{ transactionsMigrationName: newTransactionTableMigration, eventsMigrationName: newEventTableMigration, } - migrations := make([]Migration, 0, len(migrationNameToFunc)) - - for migrationName, migrationFunc := range migrationNameToFunc { + migrations := make([]Migration, 0, len(currentMigrations)) + for migrationName, migrationFunc := range currentMigrations { migrationLogger := logger.WithField("migration", migrationName) factory := migrationFunc( ctx, @@ -210,8 +227,15 @@ func BuildMigrations(ctx context.Context, logger *log.Entry, db *DB, networkPass return MultiMigration{}, errors.Join(err, fmt.Errorf( "could not create guarded migration for %s", migrationName), db.Rollback()) } + + if guardedM == nil { + logger.Infof("Skipping completed migration %s", migrationName) + continue + } + migrations = append(migrations, guardedM) } + return MultiMigration{ migrations: migrations, db: db, diff --git a/cmd/soroban-rpc/internal/db/transaction.go b/cmd/soroban-rpc/internal/db/transaction.go index 361bc6be..af836455 100644 --- a/cmd/soroban-rpc/internal/db/transaction.go +++ b/cmd/soroban-rpc/internal/db/transaction.go @@ -255,8 +255,8 @@ type transactionTableMigration struct { writer TransactionWriter } -func (t *transactionTableMigration) ApplicableRange() *LedgerSeqRange { - return &LedgerSeqRange{ +func (t *transactionTableMigration) ApplicableRange() LedgerSeqRange { + return LedgerSeqRange{ First: t.firstLedger, Last: t.lastLedger, } @@ -270,7 +270,7 @@ func newTransactionTableMigration( ctx context.Context, logger *log.Entry, passphrase string, - ledgerSeqRange *LedgerSeqRange, + ledgerSeqRange LedgerSeqRange, ) migrationApplierFactory { return migrationApplierFactoryF(func(db *DB) (MigrationApplier, error) { // Truncate the table, since it may contain data, causing insert conflicts later on. diff --git a/cmd/soroban-rpc/internal/feewindow/feewindow.go b/cmd/soroban-rpc/internal/feewindow/feewindow.go index b1d40bee..08a84ab4 100644 --- a/cmd/soroban-rpc/internal/feewindow/feewindow.go +++ b/cmd/soroban-rpc/internal/feewindow/feewindow.go @@ -2,6 +2,7 @@ package feewindow import ( + "context" "errors" "io" "slices" @@ -133,9 +134,9 @@ type FeeWindows struct { db *db.DB } -func NewFeeWindows(classicRetention uint32, sorobanRetetion uint32, networkPassPhrase string, db *db.DB) *FeeWindows { +func NewFeeWindows(classicRetention uint32, sorobanRetention uint32, networkPassPhrase string, db *db.DB) *FeeWindows { return &FeeWindows{ - SorobanInclusionFeeWindow: NewFeeWindow(sorobanRetetion), + SorobanInclusionFeeWindow: NewFeeWindow(sorobanRetention), ClassicFeeWindow: NewFeeWindow(classicRetention), networkPassPhrase: networkPassPhrase, db: db, @@ -194,3 +195,35 @@ func (fw *FeeWindows) IngestFees(meta xdr.LedgerCloseMeta) error { } return nil } + +func (fw *FeeWindows) AsMigration(seqRange db.LedgerSeqRange) db.Migration { + return &feeWindowMigration{ + firstLedger: seqRange.First, + lastLedger: seqRange.Last, + windows: fw, + } +} + +type feeWindowMigration struct { + firstLedger uint32 + lastLedger uint32 + windows *FeeWindows +} + +func (fw *feeWindowMigration) ApplicableRange() db.LedgerSeqRange { + return db.LedgerSeqRange{ + First: fw.firstLedger, + Last: fw.lastLedger, + } +} + +func (fw *feeWindowMigration) Apply(_ context.Context, meta xdr.LedgerCloseMeta) error { + return fw.windows.IngestFees(meta) +} + +func (fw *feeWindowMigration) Commit(_ context.Context) error { + return nil // no-op +} + +// ensure we conform to the migration interface +var _ db.Migration = &feeWindowMigration{} From 918c97833cc2af62c3800ed7ba379e9477cdd803 Mon Sep 17 00:00:00 2001 From: Aditya Vyas Date: Thu, 5 Sep 2024 11:08:00 -0400 Subject: [PATCH 06/18] Optimise db performance of `GetLedgerRange` (#256) * Use GetLedgerRange to get the latest ledger * Remove latestLedger key from meta table * Remove latestLedger key from meta table - 2 * Fix failing unittest - 1 * Remove cache check condition * Fix failing unittest - 2 * Uncomment failing ledger entry test * Remove db.SessionInterface param * Fix failing unittest * Cache ledger range - 1 * Cache ledger range - 2 * Cache ledger range - 3 * Cache ledger range - 4 * Fix failing test * Fix failing test - 2 * Fix linting - 1 * Fix linting - 2 * Reduce the time further * Remove creating transaction for GetLedgerRange * Remove creating transaction for GetLedgerRange - 2 * Remove creating transaction for GetLedgerRange - 3 * Fix failing unittest - 1 * Fix failing tests - 2 * Update cmd/soroban-rpc/internal/db/ledger.go Co-authored-by: tamirms * Add check for empty result in ledger range * Add a cache check on GetLatestLedgerSequence call * Move cache read to DB function * Move cache read to DB function - 2 * Revert "Move cache read to DB function - 2" This reverts commit f7ebe3ebccb47d02edc85946e63544282af6bb10. * Lock cache before creating tx * Fix failing test * Add migration * Fix failing test * Refactor NewTx and NewCachedTx * Refactor NewTx and NewCachedTx - 2 * Refactor NewTx and NewCachedTx - 3 * Refactor NewTx and NewCachedTx - 4 --------- Co-authored-by: tamirms --- cmd/soroban-rpc/internal/db/db.go | 52 ++++++++-------- cmd/soroban-rpc/internal/db/ledger.go | 36 ++++++++++- cmd/soroban-rpc/internal/db/ledger_test.go | 24 ++++---- cmd/soroban-rpc/internal/db/ledgerentry.go | 59 ++++++++----------- .../internal/db/ledgerentry_test.go | 50 ++++++++++------ .../internal/db/sqlmigrations/04_metadata.sql | 5 ++ .../internal/db/transaction_test.go | 4 +- .../internal/ingest/mock_db_test.go | 26 ++++---- cmd/soroban-rpc/internal/ingest/service.go | 7 ++- .../internal/ingest/service_test.go | 15 ++--- .../internal/methods/get_events_test.go | 18 +++--- .../internal/methods/get_latest_ledger.go | 13 +--- .../methods/get_latest_ledger_test.go | 6 +- .../internal/methods/get_ledger_entries.go | 2 +- .../internal/methods/get_ledger_entry.go | 2 +- .../internal/methods/simulate_transaction.go | 2 +- cmd/soroban-rpc/internal/methods/util_test.go | 10 ++-- .../internal/preflight/preflight_test.go | 26 +++++++- 18 files changed, 205 insertions(+), 152 deletions(-) create mode 100644 cmd/soroban-rpc/internal/db/sqlmigrations/04_metadata.sql diff --git a/cmd/soroban-rpc/internal/db/db.go b/cmd/soroban-rpc/internal/db/db.go index ccdf5c14..4f9c2560 100644 --- a/cmd/soroban-rpc/internal/db/db.go +++ b/cmd/soroban-rpc/internal/db/db.go @@ -27,8 +27,7 @@ var sqlMigrations embed.FS var ErrEmptyDB = errors.New("DB is empty") const ( - metaTableName = "metadata" - latestLedgerSequenceMetaKey = "LatestLedgerSequence" + metaTableName = "metadata" ) type ReadWriter interface { @@ -42,13 +41,14 @@ type WriteTx interface { LedgerEntryWriter() LedgerEntryWriter LedgerWriter() LedgerWriter - Commit(ledgerSeq uint32) error + Commit(ledgerCloseMeta xdr.LedgerCloseMeta) error Rollback() error } type dbCache struct { - latestLedgerSeq uint32 - ledgerEntries transactionalCache // Just like the DB: compress-encoded ledger key -> ledger entry XDR + latestLedgerSeq uint32 + latestLedgerCloseTime int64 + ledgerEntries transactionalCache // Just like the DB: compress-encoded ledger key -> ledger entry XDR sync.RWMutex } @@ -129,33 +129,37 @@ func getMetaValue(ctx context.Context, q db.SessionInterface, key string) (strin case 1: // expected length on an initialized DB default: - return "", fmt.Errorf("multiple entries (%d) for key %q in table %q", len(results), latestLedgerSequenceMetaKey, metaTableName) + return "", fmt.Errorf("multiple entries (%d) for key %q in table %q", len(results), key, metaTableName) } return results[0], nil } -func getLatestLedgerSequence(ctx context.Context, q db.SessionInterface, cache *dbCache) (uint32, error) { - latestLedgerStr, err := getMetaValue(ctx, q, latestLedgerSequenceMetaKey) - if err != nil { - return 0, err +func getLatestLedgerSequence(ctx context.Context, ledgerReader LedgerReader, cache *dbCache) (uint32, error) { + cache.RLock() + latestLedgerSeqCache := cache.latestLedgerSeq + cache.RUnlock() + + if latestLedgerSeqCache != 0 { + return latestLedgerSeqCache, nil } - latestLedger, err := strconv.ParseUint(latestLedgerStr, 10, 32) + + ledgerRange, err := ledgerReader.GetLedgerRange(ctx) if err != nil { return 0, err } - result := uint32(latestLedger) - // Add missing ledger sequence to the top cache. + // Add missing ledger sequence and close time to the top cache. // Otherwise, the write-through cache won't get updated until the first ingestion commit cache.Lock() if cache.latestLedgerSeq == 0 { // Only update the cache if the value is missing (0), otherwise // we may end up overwriting the entry with an older version - cache.latestLedgerSeq = result + cache.latestLedgerSeq = ledgerRange.LastLedger.Sequence + cache.latestLedgerCloseTime = ledgerRange.LastLedger.CloseTime } cache.Unlock() - return result, nil + return ledgerRange.LastLedger.Sequence, nil } type ReadWriterMetrics struct { @@ -216,7 +220,7 @@ func NewReadWriter( } func (rw *readWriter) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { - return getLatestLedgerSequence(ctx, rw.db, rw.db.cache) + return getLatestLedgerSequence(ctx, NewLedgerReader(rw.db), rw.db.cache) } func (rw *readWriter) NewTx(ctx context.Context) (WriteTx, error) { @@ -293,7 +297,10 @@ func (w writeTx) EventWriter() EventWriter { return &w.eventWriter } -func (w writeTx) Commit(ledgerSeq uint32) error { +func (w writeTx) Commit(ledgerCloseMeta xdr.LedgerCloseMeta) error { + ledgerSeq := ledgerCloseMeta.LedgerSequence() + ledgerCloseTime := ledgerCloseMeta.LedgerCloseTime() + if err := w.ledgerEntryWriter.flush(); err != nil { return err } @@ -309,24 +316,17 @@ func (w writeTx) Commit(ledgerSeq uint32) error { return err } - _, err := sq.Replace(metaTableName). - Values(latestLedgerSequenceMetaKey, strconv.FormatUint(uint64(ledgerSeq), 10)). - RunWith(w.stmtCache). - Exec() - if err != nil { - return err - } - // We need to make the cache update atomic with the transaction commit. // Otherwise, the cache can be made inconsistent if a write transaction finishes // in between, updating the cache in the wrong order. commitAndUpdateCache := func() error { w.globalCache.Lock() defer w.globalCache.Unlock() - if err = w.tx.Commit(); err != nil { + if err := w.tx.Commit(); err != nil { return err } w.globalCache.latestLedgerSeq = ledgerSeq + w.globalCache.latestLedgerCloseTime = ledgerCloseTime w.ledgerEntryWriter.ledgerEntryCacheWriteTx.commit() return nil } diff --git a/cmd/soroban-rpc/internal/db/ledger.go b/cmd/soroban-rpc/internal/db/ledger.go index 66c34229..860e6aa1 100644 --- a/cmd/soroban-rpc/internal/db/ledger.go +++ b/cmd/soroban-rpc/internal/db/ledger.go @@ -105,6 +105,39 @@ func (r ledgerReader) GetLedger(ctx context.Context, sequence uint32) (xdr.Ledge // GetLedgerRange pulls the min/max ledger sequence numbers from the meta table. func (r ledgerReader) GetLedgerRange(ctx context.Context) (ledgerbucketwindow.LedgerRange, error) { + r.db.cache.RLock() + latestLedgerSeqCache := r.db.cache.latestLedgerSeq + latestLedgerCloseTimeCache := r.db.cache.latestLedgerCloseTime + r.db.cache.RUnlock() + + // Make use of the cached latest ledger seq and close time to query only the oldest ledger details. + if latestLedgerSeqCache != 0 { + query := sq.Select("meta"). + From(ledgerCloseMetaTableName). + Where( + fmt.Sprintf("sequence = (SELECT MIN(sequence) FROM %s)", ledgerCloseMetaTableName), + ) + var lcm []xdr.LedgerCloseMeta + if err := r.db.Select(ctx, &lcm, query); err != nil { + return ledgerbucketwindow.LedgerRange{}, fmt.Errorf("couldn't query ledger range: %w", err) + } + + if len(lcm) == 0 { + return ledgerbucketwindow.LedgerRange{}, ErrEmptyDB + } + + return ledgerbucketwindow.LedgerRange{ + FirstLedger: ledgerbucketwindow.LedgerInfo{ + Sequence: lcm[0].LedgerSequence(), + CloseTime: lcm[0].LedgerCloseTime(), + }, + LastLedger: ledgerbucketwindow.LedgerInfo{ + Sequence: latestLedgerSeqCache, + CloseTime: latestLedgerCloseTimeCache, + }, + }, nil + } + query := sq.Select("lcm.meta"). From(ledgerCloseMetaTableName + " as lcm"). Where(sq.Or{ @@ -117,9 +150,8 @@ func (r ledgerReader) GetLedgerRange(ctx context.Context) (ledgerbucketwindow.Le return ledgerbucketwindow.LedgerRange{}, fmt.Errorf("couldn't query ledger range: %w", err) } - // Empty DB if len(lcms) == 0 { - return ledgerbucketwindow.LedgerRange{}, nil + return ledgerbucketwindow.LedgerRange{}, ErrEmptyDB } return ledgerbucketwindow.LedgerRange{ diff --git a/cmd/soroban-rpc/internal/db/ledger_test.go b/cmd/soroban-rpc/internal/db/ledger_test.go index 519a1168..1b8b2fc0 100644 --- a/cmd/soroban-rpc/internal/db/ledger_test.go +++ b/cmd/soroban-rpc/internal/db/ledger_test.go @@ -81,8 +81,10 @@ func TestLedgers(t *testing.T) { ledgerSequence := uint32(i) tx, err := NewReadWriter(logger, db, daemon, 150, 15, passphrase).NewTx(context.Background()) require.NoError(t, err) - require.NoError(t, tx.LedgerWriter().InsertLedger(createLedger(ledgerSequence))) - require.NoError(t, tx.Commit(ledgerSequence)) + + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) // rolling back after a commit is a no-op require.NoError(t, tx.Rollback()) } @@ -92,16 +94,18 @@ func TestLedgers(t *testing.T) { ledgerSequence := uint32(11) tx, err := NewReadWriter(logger, db, daemon, 150, 15, passphrase).NewTx(context.Background()) require.NoError(t, err) - require.NoError(t, tx.LedgerWriter().InsertLedger(createLedger(ledgerSequence))) - require.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) assertLedgerRange(t, reader, 1, 11) ledgerSequence = uint32(12) tx, err = NewReadWriter(logger, db, daemon, 150, 5, passphrase).NewTx(context.Background()) require.NoError(t, err) - require.NoError(t, tx.LedgerWriter().InsertLedger(createLedger(ledgerSequence))) - require.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta = createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) assertLedgerRange(t, reader, 8, 12) } @@ -126,7 +130,7 @@ func TestGetLedgerRange_NonEmptyDB(t *testing.T) { require.NoError(t, ledgerW.InsertLedger(lcm), "ingestion failed for ledger %+v", lcm.V1) require.NoError(t, txW.InsertTransactions(lcm), "ingestion failed for ledger %+v", lcm.V1) } - require.NoError(t, write.Commit(lcms[len(lcms)-1].LedgerSequence())) + require.NoError(t, write.Commit(lcms[len(lcms)-1])) reader := NewLedgerReader(db) ledgerRange, err := reader.GetLedgerRange(ctx) @@ -154,7 +158,7 @@ func TestGetLedgerRange_SingleDBRow(t *testing.T) { require.NoError(t, ledgerW.InsertLedger(lcm), "ingestion failed for ledger %+v", lcm.V1) require.NoError(t, txW.InsertTransactions(lcm), "ingestion failed for ledger %+v", lcm.V1) } - require.NoError(t, write.Commit(lcms[len(lcms)-1].LedgerSequence())) + require.NoError(t, write.Commit(lcms[len(lcms)-1])) reader := NewLedgerReader(db) ledgerRange, err := reader.GetLedgerRange(ctx) @@ -171,7 +175,7 @@ func TestGetLedgerRange_EmptyDB(t *testing.T) { reader := NewLedgerReader(db) ledgerRange, err := reader.GetLedgerRange(ctx) - require.NoError(t, err) + assert.Equal(t, ErrEmptyDB, err) assert.Equal(t, uint32(0), ledgerRange.FirstLedger.Sequence) assert.Equal(t, int64(0), ledgerRange.FirstLedger.CloseTime) assert.Equal(t, uint32(0), ledgerRange.LastLedger.Sequence) @@ -196,7 +200,7 @@ func BenchmarkGetLedgerRange(b *testing.B) { require.NoError(b, ledgerW.InsertLedger(lcm)) require.NoError(b, txW.InsertTransactions(lcm)) } - require.NoError(b, write.Commit(lcms[len(lcms)-1].LedgerSequence())) + require.NoError(b, write.Commit(lcms[len(lcms)-1])) reader := NewLedgerReader(db) b.ResetTimer() diff --git a/cmd/soroban-rpc/internal/db/ledgerentry.go b/cmd/soroban-rpc/internal/db/ledgerentry.go index 60e3a259..ef704c0d 100644 --- a/cmd/soroban-rpc/internal/db/ledgerentry.go +++ b/cmd/soroban-rpc/internal/db/ledgerentry.go @@ -8,7 +8,6 @@ import ( "fmt" sq "github.com/Masterminds/squirrel" - "github.com/stellar/go/support/db" "github.com/stellar/go/xdr" ) @@ -19,8 +18,7 @@ const ( type LedgerEntryReader interface { GetLatestLedgerSequence(ctx context.Context) (uint32, error) - NewTx(ctx context.Context) (LedgerEntryReadTx, error) - NewCachedTx(ctx context.Context) (LedgerEntryReadTx, error) + NewTx(ctx context.Context, cacheTx bool) (LedgerEntryReadTx, error) } type LedgerKeyAndEntry struct { @@ -140,6 +138,7 @@ type ledgerEntryReadTx struct { stmtCache *sq.StmtCache latestLedgerSeqCache uint32 ledgerEntryCacheReadTx *transactionalCacheReadTx + ledgerReader LedgerReader tx db.SessionInterface buffer *xdr.EncodingBuffer } @@ -148,7 +147,7 @@ func (l *ledgerEntryReadTx) GetLatestLedgerSequence() (uint32, error) { if l.latestLedgerSeqCache != 0 { return l.latestLedgerSeqCache, nil } - latestLedgerSeq, err := getLatestLedgerSequence(context.Background(), l.tx, l.globalCache) + latestLedgerSeq, err := getLatestLedgerSequence(context.Background(), l.ledgerReader, l.globalCache) if err == nil { l.latestLedgerSeqCache = latestLedgerSeq } @@ -341,47 +340,39 @@ func NewLedgerEntryReader(db *DB) LedgerEntryReader { } func (r ledgerEntryReader) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { - return getLatestLedgerSequence(ctx, r.db, r.db.cache) + return getLatestLedgerSequence(ctx, NewLedgerReader(r.db), r.db.cache) } -// NewCachedTx() caches all accessed ledger entries and select statements. If many ledger entries are accessed, it will grow without bounds. -func (r ledgerEntryReader) NewCachedTx(ctx context.Context) (LedgerEntryReadTx, error) { - txSession := r.db.Clone() - // We need to copy the cached ledger entries locally when we start the transaction - // since otherwise we would break the consistency between the transaction and the cache. - - // We need to make the parent cache access atomic with the read transaction creation. - // Otherwise, the cache can be made inconsistent if a write transaction finishes - // in between, updating the cache. +// NewTx creates a new ledger entry read transaction. When cacheTx is set to True, it will cache all accessed +// ledger entries and select statements. If many ledger entries are accessed, it will grow without bounds. +func (r ledgerEntryReader) NewTx(ctx context.Context, cacheTx bool) (LedgerEntryReadTx, error) { r.db.cache.RLock() defer r.db.cache.RUnlock() - if err := txSession.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}); err != nil { - return nil, err - } - cacheReadTx := r.db.cache.ledgerEntries.newReadTx() - return &ledgerEntryReadTx{ - globalCache: r.db.cache, - stmtCache: sq.NewStmtCache(txSession.GetTx()), - latestLedgerSeqCache: r.db.cache.latestLedgerSeq, - ledgerEntryCacheReadTx: &cacheReadTx, - tx: txSession, - buffer: xdr.NewEncodingBuffer(), - }, nil -} - -func (r ledgerEntryReader) NewTx(ctx context.Context) (LedgerEntryReadTx, error) { txSession := r.db.Clone() if err := txSession.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}); err != nil { - return nil, err + return nil, fmt.Errorf("failed to begin read transaction: %w", err) } - r.db.cache.RLock() - defer r.db.cache.RUnlock() - return &ledgerEntryReadTx{ + tx := &ledgerEntryReadTx{ globalCache: r.db.cache, latestLedgerSeqCache: r.db.cache.latestLedgerSeq, tx: txSession, + ledgerReader: NewLedgerReader(r.db), buffer: xdr.NewEncodingBuffer(), - }, nil + } + + // We need to copy the cached ledger entries locally when we start the transaction + // since otherwise we would break the consistency between the transaction and the cache. + + // We need to make the parent cache access atomic with the read transaction creation. + // Otherwise, the cache can be made inconsistent if a write transaction finishes + // in between, updating the cache. + if cacheTx { + tx.stmtCache = sq.NewStmtCache(txSession.GetTx()) + cacheReadTx := r.db.cache.ledgerEntries.newReadTx() + tx.ledgerEntryCacheReadTx = &cacheReadTx + } + + return tx, nil } func encodeLedgerKey(buffer *xdr.EncodingBuffer, key xdr.LedgerKey) (string, error) { diff --git a/cmd/soroban-rpc/internal/db/ledgerentry_test.go b/cmd/soroban-rpc/internal/db/ledgerentry_test.go index 08526709..d17c560f 100644 --- a/cmd/soroban-rpc/internal/db/ledgerentry_test.go +++ b/cmd/soroban-rpc/internal/db/ledgerentry_test.go @@ -18,7 +18,7 @@ import ( ) func getLedgerEntryAndLatestLedgerSequenceWithErr(db *DB, key xdr.LedgerKey) (bool, xdr.LedgerEntry, uint32, *uint32, error) { - tx, err := NewLedgerEntryReader(db).NewTx(context.Background()) + tx, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) if err != nil { return false, xdr.LedgerEntry{}, 0, nil, err } @@ -88,7 +88,9 @@ func TestGoldenPath(t *testing.T) { assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) ledgerSequence := uint32(23) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) present, obtainedEntry, obtainedLedgerSequence, liveUntilSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.True(t, present) @@ -113,7 +115,9 @@ func TestGoldenPath(t *testing.T) { assert.NoError(t, writer.UpsertLedgerEntry(entry)) ledgerSequence = uint32(24) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta = createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) present, obtainedEntry, obtainedLedgerSequence, liveUntilSeq = getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.True(t, present) @@ -129,7 +133,9 @@ func TestGoldenPath(t *testing.T) { assert.NoError(t, writer.DeleteLedgerEntry(key)) ledgerSequence = uint32(25) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta = createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) present, _, obtainedLedgerSequence, liveUntilSeq = getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.False(t, present) @@ -170,7 +176,9 @@ func TestDeleteNonExistentLedgerEmpty(t *testing.T) { key, _ := getContractDataLedgerEntry(t, data) assert.NoError(t, writer.DeleteLedgerEntry(key)) ledgerSequence := uint32(23) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) // Make sure that the ledger number was submitted obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) @@ -248,9 +256,9 @@ func TestReadTxsDuringWriteTx(t *testing.T) { assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) // Before committing the changes, make sure multiple concurrent transactions can query the DB - readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background()) + readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) assert.NoError(t, err) - readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background()) + readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) assert.NoError(t, err) _, err = readTx1.GetLatestLedgerSequence() @@ -271,7 +279,9 @@ func TestReadTxsDuringWriteTx(t *testing.T) { // Finish the write transaction and check that the results are present ledgerSequence := uint32(23) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) assert.NoError(t, err) @@ -296,7 +306,7 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { // Create a multiple read transactions, interleaved with the writing process // First read transaction, before the write transaction is created - readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background()) + readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) assert.NoError(t, err) // Start filling the DB with a single entry (enforce flushing right away) @@ -305,7 +315,7 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { writer := tx.LedgerEntryWriter() // Second read transaction, after the write transaction is created - readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background()) + readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) assert.NoError(t, err) four := xdr.Uint32(4) @@ -334,7 +344,7 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) // Third read transaction, after the first insert has happened in the write transaction - readTx3, err := NewLedgerEntryReader(db).NewTx(context.Background()) + readTx3, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) assert.NoError(t, err) // Make sure that all the read transactions get an emptyDB error before and after the write transaction is committed @@ -348,11 +358,11 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { // commit the write transaction ledgerSequence := uint32(23) - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) for _, readTx := range []LedgerEntryReadTx{readTx1, readTx2, readTx3} { - _, err = readTx.GetLatestLedgerSequence() - assert.Equal(t, ErrEmptyDB, err) present, _, _, err := GetLedgerEntry(readTx, key) assert.NoError(t, err) assert.False(t, present) @@ -416,7 +426,9 @@ func TestConcurrentReadersAndWriter(t *testing.T) { expLegerEntry := getTTLLedgerEntry(expLedgerKey) assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) } - assert.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createLedger(ledgerSequence) + assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + assert.NoError(t, tx.Commit(ledgerCloseMeta)) logMessageCh <- fmt.Sprintf("Wrote ledger %d", ledgerSequence) time.Sleep(time.Duration(rand.Int31n(30)) * time.Millisecond) } @@ -511,7 +523,7 @@ func benchmarkLedgerEntry(b *testing.B, cached bool) { expLedgerKey, err := entryKeyToTTLEntryKey(key) assert.NoError(b, err) assert.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(getTTLLedgerEntry(expLedgerKey))) - assert.NoError(b, tx.Commit(2)) + assert.NoError(b, tx.Commit(createLedger(2))) reader := NewLedgerEntryReader(db) const numQueriesPerOp = 15 b.ResetTimer() @@ -520,9 +532,9 @@ func benchmarkLedgerEntry(b *testing.B, cached bool) { var readTx LedgerEntryReadTx var err error if cached { - readTx, err = reader.NewCachedTx(context.Background()) + readTx, err = reader.NewTx(context.Background(), true) } else { - readTx, err = reader.NewTx(context.Background()) + readTx, err = reader.NewTx(context.Background(), false) } assert.NoError(b, err) for i := 0; i < numQueriesPerOp; i++ { @@ -570,6 +582,6 @@ func BenchmarkLedgerUpdate(b *testing.B) { keyUint32 = xdr.Uint32(j) assert.NoError(b, writer.UpsertLedgerEntry(entry)) } - assert.NoError(b, tx.Commit(uint32(i+1))) + assert.NoError(b, tx.Commit(createLedger(uint32(i+1)))) } } diff --git a/cmd/soroban-rpc/internal/db/sqlmigrations/04_metadata.sql b/cmd/soroban-rpc/internal/db/sqlmigrations/04_metadata.sql new file mode 100644 index 00000000..44c87057 --- /dev/null +++ b/cmd/soroban-rpc/internal/db/sqlmigrations/04_metadata.sql @@ -0,0 +1,5 @@ +-- +migrate Up +DELETE FROM metadata WHERE key = 'LatestLedgerSequence'; + +-- +migrate Down +INSERT INTO metadata (key, value) VALUES ('LatestLedgerSequence', '0'); diff --git a/cmd/soroban-rpc/internal/db/transaction_test.go b/cmd/soroban-rpc/internal/db/transaction_test.go index 62a940f3..8f71a1a0 100644 --- a/cmd/soroban-rpc/internal/db/transaction_test.go +++ b/cmd/soroban-rpc/internal/db/transaction_test.go @@ -87,7 +87,7 @@ func TestTransactionFound(t *testing.T) { require.NoError(t, txW.InsertTransactions(lcm), "ingestion failed for ledger %+v", lcm.V1) require.NoError(t, eventW.InsertEvents(lcm), "ingestion failed for ledger %+v", lcm.V1) } - require.NoError(t, write.Commit(lcms[len(lcms)-1].LedgerSequence())) + require.NoError(t, write.Commit(lcms[len(lcms)-1])) // check 404 case reader := NewTransactionReader(log, db, passphrase) @@ -135,7 +135,7 @@ func BenchmarkTransactionFetch(b *testing.B) { require.NoError(b, ledgerW.InsertLedger(lcm)) require.NoError(b, txW.InsertTransactions(lcm)) } - require.NoError(b, write.Commit(lcms[len(lcms)-1].LedgerSequence())) + require.NoError(b, write.Commit(lcms[len(lcms)-1])) reader := NewTransactionReader(log, db, passphrase) randoms := make([]int, b.N) diff --git a/cmd/soroban-rpc/internal/ingest/mock_db_test.go b/cmd/soroban-rpc/internal/ingest/mock_db_test.go index 7c389d2c..7fdaf4cd 100644 --- a/cmd/soroban-rpc/internal/ingest/mock_db_test.go +++ b/cmd/soroban-rpc/internal/ingest/mock_db_test.go @@ -22,12 +22,12 @@ type MockDB struct { mock.Mock } -func (m MockDB) NewTx(ctx context.Context) (db.WriteTx, error) { +func (m *MockDB) NewTx(ctx context.Context) (db.WriteTx, error) { args := m.Called(ctx) return args.Get(0).(db.WriteTx), args.Error(1) } -func (m MockDB) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { +func (m *MockDB) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } @@ -45,27 +45,27 @@ func (m *MockTx) EventWriter() db.EventWriter { return eventWriter } -func (m MockTx) LedgerEntryWriter() db.LedgerEntryWriter { +func (m *MockTx) LedgerEntryWriter() db.LedgerEntryWriter { args := m.Called() return args.Get(0).(db.LedgerEntryWriter) } -func (m MockTx) LedgerWriter() db.LedgerWriter { +func (m *MockTx) LedgerWriter() db.LedgerWriter { args := m.Called() return args.Get(0).(db.LedgerWriter) } -func (m MockTx) TransactionWriter() db.TransactionWriter { +func (m *MockTx) TransactionWriter() db.TransactionWriter { args := m.Called() return args.Get(0).(db.TransactionWriter) } -func (m MockTx) Commit(ledgerSeq uint32) error { - args := m.Called(ledgerSeq) +func (m *MockTx) Commit(ledgerCloseMeta xdr.LedgerCloseMeta) error { + args := m.Called(ledgerCloseMeta) return args.Error(0) } -func (m MockTx) Rollback() error { +func (m *MockTx) Rollback() error { args := m.Called() return args.Error(0) } @@ -74,12 +74,12 @@ type MockLedgerEntryWriter struct { mock.Mock } -func (m MockLedgerEntryWriter) UpsertLedgerEntry(entry xdr.LedgerEntry) error { +func (m *MockLedgerEntryWriter) UpsertLedgerEntry(entry xdr.LedgerEntry) error { args := m.Called(entry) return args.Error(0) } -func (m MockLedgerEntryWriter) DeleteLedgerEntry(key xdr.LedgerKey) error { +func (m *MockLedgerEntryWriter) DeleteLedgerEntry(key xdr.LedgerKey) error { args := m.Called(key) return args.Error(0) } @@ -88,7 +88,7 @@ type MockLedgerWriter struct { mock.Mock } -func (m MockLedgerWriter) InsertLedger(ledger xdr.LedgerCloseMeta) error { +func (m *MockLedgerWriter) InsertLedger(ledger xdr.LedgerCloseMeta) error { args := m.Called(ledger) return args.Error(0) } @@ -97,12 +97,12 @@ type MockTransactionWriter struct { mock.Mock } -func (m MockTransactionWriter) InsertTransactions(ledger xdr.LedgerCloseMeta) error { +func (m *MockTransactionWriter) InsertTransactions(ledger xdr.LedgerCloseMeta) error { args := m.Called(ledger) return args.Error(0) } -func (m MockTransactionWriter) RegisterMetrics(ingest, count prometheus.Observer) { +func (m *MockTransactionWriter) RegisterMetrics(ingest, count prometheus.Observer) { m.Called(ingest, count) } diff --git a/cmd/soroban-rpc/internal/ingest/service.go b/cmd/soroban-rpc/internal/ingest/service.go index 29d278e6..987757f1 100644 --- a/cmd/soroban-rpc/internal/ingest/service.go +++ b/cmd/soroban-rpc/internal/ingest/service.go @@ -241,14 +241,15 @@ func (s *Service) fillEntriesFromCheckpoint(ctx context.Context, archive history if err := <-prepareRangeErr; err != nil { return err } - if ledgerCloseMeta, err := s.ledgerBackend.GetLedger(ctx, checkpointLedger); err != nil { + var ledgerCloseMeta xdr.LedgerCloseMeta + if ledgerCloseMeta, err = s.ledgerBackend.GetLedger(ctx, checkpointLedger); err != nil { return err } else if err = reader.VerifyBucketList(ledgerCloseMeta.BucketListHash()); err != nil { return err } s.logger.Info("committing checkpoint ledger entries") - err = tx.Commit(checkpointLedger) + err = tx.Commit(ledgerCloseMeta) transactionCommitted = true if err != nil { return err @@ -302,7 +303,7 @@ func (s *Service) ingest(ctx context.Context, sequence uint32) error { return err } - if err := tx.Commit(sequence); err != nil { + if err := tx.Commit(ledgerCloseMeta); err != nil { return err } s.logger. diff --git a/cmd/soroban-rpc/internal/ingest/service_test.go b/cmd/soroban-rpc/internal/ingest/service_test.go index f3f2d523..92b7753b 100644 --- a/cmd/soroban-rpc/internal/ingest/service_test.go +++ b/cmd/soroban-rpc/internal/ingest/service_test.go @@ -80,13 +80,6 @@ func TestIngestion(t *testing.T) { mockTxWriter := &MockTransactionWriter{} mockEventWriter := &MockEventWriter{} ctx := context.Background() - mockDB.On("NewTx", ctx).Return(mockTx, nil).Once() - mockTx.On("Commit", sequence).Return(nil).Once() - mockTx.On("Rollback").Return(nil).Once() - mockTx.On("LedgerEntryWriter").Return(mockLedgerEntryWriter).Twice() - mockTx.On("LedgerWriter").Return(mockLedgerWriter).Once() - mockTx.On("TransactionWriter").Return(mockTxWriter).Once() - mockTx.On("EventWriter").Return(mockEventWriter).Once() src := xdr.MustAddress("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON") firstTx := xdr.TransactionEnvelope{ @@ -242,6 +235,14 @@ func TestIngestion(t *testing.T) { EvictedPersistentLedgerEntries: []xdr.LedgerEntry{evictedPersistentLedgerEntry}, }, } + mockDB.On("NewTx", ctx).Return(mockTx, nil).Once() + mockTx.On("Commit", ledger).Return(nil).Once() + mockTx.On("Rollback").Return(nil).Once() + mockTx.On("LedgerEntryWriter").Return(mockLedgerEntryWriter).Twice() + mockTx.On("LedgerWriter").Return(mockLedgerWriter).Once() + mockTx.On("TransactionWriter").Return(mockTxWriter).Once() + mockTx.On("EventWriter").Return(mockEventWriter).Once() + mockLedgerBackend.On("GetLedger", ctx, sequence).Return(ledger, nil).Once() mockLedgerEntryWriter.On("UpsertLedgerEntry", operationChanges[1].MustUpdated()). Return(nil).Once() diff --git a/cmd/soroban-rpc/internal/methods/get_events_test.go b/cmd/soroban-rpc/internal/methods/get_events_test.go index 82cf8cf0..44692304 100644 --- a/cmd/soroban-rpc/internal/methods/get_events_test.go +++ b/cmd/soroban-rpc/internal/methods/get_events_test.go @@ -563,7 +563,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(2, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") assert.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) - require.NoError(t, write.Commit(2)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -616,7 +616,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(1, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") assert.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) - require.NoError(t, write.Commit(1)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -695,7 +695,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(1, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(2)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -757,7 +757,7 @@ func TestGetEvents(t *testing.T) { require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(1)) + require.NoError(t, write.Commit(ledgerCloseMeta)) number := xdr.Uint64(4) handler := eventsRPCHandler{ @@ -902,7 +902,7 @@ func TestGetEvents(t *testing.T) { require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(1)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -990,7 +990,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(1, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(1)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -1054,7 +1054,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(1, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(1)) + require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ dbReader: store, @@ -1153,7 +1153,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(5, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(t, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") - require.NoError(t, write.Commit(4)) + require.NoError(t, write.Commit(ledgerCloseMeta)) id := &db.Cursor{Ledger: 5, Tx: 1, Op: 0, Event: 0} handler := eventsRPCHandler{ @@ -1230,8 +1230,8 @@ func BenchmarkGetEvents(b *testing.B) { ledgerCloseMeta := ledgerCloseMetaWithEvents(uint32(i), now.Unix(), txMeta...) require.NoError(b, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") require.NoError(b, eventW.InsertEvents(ledgerCloseMeta), "ingestion failed for events ") + require.NoError(b, write.Commit(ledgerCloseMeta)) } - require.NoError(b, write.Commit(1)) handler := eventsRPCHandler{ dbReader: store, diff --git a/cmd/soroban-rpc/internal/methods/get_latest_ledger.go b/cmd/soroban-rpc/internal/methods/get_latest_ledger.go index 3617e70d..c330adb4 100644 --- a/cmd/soroban-rpc/internal/methods/get_latest_ledger.go +++ b/cmd/soroban-rpc/internal/methods/get_latest_ledger.go @@ -20,18 +20,7 @@ type GetLatestLedgerResponse struct { // NewGetLatestLedgerHandler returns a JSON RPC handler to retrieve the latest ledger entry from Stellar core. func NewGetLatestLedgerHandler(ledgerEntryReader db.LedgerEntryReader, ledgerReader db.LedgerReader) jrpc2.Handler { return NewHandler(func(ctx context.Context) (GetLatestLedgerResponse, error) { - tx, err := ledgerEntryReader.NewTx(ctx) - if err != nil { - return GetLatestLedgerResponse{}, &jrpc2.Error{ - Code: jrpc2.InternalError, - Message: "could not create read transaction", - } - } - defer func() { - _ = tx.Done() - }() - - latestSequence, err := tx.GetLatestLedgerSequence() + latestSequence, err := ledgerEntryReader.GetLatestLedgerSequence(ctx) if err != nil { return GetLatestLedgerResponse{}, &jrpc2.Error{ Code: jrpc2.InternalError, diff --git a/cmd/soroban-rpc/internal/methods/get_latest_ledger_test.go b/cmd/soroban-rpc/internal/methods/get_latest_ledger_test.go index c86e9d9a..0fcb4494 100644 --- a/cmd/soroban-rpc/internal/methods/get_latest_ledger_test.go +++ b/cmd/soroban-rpc/internal/methods/get_latest_ledger_test.go @@ -34,11 +34,7 @@ func (entryReader *ConstantLedgerEntryReader) GetLatestLedgerSequence(_ context. return expectedLatestLedgerSequence, nil } -func (entryReader *ConstantLedgerEntryReader) NewTx(_ context.Context) (db.LedgerEntryReadTx, error) { - return ConstantLedgerEntryReaderTx{}, nil -} - -func (entryReader *ConstantLedgerEntryReader) NewCachedTx(_ context.Context) (db.LedgerEntryReadTx, error) { +func (entryReader *ConstantLedgerEntryReader) NewTx(_ context.Context, _ bool) (db.LedgerEntryReadTx, error) { return ConstantLedgerEntryReaderTx{}, nil } diff --git a/cmd/soroban-rpc/internal/methods/get_ledger_entries.go b/cmd/soroban-rpc/internal/methods/get_ledger_entries.go index 3984cdcc..10d179ff 100644 --- a/cmd/soroban-rpc/internal/methods/get_ledger_entries.go +++ b/cmd/soroban-rpc/internal/methods/get_ledger_entries.go @@ -82,7 +82,7 @@ func NewGetLedgerEntriesHandler(logger *log.Entry, ledgerEntryReader db.LedgerEn ledgerKeys = append(ledgerKeys, ledgerKey) } - tx, err := ledgerEntryReader.NewTx(ctx) + tx, err := ledgerEntryReader.NewTx(ctx, false) if err != nil { return GetLedgerEntriesResponse{}, &jrpc2.Error{ Code: jrpc2.InternalError, diff --git a/cmd/soroban-rpc/internal/methods/get_ledger_entry.go b/cmd/soroban-rpc/internal/methods/get_ledger_entry.go index 6146d48f..7e87217a 100644 --- a/cmd/soroban-rpc/internal/methods/get_ledger_entry.go +++ b/cmd/soroban-rpc/internal/methods/get_ledger_entry.go @@ -63,7 +63,7 @@ func NewGetLedgerEntryHandler(logger *log.Entry, ledgerEntryReader db.LedgerEntr } } - tx, err := ledgerEntryReader.NewTx(ctx) + tx, err := ledgerEntryReader.NewTx(ctx, false) if err != nil { return GetLedgerEntryResponse{}, &jrpc2.Error{ Code: jrpc2.InternalError, diff --git a/cmd/soroban-rpc/internal/methods/simulate_transaction.go b/cmd/soroban-rpc/internal/methods/simulate_transaction.go index 2a26b08a..8d0a5fe4 100644 --- a/cmd/soroban-rpc/internal/methods/simulate_transaction.go +++ b/cmd/soroban-rpc/internal/methods/simulate_transaction.go @@ -270,7 +270,7 @@ func NewSimulateTransactionHandler(logger *log.Entry, ledgerEntryReader db.Ledge } } - readTx, err := ledgerEntryReader.NewCachedTx(ctx) + readTx, err := ledgerEntryReader.NewTx(ctx, true) if err != nil { return SimulateTransactionResponse{ Error: "Cannot create read transaction", diff --git a/cmd/soroban-rpc/internal/methods/util_test.go b/cmd/soroban-rpc/internal/methods/util_test.go index 520a1bae..b183a318 100644 --- a/cmd/soroban-rpc/internal/methods/util_test.go +++ b/cmd/soroban-rpc/internal/methods/util_test.go @@ -27,8 +27,9 @@ func BenchmarkGetProtocolVersion(b *testing.B) { ledgerSequence := uint32(1) tx, err := db.NewReadWriter(log.DefaultLogger, dbx, daemon, 150, 15, "passphrase").NewTx(context.Background()) require.NoError(b, err) - require.NoError(b, tx.LedgerWriter().InsertLedger(createMockLedgerCloseMeta(ledgerSequence))) - require.NoError(b, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createMockLedgerCloseMeta(ledgerSequence) + require.NoError(b, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(b, tx.Commit(ledgerCloseMeta)) ledgerEntryReader := db.NewLedgerEntryReader(dbx) b.ResetTimer() @@ -52,8 +53,9 @@ func TestGetProtocolVersion(t *testing.T) { ledgerSequence := uint32(1) tx, err := db.NewReadWriter(log.DefaultLogger, dbx, daemon, 150, 15, "passphrase").NewTx(context.Background()) require.NoError(t, err) - require.NoError(t, tx.LedgerWriter().InsertLedger(createMockLedgerCloseMeta(ledgerSequence))) - require.NoError(t, tx.Commit(ledgerSequence)) + ledgerCloseMeta := createMockLedgerCloseMeta(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) ledgerEntryReader := db.NewLedgerEntryReader(dbx) protocolVersion, err := getProtocolVersion(context.TODO(), ledgerEntryReader, ledgerReader) diff --git a/cmd/soroban-rpc/internal/preflight/preflight_test.go b/cmd/soroban-rpc/internal/preflight/preflight_test.go index 5de512ca..0de5417e 100644 --- a/cmd/soroban-rpc/internal/preflight/preflight_test.go +++ b/cmd/soroban-rpc/internal/preflight/preflight_test.go @@ -294,6 +294,24 @@ func (m inMemoryLedgerEntryReadTx) Done() error { return nil } +func createLedger(ledgerSequence uint32) xdr.LedgerCloseMeta { + return xdr.LedgerCloseMeta{ + V: 1, + V1: &xdr.LedgerCloseMetaV1{ + LedgerHeader: xdr.LedgerHeaderHistoryEntry{ + Hash: xdr.Hash{}, + Header: xdr.LedgerHeader{ + LedgerSeq: xdr.Uint32(ledgerSequence), + }, + }, + TxSet: xdr.GeneralizedTransactionSet{ + V: 1, + V1TxSet: &xdr.TransactionSetV1{}, + }, + }, + } +} + func getDB(t testing.TB, restartDB bool) *db.DB { dbPath := path.Join(t.TempDir(), "soroban_rpc.sqlite") dbInstance, err := db.OpenSQLiteDB(dbPath) @@ -308,7 +326,9 @@ func getDB(t testing.TB, restartDB bool) *db.DB { err := tx.LedgerEntryWriter().UpsertLedgerEntry(e) require.NoError(t, err) } - require.NoError(t, tx.Commit(2)) + ledgerCloseMeta := createLedger(uint32(2)) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) if restartDB { // Restarting the DB resets the ledger entries write-through cache @@ -330,9 +350,9 @@ func getPreflightParameters(t testing.TB, dbConfig *preflightParametersDBConfig) entryReader := db.NewLedgerEntryReader(dbConfig.dbInstance) var err error if dbConfig.disableCache { - ledgerEntryReadTx, err = entryReader.NewTx(context.Background()) + ledgerEntryReadTx, err = entryReader.NewTx(context.Background(), false) } else { - ledgerEntryReadTx, err = entryReader.NewCachedTx(context.Background()) + ledgerEntryReadTx, err = entryReader.NewTx(context.Background(), true) } require.NoError(t, err) } else { From 4203a0b979610539221fa732638d79fd55d3ee3e Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:02:12 -0700 Subject: [PATCH 07/18] Fix lint error in /methods and remove usage of internal error package (#285) * Replace internal error package * Replace internal error package in getEvents * remove nolint * go fmt * Fix lint pt1 * Fix lint pt2 * Fix lint pt3 - remove global var in getEvents * Fix lint pt4 --- .../internal/integrationtest/metrics_test.go | 3 +- .../internal/methods/get_events.go | 22 ++--- .../internal/methods/get_events_test.go | 84 +++++++++---------- .../internal/methods/get_ledger_entry.go | 6 +- .../internal/methods/get_transactions_test.go | 4 +- .../internal/methods/handler_test.go | 21 ++--- .../internal/methods/simulate_transaction.go | 24 ++++-- cmd/soroban-rpc/internal/methods/util_test.go | 6 +- 8 files changed, 88 insertions(+), 82 deletions(-) diff --git a/cmd/soroban-rpc/internal/integrationtest/metrics_test.go b/cmd/soroban-rpc/internal/integrationtest/metrics_test.go index 930a6ed8..59c148ab 100644 --- a/cmd/soroban-rpc/internal/integrationtest/metrics_test.go +++ b/cmd/soroban-rpc/internal/integrationtest/metrics_test.go @@ -8,12 +8,11 @@ import ( "runtime" "testing" + "github.com/pkg/errors" io_prometheus_client "github.com/prometheus/client_model/go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/stellar/go/support/errors" - "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/config" "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/integrationtest/infrastructure" ) diff --git a/cmd/soroban-rpc/internal/methods/get_events.go b/cmd/soroban-rpc/internal/methods/get_events.go index 36aefcdb..48290fb7 100644 --- a/cmd/soroban-rpc/internal/methods/get_events.go +++ b/cmd/soroban-rpc/internal/methods/get_events.go @@ -8,10 +8,10 @@ import ( "time" "github.com/creachadair/jrpc2" + "github.com/pkg/errors" "github.com/stellar/go/strkey" "github.com/stellar/go/support/collections/set" - "github.com/stellar/go/support/errors" "github.com/stellar/go/support/log" "github.com/stellar/go/xdr" @@ -80,7 +80,7 @@ func (e eventTypeSet) matches(event xdr.ContractEvent) bool { if len(e) == 0 { return true } - _, ok := e[eventTypeFromXDR[event.Type]] + _, ok := e[getEventTypeFromEventTypeXDR()[event.Type]] return ok } @@ -119,7 +119,7 @@ func (g *GetEventsRequest) Valid(maxLimit uint) error { // Validate the paging limit (if it exists) if g.Pagination != nil && g.Pagination.Cursor != nil { if g.StartLedger != 0 || g.EndLedger != 0 { - return errors.New("ledger ranges and cursor cannot both be set") //nolint:forbidigo + return errors.New("ledger ranges and cursor cannot both be set") } } else if g.StartLedger <= 0 { return errors.New("startLedger must be positive") @@ -160,10 +160,12 @@ const ( EventTypeDiagnostic = "diagnostic" ) -var eventTypeFromXDR = map[xdr.ContractEventType]string{ - xdr.ContractEventTypeSystem: EventTypeSystem, - xdr.ContractEventTypeContract: EventTypeContract, - xdr.ContractEventTypeDiagnostic: EventTypeDiagnostic, +func getEventTypeFromEventTypeXDR() map[xdr.ContractEventType]string { + return map[xdr.ContractEventType]string{ + xdr.ContractEventTypeSystem: EventTypeSystem, + xdr.ContractEventTypeContract: EventTypeContract, + xdr.ContractEventTypeDiagnostic: EventTypeDiagnostic, + } } func getEventTypeXDRFromEventType() map[string]xdr.ContractEventType { @@ -523,7 +525,7 @@ func eventInfoForEvent( return EventInfo{}, errors.New("unknown event version") } - eventType, ok := eventTypeFromXDR[event.Event.Type] + eventType, ok := getEventTypeFromEventTypeXDR()[event.Event.Type] if !ok { return EventInfo{}, fmt.Errorf("unknown XDR ContractEventType type: %d", event.Event.Type) } @@ -600,7 +602,5 @@ func NewGetEventsHandler( logger: logger, ledgerReader: ledgerReader, } - return NewHandler(func(ctx context.Context, request GetEventsRequest) (GetEventsResponse, error) { - return eventsHandler.getEvents(ctx, request) - }) + return NewHandler(eventsHandler.getEvents) } diff --git a/cmd/soroban-rpc/internal/methods/get_events_test.go b/cmd/soroban-rpc/internal/methods/get_events_test.go index 44692304..a7373287 100644 --- a/cmd/soroban-rpc/internal/methods/get_events_test.go +++ b/cmd/soroban-rpc/internal/methods/get_events_test.go @@ -158,7 +158,7 @@ func TestEventTypeSetValid(t *testing.T) { if testCase.expectedError { assert.Error(t, set.valid()) } else { - assert.NoError(t, set.valid()) + require.NoError(t, set.valid()) } }) } @@ -189,9 +189,9 @@ func TestEventTypeSetMarshaling(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { var set eventTypeSet input, err := json.Marshal(testCase.input) - assert.NoError(t, err) + require.NoError(t, err) err = set.UnmarshalJSON(input) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, len(testCase.expected), len(set)) for _, val := range testCase.expected { _, ok := set[val] @@ -369,18 +369,18 @@ func TestTopicFilterMatches(t *testing.T) { func TestTopicFilterJSON(t *testing.T) { var got TopicFilter - assert.NoError(t, json.Unmarshal([]byte("[]"), &got)) + require.NoError(t, json.Unmarshal([]byte("[]"), &got)) assert.Equal(t, TopicFilter{}, got) star := "*" - assert.NoError(t, json.Unmarshal([]byte("[\"*\"]"), &got)) + require.NoError(t, json.Unmarshal([]byte("[\"*\"]"), &got)) assert.Equal(t, TopicFilter{{wildcard: &star}}, got) sixtyfour := xdr.Uint64(64) scval := xdr.ScVal{Type: xdr.ScValTypeScvU64, U64: &sixtyfour} scvalstr, err := xdr.MarshalBase64(scval) - assert.NoError(t, err) - assert.NoError(t, json.Unmarshal([]byte(fmt.Sprintf("[%q]", scvalstr)), &got)) + require.NoError(t, err) + require.NoError(t, json.Unmarshal([]byte(fmt.Sprintf("[%q]", scvalstr)), &got)) assert.Equal(t, TopicFilter{{scval: &scval}}, got) } @@ -408,38 +408,38 @@ func topicFilterToString(t TopicFilter) string { func TestGetEventsRequestValid(t *testing.T) { // omit startLedger but include cursor var request GetEventsRequest - assert.NoError(t, json.Unmarshal( + require.NoError(t, json.Unmarshal( []byte("{ \"filters\": [], \"pagination\": { \"cursor\": \"0000000021474840576-0000000000\"} }"), &request, )) assert.Equal(t, uint32(0), request.StartLedger) - assert.NoError(t, request.Valid(1000)) + require.NoError(t, request.Valid(1000)) - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{}, Pagination: &PaginationOptions{Cursor: &db.Cursor{}}, }).Valid(1000), "ledger ranges and cursor cannot both be set") - assert.NoError(t, (&GetEventsRequest{ + require.NoError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{}, Pagination: nil, }).Valid(1000)) - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{}, Pagination: &PaginationOptions{Limit: 1001}, }).Valid(1000), "limit must not exceed 1000") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 0, Filters: []EventFilter{}, Pagination: nil, }).Valid(1000), "startLedger must be positive") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {}, {}, {}, {}, {}, {}, @@ -447,7 +447,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "maximum 5 filters per request") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {EventType: map[string]interface{}{"foo": nil}}, @@ -455,7 +455,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: filter type invalid: if set, type must be either 'system', 'contract' or 'diagnostic'") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {ContractIDs: []string{ @@ -470,7 +470,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: maximum 5 contract IDs per filter") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {ContractIDs: []string{"a"}}, @@ -478,7 +478,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: contract ID 1 invalid") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {ContractIDs: []string{"CCVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVKVINVALID"}}, @@ -486,7 +486,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: contract ID 1 invalid") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ { @@ -498,7 +498,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: maximum 5 topics per filter") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {Topics: []TopicFilter{ @@ -508,7 +508,7 @@ func TestGetEventsRequestValid(t *testing.T) { Pagination: nil, }).Valid(1000), "filter 1 invalid: topic 1 invalid: topic must have at least one segment") - assert.EqualError(t, (&GetEventsRequest{ + require.EqualError(t, (&GetEventsRequest{ StartLedger: 1, Filters: []EventFilter{ {Topics: []TopicFilter{ @@ -530,7 +530,7 @@ func TestGetEvents(t *testing.T) { counter := xdr.ScSymbol("COUNTER") counterScVal := xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &counter} counterXdr, err := xdr.MarshalBase64(counterScVal) - assert.NoError(t, err) + require.NoError(t, err) t.Run("startLedger validation", func(t *testing.T) { contractID := xdr.Hash([32]byte{}) @@ -562,7 +562,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(2, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") - assert.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) + require.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ @@ -615,7 +615,7 @@ func TestGetEvents(t *testing.T) { ledgerCloseMeta := ledgerCloseMetaWithEvents(1, now.Unix(), txMeta...) require.NoError(t, ledgerW.InsertLedger(ledgerCloseMeta), "ingestion failed for ledger ") - assert.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) + require.NoError(t, eventW.InsertEvents(ledgerCloseMeta)) require.NoError(t, write.Commit(ledgerCloseMeta)) handler := eventsRPCHandler{ @@ -627,7 +627,7 @@ func TestGetEvents(t *testing.T) { results, err := handler.getEvents(context.TODO(), GetEventsRequest{ StartLedger: 1, }) - assert.NoError(t, err) + require.NoError(t, err) var expected []EventInfo for i := range txMeta { @@ -641,7 +641,7 @@ func TestGetEvents(t *testing.T) { Type: xdr.ScValTypeScvSymbol, Sym: &counter, }) - assert.NoError(t, err) + require.NoError(t, err) expected = append(expected, EventInfo{ EventType: EventTypeContract, Ledger: 1, @@ -676,7 +676,7 @@ func TestGetEvents(t *testing.T) { xdr.Hash([32]byte{}), xdr.Hash([32]byte{1}), } - for i := 0; i < 5; i++ { + for i := range 5 { txMeta = append(txMeta, transactionMetaWithEvents( contractEvent( contractIDs[i%len(contractIDs)], @@ -709,7 +709,7 @@ func TestGetEvents(t *testing.T) { {ContractIDs: []string{strkey.MustEncode(strkey.VersionByteContract, contractIDs[0][:])}}, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, uint32(1), results.LatestLedger) expectedIds := []string{ @@ -777,16 +777,16 @@ func TestGetEvents(t *testing.T) { }}, }, }) - assert.NoError(t, err) + require.NoError(t, err) id := db.Cursor{Ledger: 1, Tx: 5, Op: 0, Event: 0}.String() - assert.NoError(t, err) + require.NoError(t, err) scVal := xdr.ScVal{ Type: xdr.ScValTypeScvU64, U64: &number, } value, err := xdr.MarshalBase64(scVal) - assert.NoError(t, err) + require.NoError(t, err) expected := []EventInfo{ { EventType: EventTypeContract, @@ -924,14 +924,14 @@ func TestGetEvents(t *testing.T) { }, }, }) - assert.NoError(t, err) + require.NoError(t, err) id := db.Cursor{Ledger: 1, Tx: 4, Op: 0, Event: 0}.String() value, err := xdr.MarshalBase64(xdr.ScVal{ Type: xdr.ScValTypeScvU64, U64: &number, }) - assert.NoError(t, err) + require.NoError(t, err) expected := []EventInfo{ { EventType: EventTypeContract, @@ -1004,7 +1004,7 @@ func TestGetEvents(t *testing.T) { {EventType: map[string]interface{}{EventTypeSystem: nil}}, }, }) - assert.NoError(t, err) + require.NoError(t, err) id := db.Cursor{Ledger: 1, Tx: 1, Op: 0, Event: 1}.String() expected := []EventInfo{ @@ -1039,7 +1039,7 @@ func TestGetEvents(t *testing.T) { contractID := xdr.Hash([32]byte{}) var txMeta []xdr.TransactionMeta - for i := 0; i < 180; i++ { + for i := range 180 { number := xdr.Uint64(i) txMeta = append(txMeta, transactionMetaWithEvents( contractEvent( @@ -1067,10 +1067,10 @@ func TestGetEvents(t *testing.T) { Filters: []EventFilter{}, Pagination: &PaginationOptions{Limit: 10}, }) - assert.NoError(t, err) + require.NoError(t, err) var expected []EventInfo - for i := 0; i < 10; i++ { + for i := range 10 { id := db.Cursor{ Ledger: 1, Tx: uint32(i + 1), @@ -1078,7 +1078,7 @@ func TestGetEvents(t *testing.T) { Event: 0, }.String() value, err := xdr.MarshalBase64(txMeta[i].MustV3().SorobanMeta.Events[0].Body.MustV0().Data) - assert.NoError(t, err) + require.NoError(t, err) expected = append(expected, EventInfo{ EventType: EventTypeContract, Ledger: 1, @@ -1168,7 +1168,7 @@ func TestGetEvents(t *testing.T) { Limit: 2, }, }) - assert.NoError(t, err) + require.NoError(t, err) var expected []EventInfo expectedIDs := []string{ @@ -1178,7 +1178,7 @@ func TestGetEvents(t *testing.T) { symbols := datas[1:3] for i, id := range expectedIDs { expectedXdr, err := xdr.MarshalBase64(xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &symbols[i]}) - assert.NoError(t, err) + require.NoError(t, err) expected = append(expected, EventInfo{ EventType: EventTypeContract, Ledger: 5, @@ -1200,7 +1200,7 @@ func TestGetEvents(t *testing.T) { Limit: 2, }, }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, GetEventsResponse{[]EventInfo{}, 5}, results) }) } @@ -1427,7 +1427,7 @@ func newTestDB(tb testing.TB) *db.DB { db, err := db.OpenSQLiteDB(dbPath) require.NoError(tb, err) tb.Cleanup(func() { - assert.NoError(tb, db.Close()) + require.NoError(tb, db.Close()) }) return db } diff --git a/cmd/soroban-rpc/internal/methods/get_ledger_entry.go b/cmd/soroban-rpc/internal/methods/get_ledger_entry.go index 7e87217a..24186c31 100644 --- a/cmd/soroban-rpc/internal/methods/get_ledger_entry.go +++ b/cmd/soroban-rpc/internal/methods/get_ledger_entry.go @@ -14,14 +14,14 @@ import ( "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/xdr2json" ) -// Deprecated. Use GetLedgerEntriesRequest instead. +// GetLedgerEntryRequest Deprecated: Use GetLedgerEntriesRequest instead. // TODO(https://github.com/stellar/soroban-tools/issues/374) remove after getLedgerEntries is deployed. type GetLedgerEntryRequest struct { Key string `json:"key"` Format string `json:"xdrFormat"` } -// Deprecated. Use GetLedgerEntriesResponse instead. +// GetLedgerEntryResponse Deprecated: Use GetLedgerEntriesResponse instead. // TODO(https://github.com/stellar/soroban-tools/issues/374) remove after getLedgerEntries is deployed. type GetLedgerEntryResponse struct { EntryXDR string `json:"xdr"` @@ -35,7 +35,7 @@ type GetLedgerEntryResponse struct { } // NewGetLedgerEntryHandler returns a json rpc handler to retrieve the specified ledger entry from stellar core -// Deprecated. use NewGetLedgerEntriesHandler instead. +// Deprecated: use NewGetLedgerEntriesHandler instead // TODO(https://github.com/stellar/soroban-tools/issues/374) remove after getLedgerEntries is deployed. func NewGetLedgerEntryHandler(logger *log.Entry, ledgerEntryReader db.LedgerEntryReader) jrpc2.Handler { return NewHandler(func(ctx context.Context, request GetLedgerEntryRequest) (GetLedgerEntryResponse, error) { diff --git a/cmd/soroban-rpc/internal/methods/get_transactions_test.go b/cmd/soroban-rpc/internal/methods/get_transactions_test.go index 86304147..5a90202f 100644 --- a/cmd/soroban-rpc/internal/methods/get_transactions_test.go +++ b/cmd/soroban-rpc/internal/methods/get_transactions_test.go @@ -69,7 +69,7 @@ func TestGetTransactions_DefaultLimit(t *testing.T) { assert.Equal(t, toid.New(5, 2, 1).String(), response.Cursor) // assert transactions result - assert.Equal(t, 10, len(response.Transactions)) + assert.Len(t, response.Transactions, 10) } func TestGetTransactions_DefaultLimitExceedsLatestLedger(t *testing.T) { @@ -179,7 +179,7 @@ func TestGetTransactions_CustomLimitAndCursor(t *testing.T) { assert.Equal(t, toid.New(3, 1, 1).String(), response.Cursor) // assert transactions result - assert.Equal(t, 3, len(response.Transactions)) + assert.Len(t, response.Transactions, 3) assert.Equal(t, uint32(2), response.Transactions[0].Ledger) assert.Equal(t, uint32(2), response.Transactions[1].Ledger) assert.Equal(t, uint32(3), response.Transactions[2].Ledger) diff --git a/cmd/soroban-rpc/internal/methods/handler_test.go b/cmd/soroban-rpc/internal/methods/handler_test.go index 564f7f51..aba88d4e 100644 --- a/cmd/soroban-rpc/internal/methods/handler_test.go +++ b/cmd/soroban-rpc/internal/methods/handler_test.go @@ -7,6 +7,7 @@ import ( "github.com/creachadair/jrpc2" "github.com/creachadair/jrpc2/handler" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) type Request struct { @@ -15,7 +16,7 @@ type Request struct { func TestNewHandlerNoArrayParameters(t *testing.T) { callCount := 0 - f := func(ctx context.Context, request Request) error { + f := func(_ context.Context, request Request) error { callCount++ assert.Equal(t, "bar", request.Parameter) return nil @@ -27,15 +28,15 @@ func TestNewHandlerNoArrayParameters(t *testing.T) { "params": { "parameter": "bar" } }` requests, err := jrpc2.ParseRequests([]byte(objectRequest)) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, requests, 1) finalObjectRequest := requests[0].ToRequest() // object parameters should work with our handlers customHandler := NewHandler(f) _, err = customHandler(context.Background(), finalObjectRequest) - assert.NoError(t, err) - assert.Equal(t, 1, callCount) + require.NoError(t, err) + require.Equal(t, 1, callCount) arrayRequest := `{ "jsonrpc": "2.0", @@ -44,17 +45,17 @@ func TestNewHandlerNoArrayParameters(t *testing.T) { "params": ["bar"] }` requests, err = jrpc2.ParseRequests([]byte(arrayRequest)) - assert.NoError(t, err) - assert.Len(t, requests, 1) + require.NoError(t, err) + require.Len(t, requests, 1) finalArrayRequest := requests[0].ToRequest() // Array requests should work with the normal handler, but not with our handlers stdHandler := handler.New(f) _, err = stdHandler(context.Background(), finalArrayRequest) - assert.NoError(t, err) - assert.Equal(t, 2, callCount) + require.NoError(t, err) + require.Equal(t, 2, callCount) _, err = customHandler(context.Background(), finalArrayRequest) - assert.Error(t, err) - assert.Contains(t, err.Error(), "invalid parameters") + require.Error(t, err) + require.Contains(t, err.Error(), "invalid parameters") } diff --git a/cmd/soroban-rpc/internal/methods/simulate_transaction.go b/cmd/soroban-rpc/internal/methods/simulate_transaction.go index 8d0a5fe4..b4a332ce 100644 --- a/cmd/soroban-rpc/internal/methods/simulate_transaction.go +++ b/cmd/soroban-rpc/internal/methods/simulate_transaction.go @@ -30,7 +30,8 @@ type SimulateTransactionCost struct { MemoryBytes uint64 `json:"memBytes,string"` } -// SimulateHostFunctionResult contains the simulation result of each HostFunction within the single InvokeHostFunctionOp allowed in a Transaction +// SimulateHostFunctionResult contains the simulation result of each HostFunction +// within the single InvokeHostFunctionOp allowed in a Transaction type SimulateHostFunctionResult struct { AuthXDR []string `json:"auth,omitempty"` AuthJSON []json.RawMessage `json:"authJson,omitempty"` @@ -213,12 +214,16 @@ type SimulateTransactionResponse struct { EventsXDR []string `json:"events,omitempty"` // DiagnosticEvent XDR in base64 EventsJSON []json.RawMessage `json:"eventsJson,omitempty"` - MinResourceFee int64 `json:"minResourceFee,string,omitempty"` - Results []SimulateHostFunctionResult `json:"results,omitempty"` // an array of the individual host function call results - Cost SimulateTransactionCost `json:"cost,omitempty"` // the effective cpu and memory cost of the invoked transaction execution. - RestorePreamble *RestorePreamble `json:"restorePreamble,omitempty"` // If present, it indicates that a prior RestoreFootprint is required - StateChanges []LedgerEntryChange `json:"stateChanges,omitempty"` // If present, it indicates how the state (ledger entries) will change as a result of the transaction execution. - LatestLedger uint32 `json:"latestLedger"` + MinResourceFee int64 `json:"minResourceFee,string,omitempty"` + // an array of the individual host function call results + Results []SimulateHostFunctionResult `json:"results,omitempty"` + // the effective cpu and memory cost of the invoked transaction execution. + Cost SimulateTransactionCost `json:"cost,omitempty"` + // If present, it indicates that a prior RestoreFootprint is required + RestorePreamble *RestorePreamble `json:"restorePreamble,omitempty"` + // If present, it indicates how the state (ledger entries) will change as a result of the transaction execution. + StateChanges []LedgerEntryChange `json:"stateChanges,omitempty"` + LatestLedger uint32 `json:"latestLedger"` } type PreflightGetter interface { @@ -260,7 +265,8 @@ func NewSimulateTransactionHandler(logger *log.Entry, ledgerEntryReader db.Ledge case xdr.OperationTypeExtendFootprintTtl, xdr.OperationTypeRestoreFootprint: if txEnvelope.Type != xdr.EnvelopeTypeEnvelopeTypeTx && txEnvelope.V1.Tx.Ext.V != 1 { return SimulateTransactionResponse{ - Error: "To perform a SimulateTransaction for ExtendFootprintTtl or RestoreFootprint operations, SorobanTransactionData must be provided", + Error: "To perform a SimulateTransaction for ExtendFootprintTtl or RestoreFootprint operations," + + " SorobanTransactionData must be provided", } } footprint = txEnvelope.V1.Tx.Ext.SorobanData.Resources.Footprint @@ -374,7 +380,7 @@ func NewSimulateTransactionHandler(logger *log.Entry, ledgerEntryReader db.Ledge } stateChanges := make([]LedgerEntryChange, len(result.LedgerEntryDiff)) - for i := 0; i < len(stateChanges); i++ { + for i := range stateChanges { if err := stateChanges[i].FromXDRDiff(result.LedgerEntryDiff[i], request.Format); err != nil { return SimulateTransactionResponse{ Error: err.Error(), diff --git a/cmd/soroban-rpc/internal/methods/util_test.go b/cmd/soroban-rpc/internal/methods/util_test.go index b183a318..399224e4 100644 --- a/cmd/soroban-rpc/internal/methods/util_test.go +++ b/cmd/soroban-rpc/internal/methods/util_test.go @@ -85,10 +85,10 @@ func createMockLedgerCloseMeta(ledgerSequence uint32) xdr.LedgerCloseMeta { func NewTestDB(tb testing.TB) *db.DB { tmp := tb.TempDir() dbPath := path.Join(tmp, "db.sqlite") - db, err := db.OpenSQLiteDB(dbPath) + dbConn, err := db.OpenSQLiteDB(dbPath) require.NoError(tb, err) tb.Cleanup(func() { - require.NoError(tb, db.Close()) + require.NoError(tb, dbConn.Close()) }) - return db + return dbConn } From d81c47fdbc5d5a86b8aabb949744a6cea088a356 Mon Sep 17 00:00:00 2001 From: Aditya Vyas Date: Tue, 10 Sep 2024 14:23:37 -0400 Subject: [PATCH 08/18] Fix RPC linting (#286) * Fix config lint * Fix daemon lint * Fix db lint * Fix feewindow lint * Fix ingest lint * Fix ledgerbucketwindow lint * Fix ingest lint - 2 * Fix preflight lint * Small fixes - 1 * Clean up * gci file --- cmd/soroban-rpc/internal/config/flags.go | 2 +- cmd/soroban-rpc/internal/config/main_test.go | 6 +- .../internal/config/option_test.go | 235 ++++------ cmd/soroban-rpc/internal/config/options.go | 15 +- cmd/soroban-rpc/internal/config/parse.go | 44 +- cmd/soroban-rpc/internal/config/toml.go | 7 +- cmd/soroban-rpc/internal/config/toml_test.go | 21 +- cmd/soroban-rpc/internal/daemon/daemon.go | 255 +++++----- .../internal/daemon/interfaces/noOpDaemon.go | 2 +- cmd/soroban-rpc/internal/daemon/metrics.go | 24 +- cmd/soroban-rpc/internal/db/cursor.go | 8 +- cmd/soroban-rpc/internal/db/cursor_test.go | 7 +- cmd/soroban-rpc/internal/db/db.go | 21 +- cmd/soroban-rpc/internal/db/ledgerentry.go | 28 +- .../internal/db/ledgerentry_test.go | 435 +++++++++++------- .../internal/feewindow/feewindow.go | 4 +- .../internal/feewindow/feewindow_test.go | 248 ++++------ .../internal/ingest/ledgerentry.go | 22 +- .../internal/ingest/mock_db_test.go | 10 +- cmd/soroban-rpc/internal/ingest/service.go | 48 +- .../internal/ingest/service_test.go | 332 +++++++------ .../ledgerbucketwindow_test.go | 5 +- cmd/soroban-rpc/internal/preflight/pool.go | 12 +- .../internal/preflight/preflight.go | 5 +- .../internal/preflight/preflight_test.go | 10 +- 25 files changed, 974 insertions(+), 832 deletions(-) diff --git a/cmd/soroban-rpc/internal/config/flags.go b/cmd/soroban-rpc/internal/config/flags.go index 0c313460..d0af16d7 100644 --- a/cmd/soroban-rpc/internal/config/flags.go +++ b/cmd/soroban-rpc/internal/config/flags.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/pflag" ) -// Init adds the CLI flags to the command. This lets the command output the +// AddFlags Init adds the CLI flags to the command. This lets the command output the // flags as part of the --help output. func (cfg *Config) AddFlags(cmd *cobra.Command) error { cfg.flagset = cmd.PersistentFlags() diff --git a/cmd/soroban-rpc/internal/config/main_test.go b/cmd/soroban-rpc/internal/config/main_test.go index c510c1bd..a4af86ad 100644 --- a/cmd/soroban-rpc/internal/config/main_test.go +++ b/cmd/soroban-rpc/internal/config/main_test.go @@ -34,9 +34,11 @@ func TestLoadConfigPathPrecedence(t *testing.T) { })) require.NoError(t, cfg.Validate()) - assert.Equal(t, "/opt/stellar/soroban-rpc/etc/stellar-captive-core.cfg", cfg.CaptiveCoreConfigPath, "should read values from the config path file") + assert.Equal(t, "/opt/stellar/soroban-rpc/etc/stellar-captive-core.cfg", cfg.CaptiveCoreConfigPath, + "should read values from the config path file") assert.Equal(t, "CLI test passphrase", cfg.NetworkPassphrase, "cli flags should override --config-path values") - assert.Equal(t, "/usr/overridden/stellar-core", cfg.StellarCoreBinaryPath, "cli flags should override --config-path values and env vars") + assert.Equal(t, "/usr/overridden/stellar-core", cfg.StellarCoreBinaryPath, + "cli flags should override --config-path values and env vars") assert.Equal(t, "/env/overridden/db", cfg.SQLiteDBPath, "env var should override config file") assert.Equal(t, 2*time.Second, cfg.CoreRequestTimeout, "default value should be used, if not set anywhere else") } diff --git a/cmd/soroban-rpc/internal/config/option_test.go b/cmd/soroban-rpc/internal/config/option_test.go index 83e9b5eb..4fc08354 100644 --- a/cmd/soroban-rpc/internal/config/option_test.go +++ b/cmd/soroban-rpc/internal/config/option_test.go @@ -1,7 +1,6 @@ package config import ( - "fmt" "math" "testing" "time" @@ -51,15 +50,15 @@ func TestValidateRequired(t *testing.T) { } // unset - assert.ErrorContains(t, o.Validate(o), "required-option is required") + require.ErrorContains(t, o.Validate(o), "required-option is required") // set with blank value require.NoError(t, o.setValue("")) - assert.ErrorContains(t, o.Validate(o), "required-option is required") + require.ErrorContains(t, o.Validate(o), "required-option is required") // set with valid value require.NoError(t, o.setValue("not-blank")) - assert.NoError(t, o.Validate(o)) + require.NoError(t, o.Validate(o)) } func TestValidatePositiveUint32(t *testing.T) { @@ -71,15 +70,15 @@ func TestValidatePositiveUint32(t *testing.T) { } // unset - assert.ErrorContains(t, o.Validate(o), "positive-option must be positive") + require.ErrorContains(t, o.Validate(o), "positive-option must be positive") // set with 0 value require.NoError(t, o.setValue(uint32(0))) - assert.ErrorContains(t, o.Validate(o), "positive-option must be positive") + require.ErrorContains(t, o.Validate(o), "positive-option must be positive") // set with valid value require.NoError(t, o.setValue(uint32(1))) - assert.NoError(t, o.Validate(o)) + require.NoError(t, o.Validate(o)) } func TestValidatePositiveInt(t *testing.T) { @@ -91,19 +90,19 @@ func TestValidatePositiveInt(t *testing.T) { } // unset - assert.ErrorContains(t, o.Validate(o), "positive-option must be positive") + require.ErrorContains(t, o.Validate(o), "positive-option must be positive") // set with 0 value require.NoError(t, o.setValue(0)) - assert.ErrorContains(t, o.Validate(o), "positive-option must be positive") + require.ErrorContains(t, o.Validate(o), "positive-option must be positive") // set with negative value require.NoError(t, o.setValue(-1)) - assert.ErrorContains(t, o.Validate(o), "positive-option must be positive") + require.ErrorContains(t, o.Validate(o), "positive-option must be positive") // set with valid value require.NoError(t, o.setValue(1)) - assert.NoError(t, o.Validate(o)) + require.NoError(t, o.Validate(o)) } func TestUnassignableField(t *testing.T) { @@ -126,143 +125,105 @@ func TestNoParserForFlag(t *testing.T) { require.Contains(t, err.Error(), "no parser for flag mykey") } -func TestSetValue(t *testing.T) { +func TestSetValueBool(t *testing.T) { var b bool + testCases := []struct { + name string + value interface{} + err string + }{ + {"valid-bool", true, ""}, + {"valid-bool-string", "true", ""}, + {"valid-bool-string-false", "false", ""}, + {"valid-bool-string-uppercase", "TRUE", ""}, + {"invalid-bool-string", "foobar", "invalid boolean value invalid-bool-string: foobar"}, + } + runTestCases(t, &b, testCases) +} + +func TestSetValueInt(t *testing.T) { var i int + testCases := []struct { + name string + value interface{} + err string + }{ + {"valid-int", 1, ""}, + {"valid-int-string", "1", ""}, + {"invalid-int-string", "abcd", "strconv.ParseInt: parsing \"abcd\": invalid syntax"}, + } + runTestCases(t, &i, testCases) +} + +func TestSetValueUint32(t *testing.T) { var u32 uint32 + testCases := []struct { + name string + value interface{} + err string + }{ + {"valid-uint32", 1, ""}, + {"overflow-uint32", uint64(math.MaxUint32) + 1, "overflow-uint32 overflows uint32"}, + {"negative-uint32", -1, "negative-uint32 cannot be negative"}, + } + runTestCases(t, &u32, testCases) +} + +func TestSetValueUint64(t *testing.T) { var u64 uint64 + testCases := []struct { + name string + value interface{} + err string + }{ + {"valid-uint", 1, ""}, + {"negative-uint", -1, "negative-uint cannot be negative"}, + } + runTestCases(t, &u64, testCases) +} + +func TestSetValueFloat64(t *testing.T) { var f64 float64 - var s string + testCases := []struct { + name string + value interface{} + err string + }{ + {"valid-float", 1.05, ""}, + {"valid-float-int", int64(1234), ""}, + {"valid-float-string", "1.05", ""}, + {"invalid-float-string", "foobar", "strconv.ParseFloat: parsing \"foobar\": invalid syntax"}, + } + runTestCases(t, &f64, testCases) +} - for _, scenario := range []struct { +func TestSetValueString(t *testing.T) { + var s string + testCases := []struct { name string - key interface{} value interface{} - err error + err string }{ - { - name: "valid-bool", - key: &b, - value: true, - err: nil, - }, - { - name: "valid-bool-string", - key: &b, - value: "true", - err: nil, - }, - { - name: "valid-bool-string-false", - key: &b, - value: "false", - err: nil, - }, - { - name: "valid-bool-string-uppercase", - key: &b, - value: "TRUE", - err: nil, - }, - { - name: "invalid-bool-string", - key: &b, - value: "foobar", - err: fmt.Errorf("invalid boolean value invalid-bool-string: foobar"), - }, - { - name: "invalid-bool-string", - key: &b, - value: "foobar", - err: fmt.Errorf("invalid boolean value invalid-bool-string: foobar"), - }, - { - name: "valid-int", - key: &i, - value: 1, - err: nil, - }, - { - name: "valid-int-string", - key: &i, - value: "1", - err: nil, - }, - { - name: "invalid-int-string", - key: &i, - value: "abcd", - err: fmt.Errorf("strconv.ParseInt: parsing \"abcd\": invalid syntax"), - }, - { - name: "valid-uint32", - key: &u32, - value: 1, - err: nil, - }, - { - name: "overflow-uint32", - key: &u32, - value: uint64(math.MaxUint32) + 1, - err: fmt.Errorf("overflow-uint32 overflows uint32"), - }, - { - name: "negative-uint32", - key: &u32, - value: -1, - err: fmt.Errorf("negative-uint32 cannot be negative"), - }, - { - name: "valid-uint", - key: &u64, - value: 1, - err: nil, - }, - { - name: "negative-uint", - key: &u64, - value: -1, - err: fmt.Errorf("negative-uint cannot be negative"), - }, - { - name: "valid-float", - key: &f64, - value: 1.05, - err: nil, - }, - { - name: "valid-float-int", - key: &f64, - value: int64(1234), - err: nil, - }, - { - name: "valid-float-string", - key: &f64, - value: "1.05", - err: nil, - }, - { - name: "invalid-float-string", - key: &f64, - value: "foobar", - err: fmt.Errorf("strconv.ParseFloat: parsing \"foobar\": invalid syntax"), - }, - { - name: "valid-string", - key: &s, - value: "foobar", - err: nil, - }, - } { - t.Run(scenario.name, func(t *testing.T) { + {"valid-string", "foobar", ""}, + } + runTestCases(t, &s, testCases) +} + +func runTestCases(t *testing.T, key interface{}, testCases []struct { + name string + value interface{} + err string +}, +) { + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { co := Option{ - Name: scenario.name, - ConfigKey: scenario.key, + Name: tc.name, + ConfigKey: key, } - err := co.setValue(scenario.value) - if scenario.err != nil { - require.EqualError(t, err, scenario.err.Error()) + err := co.setValue(tc.value) + if tc.err != "" { + require.EqualError(t, err, tc.err) } else { require.NoError(t, err) } diff --git a/cmd/soroban-rpc/internal/config/options.go b/cmd/soroban-rpc/internal/config/options.go index 58df85e2..b04793a5 100644 --- a/cmd/soroban-rpc/internal/config/options.go +++ b/cmd/soroban-rpc/internal/config/options.go @@ -507,15 +507,12 @@ func (e missingRequiredOptionError) Error() string { } func required(option *Option) error { - switch reflect.ValueOf(option.ConfigKey).Elem().Kind() { - case reflect.Slice: - if reflect.ValueOf(option.ConfigKey).Elem().Len() > 0 { - return nil - } - default: - if !reflect.ValueOf(option.ConfigKey).Elem().IsZero() { - return nil - } + value := reflect.ValueOf(option.ConfigKey).Elem() + + isSet := value.Kind() == reflect.Slice && value.Len() > 0 || value.Kind() != reflect.Slice && !value.IsZero() + + if isSet { + return nil } var waysToSet []string diff --git a/cmd/soroban-rpc/internal/config/parse.go b/cmd/soroban-rpc/internal/config/parse.go index 58a5d80b..f07c1b5e 100644 --- a/cmd/soroban-rpc/internal/config/parse.go +++ b/cmd/soroban-rpc/internal/config/parse.go @@ -94,7 +94,11 @@ func parseString(option *Option, i interface{}) error { case nil: return nil case string: - *option.ConfigKey.(*string) = v + if strPtr, ok := option.ConfigKey.(*string); ok { + *strPtr = v + } else { + return fmt.Errorf("invalid type for %s: expected *string", option.Name) + } default: return fmt.Errorf("could not parse string %s: %v", option.Name, i) } @@ -128,6 +132,11 @@ func parseUint32(option *Option, i interface{}) error { } func parseDuration(option *Option, i interface{}) error { + durationPtr, ok := option.ConfigKey.(*time.Duration) + if !ok { + return fmt.Errorf("invalid type for %s: expected *time.Duration", option.Name) + } + switch v := i.(type) { case nil: return nil @@ -136,11 +145,11 @@ func parseDuration(option *Option, i interface{}) error { if err != nil { return fmt.Errorf("could not parse duration: %q: %w", v, err) } - *option.ConfigKey.(*time.Duration) = d + *durationPtr = d case time.Duration: - *option.ConfigKey.(*time.Duration) = v + *durationPtr = v case *time.Duration: - *option.ConfigKey.(*time.Duration) = *v + *durationPtr = *v default: return fmt.Errorf("%s is not a duration", option.Name) } @@ -148,31 +157,34 @@ func parseDuration(option *Option, i interface{}) error { } func parseStringSlice(option *Option, i interface{}) error { + stringSlicePtr, ok := option.ConfigKey.(*[]string) + if !ok { + return fmt.Errorf("invalid type for %s: expected *[]string", option.Name) + } + switch v := i.(type) { case nil: return nil case string: if v == "" { - *option.ConfigKey.(*[]string) = nil + *stringSlicePtr = nil } else { - *option.ConfigKey.(*[]string) = strings.Split(v, ",") + *stringSlicePtr = strings.Split(v, ",") } - return nil case []string: - *option.ConfigKey.(*[]string) = v - return nil + *stringSlicePtr = v case []interface{}: - *option.ConfigKey.(*[]string) = make([]string, len(v)) + result := make([]string, len(v)) for i, s := range v { - switch s := s.(type) { - case string: - (*option.ConfigKey.(*[]string))[i] = s - default: - return fmt.Errorf("could not parse %s: %v", option.Name, v) + str, ok := s.(string) + if !ok { + return fmt.Errorf("could not parse %s: element %d is not a string", option.Name, i) } + result[i] = str } - return nil + *stringSlicePtr = result default: return fmt.Errorf("could not parse %s: %v", option.Name, v) } + return nil } diff --git a/cmd/soroban-rpc/internal/config/toml.go b/cmd/soroban-rpc/internal/config/toml.go index e6ea5a91..038a6f74 100644 --- a/cmd/soroban-rpc/internal/config/toml.go +++ b/cmd/soroban-rpc/internal/config/toml.go @@ -9,6 +9,11 @@ import ( "github.com/pelletier/go-toml" ) +const ( + maxLineWidth = 80 + commentIndent = 2 +) + func parseToml(r io.Reader, strict bool, cfg *Config) error { tree, err := toml.LoadReader(r) if err != nil { @@ -73,7 +78,7 @@ func (cfg *Config) MarshalTOML() ([]byte, error) { key, toml.SetOptions{ Comment: strings.ReplaceAll( - wordWrap(option.Usage, 80-2), + wordWrap(option.Usage, maxLineWidth-commentIndent), "\n", "\n ", ), diff --git a/cmd/soroban-rpc/internal/config/toml_test.go b/cmd/soroban-rpc/internal/config/toml_test.go index ae762567..b2d2d01d 100644 --- a/cmd/soroban-rpc/internal/config/toml_test.go +++ b/cmd/soroban-rpc/internal/config/toml_test.go @@ -106,25 +106,26 @@ func TestRoundTrip(t *testing.T) { // Generate test values for every option, so we can round-trip test them all. for _, option := range cfg.options() { optType := reflect.ValueOf(option.ConfigKey).Elem().Type() - switch option.ConfigKey.(type) { + switch v := option.ConfigKey.(type) { case *bool: - *option.ConfigKey.(*bool) = true + *v = true case *string: - *option.ConfigKey.(*string) = "test" + *v = "test" case *uint: - *option.ConfigKey.(*uint) = 42 + *v = 42 case *uint32: - *option.ConfigKey.(*uint32) = 32 + *v = 32 case *time.Duration: - *option.ConfigKey.(*time.Duration) = 5 * time.Second + *v = 5 * time.Second case *[]string: - *option.ConfigKey.(*[]string) = []string{"a", "b"} + *v = []string{"a", "b"} case *logrus.Level: - *option.ConfigKey.(*logrus.Level) = logrus.InfoLevel + *v = logrus.InfoLevel case *LogFormat: - *option.ConfigKey.(*LogFormat) = LogFormatText + *v = LogFormatText default: - t.Fatalf("TestRoundTrip not implemented for type %s, on option %s, please add a test value", optType.Kind(), option.Name) + t.Fatalf("TestRoundTrip not implemented for type %s, on option %s, "+ + "please add a test value", optType.Kind(), option.Name) } } diff --git a/cmd/soroban-rpc/internal/daemon/daemon.go b/cmd/soroban-rpc/internal/daemon/daemon.go index 07ca7992..67110369 100644 --- a/cmd/soroban-rpc/internal/daemon/daemon.go +++ b/cmd/soroban-rpc/internal/daemon/daemon.go @@ -13,6 +13,7 @@ import ( "syscall" "time" + "github.com/go-chi/chi" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -149,21 +150,53 @@ func newCaptiveCore(cfg *config.Config, logger *supportlog.Entry) (*ledgerbacken } func MustNew(cfg *config.Config, logger *supportlog.Entry) *Daemon { + logger = setupLogger(cfg, logger) + core := mustCreateCaptiveCore(cfg, logger) + historyArchive := mustCreateHistoryArchive(cfg, logger) + metricsRegistry := prometheus.NewRegistry() + + daemon := &Daemon{ + logger: logger, + core: core, + db: mustOpenDatabase(cfg, logger, metricsRegistry), + done: make(chan struct{}), + metricsRegistry: metricsRegistry, + coreClient: newCoreClientWithMetrics(createStellarCoreClient(cfg), metricsRegistry), + } + + feewindows := daemon.mustInitializeStorage(cfg) + + daemon.ingestService = createIngestService(cfg, logger, daemon, feewindows, historyArchive) + daemon.preflightWorkerPool = createPreflightWorkerPool(cfg, logger, daemon) + daemon.jsonRPCHandler = createJSONRPCHandler(cfg, logger, daemon, feewindows) + + daemon.setupHTTPServers(cfg) + daemon.registerMetrics() + + return daemon +} + +func setupLogger(cfg *config.Config, logger *supportlog.Entry) *supportlog.Entry { logger.SetLevel(cfg.LogLevel) if cfg.LogFormat == config.LogFormatJSON { logger.UseJSONFormatter() } - logger.WithFields(supportlog.F{ "version": config.Version, "commit": config.CommitHash, }).Info("starting Soroban RPC") + return logger +} +func mustCreateCaptiveCore(cfg *config.Config, logger *supportlog.Entry) *ledgerbackend.CaptiveStellarCore { core, err := newCaptiveCore(cfg, logger) if err != nil { logger.WithError(err).Fatal("could not create captive core") } + return core +} +func mustCreateHistoryArchive(cfg *config.Config, logger *supportlog.Entry) *historyarchive.ArchiveInterface { if len(cfg.HistoryArchiveURLs) == 0 { logger.Fatal("no history archives URLs were provided") } @@ -183,52 +216,54 @@ func MustNew(cfg *config.Config, logger *supportlog.Entry) *Daemon { if err != nil { logger.WithError(err).Fatal("could not connect to history archive") } + return &historyArchive +} - metricsRegistry := prometheus.NewRegistry() +func mustOpenDatabase(cfg *config.Config, logger *supportlog.Entry, metricsRegistry *prometheus.Registry) *db.DB { dbConn, err := db.OpenSQLiteDBWithPrometheusMetrics(cfg.SQLiteDBPath, prometheusNamespace, "db", metricsRegistry) if err != nil { logger.WithError(err).Fatal("could not open database") } + return dbConn +} - daemon := &Daemon{ - logger: logger, - core: core, - db: dbConn, - done: make(chan struct{}), - metricsRegistry: metricsRegistry, - coreClient: newCoreClientWithMetrics(stellarcore.Client{ - URL: cfg.StellarCoreURL, - HTTP: &http.Client{Timeout: cfg.CoreRequestTimeout}, - }, metricsRegistry), +func createStellarCoreClient(cfg *config.Config) stellarcore.Client { + return stellarcore.Client{ + URL: cfg.StellarCoreURL, + HTTP: &http.Client{Timeout: cfg.CoreRequestTimeout}, } +} - feewindows := daemon.mustInitializeStorage(cfg) - - onIngestionRetry := func(err error, dur time.Duration) { +func createIngestService(cfg *config.Config, logger *supportlog.Entry, daemon *Daemon, + feewindows *feewindow.FeeWindows, historyArchive *historyarchive.ArchiveInterface, +) *ingest.Service { + onIngestionRetry := func(err error, _ time.Duration) { logger.WithError(err).Error("could not run ingestion. Retrying") } - ingestService := ingest.NewService(ingest.Config{ + return ingest.NewService(ingest.Config{ Logger: logger, DB: db.NewReadWriter( logger, - dbConn, + daemon.db, daemon, maxLedgerEntryWriteBatchSize, cfg.HistoryRetentionWindow, cfg.NetworkPassphrase, ), NetworkPassPhrase: cfg.NetworkPassphrase, - Archive: historyArchive, - LedgerBackend: core, + Archive: *historyArchive, + LedgerBackend: daemon.core, Timeout: cfg.IngestionTimeout, OnIngestionRetry: onIngestionRetry, Daemon: daemon, FeeWindows: feewindows, }) +} - ledgerEntryReader := db.NewLedgerEntryReader(dbConn) - preflightWorkerPool := preflight.NewPreflightWorkerPool( +func createPreflightWorkerPool(cfg *config.Config, logger *supportlog.Entry, daemon *Daemon) *preflight.WorkerPool { + ledgerEntryReader := db.NewLedgerEntryReader(daemon.db) + return preflight.NewPreflightWorkerPool( preflight.WorkerPoolConfig{ Daemon: daemon, WorkerCount: cfg.PreflightWorkerCount, @@ -239,82 +274,74 @@ func MustNew(cfg *config.Config, logger *supportlog.Entry) *Daemon { Logger: logger, }, ) +} - jsonRPCHandler := internal.NewJSONRPCHandler(cfg, internal.HandlerParams{ +func createJSONRPCHandler(cfg *config.Config, logger *supportlog.Entry, daemon *Daemon, + feewindows *feewindow.FeeWindows, +) *internal.Handler { + rpcHandler := internal.NewJSONRPCHandler(cfg, internal.HandlerParams{ Daemon: daemon, FeeStatWindows: feewindows, Logger: logger, - LedgerReader: db.NewLedgerReader(dbConn), - LedgerEntryReader: db.NewLedgerEntryReader(dbConn), - TransactionReader: db.NewTransactionReader(logger, dbConn, cfg.NetworkPassphrase), - EventReader: db.NewEventReader(logger, dbConn, cfg.NetworkPassphrase), - PreflightGetter: preflightWorkerPool, + LedgerReader: db.NewLedgerReader(daemon.db), + LedgerEntryReader: db.NewLedgerEntryReader(daemon.db), + TransactionReader: db.NewTransactionReader(logger, daemon.db, cfg.NetworkPassphrase), + EventReader: db.NewEventReader(logger, daemon.db, cfg.NetworkPassphrase), + PreflightGetter: daemon.preflightWorkerPool, }) + return &rpcHandler +} - httpHandler := supporthttp.NewAPIMux(logger) - httpHandler.Handle("/", jsonRPCHandler) - - daemon.preflightWorkerPool = preflightWorkerPool - daemon.ingestService = ingestService - daemon.jsonRPCHandler = &jsonRPCHandler - - // Use a separate listener in order to obtain the actual TCP port - // when using dynamic ports during testing (e.g. endpoint="localhost:0") - daemon.listener, err = net.Listen("tcp", cfg.Endpoint) +func (d *Daemon) setupHTTPServers(cfg *config.Config) { + var err error + d.listener, err = net.Listen("tcp", cfg.Endpoint) if err != nil { - daemon.logger.WithError(err).WithField("endpoint", cfg.Endpoint).Fatal("cannot listen on endpoint") + d.logger.WithError(err).WithField("endpoint", cfg.Endpoint).Fatal("cannot listen on endpoint") } - daemon.server = &http.Server{ - Handler: httpHandler, + d.server = &http.Server{ + Handler: createHTTPHandler(d.logger, d.jsonRPCHandler), ReadTimeout: defaultReadTimeout, } + if cfg.AdminEndpoint != "" { - adminMux := supporthttp.NewMux(logger) - adminMux.HandleFunc("/debug/pprof/", pprof.Index) - adminMux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) - adminMux.HandleFunc("/debug/pprof/profile", pprof.Profile) - adminMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) - adminMux.HandleFunc("/debug/pprof/trace", pprof.Trace) - // add the entry points for: - // goroutine, threadcreate, heap, allocs, block, mutex - for _, profile := range runtimePprof.Profiles() { - adminMux.Handle("/debug/pprof/"+profile.Name(), pprof.Handler(profile.Name())) - } - adminMux.Handle("/metrics", promhttp.HandlerFor(metricsRegistry, promhttp.HandlerOpts{})) - daemon.adminListener, err = net.Listen("tcp", cfg.AdminEndpoint) - if err != nil { - daemon.logger.WithError(err).WithField("endpoint", cfg.Endpoint).Fatal("cannot listen on admin endpoint") - } - daemon.adminServer = &http.Server{Handler: adminMux} + d.setupAdminServer(cfg) } - daemon.registerMetrics() - return daemon +} + +func createHTTPHandler(logger *supportlog.Entry, jsonRPCHandler *internal.Handler) http.Handler { + httpHandler := supporthttp.NewAPIMux(logger) + httpHandler.Handle("/", jsonRPCHandler) + return httpHandler +} + +func (d *Daemon) setupAdminServer(cfg *config.Config) { + var err error + adminMux := createAdminMux(d.logger, d.metricsRegistry) + d.adminListener, err = net.Listen("tcp", cfg.AdminEndpoint) + if err != nil { + d.logger.WithError(err).WithField("endpoint", cfg.AdminEndpoint).Fatal("cannot listen on admin endpoint") + } + d.adminServer = &http.Server{Handler: adminMux} //nolint:gosec +} + +func createAdminMux(logger *supportlog.Entry, metricsRegistry *prometheus.Registry) *chi.Mux { + adminMux := supporthttp.NewMux(logger) + adminMux.HandleFunc("/debug/pprof/", pprof.Index) + adminMux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + adminMux.HandleFunc("/debug/pprof/profile", pprof.Profile) + adminMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + adminMux.HandleFunc("/debug/pprof/trace", pprof.Trace) + for _, profile := range runtimePprof.Profiles() { + adminMux.Handle("/debug/pprof/"+profile.Name(), pprof.Handler(profile.Name())) + } + adminMux.Handle("/metrics", promhttp.HandlerFor(metricsRegistry, promhttp.HandlerOpts{})) + return adminMux } // mustInitializeStorage initializes the storage using what was on the DB func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows { - // - // There's some complex "ledger window math" here so we should clarify it - // beforehand. - // - // There are two windows in play here: - // - the ledger retention window, which describes the range of txmeta - // to keep relative to the latest "ledger tip" of the network - // - the fee stats window, which describes a *subset* of the prior - // ledger retention window on which to perform fee analysis - // - // If the fee window *exceeds* the retention window, this doesn't make any - // sense since it implies the user wants to store N amount of actual - // historical data and M > N amount of ledgers just for fee processing, - // which is nonsense from a performance standpoint. We prevent this: - maxFeeRetentionWindow := max( - cfg.ClassicFeeStatsLedgerRetentionWindow, - cfg.SorobanFeeStatsLedgerRetentionWindow) - if maxFeeRetentionWindow > cfg.HistoryRetentionWindow { - d.logger.Fatalf( - "Fee stat analysis window (%d) cannot exceed history retention window (%d).", - maxFeeRetentionWindow, cfg.HistoryRetentionWindow) - } + readTxMetaCtx, cancelReadTxMeta := context.WithTimeout(context.Background(), cfg.IngestionTimeout) + defer cancelReadTxMeta() feeWindows := feewindow.NewFeeWindows( cfg.ClassicFeeStatsLedgerRetentionWindow, @@ -323,39 +350,19 @@ func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows d.db, ) - readTxMetaCtx, cancelReadTxMeta := context.WithTimeout(context.Background(), cfg.IngestionTimeout) - defer cancelReadTxMeta() - - // To combine these windows, we launch as follows: - // // 1. First, identify the ledger range for database migrations based on the // ledger retention window. Since we don't do "partial" migrations (all or // nothing), this represents the entire range of ledger metas we store. - // retentionRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, cfg.HistoryRetentionWindow) if err != nil { d.logger.WithError(err).Fatal("could not get ledger range for migration") } - dataMigrations, err := db.BuildMigrations( - readTxMetaCtx, d.logger, d.db, cfg.NetworkPassphrase, retentionRange) - if err != nil { - d.logger.WithError(err).Fatal("could not build migrations") - } - - // 2. Then, incorporate the fee analysis window. If there are migrations to - // do, this has no effect, since migration windows are larger than the fee - // window. In the absence of migrations, though, this means the ingestion + // 2. Then, we build migrations for transactions and events, also incorporating the fee windows. + // If there are migrations to do, this has no effect, since migration windows are larger than + // the fee window. In the absence of migrations, though, this means the ingestion // range is just the fee stat range. - // - feeStatsRange, err := db.GetMigrationLedgerRange(readTxMetaCtx, d.db, maxFeeRetentionWindow) - if err != nil { - d.logger.WithError(err).Fatal("could not get ledger range for fee stats") - } - - // Additionally, by treating the fee window *as if* it's a migration, we can - // make the interface here really clean. - dataMigrations.Append(feeWindows.AsMigration(feeStatsRange)) + dataMigrations := d.buildMigrations(readTxMetaCtx, cfg, retentionRange, feeWindows) ledgerSeqRange := dataMigrations.ApplicableRange() // @@ -405,6 +412,44 @@ func (d *Daemon) mustInitializeStorage(cfg *config.Config) *feewindow.FeeWindows return feeWindows } +func (d *Daemon) buildMigrations(ctx context.Context, cfg *config.Config, retentionRange db.LedgerSeqRange, + feeWindows *feewindow.FeeWindows, +) db.MultiMigration { + // There are two windows in play here: + // - the ledger retention window, which describes the range of txmeta + // to keep relative to the latest "ledger tip" of the network + // - the fee stats window, which describes a *subset* of the prior + // ledger retention window on which to perform fee analysis + // + // If the fee window *exceeds* the retention window, this doesn't make any + // sense since it implies the user wants to store N amount of actual + // historical data and M > N amount of ledgers just for fee processing, + // which is nonsense from a performance standpoint. We prevent this: + maxFeeRetentionWindow := max( + cfg.ClassicFeeStatsLedgerRetentionWindow, + cfg.SorobanFeeStatsLedgerRetentionWindow) + if maxFeeRetentionWindow > cfg.HistoryRetentionWindow { + d.logger.Fatalf( + "Fee stat analysis window (%d) cannot exceed history retention window (%d).", + maxFeeRetentionWindow, cfg.HistoryRetentionWindow) + } + + dataMigrations, err := db.BuildMigrations( + ctx, d.logger, d.db, cfg.NetworkPassphrase, retentionRange) + if err != nil { + d.logger.WithError(err).Fatal("could not build migrations") + } + + feeStatsRange, err := db.GetMigrationLedgerRange(ctx, d.db, maxFeeRetentionWindow) + if err != nil { + d.logger.WithError(err).Fatal("could not get ledger range for fee stats") + } + + // By treating the fee window *as if* it's a migration, we can make the interface here clean. + dataMigrations.Append(feeWindows.AsMigration(feeStatsRange)) + return dataMigrations +} + func (d *Daemon) Run() { d.logger.WithField("addr", d.listener.Addr().String()).Info("starting HTTP server") diff --git a/cmd/soroban-rpc/internal/daemon/interfaces/noOpDaemon.go b/cmd/soroban-rpc/internal/daemon/interfaces/noOpDaemon.go index a5ba0db3..255cc4b2 100644 --- a/cmd/soroban-rpc/internal/daemon/interfaces/noOpDaemon.go +++ b/cmd/soroban-rpc/internal/daemon/interfaces/noOpDaemon.go @@ -9,7 +9,7 @@ import ( proto "github.com/stellar/go/protocols/stellarcore" ) -// The noOpDeamon is a dummy daemon implementation, supporting the Daemon interface. +// NoOpDaemon The noOpDeamon is a dummy daemon implementation, supporting the Daemon interface. // Used only in testing. type NoOpDaemon struct { metricsRegistry *prometheus.Registry diff --git a/cmd/soroban-rpc/internal/daemon/metrics.go b/cmd/soroban-rpc/internal/daemon/metrics.go index f283a3b7..795ad12b 100644 --- a/cmd/soroban-rpc/internal/daemon/metrics.go +++ b/cmd/soroban-rpc/internal/daemon/metrics.go @@ -62,12 +62,12 @@ func newCoreClientWithMetrics(client stellarcore.Client, registry *prometheus.Re submitMetric := prometheus.NewSummaryVec(prometheus.SummaryOpts{ Namespace: prometheusNamespace, Subsystem: "txsub", Name: "submission_duration_seconds", Help: "submission durations to Stellar-Core, sliding window = 10m", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }, []string{"status"}) opCountMetric := prometheus.NewSummaryVec(prometheus.SummaryOpts{ Namespace: prometheusNamespace, Subsystem: "txsub", Name: "operation_count", Help: "number of operations included in a transaction, sliding window = 10m", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }, []string{"status"}) registry.MustRegister(submitMetric, opCountMetric) @@ -78,7 +78,9 @@ func newCoreClientWithMetrics(client stellarcore.Client, registry *prometheus.Re } } -func (c *CoreClientWithMetrics) SubmitTransaction(ctx context.Context, envelopeBase64 string) (*proto.TXResponse, error) { +func (c *CoreClientWithMetrics) SubmitTransaction(ctx context.Context, + envelopeBase64 string, +) (*proto.TXResponse, error) { var envelope xdr.TransactionEnvelope err := xdr.SafeUnmarshalBase64(envelopeBase64, &envelope) if err != nil { @@ -89,15 +91,17 @@ func (c *CoreClientWithMetrics) SubmitTransaction(ctx context.Context, envelopeB response, err := c.Client.SubmitTransaction(ctx, envelopeBase64) duration := time.Since(startTime).Seconds() - var label prometheus.Labels - if err != nil { - label = prometheus.Labels{"status": "request_error"} - } else if response.IsException() { - label = prometheus.Labels{"status": "exception"} - } else { - label = prometheus.Labels{"status": response.Status} + var status string + switch { + case err != nil: + status = "request_error" + case response.IsException(): + status = "exception" + default: + status = response.Status } + label := prometheus.Labels{"status": status} c.submitMetric.With(label).Observe(duration) c.opCountMetric.With(label).Observe(float64(len(envelope.Operations()))) return response, err diff --git a/cmd/soroban-rpc/internal/db/cursor.go b/cmd/soroban-rpc/internal/db/cursor.go index 7d009df6..8393f104 100644 --- a/cmd/soroban-rpc/internal/db/cursor.go +++ b/cmd/soroban-rpc/internal/db/cursor.go @@ -10,6 +10,10 @@ import ( "github.com/stellar/go/toid" ) +const ( + numCursorParts = 2 +) + // Cursor represents the position of a Soroban event. // Soroban events are sorted in ascending order by // ledger sequence, transaction index, operation index, @@ -65,8 +69,8 @@ func (c *Cursor) UnmarshalJSON(b []byte) error { // ParseCursor parses the given string and returns the corresponding cursor func ParseCursor(input string) (Cursor, error) { - parts := strings.SplitN(input, "-", 2) - if len(parts) != 2 { + parts := strings.SplitN(input, "-", numCursorParts) + if len(parts) != numCursorParts { return Cursor{}, fmt.Errorf("invalid event id %s", input) } diff --git a/cmd/soroban-rpc/internal/db/cursor_test.go b/cmd/soroban-rpc/internal/db/cursor_test.go index b081a98b..ab4c788d 100644 --- a/cmd/soroban-rpc/internal/db/cursor_test.go +++ b/cmd/soroban-rpc/internal/db/cursor_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParseCursor(t *testing.T) { @@ -30,7 +31,7 @@ func TestParseCursor(t *testing.T) { }, } { parsed, err := ParseCursor(cursor.String()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, cursor, parsed) } } @@ -51,9 +52,9 @@ func TestCursorJSON(t *testing.T) { }, 100}, } { result, err := json.Marshal(testCase) - assert.NoError(t, err) + require.NoError(t, err) var parsed options - assert.NoError(t, json.Unmarshal(result, &parsed)) + require.NoError(t, json.Unmarshal(result, &parsed)) assert.Equal(t, testCase, parsed) } } diff --git a/cmd/soroban-rpc/internal/db/db.go b/cmd/soroban-rpc/internal/db/db.go index 4f9c2560..81a297fe 100644 --- a/cmd/soroban-rpc/internal/db/db.go +++ b/cmd/soroban-rpc/internal/db/db.go @@ -1,3 +1,4 @@ +//nolint:revive package db import ( @@ -62,7 +63,8 @@ func openSQLiteDB(dbFilePath string) (*db.Session, error) { // 2. Disable WAL auto-checkpointing (we will do the checkpointing ourselves with wal_checkpoint pragmas // after every write transaction). // 3. Use synchronous=NORMAL, which is faster and still safe in WAL mode. - session, err := db.Open("sqlite3", fmt.Sprintf("file:%s?_journal_mode=WAL&_wal_autocheckpoint=0&_synchronous=NORMAL", dbFilePath)) + session, err := db.Open("sqlite3", + fmt.Sprintf("file:%s?_journal_mode=WAL&_wal_autocheckpoint=0&_synchronous=NORMAL", dbFilePath)) if err != nil { return nil, fmt.Errorf("open failed: %w", err) } @@ -74,7 +76,9 @@ func openSQLiteDB(dbFilePath string) (*db.Session, error) { return session, nil } -func OpenSQLiteDBWithPrometheusMetrics(dbFilePath string, namespace string, sub db.Subservice, registry *prometheus.Registry) (*DB, error) { +func OpenSQLiteDBWithPrometheusMetrics(dbFilePath string, namespace string, sub db.Subservice, + registry *prometheus.Registry, +) (*DB, error) { session, err := openSQLiteDB(dbFilePath) if err != nil { return nil, err @@ -129,7 +133,8 @@ func getMetaValue(ctx context.Context, q db.SessionInterface, key string) (strin case 1: // expected length on an initialized DB default: - return "", fmt.Errorf("multiple entries (%d) for key %q in table %q", len(results), key, metaTableName) + return "", fmt.Errorf("multiple entries (%d) for key %q in table %q", + len(results), key, metaTableName) } return results[0], nil } @@ -193,7 +198,7 @@ func NewReadWriter( Namespace: daemon.MetricsNamespace(), Subsystem: "transactions", Name: "operation_duration_seconds", Help: "transaction store operation durations, sliding window = 10m", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }, []string{"operation"}, ) @@ -201,7 +206,7 @@ func NewReadWriter( Namespace: daemon.MetricsNamespace(), Subsystem: "transactions", Name: "count", Help: "count of transactions ingested, sliding window = 10m", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }) daemon.MetricsRegistry().MustRegister(txDurationMetric, txCountMetric) @@ -341,11 +346,11 @@ func (w writeTx) Rollback() error { // errors.New("not in transaction") is returned when rolling back a transaction which has // already been committed or rolled back. We can ignore those errors // because we allow rolling back after commits in defer statements. - if err := w.tx.Rollback(); err == nil || err.Error() == "not in transaction" { + var err error + if err = w.tx.Rollback(); err == nil || err.Error() == "not in transaction" { return nil - } else { - return err } + return err } func runSQLMigrations(db *sql.DB, dialect string) error { diff --git a/cmd/soroban-rpc/internal/db/ledgerentry.go b/cmd/soroban-rpc/internal/db/ledgerentry.go index ef704c0d..6230bdee 100644 --- a/cmd/soroban-rpc/internal/db/ledgerentry.go +++ b/cmd/soroban-rpc/internal/db/ledgerentry.go @@ -8,12 +8,14 @@ import ( "fmt" sq "github.com/Masterminds/squirrel" + "github.com/stellar/go/support/db" "github.com/stellar/go/xdr" ) const ( - ledgerEntriesTableName = "ledger_entries" + ledgerEntriesTableName = "ledger_entries" + numEncodedLedgerEntryKeys = 2 ) type LedgerEntryReader interface { @@ -95,7 +97,7 @@ func (l ledgerEntryWriter) flush() error { } encodedEntryStr := string(encodedEntry) upsertSQL = upsertSQL.Values(key, encodedEntryStr) - upsertCount += 1 + upsertCount++ // Only cache Config entries for now if entry.Data.Type == xdr.LedgerEntryTypeConfigSetting { upsertCacheUpdates[key] = &encodedEntryStr @@ -240,9 +242,25 @@ func hasTTLKey(key xdr.LedgerKey) bool { return true case xdr.LedgerEntryTypeContractCode: return true - default: + case xdr.LedgerEntryTypeAccount: + return false + case xdr.LedgerEntryTypeTrustline: + return false + case xdr.LedgerEntryTypeOffer: + return false + case xdr.LedgerEntryTypeData: + return false + case xdr.LedgerEntryTypeClaimableBalance: + return false + case xdr.LedgerEntryTypeLiquidityPool: + return false + case xdr.LedgerEntryTypeConfigSetting: + return false + case xdr.LedgerEntryTypeTtl: + return false } - return false + // This line should never be reached if all enum values are handled + panic(fmt.Sprintf("unknown LedgerEntryType: %v", key.Type)) } func entryKeyToTTLEntryKey(key xdr.LedgerKey) (xdr.LedgerKey, error) { @@ -259,7 +277,7 @@ func entryKeyToTTLEntryKey(key xdr.LedgerKey) (xdr.LedgerKey, error) { } func (l *ledgerEntryReadTx) GetLedgerEntries(keys ...xdr.LedgerKey) ([]LedgerKeyAndEntry, error) { - encodedKeys := make([]string, 0, 2*len(keys)) + encodedKeys := make([]string, 0, numEncodedLedgerEntryKeys*len(keys)) type keyToEncoded struct { key xdr.LedgerKey encodedKey string diff --git a/cmd/soroban-rpc/internal/db/ledgerentry_test.go b/cmd/soroban-rpc/internal/db/ledgerentry_test.go index d17c560f..0bd97cbc 100644 --- a/cmd/soroban-rpc/internal/db/ledgerentry_test.go +++ b/cmd/soroban-rpc/internal/db/ledgerentry_test.go @@ -2,6 +2,7 @@ package db import ( "context" + "errors" "fmt" "math/rand" "sync" @@ -17,7 +18,9 @@ import ( "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/daemon/interfaces" ) -func getLedgerEntryAndLatestLedgerSequenceWithErr(db *DB, key xdr.LedgerKey) (bool, xdr.LedgerEntry, uint32, *uint32, error) { +func getLedgerEntryAndLatestLedgerSequenceWithErr(db *DB, key xdr.LedgerKey) (bool, xdr.LedgerEntry, + uint32, *uint32, error, +) { tx, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) if err != nil { return false, xdr.LedgerEntry{}, 0, nil, err @@ -40,12 +43,15 @@ func getLedgerEntryAndLatestLedgerSequenceWithErr(db *DB, key xdr.LedgerKey) (bo return present, entry, latestSeq, expSeq, doneErr } -func getLedgerEntryAndLatestLedgerSequence(t require.TestingT, db *DB, key xdr.LedgerKey) (bool, xdr.LedgerEntry, uint32, *uint32) { +func getLedgerEntryAndLatestLedgerSequence(t require.TestingT, db *DB, key xdr.LedgerKey) (bool, xdr.LedgerEntry, + uint32, *uint32, +) { present, entry, latestSeq, expSeq, err := getLedgerEntryAndLatestLedgerSequenceWithErr(db, key) require.NoError(t, err) return present, entry, latestSeq, expSeq } +//nolint:unparam func makeReadWriter(db *DB, batchSize, retentionWindow int) ReadWriter { return NewReadWriter(log.DefaultLogger, db, interfaces.MakeNoOpDeamon(), batchSize, uint32(retentionWindow), passphrase) @@ -53,18 +59,92 @@ func makeReadWriter(db *DB, batchSize, retentionWindow int) ReadWriter { func TestGoldenPath(t *testing.T) { db := NewTestDB(t) - // Check that we get an empty DB error + + t.Run("EmptyDB", func(t *testing.T) { + testEmptyDB(t, db) + }) + + t.Run("InsertEntry", func(t *testing.T) { + testInsertEntry(t, db) + }) + + t.Run("UpdateEntry", func(t *testing.T) { + testUpdateEntry(t, db) + }) + + t.Run("DeleteEntry", func(t *testing.T) { + testDeleteEntry(t, db) + }) +} + +func testEmptyDB(t *testing.T, db *DB) { _, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) assert.Equal(t, ErrEmptyDB, err) +} + +func testInsertEntry(t *testing.T, db *DB) { + tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) + require.NoError(t, err) + writer := tx.LedgerEntryWriter() + + data := createTestContractDataEntry() + key, entry := getContractDataLedgerEntry(t, data) + require.NoError(t, writer.UpsertLedgerEntry(entry)) + + expLedgerKey, err := entryKeyToTTLEntryKey(key) + require.NoError(t, err) + expLegerEntry := getTTLLedgerEntry(expLedgerKey) + require.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) + + ledgerSequence := uint32(23) + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) + verifyInsertedEntry(t, db, key, ledgerSequence, expLegerEntry) +} + +func testUpdateEntry(t *testing.T, db *DB) { tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) writer := tx.LedgerEntryWriter() - // Fill the DB with a single entry and fetch it + data := createTestContractDataEntry() + key, entry := getContractDataLedgerEntry(t, data) + eight := xdr.Uint32(8) + entry.Data.ContractData.Val.U32 = &eight + + require.NoError(t, writer.UpsertLedgerEntry(entry)) + + ledgerSequence := uint32(24) + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) + + verifyUpdatedEntry(t, db, key, ledgerSequence, eight) +} + +func testDeleteEntry(t *testing.T, db *DB) { + tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) + require.NoError(t, err) + writer := tx.LedgerEntryWriter() + + data := createTestContractDataEntry() + key, _ := getContractDataLedgerEntry(t, data) + require.NoError(t, writer.DeleteLedgerEntry(key)) + + ledgerSequence := uint32(25) + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) + + verifyDeletedEntry(t, db, key, ledgerSequence) +} + +func createTestContractDataEntry() xdr.ContractDataEntry { four := xdr.Uint32(4) six := xdr.Uint32(6) - data := xdr.ContractDataEntry{ + return xdr.ContractDataEntry{ Contract: xdr.ScAddress{ Type: xdr.ScAddressTypeScAddressTypeContract, ContractId: &xdr.Hash{0xca, 0xfe}, @@ -79,71 +159,41 @@ func TestGoldenPath(t *testing.T) { U32: &six, }, } - key, entry := getContractDataLedgerEntry(t, data) - assert.NoError(t, writer.UpsertLedgerEntry(entry)) - - expLedgerKey, err := entryKeyToTTLEntryKey(key) - assert.NoError(t, err) - expLegerEntry := getTTLLedgerEntry(expLedgerKey) - assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) - - ledgerSequence := uint32(23) - ledgerCloseMeta := createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) +} +func verifyInsertedEntry(t *testing.T, db *DB, key xdr.LedgerKey, ledgerSequence uint32, + expLegerEntry xdr.LedgerEntry, +) { present, obtainedEntry, obtainedLedgerSequence, liveUntilSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.True(t, present) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) require.NotNil(t, liveUntilSeq) assert.Equal(t, uint32(expLegerEntry.Data.Ttl.LiveUntilLedgerSeq), *liveUntilSeq) - assert.Equal(t, obtainedEntry.Data.Type, xdr.LedgerEntryTypeContractData) + assert.Equal(t, xdr.LedgerEntryTypeContractData, obtainedEntry.Data.Type) assert.Equal(t, xdr.Hash{0xca, 0xfe}, *obtainedEntry.Data.ContractData.Contract.ContractId) - assert.Equal(t, six, *obtainedEntry.Data.ContractData.Val.U32) + assert.Equal(t, xdr.Uint32(6), *obtainedEntry.Data.ContractData.Val.U32) - obtainedLedgerSequence, err = NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) - assert.NoError(t, err) + obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) + require.NoError(t, err) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) +} - // Do another round, overwriting the ledger entry - tx, err = makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(t, err) - writer = tx.LedgerEntryWriter() - eight := xdr.Uint32(8) - entry.Data.ContractData.Val.U32 = &eight - - assert.NoError(t, writer.UpsertLedgerEntry(entry)) - - ledgerSequence = uint32(24) - ledgerCloseMeta = createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) - - present, obtainedEntry, obtainedLedgerSequence, liveUntilSeq = getLedgerEntryAndLatestLedgerSequence(t, db, key) +func verifyUpdatedEntry(t *testing.T, db *DB, key xdr.LedgerKey, ledgerSequence uint32, expectedValue xdr.Uint32) { + present, obtainedEntry, obtainedLedgerSequence, liveUntilSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.True(t, present) require.NotNil(t, liveUntilSeq) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) - assert.Equal(t, eight, *obtainedEntry.Data.ContractData.Val.U32) - - // Do another round, deleting the ledger entry - tx, err = makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(t, err) - writer = tx.LedgerEntryWriter() - assert.NoError(t, err) - - assert.NoError(t, writer.DeleteLedgerEntry(key)) - ledgerSequence = uint32(25) - ledgerCloseMeta = createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) + assert.Equal(t, expectedValue, *obtainedEntry.Data.ContractData.Val.U32) +} - present, _, obtainedLedgerSequence, liveUntilSeq = getLedgerEntryAndLatestLedgerSequence(t, db, key) +func verifyDeletedEntry(t *testing.T, db *DB, key xdr.LedgerKey, ledgerSequence uint32) { + present, _, obtainedLedgerSequence, liveUntilSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) assert.False(t, present) assert.Nil(t, liveUntilSeq) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) - obtainedLedgerSequence, err = NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) - assert.NoError(t, err) + obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) + require.NoError(t, err) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) } @@ -153,7 +203,7 @@ func TestDeleteNonExistentLedgerEmpty(t *testing.T) { // Simulate a ledger which creates and deletes a ledger entry // which would result in trying to delete a ledger entry which isn't there tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) writer := tx.LedgerEntryWriter() four := xdr.Uint32(4) @@ -174,7 +224,7 @@ func TestDeleteNonExistentLedgerEmpty(t *testing.T) { }, } key, _ := getContractDataLedgerEntry(t, data) - assert.NoError(t, writer.DeleteLedgerEntry(key)) + require.NoError(t, writer.DeleteLedgerEntry(key)) ledgerSequence := uint32(23) ledgerCloseMeta := createLedger(ledgerSequence) assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) @@ -182,7 +232,7 @@ func TestDeleteNonExistentLedgerEmpty(t *testing.T) { // Make sure that the ledger number was submitted obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) // And that the entry doesn't exist @@ -228,7 +278,7 @@ func TestReadTxsDuringWriteTx(t *testing.T) { // Start filling the DB with a single entry (enforce flushing right away) tx, err := makeReadWriter(db, 0, 15).NewTx(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) writer := tx.LedgerEntryWriter() four := xdr.Uint32(4) @@ -248,43 +298,42 @@ func TestReadTxsDuringWriteTx(t *testing.T) { }, } key, entry := getContractDataLedgerEntry(t, data) - assert.NoError(t, writer.UpsertLedgerEntry(entry)) + require.NoError(t, writer.UpsertLedgerEntry(entry)) expLedgerKey, err := entryKeyToTTLEntryKey(key) - assert.NoError(t, err) + require.NoError(t, err) expLegerEntry := getTTLLedgerEntry(expLedgerKey) - assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) + require.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) // Before committing the changes, make sure multiple concurrent transactions can query the DB readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) _, err = readTx1.GetLatestLedgerSequence() assert.Equal(t, ErrEmptyDB, err) present, _, expSeq, err := GetLedgerEntry(readTx1, key) require.Nil(t, expSeq) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, present) - assert.NoError(t, readTx1.Done()) + require.NoError(t, readTx1.Done()) _, err = readTx2.GetLatestLedgerSequence() assert.Equal(t, ErrEmptyDB, err) present, _, expSeq, err = GetLedgerEntry(readTx2, key) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, present) assert.Nil(t, expSeq) - assert.NoError(t, readTx2.Done()) - + require.NoError(t, readTx2.Done()) // Finish the write transaction and check that the results are present ledgerSequence := uint32(23) ledgerCloseMeta := createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) present, obtainedEntry, obtainedLedgerSequence, expSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) @@ -307,16 +356,16 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { // First read transaction, before the write transaction is created readTx1, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) // Start filling the DB with a single entry (enforce flushing right away) tx, err := makeReadWriter(db, 0, 15).NewTx(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) writer := tx.LedgerEntryWriter() // Second read transaction, after the write transaction is created readTx2, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) four := xdr.Uint32(4) six := xdr.Uint32(6) @@ -336,42 +385,42 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { }, } key, entry := getContractDataLedgerEntry(t, data) - assert.NoError(t, writer.UpsertLedgerEntry(entry)) + require.NoError(t, writer.UpsertLedgerEntry(entry)) expLedgerKey, err := entryKeyToTTLEntryKey(key) - assert.NoError(t, err) + require.NoError(t, err) expLegerEntry := getTTLLedgerEntry(expLedgerKey) - assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) + require.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) // Third read transaction, after the first insert has happened in the write transaction readTx3, err := NewLedgerEntryReader(db).NewTx(context.Background(), false) - assert.NoError(t, err) + require.NoError(t, err) // Make sure that all the read transactions get an emptyDB error before and after the write transaction is committed for _, readTx := range []LedgerEntryReadTx{readTx1, readTx2, readTx3} { _, err = readTx.GetLatestLedgerSequence() assert.Equal(t, ErrEmptyDB, err) present, _, _, err := GetLedgerEntry(readTx, key) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, present) } // commit the write transaction ledgerSequence := uint32(23) ledgerCloseMeta := createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) for _, readTx := range []LedgerEntryReadTx{readTx1, readTx2, readTx3} { present, _, _, err := GetLedgerEntry(readTx, key) - assert.NoError(t, err) + require.NoError(t, err) assert.False(t, present) } // Check that the results are present in the transactions happening after the commit obtainedLedgerSequence, err := NewLedgerEntryReader(db).GetLatestLedgerSequence(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, ledgerSequence, obtainedLedgerSequence) present, obtainedEntry, obtainedLedgerSequence, expSeq := getLedgerEntryAndLatestLedgerSequence(t, db, key) @@ -381,117 +430,145 @@ func TestWriteTxsDuringReadTxs(t *testing.T) { assert.Equal(t, six, *obtainedEntry.Data.ContractData.Val.U32) for _, readTx := range []LedgerEntryReadTx{readTx1, readTx2, readTx3} { - assert.NoError(t, readTx.Done()) + require.NoError(t, readTx.Done()) } } // Check that we can have coexisting reader and writer goroutines without deadlocks or errors func TestConcurrentReadersAndWriter(t *testing.T) { db := NewTestDB(t) - contractID := xdr.Hash{0xca, 0xfe} done := make(chan struct{}) var wg sync.WaitGroup logMessageCh := make(chan string, 1) - writer := func() { - defer wg.Done() - data := func(i int) xdr.ContractDataEntry { - val := xdr.Uint32(i) - return xdr.ContractDataEntry{ - Contract: xdr.ScAddress{ - Type: xdr.ScAddressTypeScAddressTypeContract, - ContractId: &contractID, - }, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvU32, - U32: &val, - }, - Durability: xdr.ContractDataDurabilityPersistent, - Val: xdr.ScVal{ - Type: xdr.ScValTypeScvU32, - U32: &val, - }, - } - } - rw := makeReadWriter(db, 10, 15) - for ledgerSequence := uint32(0); ledgerSequence < 1000; ledgerSequence++ { - tx, err := rw.NewTx(context.Background()) - assert.NoError(t, err) - writer := tx.LedgerEntryWriter() - for i := 0; i < 200; i++ { - key, entry := getContractDataLedgerEntry(t, data(i)) - assert.NoError(t, writer.UpsertLedgerEntry(entry)) - expLedgerKey, err := entryKeyToTTLEntryKey(key) - assert.NoError(t, err) - expLegerEntry := getTTLLedgerEntry(expLedgerKey) - assert.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) - } - ledgerCloseMeta := createLedger(ledgerSequence) - assert.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) - assert.NoError(t, tx.Commit(ledgerCloseMeta)) - logMessageCh <- fmt.Sprintf("Wrote ledger %d", ledgerSequence) - time.Sleep(time.Duration(rand.Int31n(30)) * time.Millisecond) - } - close(done) + + wg.Add(1) + go writer(t, db, contractID, done, &wg, logMessageCh) + + for i := 1; i <= 32; i++ { + wg.Add(1) + go reader(t, db, contractID, i, done, &wg, logMessageCh) } - reader := func(keyVal int) { - defer wg.Done() - val := xdr.Uint32(keyVal) - key := xdr.LedgerKey{ - Type: xdr.LedgerEntryTypeContractData, - ContractData: &xdr.LedgerKeyContractData{ - Contract: xdr.ScAddress{ - Type: xdr.ScAddressTypeScAddressTypeContract, - ContractId: &contractID, - }, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvU32, - U32: &val, - }, - Durability: xdr.ContractDataDurabilityPersistent, - }, - } - for { - select { - case <-done: - return - default: - } - found, ledgerEntry, ledger, _, err := getLedgerEntryAndLatestLedgerSequenceWithErr(db, key) - if err != nil { - if err != ErrEmptyDB { - t.Fatalf("reader %d failed with error %v\n", keyVal, err) - } - } else { - // All entries should be found once the first write commit is done - assert.True(t, found) - logMessageCh <- fmt.Sprintf("reader %d: for ledger %d", keyVal, ledger) - assert.Equal(t, xdr.Uint32(keyVal), *ledgerEntry.Data.ContractData.Val.U32) - } + + monitorWorkers(t, &wg, logMessageCh) +} + +func writer(t *testing.T, db *DB, contractID xdr.Hash, done chan struct{}, + wg *sync.WaitGroup, logMessageCh chan<- string, +) { + defer wg.Done() + defer close(done) + + rw := makeReadWriter(db, 10, 15) + for ledgerSequence := range 1000 { + writeLedger(t, rw, contractID, uint32(ledgerSequence)) + logMessageCh <- fmt.Sprintf("Wrote ledger %d", ledgerSequence) + time.Sleep(time.Duration(rand.Int31n(30)) * time.Millisecond) + } +} + +func writeLedger(t *testing.T, rw ReadWriter, contractID xdr.Hash, ledgerSequence uint32) { + tx, err := rw.NewTx(context.Background()) + require.NoError(t, err) + writer := tx.LedgerEntryWriter() + + for i := range 200 { + writeEntry(t, writer, contractID, i) + } + + ledgerCloseMeta := createLedger(ledgerSequence) + require.NoError(t, tx.LedgerWriter().InsertLedger(ledgerCloseMeta)) + require.NoError(t, tx.Commit(ledgerCloseMeta)) +} + +func writeEntry(t *testing.T, writer LedgerEntryWriter, contractID xdr.Hash, i int) { + key, entry := getContractDataLedgerEntry(t, createContractDataEntry(contractID, i)) + require.NoError(t, writer.UpsertLedgerEntry(entry)) + + expLedgerKey, err := entryKeyToTTLEntryKey(key) + require.NoError(t, err) + expLegerEntry := getTTLLedgerEntry(expLedgerKey) + require.NoError(t, writer.UpsertLedgerEntry(expLegerEntry)) +} + +func createContractDataEntry(contractID xdr.Hash, i int) xdr.ContractDataEntry { + val := xdr.Uint32(i) + return xdr.ContractDataEntry{ + Contract: xdr.ScAddress{ + Type: xdr.ScAddressTypeScAddressTypeContract, + ContractId: &contractID, + }, + Key: xdr.ScVal{ + Type: xdr.ScValTypeScvU32, + U32: &val, + }, + Durability: xdr.ContractDataDurabilityPersistent, + Val: xdr.ScVal{ + Type: xdr.ScValTypeScvU32, + U32: &val, + }, + } +} + +func reader(t *testing.T, db *DB, contractID xdr.Hash, keyVal int, done <-chan struct{}, + wg *sync.WaitGroup, logMessageCh chan<- string, +) { + defer wg.Done() + key := createLedgerKey(contractID, keyVal) + + for { + select { + case <-done: + return + default: + readAndVerifyEntry(t, db, key, keyVal, logMessageCh) time.Sleep(time.Duration(rand.Int31n(30)) * time.Millisecond) } } +} - // one readWriter, 32 readers - wg.Add(1) - go writer() +func createLedgerKey(contractID xdr.Hash, keyVal int) xdr.LedgerKey { + val := xdr.Uint32(keyVal) + return xdr.LedgerKey{ + Type: xdr.LedgerEntryTypeContractData, + ContractData: &xdr.LedgerKeyContractData{ + Contract: xdr.ScAddress{ + Type: xdr.ScAddressTypeScAddressTypeContract, + ContractId: &contractID, + }, + Key: xdr.ScVal{ + Type: xdr.ScValTypeScvU32, + U32: &val, + }, + Durability: xdr.ContractDataDurabilityPersistent, + }, + } +} - for i := 1; i <= 32; i++ { - wg.Add(1) - go reader(i) +func readAndVerifyEntry(t *testing.T, db *DB, key xdr.LedgerKey, keyVal int, logMessageCh chan<- string) { + found, ledgerEntry, ledger, _, err := getLedgerEntryAndLatestLedgerSequenceWithErr(db, key) + if err != nil { + if !errors.Is(err, ErrEmptyDB) { + t.Fatalf("reader %d failed with error %v\n", keyVal, err) + } + } else { + assert.True(t, found) + logMessageCh <- fmt.Sprintf("reader %d: for ledger %d", keyVal, ledger) + assert.Equal(t, xdr.Uint32(keyVal), *ledgerEntry.Data.ContractData.Val.U32) } +} +func monitorWorkers(t *testing.T, wg *sync.WaitGroup, logMessageCh <-chan string) { workersExitCh := make(chan struct{}) go func() { defer close(workersExitCh) wg.Wait() }() -forloop: for { select { case <-workersExitCh: - break forloop + return case msg := <-logMessageCh: t.Log(msg) } @@ -518,12 +595,12 @@ func benchmarkLedgerEntry(b *testing.B, cached bool) { } key, entry := getContractDataLedgerEntry(b, data) tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(b, err) - assert.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(entry)) + require.NoError(b, err) + require.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(entry)) expLedgerKey, err := entryKeyToTTLEntryKey(key) - assert.NoError(b, err) - assert.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(getTTLLedgerEntry(expLedgerKey))) - assert.NoError(b, tx.Commit(createLedger(2))) + require.NoError(b, err) + require.NoError(b, tx.LedgerEntryWriter().UpsertLedgerEntry(getTTLLedgerEntry(expLedgerKey))) + require.NoError(b, tx.Commit(createLedger(2))) reader := NewLedgerEntryReader(db) const numQueriesPerOp = 15 b.ResetTimer() @@ -536,15 +613,15 @@ func benchmarkLedgerEntry(b *testing.B, cached bool) { } else { readTx, err = reader.NewTx(context.Background(), false) } - assert.NoError(b, err) - for i := 0; i < numQueriesPerOp; i++ { + require.NoError(b, err) + for range numQueriesPerOp { b.StartTimer() found, _, _, err := GetLedgerEntry(readTx, key) b.StopTimer() - assert.NoError(b, err) + require.NoError(b, err) assert.True(b, found) } - assert.NoError(b, readTx.Done()) + require.NoError(b, readTx.Done()) } } @@ -576,12 +653,12 @@ func BenchmarkLedgerUpdate(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { tx, err := makeReadWriter(db, 150, 15).NewTx(context.Background()) - assert.NoError(b, err) + require.NoError(b, err) writer := tx.LedgerEntryWriter() - for j := 0; j < numEntriesPerOp; j++ { + for j := range numEntriesPerOp { keyUint32 = xdr.Uint32(j) - assert.NoError(b, writer.UpsertLedgerEntry(entry)) + require.NoError(b, writer.UpsertLedgerEntry(entry)) } - assert.NoError(b, tx.Commit(createLedger(uint32(i+1)))) + require.NoError(b, tx.Commit(createLedger(uint32(i+1)))) } } diff --git a/cmd/soroban-rpc/internal/feewindow/feewindow.go b/cmd/soroban-rpc/internal/feewindow/feewindow.go index 08a84ab4..24256935 100644 --- a/cmd/soroban-rpc/internal/feewindow/feewindow.go +++ b/cmd/soroban-rpc/internal/feewindow/feewindow.go @@ -152,7 +152,7 @@ func (fw *FeeWindows) IngestFees(meta xdr.LedgerCloseMeta) error { var classicFees []uint64 for { tx, err := reader.Read() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { @@ -165,7 +165,7 @@ func (fw *FeeWindows) IngestFees(meta xdr.LedgerCloseMeta) error { continue } if len(ops) == 1 { - switch ops[0].Body.Type { + switch ops[0].Body.Type { //nolint:exhaustive case xdr.OperationTypeInvokeHostFunction, xdr.OperationTypeExtendFootprintTtl, xdr.OperationTypeRestoreFootprint: if tx.UnsafeMeta.V != 3 || tx.UnsafeMeta.V3.SorobanMeta == nil || tx.UnsafeMeta.V3.SorobanMeta.Ext.V != 1 { continue diff --git a/cmd/soroban-rpc/internal/feewindow/feewindow_test.go b/cmd/soroban-rpc/internal/feewindow/feewindow_test.go index cd28bcad..708c0190 100644 --- a/cmd/soroban-rpc/internal/feewindow/feewindow_test.go +++ b/cmd/soroban-rpc/internal/feewindow/feewindow_test.go @@ -12,7 +12,7 @@ import ( ) func TestBasicComputeFeeDistribution(t *testing.T) { - for _, testCase := range []struct { + testCases := []struct { name string input []uint64 output FeeDistribution @@ -23,20 +23,9 @@ func TestBasicComputeFeeDistribution(t *testing.T) { "one", []uint64{100}, FeeDistribution{ - Max: 100, - Min: 100, - Mode: 100, - P10: 100, - P20: 100, - P30: 100, - P40: 100, - P50: 100, - P60: 100, - P70: 100, - P80: 100, - P90: 100, - P95: 100, - P99: 100, + Max: 100, Min: 100, Mode: 100, + P10: 100, P20: 100, P30: 100, P40: 100, P50: 100, + P60: 100, P70: 100, P80: 100, P90: 100, P95: 100, P99: 100, FeeCount: 1, }, }, @@ -44,20 +33,9 @@ func TestBasicComputeFeeDistribution(t *testing.T) { "even number of elements: four 100s and six 1000s", []uint64{100, 100, 100, 1000, 100, 1000, 1000, 1000, 1000, 1000}, FeeDistribution{ - Max: 1000, - Min: 100, - Mode: 1000, - P10: 100, - P20: 100, - P30: 100, - P40: 100, - P50: 1000, - P60: 1000, - P70: 1000, - P80: 1000, - P90: 1000, - P95: 1000, - P99: 1000, + Max: 1000, Min: 100, Mode: 1000, + P10: 100, P20: 100, P30: 100, P40: 100, P50: 1000, + P60: 1000, P70: 1000, P80: 1000, P90: 1000, P95: 1000, P99: 1000, FeeCount: 10, }, }, @@ -65,41 +43,19 @@ func TestBasicComputeFeeDistribution(t *testing.T) { "odd number of elements: five 100s and six 1000s", []uint64{100, 100, 100, 1000, 100, 1000, 1000, 1000, 1000, 1000, 100}, FeeDistribution{ - Max: 1000, - Min: 100, - Mode: 1000, - P10: 100, - P20: 100, - P30: 100, - P40: 100, - P50: 1000, - P60: 1000, - P70: 1000, - P80: 1000, - P90: 1000, - P95: 1000, - P99: 1000, + Max: 1000, Min: 100, Mode: 1000, + P10: 100, P20: 100, P30: 100, P40: 100, P50: 1000, + P60: 1000, P70: 1000, P80: 1000, P90: 1000, P95: 1000, P99: 1000, FeeCount: 11, }, }, { - "mutiple modes favors the smallest value", + "multiple modes favors the smallest value", []uint64{100, 1000}, FeeDistribution{ - Max: 1000, - Min: 100, - Mode: 100, - P10: 100, - P20: 100, - P30: 100, - P40: 100, - P50: 100, - P60: 1000, - P70: 1000, - P80: 1000, - P90: 1000, - P95: 1000, - P99: 1000, + Max: 1000, Min: 100, Mode: 100, + P10: 100, P20: 100, P30: 100, P40: 100, P50: 100, + P60: 1000, P70: 1000, P80: 1000, P90: 1000, P95: 1000, P99: 1000, FeeCount: 2, }, }, @@ -107,20 +63,9 @@ func TestBasicComputeFeeDistribution(t *testing.T) { "random distribution with a repetition", []uint64{515, 245, 245, 530, 221, 262, 927}, FeeDistribution{ - Max: 927, - Min: 221, - Mode: 245, - P10: 221, - P20: 245, - P30: 245, - P40: 245, - P50: 262, - P60: 515, - P70: 515, - P80: 530, - P90: 927, - P95: 927, - P99: 927, + Max: 927, Min: 221, Mode: 245, + P10: 221, P20: 245, P30: 245, P40: 245, P50: 262, + P60: 515, P70: 515, P80: 530, P90: 927, P95: 927, P99: 927, FeeCount: 7, }, }, @@ -128,34 +73,28 @@ func TestBasicComputeFeeDistribution(t *testing.T) { "random distribution with a repetition of its largest value", []uint64{515, 245, 530, 221, 262, 927, 927}, FeeDistribution{ - Max: 927, - Min: 221, - Mode: 927, - P10: 221, - P20: 245, - P30: 262, - P40: 262, - P50: 515, - P60: 530, - P70: 530, - P80: 927, - P90: 927, - P95: 927, - P99: 927, + Max: 927, Min: 221, Mode: 927, + P10: 221, P20: 245, P30: 262, P40: 262, P50: 515, + P60: 530, P70: 530, P80: 927, P90: 927, P95: 927, P99: 927, FeeCount: 7, }, }, - } { - assert.Equal(t, computeFeeDistribution(testCase.input, 0), testCase.output, testCase.name) + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := computeFeeDistribution(tc.input, 0) + assert.Equal(t, tc.output, result) + }) } } func TestComputeFeeDistributionAgainstAlternative(t *testing.T) { - for i := 0; i < 100_000; i++ { + for range 100_000 { fees := generateFees(nil) feesCopy1 := make([]uint64, len(fees)) feesCopy2 := make([]uint64, len(fees)) - for i := 0; i < len(fees); i++ { + for i := range len(fees) { feesCopy1[i] = fees[i] feesCopy2[i] = fees[i] } @@ -176,7 +115,7 @@ func generateFees(l *int) []uint64 { } result := make([]uint64, length) lastFee := uint64(0) - for i := 0; i < length; i++ { + for i := range length { if lastFee != 0 && rand.Intn(100) <= 25 { // To test the Mode correctly, generate a repetition with a chance of 25% result[i] = lastFee @@ -193,13 +132,14 @@ func BenchmarkComputeFeeDistribution(b *testing.B) { length := 5000 fees := generateFees(&length) b.Run("computeFeeDistribution", func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { computeFeeDistribution(fees, 0) } }) b.Run("alternativeComputeFeeDistribution", func(b *testing.B) { - for i := 0; i < b.N; i++ { - alternativeComputeFeeDistribution(fees, 0) + for range b.N { + _, err := alternativeComputeFeeDistribution(fees, 0) + require.NoError(b, err) } }) } @@ -208,89 +148,77 @@ func alternativeComputeFeeDistribution(fees []uint64, ledgerCount uint32) (FeeDi if len(fees) == 0 { return FeeDistribution{}, nil } + input := stats.LoadRawData(fees) - max, err := input.Max() + + max, min, mode, err := computeBasicStats(input, fees) if err != nil { return FeeDistribution{}, err } - min, err := input.Min() + + percentiles, err := computePercentiles(input) if err != nil { return FeeDistribution{}, err } + + return FeeDistribution{ + Max: uint64(max), + Min: uint64(min), + Mode: mode, + P10: uint64(percentiles[0]), + P20: uint64(percentiles[1]), + P30: uint64(percentiles[2]), + P40: uint64(percentiles[3]), + P50: uint64(percentiles[4]), + P60: uint64(percentiles[5]), + P70: uint64(percentiles[6]), + P80: uint64(percentiles[7]), + P90: uint64(percentiles[8]), + P95: uint64(percentiles[9]), + P99: uint64(percentiles[10]), + FeeCount: uint32(len(fees)), + LedgerCount: ledgerCount, + }, nil +} + +func computeBasicStats(input stats.Float64Data, fees []uint64) (float64, float64, uint64, error) { + max, err := input.Max() + if err != nil { + return 0, 0, 0, err + } + + min, err := input.Min() + if err != nil { + return 0, 0, 0, err + } + modeSeq, err := input.Mode() if err != nil { - return FeeDistribution{}, err + return 0, 0, 0, err } + var mode uint64 if len(modeSeq) == 0 { - // mode can have length 0 if no value is repeated more than the rest slices.Sort(fees) mode = fees[0] } else { mode = uint64(modeSeq[0]) } - p10, err := input.PercentileNearestRank(float64(10)) - if err != nil { - return FeeDistribution{}, err - } - p20, err := input.PercentileNearestRank(float64(20)) - if err != nil { - return FeeDistribution{}, err - } - p30, err := input.PercentileNearestRank(float64(30)) - if err != nil { - return FeeDistribution{}, err - } - p40, err := input.PercentileNearestRank(float64(40)) - if err != nil { - return FeeDistribution{}, err - } - p50, err := input.PercentileNearestRank(float64(50)) - if err != nil { - return FeeDistribution{}, err - } - p60, err := input.PercentileNearestRank(float64(60)) - if err != nil { - return FeeDistribution{}, err - } - p70, err := input.PercentileNearestRank(float64(70)) - if err != nil { - return FeeDistribution{}, err - } - p80, err := input.PercentileNearestRank(float64(80)) - if err != nil { - return FeeDistribution{}, err - } - p90, err := input.PercentileNearestRank(float64(90)) - if err != nil { - return FeeDistribution{}, err - } - p95, err := input.PercentileNearestRank(float64(95)) - if err != nil { - return FeeDistribution{}, err - } - p99, err := input.PercentileNearestRank(float64(99)) - if err != nil { - return FeeDistribution{}, err - } - result := FeeDistribution{ - Max: uint64(max), - Min: uint64(min), - Mode: mode, - P10: uint64(p10), - P20: uint64(p20), - P30: uint64(p30), - P40: uint64(p40), - P50: uint64(p50), - P60: uint64(p60), - P70: uint64(p70), - P80: uint64(p80), - P90: uint64(p90), - P95: uint64(p95), - P99: uint64(p99), - FeeCount: uint32(len(fees)), - LedgerCount: ledgerCount, + return max, min, mode, nil +} + +func computePercentiles(input stats.Float64Data) ([]float64, error) { + percentiles := []float64{10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99} + results := make([]float64, len(percentiles)) + + for i, p := range percentiles { + result, err := input.PercentileNearestRank(p) + if err != nil { + return nil, err + } + results[i] = result } - return result, nil + + return results, nil } diff --git a/cmd/soroban-rpc/internal/ingest/ledgerentry.go b/cmd/soroban-rpc/internal/ingest/ledgerentry.go index d9fdc35c..49b1406d 100644 --- a/cmd/soroban-rpc/internal/ingest/ledgerentry.go +++ b/cmd/soroban-rpc/internal/ingest/ledgerentry.go @@ -2,7 +2,10 @@ package ingest import ( "context" + "errors" + "fmt" "io" + "reflect" "strings" "time" @@ -14,14 +17,16 @@ import ( "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/db" ) -func (s *Service) ingestLedgerEntryChanges(ctx context.Context, reader ingest.ChangeReader, tx db.WriteTx, progressLogPeriod int) error { +func (s *Service) ingestLedgerEntryChanges(ctx context.Context, reader ingest.ChangeReader, + tx db.WriteTx, progressLogPeriod int, +) error { entryCount := 0 startTime := time.Now() writer := tx.LedgerEntryWriter() changeStatsProcessor := ingest.StatsChangeProcessor{} for ctx.Err() == nil { - if change, err := reader.Read(); err == io.EOF { + if change, err := reader.Read(); errors.Is(err, io.EOF) { return nil } else if err != nil { return err @@ -39,8 +44,14 @@ func (s *Service) ingestLedgerEntryChanges(ctx context.Context, reader ingest.Ch results := changeStatsProcessor.GetResults() for stat, value := range results.Map() { stat = strings.Replace(stat, "stats_", "change_", 1) - s.metrics.ledgerStatsMetric. - With(prometheus.Labels{"type": stat}).Add(float64(value.(int64))) + if intValue, ok := value.(int64); ok { + s.metrics.ledgerStatsMetric. + With(prometheus.Labels{"type": stat}).Add(float64(intValue)) + } else { + // Handle the case where the type assertion failed + return fmt.Errorf("unexpected type for ledger stats metric. Expected int64, "+ + "got %s", reflect.TypeOf(value)) + } } s.metrics.ingestionDurationMetric. With(prometheus.Labels{"type": "ledger_entries"}).Observe(time.Since(startTime).Seconds()) @@ -82,7 +93,6 @@ func ingestLedgerEntryChange(writer db.LedgerEntryWriter, change ingest.Change) return err } return writer.DeleteLedgerEntry(ledgerKey) - } else { - return writer.UpsertLedgerEntry(*change.Post) } + return writer.UpsertLedgerEntry(*change.Post) } diff --git a/cmd/soroban-rpc/internal/ingest/mock_db_test.go b/cmd/soroban-rpc/internal/ingest/mock_db_test.go index 7fdaf4cd..981deafc 100644 --- a/cmd/soroban-rpc/internal/ingest/mock_db_test.go +++ b/cmd/soroban-rpc/internal/ingest/mock_db_test.go @@ -24,12 +24,12 @@ type MockDB struct { func (m *MockDB) NewTx(ctx context.Context) (db.WriteTx, error) { args := m.Called(ctx) - return args.Get(0).(db.WriteTx), args.Error(1) + return args.Get(0).(db.WriteTx), args.Error(1) //nolint:forcetypeassert } func (m *MockDB) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { args := m.Called(ctx) - return args.Get(0).(uint32), args.Error(1) + return args.Get(0).(uint32), args.Error(1) //nolint:forcetypeassert } type MockTx struct { @@ -47,17 +47,17 @@ func (m *MockTx) EventWriter() db.EventWriter { func (m *MockTx) LedgerEntryWriter() db.LedgerEntryWriter { args := m.Called() - return args.Get(0).(db.LedgerEntryWriter) + return args.Get(0).(db.LedgerEntryWriter) //nolint:forcetypeassert } func (m *MockTx) LedgerWriter() db.LedgerWriter { args := m.Called() - return args.Get(0).(db.LedgerWriter) + return args.Get(0).(db.LedgerWriter) //nolint:forcetypeassert } func (m *MockTx) TransactionWriter() db.TransactionWriter { args := m.Called() - return args.Get(0).(db.TransactionWriter) + return args.Get(0).(db.TransactionWriter) //nolint:forcetypeassert } func (m *MockTx) Commit(ledgerCloseMeta xdr.LedgerCloseMeta) error { diff --git a/cmd/soroban-rpc/internal/ingest/service.go b/cmd/soroban-rpc/internal/ingest/service.go index 987757f1..92eb74d1 100644 --- a/cmd/soroban-rpc/internal/ingest/service.go +++ b/cmd/soroban-rpc/internal/ingest/service.go @@ -3,7 +3,6 @@ package ingest import ( "context" "errors" - "fmt" "sync" "time" @@ -25,9 +24,11 @@ import ( const ( ledgerEntryBaselineProgressLogPeriod = 10000 + maxRetries = 5 ) -var errEmptyArchives = fmt.Errorf("cannot start ingestion without history archives, wait until first history archives are published") +var errEmptyArchives = errors.New("cannot start ingestion without history archives, " + + "wait until first history archives are published") type Config struct { Logger *log.Entry @@ -52,7 +53,7 @@ func newService(cfg Config) *Service { ingestionDurationMetric := prometheus.NewSummaryVec(prometheus.SummaryOpts{ Namespace: cfg.Daemon.MetricsNamespace(), Subsystem: "ingest", Name: "ledger_ingestion_duration_seconds", Help: "ledger ingestion durations, sliding window = 10m", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }, []string{"type"}, ) @@ -101,7 +102,7 @@ func startService(service *Service, cfg Config) { panicGroup.Go(func() { defer service.wg.Done() // Retry running ingestion every second for 5 seconds. - constantBackoff := backoff.WithMaxRetries(backoff.NewConstantBackOff(1*time.Second), 5) + constantBackoff := backoff.WithMaxRetries(backoff.NewConstantBackOff(1*time.Second), maxRetries) // Don't want to keep retrying if the context gets canceled. contextBackoff := backoff.WithContext(constantBackoff, ctx) err := backoff.RetryNotify( @@ -165,23 +166,27 @@ func (s *Service) run(ctx context.Context, archive historyarchive.ArchiveInterfa } } -func (s *Service) maybeFillEntriesFromCheckpoint(ctx context.Context, archive historyarchive.ArchiveInterface) (uint32, chan error, error) { +func (s *Service) maybeFillEntriesFromCheckpoint(ctx context.Context, + archive historyarchive.ArchiveInterface, +) (uint32, chan error, error) { checkPointFillErr := make(chan error, 1) // Skip creating a ledger-entry baseline if the DB was initialized curLedgerSeq, err := s.db.GetLatestLedgerSequence(ctx) - if err == db.ErrEmptyDB { + if errors.Is(err, db.ErrEmptyDB) { var checkpointLedger uint32 - if root, rootErr := archive.GetRootHAS(); rootErr != nil { + root, rootErr := archive.GetRootHAS() + if rootErr != nil { return 0, checkPointFillErr, rootErr - } else if root.CurrentLedger == 0 { + } + if root.CurrentLedger == 0 { return 0, checkPointFillErr, errEmptyArchives - } else { - checkpointLedger = root.CurrentLedger } + checkpointLedger = root.CurrentLedger // DB is empty, let's fill it from the History Archive, using the latest available checkpoint // Do it in parallel with the upcoming captive core preparation to save time - s.logger.Infof("found an empty database, creating ledger-entry baseline from the most recent checkpoint (%d). This can take up to 30 minutes, depending on the network", checkpointLedger) + s.logger.Infof("found an empty database, creating ledger-entry baseline from the most recent "+ + "checkpoint (%d). This can take up to 30 minutes, depending on the network", checkpointLedger) panicGroup := util.UnrecoverablePanicGroup.Log(s.logger) panicGroup.Go(func() { checkPointFillErr <- s.fillEntriesFromCheckpoint(ctx, archive, checkpointLedger) @@ -189,18 +194,19 @@ func (s *Service) maybeFillEntriesFromCheckpoint(ctx context.Context, archive hi return checkpointLedger + 1, checkPointFillErr, nil } else if err != nil { return 0, checkPointFillErr, err - } else { - checkPointFillErr <- nil - nextLedgerSeq := curLedgerSeq + 1 - prepareRangeCtx, cancelPrepareRange := context.WithTimeout(ctx, s.timeout) - defer cancelPrepareRange() - return nextLedgerSeq, - checkPointFillErr, - s.ledgerBackend.PrepareRange(prepareRangeCtx, backends.UnboundedRange(nextLedgerSeq)) } + checkPointFillErr <- nil + nextLedgerSeq := curLedgerSeq + 1 + prepareRangeCtx, cancelPrepareRange := context.WithTimeout(ctx, s.timeout) + defer cancelPrepareRange() + return nextLedgerSeq, + checkPointFillErr, + s.ledgerBackend.PrepareRange(prepareRangeCtx, backends.UnboundedRange(nextLedgerSeq)) } -func (s *Service) fillEntriesFromCheckpoint(ctx context.Context, archive historyarchive.ArchiveInterface, checkpointLedger uint32) error { +func (s *Service) fillEntriesFromCheckpoint(ctx context.Context, archive historyarchive.ArchiveInterface, + checkpointLedger uint32, +) error { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, s.timeout) defer cancel() @@ -225,7 +231,7 @@ func (s *Service) fillEntriesFromCheckpoint(ctx context.Context, archive history if !transactionCommitted { // Internally, we might already have rolled back the transaction. We should // not generate benign error/warning here in case the transaction was already rolled back. - if rollbackErr := tx.Rollback(); rollbackErr != nil && rollbackErr != supportdb.ErrAlreadyRolledback { + if rollbackErr := tx.Rollback(); rollbackErr != nil && !errors.Is(rollbackErr, supportdb.ErrAlreadyRolledback) { s.logger.WithError(rollbackErr).Warn("could not rollback fillEntriesFromCheckpoint write transactions") } } diff --git a/cmd/soroban-rpc/internal/ingest/service_test.go b/cmd/soroban-rpc/internal/ingest/service_test.go index 92b7753b..566616a2 100644 --- a/cmd/soroban-rpc/internal/ingest/service_test.go +++ b/cmd/soroban-rpc/internal/ingest/service_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/stellar/go/ingest/ledgerbackend" "github.com/stellar/go/network" @@ -22,11 +23,11 @@ import ( type ErrorReadWriter struct{} -func (rw *ErrorReadWriter) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { +func (rw *ErrorReadWriter) GetLatestLedgerSequence(_ context.Context) (uint32, error) { return 0, errors.New("could not get latest ledger sequence") } -func (rw *ErrorReadWriter) NewTx(ctx context.Context) (db.WriteTx, error) { +func (rw *ErrorReadWriter) NewTx(_ context.Context) (db.WriteTx, error) { return nil, errors.New("could not create new tx") } @@ -36,7 +37,7 @@ func TestRetryRunningIngestion(t *testing.T) { numRetries := 0 var lastErr error - incrementRetry := func(err error, dur time.Duration) { + incrementRetry := func(err error, _ time.Duration) { defer retryWg.Done() numRetries++ lastErr = err @@ -55,14 +56,32 @@ func TestRetryRunningIngestion(t *testing.T) { retryWg.Wait() service.Close() assert.Equal(t, 1, numRetries) - assert.Error(t, lastErr) - assert.ErrorContains(t, lastErr, "could not get latest ledger sequence") + require.Error(t, lastErr) + require.ErrorContains(t, lastErr, "could not get latest ledger sequence") } func TestIngestion(t *testing.T) { + ctx := context.Background() + mockDB, mockLedgerBackend, mockTx := setupMocks() + service := setupService(mockDB, mockLedgerBackend) + sequence := uint32(3) + + ledger := createTestLedger(t) + setupMockExpectations(ctx, t, mockDB, mockLedgerBackend, mockTx, ledger, sequence) + + require.NoError(t, service.ingest(ctx, sequence)) + + assertMockExpectations(t, mockDB, mockTx, mockLedgerBackend) +} + +func setupMocks() (*MockDB, *ledgerbackend.MockDatabaseBackend, *MockTx) { mockDB := &MockDB{} mockLedgerBackend := &ledgerbackend.MockDatabaseBackend{} + mockTx := &MockTx{} + return mockDB, mockLedgerBackend, mockTx +} +func setupService(mockDB *MockDB, mockLedgerBackend *ledgerbackend.MockDatabaseBackend) *Service { daemon := interfaces.MakeNoOpDeamon() config := Config{ Logger: supportlog.New(), @@ -72,17 +91,54 @@ func TestIngestion(t *testing.T) { Daemon: daemon, NetworkPassPhrase: network.TestNetworkPassphrase, } - sequence := uint32(3) - service := newService(config) - mockTx := &MockTx{} - mockLedgerEntryWriter := &MockLedgerEntryWriter{} - mockLedgerWriter := &MockLedgerWriter{} - mockTxWriter := &MockTransactionWriter{} - mockEventWriter := &MockEventWriter{} - ctx := context.Background() + return newService(config) +} + +func createTestLedger(t *testing.T) xdr.LedgerCloseMeta { + return xdr.LedgerCloseMeta{ + V: 1, + V1: &xdr.LedgerCloseMetaV1{ + LedgerHeader: createLedgerHeader(), + TxSet: createTransactionSet(), + TxProcessing: createTransactionProcessing(t), + UpgradesProcessing: []xdr.UpgradeEntryMeta{}, + EvictedTemporaryLedgerKeys: []xdr.LedgerKey{createEvictedTempLedgerKey()}, + EvictedPersistentLedgerEntries: []xdr.LedgerEntry{createEvictedPersistentLedgerEntry()}, + }, + } +} +func createLedgerHeader() xdr.LedgerHeaderHistoryEntry { + return xdr.LedgerHeaderHistoryEntry{Header: xdr.LedgerHeader{LedgerVersion: 10}} +} + +func createTransactionSet() xdr.GeneralizedTransactionSet { + firstTx := createFirstTransaction() + baseFee := xdr.Int64(100) + return xdr.GeneralizedTransactionSet{ + V: 1, + V1TxSet: &xdr.TransactionSetV1{ + PreviousLedgerHash: xdr.Hash{1, 2, 3}, + Phases: []xdr.TransactionPhase{ + { + V0Components: &[]xdr.TxSetComponent{ + { + Type: xdr.TxSetComponentTypeTxsetCompTxsMaybeDiscountedFee, + TxsMaybeDiscountedFee: &xdr.TxSetComponentTxsMaybeDiscountedFee{ + BaseFee: &baseFee, + Txs: []xdr.TransactionEnvelope{firstTx}, + }, + }, + }, + }, + }, + }, + } +} + +func createFirstTransaction() xdr.TransactionEnvelope { src := xdr.MustAddress("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON") - firstTx := xdr.TransactionEnvelope{ + return xdr.TransactionEnvelope{ Type: xdr.EnvelopeTypeEnvelopeTypeTx, V1: &xdr.TransactionV1Envelope{ Tx: xdr.Transaction{ @@ -91,150 +147,135 @@ func TestIngestion(t *testing.T) { }, }, } +} + +func createTransactionProcessing(t *testing.T) []xdr.TransactionResultMeta { + firstTx := createFirstTransaction() firstTxHash, err := network.HashTransactionInEnvelope(firstTx, network.TestNetworkPassphrase) - assert.NoError(t, err) + require.NoError(t, err) - baseFee := xdr.Int64(100) - tempKey := xdr.ScSymbol("TEMPKEY") + return []xdr.TransactionResultMeta{ + { + Result: xdr.TransactionResultPair{ + TransactionHash: firstTxHash, + Result: xdr.TransactionResult{ + Result: xdr.TransactionResultResult{ + Results: &[]xdr.OperationResult{}, + }, + }, + }, + FeeProcessing: xdr.LedgerEntryChanges{}, + TxApplyProcessing: xdr.TransactionMeta{ + V: 3, + V3: &xdr.TransactionMetaV3{ + Operations: []xdr.OperationMeta{ + { + Changes: createOperationChanges(), + }, + }, + }, + }, + }, + } +} + +func createOperationChanges() xdr.LedgerEntryChanges { + contractAddress := createContractAddress() persistentKey := xdr.ScSymbol("TEMPVAL") - contractIDBytes, err := hex.DecodeString("df06d62447fd25da07c0135eed7557e5a5497ee7d15b7fe345bd47e191d8f577") - assert.NoError(t, err) + + return xdr.LedgerEntryChanges{ + createLedgerEntryState(contractAddress, persistentKey, true), + createLedgerEntryUpdated(contractAddress, persistentKey, true), + } +} + +func createContractAddress() xdr.ScAddress { + contractIDBytes, _ := hex.DecodeString("df06d62447fd25da07c0135eed7557e5a5497ee7d15b7fe345bd47e191d8f577") var contractID xdr.Hash copy(contractID[:], contractIDBytes) - contractAddress := xdr.ScAddress{ + return xdr.ScAddress{ Type: xdr.ScAddressTypeScAddressTypeContract, ContractId: &contractID, } - xdrTrue := true - operationChanges := xdr.LedgerEntryChanges{ - { - Type: xdr.LedgerEntryChangeTypeLedgerEntryState, - State: &xdr.LedgerEntry{ - LastModifiedLedgerSeq: 1, - Data: xdr.LedgerEntryData{ - Type: xdr.LedgerEntryTypeContractData, - ContractData: &xdr.ContractDataEntry{ - Contract: contractAddress, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvSymbol, - Sym: &persistentKey, - }, - Durability: xdr.ContractDataDurabilityPersistent, - Val: xdr.ScVal{ - Type: xdr.ScValTypeScvBool, - B: &xdrTrue, - }, - }, +} + +func createLedgerEntryState(contractAddress xdr.ScAddress, key xdr.ScSymbol, value bool) xdr.LedgerEntryChange { + return xdr.LedgerEntryChange{ + Type: xdr.LedgerEntryChangeTypeLedgerEntryState, + State: &xdr.LedgerEntry{ + LastModifiedLedgerSeq: 1, + Data: xdr.LedgerEntryData{ + Type: xdr.LedgerEntryTypeContractData, + ContractData: &xdr.ContractDataEntry{ + Contract: contractAddress, + Key: xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &key}, + Durability: xdr.ContractDataDurabilityPersistent, + Val: xdr.ScVal{Type: xdr.ScValTypeScvBool, B: &value}, }, }, }, - { - Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, - Updated: &xdr.LedgerEntry{ - LastModifiedLedgerSeq: 1, - Data: xdr.LedgerEntryData{ - Type: xdr.LedgerEntryTypeContractData, - ContractData: &xdr.ContractDataEntry{ - Contract: xdr.ScAddress{ - Type: xdr.ScAddressTypeScAddressTypeContract, - ContractId: &contractID, - }, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvSymbol, - Sym: &persistentKey, - }, - Durability: xdr.ContractDataDurabilityPersistent, - Val: xdr.ScVal{ - Type: xdr.ScValTypeScvBool, - B: &xdrTrue, - }, - }, + } +} + +func createLedgerEntryUpdated(contractAddress xdr.ScAddress, key xdr.ScSymbol, value bool) xdr.LedgerEntryChange { + return xdr.LedgerEntryChange{ + Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, + Updated: &xdr.LedgerEntry{ + LastModifiedLedgerSeq: 1, + Data: xdr.LedgerEntryData{ + Type: xdr.LedgerEntryTypeContractData, + ContractData: &xdr.ContractDataEntry{ + Contract: contractAddress, + Key: xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &key}, + Durability: xdr.ContractDataDurabilityPersistent, + Val: xdr.ScVal{Type: xdr.ScValTypeScvBool, B: &value}, }, }, }, } - evictedPersistentLedgerEntry := xdr.LedgerEntry{ +} + +func createEvictedPersistentLedgerEntry() xdr.LedgerEntry { + contractAddress := createContractAddress() + persistentKey := xdr.ScSymbol("TEMPVAL") + xdrTrue := true + + return xdr.LedgerEntry{ LastModifiedLedgerSeq: 123, Data: xdr.LedgerEntryData{ Type: xdr.LedgerEntryTypeContractData, ContractData: &xdr.ContractDataEntry{ - Contract: contractAddress, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvSymbol, - Sym: &persistentKey, - }, + Contract: contractAddress, + Key: xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &persistentKey}, Durability: xdr.ContractDataDurabilityTemporary, - Val: xdr.ScVal{ - Type: xdr.ScValTypeScvBool, - B: &xdrTrue, - }, + Val: xdr.ScVal{Type: xdr.ScValTypeScvBool, B: &xdrTrue}, }, }, } - evictedTempLedgerKey := xdr.LedgerKey{ +} + +func createEvictedTempLedgerKey() xdr.LedgerKey { + contractAddress := createContractAddress() + tempKey := xdr.ScSymbol("TEMPKEY") + + return xdr.LedgerKey{ Type: xdr.LedgerEntryTypeContractData, ContractData: &xdr.LedgerKeyContractData{ - Contract: contractAddress, - Key: xdr.ScVal{ - Type: xdr.ScValTypeScvSymbol, - Sym: &tempKey, - }, + Contract: contractAddress, + Key: xdr.ScVal{Type: xdr.ScValTypeScvSymbol, Sym: &tempKey}, Durability: xdr.ContractDataDurabilityTemporary, }, } - ledger := xdr.LedgerCloseMeta{ - V: 1, - V1: &xdr.LedgerCloseMetaV1{ - LedgerHeader: xdr.LedgerHeaderHistoryEntry{Header: xdr.LedgerHeader{LedgerVersion: 10}}, - TxSet: xdr.GeneralizedTransactionSet{ - V: 1, - V1TxSet: &xdr.TransactionSetV1{ - PreviousLedgerHash: xdr.Hash{1, 2, 3}, - Phases: []xdr.TransactionPhase{ - { - V0Components: &[]xdr.TxSetComponent{ - { - Type: xdr.TxSetComponentTypeTxsetCompTxsMaybeDiscountedFee, - TxsMaybeDiscountedFee: &xdr.TxSetComponentTxsMaybeDiscountedFee{ - BaseFee: &baseFee, - Txs: []xdr.TransactionEnvelope{ - firstTx, - }, - }, - }, - }, - }, - }, - }, - }, - TxProcessing: []xdr.TransactionResultMeta{ - { - Result: xdr.TransactionResultPair{ - TransactionHash: firstTxHash, - Result: xdr.TransactionResult{ - Result: xdr.TransactionResultResult{ - Results: &[]xdr.OperationResult{}, - }, - }, - }, - FeeProcessing: xdr.LedgerEntryChanges{}, - TxApplyProcessing: xdr.TransactionMeta{ - V: 3, - V3: &xdr.TransactionMetaV3{ - Operations: []xdr.OperationMeta{ - { - Changes: operationChanges, - }, - }, - }, - }, - }, - }, - UpgradesProcessing: []xdr.UpgradeEntryMeta{}, - EvictedTemporaryLedgerKeys: []xdr.LedgerKey{evictedTempLedgerKey}, - EvictedPersistentLedgerEntries: []xdr.LedgerEntry{evictedPersistentLedgerEntry}, - }, - } +} + +func setupMockExpectations(ctx context.Context, t *testing.T, mockDB *MockDB, + mockLedgerBackend *ledgerbackend.MockDatabaseBackend, mockTx *MockTx, ledger xdr.LedgerCloseMeta, sequence uint32, +) { + mockLedgerEntryWriter := &MockLedgerEntryWriter{} + mockLedgerWriter := &MockLedgerWriter{} + mockTxWriter := &MockTransactionWriter{} + mockEventWriter := &MockEventWriter{} + mockDB.On("NewTx", ctx).Return(mockTx, nil).Once() mockTx.On("Commit", ledger).Return(nil).Once() mockTx.On("Rollback").Return(nil).Once() @@ -244,22 +285,35 @@ func TestIngestion(t *testing.T) { mockTx.On("EventWriter").Return(mockEventWriter).Once() mockLedgerBackend.On("GetLedger", ctx, sequence).Return(ledger, nil).Once() + + setupLedgerEntryWriterExpectations(t, mockLedgerEntryWriter, ledger) + mockLedgerWriter.On("InsertLedger", ledger).Return(nil).Once() + mockTxWriter.On("InsertTransactions", ledger).Return(nil).Once() + mockEventWriter.On("InsertEvents", ledger).Return(nil).Once() +} + +func setupLedgerEntryWriterExpectations(t *testing.T, mockLedgerEntryWriter *MockLedgerEntryWriter, + ledger xdr.LedgerCloseMeta, +) { + operationChanges := ledger.V1.TxProcessing[0].TxApplyProcessing.V3.Operations[0].Changes mockLedgerEntryWriter.On("UpsertLedgerEntry", operationChanges[1].MustUpdated()). Return(nil).Once() - evictedPresistentLedgerKey, err := evictedPersistentLedgerEntry.LedgerKey() - assert.NoError(t, err) - mockLedgerEntryWriter.On("DeleteLedgerEntry", evictedPresistentLedgerKey). + + evictedPersistentLedgerEntry := ledger.V1.EvictedPersistentLedgerEntries[0] + evictedPersistentLedgerKey, err := evictedPersistentLedgerEntry.LedgerKey() + require.NoError(t, err) + mockLedgerEntryWriter.On("DeleteLedgerEntry", evictedPersistentLedgerKey). Return(nil).Once() + + evictedTempLedgerKey := ledger.V1.EvictedTemporaryLedgerKeys[0] mockLedgerEntryWriter.On("DeleteLedgerEntry", evictedTempLedgerKey). Return(nil).Once() - mockLedgerWriter.On("InsertLedger", ledger).Return(nil).Once() - mockTxWriter.On("InsertTransactions", ledger).Return(nil).Once() - mockEventWriter.On("InsertEvents", ledger).Return(nil).Once() - assert.NoError(t, service.ingest(ctx, sequence)) +} +func assertMockExpectations(t *testing.T, mockDB *MockDB, mockTx *MockTx, + mockLedgerBackend *ledgerbackend.MockDatabaseBackend, +) { mockDB.AssertExpectations(t) mockTx.AssertExpectations(t) - mockLedgerEntryWriter.AssertExpectations(t) - mockLedgerWriter.AssertExpectations(t) mockLedgerBackend.AssertExpectations(t) } diff --git a/cmd/soroban-rpc/internal/ledgerbucketwindow/ledgerbucketwindow_test.go b/cmd/soroban-rpc/internal/ledgerbucketwindow/ledgerbucketwindow_test.go index 2e50ed6d..3423350f 100644 --- a/cmd/soroban-rpc/internal/ledgerbucketwindow/ledgerbucketwindow_test.go +++ b/cmd/soroban-rpc/internal/ledgerbucketwindow/ledgerbucketwindow_test.go @@ -98,7 +98,8 @@ func TestAppendError(t *testing.T) { require.NoError(t, err) require.Nil(t, evicted) - evicted, err = m.Append(bucket(1)) + _, err = m.Append(bucket(1)) require.Error(t, err) - require.Contains(t, err.Error(), "error appending ledgers: ledgers not contiguous: expected ledger sequence 6 but received 1") + require.Contains(t, err.Error(), "error appending ledgers: ledgers not contiguous: "+ + "expected ledger sequence 6 but received 1") } diff --git a/cmd/soroban-rpc/internal/preflight/pool.go b/cmd/soroban-rpc/internal/preflight/pool.go index 71ad82b4..ec59f615 100644 --- a/cmd/soroban-rpc/internal/preflight/pool.go +++ b/cmd/soroban-rpc/internal/preflight/pool.go @@ -16,13 +16,17 @@ import ( "github.com/stellar/soroban-rpc/cmd/soroban-rpc/internal/db" ) +const ( + dbMetricsDurationConversionValue = 1000.0 +) + type workerResult struct { preflight Preflight err error } type workerRequest struct { - ctx context.Context + ctx context.Context //nolint:containedctx params Parameters resultChan chan<- workerResult } @@ -84,14 +88,14 @@ func NewPreflightWorkerPool(cfg WorkerPoolConfig) *WorkerPool { Subsystem: "preflight_pool", Name: "request_ledger_get_duration_seconds", Help: "preflight request duration broken down by status", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }, []string{"status", "type"}) preflightWP.ledgerEntriesFetchedMetric = prometheus.NewSummary(prometheus.SummaryOpts{ Namespace: cfg.Daemon.MetricsNamespace(), Subsystem: "preflight_pool", Name: "request_ledger_entries_fetched", Help: "ledger entries fetched by simulate transaction calls", - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, //nolint:mnd }) cfg.Daemon.MetricsRegistry().MustRegister( requestQueueMetric, @@ -180,7 +184,7 @@ func (pwp *WorkerPool) GetPreflight(ctx context.Context, params GetterParameters } pwp.durationMetric.With( prometheus.Labels{"type": "db", "status": status}, - ).Observe(float64(wrappedTx.totalDurationMs) / 1000.0) + ).Observe(float64(wrappedTx.totalDurationMs) / dbMetricsDurationConversionValue) } pwp.ledgerEntriesFetchedMetric.Observe(float64(wrappedTx.ledgerEntriesFetched)) return result.preflight, result.err diff --git a/cmd/soroban-rpc/internal/preflight/preflight.go b/cmd/soroban-rpc/internal/preflight/preflight.go index 2c4485d8..fe2cc3a5 100644 --- a/cmd/soroban-rpc/internal/preflight/preflight.go +++ b/cmd/soroban-rpc/internal/preflight/preflight.go @@ -46,7 +46,10 @@ const ( // //export SnapshotSourceGet func SnapshotSourceGet(handle C.uintptr_t, cLedgerKey C.xdr_t) C.xdr_t { - h := cgo.Handle(handle).Value().(snapshotSourceHandle) + h, ok := cgo.Handle(handle).Value().(snapshotSourceHandle) + if !ok { + panic("invalid handle type: expected snapshotSourceHandle") + } ledgerKeyXDR := GoXDR(cLedgerKey) var ledgerKey xdr.LedgerKey if err := xdr.SafeUnmarshal(ledgerKeyXDR, &ledgerKey); err != nil { diff --git a/cmd/soroban-rpc/internal/preflight/preflight_test.go b/cmd/soroban-rpc/internal/preflight/preflight_test.go index 0de5417e..c1bd72a7 100644 --- a/cmd/soroban-rpc/internal/preflight/preflight_test.go +++ b/cmd/soroban-rpc/internal/preflight/preflight_test.go @@ -26,7 +26,7 @@ var ( var contractCostParams = func() *xdr.ContractCostParams { var result xdr.ContractCostParams - for i := 0; i < 23; i++ { + for i := range 23 { result = append(result, xdr.ContractCostParamEntry{ Ext: xdr.ExtensionPoint{}, ConstTerm: xdr.Int64((i + 1) * 10), @@ -476,6 +476,10 @@ func benchmark(b *testing.B, config benchmarkConfig) { func BenchmarkGetPreflight(b *testing.B) { b.Run("In-memory storage", func(b *testing.B) { benchmark(b, benchmarkConfig{}) }) b.Run("DB storage", func(b *testing.B) { benchmark(b, benchmarkConfig{useDB: &benchmarkDBConfig{}}) }) - b.Run("DB storage, restarting", func(b *testing.B) { benchmark(b, benchmarkConfig{useDB: &benchmarkDBConfig{restart: true}}) }) - b.Run("DB storage, no cache", func(b *testing.B) { benchmark(b, benchmarkConfig{useDB: &benchmarkDBConfig{disableCache: true}}) }) + b.Run("DB storage, restarting", func(b *testing.B) { + benchmark(b, benchmarkConfig{useDB: &benchmarkDBConfig{restart: true}}) + }) + b.Run("DB storage, no cache", func(b *testing.B) { + benchmark(b, benchmarkConfig{useDB: &benchmarkDBConfig{disableCache: true}}) + }) } From 2aeb13c94533acd24b7ed230a5df1b3c00170adf Mon Sep 17 00:00:00 2001 From: Aditya Vyas Date: Tue, 10 Sep 2024 17:41:42 -0400 Subject: [PATCH 09/18] Bump horizon to latest release tag (#290) * bump horizon to latest release tag * go mod tidy --- go.mod | 48 +++++++++++----------- go.sum | 128 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/go.mod b/go.mod index c604919d..17b93fe7 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.22.1 require ( github.com/Masterminds/squirrel v1.5.4 - github.com/cenkalti/backoff/v4 v4.2.1 + github.com/cenkalti/backoff/v4 v4.3.0 github.com/creachadair/jrpc2 v1.2.0 github.com/go-chi/chi v4.1.2+incompatible github.com/mattn/go-sqlite3 v1.14.17 @@ -18,17 +18,17 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stellar/go v0.0.0-20240628063057-b589529f102f + github.com/stellar/go v0.0.0-20240729151841-8b1dba46985c github.com/stretchr/testify v1.9.0 ) require ( - cloud.google.com/go v0.112.2 // indirect - cloud.google.com/go/auth v0.3.0 // indirect + cloud.google.com/go v0.114.0 // indirect + cloud.google.com/go/auth v0.5.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/compute/metadata v0.3.0 // indirect cloud.google.com/go/iam v1.1.8 // indirect - cloud.google.com/go/storage v1.40.0 // indirect + cloud.google.com/go/storage v1.42.0 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect @@ -42,14 +42,14 @@ require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.3 // indirect + github.com/googleapis/gax-go/v2 v2.12.4 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -63,7 +63,7 @@ require ( github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.5.0 github.com/prometheus/common v0.45.0 // indirect @@ -82,26 +82,26 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.24.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/oauth2 v0.21.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.14.0 // indirect - google.golang.org/api v0.177.0 // indirect - google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect - google.golang.org/grpc v1.63.2 // indirect - google.golang.org/protobuf v1.34.1 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + google.golang.org/api v0.183.0 // indirect + google.golang.org/genproto v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect gopkg.in/djherbis/atime.v1 v1.0.0 // indirect gopkg.in/djherbis/stream.v1 v1.3.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index ac3ba4e5..b36601aa 100644 --- a/go.sum +++ b/go.sum @@ -17,10 +17,10 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= +cloud.google.com/go v0.114.0 h1:OIPFAdfrFDFO2ve2U7r/H5SwSbBzEdrBdE7xkgwc+kY= +cloud.google.com/go v0.114.0/go.mod h1:ZV9La5YYxctro1HTPug5lXH/GefROyW8PPD4T8n9J8E= +cloud.google.com/go/auth v0.5.1 h1:0QNO7VThG54LUzKiQxv8C6x1YX7lUrzlAa1nVLF8CIw= +cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -35,20 +35,22 @@ cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= +cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= +cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.37.0 h1:0uEEfaB1VIJzabPpwpZf44zWAKAme3zwKKxHk7vJQxQ= -cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= +cloud.google.com/go/pubsub v1.38.0 h1:J1OT7h51ifATIedjqk/uBNPh+1hkvUaH4VKbz4UuAsc= +cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= +cloud.google.com/go/storage v1.42.0 h1:4QtGpplCVt1wz6g5o1ifXd656P5z+yNgzdw1tVfp0cU= +cloud.google.com/go/storage v1.42.0/go.mod h1:HjMXRFq65pGKFn6hxj6x3HCyR41uSB72Z0SO/Vn6JFQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= @@ -68,8 +70,8 @@ github.com/aws/aws-sdk-go v1.45.27 h1:b+zOTPkAG4i2RvqPdHxkJZafmhhVaVHBp4r41Tu4I6 github.com/aws/aws-sdk-go v1.45.27/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -107,8 +109,8 @@ github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0X github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsouza/fake-gcs-server v1.49.0 h1:4x1RxKuqoqhZrXogtj5nInQnIjQylxld43tKrkPHnmE= -github.com/fsouza/fake-gcs-server v1.49.0/go.mod h1:FJYZxdHQk2nGxrczFjLbDv8h6SnYXxSxcnM14eeespA= +github.com/fsouza/fake-gcs-server v1.49.2 h1:fukDqzEQM50QkA0jAbl6cLqeDu3maQjwZBuys759TR4= +github.com/fsouza/fake-gcs-server v1.49.2/go.mod h1:17SYzJEXRcaAA5ATwwvgBkSIqIy7r1icnGM0y/y4foY= github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= @@ -121,8 +123,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= @@ -182,8 +184,8 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -207,8 +209,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= +github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= @@ -340,10 +342,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= -github.com/stellar/go v0.0.0-20240617183518-100dc4fa6043 h1:5UQzsvt9VtD3ijpzPtdW0/lXWCNgDs6GzmLUE8ZuWfk= -github.com/stellar/go v0.0.0-20240617183518-100dc4fa6043/go.mod h1:TuXKLL7WViqwrvpWno2I4UYGn2Ny9KZld1jUIN6fnK8= -github.com/stellar/go v0.0.0-20240628063057-b589529f102f h1:3W9JZJ0r87wy2M3wsACuJtKW/cNWXpfw5Jwyt89Am30= -github.com/stellar/go v0.0.0-20240628063057-b589529f102f/go.mod h1:4cVjIVyU8V1iSBEMGd41j22DAyBoz2SVL5TcrJPqePU= +github.com/stellar/go v0.0.0-20240729151841-8b1dba46985c h1:8+XiaqgCaFWUjMKpQ37OJzY8LZ6ie8BpLxq/wNQZ2eM= +github.com/stellar/go v0.0.0-20240729151841-8b1dba46985c/go.mod h1:rrFK7a8i2h9xad9HTfnSN/dTNEqXVHKAbkFeR7UxAgs= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -369,12 +369,12 @@ github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGG github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= github.com/xdrpp/goxdr v0.1.1/go.mod h1:dXo1scL/l6s7iME1gxHWo2XCppbHEKZS7m/KyYWkNzA= -github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So= -github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is= -github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce h1:cVSRGH8cOveJNwFEEZLXtB+XMnRqKLjUP6V/ZFYQCXI= -github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb h1:06WAhQa+mYv7BiOk13B/ywyTlkoE/S7uu6TBKU6FHnE= github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d h1:yJIizrfO599ot2kQ6Af1enICnwBD3XoxgX3MrMwot2M= @@ -398,14 +398,14 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -416,8 +416,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -454,8 +454,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -491,8 +491,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -502,8 +502,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -557,13 +557,13 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -573,8 +573,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -628,8 +628,8 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -655,8 +655,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.177.0 h1:8a0p/BbPa65GlqGWtUKxot4p0TV8OGOfyTjtmkXNXmk= -google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= +google.golang.org/api v0.183.0 h1:PNMeRDwo1pJdgNcFQ9GstuLe/noWKIc89pRWRLMvLwE= +google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -700,12 +700,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20240528184218-531527333157 h1:u7WMYrIrVvs0TF5yaKwKNbcJyySYf+HAIFXxWltJOXE= +google.golang.org/genproto v0.0.0-20240528184218-531527333157/go.mod h1:ubQlAQnzejB8uZzszhrTCU2Fyp6Vi7ZE5nn0c3W8+qQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -722,8 +722,8 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -734,8 +734,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From e51095a494163231010041b5a51fca1b818603f9 Mon Sep 17 00:00:00 2001 From: Aditya Vyas Date: Fri, 13 Sep 2024 16:17:46 -0400 Subject: [PATCH 10/18] Remove RELEASING.md (#292) * Remove RELEASING.md * Remove images --- RELEASING.md | 58 --------------------- docs/img/soroban-core-version.png | Bin 176313 -> 0 bytes docs/img/soroban-package-builder.png | Bin 70103 -> 0 bytes docs/img/soroban-package-logs.png | Bin 303630 -> 0 bytes docs/img/soroban-rpc-docker-builder.png | Bin 37585 -> 0 bytes docs/img/soroban-rpc-promote-to-stable.png | Bin 24304 -> 0 bytes 6 files changed, 58 deletions(-) delete mode 100644 RELEASING.md delete mode 100644 docs/img/soroban-core-version.png delete mode 100644 docs/img/soroban-package-builder.png delete mode 100644 docs/img/soroban-package-logs.png delete mode 100644 docs/img/soroban-rpc-docker-builder.png delete mode 100644 docs/img/soroban-rpc-promote-to-stable.png diff --git a/RELEASING.md b/RELEASING.md deleted file mode 100644 index 9ca25dd4..00000000 --- a/RELEASING.md +++ /dev/null @@ -1,58 +0,0 @@ -# Releasing - -To release Soroban RPC, follow this process **in order**: - -## Update Horizon Version Dependency -1. Run `go get github.com/stellar/go@` to update `go.mod` and `go.sum` to match the tagged Horizon version branch. -2. Commit this change to `main` in a pull request - -## Follow Rust Workflow -Currently, the `soroban-rpc` repo doesn't publish crates, so we will be running a *modified* version of our main [Rust release workflow](https://github.com/stellar/actions/blob/main/README-rust-release.md). - -1. Run the [Bump Version workflow](https://github.com/stellar/actions/blob/main/README-rust-release.md#step-1-run-the-bump-version-workflow) from `main` -2. [Review the PR](https://github.com/stellar/actions/blob/main/README-rust-release.md#2-review-pr) from running the Bump Version workflow -3. [Merge the PR](https://github.com/stellar/actions/blob/main/README-rust-release.md#3-merge-pr) after the publish dry runs complete successfully. Although currently we don't publish crates from the `soroban-rpc` repo, we want the dry runs to succeed. - -## Create a GitHub Release From a Tag -1. Create an annotated tag with `git tag -a v -m "Description for release"` -2. Push the tag to remote with `git push origin --tags` -3. Create a new [GitHub release](https://github.com/stellar/soroban-rpc/releases/new) from the previously created tag. - * The release title MUST NOT start with a v, otherwise artifact uploads fail (see [workflow file](https://github.com/stellar/soroban-tools/blob/main/.github/workflows/publish.yml) and this [Slack thread](https://stellarfoundation.slack.com/archives/C04ECVCV162/p1694729751569919) for context) -4. Monitor GitHub actions until they succeed - -## Push New RPC Debian Package - -1. Run the [Buildmeister soroban-package-builder pipeline](https://buildmeister-v3.stellar-ops.com/job/Platform/job/soroban-package-builder/) - * Set `VERSION_OVERRIDE` if necessary, replacing "-" with "~" (e.g. 20.0.0~rc1) - * Set `BRANCH` to the release tag (e.g. v20.0.0-rc1) - * Enable `PROMOTE_TO_TESTING` - * ![Pipeline Parameters](docs/img/soroban-package-builder.png) - -2. Review the package stage log, and note the build number for next steps - -![Soroban Package Logs](docs/img/soroban-package-logs.png) - -## Push New Docker Image - -For reference, here is the [Soroban RPC docker repo](https://hub.docker.com/r/stellar/soroban-rpc) - -1. Run the [Buildmeister soroban-rpc-docker-builder pipeline](https://buildmeister-v3.stellar-ops.com/job/Platform/job/soroban-rpc-docker-builder/) - * Double check `STELLAR_CORE_VERSION` uses a version *without* test in the name - * ![Soroban Core Version](docs/img/soroban-core-version.png) - * ![Pipeline Parameters](docs/img/soroban-rpc-docker-builder.png) - -## Update Test Configs - -1. Update the [monorepo’s horizon.yml integration test config](https://github.com/stellar/go/blob/master/.github/workflows/horizon.yml) to point to the new rpc image (e.g. [go#5054](https://github.com/stellar/go/pull/5054)) - -## Update Quickstart Image Configs - -1. Update the quickstart image build configs to use the latest RPC and horizon (e.g. [quickstart#502](https://github.com/stellar/quickstart/pull/502/files)). - * Update `soroban_rpc_ref`, `go_ref`, and `core_ref` in all [build workflows](https://github.com/stellar/quickstart/tree/master/.github/workflows) - * Update `SOROBAN_RPC_REF`, `CORE_REF`, and `HORIZON_REF` in [the Makefile](https://github.com/stellar/quickstart/blob/master/Makefile) - -## Promote to Stable - -1. Run the Buildmeister [soroban-rpc-promote-to-stable pipeline](https://buildmeister-v3.stellar-ops.com/job/Platform/job/stellar-soroban-rpc-promote-to-stable/) - * Set `PACKAGE` to the release version - * ![Pipeline Parameters](docs/img/soroban-rpc-promote-to-stable.png) \ No newline at end of file diff --git a/docs/img/soroban-core-version.png b/docs/img/soroban-core-version.png deleted file mode 100644 index 0e57915cb764fa77eebf2e905fff137deadd19b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176313 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%0DnG$GpMVTwwBgq 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

+@HS{ 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 AoB#j- diff --git a/docs/img/soroban-package-builder.png b/docs/img/soroban-package-builder.png deleted file mode 100644 index 513d399f76b825afa8ea8d49dfd13327cc37c809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70103 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 N_a)`;rr*|a|3AbSrWRT!8 zxW2yY-TU3|e{Ze#di7dE(_PioRi~=X*?XS|H5GZ>ClpUGFfecx-pXiTU_5$_f${Ja z=mGGb=GL@K;OC*cl)`%u2sFQ{x`Kg0hoK-EtorcR5E519C|B=u04Mp56Z?*Qck{A+%+;kpbKB}H!!_cX*oad ziwA=qm=e4lJ3|XgkXDI`x)<(d@h+nmY$}&&yt{PnAZ`GEc3 zYZs%>7*GGbG@PdE{OdFRKBoCWmH+&Wfzj!S`#+1KxSBC7*uglVA@oQ-a%oUiiR8YO7o*XNdLWTEPwMqi{9|hJSv#rR?-sm=q5iUl?&e#Rsj2C zF<_4K{acEAZW6Z=r+e4aKc3LM@Efu6z=%?Kl+8tr_hYF?1-B3P=bGWjNzdDdpS{v$ z2_YpSjQ^HB++2V8NO$QqH@(C@ndGgRm-Y(_C^&?HUwe0fkeoi0JTFlL;-aNIl5HG# zJyWDusN6*!(_!x7$pc@xc=%5}D_5>{4@&og&ZW;6j)rw;$heHvdu8u<>q<|;mR0@F zyKxW7=X=b&tazV1vxuv7XvMgi0U%@Kc*4%%cu*;jm7L9^i(?79WW*M_6CkXE0O4yel6mXV7v&}}fj9=UMfEiC(>Bt;aG&KL@+loaX2!2)S-D@yEr3_ug z|6=tf)@mz?=AX%OQ_%GCvF!byo9QOL$5q$|?F;yFvQ1e*zX%E!&&GESjQyy=7H@ey zvL$~%hB!v{S~YljoQ6|vRvM7#{StEWQRwE5e1cBqNIP(uiODQoKo10IX)*KAJ`SA} zbu!Y5&9;flucHlkzx)%zGv#S9@WVHXba;#}ux~$5J|?>{5r-|m`0n+GPRh5@QC%q~ zI5_$;OJ+4QrAZ}ZzrPm?*qja12HlGm7YAPZOYS-xkdLmEGbtm{X!niLw6SH$i-Eh( zU8aY2yRR&us7CC4(2?>vEHyh5bmZ(w%0sNroxpq4=O$(<4n;p zn6BJMap0x9VX^%)E4Z@;Vwm~5->N9KhMd^VC<~TKV15p#Aa&oW}_BdIaqHbyN^K;aGXKA*`NAwFtI-0%XGV|HY^S-Nl)y3!4 z!_ruN!`O}wt76e8V3~TavmDMdg~Pzh;JA9zlsKMt1-lK4QK2$bS6p1`EGtRkOc5>l zPRGT`NlH%)dbC5C7EM#(bGmoVl+~hGr!M|5t3u)uj6jPaB##aQ?+-uI#`taqvnnA^ zu%%%NObWGw;{~*qiq8lj*!#_aS0_aW?dN6(ALoPiPn1Oz$07@!*1X~kd9z$pOktfC z=lV!$)wjk*;yUjDm+SHP2Rz+qk{u^iOMe=T_hM~d|o+3#+Ix?(V=iur(mbkmCWH;V? z6$)63s8{gZ!kkl$K9{#gvuzqoFE*LiUSH4M-CkLmp%(r3Al!13$|Wh{e)V3Rcu!!ym}JOczL_FT|3x{*D;6e@ zOD~e|?DNv#3?&eUQL2_@W zZ4*nPxL|ph;IAsDny@X{0QhbIzrE#mDAq!Fs&?e0zOlZcv3{$^*iG=|`8`rnh{gEJ z981`U+u=;a!~`+qXAXmWSrS{uW2-c4KmF}Nk|>grx`H|jbkbg0xrw>yDt;(UOR%!9 zo~>-}R)gficf*lcUE-=$P2K=wmI5j+nemdWrKR&}$MWxDyxiPlf7m2)m{eDOXXyYo zsLmV<;|i|o8Y=nibOU9i49L^NBeZ+_RQnT2s?0N5+G}L+{bu#}ul^`eFE|y?hyqTf z%$pB(_UZiYA_%logTbU{Tz1A2cEwb716WdW54;E3pd>`KPkD@wtqbMR65KbcxjG7? zRU_UxG+(!30#3nl-K%kXXQ#RL>6Z%0p4Bp0lE&(7HV4eA;zz$xF$?Eq!54AA*K(4n z{$8?`k`(aXyw_^+9#M9!vT=U#uxrH#af7^RP5jb3OB7t$&~P5Z)kZ)|mY$yQ75tKm zgOhEv!uCU!X+WYz`sDE%1Ab|{tFTl*H*{mF9%)nj@Y8E+eSNd8#NWTapVUq`2cy_r ztHx*pYPEzrvh07+ZP_*cK2u7NYsm<{7c@y1sKcSp-|-8SMs5{TbpN?kq<}0;(q~U9 z9X{F2zV1!#I68m$@Nbv%6+=R2pJ~2hEr7&w-H%A(He(a_ zK6hF0LD@iUVNIs{P%QLjX7P71BRyWewFsrSZgMoasd1>94^BUs)P&x_PvJ> zrSm8q%wR=wavH-;>!|}jyU!QSF7oi{A;tFF#=)E2#dCgHu}w9F%bwTUwG)XI!I!L2 zEbaG40_%h?U(5dza)ZHgVD%Dgyr?@-or;zl{(m-Ias(r`F1_*)0`cq)y%LAQI*L}; zdJmpp2iYuI_r4^AKJ0RN?=f+IcM|pmOOsK(+4gc=vh8T} zJBIxlh(HR{49Y`)@xzMSA{>lo;kExP7IU?K&QRsLi=hwH#gKlXrufVP2le(&ik1Ia zH;ybG1-;LjusJjpW=jq;BL~qVxs|&oln3cO#x7n^X_Jj)YiYdyIkDijySDZ8;GRLt zVWSCtMjqqe4wg!k+g=5CvsACiO7kh&a+hwbTN6kH1O-dKv$xiuN}_b?Un&O z3pGoF*=j%)*81J4-t?E2m5^Zu2^mD}K6n!je&rS;1eM?5itDBk7R|#uPU*wsg}AOk z4aHvMCF++=IZIsiR5L}%s0+CspR8IGPAycwl90g5&Nj)E)bE*@RX5_+hm%t~*LwAi z&&)u1NPX~D5fX%#texaBA~nfw)nKU?7V4bXeXdUDEBoTvSz?;Z#%e-xp!z`@F2>K} zr6&{P9>P+<;po_LgW9obvW@f3^y=L?b-3`c zH}vp$6J+cFG$%2Gh?z~k45IN8)VgTxIk!jEhwIyxQ@MSPefe}lFco?P5ps-NEZ4Ps zS^z`P9$wz$R7SqoBKQ<1uK4al}28&Sr`9 z?7ErdYCW6ke@Ol;XUM5$zBHb3r+FWZEw$>xl8@K-1=>!FA{?{$WKu|Cijswcii$}!>R!|JyIM}LhFjulNA<#VeX}f}U$jOx@jry}ya|_M{pu!c zrB}`RM2dwRXA{OGyej}bitQ8KkmrW~)f|_&c(!QNu9ty>Qlf2Ij!TM$9IK}=wHN|B zt=|b(#uSqn6l&-XMauNfumcIW_{%Tfp`72 z%8IFr)+Dk#cEgOD5KyoHF`a)c&`jAL@LFcP@W)le0T~0$4iq zi3c)+*M9qlueav8SnqPTOY)9veREyT_~h~?EShS*)>B?f`Jq&Trj1#Hewf9drrh6c zo3*ZXFZy$5rp7MO_kk*evI=**a7ua^);hMqNUNvG?D{F`nIyhdH6<;u`hDa>pdL{x z@)z`srM5$)T&;UaS`kM_=?w=9RXYijY{{b;JRCgq?IkVe*Y{VnUpc7p7g{#z)176) zZx8PM%?{chK1cM)$cvxOd`1?2J3TqM-8koZBIdobtyN>Al5F*ueqw5=DsXykDULw|NyEB=QMN?D{~mll&YXN9_2d0hQag_oO1-+SSR+Tq>m4 zF4M>;4aQpSvu{bSXsazZSKa#*UASg#V?(GUBGR&*o+jwHq;0g^^YyLQ^D0|k+p&1c z4OI>(oQC@P14$1b1T(g1iytQr3xnTcmQCu*j?~lm@_jo zb8xHg&eWd2hY^0*WV&`)qvz>yee`JXMOO{}qW}Dja1CISV5QOb)1~)5Lva>`jOr;8 zWe&5sSWLZN;@LgDJayh@%+`6Ecm|^S#dHLf!<6-eoTrWpqIkzONP4$VuZrz=8XT5S zx4Ia_o@MTQl>tq8)>KtpA|GN;m(Q~wLKwQk)@uk$V~fl5t4^jS+5E1qI*t};#qK(( z(VL^3De---hMtal%`x>zy zHu(696o?+eLvbYB%}q%3%gL~*l#WY~nOU<+Kh0pyK!0AqY1UXzGe&N$|2d+e!Mm=$ zzONUam`s}S{X678sML#I#%05;M3tY{dV(X+i8ZaEq~R=n2Ebn z+mN!|qtEnjRuU2t;(;@s@a|OdPLv8yHc61BZt!@~dm&)cvB8aM%)@BfL#Z;CWhj|b zQCT5qYqB9aTcSI7e-=WHk~sf!nKt}JR9w7_o2#XuErE`>=(v-7zBCD#duh<;5ccs| zj3|wlL&t62%Ux3d{yffQdPe5>GekqyR-@ODj{kwNGuB|{1qHb-{Vv>>nLD^WDu6MQ>-qwD=v=A zO-V{S{{8u!3EnGlf1KW>mcrA6&R|y%7Cbeb z74*Zp=F5-O*L1HzqoafULnEA={r8jZTqkFzF_$hMV~hLxdPOqvqEQ4=oX ziMc$ZoYnv~l{^#&CZlAXjFaJcG56)MYs+E?i)pCXCp9l^IjMkvfZHW+Y_Dr z5VYH-c>Y%0akbcI;HArCTl$Fs63hN1 zEIMvxap`D}DBA=_(CHf?px@{2ctk z3>^F%Oh<9o2LZb|*HSsLW+~0E%?(Syv4>&-VM1;SpUm-U~vo3!ORkXD@ArB38q8Zw5_wVjLW$X@z zv>N)AUGM%4xOAG7+Uro8s%@(!8aV6o_)ptXDEuY#(5CTE&%hf!Bh>P}nI%PS zU70MBPn}p(Q=|R-eEI4FGO2ujsXgdC7D0;_CJe=jrsSdng1PrqFG&g!RKl*~sH1Nr zB)U(%fooBh_GL^CXkx5-D-h-&FsG|X-wGWFia zW=k@ix3@UsV}3sUI;>Gf%6rsC^!!xX{7Q#5G1fPw3Fou&r?U?A22O@WGo^(pI$0t{Oi@z4 zdai!@X^aZ!jgkGWy+H597kZ@Uv=U3>OPL9oRetLlQN80!V|8XIfkp239K@b+(Yr#d z^h-_+p64g^_1-wiOWbguAL6GM(zdp&z+1UGs=Sb+s??Enr7ZVss^S^h$=Aa=*$a(< z6|#g3MeDWWxncVqebzOZMdgWJX~D+sI2pM|nCWoCn<<*P2L47V8%WNzcJCc=>IrRTi8@8a zMBN@I#NgrjUSC};8Mc%+*DtMBE(dRxxo-}$vvTTJS-#Oy?rs{!5_h|&9!gsH({?V2 zx+ zRHXSWT&JVfcBmdVz5cuj+c`z>`jh_@V^5#>ZBI9_39YQGI0xVVO5OHLAMra#OD7x7 z){K>0hp$JeYENZQb6CYeJS@X5`gvGcIWr`kM-2{I?+3c_M#`vVFNM7q+x^alw`TS9 z&X-)#?p&=KRAbSO#7Mrp43%hT zw#Ddgnzm&F$`yyq<51>#2hEP28X6iF?n48}Z(XKuiLoF*|D3)b*2zkVPhVU_p6@KT zHSQ#Qew6prM!D^NpTEXhDRBEJ%=pG2T0DgnTkNKRgGL%o!(0@kGVtBsb5wi-^(!JO2MP!7@i%NCPt zpjRi3$4U0~9I1^g1R^@vwe{xO?M=L_H*lYBD8vi-PeEsEtoisG_yp=aJUtt{z3OW{ z>pi{FLxrjK)fCZgH8j2}G?1UMedt1+<%`>r1ExONXRymc!KLdn9hw%@nZYk}3!oVe zOUXa@KI2V~THNC9oZ5HN} z75k~{O~v#9`uZy{Zb z>|Ncd-Z{&;QNb_D&LuRuR}TVqc2vT;dDkwt5W&cw3&pzmz)GKee|CBAB3zi1JhvC! zIP<$Jhh9t2DMiqKgrnp!y>t8RQdC7nFL{($hxc+0u7UUcQS!Z>vG&c^3b7`uX$d`I z__fn#7@U(!yEW6wC z>wB)?bLKFlg#QLk`bZKn?ewOXss}MxQ7QcX^dRfLo9%$HPtKi6IAGT@`2ORFH5=z} zHm~~?*Zp#K2C6Ts*-Wm93UGarchXI+HQpz_)10iNAZ4n`XX&VIq~jI8J?CoQMq|mT z%36lIR)$Tx3uZ)k>PKsZAULPi(kjcaN;Z4nwtms>A#fvea_WdegBgn zc`<}X!uLu^(|x{1@`|P}uBi8msN^i|<4SJ0v~e&uSO(-ubx=8vElv|&@%OY_LAS{L zL0aIT?>ojJSXLeV7B|^8$mrX*;Yhx+W2MP^|Mkq>HJ{MfPV}eOE4R4mfYSz$2IENNxMqU=PP)XV`g6!d zK>M=9{S%AY*4iHH8oe?AHiecB1G_jkG2pWlIe%EFIZ(6EETKDu@<0wV^mxHiFk9`6 za=-O5Pv0$txVoa|yMeoI&O!!W-bK_Aysww9&J)MEq^%7FL`f~zk2DC)IbD5#GSgGH zS1}c&R)unSu;QJAviZcUB>nfgv9aLnw0NHr%L4PbvTAlvz?zFih?PPl-)frAZ8dvT zE&!SVP7MxTHkV@RknN^#mIlS18(=NENUZ3ZL5-iAZ97#J=`Y@?Lcg8}y;D};WMe(X zeo)bRXTu;opm%o9<5Exq zVpAF5n@|!sc-<~PB#*Lk|gasJW zO7%N6^uc9LPtH|a^|P1n%kHnb9g#4ZyZ7wX{w}{Qd$)f52*}zbL|G^sQ6BhgH$Nj; ze~!tOBH0jZYPyHL!=|F+-`buVvLMV0Q_dFfyd0N>+1?!-7*n10gF?wyFDW+=##Igq zYb1(WRVe0${TWRo1Fo#}_CfNfC^y;o{vL?#8}N@b&f`{=$W@n%oWc%e0^rUd1FR)& zV!{KLo)HwXSWY+ibB!wK? z-mVI%OrLI=1o?07-@YS5r0eVd@(^KEsAY|0SFmD|1y0R(@0J2KZyEa7$VDsu&~$%S z0^5pfehdM_!@KhQsZ6xf_Kl$pRwt! z(%bN;uSLa09U(^KUp9UDiSM@V1Irufyk~PSzhGT@wJ0Yswk%rL=~^pgi&$Juw6-oJ z8wZxOSEYh~aKFrm4+D?mqJEAMsdHW*7Bjy2UgmtYs(Q~%JmnC%t5&)YPW)$GTcD|n z%i7m-S**`Fk%M;XE1{n;6u_es{CK#y^pIS`(Z=5&yb6?q$t_5u7!?Sm!ZiTfp69UH z^oCL8e1EI@z29N5ba=SGg8=Ssok%3s zI)r0Jl}cO0Qs4MNhlMx|0>94w+=trQ^X?PTUSRqT6}}lh zy@SO4yy^RCQyI>vKHUGdmptr8PU}MHgxYvN%^5kvAPcIWDm65nfI4Rk^o%cF&SA<__9RMai0IU z2^&OjomN+O>eYhFV_C!Mm0m_C$;Hfk-7}!MBeA4mFx}${0c&V2&&*FJr^dNXry1mB zM2EsQqDKMBvi%disv#8p+#mG=@(57#%>Bw=uaM^FboPIm*Wp)!R z=|P*Y#fys-;(xmcm1+-t|MQTLCzMg080!xJ`osP518>L0!lAsZ&Hj8z)%TOC>bs%- zw>x_~&dvwFxAq+E?In%0ykYh9@ycK+^V|#&eH6RoRp;W#O&oXVFO)f0%Bw|Om^BC1 zu6_}sXz?6-krt%*%Xjms1(e4uJaxBK;ypRNz;Tqco|J=9K1)$+DWk}s75T<@yH_EP zH(XZ}GrXrAYYn;ej-OmSe6xd<$ArlMfuf_*!E#XLi4Ld4{r2{_zCSE1(-J8*nmS(m za+_(`U!ZpXHF4M7H!spcCBSt2N7kmh2I1ZMtVvSxH^7rG)2%)%JC~$*W@-k-?e;my zE92^Di+%-5w^o$8p>8Mzu(;xaDCbz2qh6im?cHr)ts(s~y&QDV<$nNxH0|g6qK_6n zmpM9$i?>lz8x@w=vDt4keWGo;hL~z;@oS-cm+Zb(?ArVz_32~**bY5RLJ%fHjw+^f z_@=M2&az3vr)W-5nio4Gx^& zDndIBMh&z%ji{)pza?a9>GQ2mr0Qou4JoBj;yHU%Qg7EjdBAM_TH9Z*w2m%+!f?aK zdk*1KMq@q5?$F}3u$eEAzj`Jsx(BUFyMiON>bN>i&Ga>Xpzs$1QN`==EJ?{EeX{cS zer*u&zQZlSlQ1r}*dG_>Es}mdiC=zfe^&;FOuEc)<0udcXC+`7BWs8B_iT1-60@HE z(S*i_^*(QF_6oF@KL;>W7>rSrD*DHdn=RyEw^<#m+-W{~k+NYg!h>zIx5i!FH=1GL z_Z(S8-_Gfk-}M!!YweYH@VL>N3S&eZa`V*3H>+bMC$hAvC{=?3uVjJI6WsA@ z%$WGi@7(2{qqh$_T<2-Jxy!2gihtr*nCq+ov=4v+vNMQ}(2Dr$y@InyVbVjZw30$K zITXK2wjW35>N*<)qM%!vFp(Ck6)zl$gyT#ko_k%VoF=XU{kE(6W~uy{w8zB_l$u&OllQ> z+IdRZy;U_rj4SeiutAfnwzEn0G;PYC_h7h?$je9#JB{t5OCKq2cwD+~lq??B1FrUF z0bUMIfB}g#|N1pzLr99N@NFbrsjVL!u?*;o)T-(^wPA;COF&RXdA|{xMQKBWDxuGP zLB;KZzsM#ly&oyx0iWxoNU~*wScUGIi_pn!_Km8mD}YhHkosQ9eV?F;503K@TUzVE zlydRYS9G_(?w|L8r<7AR+aBLEs#>&qh#?9YnP^1(q+}RG?xpmgtYFqF6<^ICLWK+ujS`Q z4$dvLOGv$?1HT4gg>=#0og|aS(UL$-Av|)$#lEBB0#4ONQErp~--MtQE(d4?0O7_n znwCFcg+r@cbn9YL7QEY6znfH9Mtk zTz=DJ9CQ+Q`F#NZ=C8()zs$`U--MSUZFOFj*hz?cu=BIFH*!l#3YGwFI{*Os+Pdm1 zy7}9j17z>I`v9xegn1lC^};d`5GkKLee{nDKCbNcu|RiiyZLGrgN;*UkPN3!4q(gD zd`O8bhRt+9m+S#s2M6aDH>k-#wZUD1p*;MBbvI#gZmrwlYCz|5ut1Cqks zY%x_3PapmmCxizNGsNkfPDFI|t)${a8?eDJu-OYm=S{rtwp)YgCox5Wt-qI*<#9{Kpc>`_3+bV_)#eew51m&8`+|n=;Yi+qe_wXc# zcUyLf6N50-3^N!bfOS(M7$asF#e&9?CZ|uId=8ra{RVeBYar$M5dLz*3klBsMSRKP z(qhU>`z~@MAA=y2FE;RouD)SZg;~qN*i)H zU0!avD)neJmfC}#an%0jk6V3^$CT|?Cn$CGa;+g!=lMF-Xwt9-wjn}#8Kh?g*K5#! z6p`GIUo?SalX~;|UWVQe4~)L#8s2gDe~@#Cc@L0J52f3`xZ4P2*iZ_5(W)yc)X}Ot zV&>$DMgh?g04}wESiLdO=E8?e#1?PEY}JaNg$jZ*c=OmL=xONlZLd~VV#_I$>l(-{ zoatt!rphTpb9JMhpf^>xp2}_fB*@*C(=fkT4p@&fxw*Jj6%X(ZFx)*1fU`*xpoGdR z>4G<)wu0q`65dlDBY)Cs@gw%)=1~Uirq%#Nyq3ZzAb=JN1B(XiVoJRQLsB(|tW`K@ zjxTY$Cp;Oz+GN97cNg8~i{9td0G7$kdYz%%%&744C3~amR)|D{{N!mR?DAnwx;7_3 zgUfs7aIfOl&hZiFe*UZ=7f9NZ?ij|{>9YDR;j^R3Y14Uy3}UO>lS>km5Z&x5X@*I zp=i1u^pE3Sbo=$NCR;N5n$SL)CYpdjaHIxp!co0jInP;Nm`&CVV(@A%p5lfcSI4(5 zut$Q!TrE|3EK*QezE^P-lBa6g)@imudH8vx<^*%X_5ur!3aXMNY z3>;1Q-!bUlyEeZZbdm*ag%Z$G@&ign*{7SE*0Af(Ijch-H8yZDhu%HSRKb?&N1cA* zR~8(pj{hNl&~kg%;zSQogIKD2%sN*0J1$if7B!JrIMfYpG#vynG9)lPrne*yU8ZgH z)8zUa<6fy4WYn<<7Yi=UJ)SvA00>S7h=ag7Z3kK@P};)A8$Ya%Q!R4glIaCJiI}vf zuUFPs%xhOhOIchp=;#4_W)mNfbkhYZma{~%C3AWS?_T3k@9gj6VoHy3+Nhf?0a_Ub zgt&u)orIAV+v6K6ZBu&a&(!TX2KnfbbWu?@UUY=~{&Ky$bD*ZXP^rqmfMN58yWvzM zNy)cYwE!fT+`hr{m`cZBd17WFBQ?&tVP3n;aKlYl_5J%gZ;wzd4grzkd~WBi8{xS6 zqdHGq<+8o!2p%|qDU{oP7#tc?;@`o`p%j$n%fZ%j1DMp%91w2Ne@mg*_$J95A zOF)46CV4m2UELc376~}XXODoy0xW@}C_suKi+i7L_&y4oa-JKTMcSuWn+NQ2lq8kv zw@<9Pq`X*cJNU^&5^D4S8VB1chCPQ668-{gKvie@@&SGC^T50M4=7ibBxM6H(zSJf zOOZVL8HkyXSNIZpfhJ+RH3JHmhsD?rtht9$j@#QG7+-fil2sp6j4D)R zd#9pu;un~hhSws_%Bl{AT!q3iTO{}PD9Ic7ntg53;EfF-BqstBNs%$=MJFQYL zzeI18Hr;L%trvWH{d(Fnc_=j_gNk}xL`&WGVn#uc72%#hvUf-|J+rV)LlqhAR;J(X zVQ1@V6o^Wq_Ma1NX10Aw<`B18Vz;v#=zNQckx+}xK0isoU*0)tT>KoF%Ob!OtVq-4 zvvWp$s$3Q=`I$ynXEaAwz=exv6%{=^-dky%?u%c`dxY2k%1mG^VYX){ zCw^kag+`ZBG2p*lubVF^H+MoIozwgR9haln_zN{J2pe@ReT6cbzwhs7dD1!xYv~1! ziG?!*?!*ZYYnN~BrwZD5>FX=X`OWoXJ?Jv^R9=LS%%4+BsDL9UXk8&7u^8|#UmBC2 ztD@uXiYvZQ#FVlNRZ+364|?&uyI3C}|I*^28l#+<g3k<+Ig+=VL^LVWJ`KRLmJA zQWVDS`SIbKoa6Y4q+d`ZHUaIgO-$}HW_c3`iC&Fs%5$#ZW4?U(aysZxT~=$v1^EGb zG=^d}2_6DifLy>W&hLTb_h3T6(%(y3HrI-f>Gk^`KG-H>8c%u-XD-SI^|&MDD9U4- zE8S!!YnA7{0J*|KrAv^P_Qqk<8&>TSCSHcc zbvLYT{Y3YLMKa&=_NuzJHjAm@En8cK<{$ybHQ(~8qP<1@DK0%eU44!B#@hNChBD8H ze1cs1Yb>U-fD{0SZ$16{hmeydY?B}h4y)SyM!?!X_}l`d(4MIG!CcLOrBxk!)*gad zn1ZVBYk>a3EV>t+eDSB89w|PR2n{Wze|Ly)#N#92j5HT@yLoSKU}Gu%`^MOGZQ)A3 z3~(RN8J$nb1X5xQb;J-T_sw4GI)^zxWL3ki7a*NH$vSueVu5ktV)Mi zRO3|rsLpZ#Kx&Vqisu0zlHd4NOG___K&s4fk5Xdp7>-S8D6qbe64AGF{Q-4m%3bTT zdIP9^<0L7hrL(%_qaEj((Vb&NDfB>a#zOq0?QEk3*m%<<+FDyn6Y2AdiWwE8X%Ja$ z*8)z9W5{XAfb|_%TnacnC53y1M$Aa-oNVFaKha@%Rf${hdM(?5^GvDjYVXrc)pUKY zi0oH5HGr66CwdVZpLQDOa|fhIkV-yOENgoCva-INm6>hC%zI|f>katkj}F8RrArH2 zv7P;PdKj%6Eo+M3!DoQL+Iw%Mtg96!O$DuDd`uhI%JbrdK9Wyb^qLf&g6bbY@;f!y z==-|5nTN1MCXTDIOpHys@Ahl~y!|S7e~#|?{`@j>kwekkLX#IxZpIk-=`rXdXL4dBoa%^0ZdBZFf9y5K6vK+w9-8ZHS-A-+cR1$EZJ`MzqV3;4T{KB(=xj5YR2U(L`|e_15wAz zZVmS1IEKE|9EMN|igdZfAPZ=l@iOqfnVE(7o8H;kqMbo+<(P8wxqW}o2lzL)N2<=l8OCW@@z28_Sg??TYP~#Y#9jSN zP1PhQ1x?|<`_k(fnO;x{d&Ot^zsO{N*QfeE9D;Kh;FZ3vp-+AUIXS@(s5Eoed}nXx zmMfbyFWM|3+9Djy2ydRMxEB(6an)Z%6l!Y@8lZug7A`GZQyJ*Q#^cCd;F65!tO#7BWT-0gu^X=b+t$- z=;SI)T{t?SD-YFS`O=-!{)e}X4p|?8)Z0L5ls|1L5mruF4O_f{Y|CzXy;DW0 zn0s!nVpSGdErHa_(TRXYCux)W&O?4~8U@0g^m${y+sx+XtDYXncb4Q_mK?Qy-Zf!8 zy*3L(P_lB@W?{me+6PpU(JAi8Ws@EckGfZSCXWCg-vm<91=d^+XqcESg@h6qkNP7b zVM%9Llar5uVM?dASUbIHzP`evF8jT|N7-}$aj|6`czopQd5Q~oG;jZt!q&;y6%!kmSq#~Jz6jTHd>}*NwN(w4~m@*r0Be_>}dC<+a>WU*LvnC1{i|K6xPd zvgJOLa$O4j)gI?1>s$ zTE1CCja55MINcz7kpd{0k6e*kRmh*Fx^2GezvO9J5!}#Z6Mz4{eO37lA(*Y))J82^ zn%N_1`Ye>CIyu^oN4a=ggucf-j@1f4;Vs1M%;0L=rQ4x7{p0;0C0?kS?mEb(##j!E zsDQ6@3#K3ptj6pvhL#3*YBSu!ap~cP_zw_YMd%X8V~f=lnG}c-6+RlC(pvmko0jTS zB=5GGbGCs%Gg9^pTRO)@H;K_T<4Mcoloz-~#bz2US~Pkj1<&MI^4%7G=b61C#VdJH zK&npl&2zh%Ktyz|23zd7%_4l3{rHd-6sn~x$X?Cz)koJ7VwQ5Jrn}PAkABW2a?zjD zozl}MH|tn$$})iz>?E&&CXn&MfwAJt1drP4uvi&)(9#1-UCOeWqV3yBT%^Yg2_$x! z416&*oncXeFV#? zqYMka}D7)`Igz{#Y#aN%bm30Mvm^}{{lL}W)pyR8)u`H!Osvi>0sb--Pb2Inz z-THxr9(wmg&}p96ZJ)KzHS&uzC>1tfwx(7}^fiG&TSW?_-u)Vtp$BEybUon=7vq}a zycS`EKz;c*#avNF_>kD6^4AJ0eQcWqn8siLCoC?0ATKjdB4G4O$eeO#j@-GH3Xb|J z@G4)Ot>Z8RNICPF#z(l94{g!#2mEd|&hA6?lD`Y#eslPRhtyZ%*gh}wR!;Tg_BlkR z{TQkNiA4&)>k7C1RJ{Du&4P4v&fy%QvMe2cXSseHaQAes^2xGD6sW5c6lkDGOnX6H zhXD@<{~#hvwei5(n!L2{*166()$zY2b8_-1EPr>=uSG7uc0X!>o}2;GTmD2X)_Dhe zd1=4tO1!Lr(THoYnt(yZQ?QC7*6ZAxZ@U|^MqQfsFV@|16X9}AfXZW_y48Jp3B^F8 z4EhHEM7M17KLExS1@2RxxO{9_K`sX}gOdZyo7a~3xAGK55Oz%FOD$gK-KZ~K*=h0!4n`!LOsvhMd{=v0 zX77L(Hd#W=ociKxRD|L?Wg039JI90O;`s-r8r*P06?rf1xu3BOupHUe8R_@`1aXF> zpvq2JZXm^n?|TGKQ^?ecPN+t4`U_Q%_ha#cKN@M&20f4~+^h6$|LN98j-g$$rcj?O z)EIvoGc)9E^71g~BNv!n_c^!wKhAgglm35t0BG_5m6ZMe%;&CieaP;`A^%Sk|0*v8 z2XqdEzCN$%|LTDMeO&wk@}vo*+{S@Wb=v2@l87;&ue?4oMU0njtrr&?p~n6x0Q_66zIJidW1Y>1C_XIaa-Oz>eN2e)iDhF-&ftu0qy1q zWho%Hkg9Yd|N2$g^YkkKbTpR-zd`+XB6$HEuTm)?REh%OUd1tq$=i;<@cw;I=PAbjNMis0B+=hR(O_IeX&4wxPfd|hQW~hKA*OzE{G$b+Q}{(D zo-yQgaTxdM4{tX&H(OhtJNKZZPvtx5g3emR1^M|xoSbJ-G@~}5p<<_}xW*OJe7Nuw z#(^lZW$ummG#I~t03d|7w6<1BjrU%C5EQ&}vW0YNNC$_2&2f0-bjtJx(1$hu;O4=$ z?UkZ!Ku=a#^eygx;<0#OG!3L;XQZSY+E72gX`-Z}I`O;xi|F{;)DuG`;&Cx1e}9H8 zd6C|6-2#>D!?53*I}bjqvB?fR+hk&rHCd^fMj~tMr=8MAjJ37Xl9K$e?0OIgZaO!OpL58@cfkFyj9FqvQ6* zWgyiZA>N=gmDYAPi`_ZGQD1*%m!8Q_u~($|3|ZLG?zvMh@KD#SDF6w}o+>j4JWx*y zHo+LOe8n&Lu1>#9?Sr$k^YSe64WL&COM!A!e%f}NthrsnlqK&^kfGO}jee)i>FI2b zDn*_u{8(zkc6Y08@rVdm|MqxKOfhc^gKuJLDs^O|!_zOA2)M+c_*zV~`RDuMXll`; z@pq_Xj%#jK)}ygU^a>al2?M5l6ttUbBAu46_LhT9ms*9DV2E5NV*EeMTiF}}ohliKI-0{lCMe@;Sbz|cy?}IKVG!Lj?xxfGIqtE5jlnaZ! z6N7XU3jI-JywhdZexn&!6|Lh-7Ut%;f({p52m}DI+-JI9x2XMr9K}snEEwmvZ$CeZ z2#<-`F+C>!dWI?MJ~+fyZrp~4(c)F6^7d_I0~rQJrb>rNFkaYViB3$N{d8DZ*mB{+ zzW7uvef=)f(OsyXB*BT_;udl<_}0^1O3Kg%@mDg{r-ySi3oif8r}6&E+>3VSkmgsnI*^^r8LVeF(a3@zlqNq63je^_o{)0MjH^6~@;zMIUoQaPm+&Op})iHZ_n z(#O3gAtologg`L;{rvQq_dnF7rKR}^q_6LDN_g+*O67z{N4t5Gr7LX!p~1u?KPDE| zBW&#Yte7s-*tf-lga3=Nw~ngni`qsvAte%mfPjEVC;}=i4N6H#cc^qrHwXeM0t(Vn z($d|f0s_+A-Q5j$`o2HE@7_PJgW(t|o^#lHtu>$d#N4gdFlu6Bc^*C#rZKrw@{~3c z72)P4U48y}*uu*6bC$B1V8Y@QO$xazLy|{+;#RY|m8y`9!zntj*0G>1O>!gjH?D-qi>3p^?1q z%pV+gt7!ivYn+^#hK6i<@A;WKl2}{2eX!0SBu+#|MnFbpQ)i#FvJ&ItBU&^}NkA~Q zxcG`KIwmGXJXwL+aaG^{^RrY|R#u>J9336;@bPE2%kevELfhu)=~Fp59W1!`XzC|N zM|)59*<;&fW!r5lezdeG+%2{i_@d2fZ57dN!a<#I8c_oO15TWjZvJoIzWsVx#&ycU z$r<_O3nvFhRJ##X$m;s~4dTA0z^Avd$p8Lac6Pf4Y|(jnPWt-Deob;le@t4M5m#*E zw9SVPAIK?U@6i4b;QwXB9vv5_q;Pxt@G$VB1s~>0(noQnSFe)AlMNq|(bF3$W>O;G zv&?Vc+$j0|rQN8iYSJ#6AuO}Dwt@FXFx}$;q79m`7G+IM*3Zf-_Pp})A>N1=)n;uQ znF^DGh{y{aof^6H#odbBTvi1Ioov3S_Jt20o{fw0C~4udf>xMy#z- z)=U5|JU_R$MRVuhvVRr-&a9bEDwOW^q1SIrC(p}sd|3uG1k3Lrkc7q7Vcq1-3L2)T zkmnhh$iuo*t5k<7(WI{eZn`oudrRHPKYsqqX!`Nv$Km9q&CyoUix<<69}gRM#@}aU zHDrtS^c4IVfWO(B&K>K)_?nr0cLWaE%5wO{L(RJvAZIKo7wmOBj|~-Rr0!B!DU6wx zcCV4Nd4FTP_asG3tg*^zv!%VAg(ZB+p4ZwM|G|UK#RTe@_;@p-LATACMh3SCe};(O>3jw`dj_vBb7x(6H)Mw$4^02)Mm&2~A}P!$$0R$BQ}zcV_}; znIo|gF){klvd!%5Y`DDWBJ9yJaBuZIUEEjAdbzC^nDs8A0|JhUIwSJ5%5HOWrza+= z=W(NBoE&UUI&Dpfh$eMa)@kSRIIbN{|CIO;C~eQ{A?&TEsp%>y`TIRl^X|@$*V(q) zs_7Y+bjQYO+&b4sT?`Gc7Yq$|c3N+Y4fE=Z&PO2nZ4s7gx!Sqe*-ZDdipv(SpdZmQ zGG3$N|J~c`yCR%S$Ze&qSLOJVy>riV+K&)cAlDs>iE8@$_uKmWXM5!@2N&+y^Pcao za)(fj*XcKCy?<}1T-Re(k}hXRDd?V(l2Tk>OV3}wHkA(S85}H9%Zq>Fk6S9k$9;GpFLb^(Gb0l^7ev7grzUXv5zH=| zN83c0_!qh=Dyz%);yFxbrW(*job)yol$5GoH3w&@5=GFcr`K}k7bY%_7xmyew6@Zb z2Q_te^6~JP{CfA|_3PI;Pa+xR;{{#!)IB{##KcOpbHRDOvt@G)Ym1uC(Zb%IxL+c@ z*W-Ae+tx*TvbHmrT4=!N?Z`-FjT?kH+znt_$9Pq`R_%|$+;JY)y(PF_OibTbS1E4Y z63fjEPD*OX%ru4doq9rs+ceuOZ#8;wKcrbDi*qnHI$Emn;>)vnfM}IY z@AF{Yb!y}qjFw8Ro9xwc5W!?NgaeLqT8F; zjal>6|8yry_`iK?WMJ@>-=)=nmWXK9=ugzb>guk#72ki`*kO!_u>M3E;Eve2yshoY zScQKuzPgG^&5NJBNItfHbbFeBn^wU6BnG&M9D{jLt8qN19arI4~_ z@9yu*Nxmb++Mu%(UW{ zTIh9R>YM6G5b)E~OmWBA$R`n{3(MzWbYiO5D~=dMIJrAYrcc6)7E6>>ZK7PEe%|(( zbX!{+n1#PeT&cGBJ^w+csuUYNzMq#YD&nmY=lp5Fl?3|p-i_`r{ugld?dd>$m z92Zuo#3JeJcvRJ2qoYUjCfT`AnEgaw&;9O3!#uDUE?oC4Qe+A@AFx2Yb9ItO{`9o| z<|#60k%)Yd;JFap0N-TzaP8T%){N7KAOQ}bWc&LsBuj*Bj#WhdoNjJ*vNUZOEnQ!< z91UI@nLj(*?Nm~bPE~Z7`BhQK_Fge_d9uz);qzQyW->B|FJwW+ZPk-1eG|!dJERX~ zK9zQg`eDE(8ERss`kKcmt^-#%e;Bty`=>sc$F_^r;SMGU1>S@^tP09*&8(cEu)!ZC;Ek)?;mG`4*pN%b)66i($8x7O8=A`2@k; zezmN_^-)6d7!K#HB0RhUdiwcTu3N|vJu7R&_4;qUHy=If4r8eKGyD4VaML)fL|H}U ze7!6-S5N40K>GU4=Iw5}!lN>y_UQ&=lT$fsxFHrzjhzbP}7S&f&P^*fbW=`0WA$WPXK07~#Y zdclGyD@zI<=|@*pMOFR;Lu)LTC6agr{b}>Bx0@3+B?Sc*IO|9DQ2oLmCV)1FocOFb(`$X3C%3DuWipVqSiwN*gFaMN?aeZ?OG9IPyU1(1@fpH8)_z$C(;U#fNp;C0qh0!YoDbF>Bl<;+M2vDRt(9rYOySSw zp*pY|*J2|H?mN+UI zpMp6EAX{5xUgAlfc12}%wP>dDcjfOoRR<}l`>5XR#vSBA;@^vO^Q=ujx6OZuh=?%l zHA1Uj8{UPUOPe*aZNBg1X)Fa`D`FfmY3V@C9NnS?EhI|7O~J0Hct1z*^$Z8nwaj|& zUJa{mwaj=;Vc`zEHER7#qx9;^3QODry$%`aRWxL@)bcMJVhU#pcRfF${_$hx*xdv>E>DHRS`3!!Ty|9vESwJ~vmwc? zRnUN+9NfY|w8}1CR=71brd}njy@o*5U?amFU>q;o)Q@D{M)X~tXimae+<{Wxm&uNU zgQMk?k(;Yix#xv!O}K4FhKBxYWp#P0 zWyux|w_2N3Evui;aZOHY85>biQNi)^aZM)1F*aTZ`js}FVGD= z>-FnBa3U6*n~R%TSnM1GqkA_7PUhuVKZj+L`aLbpu{W(9dFXKx>*psna9($8M33yP zaF%ChYo{t^Dl_?s-j2L47tbFT?b2RpY-!1Y*sl((*1vf&umaH^Y|D|7@99d)0-Ner;ZaFw~`iW}j>20o%UqP;toCU0;b(^T>XksF}ix0B1vhs3sVIlA# zOXF@+uydf%pQt%S(chji1ThxBX7_*h+U>ngXY#V+Eafco_JyW2hMULv`~F@;Ii-$2 z-U1kS#7`B{JnQG@*VNR6x)pMZ?@9mSx2SdoWNUkS!M0*~ITL~YblIQHuxr}Fq!k(Qt#~Slv<8nL+lo0LOy;3uA%P8)Dl#exK?3lp%`Gen zsTR+UuMQ7uB#YO$*R}5`GxfKIuOc*DTns!s84dv>BXGdbB4m7yU-I(sBip98%lpE} zAI-Q(NQ~~?N1ijOWM;O!YOWR5Nv^8mdHh(42CLfr*nfZTqxh@CjdK{0F=U}?V)8C8 zj}d{s;tAdL;n7hy7Z)^P4GoPdtBo2H4)Vyh8(8RYZQAC0meG-+(b3&w_m!ZTUCT`j z=tpt<`Wze#-e+*u=+-%|yS}G0K3F@xO7h3y_3MRgXMQR*X2-yg5NaNqUn3=x%F17~ zP6h|Lp`83ZqLjwQ$1DEljM_a$MX7T;@?iAZRnm?d z?zq`kBu3p2J}6#X|FqB(7+gK+?KfWMtu=KIvOO$iKKtOZ&3*OC(BSM#eAO zAfPw;as)k2m~Z%(CiX7lHVJ5<*z$aZ78AuA;36y$jgeHv<<@Y$gQZ9H{r&qB=}(aQ zygI7FXgU#sf&T1l4Ue0fZb8GtkD;+c^M-3O^y@R`wG~VxD2OFGS}kXkC4JVW9HAi| zDN?sU^dFLmCOrqb$L{vSe;vSw^gN7#p@QU$%iB^*Qw;VYe|md=E-=yt{3OKjGujPT zMaf21t#C1Xf4)FLL92BHphTv_3{$Ie@*2dC{;oa5ssloSD zyVCx9e*REzZ{Ud9#$3zCwKY^EKUdaBHfO;7;@Aw41in#fs{jiJ=UwmyDx7N79(zkI zR02IpilMZ$qSQ92qPHje_v0n+$932^I%0g%XlD3h6xuwicsShA5&Xd%x}|Uo`mhrI zsi*QhE16QMENu}Ug^ufG;&*OnaG@b0U0RxR$fvNd!Lq!Mt|*k0ZPrCM@C zeEknMC%HK}=^s71K;gSx8m7#|axb&A$d2NnK9)#Vrs!s$U(v9mePvd6Mq5iuk>Fdo zy4}MB9B7D{8NyJ2e28l^R8t#N@TK`*&a^9RYWb?ZhV9LfR-WSk7?w3qaXn}86<1hC z$C=wHfjw_{tw`6heR!*l)00O46s{q_wUp`lH81X-pO5eC<~cn4Lr1W+zBVGaeZ=^P ztayNeSTV4T8C#n-uC%xq6*1wcl$FQC#B_5LxBI2^2+x-=DsI^|?l&YCUl_zR*62(uG3V6y$ah_(1TRoPlp+p?S^A0*71@Db%o* z#F1tD%67WUw|7>}-B$pLBlY?ZZ;(vfWwxja(atTDi>4Ivv=H-~1A=CvXmL=$&GU*r zLUy`OQR{vT^8jp5nC+rfZ4FeLl? z`_|Qu?%bI*5pPm3n=3Dm4Dvx{gadPQCA>zrI`%`qLv9>>ei2mq{dFU)m zU-9|Q=6k;KDmPq89*gsn@IJPh(9pt}nU_cu@4m|S(9hR$R8LzN^$=lOTSc=K4>Waz zfS5Sn^ZYvyr_35VpCi@O5F+8;2X*e78?3oGIaQq^Ill4uQd!F>t+uybM%%^a36)TR zaIvztTy*I6PUtM3>+VvgyOe}PcY1>7mju17VPidd2EnWP=-ziE4w{?96L`a4unPwK zyvdVKjQ};VG1J(F&_uRf9L<*9WS<}o9Jk~pLVsjFum_w<5QUffM#ZDP-@q2#;&YsX zv8X~jw-RfQ?%jKD>oQt}{)w)_b$@Z4V(p$g+JA-Z(vhql)hDs+q5{(DsRaDW|rY4W+;pH(b`qgZ~1vQ<&*2Q6DQ=Kbzc6RoPrPvpPLK5lB zY>E158*S~ce=C$!-r%VFNF_a2>3!rb@yTT8O#A_oXE<$n)_H{E6NTrV@CrpwKUR;G(T_3&nz)59rF&RKr`; z)o~^qF~T&6_h{KwVw_REd>lXAL@q9_Y6m2%wsztq!KmoCDTv=$CZq9VoZ|23&P4^c z>G?&{d*Mv0AxuoIc6Rr9*?3e=7`YEi9oCr;;Gj)ROp2E&Z`?pZaQqZ$Gc6X6+yy(E zn=z46tMPl0Wq`NBBNsg{jxjA6ns4Iz&$rc~dVl%y%Q)Wj4%-egF`+9RQO$1j#|9b6 z)nUBoDY#^VfjOOvh`08Hc*bWsDWrL3rWHV@#H~rsl|Cu!8cvGDbw3Buq^)qZCNyDB z&x`j&>A*axxw=xrc^MEaL-5f3$ZmDeOEy#%u~}7>)AGRjeqCeLIoD5;4(Hl_PF7pV zy{&%`>Jl&RW<6~S-_>8t_bW8Zic4+hjol8;s*O7%V!4YfL@7d=dV9l85-KZ&d_|z| zTpyw46?8s*&GQv{om>3nqed)4Ko92WRAD1O{jU|WR^PZ8jf!Y!3^KDA6;)JM(>~bj zc@>Q>LLee?fh0aZOTC+vDyk8n$_Cv+db$&ux5Fw|czC$hh`IUd&hBndQ%o@K#?lgx z!SCNf7el>6&hq6eThp&JG={n25a zS!dPU^0G+3o{+>eD*NG{dbExyUC)74V6wfyz&c0+?@ir&qjrU7=`YuC~)nj0G{`Uye)JU^>O5zbL9 zb8$o@Wj@Nw%VT&0Nn92@^Y?p){r+`v#LLAZccmY1s|Kz#SD^sjP|2Wi4f^mA!QGlWSccPmog#Kri&64q^^ zoTZ{%^(@u3xaN<$$GNVTM^iL=fY8xYFPy^}{VV8$lGp!v0eX6N4kxr+&yHO1LrNnJ zOOy-@pvCx!qJMT|3KTLl(7bUQz@I?h&&*O1Wc85jk1wVd=0j$^+Lw(V^1eJvUC8}_ z(?Y7}&Tc*7g>yB~GI(XAMB3JtA7R!$x`<%Gta74WT3hRLWiVo|Fze?=Cl=8tzL1zyh-D>EfCB=(y<&@Ojh>U!aw_IlP|Xy=-X?I*fS#mqjl67gh}%s%Bm zV(Go`Bd*-)HQ}&KL&vys<*lC|YW-4o9u)t8m2AavY#a9IKktbcfBj1Fx;#H|n$&@s zpVhyT;Wjij=6>9#uBqROo*}I@1Ihl{3ZB@um zB`fCSa>i0n4~9H?BmB^M0v8#n^%&)$lru1J!o&2R#p9Mb5E$6YLqod)X#aNl|@d8y>{S+D+ z#@#(UYR_!N@^n3*g!r{@yzNb^p&}r_rU?oOF)Z?R;XnNS`yKa0l%T$_7m_c>h(eP& zc@|-(@q8R&9kDkYXJ)<`|A}fh=rL}OX_~in`AdXo)w=sRgy)`}{b&g@R-^{pE*r;t z1yRkr_yOl!+x!*`5lsMH%Bn&dp$Q*Jv;RyN)!t}Z(R!j9;O7T$YUdr{tS1Qi+S<4w z&7fd}Nzwszc9W2B%(ZkK22}wvfwxoAbiKpHl_nj@!Nr&8c350rU;pcu36d}M=_ZFs zeKWNeu!My+)7o!@3CLp({;+r2RcPz!C6rCXbj}uNZLa^;f5cinA>xbiTu)pu0TjpEE6dL@aF@8v2l|W? zZf$k&T?I$P6H!H=a~tMu#b~>=tlOn!VS?G!K0ZBn>APDS37os*=;~d|xGXH+F%5pu z{?~R0ttGTQENpmLQ0X9T|N3?QSz4j^d9dX!%I1_H3unFi=S; z%*^b&)b*#d%?io>k&)6Hs;I7eXH~FiE9@q5arf#R?pGxx6}TOeF)~IvO=uLqY6do# zEY=*|yKGXoD@zS%J||$>LHiF9XZJiqmynQn@E~t*kHg7nG;RS&gsXAoYMQDVP{b>q z=kclWRY9_`rHJs$mw!NLrRFuJrruQ3g(>sY{X^jCXYMsC0g=egp4jj0TiK|G@!vli zh$MIGdN_mvsglrHWK~vF6c`wI{r!Z!jZLB^(32oljWssci6_uww*tY&ATk4M=)|nUcmZ?x8XQLJOm8j0_6~IubkBV!^fRe85bS)&6RB<|WAk z&ocADjLJ&QnPv)y~NpS$||Eq{M%7_XXix|taea0>lRRD8Uut}X-< z{uqUcC&P69;tQtk=wpr6W=+>B`^BpBW78>%@P9G-Qi8FRsqzZqCJoAxDhM`~HQ6woJ_PQ#9_v@}V50BoQVhmG9m? zlwMn#v}_I@->kb-kdq4(w`*fC+r=^{jQD`_J|Ms?R{Bg+DXRo*VrC_+jg1;$!}c&&bNm&25v)H z(irI*1rEm&>+BN)1MOl{YZbtCH9b4KK0ABf6%WuMXH|VXL^G$>mYyilvEJMC#S8q* zOaK|azQ_0*y@VEA_nDdJHYuq8bERFpAgdRZznk3ceCinApl{>kWL&TYtVp*BGZT}b z*99d~eYP{yT;g3^1m=ib_3Z*lI#&~2eAm!unY57+-cSy3Cey7b;3h57$}_ukW=|KHbofn5Ff z!lGCL-4DJ0p*47kcoVo;|M#WjIdCE2`tO~R7|H+tyzMLd1N5%C*6!qHz_02rU#@i} z0l3mNmd8BLEHAe|+^B(_VOFA;Ga&o*=w%4ivgHBuy?f&oyJbIqgj&}gfBZQ;)l&Y8Czl82!vB5Hy-O7^K7P;20$J(jW*zmkje3qyjYHPa z+VB%X!fAAovt7F<#P3rIOG_tOq=*ToCOe)m-M?RVwi7m7M0$;^3x8Hk9xG1H>%_jv zuCpe4a1bRbvk8n*Hgy-^7-p3F%I|(uucpUheSS|W6a+=+WX;Bhs+>k<<93O@WoAmz zW`65kCM0}e&-?#!kzRU%0kTd1VMMqT8+)fl$zv1_jfnzwxZhWk`Vboc&91kCOa)1T@;;^lhgM32}Mv- zWhDk;vU|J7qUKoiucRDjDkRtc4?W9UM81duUj3+QDstLR;3vJd`QcD zPv=tAp7-L$zm3o_Xo|uNxKB@y8oq#VUlL6sKzw}Bpol%R+JBo!^-B*&|M>J2zRp>S zL_&TUut5WlChY7iX<{PjhDV5XBqfC(VuyktQlXa}WA|}_#FKlM5&pB}e=9U@_5Ix$ zD>k485u|9?f-RcrOly0goia}DDuRn~hlwe)VQGoJufJbSMFp%^4$IeHjOX?)TaT4D zF7BS4xie=4tgKS(?BI-#Lzhs~Zp6mOcsSRBOCB_krRHj2@YbQ}gA7BBM-?zBKovDPvbQk~^cFZ<4-V^O213K^PJ2?}DJsw=fBr)JfFw{W z{f&X44w^UU9;@1n;L*|0=pSQtaB$e(*-0V4hVev9%uq!|R#GxieGP;YR=tjD`+IHU z<0YUfLS-4?)@BL^{R6C=p>F}gAeum=87*-BwbL5013D%nCpWm&ub92FsipF z^wq1X7#XAYDeziwsV+W#bA9x;C8LueF^w)74E%NO02DmKn^| ziIQ13PkZ{8nCvYv2Lnl~m4yYEuq9<>t&FQPWf{Vj$10>{7<%=)z>A0W*GgJcnERTC zGL#M^=DfVJ`D;nas;W|{Y;9qjvF)(&!9;fN%z!IaTDq;UFjue66O`vWw{LR^3Lbcd z$mb0%E-b_exFvo6?k{Hyp2D;gI)8tE^}3AfQmIcBS*{Obq92uY5VMm9kv=fGj{fxN z+xJiL2Fk=}GkIZ*g_u~lZr&l#H8LLqKdihw@9H-LWfWW^`VXV7ToL1q3vRKmw3%je zSVce(N=;2IzE~i~_21d~a9^zueuw4*pg$fq_RFG6N{v*-8>EpjG7H|wK%=@#PtKTj@8!6-xYfCooyfI2r3quA8i#02q<7dQp(y|Ksn#2y2wKHc#0IyP*+ z`k>mtgHh~OcYlB@Prv^=XG9Y?nNy{O5N|MOfh}>I%NN{QFIL@Z zoi8~9v(l}RyfTOxq$$gc>bEi#NRy?-@e&4_>@`tJJ_#{oS@#r@q2l^ zlb0CIJ^58nQSrcJFyr~%O@S)>dV%c*xCSGXg=YO`vDkNsKVT+^F@>{g7Ly@dR%g>F z<4jC+U}ve|`%b?xtEQvVTWJSck+5*xf+(zj)L)0qt?7RuLm#6=*X- zU5T`;Y>#?0c+&X$Pc^Se*Dm5-z%$Zgyx1XNU0qPW(+Mq$SJy3x|1FM5mwEB;aI@=v z2exsVl{9rduWK&M4FJW`2BnW{U76`aR#uopJl6hYboAf@?cc=j*Mv^jq#-P^s(O&A zWIW+31}Hbd9Tn*G7eicrqaZ{s(2{l>I4WYGsA(#gC|X0j2e|wZg(eaERU}9wB;4 z5#rxsfOv<69cF7>MMH~Yl+|Rt{vJ4D$F-p<*Zo15zmZpW5tC{sE4vO9gx6koVR5mp zfa@L>)>d9l4tSWRBK2}j%|Zp{k^~80=WQ4y2qyph0bvpyGD1QS9|YjyBt2>N@bCbr z>Fev;uHfmpfg>g?C3Vc0;7)RVW;nU|Dl2O)@?2RNdfR0tH}+hmDKtdN`iS z91-_aG3@i_&k0_$1r|v*>mxy6KR4N&SVzOegR8JGJ3Bfw;+KaaQ^zuTUrQ(hfA^+zlr4m5xxHVvr@A7H8dK)NWyu8U=S|^{f+cSI3z{v&pPh> zFPZ@4sucBx9+^VAdU{-euy;CJ10Eyv*_5bk^9veG04Hr3;%4&mo4GOMuvdloC zK?@t=e7>&%CJi%wn<@MP9%RER-Fa4=3wi6;2rQ;Aom8eWIROE;e!X3~d_wApnyTvg zVO<+CwO%$^)FE@coSxIrp!3(AG&gaIAU1nT*sJ21%3w}%N7U;sI>&NjVtA$FyF22l z9C&Z_$49$>P|%HRjas{nRgVyZp~wrr7mimJKQ#Gl;EirwFi z>nGQcv-2t=BO{HIzXsqjyF18KoKr+}yH_v(H5e&?f`o>-txbCUKKa<*-s5qKx3Eac zKfZOk_VZBR;(W7EzSig>iL|d_`9iqQ6<~Q*8CFp)iX@AhY zAq4S!bEU+bn?WWD3%PQ|k4_5K3O)rF4np$a!kd>)u$CLK7(1Fh@A%hdU0MrxG^(B) zc%-T2?ZpcuY#$tW7GIaVMM^**;Jih{&8@bQAe!U>?hMH}utHkKwZ34Bp0XNIP*;D5 z@bCqmou8wC{NuDrGB|WsC2P~bQ$!xWTC#6y9gLq%5V)(ztB*a-y(pFMgd?&e&sbZJmD z3}-tga$V|1i3Je?4qhM+P;f7gJO6BLJ!~uZd*~hv$0L;o^2;bqL9tO^zUUh}rE{n_ zJDWfb0@#tqc1F?dmfDp+GTsvAyzBDWGlGDvpuDLjQiix=ip9t?JTi1y;U{1TvYdF~08&jMs`>xUl zlq$d1AZC=jZ$3r{DVfvd^mQcPpv9}Y`a=61BV?joO}{>0Dlu&11@9_nO#4Dlk1c|Q zy)v6!Gebnpo7CvQPcEns#O2I;1Tk`=ZOy4Q?KhZ)|@3^>i3_IG-$C)sKnwT;JmzoN`=6rQcYC#GV4V&Z^=0@;!Y;rcTrR*SnxOv zULP$x_w=x}-N`^m5NGFiAZFDVwGVI`8+BLSuu2hewRH2E$$N zNEH4tV!u(SU9qzoe!s3(k6YS^RtnWSFtwDdB>Z-)$0B|Dgn0P(C+{QvZ3dv?ujI$0 zTW|sY-pEBOOovU|EwD}ML&NO1i0#w0Dmyn`*ad0?LV$%HLGP)W{)&%hYjx!V6>kA1 z={QX5#}%jO^<*xo90lvo@Ru8i3ynll}m@2I7th8AJ+BZyQaK&h*l;&4*v@%Zh z)YPndqv=q*#pt`nAt#!Von2IP)kMG&9`8GFM-6;Z@Jxl0V9krGPK=je73tJZnHIR~ejNsm6v-tf@h*NJstb2$q@;G2s{)FihEV^?jCVxwt%{v6w;hnQps_ z;pWtGWY@%QxwEj~!75A>!RT8{}xCN)}Sgkii%!$wD3)cYGZ1 zy^4MYcF?ShPjd?k{r$2)==qGj+x_PS5b`(~J6IQ5n49xBT_;^$Ha$!j^f1429bH7M zRZ&SPP0r&yi4+U5yeO&IZHOCOpuTqZAMjI}UOsKt*3>lOh`~YyV^2uP;rYsJF*T$a z^I0$;UCwf)@e&2x%^wVv)dtmDE44C|Ay)hiSn8Zz*X;W~Xoyq{M1iRWvorQ(FAZFn zui^#F&d=jHasMc)-2%V-g3<7+$I`O0L8@8PyO+$yAcmwXe@E&&I}ZslU!r4UmgQgiSM_CU=)IdW%6M z253n5LY`}A+`4)5xLcxCHkRw-ty3RacqrVhg5r1Y2*7)OgCQ&$*wWI* z{}|Y$^dCgqc98YALPglv^SC%UwML{unIAm3e>cOK*%*RQ&#r_s1Ale@zBx)gNZ5oJkVy3N z$3PW+@#1rP#Am=eaKF&JLpl?xrr_^UgcTHESZ5^Fw0&H#oH3k)D2W9H3P~o(d*#CV z)KpYnYeSEt*9cz)>*`W@obdNnIq{AeTk61^KhW&{g7Wv{Rfpl>{x;Y$S(?tPO43i8pnB{5aXx7U)oUY9wB)Cn-tbeG}=37qB)3 z(p;y+>`61GwUDv#B5)V6;SOBv?7i2cz@G-~MFp@>2rjkYugX6AI?rVUvXWPV7CKf$ zOEf)z0`i`F%_4$>kB{OFGq!;wj|+Hyn+q7v@8Uyxvr9{4H~Jgf?z{i=XNhFhNh|F6 zC_dX57zqJibZ35PthzJX)f}zi2+mlrfr1gJwQYC8!)ZA=wFfqL(=Yog-Yi<4Eu9aF zi-B^5_M$k2&UmGdJLgaUMDOFRpYx54!)}KgZEg4SSqW30-vvJa1vxqO_6V;xMBZDR z@IBsHa0Rx8wf?F0gnUYD)Gfq*ot)ElZYm~b3xqiJYC@R82fPggJ#p_z$W7VMrL+$aPUfIS-NmXfS$B9yoDvTkCO3>@# z&AI;HDchyjV=9dWhUdr!dO(CgEbGRN(AHKagvaZ`M~30mLo$FI_1>Nv8ylANg6}G{ zlU2u?((yfq#!eh0YfQj6o`qivyuKN>?N=A^6MKZ;Gmf+>fKAY1wd?G$Dt#I`R0 z*{G)HVcnHD9e{U!pq}>B@~GT=kkIS0ADne4G?JnA_V&2g*adw-p)Hyq5ps}2;4Av$ zU*raJ*MYxx;@rI{ZZb)KO9Zg1HzO4)YCp9@`9QzHL~IKF;eyLn8N5E>c^UM3%!CHoUdQDq2s9`BL@QiCkM6pVUj>TV(TZ2%i8<>Q@3 zohr|?UelnUeL+D%@#II)f%NvGAwbGvUL%i!!h5jBt*HtAy-fF7#2egc;C=wx*!gzz zegx-t5FCH_wXF_Ve&yM2gee8QadHG8=$6~k+x4dHhcU{7jnB$%$JBKEI?*dG3w6wT zavmGH645SynStx1q-C!AF-uE#|HtUYN$%k2*l~8;78d3Ps!NH+F98mYp~*>VD$ zrTVA8K6kqpu9>PRJppEld&J~H3ztJxn_G9k=b}s*yR~hk9Zp=O6Q)5IeL$<2!bHPF z!}T09G^WZSI)P4Z|%7Zd%1@V+!Bs2$h0G6Z-3JF**reKu`y9$ zchJGy$-Y=|`0;bKH4HRa=+NmB(FZXU++h1}2Jk#R2^CEp%Fyk$XKuWq`E{^nT~k8K z$$1TF3ijaP&k%pRa#&r|)^6Q05iG?ryYa z}hWqG%>oY{amSD9?1KkIo(*~8m$#mVf^8Kghjii?>tgMd!_#5|`6oa?r2iL;U z(RAJU!D&$^>lJU9-!d^$l$Lgo93qI~4XpI2>@uld_7!hzA|t5vT*eDq(|1AyPs-Od zRCCYjOYN+zCcfM&;;U_j=>nM@EiJ~GBsCNIZV`0@3*~U2ogEys=GAI0u2Q_ZW!4^( z2Y$N4?OAFRBu91B=#P{AZrWTB_XLJFJYlTnbmJLtImu1(GL&{ZbN75`*6<#Y2R(Z9 z6J=^PL}=65#<$^9e0+iZa?ar5Yo3Na>JWam*}0avfpcsh8TrnmnLy5gO*oMc24#IgDS2$LkO|k-Td9iux@FW}XPL8sM@O@PBNUe-C97=_HCCg?zuwo?Wr`gwBwzuT1NtwA06qnDE-RoFu;oyKr}aJpT#=lbEQ+a<|Ms)Xya0Hb--hF zg9;UC4vw?%IF<~xFv({zT{Ni4Yzj$m2bL#-M9l4uv5^t9>7z)Q<-PE>Sj$tgpufq^ z+MQMkFOQ8Dqsht*3&*Jkb!&+y>8XZtF&uxD8|(9CPNxlbq}-L$?_{wxoEoiuxATGZ z1G4|>;z@#-Qr12~LttY;-HGMXWfmmE;M=yo6lboJq?ifDK@M_<*ha%YMs^VM2cW9u z<+|Ks2-pv}sL9#_JUkz(_lqa{9Pd-IQ|8hV66Dp@-$h22B_wP@?E(n(=8cH5p92C9 z7yz#VR3dCVyh4^^W{7h3Fom^z`ShuN_BBdkp`xaO0*Ww&AU`%D8OrZGx|`rXc-a`l9k!nSA40*$5()D*JgF9_r9>)=!6Fm z1F7^Zbtf+ctO{$CgoF(*$15Mj#Kge5gb_yvsy|_L(#82HAMXd0#L7wtv%$g2z<^gU zo}8|l#m){IZ)IIwT|z?M`t-GHg)lOuL=(KHJd{@I>QFNVVZ2A6bY#b}JuhqIXvhBA zyQhi==Z6%7*~heujB3mzkJfr;4#9Nk|d(4t)2b+E?p=@SC?1ep*k>m_3y9dX`2zg z@9fMZ(kdzr8qvQXsRd4W*Xgw{5fPB?9m?fP?!NGR#UK@`%^ITlc`#AguO5Ij8Q7IbrluAsb;mcwo*{U zV)<+x9PDgwLzDnN)eIT&m(SwSnD*rQX24Z>; zWr2YMPx@sQdY{!mOaYeBS|F*NfIT=PO`Ge%1mZG%75uXFu% zopYUYbv}Q6I=$!X{dzve{eHWLT&ldvis$#q%nX6v%irHWC+84;(-pK>JpOhn_8?h} zdueZMJPd=bpkP~ZF+E{rZOO~ezt#IKzCl|m%72&TtCS-tWH-2AB77OPPa@Jw-e~>w zC-)bn5@~5^DjWs@mpY2h3q{9CTfm6l(Gi<{aowpsV|BiW;x+eyyScf(8dtP$-MWR- zl>~Bsc*9at8}i2K%plsi5!dJMOmnZ@r>s%s2b8tv6xyEZ{zE0kaN(^HR^HY`ki z%iW)|jzPC}R=xkm8px-hxdL~n0LMQ!-x zqW0k}u)f1m+Fn108Esh>ALJuA@Q+{`r@If!hdwG11W{_NASg&vHt8KDOWFdibw&C6=Ar)7$BIYU`_) zPIvnEANLxX+Fv0zT;KMbhd8cmb)4pC7} zO{!kFBSFgB@@TCzcuoA5Dc$1;|pSeW17L=+0wh+T$O_+T-K16mY$C8huM5M<+;2-e2WKm z>>$4ez?Ggj@81R`kBap_N+bE?`^gUfZWcGb*F4()+uv^ekMO85L1)u{ltyzVFa9en z`v2~qo^lo>ekZ?e8hI>98dT9c>u4kRUTTsnT-NgR!L4^8B4XLRi6pGXA~mK|S0Szu z&NGxtt)O|)?jRo(lMbZb=FLGfDthtB->$iz}?Sp=fp2yU&A`ymeYCWJFJ9C&^!#g^q#8+NkkN)+r=-O5$Zr2q-70;*;o;WJ zo1+_I{ z5On&T<}cS@8EgqPR(Da6C(Bk!%FOwtRFy>U?XTx%X7>1&n%f=VG5G!BR20dZ_wQw+ z6>k~5?@F$7e)iqyigZ?n!}OOkrp>G@J4!S@{GB7d8A>60o{&)0=l`wQ1l~-vG!o$! zdg9`PiK;w4yXavD+;SIs#3&u|gkN<=yq+GE1ny6>Qb&*O^n3Vl_d`0eO+~KTcZ$o% zV4dHC3I##4Cqk<7^xWCl;2zV0hz1{z;Dqt%gPhOZ$43MN!^?D2NH8qao8R{D_s75_ z^1KlDt=d{y{0BQ9zjc-iaT`dr+1Xp%f@-1fiAXXcMWz4ePi^PVt!B+8wit0U{cLG!3cJFJ zsiLQcT%f+5UXW(;-fb73JTd3+!96w_Iv$g|Ob)^kDjX)M&-t$FKPvCzIp8kl6U1W7 z3*H@%Z)xxCAI*}eZ+U4Qg-?dnux@!9y)jc#;dqbDfQGbXYAeu!KnF+%ZlJs#OETM@ zZSt(ppIOX|P6IoL7G8aCNm9|*TvSsi#lrS~*G-9SqNVj?#qI+tW`2Htbq<FVB9*W z;$71Seu^Pg>3LL2KTZT!YIB3YhfA5pcg*5r&MjUjsF*PpqVa9pdVr1&0uH>djRsKg z?3S_jo%*K_`mxgPB#fY>!VkY~t+TcLuV{%ogpEv5kmKFs-oD$tebrhLsHoeP5wkk;=;OaqCB zY>e`;XU)q#rMfV#^IcQJP$ydPpr0gzKii&%pKm@HkAX5PlNW%i6W2}B)mZjCD%A~S z3BHUXw0GL!$&=nE>vHG+y_9XF@_IS%VG6d{{!$>*mbZOAc{msj`H>T}KE*hZx8mTX z2p3{zV@r;WeNn1g6CqNZ0mBvgRZ)KamW2feE-uP=g%iOMqOK=ToHzo+L{^pn8ylR| z;YDvK>CQ48){&Q&e{*KxAAQmq^}`D!ByJ#An3)7ZQe@EobvNj5B@guN)YJq0{i8N7KYpweb;XV*3J#mGz%vxP=y0(}OG|rtt~E<~6;1tm z-GZeTGjnlYABDUhtsjO|Id9&;LKdK#0)!n4J3AXce|Kl+t)aRSaj#wt6pmh4fNJGB zJgm?UWH}yiiJmueW?Fg#q zC~)sUsYXXfH#55(%Qb%yzEt+)3R7c+XTclhJ&5mGTB^u4d1hvoKRvwF)6-K&C$jlw z8JPd*!%=&}<1{W=H@ef&ksmD0Bh1XbeH1FQPHIUR@$rH@JnZ~`aLe8oRPlT2Ha)M= zIZQon-W(I*S~<>{2a1JpiV9dtc6KKTNQxN+ZSK_=1hJs0f^>c}*@`QV3di%bwBMDN zkK4)xvTPw+5p~tYMtFjgP$v_o-nXwi_juMF=7M+cs!K~#v_Brqf- z1U(q6j7=?7m~v%iN})h5C~#L%Io9OEQh})2hZlNBM@8IL&gSHVXCF$wx!8a{9IMHnlVdY#!`_Ys^x+3{zX#WLXSv4cxm=F86|4l!K#sp6xHMb?8G}lT*5yTvsh_ zH%cgWF0C1p*FDVkRap^qx45}{>1Qo{Q7X4p+ zvO2U0LtFG_c>8`f2WwrAt?Rf65B!WS*{t6x7iZE@7+^KNjV?8JAZLd9W~mx3&yns7P1RN zL*kIYKY5bRzz})r)Yjd*r}5tvgP%b9nWhW22N^&D_IiB>;ak4_Z5eQEAz?53lVWi7 z!xHfGH-3D?O_EKL{%&N2dkJ^|AowwEZ`I~TC$}0GLqp;bV_3rMe}!V|>J_?Ftn_+% z?hx=Xwim?Pzfp{{pIl?+<=sWxr(|3&*}I)pE@F6K-)6%4*U1gCQ$&KY`z{!D{ThbH z+*#4}!n;Ng?V0N)c~AZsmdOOM)({?UtM{wJmm9Hn(AC=;7n(x9Xc2xkpd)j#uC8tk zZz&=oa@Q`+wKau+08+pMn2+?5FdaSGlu>{q@vb3$@;6De>)z~!xMXsH1F$6D{bCe^ zfIya#LDrd|3YWp^tm(cO;@r7&-H@)~uC|F_a5CBupyQru4nz;O#03vZJqd1uYG$C2 zUY))3QiX045J|a4 zdUC?^KZ3Sy&76TI^J=q&qVYcBf@GPLFmeAAXmfC5+FNmI(bI_p{7v#~px`n@AAfxRo$&{AIh=Wv4_ zRFx0}x!bmWQU-|6>*dQf_;7HC4-UQ#cPin5RiDFjeQ&8RIVHnlhjju-#~8JSS)N>9 z{UfrzI%#NY>jz?JO8bF};iV@{Oz5AETTy~5V30}xn#M2t>g-aXC#j~UCXMevN7jZ9 zS1rSA_}*4ZV5AhgGv!_n$%NQ_AKnqj0-Unjw}|e+ny~dscA2R5C08o)C@0e^_IQA$!$t;PJh zlG57mhHr2vFaGrM$F%rWc(`(6-DJ1B(XZM(fL^UzGBhxNQO~sC;;iY)T`d3c<1B+e z`lNKVt59fbgje$|Y~DUtu)ZdQxq$MA6#=`kW9{OY#=wg2BgGKPKtp5DxsxsUG9`ns z&F`UnsPcu68^;C(1(oVzu254mgX_+I;K_Icn?b|-WDc6UrMl+b`F-t{Eh6hH4MD6T z)jhX~OR23AotJK0VYMEtHpY-%2cEf|pF(+Jpr3CWx6Y+tk$xY2>oL8MAaB~YY}@X# za!TNlB%?5t(w-Yhhv=^L<(b!5`Bb-wiHPWpHf!yBGy_=RPD=lOZqMQgO_!qUmzG#f z(Y`zfl#1$U&^4R274N4{nc9PzTUx;4V=T;ZUw3QF*V|xCQBX2;<-1m4Hdq_J{30fX zLi+BF1cf*y3YUT+ z+A2i|hojEdr=VCQ&dkjX+&+tmG%Sx$6*>Q^y(P_}oTx*1D{A!y;>}{mMOG_6-D=0p zLOfVtvb#Xb+wGT%Q{?(I}ZlJU@fd$ z0(s*nti(=C%Bvn1vFbld2(PbvX-zd$V>dzLlbxMC-p-HXK}oUx=?Cft9d4s*@2}8` z3O~GD3=4xybp74CiO-%j78VjF%MoE=31RI?tEw=N6CW3rmUhtce)Q4_e?^znzE4I* zX7a#&P0L-|W?W|~*kS{v4Xo*cDnxCJEEN=_9UU(!DUlJ--sa{W0xl7L{ANgF`+AoY z%bgq@TUuHyyYpuw*gTH}oq_5ZCyX(r2ya*S`lPu%HVmw$Y2o^?0AqhbCzv)`@-Qf4 zD@U|qa6|+Nf$29?3z-?pN=ll!FE$ZaTs-m{*K@81Ey-?R2B4|s1&3?y>x;jx6I*uf zl)g-R`4*cxS~~@W-Hk4|OuA4KxruLM<~3{Ji& zFk5!W(%IQreOZR(768}8R5j1`z`*-I3=)qVIbvp75A5@9=KG|$En!i<8PubnI>q-h z{?PNB{`BPW0?DDjS^#<>5`xifVFE0tBxOzx4zq^$S_$zMEA#D>G9mfe@m9M22ZA*CTB0=^bCH0&j|+}*Kl+taEr zTS1Yg$gC{Ks^@;Vk%6VAy*w8F;>EcEf4j*px!|~bLp0N$k|z55`Yr}vIdLM}7^$o* z((x&CQuIs@gbE64J2iN3RqC4-S+WMTW?J$Rjg5^}16J`Vk>bz8!YF`rss=J5gW(W0 zH8;%cDL?XN52x>C+rS_dTS!BKH#0x~iT&DKn<*E`ISUJm>(|rM6`~c*TW1nf=%^VO z4Aecl%=j|XVteK<-hSpmtWP-2($Bp;=j#oKZun$3r$xtCF*~!#-@{RZ)sEE}M$a&v z;^R0j>{7_+PM4JUOszdm{q3AmYO5JMKkYQY(>l&vAU@xT^0>T95hXh$(;G^%qWpaK zWWD-PjQ^es)>%y9nfPX%Xnb3pl=V`V3I|;LQn7X0OshL}61}+t#K$-@B zzWF}dwttI-a}UTZQ&YF4rL(k`mCRD8h)hLJrNO(U*>l^(1j7e^7Ft@|P?X`plHLeB z%>wttbGOx1ouKF#93*G@Y{xnK!Ad&mqU8N{a|w{fA!?i$sr+hRTI9KZ@7`PO5>ekt z=mutJMs}i_l0OEvEWyOW^1~t?p=+Bq30qs8$k{{snrrHhzkrj?WB_yD^89$;#02cr zdVlOLCV-Df4Eh~93fsNL=P7A|JB$;C4&Z9lvTYn496p;H^7CijyZ58Mz8c_UfLgG2 zUs`Yw5){l3m?1??Z`uNGB~-6KVGIru9og1c2Pml>rJkv8;2ND196c-%`L$DItk6>f zORw81DxZCPe3Fy>J9AbNb904%eRDS`fAX63>dUh(4ttv5bzblFoy1)qCOXS78Vu66 z@7O_j{6p#FgOeCft=>Y}#RK+V&>6+<>8}CI(8(-4VcCj_Q(W9`Vq|ptzHQNSEhPr2 zpKqQ#v(-hE^5>*$xe~+Gq#I#ZBuCq>{2e^nj~2;jtJ*8fF-b|CO8@fZQIU3r8#9AA zl|*EiIY=qXqg!8H%T0%=Sn3lgf^Er}NMkk^~K#a34tA?)}?|G`*ujO}(`0{(D5^FSKz7)s)_F@9q0pj{4E_#=0vhefIS=y?y)A`dW$|#V3_S!`B)g^~&W?F`>-P z&lfdGXXWBzJSPf)*wd%&k6fS>fY<-)+^A}|d%;?ZmOsocZ!Noru%=G=VcZzIdpw$X zGB!Wov(4bMPBH%>K9>e@e$!1=OS3V!Bl8{dFuba*;0_Le#Z5Awe`Ld+({mCukV6F&9c?>u9fQZvtJm!y_ zH_y8FmTa~Aju<>0fH_Q;T8Z!elJNbikLSJg5$=pDdyG6(6Ta#Vgvaj>)W)0%g-|a4KXs}-T?Fbxnu8X6h z#FxVAY7U|p+??e(UsDn6A17LpwdCdNK-%1B3NR%B3?V|qnd9gHhM!|Ui|DVHOzw4sDkhW`=VIx8ZU)SveFUL-h(aPz2AT{zB0d%uQ*wGyXcJ1|h+{E#PI?Py4dAEQ{3 zt*m&QQtMg}i}b^HGNqAb3jPx!iY_m|{X&gIoO5;c`fl`z^Q#8dk=GjPI1N#+rXJD z#j?@k5J5&phHpK8eJ%der@P?Mc#>MSr&jdcVUwk!B+%PH5Eguig?Reng?6TU-E(;a zfqLU8?c2*J_9i-dV60V7%QZbEiHyc?Ns>%lh2uh)&;~CgwmPFp-g!~{NG5|5%cIeNb= ze)aW*zc{;vc)}?6yh6X(E>BYnddO?nzKUh zf+0584%=yjY4;myeTlp3B3fYCePG1fUs5kdllF%fJVqtDhlzLZZdz(s!_4K!AVP<& z>~`7LqRy5vR1fcA&T3AvGXVZjQ$tU>Dj(IS}=Gv}J$c7D8-g zDk^;%QY1##w3*j8BWb99W*XE85i?2Z_RoSlFV_vtEkV!CC}6d1W8!0=-e6e&ZZ~ne z|LgS9l6qCZ%a{FH?pK>$O+;)4Yqf+pCo9|Ky*)(GaZ9?9Z;|$o524u!-OR z#~J)V4`w@lJOn>`iZ|#laA~(XO+9{G-R<6Ons@A3TH52lKt}NCFrlUhbS^yRa4YoCh@(L@~^wmqzii{#oE`KJ(V);PNF@x@KR#9<&M9NP-Ll}5^{?lqEmqyG z_7{zej)_x&xBSKX@kL+Fj!y&27F&-WH|E}e-a!a;0B#}e)2arkjz0?*q!`01dp^dA z1_#&gWea3ykKREZUZnjl#*p}YGwGy*V_c|TP#DO>dy)>r;flk!-XP5VR$QZ}zBeP64T=43KL?3X|4v-^S%`!Su z{6z)lfPyQ3LccPWx*j25{j$b@ow^b{7r<3K)Va3ZbXd4O14q9R?+Ex$f`WplV7+;6 z5SrN2k;RTVjj&POn*wrXH18+{mwgy$2S!Fl#>SvGIdtfdYN)s*eYm-Jm;mmh(JbHmve;t(cH)5GZ=H0t zhQVs+c~7d&yc}1B+Bh1E6}zvMl?;4ikxwR5;PQ)~1-$Yfot`~S{AyifRK_^D7n+ei zQu4jMOd&S8dH1#8ZJ?>pIJmEtjJW*`P@T~COJ zMAe9fhPF0#S{QbGmO>rWekhdbLFMIPDMnWl=dZn`T%Ea&?fZE{uk4X-_2oKgDzdgP z&GX@=bY!-I?*jR*E0tAMY|?<8Ol1AiB=-O~PmvyARB{A8jDK8h`n$o;R_9Guqa-$w zl+SPVW7?9`487&&j+5qOqkvhHdwH7u3f5+kw#w>g-u#XPcYL+|`M0w=Ce(bQTSkut zetPvP7no`EHLO9U2B}!PrjJ%Gv7Sb&&wb#)4sr-EMbaxEaK6GKJ+tUyqO%L5ITz9O zjJIO`xdpND?B032@2b7em zCL{ase{y1GK49hSTZ#$W^Wf|75ZpdH=0Ozv{K@2buFmOVV6bG=K>;f(r=|3{(Uy}M zOS)mMP;s=Hfrf%+ePAG%OlNv}dh7P>yL~VIp))si%Infik>{6N-Y?tjMEYi*bYP>I z{ow6D7DwTTPRknXsCSTuCZes8NV?JY>(`+JLzDgeB_KF)VV`-7Kn8il@rsL>$E?l>Cm&t=RSzHu77%XZs`-0f7{~JlJG*dZQqXk zhKZkU?+@&d^c|RV(gzj0RF~(#yx}SQpD2YR$6?d&wQ?jO$wxWgn5&SRitGxVtv;k{In!;;nEUqn|nqj9Y`i#Z-i?~Fn@wY8vEn2k_&R7r(H`Q*<;e&C~ml5IzTVIw)*6* zJNsQG!Pzrg@3KhWoez0Z4ov-@-@hL}JotM!h7nruxV~EVUwuN;G!LBX7Q@K?p2M#7 zdS^a59j4vcc5|qaS#X_h&GM>-D#vrkH30&rTFJYakdks78ke|4gbF1mRrO}yg$n#Y z_+@DfT93+f5gw3h+E;5TFt7Ww2njk;)DQD|$gbu?#b@8Wx`ntFBg$(t^iycQp!-_q zf1mj7hKwup3VcWXXyQS(Is`BZv~-Dy-~))XdW&sjYO5s`ua~g#mWS? zQQg#Z-=zHP_Rd2=6}bS`B__V=%%N;)+9!CH42~i6$@4aU-Js{0S z_ECicLpv0#lnDL8@|wRn_pcu8_nTs}|3Iron%2VS3jWULH=tGI|34Iq{of>N)e*aX zlE7~1`{+^d<;{MQq)>}N_5~@+k@EiFFx?m<<-bKr5rlUQdKw%5J4 z&nhS=K!hrCKoYV_RaNhT0(8wxVKw>gY#{R|#>eY&zrX+qS79fVAAsaQt%K$%un}Y; zCMKq1$3D)+;HGx`cpR(^S_NmJ+n9KG=-(@vD%%+{BE@6R1W**z)F`ojebQF(q$gv_9VMK2$_TBOM5Js`anh)-+?^n3!_ctJ)d`5o_J+AAZd)NM|z9n6bmc1$>6`nR1gAl-p z4%Hx5KSS;zE63U1(&SIAymy%0^7!vBpfe12u7{<)-rIjcSO7N2 zjT@IK8AaWO>xTi4+`V^ijW#zLLoB_*yQ=Dy35m#$a<31JSZ3v_GX0#(pl+v6X-&L$ z?;dc~=qWy`P!=-O1FVfLn9=+g8%T4FcR+djo*LpMNqWM=o$2w~s-F9r;~^*z^H#QP ztg9|uI4}o^Kq^G874LFcQ?}C^@AAp`41*9c9^=%QJZFyJ80ciEi&t64E6MEBUM$^LD12Kdl-DyB{BwxL6)d`l21!#8qOaMg1-V1%FM=~* zc{-FZvJphD)SwoXtqw8D%nUfVgi!btqv?ar9hU;EV7$EVYSx_c#No2ypg|fi zIm=eMU5DQIkv#{)yh?q+<%5q81%VP3v|Dgu0Mf#Oi?0~QOz5^99R)(Fc5dH}b?x`j zxy#XyD)a>f1iH>2=J6_G3duxiLgU+1$3&`aoSqGPmRHdw^BS15y1LA7x{lm5Nq_(G zSF%^ONJwSwcmrGv9M?D|F~fzawGoVX4t z)j#OCop0J_ZlnA}&4A_du3ZxD?ph!YmgCJ{@D;At)2QnGW8 zF1&>;Ec%eCj8;~l)sl@B_S?6j)AI8x%FCIL9fKmQ4tb=mu9G5u*R`|?0L_R?i%(2^ z`$3k5Zj5oy9$}Nluh1m58`#+hYN)A|mHO^ah>vGK@$PhJ2bLdHKPQpAr1Rz8yLXWp z4|fnM=_7iA;raR%z9)ib7N+}-9_2SRz2)hdk9feBr*B!^zWr1KfqDH1+>wR)FY5b{ z%}Y&7q?rxYMV?nPygolE<}zG=)ZKmkPnYv@!MesZRaI3LhoGukQWx%BjSw~-`*F(d zpl4fKHj*RZf`E;{I%}-1?oB9d+chIKew>}XJ7Ziq^h%lTDH)lg zF8QXKnq8o?vr|pQg_Ribu1^&^<@^+&d*5n?h{hG1*svY}=ubhuw2NNQrvBYScn$1g zF!@D)n`<+yc+p$wNF3~@u_iDzJXOe&rIM_S@jRmoP6c_lXl$UAb9y_MLgy%VQ3Lebx;Hh2sHA z*;xX3*-}#F9GbaLt5%n{fr1e(WDg}QGyT%&?jmz@!PeO3y)rZu3&{tphJ{N( z6<@!0q#7oNg|%Z~nU&QVGA`yYH5GR)#+Y{rwT7*T+utip;b`#W z98*_HpA><7s>PLAIWI5LB&5{%B73nIh&MC)&qZ&#Q~LG?ToT?8`57Bq+_;(l>Nt(i zrDz~-TM2RY8@Zjq^2c!jVP(Me;ikZ${UN-%B~N>M!`d_Qz*q<5X`=V5qH$BcD+QFN zF<-tU-syY)g!as*w-QUMf4VoFLkWQ!i?N2JRG_|_+cXYBdF2+EWfulQUe`vfK0}60 zS6%^wfYrH3`K{hxzJ9$OpL&i7002}S#X)klrs0KcxsId54N~Y~nog4c&6J4Eluwv5 zNsq`yv!W1(o+V&K3S~B&o>YWv#1%f;$=iw>!l)owdwKyYGcXi0$)1LXZ$I~{@G;$A zEdYgw;cHh_R#P(z3x#9PaJNMd{qoExMnvs{3YfKrho3Kh9Lf^#ES-Pm@j+{nH(CWf zX!tofw?!)+52}!Tb&1?VI_SMd-b>x_)*nC8Oj{ygLk6Q4(q{HG#Eykse0z@2)X)eY z|4J071@+ zKKf#P_O%>Q`2D-s@!?2BHo|`8EfMfqi;7N|Ao$GN%-R%Kw_dLf${d;>T0w0X-IyH43>#P{MIqd!opS}^4PIsuS8w>2((L-8D91b z;wp9%9a{GS83 z3|Pk4gDc;&W+}!k_4qJ)c`Yw2l*B8IJc$ad&{t6KDlT3g@60Kv+2!cC2$KvYfpm)4 z#AhdPt}14Mlkwt(15Fh@fo)1#r(79lj@>x_8C zWG8vwr(2d_IxT;?m8^W@a-8#IeRNfRzANz)Dwt-#1u&6LCefZ9d^`I zXuG1@XX)73z%Q5Dzu(Z!=T?vr?;cncRZ@EApgTgVyXWC1Qc|&{p{oR?2-w|M<~KLBMHTNP>4x*SB2vPmr_)}`_u)gDZI*t*=50|3vRMD)t_2lK*W!>J zMnsYFh}&SH7Cd`)3+~vND`XgAWSX@eU=$m{V*XV3&9Q_PLGD!VX&#VbXH_(^-ZyG=IL09awA) z#*gpcTl|^OBc_TewLZ4aU#wYl(HuRY5S|9!CE?KHtt=wkVcrhAYPXB^K_uZSsWlwL zZ4B-sH_kVysX-wj`@y{!z^-hbGML9uHl0(yw&ylR)W-t)P19e_zkU0hrt_48y?yz^ zy^Nm@hSKldyLn?>WNp2@=|>}rnEToZ;sWv^oBe=u*hv|a;beQ>$@|fBgwf}oKV4c} zd}m=wCu8rIftj)=e&4=vHIB|Tmn|)2zjp8X{gs&q5LcVySHUyTd48S zu`Nx&Zn+H-kOKz~ZXzI-);QSuXsq#8E)T+@Hu!2-t__YX*7UWP8a)-_pF ziXC~&EjUImT)6O2CDU9*^HYCTT^*B=X}q59TO>Q0t;Wb7gZ_-v<34%l<+(q8^t*ST za$md0t{e#Aa>lhg&`J{x@CMr-wfb9Vjmp#m0E}s$jSz)zhck zv7=F~cv7<4S7b%cn747XmtNzgjcrmRjubtlNEkXRUP&?d$kzq^uuZ(+;rNA+|Sw5`Bz?Aun05%l3iJ@`W(tAVmv6FzF zq$C6J?)`g8THdJ$X3PT(QY~ftfJ}IFL4r7T{CLhUokQZyASSf z+3*iTfbH^oNE+HJlW0xs_G-fR5DxRLF*$n#{?82#GMm=ty%RJj$m4#QaB=xt&}F2g zNJlH43grO%_XuoiavI?sd<{0!z0oldYKjWqvw8Lt)dn)7o3H9ln@?6nefMZnX_+e( zP|7H^xJ{Uhse9oQ@L&}ad)>Uf97c(l7;F3S=`j}8pu>9v(oEjd=yyK4kkHiB!cUyD zwUx1*tC+v9m|#2Z+ISEa>7-xxss>1qe`~BPIbnx%-47o~Hn3LXdjcjVJ_vVd6o}Vf z-WXT=5%SlMCdZ#JNmd{2e3=we>!jS?DG#8-;lnAwgX;8rSyZZmE5p~9op@!|-Syz# zmVZe6&rkEiV|E(qWla`$(ea}%OI6LV9sM(YohiraXsenwtewl=`!$nezp7{dZbA}k zy9LA>tu^w^<;yn)A}6+=NP5#Uy7h}2L$!ggto>v{VfG%Sa>j;X-V+o{UCvw^_&|H( zF1O|24`kw0gUx@)(>DiJ-D*!uo2AcQUb2093GK)gR%ijgn1wKYQprxc8Xy~U?HWSO zO|M>^nSZ|&9TG8G&2N-y3uZ`P+0F)|M*tqj$tP>cZI(~eT5lEc@%#7f#P0t>wh@+! zj1l5<%t+ffD=lPC5|IR9VlpyucAIn{9`Wwo(aF3&ukE`WnU5UlSlW${Oit&#ok0~g zwmY$F;|m+NzOI%e8Tr)q+L8PBa=s3C9PartVAa`iljKb#9ALb5XVUDx>Vv}E`XQiA zZvUP=x(&@`AxB^kiyjc&-24*R5gRM-(8LN03BXF{oQg&KtAEYj)Cebe^Fg+GY1c5# z;lo8Z1^%H_f+7>letcj+k#JZVW}7G<{yUACdj_G#TqXNt^^58L>QK47sV@oJyx)$J z-uK?T_Z|sR`zq_UGIUU5ZLJ8+P3}mX(|J@go(nXHTz)utj@? z!|eMDCz7%g3fE4V@v)senHziTYD{YP=H?C#iaI-)O}>&*q}-Sm*^f)`)&v^k6dwHizc*%ejGxPE-!~HhOdrI2d zm$QC7zgggRl50|ObQ6|28BXne8bXdU9yd>BnhUrrsAy`!2#C|S?EuwJN}{I5z2L`g z0vahGj+-6^$?p%aEB6J^Ojq{{@g^%PZccgc7BZ!QWu(#uTuxC97j?}}Q)+v7scj!M z_3x6sa$0#WUxgUH{!U8V9l9SUd*#XjVF!ZH*VjkZ8p+e-yo`6gdVfE*5pyRFPYATY z9D&)$vg6pX<5_X?u_SL26NO>2vY7BoOr#5r&x>Zvcgbf9pTNu{J3*s z;(4ird`c)#7UFW82LWe7ro@IJvCLWB7mdsT#%?iI)*hfhR*-QX9IOZu#q;OW&V$v%>)*Om%cN{=cCI8| zd5s>kq%6oNF*Lm;mG=CpwUIS|9MzW z&f$A$g|oHm&}(MBKYywl?2>XCtkC2G_)S35yFCI`(|Kc8prr2|3P4 z@9w)J&9W!>GN^rTPxnl-#3n)4WIMt_{K%aA(NkQ|)ZBb0>n2|qvy-HdP&+>5rj}n2 z>SaT~Sl+kQ`!1r%9RExd>lAklQ-9gbeAA%%1^JtU)V$LZoy!^;op0YFH|a;}FE);q z<{apoj4dp7z2Vg>t1S25OQK!>ZtLU=woU(phU1tz$0T}o$c84o_Q<{KpdX5ez>Lex zIWd!iQB%6Zbfp`$jNG@MdgAYvkLh&bJCiHVAuP5s74f|ks1X(V)u2W1`$32V^9t#E2k zV&KQNn;|1Ro0fRap&Ae#&U_h*SNqBP+1XFZ4AY(FvY`ipO-fZgr^l9o_weBsPL5Yw zw)I&L&Tb~&yf>iRyVs{6B_+jppwbo|rx|`x0H^y_7G;>FoOD!M+ntd%@xZFNG40p1 zgI8V9w_jRWR{My-Z(4kJdU*+Me*1mFF7kE1!R^S+J;wwWyzh{`tqmOsyeQwE&!nPr3O(+U`$J^$1;(m?tvFZ%9X@TJH)8BGZUhAQ=jLiQyDPVZxFcBsD!1JP z3k%Dxx4hh7Cm>+H=O_2JD(jLh-Mg7rE(#6}3p`|LHJe|WQzx{)MY!I(0zVH4Y(|-| zGdx-^31a)^;!>6$@2qvnj31!Lzu)q-!t93$N-s%C$+D)Vi{d&-CFco*ui);(BBrXM~q`#@#A3S15l3!I!uxTKJ(+5G)GpuNbber6XE6SEv4(w&{< zhccyi`ZMSn=g)5!a@<+m*m#zu|53td&!Fxhq#GA3Rn~#!me#ipQ zOY;Yf==k_o5fNQoUB|h&Mh7zt`Y*KvvxgX)#D6!^KYyOo#S{62fftVG9HP7kU?@9# zDo|&}CMG`{!1!oM3Pbv^=D@il0Uv{g?;*}wLQXFEm^Cx=Dj@0@3+-ljemNSm!f#z& zH*UOqN1X5?|zr1 zi3z4FJyu!xq(Erl;pU#1qrb{ZStby0VG}TMo43<&s_`nL9&NBzg8$9?V)Bz(BTmjv zqzlBw$JZ-I*i8KdaOG2Q@IZKYCm#RCja0aaKvg@qm!}(RWJyVKE=!}>0?_#3(;l$^ zZJQzV3NkG84Mp$-uFLu0$W_B*Dfx;oAH=QZwV;AGZ+RYefTgj90`Y=qL7eJ zx~XzSr6Q`meboIF3bY4azN9_GmzbKC=7d%Ww*PC_w!i-NTEO~AcJ@moJQWmh<@0iI zUPY$3xslPiuNO2mExK|yBVi~xB9D@R0eNZU?X9YxTE~Lf#SYH!(Cz-uh1YfX`!EMI zj$=HN`?iqnAosZ({k1~+#mP0x;$O2^d$hN;fyDOs@s2K6-=GI&W$)wTX))u5m6o2~ z+*p^B(;V*&-Wmgg_xdyCg8MLU%;Z$(Gw)id@g#MQR=qAt<>c&)2U6w8xPSj;KtSY$ zy%lfb5=@PZjZ;2yPl_cv=;>X9ST!Kvu$@G&Gdhusq@?1qGDS_dDM@x?8~Z=cLX?qI zc=hT|X6Ey`ar^(zjgjhs+c|QM5~0IXTNYeM{F=+F%k@FjU+k%iBz0ficiOTmG4jk- z{O$k#op~;-mpQjfJXq*{gR#cjw~8==U%h%AU!6xu-}Dh?MsFXf0tNrWhw*T>ua=dn^Jh1ovwx1VN zm=^xu^Yeif)Mw6I*VAMEa>x09yfP{;@`E4$`yS6RQ8DuN|4AbL-d+BEkIxJzkkM0;?f-p!WSgeN@e2R*Ncg7@C~5H-{g1~# z=YqD8=6}A9-v7tf`~Uu>9Rq5OoH%&!gy{8S)K*z8Q1?VDb_MA^aNow@zn_-YZt3@C zSj5fEIkyckJC~v+#vD1%ML@r|Bt_}O^|x2#C|7?LY1P-)BiSb{J$?Pw&fO3Gd}&HJ zjA47KR>Ykqv!esGqW#16yX6!hKEmGP@_DE8BtwivHPlRXW=<5 z#LM9kOZO!^#U*9`4#N?J97q>Vw!2YW?-2br)oKK5C#U0et?uUlPJ$h7G=>9e% z!=mar{l0zs@Z&4Ke|*=&w%}k4ea}#DLlLBN=`{8C_9~1>^;1-^4nIFHxw7U%JT#i{p{I|xuhtf>k%ryvv(d=FKp6<>@DboKihw`WrmM59Wxzz z`tZVY?$Zfa+^?^R3YxWkGGAFpv7FnBTsFivvXQC$4@LFU;~Cs4qh_jzJtn{IDo^Re}n zPBAsswzz_LT$iW=uAD#Lmu~8gWne|+9z%cJ%!KUS`X(pY-L?|*V**b@LK<3Izatr! zot+1&U1UuoDd&4bLlN2O)29m-dS!4EHm+=Gy_>Av!LJuyqmNesy36=@AjO+{D=mOXJ(LHmxxmB9(o`r={@O}D3^Y3a5= zes@$>KCYP$V7-Ch=#>QsQKBJt+ojp(9`NN$Zv+EC?V;J(ZOh>gK(fim$k1|MRh1ci z6B6R{sIvTb%@N%1#EP7GwC`kfynS2$;KA}|-di3P-`!O>GUSh4AWu9jb&UE`s~Pe0 z_F4Q~T@!e=+|!>qWU_f)<>JNbH&6cQt{dvqPHlxz_`6>Dny{7rB+AEJOWU=bAZuY4 zaaHz7p1WAD>*&nJFr+(s-zEaFWe(lhmk3kN^%_e-mVN`P8J@j+bJ&%;%q~1FD`@^| zcS8seJ;NfCHF7dlXB}rGWMu=ryhIH0z7)Q? zvF1&Sd)O`llA1lqXlw4>dqr_pE>iw&lpaDK%<8Uddsv)>;x9%{>m+B5m7N`nO7cWE zCF+RHue+~&E-flzuq^DIT?A()Ab^r(ut2BSX}b1VaSsswJgkGe3Ch>9(e-8ijO?ei zAud^1Fs!$Y*)%of`0YgssAK!z_%Q9KU2>T0N^VIS{U#`{p|L!q(3ox-LTGn<9!C5j zV-Mw1<*OY}o3zb18aq21& z%a<>6X=KyV*e(A^5tH--I{{xo)|6fD;P0y~Ibm@xjct z8}nk-U%ahJw1?}xCqMa&YVl|vWo5;{ANSMC*UqPVSp{M% z@IEqfP16Ru$2|3n#D=D(0Eb}t#!W?HLXqR+x1i;MrW;J)=Ra>#)6)x?(;7HmzbyNN zL9`78VMm8j$0|I7F`wc4gP1s9yNE+X zL<9HX*IEa5PjBg-RZ~?3CF+r%-6e$PA%)j{<&GI5x)<^g!Lp#kpA<3(RAMNT=)AM|De*i8;E44 ztOhF5Fq1tZ8bW6FD#-|?Wrk2@B|9s7@0Em%vR6j--m-p|^LYHum1lJ{(c`%JE(izYqtlP#c$tkX|-KgYte;+^>E_PEs;1h#|y*tVI&#I)7jX5(W2#8wu7K|BMaVAmV!J-=e_wGw?P-msxH+{8}+7=+t`Z>RI1Y?*PKsQ*gJ* zDjk1FxNFr*gzm^PX}YG6Q$3lw_fwT$3wZc*ebF#DWIyMfdH|}i&xHXJuB(x zXzEZ)lThD*Ws}l(LX=&lA%5)hx%21O-Hx-qm1doY_UzeoxV39x!CG86bh}hrIric< zki%xXPjApehdz-8JLxN^B^FQ zBTos(@sA(z-rn3!PWRAlekj`xkw4DN{9N=)axw%x$AzhIMJIp#s&eaAT6#J<7wq?O zT~>crA|rK-mbk8SmKM3RxQycC;~{Vf2pGa;hs8SXF?M#z>GMN~zd$8;?%YEty{oD^ zkz^Rwg~}*2L``DAiq0!0G7>)}>kZXohtPiTU&vHdS4YP(XICKQ^NF23=B>0CVu}I3 zaNoi~cTHB-1T>SpJdf;b*OxDywi@}=)jI+E!I$go%tsm@`*j9WGc(q_j-H+yH*ewt zgAiLz?zHo^AmGUpmMzbl|E~pTNq8*s+}k@VF3x>L9&Mp87Z=PZkXJt*ln%TRsSzEA zOmAM^M@D?{|0@Ko)YTnSRk5dzOPfo<^$8-$4bDMtZ}0ecwdc;3=H{2pf_79P%0%$W z$MD!#a}(M1y}PPFn5U#nBeeUdHOL(;yJ<=uksrWM}9K zszg*&hM!*(J`i>Fgue272u6v{WWlf0-v0I2SbR%M00xpdISZQ`-!XzvQHgY?s_N_Y zzJ%lDYf{pa&2{PxyG&G#$lhC6s9j&j*$r!Cf8RNehVujwSR;4+Is~K``77VKgTO)* zX!gH;#HYl?v7I;}z`+4@slKV{=(s>fiKwE6w>T*zdH2)$`zdj^)z!XPdzLXZ_36!< z#DxWU{!macW^P1E#wSow2YfdSGbeNQqR) zKTnV1owII~%+w8Tlk)ON(5OhsoGR4m`9tq%YLbXHwYFB0uMf@IA*(Mb$vh?oDS}Qt z+k3TZ*Zhq-Un_B9n8yD7KRO!Ej~_lPP27Eh5KN^8J2|=e&HbmLrR7NmGYA8$UyY4F zYijOENzGAE2{Q4VIN@6J_YK1+sJ2qE%bK}XFyPBxyVi^+vQypUmE8eXl^ZuU`z7#; zb-j6utyoIF8o_C9Zc^4)AYp8+GiTM&V{|P?J3TTQ4u~yf882SQtc(mmZ6WyWkF`Pk zWnv=bmH=AxfB&x0a0#=qaj~;|*B=4*#%AR~EQ!r&GyeRH3|1kbzTzz*S)<x?L5061B)m7-= z@c1!!G+ryqJsllz6o-CdVy1f{bmmO|++Pv$SZYiLgM))V`ug5O#CBZV)WigzV~&3X z&3R#AUnHV*b{?RQ0pny2X&WzI=w8gGz%)vBjR`N33Zzp_X2Uw{PAA z{$_E(dgg-Eu|L@v8TfyUj2OWHLD8X8dom4Q<;sJFnU(f+`36ktq&p5 z(=p1x8oaZL*MGuBKz9xqYro3dRO1`pUY|xxZ0*mVmd3`nR8$^6NI^tUYm*q0CYnDz z=j(=;H|c1tI6hT8h_AJKiyBLkBV1}E1mw+Sq`ZqSrQtM9hjc8wsShB1)hw~_2dGe9 zDd#;N|0?ZQH}uLycK0g^8k%a|Lhfqx{$$SX)ejUD8cmWWHrDzc4LKgq`&%3QXvYPl z+SJv${mR176`gP8K8%G<^dH0t!|^p;iPLd?We-ay3}7vtou@yQwgoc0 z0WZm)>6~}ZWD^ju{rRENE)_!W>9*Ol|JXJwh`5A=-pp|a$DdRjKMNdJ)gH`PBkG2B z$0{UW1Fwzw%0cLrt|>@La+>a8Ci&A-xHdW(jGST?!84jU+1a+u@%4L1(+#+Q@A3_@ z$L!&|Z|_yotf1W6oQE}w9QOx)jrw|>fqG+e?OYiz9QwUa1-L&MKY8N9sV;~Qn9$bM zwVm#H`R0v$**)}iaLir4Y!A86E@woIJ<1gnJAi90Xr?*gV$}OV^-}G#_~nukShiKg zLU(Q6Sw!ZnUvt}|x4EGq$FSaq*v=;G=?T>L3kaZK5L8!Yxn^NeWXBGNEjv36!Ed&L zvuPSDfmivIl$z2i0_V3q@r7Yf)Y=$5Bl2Yvxwmu19X%yv@I)MQa$zj#qm zv7ROj?YY+a#OyhfA#cSjb4hAzIqkaRyv7xd)j-D z9XAG<85su#c$o;S6n6(A5tQs0`R6mTzHJ`5P$f-utuhjVPIO)}ODDQoTCN|DBP&Ta zOpW-k=6fVIKHgw{C<*%$E3)1v(l4)1qafuZ99RFggwX97i0I6oCM|(S;4;HhsvZZS zJvZ2nu|~fiSrk?~E3+#7x9A9{5IIbuCA0&}%9xmh*Wuw>UpWabN&hP5TsubelHA+SKVV~Mdx_tmVAi_1AtX7%Q>*K$^m=4Z04ZEQA| zi>25CWF9}R`%L}K4pUn<3d;2#+c~d}&6HfqSTK=3bAUh?-xtZB+TipE-&0}rTl4kv z1m-VV`Lw!~eg%MJ?lUgiX3S&yoTW#R6}JJ0F{5|LL%I4O-AQSz?N0BM5;WnS15N%-yG@AWDH6BTtN zA0{n;CU}NR>X1cy)};DFnFFr#s0!?E5GCFD;nQ;uF=4GJE+_AMz8FAzigQNw%%_jt zO1rAd9Iu#}OQCNu+u9TY`ihsI9~A($I7xAF)Lwf4wnH&<`>Te9uCBmSN9eP7-Nk>@ z)q$sJ|KLFba!+5p_@*b<4shWQ=okkh+VPt+%3rwdgGh4Gz9&_*0jcmx{&{$WW)PO$FckiU-m9?jZ^aH=LZD zaG^m`NJ&KneAy4}1cCnFD|d84lZEzpe(SMAL5Z$n8XKl8TX5g zO|cyXGxhtkR)cO8758TumD>)scc=~irN&E|jTdfd$r~PSm{ZzD-qsCWy3$b}bZ&9F zIQiA9F7(Chuafrc$-Npm`XEv+ovDXF!QksxQH zKUm}NUTWf%n6!)xVx8=j8g4@1XK#;f+qcf_u!Ucr5H)*8Q}bVK@IJODt`JZIB*no& zPRuNa{TUkakl4X<=8T7%9i+uD#7f+-Y%>e+_HNI4xQXo5AXTJK-@pI6uUtezLa6?y zH`{&9J9k7d8)#|iqBv0?C@6{1aFfw*j3nN@%V=tv`}E0TJ%o$sDrTmjpeVE+ji)#v ziA*HdgOTV7FaZ#<&=Ba!jE{AF`fni&FclMXMLl~eBRl&fR}w~3w>33i1h%$eG~DMBh`lWn@sef$GB^CQ?Zsp zJAF^8%CYQ~Gk#LI%4w*ng&b(|jT+Z$0+W9Ro%1>*{zjf%;Ih|`Y8hyK_8?7SX$hq& z|Jer2!|SW7@kw_j&f2Y`{H^j~p6FOC%*)GAnfz|rV)iw$Rx{foGGY8XY$_=HW@i;~ z^?{ivb0&r|#u+~(p%hoqTXqH3e|xdcuaS}IdR4Zh&z)tX#l-~`6zgx^Vtnx{jrPA7 z_iAaT2=Vb8@~w2CHp;=~Gq~KhXl8`W{fIIF@$eX%n>$5Cb?wLzDRp&vHa2}R9)y@je&LjgeVIIM#2u)v zrba`v^j3_;2bhDw!Osy9>)$NS0e4jTvWoaKJ3dR#)eZy zMo&t&<*|`56CSN1qgvW$M~?!tFa|Ih(pV~b-Cn#XYt@>*eVd8>&~6Y)zG@0h|E0zh zN}ST2_3++R$ME;>FPGk9J9EZyyhY*PzuSNdVIlij*?9l{{kgfTSRYL>l4$_5`{D8< z?h_~Q#9w~;^y!l)d1x*0@FJkFu+W-is^A2r`ws1>WFD!R8g^glHqJW`8+7frY5f}Z zztD4ysmVzci@;jXj@s{^aR{_EP5*LTb<+m!1Jv&Hm zoa@P@%CjDoyi#b=k&&yZIfZdG$hq*UVqh@XQ`nZ5cUbJ_>(`YwHvB-42>iskTw5!C z?9UMz8VP7)FJ><+olng(LA)1)N&9w?5?0V+iHR+gy*_Pbp7i~GniA*WcD|{TBzsa) z(zaCY&m+vM)H5>P>&&*K?){9E#)NPk1d7l8Qrz0J-|5g{zUJCm zF=!3a($3?&SGTTs>+dgQJ@UZRl-^w&v?HX8Mnpus;4{p|`-gh=u(JqKu+f|$@Ct1Q z`N87{89VMMDbdk&7%C*><*^?t(Yk)!@ZZ9$uy7tPPGbB;S4 zUool16COlHVN_xR2Nc1W4125E@@ z_Djv#iEo{pIDD3x`Who+0+)Ig_`+`77x?&aL+OnNpF5XILPAA?u*6qy$%ca1A5vHz zN@<^XJT6S`94VzZV^?8?9npaUJ%rjTt3UIrjg9q$_IQisj1SrbW{TM_v9Ydi>&KeM z31V9HIYxK`{h9>f91|Qo53knfLhICXyv=wC#ALukT>ZC;RP^@kEb-^iFV!xaOm@`o z+v_nCh+g@`aVCVbxhrFJQ&Z2wIyfVH4(_&!*yV)=?Avw`rKP+W7*}bbW-PRy=kDnw zoi8DEPB-LnqtvqJD#Z%=&O6RSyD^+3vjL2%aa{Lx-~3LzzL-wpwn?k44P^Uf@JLL|f^beqc&6E7x|MT>N!7#o(H)AtuY=g6 zuaysC2^>+e{mS8LDEa=KbKM6R#OcmuD%b!-#tj$k2Bn#amFZ{C{MnE7doiizZyOP~ zxC9ESN_z^)k+Uf|Q-X74m(uUX)Ew*4y*)242nsfJJlR3~p;vs<(eZ>M_Qw6RUBnr+ z4AN=C*6wa9>cyK8w*eCC;n zT?C}lyH~Zj>0x-89vh>S)v5GYBxWj)s7LK_vx_8efxz<1O>?3oKi|d0rSR0)reF#s z6{_)1J7GVd)Hpv}dv`YhSPJ>jMRJ1R@zPMwa{SfO;&S9`TwHh2J>40B^qia>{Q31c zIJcE0CCN1ztz4^0ODC)SM>Y$Q)BH2Jn5pu&5h^YzWpNpqJxFiP?J2MieSqo08jL^$ zdMM|ODa&HUm*F!dPv%(jQr@n#h+Ql1>T-lQF2<*xg7{uDPIt6j(0)$-9i~+W35fid zM4sM@9v`QFx;{$~xa6H4J@OnmiDr1`=e^St&tDJ!j^ia#^lJ{hNauKt-#b|ej96>F zXyd!G%sGhl*(&3*w^&T?@7?*|3zRl^Kv_x)y|2e&XVjNK6;@Avwy8Dy%Hw#Sm(P&u z8O$4$-pn@f#**bH**+|gS8qhw*xD}pv7IJLdY)!*k~8@%uMXoKIu(j9)!O9w#e;9qC3#RMDU0r=_V`1Mb5uAaKM~q~^yd;Vnn1 ztA^o9LB78FMn+`B^7JyOyjQNgcsWc`5`W8dHu4hw$G|&>XlPE(UTcF3km$<2W_^{q zR5$h9!ENw*Utu%)lJ2f`l4F8`VvYs2W4|wxkHtbENu~%63CYR1L?#LO6m2Owd^Q2wjy zAEuxG>gWI|VPDB+pDPdSE8?U6>`@B!2L;o`2) z+ge&%H9R6}>H^7HTfv1Jc7aIFGkZN5>ZTd<^vUUHo%(2QksRm6V-*q{sv7 zr>V~6k9N`UudCh~9WH!u3ELo#BRrqD)tBP1Vfjubaqph_=KAI9*CS0#f2F5cvGsH| zHzQdk$D&)!*I_4t`2&8(I>JT=4lH4zN#cxxvZtrD$2=}>6dD;K#h}j0*rSjdBLN=G zC{pxF`zpyI{iLIk)J4dQ;t~`8SZNiPLhbhD3kEmi<6gGTRu5A4?WN;k$~J9JW4jqo zBYM%b+&4mce5lSefO}&HGhKUW>Cf8Qn-L3{rWbYfB455RxFR6nuJw1;4!3Gw-$f3E z5Cj5=sjHi=-{RnK{rq|M)T!iqH)7<2-*D|5I4aZu?FBtC)$3Cco1K|y-m#GD>)V~C zAGY#uX-}}>{rhJfmaHFI?xUw)-qwd~nreS$W)M6=$jWL;*EvM#fB#>xVHS1^BNlpkWSd_u2y$HiFglUA@4%;Dmg{<=NQ~AqTXGw~UOwEQHw!*cF6dR)nRgVB6B*&Adf1 z{Q_ceEiythOlo{=%;SyYj)t}7JL9nmp)YJbX)pYEJlceid(7*;ezlloF1uY;|4GQ( zHcdsDj^9G#bI#c?p6xtWr?s&FuFi~1HrE!IBQ*)t;!TytEw4BK0bxrtXsQOawzd79 zjy!nS_`Z^mBP1*!4T z(Ou3cS?%WylGHMnFlw#;v;oj#_X$Zm%(4IrWV)ZOb@3Q0rOe&C#+&OBTF(mMav+1f zer0tybbX_WBx7yGuGr4k&9ac5j_xwUSJ*=_mcFOa1=o8Ou2qIB)^-R1wzoeClGQgl zKI5opeIPf;O1g5>-@WUZsBG!z$a*+%fKW}l-!oY4zx$5ApC7nd6Ryllp`pbrlAY?| z@$u&kvZ^=J1?}yhNmAXG838oaN04V)tvY z#Nt0z_Dxp~9B@t7t)wKPu}Q>s!?VfU+&s(d?m@_BToKfA>E?5J_VMRb zQk%}B{rLQox2Vpdv$tNIdwo)6$f9Tc@>AXZsi`aaKLm+Ojw_G~ILa2U#H_PnTwh$vuK2pA1u{i)K(Ty=cT=|*O-C!+Cw%2a^(@%>n9HA@_+OU>0d zKqP7k`5&^@P*LfwsGx-?USvFL%D2z<;Ku%GhsOKe4p3ib+g#2XXnS3TCW%;Vk@fw1YaD_+{nh z?j+7W$>1oJ>#eA${qdtHiq-VNWzTf0ziP%+g=8iE9Onp#U=iQx#^s_n3T=MX0EiW* zLC3xR%sk%I*x23sI=jDul$RCt!Bi0=EXR@FL1_PY=l-f89*;y&5bfY#6gx+(H^a%< z!i4{rrx4x9&Gl&i{>SR->cpfhJ7a+d(rn=`SsP| zElPfQ9i_P6GXCrYM(kI`#Qchj4+iu=$d3L37xL(cbjn@cVBkpE4i^dTMq>48&hItV zpl}!&8C4W9lA>cUGc%hRD0m9J7*aA{wGQn$&TxR^%9ULN#D(~0mmf!1J)j?zjtwc6 z;?UQZmGKD(gcoi+{zHusg0k{<#jGd!=GeEax8GjuRM~TKY3a6(PD5AM8Cii3ZNlA!w5 zo4w-ye*N3N|JMRY59-&n+$&fi$L1)If@zZ$Pr`-o_bH27(T`S^&BVqS{0zBpt?6*K zUT2nNWu&-VR7S?c&yVDA^s7DCighyYY^m~hlV?}_c*TC>34UqZTwLR^=hl~@JtkzQT5k~_a2S-4*x8HN#5x@V#kkLU`l58 zE^c&u`^{J9%-7IPD{D?jHIN- z6B92T7|u+f3#=jeau-{*@F5%`5W!1Gi7?E?(o$kdj429%T5wwej^|aH3k8G(K~n2BS=vS;*!}mbp1ypCd%(F-RlAm z5Lo9cD__EucZoi#aO-O-O9h83E9*8vE6|b*&y(kEk9!fyaU>+d7{Ki`f@DQ?73e}V z6(r7qt(;)$xZ58%ARI=HLS8cmHwX%l866`JX!-Gz6;I=XJzH z9USs;vKNUWjb`&tX)hPo{s>aU5Vt)S#7Xq^tNYKN-cUD7O42aOd7vykE-XwI5E!@? z`g)gV;+eYA((4_!n0x|*RKI-w429W456*`vEtF5-~d7Xh)&I4-V%$YNL zh9&otK7QPPmsM7_oNzAHPE+Nn3K3+=j$-X@wT-YFIl6P_&Z9?#`m_}z4O82^yy|97 z_3UNB@$q;u{6igzr$yc$71tBoJ!{ULZ3tw4*~OiMe(bk)tuxZiQOYUMhv)IbMH6Suf?kQ9>c5&wODlPrgkO6O7B9i~Q{ng1woO0d~wpFEvFDymp-%6l65NzmYp>DLI8 zoWuzM?!ZH`7RYwe)0Drx3GN@eqTKIAtEM)#Bf%fGKAU5Dn2oL^P>6gz%!{4D`LS_& zVNSB!fG`*u9+5Wrn3&}LHJOw|gr6TC7sE=Azo&1X2@KNF)eQ)e>yVovG5QCY1n5;D z)SGnYc}YqtA6zXfanRM(9)5s%gC}#>>{DP~AQUf6_;Cy;acHniih?I59nsOzaM*Pe zteRp;;r^H9#0k$}pXG`6*UN80FFj23QB=~``9wvvE$M%vo-^)CQg4H{rI=_G zJXsuar;@5j_OJ|#Qu@9_?zp@7w-&v#>cn>0vFqg?0z-?HUj`)b=4kd`&Sl>H?c4S@ zd(pCEvTL<2?AfM}tp!-WfrW)hFJ43-hl*&Gi-K~h=*glXcJJ1Y886#T`OOZHb#+S_ zo0?*ZTo7q_#Kqm6g{1?kpbuDy5bpw8wNC~KWcm3WFQq&M9qP=K@v%z+>e2#NsfmzK zb$o2wcCliNt9YW_F@jRPdzWw)J$8nZlZ0Sn`^%Eih;LRN?}+~FEdOgUTu!nIb-p8) zU)NE%#H*MZ8JU@w?1JLyqFGnY)d+cWb5ni&3oUcVdR|*ywR^HlBiCy7$NRVMPv6-I zY!vfURCF{1Vw62xjN8qtDo%+O5s!ib27?&i-C^~Hsi)-SCt?(}uoz;WI>2>!FD6tH zaxr2oU*aeRj6B$lSt;GiOEu0qSKrr>Ly(AUzyEQFurFNrJ2doP!8QM)qEG4RiZ(V~ zb)m~=$!^2cnWTOPEl=McZIK)xy^1D$;yl9kXiqJ~$Diu|Mh9!rg$u7sJCdDi{_^o> zl_Y%rWQTKb7v*o8KO>`~OH|{9QBe#81B1NChP6+H3^F&VxC+V>o+F2#rGYL5j5!Af z@@;N`dvZQ*77|efg`^6H=HEAaE`7^PPd|FWWH6Zb!FY?1ii!&6sZjIbF$n%M5n3g#biAFxw4(bnKT5(^-uqe z{&|1;2)dn2+iBRtJfOW1Kc1bP4ZJy>X0zhM-@k8?U$RL|Nl*>bf%wU_GsNmqM+J8tNJ=&uXEP4#i2b!%$K<#Qb#(-=d)!Hv1 zVL!{iV~sN;M6FVU4b$fr?dYGWk=_J-lhju6BG0whU!9$76DwrILx(WYW7=nB_y3oO zesy%jh^Hv~Ix-ZiPfE|XObj2g7KFb9T{C2`KUiOUyu&bi@K6Fvcei!HdlkBC+50Bz zGO}&8$JwxFTCqMK42}P(zwCrFc6P1@naN7t994<7XF?}IIzv*@5?~Y@a+c*RH#ayt zaCpuBJt_!G&CKE=#Lg&2mKPVl%s8# z9mLA&svG&Is`9^9$aJU=z1Ue<`KTsJTS4H*&hdeCq9>odG7GyPJ#v7TDA4 zd*1_yQn0kbdo0?)O^PFlh2>fDz5H*D4}S-6Y2im#iQ@@P!;IaBS<3BV@%{5MegZ7) zOKG=JdL+iG+`dgY9hjvhx8=MOU2*;_!pwVbL)URWU5Q%PUb z-aZPq3H{Nd2Ks+1zOnb@%+5V%hJObCHn30X80x)u3%*N+Ew^voqGnFjo_u!ip3st3 zt?cpBr{&sOWFv2^C4aH>baA26IYIgf)_Y8aw_D_Wc!>ADK0Y;C|JO?5W1tdeZS~1r zN+;T`^-=%={QLI~0`5W&kBYlw?`0eDAQ}bcn1a`KS2gFr6Q@8?DJhPunH0n#z*tA= zF3))={Lq)19^WMukNZNhiVeorpVF7OxZqux9S&exbv{5`3QlO>S#C?paBB@JC7CgQNci*bQOfqLIPL zja#$67ZM2E!UqUoYNpek9ZDXhXGjDZBXHpk_(TtFZK(y(&)pBq2tu`&}p|+;Ozx<~n+Kp(RV(IKOsAd+JW{)>FGmj|((3LzZ3E>_rJX zPd}EBSbe_Ug}-Ag!FezjOEF5C1=rG%N<}}3r&pBu4!?W%4$H^>^!lQ+7v9q~Nyy0T zbOzwe5wG<`J}Rlvk&&jRv3e(fdG@Ef+_~N2@gX^NGJ=5hUE*z(Fm@a^H&)~X<=GP; zJ^6g>F}59R7t{9bc=77h5sXOrEItbB7NU|h()L#w_HxP4T>ojL(Ot#wb zX=&5f!lY}bK(Bo$digbU;sy4P3JMFMQW_r*#NSg?eE+VrC%kCpdrggAO)dPy47}`ryfo`sDT9KK9;RVm zVwRMp<|2<@?Jud(X%_U0$hrF!_7Iyj78xDd_6G_d>LB2*M4pY!tg&z+Ot zJPgr~%&lgmepxx6Q|ZAqW?()U@05Y~j`Bu>$)mkiJad-Tnn=lb$B?Ua z*eLFq%RyUk!wF}&$zb*J@US9O3+zhs$=xtC72STH*PQu zYl%X@c0WD$RWO%-^~4CR8V?sGah6uz{Tm(VvHSPy+g&Ivhkj8)I$ViUSeQyy_B`9J zYxXC|629;#UJeqp$CQ7R{_pA2?y|ahaq*`-YY(wfj=tab^6jyc=X%yZv-p0OmEDW` zg|b)%?g|Ns%hI{#jK=Vfr5EJ*!w1z%{0X`TRkwS}9^a~g{i_Y8&e~1^N|!!=DhI=h(`fz2`x<`B zo`uQmPK0of6G$1E>EhsYP;PO?zb&HmUrm>}EbKSn8Emf1udOtlSguJ9=LU$8A;8<8UiYqLP z3@3Rcz#KJs4Yi2CpY8PV&;<{;ZBBC~F=za=1cIBM$jHiy1~N=s^V&71f7bP7W$&KT ztIDwYg@o)~aF7kjgY|CuG8-HAIf~Ek8xHG|{h~O*`az5L0o)em=98R<3+XRTX%wv7 zv9R#Xclf+wZ~yX`fWSpIHfjRns5Qy)cn~2H@BSjelfur+E5HYWAZ)xdk5~zG0pO*) zywk}si)*_e|0gjsSpCb*&B(#Q7HqGlSrp(xSz6i>DE&^JIyEJtXhxwbC+C0GF)1<8 z!h)L^nLo2#0cyaF@G(s5QrqxbB3PbIz(!VC`L>hOMu}9@@>KV;Io8JZ_S45oroGB` z?$mFSl%RmR6K)qmTSw=)gn2p6U}+^*{-vFGd*aX^8T(4wX*NnVXidRUd|K_tyeh7)Ba%?^X^U1<3Ufw2zMF*e*{#F7cOd+Oz#wbk z+fsZ^PSoemvX0YXpTYZ$9ctIwB7Yd9KeGClamP+q z&wtNQ*_$^L-rg1jt?>F^nKaeG>3{!XUc3-qJ&O#y-*0T61Z7{nb!+FofUvi31rIsw ze=Wu+)Imnb%GK=M+Y>=w`QinJAaZM$QXb$6p>A$=`p*rkhUjSO&#+7D91~8OcH4gF z)wqQ>EC1MVpbC6Ldrt6@9aQy?pFDZZd5m%UjZP`JNQQ8;3Q01Qc%|BNcBBL%j@q8E zf9yGJo_UIOus_}KV3^Rpgv2w{wp|-icva~H_zz(sxMt(%cs#rqo{BnT%D5eI5r@gH zCAl}~1B3skPbbx~Fi)%xtAg;8D5(uD?f3V8Jbs(BWT2`MW&v`7o__r4iv~RyCCwfN ziLn&xePF+KtsLo#M9!mOO#=gdgXGak{a3D15NJ^u3|PK~6U^WL1ObsLq!=`HX8ZPe z;zPN_P~CVf(r)~2Qj=k!R4 zKL`T5d$-*#)(+f<^*+b2}EPGx|TNW{I z?siB|umAb8c1m#m-O{%6#Vj-1Sn>=_rsk@Ur(JFGGYmv(>(o7eE?;_|YCNk1!pC@5U4 zzB{_}0|A5aEq7H^4B=aRs9eK=r&BWd;nq_>d-YE-qrZPIFbX^!exSD2m5}gPMrL{6 zKHk7Hs|BN$O5A~+(Q;-!Ok_`2^?UoutK#DmGx@=lHQ*xV6<|p@D(8u9;27YSB{vQ1 zxm|RC2LT)XFJ=tLtkTZpQBzR~eb1)f-ywLK^!bCOiKE10Bq0_%EPuKsy@)@#u<&2P zq9R-albzYr9%X-Pj_^;K)Ioz3^6p(lkTHQljjW7}fa6M(tCW$Fl6IkV>I9Yy($SZP zwrcLLqOZ|Q{eatgE$UDx)DH2DhlhrTLl-+vy$7&=fm%04R`Pur)C<3|FlB!Kj$G0<` zeuWC3w#pS`>Dx>E$M{b+-)4WO_9ml_ZvQHjDZyJ>YHCGLs%&RGUohOH+`Z$?9N&q7 z=k5O#lUqR@z>JJrc#*Eo(u9MfYCCmMT0tSb$?m-F!dUY@=VI;BXC9t%wNz=1TortG4 z;Nx>v81DLuH?KHNv|VKmb8BcgBv&;E!u+=EL}d7{P~#9T(5Y?Sm6#Z5@a|s$prc_T zN`km7Mcu@=bgXP_nU99A6YJEcY2e7NHR3boQ=1n-g3r^@95^PYx?!xI3fRiC@zV4A z0T&zszzP+^G`Sue0h?F;^9Q*=$}?ed5)yw?^{VPW>i_E)AI=dc8nfI%ZR6UeT4Gq%@`t+$$H5DU{4#=pJJKwT}Jgzwe zXbC~Px0AT8jvoEVU~Ogf;j9kwO_T7!2AlE+%i|9@EKN9$as9cpuY9KEnGLC^xOfG< zrF>VB(*Ss1H{**ZhmH9{;OwdS$a=uF8!tosrc4V~%4{b8ZLF^rBMp(Bk@416b91EB9YR{M{%+d+$I{YRcB;NKbs00U z2d7`+2Cd8J;;wJ6#ZT4cLQIVr?Qs?BvBUF;%rvAV#VWDh0967_XF$%BWGBk{x zFdMZj-q0~MMG8h||0ShM-mWe#wV#A6yYrYMBg=1{dJm;=qtW{GGh0mIg#-&^<(Snz z`h|va1lAlqA#4zgUNAi^4H%Z)FQSY)s;d#jkU#2HuwNDegxJ~HR@;fTau z_w`+pJQOo#vRdtLXhgR*=zs9#OXk-$;_FfJ7ih=E;ak4mZOON-kKI)ZgoYaOd=runY>XvX8ig?M86BJ7^W}EJzyQw`fqeO( znOy^Kv6cFr-1}B8@aG3%rz_{rD{~%JKKyuYa1;cTmg21j&m&2^6`qy-)&9MCSWt{L zpWeT#Jm_3xP!z_Mqu>R`#ofh}$*lCz@N7<@!!m*ac_7aZZ>8^jVp;&b6z}`E<}rt5 zzoIn@2gmg(Z^p>FSjfFtSXdfcFCt^Pr|yRQ%E~JS;q@b7_00TcyS)c0E7_#H8R}{a z5W6%kC^Vixeb&~t^;SX)q8_ZDi%Q@44MQ*C+*2sv!?Y11Vd}Q)AXA1#w-0zoY1!F6 z-rf<$|28+Gcn!H1#xJfkv5mK!=HddbOwWJ?OhwKsNQd+DXV%{su*wY&4`1}M78DYy z@}jp#cntzOP9OG2Nm1etg`<0TdKw^N@bbV9N7yR@=0Ry3&dK@7a6l^Q_TqH!MgFYT zj{(f5{Mt zZmxw9+9l3NM_tgB9b5b-7x>kzceC?%92Lf^*xZw(AnJ#TW3wYghYO06!irOG@f&`L zUB`okk)qZ4BN$x@BB$;wEi7=YiFYZEwnsnPdb)V62Hy@D`E^2cdFtNy#doW_T=zTd zbLQ~9)ZX5%nP=VJWDyu+oT>^?%IJVz(rorCd-)`H2Ea&Rk?F{u&N1(dadS%nu1+{i z@lXW<4d>_f9zXF?S;aCt(SX2Uf3&x_7uF->Ba(RQ;RB`Jg<%Df+nY?(={M6rq6hIb zxs^nl;ea~3KZz)=;Ew{f;>RfzezD3(ii@inw*ge1Z#@e2W*F3!J9Ko5Ld1{z`uJSr zWg&CE8IrDF^D`&M+t;^GEc{T_-5olZ{0Ki95+p8wG&Ce1x?k+q0d+I>zt5^F5zA2ooQchr}dYAt$7bE$F zcrwyZTDwmzvJqjbcaNujc71n9l4KG>Ob8RyY})SL#(md@l-&+b@pQW z^>E-Do))KHF^jsX_q%d{CsvPEW@FW8&lnX!;;@gWr}^xi;8N|{?{=boJ6v>jTotsN zAqWi3P#{cCOvv9jtnh2Hll*)mp{pkVIOfp8Xeb%^($;{_#^xrRy*|co$q%MI{byV= z)AtfN1?N=K@j_%Gj?@)DEQJM7w6{pvC9WFz0zKu=I~{`yCwdJ1X>&55wiRYJF~QcOhUOOZ&>T-G=g|q zUOo^sH#McGy!m+Y%IB06x09>GVXc|#KpTV8 zs55{0bJe2IkF%%!_d!@sM?^$A zsNGUlQX+`tVquocmzy0M?w`k`giCeiz5Xqz3TL}*MP9uUml9vNugjZ_NalARKFrNl zr8BpVkr0*zvn`0Lv9>+;nSu6BvbuOh$`z+Mm&r4rQ z-Q8PY(f#CfX~CSo0dS|RyijG-If z8;0_yZ@&)+2$q8-hk@8!>(xrUzd4rhmp~8LK6mWuA$$8Y*!0hz*hh4AeWJDWroSk2 z>V3#Qc!ChcKu@4t1AITkh}@L@@gn<9^5*5^FWlAFznl!<*%B5hF0tCtl^@uZ z+^bCh3+0c z@*^R0ss5X}zeid}r_Y00$7!@J)ll*qS%Pu+ml5Ava#mJqR7v+#RMPSJZuemc%5f$U ztO~z&T>X#sEG^OUwfoZJu{Gk);DQlbOaAg7eEfF{b>kBfAm6ZT*YNf(g_+EzJsx7g<#}g*PqJz^^Mr;w>>#!;^o;2ZY|KwpmkERStr%yZ;8Wt0~_Ty#z9# z5Z}tRex>l4Nc)(OI&*OCKY<_jkAKxH-0X2+zDq+dviT7-hDX7JgTLLW>gJ2v>ZfmT ze_Wc>gSn#dN8o6Y(^_5Y{=H-OHyxnd!G*UNbsKl>Y&MmI2N`$Vt`zQ{=-kS7d z+&WKWOR#!Do*-sOALwl&80Oi_FvZ7@J%k*V7N<6{Yw4$p1ZvXWG#UvyEETNg4&*S; zSCKP2T5tT@?-ld>q!BC)wR&bVcX*qdt%$%Fbzq;@hUVDVqETJapZ(J)*k0ts;VdQm zJvG${bPogWI3-RfEG)iO%$eF$`&rJ--B-vK#9*x8KW&ptCPF--SVH|Xr)DHE$0ZsML=u8(-Ja zA#v%`P0f)D%-L0guHQgkUwwzkh3v7&6FaUhP51h=o8&(e$&HbO74*sCnDJeAvQ05E?$vn%f z6q!S&6d5AP91=2To|9yrB0>@}&oVrhbKmFtTkE@ie>{IZt+Uoyr=z`hpZyu$!*#u` z69K-ytBYOVVPT@@HEW*w-W%D!%W6ktlAYbWExcND2D?1D&YySleGM&SLW{{RQW_mo z`I;vd2jk7}1yM>A7CEVTi?>W1K&1vXo4fmDl>W<`H*PG<=pyRtOJk@hj~PGzEe8jF z#CnsFks%>xEg5mD)RdH1g47$Vn&pB#T{AGyR8zw%^l|X|O?0mno*=2#vm2iEgHdk} z*vF}bZ{G?aYYT!p{#$U7g4Pd$-tf>6E$N~j4=ty*{EzvENKyOsn@=tz;(>XM9|II` zwiBJvU!(OkicPVB)SYtO%+}pl%MCwwXR0OMXKHTcDB_$Srm)sBg zCR_`e^7YNn(a62QGTzxJq<%!MO+umuLZ;l@T%0czIx|a4I0hz&$_)<>Uu}UO3U_O6 zWk17wDQW5F4Qb%x;Ou{Arpg+MQ|R8kToMuq7)|o>4#O0RLkYsJ7Yu9!&FvQHvoM#L7!_58FG2|pq zVbmunY4q@+x~=WL7*0|$GW;C_{XWpMQ%Z!wY*6MJqi&FAKFWZ7^`AeQT3Bx?($muZ z8XMDn83gzBr^nd-65 z#@{qKS>)OEYF*t}S;8XH__Eac(xdM2u>?v+VOasKmWBqno3*3!Xz&mjhEOKlM64DW zQA%J?!%G`@{9-N7^Y--$&o57&#FjYuKqB0A+40ipEfk7)m^7Q^>gpbcOcl;wjc>&9 zEi{J?{Q{Gmfv_{;Jhox?`~^GjOB=}NGQz5U~&qN1|0fj~N6 zKEB}Q=JR%yrIrB?z?qxFaCe7a+SG|C#zQc4@S!TXzU#b843s7k)``7>*hsyBz`?IIgS*8cKe(v6f-P{0NDWA*{i z_j2Oj99emJdCBMvevQr0L_8oNSpWK>elDDjlG0$T zE2V7=^@|E?BKB{oXVRM19f%z&VR4e=0zrr;UbNT6B7|}Jyr+l9E2e#t2{lvT@)0& zH{G9Gy2vH^4DHhU)YLEa4_OZTdU$%$IK>16*x$O9UtWG@YLGRQ_2R|bu{SPl2IO0s z`NchQ-k|YO-Gwlu#c^JDx9QPQOyfH2qi6z?>Moe2$f}l)*y6~-GEl7-RbGByRZxlG z#w3-(lMEaf;Lo#l(4#G3yiQ7L@8DpbdGTy0Yl;eR_$+=2rf*E8+4FSSB{|X>KL-QO zfPYX@Eki>S1Z}7$1CSd<6!S`;;w}S-EGa1pX)PK zLE4YFw$d`fAhdr|VK37p4neh4@YAOUIoBJ_xDSEs&K#l$Zxqu|a%zbza~w35COp34 zaY=1)A{0W=rPvZRj0g#I=UYVm=`R`e=M4MSd+~dLO_Hwwd!u{O;E#%{R;7ZLf4Y6K zGW$^Z@9%noHBMUd~|Ty?E#u-uytvm^UXd+P!c z5lG^Wx4d^xS~$iyMbC*=hq)sh8YLkWO?DVygA!)jp3d8d|T19ym`d}cItA$ z32A9E6#f1@au+yHL6=WWPv@28rqB4h>)N?+j3cLGT!f4#I=2vOog_YY_v=O5hk^3R z5Q(NyznR>NOyNYOqk)nHS;j;B*)kK0y9zZ?GT_0gG5uoWL#(PfB7Cou$$gKr@hLo8uh2SWC;)E3(5wUm|3c@VsGJc`p3 z=Ym--xR7!NA_RiRiJx<{=fbNBGE39|3%V1%qi*(B&R&8^E<%%u2p}a}L}cUYK{jw! zL1A0v{8dDBQ|{x7YJ8N$r~1W!yQAYQ1ocskAF`gW6VLtv**h-%fi73(=58I^wwzei zN>cxt)H3G+kP)XZwd$qG{%(a%={2l zII!DjuS5%>eE4$I7fVZpTlOE+-X-yBZqcw)ZN7_C$4=U=?^P$_wAfgGBFr8VJ%R-TDzX@*x$ms;8=w)5F{;irzkgNW-bXlg-?n3^!Ep&(aTWbYy|(g zb~2Lr;zg&9)Li2x?n4>JGqf)EGZ)6hgcLT(IYNz~k9?*7uER73N?(#qh(Nh2*SFD1pv$~rPzfJv17csmyy zm3a0rCI}6UoE8*Z1R9V>4grfKJ6H0}shgRf#yr{b!F@zct>FG-?c29cZfPI)yF|H7 z$i)FC-y?q8ol@;dr&wE#YFgWv{Z3IGn%Y6@YQ2^VHJ?R`)fOBtheY3DI=t!sXoH;d zjI4>;L7!94pFH2q^`AeES21D3Vfp8^{`-Ph*(GaJHbaYp_3NdEU<#qB3Z z{&!|W;;#R@kEUB@LZl_h;>Rd;xDFxkN;4(w|721<*2RlkAG;hLP7<8J;#Y0+sz$HG zL_LyZd$QZgli9;gS{3<_N|c;O4r6xe?&a&j38s;ak|9fF^nP*IgDY*`9k_NtDwtB@ zvNH8)sSkoXF167ZSC^kBy{GcuV<8?jUn$JB*8^c<$R=N5lWRNdi{;#A2;+066cyI9 zet5(JNCMsD%-kHgZ?#zLkFC*s0a0=$sUZPGT7Jtj@{0?Qqa-+qoWo!!B$FX9Vp)F#dq%7b)88s_D1*Tu@;^4Z#%|!Ih}Yq z%=rA1Epjta+{m=qZ&dOeIP6#X#3%*_r zZ-QY4jbEI-P)Uo)4c42eLZlO0VP^!)ndvalU$s2yw1IePqj|5ajB9Szq4MW={v^GY zU9Js(s|c8hG?UnS-v<}C$>1RwSN@L*QZXjWe<<+It66T%gw_h@)jGl2jf{{~gptu`> zjVnoE3*f3nc%l=BI@2%iK6tFu<#JY|IWWAKS(T%8Y!n&680y?PcfvZ>1$^P7F~-BS z7LCVZA%ifMwbG)OWoG2yfB-;hF>zz5H)adI)j*`?*cC<2FIkaJxX zgG?;xcJHp!i2h(RoTvIZzQqKED{|s#s5(Pa<}o1&ye{8Y7IVp@**t8=%8Gcj&|0ve+@Vi*7J~V2PE|&$xv5-}_RWs8)pTp`g0S_Op?7 ze_`eUdIe$yw85kd{atNs#C0}aVrLKUjhY;2(^zoaP85gVWDkMCnFlv(s6bOXwk3d* zy+O<49oX3qF&rLAbWa*XibqeOU0WSP(^!9rd2i>VEtghocERd3MI>dT{R5n)0QKoo zN@S~T?eDbK(xO*RE^QcvrM9ZvfDz|iNbm>7Q^b0DaStz@(>ILkFhdJP*i3oedi=+}4>7nJt}U3#gs}sHF-A{66_(5rnmXC*`jX#@&#l*K+8HQ`szK{}LfhpSt zMmh>j4l0kAUd1I<0>>uCNa}1{U4ve|a*{o&pb&($K!hx_qzYdY5@SL?e315ZcbqQa z-|M0CHI9XqiRqK3uU1A-P?>-pyzaBTRtg99?E?V7u|$}ke;Skj7cah`tNEdR;Ld?v zSCy3JJV@pdP)$Y6k8}vR6Y!#>VspPSQ?(2s%DtbTI5DdTqj;y4pCE4i z;d+d3-n_BKL@9(hbaSrZ7j!)@WnguM=eehW4N(or@b&rE=wa7_Fv*!8{im)i)z)eM z`CgQqSpM?m*qx#!Uw?m_`}c=tA7HI~`SSdy=ku@~yb{@J7-=Y@+VkxAzfZ%s+~V_h z+yK_NZ57yMBAKc72aiZca-ID^1CwUE>UV8cg?Wu zIqnZPKQ0y&L@f75O^uC-Dh9m}MfRQM$ z`wbXocRLfx|C^niQo1(a=;Al?s>W}OlB8#nM~Bn{bahfhr+V{mVbEGwSfFWnGnA2S zVh_QoCC+P?XHOCNg(5~J%Fy6oA-(D}WJIcUNy%k(_Ao6g)QAA&Mox$;OJ>iii5ry|^S@Z9H%j#j<}tq9LjP(3Igzvo$+9oPxJ2~d zn{K5abyB%rmKqxPFVfhiKkb=8NIQ%mmO^e%RnzpT$Y{KgPT9#;n4|F>n67P@Lp?T3 zdf5zjj#p)7W;R2Zk-Jv!7va3X^X{QPV z_86B#zMo|3Sz*FMizj<{gRaL{lUxnHC=0|XjBHx;#xO~xtNQ5D$h9$35D_HfeFdY> zmK$Z?E)IXMlyaUl*;G2YjR+z}rIdDorxzx4af2G2XP+c7iG=)Yr>Gu{wZL66GKXVz zv^nKUtTzRo`qt!Y;$L4QpI}=tvk%ni|c3iAd`X7wEc-^ zl4-R3HN}9p4=CJ2B0X=g%q=?4{k|tulAcaOz~}_?A*SG6FYK8qbh(eBiXGlapMFU~ z;rsYNe>@rl6CTO<=M5v6l^Jn-)8po*CtPWI9i1%iT=%YI2La5w%?(r)y*?*o54<)x zPlJL>E5kUu2Q`&w_VE%eEAB&@=YWbo8p!M=20NHIW2`u%soa7+Vh!|bi{PaQYa9m3 z4<|1Wy=bo^;|{$G7;ImnWo@ zm<~J7)`Vjp37t~8=Wg}Ad-swthQdE}%`rME`r()fz&@m}&0JLyK{hGmuI3?*7v6jX!# zZ|?p#Z;eQl^F11ke0+Soe0&6jgd)l2R*T(<{{pPL@plVUo{kH~E+!8@d+nzVto75a zs+E5^_i3xEu`%~n#_Nms?><~Pzg6kwZ&l0{CWwrIVw09|)#DKPzC|VksumgPkBWEh zOpc5g(ue+{X#7x9d*3f0KrPoy#>fckqR#C8ZKd`<#in9RcqN_x-Yp^mj~v&-7m+NF zeti*S_J+jCX(ZG=eO`-*AmFn8LM4)faKX6Ls#8l{@1ZY+~ zwF7hB9P63B;}TnFDn!Qnc6!8K)s8h4I(>TbPtVHSoGmo0-QDuoyJhCgq^75%j!j8O zfX3KeFG~RSvhfZ&urzlNaWXT1bXtC2Q6c(^msmm(I}ZH9Lg4=W_xbt8_V(fi1_ePu z8HpMg0VO3QK<|&)H`o~{q*8Kc__+7v1Wf7UYl-;HC zcSg4#8dEuD3OfmH?EySS^G^KCtT%xEZBKXu@tf%Z1-ot?)g{|<;^VIZ{lHG` zu942i!4VI>meg*kw(`;WzYAlgM-0`I+ZZlA0I}0yq7&7%K4zIEj`t>evUf`bgGDbR z=S+U|D4$8Q+x^K+sviL-wv8+)Du{<%{o&qTQE~3lC3aR;M%4e(DaPlvy0ne=R*JV_ zMQ0a8|6L=c>citW7Rli&Z9MbWoDI0u&CDW^MWU%`-0%Y!g*kiyZ#yDe;;(5eUiPeD z36-|9wT0q%|9+_aoa5q8RaRADC#XTigE8~M!fwKk-zEcZKE_s*uQP8W?FBAInU3Fe za0s87IjE?32uC~2Gn%O$h%7|GtgWs-_TDuBQ39F?44?1=_y-~4swcCe;N~{#`YI$( zPQU=CwpyI%imtA2;++nZ2nx}D`MC#<3ECE@J9RKy7rt^Q-i@<_YvWbi@7lxaSOr8y z?FJp+9lydv3X6(R_v%l6<3+I_08LdZcQX$YlV*CF@(%$?#rDU0t@2{m?XMEG)5RAT zBVc1EgiMO|$@0fBA{W_sWmHcHQ`O*nmDKw#=}F& z?cT=UGN}Gsn8yPvbTCTn$ry+tj9|fq`wVoWTaEnMWozSa(bK$xLid+fzEVo*gW0*E z8g0O6pqzMp!PrPvR>8C4*>juS1XxSwrizrm^c11d!u@Iljrw3F=CaYzKbIzdzIyej zmR5$DO*`92R8w=5>a9qCK74IFjf6l?NDPX4+bZo2xp9(0%#LjV(bOoB{*VyJbq zjv*Y_Ayx{`l=KsOP($r-^Y@Q8JfD)9`WdeZ4}>_=Vd5({Z|0&m*|YQh{k(M9l-d#7 zBKxeIK{J(QQAHISo3n%`HF|7qGMI1Yps$FOPW&MBoT(nS*FQbkQL9#M``A4zZm6r* ztPFASy_Q?{gS6Vh;t(tgrm01uLnB~qV7KqW1QC6Z@jX*2|B=DL z;HX|VHgdb_CeEL0i*yj`g6~*$mCqhiYmOH&~dY zKs6q!AWkXVlnFmac3g;t01XSm-9VzoC`cs|sU*`x<*kYS7ag8*?Jtj@+*qFvBO-RB zzx1HHs><`klZJ4LrK!s+vvn7C9iT;#|1?GL(xpE`HTqatB#j-Q%R4T#P`5H`)fma^ znN=RQEhkSY^_8=OZeVtnTJRX3TovLdaAnRTr2~k^hXMOfZV&RRS^FZk2|TkrdR50u5I zyNAAhon=t(VBAEH4zdmzKHxs#;tZ+B<<0$QC3B*SVxlg+?mVg6spkS|Dv6IubK`%D z5cJ;}=%1>{EE8-S6qp(rQB`5eJv{caz6_aO4Afl{@j?Ao*v(;Nq4GH);pghS2+12T zz|F@9-LmIN{rx9M2`MS9a8CHvFk=4U^f$>v>wAe4ROll(=QYb*^l|JFx~-Lg+_%A@ znt=nyy0Q2E2_-lEt*>eq{p4fhk!xxs#7Y1xC_^pFa=e{WA=>sRkI5CfyhpH8A`*fC zWN06^3OPmnTjk{6Kv09SiK!IW#ee_)_3|Rwz1!!pmsd_GK~CqO*tOsU!^|_gj4r9F zexBIc8T9I#_3qtGk&$sp8H}OAm#lx>z#h=2YCq}1{(WW)w6sH5ltx$%VVg%nQlpU$ zJ(Js;H}^$FMd78=A!V8vAi8i{NNDZTh?l}5LGF5i?dGFLccLr1x{~h{xn*WPL-xR0 zH;q&LuGcm1<1Uxn7p~ZBO=){TgrpCrah5|;>XE$$# zuC9(%c?a@N%M#pBv6~=hr=RJ%Y;mq$&73bq^1-9rznf#7&2lBrh4ZJEr@nn#@bJP> zLPUNbMH-m}R;nwZRLU9}MOd6roN<}P*&`^66*};~rf&sG@Ad>+^yUQ}y%4#VVi$oq z^Oefzya< zY;#wHYKiMuvv|49%Hj*)05)B2?DZWy^ga|DeX6U3eh-)9k{+@7{a| zisU^z*FSx-{$&MWF4a~_i&}3~#Gthr1#|Jy!-uP14GkV@Pga;llYviDUvE0#Qe-gI z7xXe1s2d1wgq@aFf<)d!4IKASunXQB%lChNHC~Ky`N(o|@WseCGJ3&%FI7^N2q*T$ zb=;X=4UW-1Z!@$qGxHQ1O!M})U0;@4q5t$DGem6VbWgTVP|&UY0iU2G9{sxUXEf$k zhT5#NnOW_VL!L-v7iY{WDoTrriVA%lmyocqzPdukf6nq-4r)mLFRAYf3c8CNLij9S ze0{ZAvp8Y=WrT~Az@w#A0bnb`#rr(*Y2(c&15SJj5_xU&cPSdhm_?`x`bMclNcH&- z(64I%N!s%c38&yo6S@6I#LeKUdE`(_O;3+a-BS+2d4o?8h7F|#IS-nSfEYzXLmF$X+)y4W}B}*R!+9!^6{9hrI|B)_K|#$!px2kk5Fk zio>GOB+^Ke9Wl7sZf?Jei|uR8cm)K&&b7j=uKC#jf1{?@InKw-8-HjF`|zzhJD=LO z&x{})F${glQEr3GkhX#1pFFfBO6tYNO&NTA?$U`wZ}t%4;y!+Tz0vaNc@^XxQ3WH^ zJ47SUHV~Ef_vck~-?sq94GX+o1lgC|75$r1o9snyLOWyb zlLv3I%2`<4q2LVO(?WNJ|Rlb>8}* z76GFRMrTiIDo_PsIX&}9;OhaxmpoRb6#KtRmj?&$fWW6Wmi5Uf8;Viq$#1zUD;FT4 zQ02bP*@ry)+J0GhNB-6_67ZMb-j7kV_QCCQ~FoKVC zQklm-8*L^HC8dDVQmS(D!5E=?Gz5^EFm1Z}(cU)@dO@BG;6C=0{N1(%U>0j+`nG1o z7Nzs(@0JjL%U3YO(H%m=pvXa3?&1tAQwz@jU!=vbck&4Mx z>tn`K3rmyjFJ82xc{K8*PElEds+~xHmsfDn=giY#Ma34oUtg+hs6y1^glW8eYlf`K z?zCX(doJ8(SU@xaszQX7;R$4c6s9h1PSU-5`NH$Fo(ItJ|C(Qp3T@3@FnK$CTfxriDtME{|Vb!tQ~JIvMws zbh}aHh^P>nO>*{meaMRJFl#Kd8x7~^#r!$q`6(a%h`TxO-sxdN|7+|1?`F*R1bKKK zSFJ8PoBq38(h}QrjtQME6KOQy)}`?telXGXj8cO5(r43ds#adVzyoD6;Q}&~H`_>Q zdEQhU*@0pupV0mF>wAck^%#TC{}9l+eS1GaQ1Anq`m}7+CFvRgb;HD0Oidq7SoCP^ zpfA+arFr1gJOAKV?Vmk$Hp~`r4^uMQ#%%4Bk#FZPEU5=sX?!vd zPW_5Zgo>{&4%zHDJVFR(0G$^_Vx#ZrIp!XCYe9+`-2q9oLreDmfhjgi3j6S9m8%6K%rP|z;xPpELBpGQsOzm zdVQrrWK&>!JZ1EkS6JJ6sG7@*akSdEj9HF$fH|1Q9W|WmR?&RPa#FOQT_-Z8FbJ*D zgAn`mMF%a`(0fzI9G0gR*Ng`R`0oEPF$%u>&WN-MJRY<}Mq>g!Daru=V78cG!Ih7h z5ZYueRvkRBmyt%4`}xD@#I~j(Ogc2*c0|F(CQCJIi%{O%JCWTaY{=6d*dw`jr-x#^ z7EZn_dyR#~#ha`*aW>&7-rm}D_Vo0O7(VR#Gmu})!8()QiA$Lhc5gj%^K6rr%El-M z$d4`LyHXel)7&UDc zI82`$t_vb25J)jMH~S+2c^3r*h3l3xgTzhe^;uF^*Rows;W04^VwFdZ)j{0jxaL`C zCj!Gw*-l+rF1-i(XK8UO`lqLU@@sxtS%*uN&%z5h(c!bo8fNKJrneu9(GQci%VM$- z^+fhn_!;6%@Gp>(WuA$ou@qTyZ5hn{-}Mbe_hZp3$r?n83~`6d=7m=r>McyG?(LQV7)PT`!|bM5-fr06X3~DTmvg6{`hHBW1NT|Xavi6`-Vfti|P|B3En?PiM@T5iq9G-hQTH)>pC z;o<52TyS$+%*AJxiw!@X*1NDn*zAOWAdaPWMw*?9x8RI8dG*F$sowl8+s$=tw6GIB z*+m^r)d85m;dvEN1}&(*p3wGQ;o@y5Q_d*3qy<{h{LeEz2+#C1i$Uw|FM2nb+3wzv zQ&8`-7Wh-E^qT+4b*8(OsH|`7XkVBXvFu1ql#EXyGClvLr^m4_s?mu5cgAv4-6_}p zOf>=TmM<2%G?(%?-wY~JaS#&_gk`k8(gnpNoqf#R%JoUZ_^f1j53z24lBM=;i|y&~ z;*s4=`_OUL8QI#|-AdyH^}qPxygb%A5Y)Dq7(}jBkqtP`H)f$opfpTpNi@X}xMEyq zL(6ZNX4pldE&ZMeBzLHu)H8o%o3{0XT&1D&CYK^HFz`Tj0K@qc?>EItuKG07@ed`o z_Nn@{$U^526yssK-m$OIPJ)8mS!$WCTkfbdA*t4O{Z4)CPn}UdQ>cOdlbRtnHv*sm zjX6Ah<^i{~j_x7sB7PptVIfb|^{dK&=50y~8PQ<#o%zF*CY3^ z(G%XcY>!xv9qjGu+D{lCf5961t(C3#0E}Sp<_=`)+S%AFK0R)ZZ%eUk;u~--J-+Q` z$h7%X>Rg5p1B@!q{5m6<%t_@x-sD6n0bqbt&xgr!_Y(AMcS}Q(LPGR0=)``nu1O>& z{Moaa&uqk7FKL$ky%lWfZkDlSB4wlhkekEiddn|LOW7`c?xRs!)4DWE?FqxAL4mQ6 zO01Bd_J1Uy@%HiZ;!XYE6M!#Ks-CXKibn@!1boFd*j!B~7S1gAwbN@!LIJRDm+8-$%=hgg1RAkdA7cF`04K-I9?yRPtb5xGn!fZ6&g&#i( z2rc;r1hkLYvr{!xRA{jv_MXbnsDHA3><)8v5U-0M=8;Cue%b)eYu^e)xv z+~>8}0Tp7w-ZYi*U2WWa#H0iWQ%lK?OSJ41-En39csa+QHI_{MgcBhn(BNJoBMGa} zK|0&g+G5l>ZQ(N4tqM`kwF~LGUg)`Re4^g>J&awQguvi>$x~2X@r7&{83Egv(qv;S z1Cr!!yZp5n#h;W6bZor)qU)ITvFWyCY69@lqa*eIpTMd`deeE|JG6fgq!51C7Q!-W zAxg{3=1s<6yE0=#z!b`??&)(mYNO63+Q8b+sQ~$?sPc`JwB`vr%FZlSSHH-6mqQ;= zn_k)>JE42`XoSFQBk54T_jzZeln!t|>Q=^WcJylv9jRnw5;T7pdX`@rEd&txuEoa0 z_zTrYug{;&(mORCe#_8K_S}sS)Sp`s4{&I=jrP}rxtH%Jr6jgqVs2Ewfaim1%SNCi z2#Q4Ir}CS_5SH!$0zrs^FdjJzUtTguUc1I?qz`!saX1D}VS9x-hIZf2={=}wBi>}2?-y9I6pj<*SWWtoS7YREO;vO}sC>|U_8KM{;cLWtNQ zOG|k{!5Rz?@HpbQX$lMPE&@QvY#SQ#U$@6gC?pr_7`ov8TY4Grgvf1s?drIl^2(I_Zb5x_Mz z_atGzN-`+0pJ4DoOs0t77YDW3-24R%PT31b1?O%O-oF2e)y<~eNBCxC=Y->DkLFxz zeD|`)ugmP7?59;%nu`~UVy|9i?P#k1nV?vp zsipH~6ySDM4LCktczEnfs|-0)MueJE5I%w2bQ(0ayu1f4K_1%BfFPcMfv!JQfbX~F zPyf)bTY{p5?~EcLp7B$Cy&)x!5#>G@`HXiTpluoIUS*O(H!>O@Buv9?umZs}k~Lc& zOBh_aQVxL>r?&9v@GUtu3m#f%j)(~sN6sFrvNk&G!aVXsC33#k%GJ717+=mJhu-yI zq5FTDFwE!BTAxG~#A~V7P~OOdA10jO=FZ`|{N!|R-o_3baW9|SbZad|;TkLG@!CRp3r-hJAiE-dhLd4k%MhpOY286D|b z0@GQ-bjoy+q*?8yOP7RK4YWi>*RXMk;L;-z<q&8bgsm3J5O1TYD1Wj>#oVIogo7MLisDAkHaeb@1XnKYv zm4ooZIM2#)`eY!F*`5-9qOlUs6B3yx_A$PB@`i;)NsRLlrKq3%o)RDV!_wEMOa3qy z^=KLQGk8uIW$!(?^Ki`Qa>=xF{hwai{(Jvw0iuhHjf|;AfA-t?%cRkLm__&5-VSP; zim&*)t_f|C!)$EZG8Tf{WhbP-h6ge}@19YzwCu+~I4<6bE-$m^RT#%b3|zQjSHAIR ze7pl@gLhHe;eNolopU72x8yr3qm=UJXFX2ESG>1Ze}^`cCC<+7#m>R0@x5&G zsZXyj%Y1w=Ys-NiSDkd1XQNT)BvFT2Ll_4@yd;E+4wC&PP6I2f*m=MTtX<|3Qdp@r zv%VU=u<)v~k||XB=HD;3oNcVFO*+}h-z?ys>s^P`x{HXPgK~#C&}rd!|NA@B2soPl zwrFl^n>s7A!+oYXwk$4wx|t$g>!z*kXTKwC$Ur+uxp|>jCcdS=z=n<6mXl!ro7^%Y zq9^uh(VO|a`7M_&wG_iAGWi%`^N6JI=xChBe~DoHRdjdfR4`Ua z>=-{te`&7e+CYxgfZ_Uz4NjPmk)c*4qK&fP!=mcyg|pQ1y?GYja$zGt?lt?_)icAH z=3TG*`V0sWB3to7k44)i78#$bognuU*UMU|30Heq2=SgK3p>R=ui6w+5XuKDPdn1= zCqOHP9V6WQr}&nZ=0+H>YP>la6UUOP5gH!;EHw1i9n!FzhE4R*Wd;jMqqy-T%?Yd)LDBKv%PXNSV&Y+LQF#r-ZlG{m~&D+F4aF`p*v8 z==#SyrH?Ec!Y0u>^Pl^qrgiRH;RSBSA$|gMze!uiJjliNoP69oVUl_FG0vcw!Lp&@ zVZmea07PXQ?*mr7MMo`;7cHZ?leyo@VnVQC4$NuQHr`uzg}Ah=3_%n*Y-+Yuwo!!Srf z_Z+ykFU1HZ3dW)2kTV#)+9E00;dk@b*4D_1?d~J?hV`HBRYAKXm`S&I2NGq%jXeS|)gS|k>wCY8PRsW?NneeBs z>sb!HdB-s;KX>k&bmIEVAYAff&l*O2eM61*f9qBQULXnGmZbPPBl(NGyFHbyt$uNz z{Px*kV6`-Pduv7C6`O2=R$;;m71r;?f+c+FcI`lHx*%T6oKvc$6(V6aqa#}0rx82oIN)p1ssj2tq zr%oOY1rr}4OC;GGEu8=Ea1D@~kKT!b=5N|ev6qeS2n!AEd3~Ag2pyfdrjb9>S^6Nv zeE!AZJ-^TCM~M>`rr>Q8H#awl5RdUrw!paQB*C`7Sb{^N-I-BML!(yP^*9I1Cxly& zka*S9>>%_)+J})#2$K}~42TlZue82&D5bmraz(ws`eS-JhbTGYb3k1O=SJr3em%N` zOz81lHRL;q%74rYO1D-2+OLs*zrthns&~Miy?a08d?jY&TgO({HzAWhoTdn_8Kh_`N$Iwsyid46#ERHl;ia2gM`iuZHtJ*Z`({6F8f`6Fk@2Ya=EWh6TnmghBowc ze+7irG}2U~uLaPkj-Ds5PFfACSMmwd9^_3M}He-qq#--r@_ z`P%vJ0CPwSRBt%Puth=M1V??nFM?!`9lVvUx;+!^$%f`-;vS9r>5zH`;Q&F$g=c|* zU6Z{I`}Xf&aBMA*e69IDLeS28)?idBr1pE!^6xI~e6-KZyu2Nqoq3s=I>WWvuU@SK zM`2O$ip7r=82B7h;_wMt>SZ<7&<{O#hZiZZH^;SpM*i5ffiWDL`Oys8^Kb6V|2i2K z7N&VlAzl##>MEajf;6VP8-qUC6Zgmexpk1IiZd%i7N5#pqQw~sztw@oT0l;r0M$C+ zUQ;XFIk9-tfyXi=DoR^>7B_W(I#dtn|LIOahG;E^vT_^N@ULy6+LGg!rZ$Mn=|Pz! zVZNN4Y~0!i9*;Jyq?lN11Q${OnVEkj1~xQEU>BP~YuB518DVI0!JLsWlRD2gN)rT} z_@tB5?4?~-27y2LcJB@H!v0cWfMGZ4V$`?Vn%H2#-6Ny#bk_aKN&_cdpwm>BRrhe6 z!hr)|{Xt+wyIx>rXXOG=A1 zDUTNBo5irJ{-_PSovP(z8=pL5+P01JDBYAg|4iBtY4J1!^nDc1udCe2?&~Wi*Y|hjZ+N&7qnG?4V5hY%3pcA5rGZU9XG1Nk0$39d2Ii zFQ4qR#O{I(8gnDI{kOh1D#?&B)Ovf}OF0?r;URWae|T1VSDI@2*RNms{w`iue4&~~ zC;aF|Y*r5+Rzn1%VC|<*Pa>4(`E{m*!3obeamLx;(+yv|KN>X(WvSg=;FLVKFUQ+F>m-hw)YEiwR}`*o>Hutb!AHm_qn*X89dN6pF2*@YQ2|D}c|MbM{*(vsM<9iVq5MBCtJ!B&5DoRQ*+M#&D zk&FE<3wTzqLeMc)PdUab6}->OyGC#B!D4ZBsJm9iE!IYrFNunjhDb2E|3OW{>*w?! z=VK7rzlZVh%OtnKs~jj9{p{I`kdTSVNeEshhK9ZjS_d?YJYzZ=Qok*!YUPgNnT1q2 zD>oPD1lmAvCMh`DLdIFo=`LlA`^=p$4mEmiKTRyVUj{Y5d!UF zOiWNvP(JQ^n1GQ6w@yf5$J%E4@X~9k@305Jf4#>e^TUT!OO@xE?@vfwUUV4814u(n zt-XO91*3!rZ%f(Xot|~Wv`-_Mq!N`9yKWUF(MTxX<*TdoPzc7{@${a`+FI}abD`2i zd!Pmxu|4Yt;V5k&?ACJ+La9bEbTiA{mN;^8sh_)5P*lWcF>a-=-!Padr_uUdnn`J` z;3%m#oI97pPA9SWZL)(i7-OaQ-O<<{a_YY7Y6B~)rt)$E{@NZVexD7znQ@r_$SQ;| zA|fKEPak)~(V0c?d0yU-wZOfo0I6Vjd0@j#Oswqd>kB?i z=dBbK+Q6iOf|b>Ird*BTu`zlY8XZH!Mx*SpdmDr+@hx8>W@p`rpJSGWT(JEJJ$?OJ zT}7p@_#py@cLTpV-)Onsa}yF$8-dW;Bf;CwCuBoBdgO6~h4kRTxkZc0(c8tpX0E2I zLge&z{8}HLQ%AkSgPG1!-2&GuF(F~xe$A*+3<~A~&4YNsLHZZ<1`D^?BovL#ls;!V z9gdp{eE&x3>Mv!P@kqvw6XENhM(5?uk^04LTa{8E@z# zPu*mp+$nm4a^`_%wm&_DdFiTAFJEFB#z?vED5;UPwK8I`&V?JlO)%PnPY6;R+9!ys zo?ri>m$ieK7}X5oyv>A9=87|U=vVD7O^(*QQYp5cnl;V|)LUrOb z?aN+b0O7xkin6k@qNeG_k5p7vemK}*9?Y~+qt(XG6y7jwE68l@y_qU?{W?DNSZgBE z;3>izcvqXDcTq}tH~514r7UP>F;wZQ$*O6Kj(3cV?gP4DW8)hg4N{g17z+Rad$aA_ zzTo!6-fGp^`>s|tqpQvTO~*{Rtl|r;3@avoww4OQxh0ib3s(UlT8tobwi~yeEb(P~ z99RCV=bd4`_xU{@iud+qO6}N>VGWZMk`wqoy^K-LJ?c-O9;w5qxd=J(_tZnvD*-y70+ zS4agio$UQ#+Q{$VdEsTiH_nmS4I6=GSPlaFah{C1?M>>}X&j@1|a@BeBq&^f^V_(uGd4CgS! zofbd5UiWm8PUzUbe>iXtbLRiN4t~yCdC#GLUv~RH_p<-{lY36Kzt!Eb|3B}z{hPdI z5#|5$qvT?NwEyds{vZ9(v{>SmaDd1`-NkZuadB~Qe${F!FhR*wRaIWXOMv|y7$f&O zc8!f4#o&Xq)}N9|lpKXKWTzPm=g?Q}aL1|=kvX{abzbcY^wda4#5tFL4ff~v@7*)~ zZG9si47=-0%u=n0pspHhZ&pfI^{+Vs@a`kw>2$BSZG;)5oNk*09Ojb(4Lj!`? zPVVc8N?g`IzF2-2qh^m--U=^A;x6~gfTmIOleF9sTM!=b2?`csc#+X%C(wt!PGz|S zl0H?{`;wC0vdj&Qja?IqQ&X1P4x31?kA;OVdE}w)sjokG_H1JlC%_DL_wRqm&7J5g z)DLy&!pc)S5ma~O60I(LOt>qm!i<}Sz^6?8+YXcJ9=&q6&4mm|n7OzLGtb9VoGXHC%|5WUj3LO^|Of>$c_e}lHRPV>q41|ZXCbfzTJ=b(~ATitNz8YwkRWtXvdPxmiUM& zpRI2NHqrGm`IZt_x z>`1#s&Aw7xt8W|smT~P&x~kLSc%avQ5#HXZ(U>kLM@QN-nXIf#SpM~wZgiP3NeMm3^(~k{l$99YR+;cRhD-8( zNl*3g@HoO27I^eR4U^3cV&v93|2+rKYL00+U0}MXfss+V+H7Nj)CEXXNM{D*@HjWT zc5Oh|S!ldF>ncIVc=Xis>w?GT0Rt)#X8tt`X$}@$kE)+!DJRL^ZLRjN&_R(63}BnV zyBm^{zox#IO?77(4plFskI36@8n39ddnL-09pm|33n`%E(jUvd{?^tV<(9PpHq*sz zKJxq8VAch`$_8K7MYQ-q_3wCg_`~G$8c^DUZbMO4!rU%imLOZU$6nn{w~WCdh)e7o z907j|@3A?8H2}8!pYE)*J4JbjPjOot4)QebdSCizRn~rC5>0a}$Ju>wCIb2Bvbmm! z99)81jJE%~ccT~ter<_5v8VFuS6agTsXhx`T~WoYoLH96RaM^;xCrRDZ9YA7h~nMP z#ngFrUxDV+q9XH-&Hr8-zY}TM-3=`)+JJF~{ltJ9kl5G4fxF$#-4Q}&X>_BJGNq~R z?0_@(ZUQy+=;p=%z_1;sGfCknjiNu;i8wea!p!QWkh)D;)H(8zJoIiW4jmk+r}?5t z2#BH_|MFq$MRoO0LAz4b6kBQz4I!JMZnT+LtQLLjd58#`hOp>l1%?>@>3Id=)#lz_ zfBK>XRrAV9joWG}pLe1owr+Z@&&MZ6eeTsjo`pb3OIsV;sZ(dTZ6~_4Gd?>1)f<^Q zOHfr)>xRB7S7TD-_Sqk^1+|mka`r-K&~_`O|8%JIG@9J?hhKIxe1U%YZP8zUB17#*gV13l`}tGkTm0={ahIT? zrgmMQ^&w!kAd+KBL3P}DbTlT0VyB{EzxHX2U~+PEt{Eb@B_?8J#_NAmSp^EZh3h*( z2>bO*FYj?D8=57(EO_k;K7K@I9`s0<#DO-3VlIT}pyVDZ|HKv(7%*gHNRY=)MC1|{ zmZV^V=~a#j8n9&J#6$c3=`h8E6Ywnbl1Mzv2Z`9O+O0DCaSwktR{oM^^nd8TM zfPBCzKfO~(=-d9CmB={d=MP720&~bq@StA5HZ?RnN>6XO^yPZu2UPT!3x_vYv{v_4 zRh5)V-v|xchi5M6E~4aldD!Y}y?-CNEA_1kYgU0+d<&)!v6-X<%6*8(Embiy7C6aF ztV?i-w%bgHk@kdWvKy3G11YJg z{hXXUa_pE%pRuAMmy{9?GZoc3CaIE=VOkmUi;F3Pk4%wd|ozrWwo@;#E+2twH2;kNAquLFd$fqX`5E zq-P&!hG<5BZ?=v&Hp1_&jC^Ppbc_7`=ON>Dn3jLExn5}F#2m6(LoLIs@cRGo_TT?p z|Nr|xenUg0$S6@#$;!$OQA%b=h04wzDUrP@BuNO_6xktJWtCAzw(ONXN>*fk4zJha z{r;Z5pFiMpIz4}Q_81=S<95AX#&MjFfsv8KmI-{7;tt$aw6e4`KVuP6ZHVmdS1zUh zo$9L5LQk)gb4#UJi6(ad{Rg7d6i z`(-Dms&IiTNTdo6@5JwP{`_S~6yB;Pr&=7PnO~k8Q7kNU3=c1a^_cyel%QY&*jUJ_ zPwrXVn|kPY=5Gh)L(EfL!M`JdG;zKQSfIf6E|<%0RFHc!Nm^QFc@UqxN!zK z6NQC^Sm;d|>~5_sNdch00Q_ZX$wfxCj@<{K z)BWvH)cC9ro!o#-aKy0%Q6D=`#l*yeWO7Ur0f+h&|3Otjp$q;WndAE-zdsF78JO?I zi^{j`tQoPH_;e|$1uwj_5&S9epzEru5xw%QftQOnGb<(tZKwoMtDy_T%AS)FP0z3Km=(zhTll7zod9CNv6(v4t!cLs}*R~V}=fo z#-bCasAwFJ?2zpUJ1dTkj2r>KHZG1JqN26I4Nu=^c9{lq%srHpIr;f-tUoeT9Wxi~ zLJ9;4p|79uy|1YXBRd>|MB{52fdhV4YibS-^y}q`iW;MJ;b!k|M_;u`OneAuEm>Jo ztealmc`K*4>~T9)X8*YakJ{ENC9Ni1VtVu$y0u#$Og%AlJ&%Z2mg<|=8`IWLQ*ZM+ zMZx@E)pF&HoL+HIu7!JoyJ>$(EslS;^?g^>_z`o}@xiP>lk4ddO{qIQAFy`8qLuEP zh*8Zd>^bMdc%qda6k_3w?}1885k9zYtd}F!HdY-y`l+d@!+1A8-pEnCKw_3%V6eWT zOE4cdcr^Q4Ec(v(2sCOt`&?@e`Q4Ce+J=}!QgTEyZLWNM6%m2s6!ZHN zL;=_evO&YC*Zb)XhJo8hoNJT6;InVtZoDxNNd%;tNGHc7jZf>|((faXN5EC3j?unS zm*2$^NEq(hYPn&O57j94fydaBA7x~;A);3~$^&I-sX3Zq7HTsmC#JC4{p1yv!dEkX zjE>OV7uDJ#!Wd?ET)!V}Q#d!>c}rP2Pb?ZVNk*&g2YV?gMaE>3#Ak)=dvcLi?rJ};J(Sht(2UysTL1sRCjIVHKSW(84y zuJWIFRhX$0DzSK+ZEpMry*5@#<4(5->KBA(0QVe2{o;k9<&$vFnLI7E&zLhs5o6BcdXV zxBs$YH^%)P4U&=VNXQi{1(*@sR!682XltOd2zv1X)iB4?<0p>q11%miSU=+K>I1Et zH`9-ea^Di3bNFp$7LNEed3i5v`5PK|pFPn$O4l~$$6ImY5=Gk0L;%&LoM`V4e~Tp= z6Kg%T@2NY;>V6UxajvEO6~k+-LiS7N+}&}p0eTiAr9$ghiKYgRFDn^0COKdUu8M@` z))*8Q
2x$jGJP;6Kj0zyy3XVvxfy^{}S#XXo?HxMOx1dkgzaYA-q+T3vx0!b&%IHA-lxgoUZM z=ujKdehKr5W-m}Ewwj%^w6DlxKz8qhahtz7Gx>l`@sY!psr6T!Koil_Mc#N`8Q$`AOD$FhWo~x4GDGncM)>_JG4@J{ndZ=jEk@5hVCA?b$#9;lHynXMLpB?oK{G5($7A3Hw84qlg3va_|ymRNy!a2r=L@?!c0!}4y z^H$XzkB(9MVvNSkwR~NQ^daH&d=lIhuxUeLb+cSo>%V0MlAC0JJW#|cUhVEibF%QaL&Tn zS==eQCbb=L4&~kyoy{NZ6p4q*sWpc0BSow)gXaNU3G#>uuHf{+&v!Jq`6w7&iTry0SYf{>?XGWxG)wJl|pYRyoPf_n%&4 zoIPG2hNq@&+rXZ(6lN^j?XmcGPw*95L|bO?XglR}Mj>k~TJ+xW6DMx5r2hH)U}=7y z@r(^bpH_Qg<4~^RGA5o}q+>nhoO;cC#S|AqNWbTc+LOptbzd0A)#?=-932^Hfe;Tg zfDBXvo6UbP)g&&`u+=C3R>r|})5+RCll!M{YR)`e!9OL4K z!K}1ArOV%!*Oy$8l9AK`(H-Pg4}Nvoft9mw->a(s#$#=jrKdeZGC{3>a`ER%Dy0n7 zW7Sv1h*H2Dc!C>aCPtBsj-r3nP-FB$rQVWcGIF*8uLu3Zp7llxYwP}e>sTMkp}afV zn@zGgz${Nngn#4X`huBkNz6RLV_+rRx5f6!fxyPr5)%msn5=zOa#w*-)4 zL4O+>ZL)Ls3bkZqzedEmSy`r&q?5#r@|)Xg$3x_alm}T^pMin5L?dE#fa8^nJxWi% z4PxhN+pFP9@c!BE*%JVKzhPsXr}wcl!ooiwTETgwb*;7X#S7IOfm6Di+>pFFEs!$` znHOLJt^WyyYk&$(xvJ!r+RwY;OIO#^zMsRxrbS_=5BTNUjHpS*T1)WP;$TDy#98MO z#zT%at;vD5xYBIJT*G)~P){SI15=i|_V%g43*%4~YWvi7f0CD$)>2o`yGN?X$sHwV zHVJqNM6Ki8FxP08N*ZAKOUWcbv3oZ^gZK{OTu_2^Jn@3$97@(B^=(sc*g4OfF=}~h z6~H7Dz_=8Xo7)Q+6+sKG!@C>v+Hjjr7-Jx1OZt0b-G^*P(QU1q$If8Bqvk)xjMF*!;6+YgS(# zpJw%%)ZHZ?BppvqJZJL9m#OX1&O@|zG=zf$2-B@X7H-K=m){c1Y;1`iUYhsy%>SDw z4Ve@pv`Sn~fX7w!%xppK^#9gLR8A*1OSb)(DLwi^j&pqb==5}*RB6~SGUy=$D%=`Oe z&+%qsQc*6N^P||g9VfvnmMlRAJHz1z#47<4@9Hb~7{MI!<}F#q!X*9U62n=if_s0F zX!b|}YZ9}RtkG5`nJc(u!DL}&9F%eW(8ZG{N2!o{XnnZBkbfezd+YN+gjy)^+&12J zD~?anBf)j`FT@x^F{)Jt*#O%D_KmSh2FF!a;sdk%`ywrtKsgJ^OF=BfMH1upYX|R= z#1&}5YHb`enk*(;S9Vw0TvCaVQ9xjNi^!a3731DK@UM;fBA zo#^azEZuZ7T^Rq2?Kx20C&>+P5<%hxNr%nyT?^o@(fbpabl?^uco>D(B+QzZANzffk6@@p~(e+x^Mh_JS}$zdwM@@O#(?(iN{(zpIrV;LSb{p;jV7WTN0cVLJ5|T zXGKOt>>{kXBb3>Vvo*J5k_awLQ|D%XO3M7SjeH4MHZLH#~$(XR3Li0uiYE)IjRndbxu}R=;Etr+5cT*tlO`l_JD73 z-FblSickF6wnnm7JUj3KW0><`tllU@!K_(~x$LWt(Uw;a2>=l0Tc}GHkh5 zgl=rsfxgb?QpJ4s>>gs-CEuS>1m@ar1$=qxX}}+E_jvuv0iQs*k4DC}Ynv2itYZ7k^gk!DZRvEy#rMQ#MY*AUG9g|>MG4ve zmR%S=U;Z0^>)0`QX1S}JAq4XQ4Mcbt%=Eb~kf%&S_%3_tH}Vw7h~*V0vasY=-u3W@^y$r)X-?8kuAZ-IqAw9?-pwXDvBYYy?vx&+M3s{iJ7;S zVHjpET8;t=sbBt2maW!TVlM?Sfsd$YJ<~oD{coNP*S%(z-j)6m*9g@4Iy!FX@F1fq zUFw^5U3Ig2aOd`T6jIcgBwkb+FuY?&93|i;9i5#h`iF7l9FcH1XSXZ8S#1!`6~a(z z{X_O-+TndZO#Eh1XMXi>9+8Y~PiknTVcT~(O0?>0lJ7BDmrEdhy z>rsG>&3g7{Na=dsS#fcz#mP1(v(i?0a=~{P8ymYVk=4}I<+Qoc3&~V%&C|~OnX;E0 zG!!jQfBpJ($)Dkl!~(CV=-uBvo$Bfbpz`P|oX>ypf@)~w$bSRSWZ@0hU0lHiZHpK8 z>P0+t%N0t?ya~S8 z;bB^2jQXC^sMlyu(&W05)^c8#{-K#e7AVbPVjv{eL9>= zY_rUeUz2OJzwJ3Q4-b>aG3x5gwfTTav4k1N<>cz$^?xlYr7WzH@8+K7RL{_Ew-kOj z;y|c&gi8`&JsJHTsd44l>aYCXrlxjcn&cvZ>igFTS!Loy)rAHk&Rp{O*P$IdgroWN zyW%gDhJ}Po**aYyak!1*Ohut)n@6}nQiOlcv<{YS@U6|%@*c!^2%5U{Y*_%N)kllF zkJS7_BnSG~N6II~#l&<9ZQfgT_rbV-qa?~5fo5URob&V)m)bb3ftGHFSp@wNY*8>v zytjpRHgwh2<{;R{GHe1) zoX$m;(X`0iOH>qMBU-Jx#HL#sh(c&UPjjGTRYnMNLFS9S-AJe=q#C18r+LWA2?^ zg?QDAGTN^s*URhbDpr@?0GKCcQeTJcZ)kMd|NX&^2QHs8r)Ot-3g>Z>jt_7=t*Ncu z{ONaN^l$Rthl0*#fo(k`v@#^E-P7$WRry(2g1r@ENJb+C_a+cxBuh&2Ki#<&Q^n4d z$B*ZIj}(~#3J44^FpPk&!uL|;2NyCP8XM0MNX(`7t2FMGaJb7WB9da#@R_y6*kW{G zfQq)2mQYjUAD%mS`fHVBiQ78QmKD01k1D9X2Y@PS0_lz}n;Yd_rHWSA)sT2-y;Ht? z+1czihQu*vZ#^oM+V$TwrBP9z)URqg-w|P%AVYayqVD<$PTYV;9$suXyf8a^n&LX2 z5(mHIk0k6`gQm2`i$R=Do$~)W)I7hfwx(j#;77RSE(%M9O-LvAxd#;SU2z>2I;Cbvu|4idtaf7BIy(B%4c_Nvyox3@&lKxyPTw&9^x(V@ z?H_aI$NBcR2&1-iMwu%tDLa85(0|X#9{K%uYf3qWO$BBx4e%nqo*KbylZKFxsAIXC z_E*WB?V5dUPvL!D4vy`_0p1wh#kL6Nw?2+gH;pv9`H*>;RiFi>< zR~5M>l9Jlz5qHXpQBgr5tlF^Z*5faT3Q!|Vn=4xW5N64ICuw(|vOo8^f0vij;8=UY z>*FfSRIgk^m^=aJGq&--*Z>1IR{smqI<1dUn7A&U>-$#5_)!oNp*t_`o&6rU6M=7> zZ%hnIt|+mdkU&cO_5NoJLWhW#3SOPY-ZW|#G!RX7-*#c|u3e`)-?f?Z>Xt06#P9Yh zG%{k<5IP&8Ha;?=(v4g1EMMpcpG!xNO9KM*9vIdvZ!=n?R;k;ejJZ$Ow2ZQ`+>`GK#cb z#>DIb(&_Tv?d|jwtbRs&UT6s2P`}B!4IkPSJEF_NX+@BUNKapeNQT!cU5z7CH^8&h zS>G#0@oEX@~u>ULAu z!i@kx_vt=lKm6`{E&^FfYA;N$zxK3&D(SDb`~Cx;Qyj{}yZB${Ou6;_po>vS?*Aa zx!s{d6SB{z$)M3nOFaey@Uv%vM74%)vCa8pKzn&hwa5u*3Fv>Q-L5V9X0v{PC?Cca<=BmYd@wY=K93` z15x7Qr5Md32gf^in0f<_$zr`Ndb^62cqMG5qoj1W_g64m1GdFXN3GwoDjN}0q4TPK2P}2U zOFyp<9$7evGDb%h*eL)^`w?S_fs4k+NEyuMUJ`&5UUd}Zd|!?kWD#i zKO*eELc*tz=mcvm*aQ#m@5%chSQ-)U=Vu}JMAzWwIxGschBi5Dh8Rsi5Bhl4bkGc z_A@1Qb(UMG3I#d2o7q3v2+i!D&KThh#h~7!KjJEzs0Q|U+awcWAU~LWef7$8>z_Dv zK_En-*r0MU<*Jm!0=qI|Z+MxFAiATy+lkGcw=#4GBeexk;J4-A~cdnz{znKwQGQg`- zH1{iCk%+sMU+?L;>9W8gzuW5z#2&4!ccx$oZ7^GXF zK3W7ii;VC);EI=gR?G8$JEZu{!{JINLD#EUa4JTs2B%OfV{mk|faBb=n(S)~*3<`= zUMXLC#V0u4k$ua}ZE#BVy+NfpkyanQ`s~n!Fv=xz${Cr`%7S~rPia!JV{8PCG@LS1 zttlb|hPv&LvKEwMcK5-oWnv~KVqrp{F3VPXtlkxgIp)-5)xk-G-o_g5?mbh3G%4nr z8&XFOyIijKmX7DUgJ8b5HJJiRb2+#2EH$>0sc!(iLq)_$I4aD*qN+}a+W&riGvh7$ zGi8WkU#m4*EZ{m0z? zk9N*7UI`zM$(0YLBFJ}7ZW{p0z`Hij zO5E$qTq=o_^IwG4SG(^NXdHG*%efqxr!KiOM4jxgghN#PN%Y)e77LgLEo*WBy3NIjyXmk`hZb#SWp<)Gn%x?DRv z{``qqxULa`iS6@}+j%C0&z;_tvo6cu48wq}K&+g14AtJU$*$bZ{$Jdm?53h)b@h7C z(jdU8&?Y~m#1o%+vUGd`dumqJaCw0u4sX=t3!9tSOX+sm6x4w{|93*Jo-ZJ zZ~qe}8ir0x&RFk_{C=nDxb2t6^2Sr~FT=t>qt78rXH|}>*Bj?}iZJBNo9_zVK_fbv z-~S+|Qz<BeIn+{-&_7u2Gu@R78eR(>o!X8^O^LM&7;QgC_G>xiSgz$EQ={u>78M;&%Paxy zqR@RaMvmpqkGkfj?D@&I{#Yq@s8y4Y|O_NPH|!&Q4NEz>i##TVxr7-fJJ-8y-g@N zP~u^$J&Iu2Q=FU<5?^4*Mz?#~vP1RMDFLrgL=(2W-N60CO8%v~I=7@s8A1)ESA5}> z2I|`9&Ly>YKVA#|a)SIgd-BBWkbAR6?m6bxsp|UZM_31+v71a7&}*Sq?(4f;6%fmE zKtqm24ONthiR_*|QzsQm_zs<|Fyt4vH5GAPLCOzHaCL|R9f5ZNoB@pOtUI!f8M840 z^%eE{+x`=mF2_hDe!S^Gv7@}V*Xr+dK*diRs815rrWTzT8Bd}6!UF&DE55wRd}J9E z_w@EcS`hx~6*Kj9xx{9-^&RkQiC8hrjfBO9Uqp&*Pp`IY0Mpm8$U{_Y!PP*Ej9Zjd zRdI50S)wQz89DAHop`OLP%Eamm^;?`G=_)xV$;uj8@$`+?k=sWN(1!`bd#JyKIM5i zId(QSF{1Ze0IBVm-mxmX^M6$x3z?U`8FCU?AJVVAe9R*6C0%ZC+OcSJ)BF>te>buX z!qY7Le&Vu4(VCcK0*ET3LRLGBxT9kSot&M;&Ybzt2=NTd$;6wQe=b~jG{yZ}EG7Ac zp^*{9ebCbs7YPwES8%;oRwhCo1mOegjc1$8Uee()F&tsF$gw*s(c>VYQ*67XO@~RY z#SGCF5)wUA_vlL3)*eD{gwFyYbWRhhZ<_8F_85Qv0R#ZGCC3SR& z))7%0GSd2x<>zM&fWbVVvGc#0R7jt+R?yRnD%JCtXD;YSAnHMtSw{k>y(!~C+rrXYA(e`soixmRa_wD1^dxTti zlN2$tjKcLlel+*>DLLBwHLsQex%&h6Xk)QYT?eSI5S+@M5YP4+$ zzWE?*T=04H-&|x|iiAe<|M$BjUnyt!|NrB*1OIKU@MSS?<-@D`zkg;B`oD5d{Kfc7 zd;ecQ>HnL5)xWKggn1qgEBMhuU%isB?(>0SdGC?>(lQikP!`S%4XroH-e(XC-87+< zImyau-JMqs4`v_o2_ad5=0`7Y9l8x(tpbF{?0QHLxi{B;ebl@S;Hzkiskb@%t@hlYL7)cS0kvr*zY8GP~h8+Hi8-}X5pn-bZk z;QjVFZv=d+J%vn5%W?KebU`jdRo{^ehNaw|y?fuiLk*rS$C8(ykE_KsaxfeMXMDlY z$RnP;al#fc?OXrkZu2gWWAS0YE-sHo&fqJK0WCCmi_L#c>M!D6hXb61ieL^=*cv;@ z)69q*<#4)+0rFM&cXCYf;RYABYVm|n$aiE(){5A#Xg^w_eME4e;=pzh2<;f{@9PsoPPH=+3WpJd>!Y&Ekn6- zh(@#O8t3Btn6J9JdPzy21k=o-cmlfuGZpOB)eg6FjN2sJKt2VOOks!{)EQctVmFp= z^zv$EW+_-#^u%9SMfB#{Pz598bvCmY~J=1%Rg@)pX-g-TwNVULUx{8546CUsQu;A)z{NYbiVYyLE zghcW}@o8|~THd>{`OGaI4UAk%rAHgDA|*3qri2Jt~s{|oKb+|gm{ zy8}r^2*KyJHtfAG;T{J&JK=#2fc@C9l#&%7Y7`P-RYFu6m)0^Jv9>bRH_2cDTmF{W zNiJw@GR=s{vYXoHKf2c~e@z5({Of6Mga^`YB#kL&fq*d(sz3&_ReOysd(bcj1DykUc2`EyMOTIXW z!*fUIm3bUP>MFk@K;Rt+@zE&Wk5U#q`?M+5|H7W)qsCY7u}D8AhTN)jo@xpd)QFixRIG8IH} zGTwbs4>Xl4yGO6@+V&+tYNM{dbR_VEEFAKaJSB__UD^7ZG`PXs>!VcAY@jO5 z{_E`Z_yd^-Y?Q@?WmM9eA`I_$90;!7=CL?+;^zGEFYhLOX8#{vzLezaD=*?}bO&3qq>zGx0U|J~uzGMYJYzd~Y^1(k2 zJz>g`(D-WMjToWc_SxVxi3ihsK;H}R)to7J#L6{PSCcjV>RpwEcvLy*4g2KmP!d6P z(BAs%^KaexGYt6$eJfD@VZ$uzzWHP8T1#og*BH!0Zr%o_(*_Ve-Hbi~HWct9;lfs& z=O!Q-QoknmQegz|0l`(WX7f4Zl*WjSW3+ffUEO%E^F`y)9DIfFVdLlpQ3{8^pN;j> zI~`d!n5kL|$MQ#^kE;!Hw=x>}Zcx}dlhB2r93+XCS6BC!zu|cGX`;eF{?mgaCxd{~ zJAmhhMgDD)3F$WA=P`)xM<+jd`c?j$Nss3R1#JDU`J>}aWbyGwKy%=x_Cvu%ibZ0PD8l9QC{YbQcjeqU3QtG<( zn*=pS^&j_v6Hwg`RuE5^;-=K2rm{+xt^NS0@L8O5`X`!9Kb$%9PhOsq0mjb+PENx^ zhg2~3{53#n;G6y};y~4vg zcdp`H&(JE|P1Hx7;iV02;|^+8+w$lVdcYlEQ3(?G=&VC9tH0D;y*%)Bnql1|8y2Y3L zVRGh0c{jJuNK>Sz_^~y_5{3SkJ;kyn2U~W#%Z9aN5PUSw7;2;P!5-^P*;Gd-5r^x%kq1^`VVBE$uGdfmj#jfA#J$q!H(mlPP7=LaLH|_33 zO^)Apzpp$b*%C4{QB7F4_Tun6xt)C2h6nF0Mpy^8B2Xn!tXQ9r{2{za2nKli zlxxqPJz~*_06Ti%0ML|3mlrjvVc9qKhWwcp&(cV30bC=Yp%2cUeeUm%aFPq3PH|ED zLKlwzMMmC=j+)*e_~pi z!0*6gix(Un=|U7RMS(#E3$OTieSd%Mn3#9x&wKXfzF7in4^kTmrv9d;=ik*|$|XSF z4lC)E>(`kCP2&Or4ss%U9VKJRH8E=2+PXTo+2fbadyY&^Ss58M&Ci~*v%3tZwz+w# z<}*xED2_06nCN(?rcPozZ8Mu99>hzs^t42c7z6|qpq&0re=4nb#U<2nI1>-vVD~9-$sNP4=u`w z7sbcV)`cq)SSP^f=F9V=wG~M;Pb)_VD!N63x#3+$PssGQR&aB0T)lc#h@amu`xWk| z!NEZ2I#*U!aCo*i1q!4*z4&E#_}Q~(b!l1nxd5r(2=YlyPk$bu^5WJgn6o5$%?aU7PSzi?w~>CHDUF4-=Jhk|AX8}H zsIC4sFf%o!pbP-y2dxHD1MTkJ%gfGYaV7o!{d;Alk(k(FWJsd;sj7O55k^FKINVc6 zP9GjSxc3M{V`*vdbaQN&#-F*7w3U^rIA(YIB@)4iDBe@z;z(}kCbFEDjBnkV(h^J{Mj>#Gl#bz8Q;DgG&4K& zu1t@A=1b4cPAMpOrko@sbPr<}VgxK%10THNZmk)gTGBhGWA9%dcQGPv-sjm{W z0bhB!xu?d*4f*J?O-4H6=SF2ECCF$@t-bUIMn{k5*Wx6hrViS@M-itfK<=hyW_`W< zoYcN2j=#3CnKL(^6g~Xh*LQHd>BJLfnv`o#OGw3{pL?J3xOx7w1=%Am--{FkwQp-( z-DATbJ6qeqcYi#(QQF@INMrQoJZ{JqM&Xc=VnIOQ^J=rtYw8@4ja9d}6FYrVv zLuY+2VcEZN0qK9UN!hneh_a6C7Cs8H@#9aJXa&VMI6^e5;Xgcic6#lfB7#GG=@1%2 zMgTfX&HEX_$h4ChuiaA&c12YbkXFYks?!mJce&3M@p(&Dqsmyk} z2Y+RJWSFV24%$m>O)KUbN&|0h%o#mP9}QC~JvJ`kvYha#l=|@D8sl3veZfd;=wnZ=b|*IvHGf^n=t|GT;4H${)lTf?eEqxA0hRCwd~u2T9i1o>Kn5P zN56mP#y|bCdoDHAevXHw?=^mZ599Wq5&QQCCe#4NT=hI!A@#vTb8bRIFi0Su?hWl5 zze48suUke+$`JwM-PuLO z>w1N;bvxtVzlW5Fl0dZpM3DUD2yy%Uoa#DAAS2u1Fw^gD`aOcDq2Tsc$_mP;C!wJ~ z!UYaiOHOpRaFbj+eC=Cczp^2Jd5Hm z*@`CIHqZbPngxH-78XP@VSQL%o|PgwcfE~@00-~Oi15V(H;~)I+y2#rKBXQsFM|HGf%LgD_98ea zD?k$b<1Xn)tq?ItMp{La7Au8u`rSIyVrSmU_gee$hzOt+q;TMY-e@l-*nHm zjt)WRzhMc+T)HKB;-7vNQ|Q$3vLT3MLqo&GjC`pf0m&ivZJT~fl+!B*M>DHMF_TZc24*l{VO7D0|P;Eu@42~0a}KY>9(}7@Nl?Mw#Uz*ymVi; zyE8w!mzDKFx%WSDNH+_6zI_`{PENv72xAy@qsa-FXf5^6(D_~zWXQm56k$om#s_kY zGcNAjjvS+J-_8kp`n`QSigQg}P0iHY9B+e)qTjDT^|%M~qs6dSBET^>Bg0Ncrt*8_ zl5X*C_;X|4ym=Hv&B(j-vog)Y<1}G~Se(VBC0H)eu1QMviHQjlajB_2A}e%Wr0h3_ zH`c#$o|?M!Jc^cT09hS6#ZUd7JemFb7di!-`%@}T+r-5+L_|<=D_*$Z$`gjC$mv&C zW%g~^XeoEI-#t8|&o#LahgJifKVgdP_ffvG@87<~A=eX8+OtFAbadBI5}f_8hAliM zti+#M-ko@OE>cuo?Am+clG1p413+-aZrW>Wjuq9xKCmEu8496xbVm&gQvD%{Bkt~$ z?(Xiww~paMfn!Nbyqko0)a0d6IU*b@de6Kz)ITEPEfm#&?fjhg0_Q6}9(@NB?oJ11 z%E=2FC&2cw9;&jl%p3gT)q=XzRL}|fC28roavu@jpL=L`BYKq*Uq;oGR$z!wE{dMn zdsw1FQC3!wb2~h4X|<>M#tlZK9I0Ww>Z++ZELA!PVms=UOx=TL9jTpuR#;Oq6(y&? zY~Wx1P{x=3@#7A{#nnelT>MSTXiyN~np@cUl=SqzTnisRKbi?1lth`Sxef#9(j3zgpJ=4&;_ZcM&pOkufq6dOnyFx|k*QiY)qsY6QEIzhem+ui)iHV0W z=7VPJj^!|vIV{JHRn^x+xfCn+lFIKS!DsrS^wFa?At8z0-sYDtTWM+i3}&;Biefs+ z!t(JGW!WBqa0+|-qw%W4za_O~ydcd~N4@##)iT63#wMj*#m<|3#r=yJvHcIow`aE% zX#H-Czwpf8N=thcF7DR$b~cs-c6Pp51431!-C_7!b-nTij?{?oL)ZjtNeeLkCef>W zn#l6>{GB@+6}|%Vb3u!X+_L@*p5)@NQ==;3J{3GezD(cq(Qf~_^2R^C%9oA@q6j1N z@br}Y>2ho^wclOpgWLKjHn4jRZltE9(2zg23C}xwj)l6d6_-k4;+gtIKVM(%5|>VB z08lI8K(f`=KH^reetuy7A2BeX=YQ0jjfEvz(pA4X;m|csZXTW#w6^6RMQZ~4qom^( zY=q*Q#)-1QyBjN0Uq))}dwN|l=*JcqQ^57r_A6aGU4Fe1v+G0h3L$vu`NGnItq30< zI~SLNl9IWZ8Q3*;Hj`h2F;Pt*hgn>_{mlJQK6=|}8ZS4joE5aSLn;lPTnsv;ac9@I zA`g!Vcwwl0w;j6qp5-E7IRsuMhLdBzdx3ND!PZ59{u!Ke_;rsQnfY=X5)!1iNZQ#2 z2c96?NpY8sd>iU$nB*yTN4PEh4&Oyn_1fUccQ}tjP>vw5h41v~(~^?qwH9$+Uh|km zA7*0O&&2fJ_k~-{Y^spvxy7ftw34UVLE;*pAe+-5*mH6Lr9C@&o(4uS0-s;}o47slEF% zfBNUoqC36n!jUJbo*X~^T7ZA)Y#r0$!|30LBgcO3I)X}R#qMM$K1CbysoBkH3D_OLGj8JUp#GugY(XR zD=YN$^f=otUMdm2t7m=n>imxk#wWv{#>d0H2?#kYBOTW1!(VCeZWvV1Lt^SRIu-_NP=8ew1NUADCKcWOfefliMhuFqdskeYo!K6JhSvP^ zRQsWt8XM^V4%*$p)ubM28Z#2E3}x)*V0m3S#m!ZdW`m| z`a7-rBQ-bn?j1TL034s_=vb+w!yiib&0PdGsAL=SdJPTB&l;9B*TyK);R_4ecasw+WHA`IRY~A_Ei1B9-UD+QF*2pv< zDeHFrHuQCd2bpO{C6*Zpq)^^mv&FpdSLZy9$8N&1bMDA&Px=xnLu49VA~P%Z&H$fm z+(}V!3gAx?W_D8v4!S19YZUbGn4E`Tce-<)$O0X+x%|?lOP@Zil9j<~5xh^cKKj$k z7cVYKFtPAwfp&&bn0beFY2ZvH-}FfBEBr3L`M2pqgMx(3TOA08HPOe*G#(@b7na_| z#Yf!Fy>z7{kPLMx9mR|faZOu0GC7&&YlhTX*3PClB;xecyYT9i^5~Shogi@XJ$+e- zT1~T%jIx}MRvJ5>*F8OV8miIV<0hscurFYn6H>d{(%V~14E*lhX=A-MOpy+GE)uYU z-oY8t5K~M}0A<8|AlR1^B1?WDyR59cq#iI69V;n#_KfQ%MWZt$G3%?8MA^gbwQ|E1 zYinQD)}()i{P=-}t8|+OB3C(1InTT9@_LPZ42ef-s-30f;gpT8t`(pm2!g1rwII)y z_PuB`(QLP{iKX;(=bo*lBkl1Fepc4{&-%;+QW^&v`~&ruugs9Ch`)uPXJ`5(N5`q@iw}=R_wUwSiT@sHsLmrY;Po5;d zdlxQxkCVVB?c$B|Xh;efQsVY~6jCqMXwGH0yJrpzBsqjAS#8_1N2+ zqztn*cy9P8EbiPnie-vAnwsv-{xl-MO_mYT zD!98}azEMBmL(31?O68mA?Phe__H7=$c&5IN#OR~%1aAE@vx5oaE!5Q&e3`2{`PT7 zgy(&Rj6+`OFjD~7B{zwVPfKh)=1&6xc6vbIcEU#C?%iZx-xEbAd9g2MW@4AzRZ+n_ ze`%yE_m;zV_<{%`PS9p}Ta@QXDsp_?_7c!fjC%baEkHy>1aQB50O9}rMV6L_eL5ivlm`S!k|>2vJt#s5pBHw{jW9x$hkvVCv2Ek$Xz_QLEzR%RL>M|E_FDS_UEoc6ba7s1|M?HW>c4i^#H{A?b`oAX_O)irW6PGFz z7wWa8dLk%Zo&BadPGplbbN2BHwZzJm^d`wzg&gmX&X| z#reT)NW_(t435;&6CK6QLZ_>rhlCiZHd0wwgpuuZn;tg}bG>A%eCmLrQ>HvGwQrxZ z4G(ReQnZ-K!ubB>5Vv(pZ7mm@`-;9@#psD|j^0P+`;WUK&E%UvJ0{SK~h7^l5oHE{gb+lryMjPM@|} zoLm$zR+3?RAqvOd$nW2*&aDBW3}?H7EsJ3sU1WE0joDAoj=7xD$v{P^77*jBg?jlrT zBtnX_MPSQElS&NC%v`1(0QmnU-3Mu^-7*Aopq$gU0Ggvm5d@?{Lh=SrlKk-Q!UECl zJ9dz=Llgea+G>MYH3jqPu-T!nFWzCj29O0QAtx{IJoSaSSB`_TX8CWo6{1zWmzA-5 zggB5O%K7AZJxUiMBD%KP#8-l56lS|Y{bga&CEGd%5wWs^;tvx)OJm3K_oYg`Mj%Z} z*B{)sus9DZnePV~0=>VC0Wd3eKhk*{H|PJYdF>e^We4izsc00O74Ri*CvcN-^MnT1 zTP{x0IY=S>^r+Ye8mPy2r6fDFJ0IR>(pPjN;n9sFN0iTb93>t1Y6QaR7_QJqRvO?%=UHTjdhId!w_3WV?Vg<--pkVjYNSh+ zf6IM7XJ_vs?ryBzgX*z47$@Wn9mbU>^~y}tRS^=7YaQ7$$MX`@CZ^hr2#<~m)C!on z8W~L>C=z9?huRRnAMUDotlNAqKD(6i{(Vpo^(}TvpOc0H(oJ{PXuW z^m-b_2Ml$fTtH?~!9YJ>J3Z<=WdtQ0;erWy9<@bM^1Qj2GTLb#?nXQR>Ml zzxt?7DYIsWvOf4_pZwljcp^Ay&swIAQX0L+uofycEB$|je{r^cUIvHL4*U6 zf8sHrZ+LY&I+>>{Gj=Zn9~?&I2W<%|at9*IjOJfXTcawP@~~Bni^m7M_x#sfqwZrSabC0i`;t2RiE+fW14pVGvH>ZT`esmvs%kLX0H){j+uO)G9Ul@_O`YY zM)g11MgA--1o-)}R7x_Rq9I;1vqdYjC5PHLNJs{J{eSp+?{F^v|Nr|$MlvInSrL*| z$R62bC8O-U_uey`tn8H?LUuM;Nj3=~+1Yz@J$$a;@AJLB|6CpY@ji~Xym-CN^LakT z{eHV+`oKxKw`YOC*9?qp-aI$9p6Tx~7kd6&O-wBA-MbQv!C`O2Pq*zG_IGAxCsR|F zYkto0zLGRIu|kdewM2)WI66B!I#j|B(brX@4hMwew?0%fHot^>?A9OKcMkY*cl$1Z|S{!S&FoLlZ5=l1Q*`e?z6vPwP2pUr}e3% z1Qe&}2tb%J724+-!$hGyhXn|#4@gaA6NL^2_b?zrOOgrTvpR5+!%f4Jw!K|D>&oY) zuaAa=Q&P|nV8L^58xJ_~O-=r=H&IrJ2i^1q#}G$k7g30)q!%$_!cJ;-Ghvd^8O>(` z7$mB8%G^(IK(r4^*0neD>WuMlF=ip`%E}x$aqioH9aU9tGckcv_g$8p!NyG>NucC@ZP{qF8J ze3Y(aXZvHTlIi2!v0eQsn2L{JArh5kdJPq2D5s^quA*XiVj}Kik@VY|!+Uz1SwiqO zD52u3X~)~Q%whM!7H<#BdK;drR7M)iR> z;FV$Cs+j{5AZ;ir-j6d|nPdC1#3Oi9ugu`$%(o%HwrIf4S`C_hxLP_WV{L=>dm zc*uY9W174)9p*Zj1k;-xb#g=mwxzj z%S+{@x_XUn+q>Ksx4*d)l2cKYQfi&7j)_rFSR$Y8m*Nkr8=&s#jF>btTLdBlD+k9) zrUB>|K#Hssx=*kPuy{uYE=lu-;$r^$_h%2*AA{ZWbD67rj=Z}&88)?E#kg>$$>NWW zz`$p0MnB;A5Gr7poZxZedbx~y2p;c! zbKt>6_o%9@{BVJf?~Nci3sS&e`~78**U4e~0Fa>U2h5r$?tQ5N^-iAf83lT|?a{mR zQ<}-hh$<=VB|gdC%7mn7RphhHtj2HtJwc?=2hsj3Bm8x$o)7_#yZTT_v>&Q@XE?fQ z>4hwNB_bph5|N(Js`L4^14k8S;W`cmg{HNY)e3V(7hM3ckG_eCj7Iqz#=N8?!f#xI zux0x6Nk*&55Rb zdGyzR&P>eh8Q#y8mG8O9nXu6-Do0+vBFo9lG}6)Ga^0c9#H`|wu&-d!P*s~A;{=SA>V_f8B38|%Qs+$y7|NmQ{Sp;*+^p6CJ0jm3q9 zerJZDn`p-+PUwNK$eG&Ru_Kq8gi>w4e+Sd642_S!1lK&$XhnmL=;FZNd zRV}TbH;3Z?^VU9CvJTdc)#-n1o@6r&ZbSWm4XKs}6(Mr@DTz^W97i6{)zm^_Vw!@2 z&io%C!J*P?Q*%+eR#uDa>yF1ejksh#fr3>9CaI$%oa&m*E~ARk5v5ZLTNoAI(;EXq zAsnVNnq_BaV@^(XL$+ROFrk11ItX>Km^{GD$Qav~2vwkusqdG#EyeSSi{@r`ckB}6 zN$pQJQ&OCxa({mRo|uAyf}DaM7XdVongGR^} z;{htOhT@wyBFQ#3FxqvZyF(MF2L(RzAvc$K^*hKy@$k~Ox9^tIr7kY!(O~kN_`Maj zRUYN-XAIO;R#xuMkbo|mo%d9EjAtY*ZC&ym{`?-@zTm`|6wS@b6o?y#_86F}?@vWV zp*XZ#{IOCl*9ctkZ%p!Ui;GcA8PH%j3-26g!EW}qOirjF{~+K8=C+sIheeV!JPyl; zDV+W8E=TaY_|8W|5pZy@I6iI*B8(3oASzBD4hC>?!A7OH)OvYs9?d5&Pn;@QB6nyY zi<)37EHt$3Yx?lYuT*Zf=sAp9w!M9B{!_~ZKM?(vhV@K~0@+1=|h8{gV zZHUmTS8h$_x9tqQmss~gxX2Y zm>*mcLR$I z>33=Xv654hZmIDsC6V>MPfoeCu%jcC{Jv|)cl}#gIXN-z8b|s0p}J}Dq`@mXIJ`Hk zt6SH$)zKw?_wiL$O+D>;a|e> z?)-r%m{por9) zcjGpRy6lWdfs@IEohLvTN`OX(mH5|;_pOr9QK1(PiI4Balht1n*a6z#-R;f z=YdsK4uWkJ8eBcUTxi2`g)$XZ96$?cV6*iidU=XWRLSgF%34d- z;K%Yw>$2DFO9^VPxjYD6OHENCr4udMyYr%BNf2s>@dzI;b9v;SL=k1|6N4NRS1L?2wgaijnH zcW#H}e32jpWfkBmlRweB<7E=rI4bp0NhxYfj2QA;ONc_=J{3ek?%ciWu-Os=7Z$1y z^s+yLAS{WST-Jwcd|VuKu$5`z%WK4cXC42eTs=9G`Bd6Z$?Np@?e)oD77t;$l&c6% zD(e|9xciDcC%32a1g~-%3iI0^ zx~XYFFWT|#+tw>X-Gl&18W{eaK#bb{o&})wX;ZR%rE`;0$PA6UVDrvMfF&%v!S8v3 z6Yvpi%MNuPii(CY86Kv|NuLq?6~cr^;5V|#>FJ9j z+iwwMhcMvW`1{w7PgbuCTw)>O6+$m9q@_dSl z^)Yx(0-Ny;n^9JCbH@+#!58*8jqQ8`tMMDJnM|vO;-ncOgY!A>fQl`?u{{e?D0vbQp^Aje>aU_KcdtzV! z%V%(94@B+k)Ev*AK_N#H22wlGOa(4-iV<$G!+|Cr7l#~XODPx6=Rj|oM%*~*4!tHw zgwR?NpAg+Nyc#qoB~db!#p$kzj-y3eWc7d&nJ5D~lH|!X#->KLmrq(gAXWzg(G0 z3|SMu@tuz8=n2Qak4I1GjnP~-W#@rVcqS&`tR5BRD9$)={Krd#gHgL9Ko&$Loo(>+ zE+a|En**b5QGJwVGo25DpkPKvSJBh6v$I>|ocSa?X54=PayZL!DPgxrP`jU>dc$_L z9fEpcZ<7Uz!}vSQHOIeei#Ry!+(bYD@a9d^xwfh*3$d3CLK~1grMG z7nCcU`WMuL)6;zm&{iZT7dD7xpx+Y`*14pIV^&x9I&@t8tur$cRwI-d{d7;KP|?nh zJ(|+eEXBotYI|#5u9gZ8>;uV})qZjFhR^IRC}Rl#wiCsMG|(1PPFrQ?N=|s=n%D!U^Lz zJc;Za8d;~?5f5w;A!X$x8o5FHbE=TTz@X2st$&mrIB`F@;TfzReM3N7&N}=1=*TqF zTfkq(#O)8wcpp_;lAWJ>Zu=jC#5f4Q?cZuWO?dY3N?>5>{QMVuY~M0Sfp7AhgC-vx zb+*<2l!>Xg_lFEFE^e^l(D1N)+6kEuKt!nWWRilPp;=Fcqhm@C%_L-I3P8HVybx1} zC{&rx>w>F|$=~%ADnEuODYuz5En!tv7|C&izXVjDuu=e~5j^ifYX`zfSp8G7eo&{A z!`CSzjw*Xw3-oAyiw#mFs2Ac<; zIHXiJp3j&gF$R z+zv0vczJn2g%4je7|)M@48`RmFIb`}grP$!YlMwc?@|~zN+%}WS(&T+9VlU{VPFlh zV@D3MnFG_c^XsKjWxM=eGaV+Byxh4&qzWXmCx)rG7ED_`L~mS)ldv z*x>=02dXe2>OOo3LF6@IqJJO0Sd>kA8V#-*t_fmnbfNP}YiFb-^wx`)o4R*?j=b%Q zeSa$B4LWxeEBEgHm^OfZP8z*W zh=k#sC@Iarik4*T$$%p%EsYORP*7M)7yK3UXUb}DDrj0R9S+6-T1!)Aa8E%mX%w$KsC=urPsXs;#Goh>A{3>>;d$N(xZM zeHm_EmwK7B^%G0=)vNUjENl*OE2@`KEYtn{^_YIgU2~0_$=wEJ>MXkg!*27EaD>FojKIIm^C*UXR=s$k0hy~GBxbABclf4Gl3R_H)IB5<} zPBfpz#duIHDY{_kA$Q4Ed&mRldN&T_hfS2``7F)ch}?wUz6Ko>XPMS`6h}mt3NhfIm`FfsKvEHB6^;gDHowiVkv$6b%;r zT3DD016v|qQ86)epSY-~9eEu5Xi0Jsk|(Y^IFOZka8_yhYJmj2fKE<75rx-@y!xG2 zXKsgx?CL7n&W;wE56mRjo^d^VcxxN>(4fUhO-qwR2X?<*n1S)_+Imo~UZCGZMe_*_ zEd*=>0-=rZ3!LBp0>N2UcX+D~9;J*?MC+u<3CN0ZvcbvvQM;M5of!t43w9_iqoday ztDyOLNq_r3J-tt_%H9DbAVrF@vYt9DM}fD{m#^Wl_x0<!R2Kax;5Z-1PG%5?*lsk8tC5M2;t0SkuJ2@?o{^f{LDa6_y=DIp* z!v$VL6Pz}e20YqW=ICJ81}9&iu^>JSs)$28v^EHacps4rX9`?f=m-PDcTZ{oZvq9O z2MAVxup)cq?@!M?kqB{no6qnU&FAl5$PTLU$Mo*+m2Gt0y-?NeCQS9*e6A`bW$NSv z^GD6Pw}~>>k)7QeYU&GQj*#~AEs7TPZb|urJ6K=zRE>=>yCu;OhPc0fz=cU4uqSx? z6T{(JD3+`&E-?kL4Gi`49z@!OMgJHS_+!auRU=>mIZxIz33xA6RdKPl;BN=3q>Rka z$Ow<;$x)^V9n4rBJ2SYKnjdBOmy|F+kc2!gz@iW}U%9w13zeam$=Ei%nqdiWC(0~t z&7x#x9)9^vJ9JG`RW;@P`=Spzqcw&ykmWZ$je$T?&g8^I2o1cKLt~{cz`F5E=;w#$ zmC9wWfzxoY`Ra9&Onk24rTgK7<_ot++ipfiV8h^l4nLB}1_L>4O(owHKsl^wNrA38 z#jN-on!%4Bu?%D$zzu952R@fyzkYq|e6)uH@RJC#X4iwYFQ4T=m~;=35`C_;9dKg| z_F@2T4r;!AXT84iGOFet=a~D{&bq_6j9WLVpU## z3|NKGM}ou9d!lmm=TD$r&-Wyh5fZXIpstvYe;&vZ*_F_H?vB`<8fo6SO)8>cA0;e&>;roc#CiU-y|pZ&bLfN=pxq zw)I6sG6+kDP1xW6`uODwyI^zFa*LUT#rM8GbO?ZYp*)Hon=U2<$$kx4-@h{t-O($9 zp&{Xi?^B*RpJb^B2`da=+{RSV&_G2%bNHJnm`{V0w2+2W5{{5JZ|;7hb~@kuP{&hR zQ1BA26}CX3d!nYB;4%x2`2jK3czAdrA%s`%zJ;+!IHFvScSb{R%^(i2_4jJ^vl@L5 zE%UTn@HOB%IXQSF;FN)ba=aoaJzWHPYXe@7w!ro1=+@=Sr5|s=`~aQ+U|LvNerWXIa+H^xAfx} z#*KF`D{tJ;hCpG|mgT`Vcf6yWogD{9$L{anU#h6ko@5IWgBCA%4blP6(cf`-vbiZ?w}nRZt`^wbCoTZhLSS@H&M}%mEqf@q|z#-0)Ltdv&Rm2KoSOI zSy;latgJlsJW=AU_sTiDd3giq>U$kwkZl$w74!)bubw`|5K?~@f1Ckl?^87*s5sD3 z@0ZZeOi%l^7YZ`{=)DSHqq=z$Dp55hB}R20Vb|;`X`V;-v#P3!tE*8!As+&pPE#w| ziZQ~_u*W?;Jt3;e$zMQ3jDYx(c?=8sdEp7If`S$LFm^&EhS901TUWPgMTLEE>^$8y z5Qn~cfp%zjW0MNVt31in&)#&OjHa-pvDU-G%>MfYAE&Ut&kTC=1v4kNPuB9 zaZ&{^(i6iX91-I7Jb}+y5%zVT(88p1Gk@K9b2q{p1&oGxL1;*8Yd^$82%p(y@LfMY zoZS6Shji_Njp|qs6HahgA|Wl{ObRZte)GmvTG~uP;utuW&rLZ5h}G1RgUh^65By;Y z;!$j7Wd*j@uwX1e4V2{N#ji!stE%ejvprg|!~dXYx-7XgM??yLzyjR=3rkA4YcZ(S+WI8|UHS&KDG<5qJpP zqM{wX5Yi66O`}URGGJ)o;_`);$IZ}y2KGgFO~p`zVE+Z)Y2^6h!0+EU(S)GGNsW(x zUT$P&z6vYCmmf{3S{CeJTq{-E4Lzt51N!nE?jhL?P06`zusnbHlEb@Ns4X}Nnja{f z`JOxpd0$Xh5v%(8h_t}#yI+T1Cb4FB_X=oYH+u<7z)NjlV1Isce0GMaDD*f$_zCL( zrq9_~7AVZF#W6uM(AC8cnW2VBz_h7Q|k;3S3Ts`kt*XikDdLxt5A zujC~VbO&7ux{$M--N?xM423E%)rW63&uA*WPXc+}{09*12E64%_sJANGkoYf_xG#f zt5@63Q`6J7XGeEI_DS(p!tg;XGdDLxRN@idi6G3?wJ)nx~|KV{cW^8E4 z?@oe;TwF|x=F$NFsnVU>X-)Lan*>k7gh`oCv;Od-K)x1eMpQIXtANxF5qLW;XQ11- zpo(6V&L5VM3HS5sL=^&jR9_(=uG10byH4x#I2gu4sbiJd%8z3eli(EBE5rVK@6_saK1V~2qet5TVS5CCR z$r6NfT@>djEHUx%odpFmBBRw$fyro{e=#uS)9XmJ#k>#)_2md(=&5tgld~-81H&$1Ph}lo_GY+7= zf{8KoxtR(srw3CaL0+~_2c)pDov9Q~lF3U;oBB7p`i`92L|^|tF*Z1XkU!%UTd{O3 zNXyPb*g_0U3E$-}MSc0QHRF95+o1<>j5uwHGI`O_gwavT+B3i=em5@&58Ui?dvS3i zd;1$Pr78*vQ1l-wB*5jf@mW{oYnue1m8u&XsaXfKVYc(&0mG9g9V1H3Wo1WmbLO9l zHJ@3YL`&y_c>zTM)U80cm>E($SjuR=`G^uWrmHZ$rQ*k?;A944Sg?3D*qY&3>}t<( zaXC^_buN2LPb__TaSocw&#t?H)=lGe#{JKLZUB7YIO$pq$V{pCI?{DlAjl6g@rKF| zsMHIKixm7PDYdl)B_()v(aZn-d2V-rM4dS(AOHYQSE4vZo|A=z9!_x3Nj={IOxB;) zDd>av?dGFGLwDX@*Js6fAt|XJ-QB(r&|08W_Bu5#&cE+{Jd-;8Av1=5 znd$IBhWEvGD;gOtE(Z;heEu*@+O~R&v$NaYKZ@0AkR<1{`cZ3t8^{v?f5=e`0nZI1 zBY21_czEg{*)B%CHX>p)@yV+a&3eiFVW_mB6%P@$u&{W*ITizMhad?XF|iAfSHVku z%x;4Z0REw5;E$1!Yo4^un-l+*O<)hAcPBnW+vack44@pqt$8|N>IpoC1uE~#-e#6cGFI9=9CxSm6Jn5LnYz! zzTm`u9UKx;@3KvdfIssZOPj${PK#f5e_BB4NDmJh*wZq^scC3Hwj`M2+`vxbE%>YU zko8%0qt|%>SPJ3I1EBzno&5Yom^HXg7ZQ5lEeuJ;0wF*Wn=uV-9tZ}h5Rh0&<+ITf zgTxwQ`N8Do_3JDMPIv^azrRTEQ~<3R;EYp$e9X)&b6ENM`7^M% zGd>KOq^F|+Fv4Vc7?NrLw>CaAb11Ts%LTGB@pt4Tq@)K^&XaE#0{|rkLozT1g1MkR zQ@0tG|4ph#4ZQRW40W~p&>wHt+UMiqIJh>*fesg_96)qcRb2uDU|m1QAqtzZocr<9 zjiKD;wY9*2pp3Dhp{zj@_&}PPF7{T!DvV?y*uet7hB_VVmjmsRYheeNfKf(_e9L14%X9xp#0# ze9n}58r$KpfYpnj<%B2^kv?r~h;E_+y~i2X(R8B?;->R~JdF!}sKuXDS4#b2kTMVx zBSLUDkmGfI`$oXzlm}>UhM2^-rhZ1m(5b;y<+Z*G2NY3b?cm~GK}a8$!L`21vBt|rP_TKjhHC1I?Q?BykJI0#Ksc!9S;o*0H81qpHg)Fw`-KJFH{W}{?~n^Xky@p1KjN4 zs&R!uw{Uw=jC8JX-`PXrP_T7oXJrBGv|Y~@w&{VmGbk)z~C+27sLk|Xi%CIC_(nc)4R)iFdF88CY9!<{+&)8Rydjxf8bNj`ucj! zbw&2|$sKGZp3Qe(=jU&%u67b^ZW%2aqvGB%r{X>Q&qOkRV7d!n zPP-H|G+;}>hkWrkW=Jk{^9LaZYRl0!n;SFOK}bjrJZ8UkSZD0?-rw~@4-*kihr_<% zN@98?gD+mr0His>>Tz^uPriKsZu_eOqy&1py}fXFa%W=~jBqYlYiWr986A>U$2DX1 z^!|bpPioE8dQ%s`_3ck}b!YjTKM_*r{f&@N_4CiTX$~4|SjS%R6W+!0%tQNteq#&I z7kE-29j>;T5=VZO%}MBG>`@A5Uh$QY&$e?vA)q{3&Hd~s1g1iI$MB|AnKyUb0R1Ui zOP1J+Qtjr274B;YT+|{bMBso1)~vJhq1WyM*)1XlCQ;k3FG|#FZXs~WNHl0NlF-r8 za`U>Qw7>-kKoFcZFy~V7pLnlLIqSSK97DG3W7+F1lQ*UuhT;{~4$SWQVLiR|@-9ng zC|D#$#`p%=6r)Ys&GQSaw^4YX-yf&XXs`Fi z(k)HXaB|Z1+ox+%i-$Wp(vW0O#h057Z}#&aK1G5%?!p045zC}ry|}3LX@Jk__j|}f zv)cX}iJ}8;?es{=mr9Vfi%G?(Th=#579+`wXHNChpi(Y>^J`|FY2AlEBbBCXEPKSM zi7rhZ){2S;0Pv`sob;}Vp?L!kOPkrE1fvrgxCag_@)X!Fx4Wv{H)?077eC*SfAuf) zRuOOLce5%=p7*f+dpIftTH>PY1NdsUt=1QImLMgz4La!;3=)q_x0#LKz5O1J4v<&x zBdne$KValmiU*vzRURC*;sa^?g$3w_-I^4@8)Y{uzmX+I<afjZpTZ_dLEC?Qqfnje4Nh2-~mgYk*WYC2lB1^ z?)mq}rTyvaZnx5!-Mr4Wk6{Mt*nfH|_Z{F@iP%(-X0V#$#>e9&Z~$#V&I z$o%eo-|id%SbEP*q~6)}d_SxxUqWd^v`AUw2| z@Vod4391^^04)>C@N}}h8#F)PR3f<1c<4(+ht1Qxnap910#RkUva&lx_>-~brT`X$ zKknwHrpMHge75)JcZXkVxi0L3)~m>MfXz6RPXOxyf{Og98k@Gm6(;AhIRb%-CKEK^ z7{KCZdP$#bnk?YO=lvsb8|HhD?KxcjhU6oE=DURt=~l}0>5P6P+Rs)+L(IuEH?SZ! zk$b%E-=-T+`Kbq2alOy?4=YXaHLw=XBs#Mr1L#|S;OnZlpoKRANG2+lg2ogp86O-{6;C{9 z+(N6~Y3f^a0`Zh~?T&ibf?hv>JNgCOo2+>JZ7&|21>Dw}uGyp-n}LWZdrqfYq%UN9 zwaVv*Z%lR8Ci9=J-4GL7;yM1no+JZwtoo%}pfDQK_ISZV4sU=H|NcnDZL4tH>r#zd zHJ9JxiqzHBOOFanGUW1ss=fbNSD#NGa$In=sH6bd;r6e)0g)D0?J zy6%KU_UH<{ZD=cr&JzmwTZM&`Q zQCnVKm(2=dXb3A#@kNtx2`qzH)c(h#a1$aLa?@3x zvdeBxpWj9Rp&4N|~ zbkXn#G&6l!Cq6?%OZ$+H&h3IBF~hsOs!EIzkCgQT6~fM0GryEUfbAKC-;a(|jC(9A zP^PRyK|BBE!*kkL!0;~XpDw(*JZf0(1+)vVNP`+qnC?lg}VIc$kr-sIFSn`0@#lxea z9Tv7aEL(fBia17#bU! zyQ8JrNAYY}2B|Qp&)WrPlmONa$aF7X63)&Nj*q`d!(qrVt!rw^gcZVygCeoiFyNb^ zYijVabKoL}b`%Ew*a2C2;t*pgEaDF})!CVb$jsz%T5rdSgNo`H$ls!At_#(BojJrM zS*yMrtOYR-=t#}T!8;l6bYT{g^)Z(2226W_Q=cj)p{M5|D*D#Et``92prV7WPZKTd zH&_K%S6A=iEJ8zG`+K865@4?1dmgK+C8s3M+ttGL8Pb75NH|MKNZ9CRSjp?tXI8bi zl%d3sVs7>?T>O=WhK!5LYd9(S#=bbPCH;UDZ3ul~t8i9QGFT!?)|gu}D4&2WYi>DE zc^Dr&0ABK=`}bSzab1%0VDeX>z<#(K{m+K$-|8yZjp2fDb2Ah20iMOIR-|x@ftZ+~ zt!;=5En5;}iO=xx@Lim&kIUq;!*AX+Y6j3CAAoiQ^q5&2urYpJWvqepIlLeMvOI`x z7goI+(Fs$@*zS>hd8*RC0_o6iLJ)D+yR@zO*ho4$x>SC3rB~E*HowZsp1=hCrj&*R zwLo9mDHzkWxNAMjjppP>4NzSewo72yc3Eaq)s( zErc(uHY_v)tKp5h`kW1yyjoMc8U_aKAf~u+?X10>W~{amrv4)ZUxR~#-@k`^qk9RD!C8OFC#?3bj?%*}I#NQ+ex($g8DC2tZDK?cc>1v?@lqDDCrm7-!e zFo6RGcSY@+yCfvgr=-7spBfW0a%>ur^$}o9fKi43p80u$u|La2^EO-un}R~a4zNvH z8hr-~2e{b56T|lODYJUr%S;nyMn7IXSDd!^Mq&BWhtG4i21$51+8If)1Ax z@>#P7v95hhP2EjGPtJpYM;5<(aBcIkpcbo`8yZ&0sKD#x=j415D)h+< zb^(gx|5hL4;N!zOLPkz5Uh*%`b&;ac`1p9T2#nAy#3Vmf24=|-5w?eGbtPM`Zyuge zOliAvk@xwapdEXpx6Rs!k=?pAUZl#>&k_#9b700;JfnO3c(}@?MBUTVUrB9_LA8Hr z7c3fUPVRPge-ocLTmIVG-7l30C-^7M$>{4iWm3hHJxD{0U3YF__%x|fjUuRxFsvg% z({G;EpoVwa>og6_iR>go$MjmcRb=;X{izZ}*E#6R(5u0GL5f)a};; zZKY;1kmgZ@IGhi)8YS?o8I8nuesU)q++eddJI8#{-)5Ba8p-ZP&=#w_fP``SvxKml zPWVA>nTiFELcwUfCahIOmLy{Y^W-Y%c}p@fw3kZFt|Gm16(`pZU>o3EFtq^_AX&&B z%P4hkJ?$${G7IY)S{yBhmP zAh#Cs`B?vR`<|3y_MjT$&laKWIB!}I%Kuck1^JE#yAWps+ijg zNM+5c0{fR7xiiP1A1)Hl&ZLJ+pXY>Gze;W2&41iNx5D%6%%lD=!DrQ|C*Jba`@9E7 z|5po;Cvz1s9?!J?X*`0UF5q_{$LEG%(Tg$qL1qH1hM!w?rb)dd$$1S~O!Qoi2Nq8d znuiay&O4%tOe%q`9_PVE9M*AJ{fXl_0hq+KpyYo@8R`5m;Q}uR(&pVYjoCT6K|29C zH4rC>7bL`%6b^Tgk5!Y<_Wms=rIA{7tN_1~TOq5=0s;b>>iSKS*RP%RTnKE2wCXq% zw~WVOVG*1ceHB@cZ`l88@N}x#cScyloD8z%N*~Jdb}iUZQ#U^Do3N;UtgYtTp;yZ= zpn2@?w!N+E_%w0bjNqE>dJ`CiE)dR+&C!ynhS`~ui@0}k)NYMUpFVvx=MH;!bab@0 z61#rU)T=`sZkU$Y5n| z*q_pUCV+;4bAEy1IvySl9v)%HS(=<;ff6`YOuODOWq9l)6%q6Q3zo~jTuiy;d13%7 z4(MLF)A~9)I|1*FDkRqz1q*{ZOs|pqT*Mfnb9Ph^9j*JHcAFX(H#h9IH*B8X_Q*XJ!E(GY#@%Vc zUMt5t<##Xm^JfCT4=gF7ALzf2jg?LsFJ)f7fm(@?aiptjseCt4GUng(U>DYX2Qpr_ zyYp z%+`cq=dm$2PY-%QQGEUS^$oi+v=|zw_Nr~?;_Ej^`7M4$r5K1h)KtK(3_TyHipnY~ zu;Xagd)c3E3I!vuvag|Q79Hzh-DhElGaD~oco2OFPqC?h%hH(PmG?cjHgfBEx^!5- zwzXNgP|!QLe^x7IVv=^oo$Gs&^kaGX<3^zj#NpID0XpP~!(hRy{MFSI8CrcaGrLI2 zN6==3MMUgxw`P)IP3^Gy?l=2o(Zdl4A?I?CumlBymsgXj_Q`h>_PY_{zCJ8~4Vf#u zPAsrA@J}u+h1V9Ca!EJw(K1{yfR`^dF}bp2{y0x&aJCNrOS#RMqz^{P?EFD z+H+aJEgJSST>`5r;5y^~P3eL6_f@@R(2xHUlzWw)Gl@p~`G2By24w$Nn9g!u;Q#)| zZU5hFow@>D)EobAmebV>O#Sba9xJoNmj6cf5D0Vr@6etU(*NI=?W`L_`Q1PtTCP@% zg8>wHwma*_Cm^60UU8_pkM);F!sRhMpb&QdR;WBVc}V{I3r>+*{la1l&H7;kNf|JQ zqLG^Z$jT!;?4Yb1Cv?wcyF)c4nV5p(^mNnn{3JrFZqGhW+LOPn-cdGp`UXuE$KBJ0b4{(#Of6RqjemQHCYOVIE*O7q?<`LmR?)_cD!s+Vk@#n42E$Mza! z)5mn|%x=4&qBQS%K^4|huhnrW3;I5zqN7izn5d(nu@f}AiE}XmP!ub5zi?sg!Io$Ln5JWRz-nZnPip*Muq1@N6Um*=3nHDrX?~}$W zvX#*}NG)w`%fz!Cb7Sd4L0$H5w8(h!w}icY4}^fE%5{BugRi3cqNper;z>cdeYig9 z4qCkJ?U?H8RX%Z} zLMaHvaU?mn6?^hiHg_YVgMWkBL8{5!7S*t#`?j!?Eg}DHfeFL^KJ)_|RT9t_IXJLq z%*b5?=Vew^DFZekK{fvU`$DCOt*wFkA{fx+g@jyBh9kMH(qm9FnjOIc+wExRV~1W)vUJX%}_c zqUM--aF%M&{6m3U=Bs!bTpSrxA42L*N^ZLmqYCYbo%Vq9Fw!S_Yro2112Tl7GxD(> zpPXxXG%;@_TOzVnjgH0uCVeP~o!!RSdQC5~^-DkUMQ&Ak1cXUKdLt%+Eal?@r04ak z*apiM_$+KWV6KB6g|rN0IwNndK;5xByYg;T)@Cs*Z+4*ef#ral>^d3(X{*C%_>jB_ zCfSK~O;>S)^16T<+UP!|%@>QsHPeoc>CsPG_JsiAbnx$BZzb!71dGkU2SUghwCCvS zqileD7M4<%)Ad7*!<8992&}FLkf6q8vJ7p1XJ%#+a;B=~+S4djtWv6e zNR7bycI8j22wqTIRU^#aJHvxC(+rI9?+SYTi@NXp*3iKN$JV?Tok26g31%-G<91!|9$2xf1i3v{TarPm^gP3#JXYINv@AoTU$Fq{FQ>u zP6X%0>4fuL#my}nclm~s&k6T{X1hB3a|0MxoawcoX?3kli{n@yOT zP420p5AI9tz!bYk#nXH3H6g@E{wPtdr^E7Vn?+iPu6#dE8r8 zb{*netIbAt02F6-wDtS*XI3gIs@QItgr3XY3{I2e4Vq_h()(RhlZ$dwJr82As*S}|X^9ri&h37QhS*+2CqGt+iwK4f-wJ5qpW=^d~5jtgJ?)WzBE39L<{B}Y~+{#!A8B>VmJ z`X`7)LK6}eK7jX(l9KY@L}Gfn*SzFKiDruPCS`h3(yW|ud%I}!+0F~7>(UJ)%gf!! za00)6B|1Hz0DY$8XfCP`Y~b*atSmSFiz9s)*_A|qxCfA;g;SEE4+dL&mx5T5dh;F! zPqogKE%my~(ClC$$$0_7fR{*tp%IvH*`B)9kpd|8ljbR#P|M!RVFZ=n&p5m9Kh|=` zR>8$`%<@jDOEl{UlPcA#iz3^@<25o+VO*zJz~}zVyEoa9%44gfzFpbF<9C*r^&#{c zN$)GhF`)bJqD*lInA&Wcy=c~Mc7M3|+-#dGq_<}9pJvwDQ-R3Yu0P+NryD*Ystl*^ zI)vA75hkYZGu|_2?L@mq{a&z*H-@)+&w}XgT>+pNfzGUS+|Q^YH%s{B2b(*q^Gm5SdDdp{vVcgka+JTDH&soFKxIAiz4{=8VtJWU^InugZI*o zl+WdZj7ma=_uu2CnO`;5Mecq}z+*@5v9UpN;Sx-tzMPh+6`NII^yvKeQyZHoep#Pi zr5u-#fC+3rfrUOT6d_U3U$OE6s8>Ke4vwdX2cJI=Q1Zt#hB}3HpmcXjAq|c0_~YwN zW8$&h4FIY^Tvl?srp6y5lJfHIJKg9BxIb2CSjOIBeEyNV@AKFl9l7=#o;$b*wwU>g zupME+zC7CF**14Lcv|5Xt1DN91mokw)iLK^pFj18+dVYuO$O=czwhv)C@B1afgT$h zrpLi}7hcfR6eBx(j`fU1>3u^$XZ=Wg2^@QBm=M`mmzI=_H=WBPi2|N#rCN8>M?bt~ zG?MEZIN0G8V3&n#v<&ZQI7fEjRl8yPGJW-P!OdZ6%0Kb54hDtRZf;M(Ja2Z`2}DRt zA5e_{b{xBNC?5UI`}=z-MCfHgcnpZ>FApX&6knanC9+PZHKHO^R2d-Of`>K(%VvLI zp!lIvuHtnt^+ocotbB!j^ugE3V%*68Tiaz?IhcpHz~i2ggbWG46Fpa()@^XGI);hB zvJ9q-^YfyIve1Xq7QwWjqiKN-Mbq-mZ6;c0r(M8%Ev z@Y{U{9awvZSQ@vzMzPB2@v-YPP2A6C92`7paxpaU!mM{n_}-cK3OKX*KW}zi9h{#R z025>y%Z>|5tC2lS7r_^mu$1oZ_Um&ru(|raNp600w6_nFp@jt)%}S1G^1VAS11kQB z_^1^_7>84@$M1Shd;|;w{Q4kTynp{WqKnt{&{aIFL*wO3E`x6${rqCF1N^f3W~2$; zj$7C=sYAf^9V!-EODfh6EC^VDA^A}rY?#&<_A1xJ5%YTwZj8qSnr zNUgcG;0QA?bR-w1GA6&tV6+1_3_khMQW#5ot)e6)D%dF9_4V~*N6oA!*aAnlXDPia4s{nCDZR3?c31St1GQe(d-sHBcKkO8NJ$?MXp{#6*Zx;rO<{3y zBn(O;GO|p6)!L82E|gL8pb;gSEH5;y3;kxg!=8W(lb?nC;Sp_N8Irx$NfrZo)?-?Bz*F9&8 zf<+Prw8f3f(`IYQ9X)C2OX`N6Xz>$Wn`JKb+MmFaeIS*5k6FblpB_p+6y%C>!z>jH z8-Y?LRiZ%E>VRIOdLv>|9E`({m6ns$^2zKd2uwH6VXby_^!d6UTnpF%dS^$rT4Ljx zm)O@d`n&zpD#lZBaYNB>XnpUcc;>p(US;0#L3>Vw#Qa0 z8FWhburU0ArgRMNq0{E{bRHj{e}@?v8bn~ujStP*yk=BEz@4z;c_@o}{d%V9_f-L6 zv9ONYU9H>44X(S3cx2DE{gjskg!ub zkVF~UF^`t0C>>{>-nhn-z2Sc2A75rFm=l*i&~U1Xf65hGppZEy}$3@ z`}bXAjWx#l1I#&}dEZx@=XvZN=Q7LmK|ku}`G40?5ZLY_!t2hV(5)K{Koo ztoiosY=l&J+dQ-<<$_XfZg2$bNo#|#v1&!K@z1j=4wj9Y1a7lzgM-!?%b(^uOdA`s zvqTgV;K88_xHFbdj}eoO0)U82pvlJgjuaa}V*%Nu5D_McFCy3!AFsd^0g3`dd%7M4 zI;;et{=rs|;MG)82$UUm#zz47)TF9mCZt97I)-L1T5uDZ=ZbN3&e_N<_;_Kbng0=* zq<7BFD@#2NfVTC33d@WL&iORxJUC)I(4P#iA7msZY%VUo4V;uo?E%+^va4`nx)FRD zxpTm{2-0u%#Q#yONzJq-pl~pFhYa9`mWb zUS~=B^ptGlRe#!{_m5QGO7Z?sq4&l_T=3?yO8L9gTbY;~5?Rrog*>P4_+ZR}RpaO%bf|lMn`2+^%G?XIW86(V#jo7~_6D{VjBtk(`6;vy zu>SY6=w9FW8(a@hMP42gYt*9R=TGTI!ij7ITbN$c+dtv*8*0bD1e1NTPtzxq_Yk4^<-vd^5+~(s@t_vWnS?^>C{&?fd zUV=hB^5N;y#pxy~Z(*IuX~L#b(`5yNB;vng{BLQhEQUS1gH!Z&__E8vk%p({XQ`cT ztuoOf12RT$8WvWk{wPk8`XZ0(KqobSPw-JJ!-M7pnylZ^IHm-3lVlhU23>a1cC5<@ z)w$VWmYvC28rtvY7sQ?l`KF_lb_o@usM9VBnLg~rta~;-B|lNooMQaD;jkfDB+rza;MrHDU3Mh=dWNz`I4=M>ykThtpVVv8 zqLmz{i`*MB@zZlORf^B$iBSmNl}axNsM5$4ZB)6snJB3dCN`v_+(6=6Tr1PvwS&<+ zeZHx(EHJx9@YlzT%B=`iH_g}*qKE2po^c<3Fw5~^y>M4dc@j;03lFKqYJ4Hzftq=I z9))fv7Sf!EScd3YnWefnMLJ1Wpm=)hBsFGI-+*y9jeW;&?e3PgL)O!;B8)u4Q(YVM z%)0vq9upj0_&+uBrbgc5c|?ZOV|s-cmcIIXB#B@R<{uP1h4i8wRXxw*I$ld+WPADL=a1Kh3BPC$#8(?!4WuOQuLu zixU}KDrqM2b8KOA>VN?qL5GrN>N)|*%@-r>I^1c6>|Gn(Ve9kNBsdruN|9;i1V@il zpN1w&HVQd48_WHC`us-n>StQj(4yQw3SLgL1q}aFi*}m@v)|1_s0lRW3*%Dm7mswl zdsH#btfrQa-EZ8{C1MdLa=8r=?)z)eD~pS(iud85)HOJCn*LzqDolldT*Cg~Q%p=B zOjjUBAGACLYI(vi>R;%noAkKM4HiD3=07>(@Pg)t%Ve;0C5R~efiOi7cU-yD@fTTwFl-8)jxi~9-;*j#r|P`T+zQ~Fp~4$QIz9D%l={D z7XxdjZpKql;H>HUsJ`yFjd6o^Hkv%hfXs{9)Hz;L2?y^+YvuQ+eDk)3%-9G?wKk>* zZ(O=0lJsCS*Sxej=LYuHY>Ly9P)->#y=(RlF*TAT3B)rj&rzqXQwOSVq8k;*5aZgr zVRui@qIrG8iL8%8*twL{)FX&-Yqy2?Y8UVQe54}$@E$&)w01YO)cVUpSH!bq3};c6 z&&^XC)%zjA$G=u*XK%aicrU*nSp9;l_qAt%4oQY_|2!H@9fxuG8$=pY1Wq|rgg5BY zSvyl-XrKBVH8S+%ljHs>i4OG5?)!-5sFUo~j2@Hz;GU7O;_z2HY2=9p)0i?k!YR4J z{E9aZF=bq*J}2xQ`MtaPn8TGf`=8kNc=~o~=@3h=--dn-y$VL=gEvtbpM+FT)4N+{ zuF5@DF)dazGrpfvS|5Nn=lAjx_Dy;F*tCtWr8uZfxPl&;n7`#*(QiyQ89d_CIDBkq zlvRE|R`sctyCF-{P;l*DR=J_V?dQ19M^L_TN`7|PdtazJxvHZnI=UY7FC5(uQEBGQ!{-MUvLJU`%(3s%qS^yMSVFtL? zG3jZ&F$Hy+6}HQSU6D|Rh}fhrZ8uS&ct+mVv$PC3O&?Sm@VMAL>Wq&aS9hlh_U=SAGD>td!N`qO!f3BM8feI4;+M2Vv$i(Xu`tt=-JzGL8|*?Xk5 zy>uKVH!<^e^s&`UspX?JY?N}U79aQOU^KKFRGV%hQ+(G-QsXIEAz7GHFv#QH^|^P$ z8>tRD7zXzql?!F(`)%Qz{tKVqCaw~&xOB3jBHEhtvA1=1EJ%O!^v2uA3TQW`Tm~;2 z@kul;=GE!`dpGRNRZs)yA6ymZ!vaPPx<6dqd=jo@!&10I{~>b@fQ=aM-J`#EZ^zM9 z*@@*9lvja3C`yL_Na(&dZ<3JAZEnJ1AXkYQnc3W2EVYl7&ESdta(sNxh#EszkA3JO z(XEH$6Uxd(UDN&$a2Gcv{DL98@o{5dIi>`PbY8feh$E#CBRiev zFO*hP-Pyp;u#GaOLlHef3*;*J@6@t$c&Yi3Bbp*TU+^aS%kV{Ug&Wlk=A<}a zs1?q2ayTp!I~17_FdgQa2q5!Dylfi$SN~57@N4+I&sSMr*zqv+)dATs8!heAWI6KI zOM`ifQw&`4i%A=cPn#r8WE;Hj#7Urs8+DAWhA_9B=vTXn{?9sVh*a}~CMGJ>d(`>b z!$Sj>athHE`KANbDt0Xg)zx(V09kUkjrmnLN`Z)?p$xgRnG;_pC>8anSYhr;jSA&+ z?D^*)j??vF%%SP#)1?y~4ovN{HZA%8CLSvo-|8y~_v$DP`?(ryZ04*RfmzuV&kTZy zo}Qbeq(UHdhdXEh_0>P52Wo5>pnUxJ(Ox-|Cpr3Ydhp%o)5EFLoNQyxyYbHm$I2}> z*VZPLo%Y~|zkSvh&zk-DzsI7~3o|$NrHaZD6g#7nM{!e$eg7g2n!TkSlaT*7-Ss*5~X%m3di4#CgFIRuf zZdZ=$K#HQ1(>3p3^f!|3tI-oO(7!lxbwBj^^8bHT`F^nsAM9XY33-1Nm+^eNJ+DOG z+Hzs$!mew4ocyqkt@dbTw@buEfT0l7aTOY!+Hq835(Lk{@B8lE)2hITR;8>G-;_A0 zI^>AKheUkmPSZ?bf!3c(GF=W;F|jw#o;m93(#Njbq&6HUYL^RuO-QEi;^IPBSlL## zSS6R`c3)G*X(Dw-c*)qhtNT#bTMCf67?;8r*^9ceW_OHI##^%h;ytT+KG;H643d8+ zGr<5%OIw|)430Yg|w)wD zt%swMjN8SnMJhf*#CSZ;QrAciJ52IulEHiVIJ?czH?rj97N=%&(zsC=x6l$HSTXm9- zNuRfFJlPk4QU!Y>@aD~|%k$00hm!)OWJLdlg2YoNs*i&+5}e7A1ec987~gN?&xH;c zx3vlIJMBC}UdV17o^G0qF%~j0=O`6ixVMA_qnPGDba&qdeCUbLq4X_(^P00C4LU_5 zrcvgpWMuPom$mbG<-&c2OhOha71kZF&9Du7+5tb%d5;1_3lb2NA2Y`GL9a;VRU&Iv zfykn*{n3nL#Qo1H_X!blyz4Tvd{kF`=+bCq1)&P@bG~@p!vo1Mg+u${Yy10wn>B}n z^&iCG*SBm)X{V(hypUO+IT@Rp(#kSj|Go%e|FEJOngTW<;u#*2f6a^6LwkEm(}Xen z_>Vu)Secnx;dB}b+R1aswm3S1wB4G^i{7-CB5LL4tI1*>-@nsWjg74bfssS_XnJpN zZ%wbQmK?fMwY-rsv!*bHfHnKEv*TBPn_gCuf6>TSDO(E|$Wa#F>rQ>FKMpN2Xtjkr zE{N3fBAaFd$@!|=ij!p+cfo2iV8=+{ag zFDxz0*zyN_?sPj@=0Tny&})uy1yra*@Ke6lB{O1Kp+iH1V)n{2Fi-|k;j3(y!}j)2 zK+R=tX{jwEGXcp{R8Dg`Vf0ikYoQyT=PE&!ps5}c3p+0N(~T+%ToU%Pi_^r;_I3iS zYZ%_!TQhVx7^&f$m9iNg8x_h3x@j3T9i1<=c|$TpIfial?}GBEI`WMK<`6c1*YSVH z)vu0-`pUPUjzhrNJM_*SMKX+dpDoPxGW*dA$CWY_9?hxqO zT~b0hLDYf!u2c=y)01w8d8ZpLTQh!(&_GJC;6Y2Cz6{ihnDn=s0rp@|s`LV5qx;D* z++<<|nC0`wQndcqxVXtipo958HBmpVc@4Ufjm^t9;Tkyu80hF=N$~rKJ{7_a=2&T^ zjG>8d`;4x!=|=~H)(>S7moSl+!~1E6qR2Fil;WrKw7(wj!yhXAeP(m3ng~l@jrthDEwl^oMN@Sr^yxt znnDFXdLuP0G7Bu^azO5HT`}I>E$9EeA>}#o^A=q@tmgrJ%QtXg1onvlYwU96X&)G0 zK$iC514@1Y4-81HE4-+e>g$vC_WH{lz>N$dZ_q8(i&}wF9`vZ;g|J&6G0n=4G%g*T zo}NBB;^nS7pH1pp23>!kIGtn|Y`&l>0%2=e#~1N%*^EWY;dfSu_b)@E*Dy*Yel8&{ z{^zfK!#GvdM1GGU1)hYV;gwjX@!dma<{`rpay$WUZbl}i-hnUaMm{OgDTa^{JiGn1 zbui{GsbpADQIC#Ja(sqisam{7z8q5o`Y!_iv%bDJRdKyQe1zv2{+l2KAl{4f(}U%3 z(41Ge9%pQz--AJ_)*_97Uw?8v9|M2D&+CmjckBKS1bt?ky zvv~RktZk-cC1u%AGRcLIAZlt~!FOR_H8C~C#>bbHT5v8S^Lb%Gzf_Hm80)E+7(c%` zhPMtpxqu;5so0?y>L1-`4TCHS@C_^`dTeAQx-aY=uMXy!j}>?5i`Xnki-|SD4m>Ji zU~Hcm)vqD4?H1DAn=)DJHl)Z{$az-=rqY@P+`2 z)?xG@HGmBr$Oy8-?gsw-^XKFAbW#~6Z=g8HqB!rGNlV*4ed=1ZNgN?ns?)G}Rqh-? z$va^{;zd2`PU*zNA_(jMzQZXIgFm0f^EW-N=PIc~iSsg`SHBqcxbP9>J7}mwumda? z)8wsqX6AV zSH+`-hOKKgJ#)@syhBiJLS4bizAxW>r>A1~$Gs zU&)!buY#2+Jfes@a3;W_$$)fo%Dh%kQ5pU&N%TgZ^;kcr#}Hhr0(L8371Y$V*zhrL zf?UbKz#x#y<4#mtjj+IQZwioS)xlk0WtAnL#eG+XP|_CMUe3;=TQe2w?ri)v3u}J^ z>-6;YYfm?D4RT6^f6?3YH>RPF5G6}*%Rqo=2zTfkd|h4WY^++_TsXa$9Z3c70i!_cjd4|wuO-(N`aPM;3E=}7f z-eHY$S?Uf2LGkb3eONvm!ou7S9?VR-Yz77dY?}^tcLTJ6HBDX>hIC2q=eKOeE_}zX0XF61-X7=B-^kk#_hI^wi64XD3Zj|y=AHx1hv$8^Zf@txeSUs8 zq|2IUU+G(Vdw&2g7R&RxHW=*ag@oR+;2o963&aOK517<1`kk7ZIx#f>4?*4K#l4}a z(}VNAI*&TmSMIRbOG``3QOav+A?0^YeUnZ`eV>GtZQVkB=V|5YW-O5)mH08ljYKq{fuzwB6`%hs~Xzhi9=ll6PAwb0FN6B!;iU8M8deyfN-`1Y3LU=1UL_qN*`Fd|_hVT4j zKcYo9mgiE3{o7-XUP`yU8IY%R5f3H^ox+K#q^YU-rmwro!5KsoZ_*v>e!b0_qw>%Y zG8q&D9kuOODvLIA2Nu;GOr-j7k_^u;6}xK6A5w5m+oSvJ?Djz*65mN5`Yi1`y}rRA z=_A@98```MeKr=B@p6kg1vTbyuA`Hk*;$4M4_ZLXR$X@W|)W_Y;djwDs(MEk6Mgnob8iY)s%Nj5X!)k70@Lm{wr ziygNmJkE+BaB{{QV}Hhy7Y-j-=wl(XeNQ@>THM?AP)lXBGlE!drJaXShA37NRQx<^Gf9nf-lLYr}2k9k*$(a$1Z5My;s{nzS5PWdiY{56Z=Kvx~j%2smzSm6_FnIMV|(WMikBb!bR~ zU+`GbY*YXU0GF0Z1aBOMG44bvgTO$wJ7Nrd)U7o)*XU@p@ZT210XIL8x`)jUFO@nwsEWtsA1-6AmKZ zzrVo1TRUGZxN-*WIlJ8{t~SBD^GNZ+5nQ?b9` zVRSC|HLoGyNu7A$>oD~e2f6C5mwWL`)$-&=uAE&yBv{y8o!_>pk-eoyNuVK^tPz8U z++oU%%=380j|v!bbhNbOh+)j&svSJz45HJ`p=j~4JCJGxCVM#bl-+7jJ+u0Z$}BDc z-F^T&O`D7w$Pw6Xxt9nGnt%9Cgf-~@R+PfIEgyIqs6*1A$3k`mN^m=y;PY`|BB%K7FLXI6YEa-@y9$U@XPC!E9 z9k6RAy8fVNW$n}Mh5&$nE*sI&k&%_}8l#Z@_Go;e}I36@It`!tXXc}0YYS0@eQ3I=AZ`yXHE$m zS4l~8m_)ug3YBo8Dlxhw|M>A^qVs=r)pF%kdW0$h4i}*RwYfq~r$cQBBKQt{=KH*S zVCv}-(Ykr}F1Jzd#1IWmg$5)KbiyeI%kCjKBIY+YU-pTHb?UVVx3>xWowpu;$VYy# zGkt5OEMG;Aq-29f{)Re2p1xj&oc#FP+RbsoK&Cu8wb`vSRq`0^&l=-W1d?F>LBPnmI zJWm4e9I-e%I~N;Va)QF1vWuXJ6#ORCoB+XzdPa#C0(t*G#^Sz}f zGc&6|4Ui;c$EmWMkw529!S?wLAz;8C)*sBRfZ(5^@^U)KZbQzQnYyW}!}{)!jBs4% z_0cWw>kbYp{cdArxUdp!DuM(ur?ugh2<9jVoEjM&t*ESAsz$eCXVds;yZx_Ww&~Jz zC?7YrgGLg*W)Qt8s=nTzRSe^u)}iu_m4P}C1rs(sg6!*?+m@hf#K7?7=H@mV!&oYD z-I{I@c5|+Ecbn?z38ilV$SaHL57VjIiO5K9P@fJcy)Pbl8JSBWY>3I(R=skb_8)U#p z$JufC(!8D?rjk-1E>5dhAmCqMpByXbq?V&(mig<6v7MW53IRF|!5j(_Z16%xfYARL z)Ra(N9=3#gKxS9n1^;Um6@_3cR(i?Xw{D?%78TKO4N8NtmY%*nmdD`qARaP{b{8*W zzJ1H;aaG%=rI|VJ%XoDQD-G(0C{~J9>w+X&fmeybU_ReJw5YI}Rl~-%2}3VcyLEGW zxPH2iIIpB+5BA(t{Cg6XmWk_QLqG@uFA|(}N*4UqbKf;sGkBmUqot*U*gc)D1hlm4n_yuvP~+14H_+s} zyi*OD3I+yrVrDuz6HbDZkjG)=E1nAVW^`=q*l(WzC&9_R|5LFp^+aUH%{KV1$dWnu?;Oa@K2rcp){9+N=kwLr9ViTT9l>(@PHW!xmb9f=|) zEB#c#6aq_YYtxHEag8T?QLqRpw3yPIsJsSw4?ug(RV$_8;wq@D$QdhJAFpwVjgDU2 zU5pA0bmHv<+5k`ygj{?{Nw*=yWVFQS`9OQetvCUP?LYo>BA3;U%^|<+?aPok;55Tq z=CVGz?kf}qY7hALMd_b+6)G(En0pO5X+xzM--KO8!efb2Ki4t^LCy-3QUrfMEr?Ll ze`hOI;R3>k?a3Y=veowr8z@0JrpFK>gB0qvfce0S-`-d5{%7T`4)kVQ9~SlI^|9A? ztpY~(4$N!=Zm;j}QvfF*r8w#ttzr(>Ky}p^LO?!V<9o;Lkd^U%=5^!{BDjo8)zo1K zqg0@YjQ|-4kZTbR3ONI{wG@tmrw`Tb`{ySpMBGsk_e-~Ux%;_4yrdcLU}V!ZSBe+s5hEF{x;hM7cgvU0pG?PvCkI@f#2!U$CL=P4Y|dVw4vDw#?BxZ zBL{9gr?AyO;u=9#)`TXTYtxAW4o@;}CKoyapj)AwO{-Q-i7~|jF6U(TkhZMnt1=!J zPFdo+%eykKx*(5_0|Ac(usY>@(3AOq2sp3+X%#oTx(BDqH$78RuOr=EVp$4GS8}`Q8${o!wnvP@^NU+-99!Y~7I(&ji6q#ekO2V!6;>0kNpkiNZt(L>VW^ zxgPj4MYSpCs$e6a6HI088Xo3#b30A+(EJ+9?09zc2-wYgpmRPQkAy?<{1i+i+Vvrj z#uiQ=9UaZ(xRqI0C>$F4x+}5H(q%Hm5}CJQu0L;sGx&Ct#+6DJg$Ji zl0R~D*QS3pT=6VZzTiw$H5oj(e;)ux##Q!D0KAzb1xcp(2sB5*fq9l84r{|^#w$2T z|6*7|!pP4ee2Blsq@$Zc6-@g6ap3OkM8RNHsa43`Pxu#}qnQDc`BfAwK;BFhitWI@3 zS*65~6aj?!`;GBySC6_2gpEf=QXmEzpuh;c*xLgh(F3)KfZ{Nh$76&;xEgy*N zmpYis*Orq@f2dpel+n|2o?M=l=yudcpM5mXnTDn|T@GhA7;6$^m6o#HSF0|1(o{o35V2kEJ@1UK8nEM{{r7sT>@)j&v?cUZNhTxuZen5@9dyEY-(!#w6rhQ*W61c;tg_uBi*1&_zv5}h-aUr zF}PHjG79xLNM&N35l>O;Q>V-S(*lHC>BJ{$(XJoZS!ahVv~-8OWXQe~zyLWZMn67W*ygMx4ZcsOObexlX z?u9#IbD_h{Nl?r=*GV|Akcl2M>%&DOX^ynl1aHWwewmJ}z$Q-s7Ozy&f+FskgH+c}hjCZ)7x*EJlq~ zyOK)cN~P%Peh0Qfmcu4ZLW0b)7;%<^u})72HnB#v<9_{z_sDbjCVx+C=)XaYhQ`fB z!VWlwjd4|o*TchH24!0&=Oz3}`y}_Dh3RT)QXKns#1Db)nJjcdVFt5YLaQ@qw%}Jr*GPA`hhXTe|n$P0n)Zp5mC|iFa zCs&Y^gwZk4sa@^3&BV=3d39%1bSgNIH^Iiav^*Dvm=HXRCJJGoS#=LajcaR##rzJM zyIwVSb!AM&WO_f=`EBT2jE8ryKI$`Gbx8kc+s*ErRx&K6SS#&iRDOu=ujbHj+c5A$ zM6;@}W49V4FFbWpJ2CYPd*bcf`^t#Csir1&e`TQdM9llYuPoS!-ec+L>!(YngMZP2 z&6&?vCnyLHSTpzAyV#EII0GYkve;k*f?L$}pRJjL4_4qgbYi~D2V89B} zbXW}y~lyg~DecmDomL=`nQjtLIN54t47PME5@+=6@TUC|51aDWbxH!%=mB4Dyz zSrEI1VV^_1a5VSZrwz1h1G0-*^6+#6&J?O@JOr|UAqfQ0hR3X@=Mj{aZf-TPoK|@p z@6Dy9QIT)as!M_bMJg;zGVV{FJONdI1nCkQ+E{mn)ba};J0Ns)`M~+A(RlT$3+$%g zfW6`)*&Xa`S@sPTgv_@8^?gMV_vg>oO{Px!8nAhIUl0EC4r(5T8@NHU3gc3Y;mTO5 zQe!1X85znn>c!E~4`TE15txbhi&?n3{)6<(+&mMtq&G|vxFp>L9+&PBLo$#zX_kjA z0g`wn*}={kOGH{;Uf9P0(+iSEknZ$As@S)Q(ckS3=UR&4GGb(`RjqLbkE7Xg?B2dA zlBAIRf)Jd31$FtDxa$MJo~EOtOD>LE}NjWj-jamLIHnftNc z^5N7guE&pSTzK9ctR*gV#G09y2$-rk9V9+B=wwqX0W9X($tq#|knv!`LHFGz6MiZ1Detdla+$cpMDDqYiebm*_Iz72Gz(bhP6Iv{D56;k$48v09Nj<< zz$N3h|NXHAJ|t)7(z9)F0+8s7hQYYzL^*%_2L9Cg;t&M>Pa>ie{EXp}iOx#+<>u$- zd&|4Mz3;LVo)VzLiyD`L6rMEslWV`R1-X;c8sgV8igWS ztY4Xvgz)< zET7r}Z57$MOA>~s4wW!{z%zLy>4J6$UIXJj2>dK6Dw5^N&CAP-Ga)67hE{L%l|(8H zQr}Ct)KXU;=J=t*Hf&&u2;`=zo4eFDof|%~QF65*FJ(D~;3A^ynoK*AY$? z^e1?ff*gFuVha6jQe=UcPv1=NayT6R9i<_QxOMwBG^u%m%2Yi0XD0TnQDnr#obUg} zt&cU((Ir;?bmZq9R#W*_@$)B;(17+3R68_QZiQ&;r;`Qr3=L&;l72`^`u@G76;VnR zm*rxahR8!y1k7bSelLZ*^z|?^yD2FWyM{0yqae3_CHvaG24q?0Yof_I4~X4TU5?

E;a$NuiEN`pW|JTi(l-ApQC#6LsARO%M1B67u!O{^TB3!Fj8jBY&?6EY zDypuGSdwSRGWk3`o)Oz=kH*fBJr|~@KbrLsMMV-V z6dUYbi?#Jzo8HCU-gvtP5wvP$IN*qxZF(xBsd*FeZqbF{EXXrJtIvGhkU2gBy(?sh zfd#t>YBLftG9Mp1w)^+V`E5h;%x0&j^CPqZy2|qfm%>pJgFNMf^(urq^H@&KsrGZg%fY;{_Ib6BzV;cu_uWn7 zBq>+z2VR7*QrnCI@knap<@TVyJ zsGt#Z<}y~$`K}($nEz0n`?_bj#ViIMOC1RW4mfWA8-ei7-a4yfyt_fOr5NZYUOLgL zBTr!$9&eFnr^p0MKMqgD`PeTI2w_K=o?(y;6HDY}R_;G;ADy2yHMof3JuZ*iaN5xm zqFDa>C;X?eCi{o1tZeerWOO82S{4_L6F|BcrpD3VNMgU8kzqIg_vNA9%0n+SWD*ew z-LfM2UDwdmbUN44U@>{-cySid5$ixt5AOY}H$#xo3=ZbkHZ~I^tpzX3O}T+2 z64KA1KgwE2zE3aNt8O?xtk>W>1$UU$a__#`nC$oO<0uHy0HLNZK{XsI@d~!6+j-(0 zY?I5LJL*nGMmEI1m);s_!h854EYo-e3zLfK*#n|`?j9FsiGzdY2Ay%6J*i}NnIN9f z(5NnVC}whzZ$RlcHyX%JdzzfNFE`7Zzxy}KLAA;7<-UQJcok*?do~&R>kb;z8!ata zU>Fm!TX8HmcY`=9#fcOYj_5P!P#`V-n}CCRox5A>Y4+nukIV@q=96o+9Z$# z%4t6SZK2~lH&-|iJ^ImmW7o6Oc!7qxOLy6}$cN}&rU+2B)!+h*$0`4<4W)cz$O3N{L9MxEKr*P0mla5X+Oj5zU(4nX5M%3d=20 z&(GBdt6gvnNP}kktBt~PPhO((3kjvCrCmb+j$xc3X!1H0kBCrM?#T-DJeis0NJv6L z>AS|w{((QN zS;wPD=>K4>zfe$zr>tp@iy-Vg<%4kAL`UPJp}N8#FT10LA&QxnZgyr?Du(~#Q<{A~ z@Ozt@w$BvWF-`ND!!#Cw$a6L=VYM1(vqa%}Wf?0gkQiYg-(q8xE_hp8pIKMLIg>0{ z4l8!naB*^?d-nIY4;4^##qni;Pji$=F-;z&d2KB>>$<7((BIL_=)oY0SR9<6WZb#Z zF9WW74(54-CRtTmxJ4nPEu>5FqRh@8p%>2F|ee!6F* z`|OVlLc*Dej{uda^3~Y)AVuA|@aE=w{ITurLGy)vL;d=%gpf= zl~o~kls}ja*_a)9uU*fuy}Fl7QU;G51#zinWcxSJ8hFSi)E&&IeFbbi--`=gJ%!ib#`}vhV+4vkeVA@^vti zw(E=|AFvzT+B9gp(L4&dA5?K16iXIco!>+_Ulin zgesNzm_E)r7VCd_^oUKZ%yg>MMA^(f8O9agzNsKfqov;dk}?MSC;N3Ejr_8^$W~EN z;rr1xD_Oq-*uI&uy^!K0BsiYqG74@QxKAIdDbNJ+`04;vkDL2qyrM5&z^}x3-auDZ zUJqk0W_h*vHk)S4JH?~eM(t^UQC`Q3v$e4y6|nzV^r#EgK`s3dLR5EqV}rFTQ3Rbj zEG%U?^vBz(AQ>SkCt)5hQ+8yoow^v&br)ef7&uocY+o@r!fVJom4E87nWqJ-VEjg{5GPH#tz z;yrXD3kw6oW>!{T2nvrso`{%CqO`lhRii)YHTb?TKmR5xot$EQd6DFnFHr!)p1?!N zFgDF+D4w;o<|-9IU%p7AOwYHCig4gHdB!}5OGr?amw$?{jfw8n8sPZ9WsO!dGzHc+ zCenf5jv&?qid*7(d8P;$_@^;(nk*=;Uucm88#FJfqj_d!Sw+n9W;Tuj`dmo~0GNs_ zZ9Y2RqN8DnaR|sJXw@b%Lw6Ueg%_5W?Tt#)8?CxMGr5u&r|b8PJ$GoLkaf0^2YAYJDJx zdGpqzn>Vn4s`DgR2eL|U(%l|N&ADV90BtP?#}9IfwtLn9wuCu8g7DiJn^;)n>vPxtfN2oBZc6gbXzg8JW-6cxD{8AW#fjw<=9O2p_|=W!XtD5EhkAu_Me z#6(ER_oLu->H_R#B8YGvMN1=i!3Io(x2!4@yEJu+N9xWvY>u{QgoS0^z7@%%35kz~ zuOkC;18?IgLrpf^&j1(;H_m^<3~MzBiF;T1EIZIAFkdgs?7G=x<#5OdVvxQOrtlWH zKpZy4TkO}>y1qTiYgMo<1*FsQdO1^m02Gx}yoF7joeQU%_qdF99`scJ+i>=8K7#Ja zCsgccZ!fE_|JB>urQDn*LOloD&CPAa<RK1h#{~;ojc% zA1ljS-0hI~LLz^ehRGGv-A$mb?ykRZ8cLS|4PAxxEidZKVHiCbWypRQEBDi?u%2jZ z>+9Qn)67CcGXsk!q<(SN4%G}Pv{|IuUF_<;eft(>qEHpg6S5W}SVcD8Htr8pIdnm` z1yH&DzkK21T1+q~R_%8KRf;UMMkF=XU}9+uSTtTk{%2KnqgOlo?dfuzKIoAU#?a71 z9oShj48mFGzkO+`LDXAbr{CY-GHkKxc8%ux>ABZnwwx6AR00EB>qL~j0v zl7i>#NU<`=vO!y;ShhAlU!m8Ag)DU^A41!>H0uESBiI|6{rM#M&gxd%!$%}X-O1-D zK!4u_XcN%60fj zaeM)Y_Q@Vq3{Qbjl_j*R(6-=(tpl@he*^{BuCt#jL#bH{R$%7P`c|Vq8YLjKxdK_DS8#pZ=gN>whr$F zeHawid73qZ^($Q>4wycmFriwy{P&M=$qCfDU&NlCh(8w+vib)SZDQmFeeb7F63j|0 z*ARUCV5aM{a$U8~&I(J}E23n64GDryELS)&Agj3Z zrWJIdYb)OQ{k}-$*DnAt0Wlqxt^`;CDBw6)UFso%%WtL6;6+D6!QH{k*Pz`e$3_Gb zbks&O{wPYNS@(Wdt#a5b(9tSYgH$=7U!9W^MUU4!)^m_$#gFP49zF{V zqDTz|2wh*1Kh_`p8qvKY8(c_O#UspSuGm54&>yA7%p9<>zq~6bHJbI^btV&F@K4Wvs50{LM__p$p zzT=T>Jl#~DdSY|)edl=i`Fd^cX!l>0^jF#y7FbA_oj-b?{<$%XiA*_5;Y~*8plbXU z000N<7Uo*s2qqBK?7&j-YwJ$1%jE^#sI|i(H}p&h!QGPyU))%f>8i~WA@?(dj9&qF z*ihOD}lo>4khLd74T2iGf2g+_8-R*xZk(NK`{ z6I>X^-arHeQB_zRvTMV`UukLz*Uaas9~#C2rq68l?*+oH+x#hldFU#Ek#4H`*w$C0 z()Jp1a!8eL6Iks;1k=*n2)b8wCDmjrkPCatH${=mW3lgpXVzBRD^ni4zN#pqed+5+ zE1eQJ)9$md^o}raak>5SdOpg(K5FM+Vw731^Y72azmSmKxuZ4D zT6ZpWw*$0b%OZ3mjqh}7uXTC+sKo*EpHsHe$4-A*kKFgYoIpspJ{fi*QW z>=|YFu$S$g%*CVN*K7!a!6j^>Q9Z%Z!Y3p&OJ%R#bankxQ&ZoEs(fbelNn7}p}E(5~a&H8LI@ z9vDzx{F@LSE?_a)H5xwB*mybHHJs>?04eiab)n@J?~x?c;z&^VvGs(Fs@D2jX|I_NORs50Y$7BL~_9D z25%4Sa|^N`1ghofbL`*cwkxTqI0nhWWNjcYGngKNK;xgMC!V-?by8B2Wcc5K5Iv)V zHQ#afl52-;HLfEUDzE~W@T->@DmRNCWdB5LJhzu#O|}aW@@Xn z#k6v8pn9xtD=M1Py8fO-Ust!kxNe zP_Tw!^<}lsSjO-iQgNFiehoElV~33aQ8KZ2qoeJLi>!t#?YyH^eIC#GQ2~YJ2$&;( z-W6%&&+W=oIV5tKj~fb4t^8|bhO%@|`mZT>j>}=f!2vga@z&nnH%(2M@ABIsf=ABI z($}w_>UW&2_JTCybucAOUwWWcjdP6(%g&(#7nd1aS%u(Ul+OxX28z6L-btzI;{rGg z!CDMLY3mBd4B018T!IWRU&{hmlcr|J$;m>cd>OVk(2w~?;wi}2ET)9(EN6Pp&d8Gs zzcs##j#d9cA;83vD-jXB{67PB^>Rv6Zh$MUe8EbF_)sFoFEiE^K<82hShEHzU_EyC z&4hJ+t2j86GhKE0c-X6r+TcqIjE|>N?NE?{i;3`KcnetyEbloDM3UKL=Pf@=)Lz8y$hlXwk~>aX(R+e^oZyY1VNDKB6>vcC3^3@ zzSDhQ_w(G(fBZkZ-`+8f3$#)J-6{ ztg6!Q5|y+Yq;qlEmOMKE<-Z^kQ!!*a8X1kl1QGA*YTJC$veL_MMSnSUxd!U$)_#TQ zgBywHb){Jo2PCJ0&XbUQ@XOZd!y8JB4V?w0!NESy*^Ud{S3_vTWd!VTbqmga61@p2e z#uPl}8TT|GKe)HZOsyx2rYB1|Gt1K!G?=Jmx3$rj?^jIY-FKCu^jOvCBf+U`|NQ|O z*~QqK)9^bCT*!!C3rR`_cc6gj*H>Tv6=wa(B5oOi<7xM|(`EPV$17JGg7+;f(!y_y z`TAkQu4fk#_-slc?7Xk=8$`QYJes=cxQcY~5d(*p%{bD88aYsL6b_|S9r>J&mOJG_ z!!0W-EQ!xLqwDSIkz0y@{o`4>OSjqCZ;6Zd3=MU)loYZX2(oY3fEpusLJ&-vz5D zz~8n#7Uc-`E>LR3`Le~q5NSjNUi4`z~} zc??xd$ErE@y9~`S5X-RZ9cbYf_55GUtER^IVe~t< zNCt=)fQQ7;$jI9TfT5`*IIcnh;a^?fISam}?i3QNWQeEpmgcnc%Ht@HYVlY-~uK_F4?O_VrH;o|4t-9OJ>)H;J;Q&cf( zS1{{9rFo4)GM2otoKIdMDQc(k&*`q|({1RYL}mR>^&l?WaNM_lfy$kT?uzFn*X zT}81A1UG`7hK3f0hHl3#tByHUV2PNee>O8UbucwG+K=t%=ol`0qCer^_w!efantN2 zm|0hAZ``;zUxYIOqXD-AXV)j3kN4PnnFFFQF)-Z4`yXZ74wo$cZNQdLp+z_bCMR09 z!s+D1F)!`9xaFTdGR)K{wfZZHYIj^+3dY$|eRVJGwxagz%uGKe(QO=1GMo2(Zq(Lh z_WWl?L1$bC?_yzM@~4p3fwEE>ypo@Kcdrhbn9mr#&bXi7_w#X15w~jU+W|dd=_OD` z&vzP=k<94CDJd)FYx5>hm+EP{@MoA_!$hMad2OSocPp}+N!yHsgMx!5Kkz)%whGs)aNN(^EoCHlPps<=T{c=e_qs4 zSL2R-arXb`zYNBUcl>wZ^{@Y*WTzse|9<&DKa>)LuKQmvplc4G#D$OkU#~g0{{QTk zY}IeQMFJ8jfW#L)+J$CHi@TIO!`j^4;fC}S@w2jptii!%pett*0xW~hO7oS{$ zIQlaAw5w?_jkaLTWjw6AUv2ZbZYm3uq@c5E=Jpx?kcBfOm;AS! zW%EX4%F{)RBirDApXZadYCS~pB0bCtnrY6Cj_{-~&ZR1)Px#oP82erEGAJ%(B!(nl@T4wPwT9yt$f{-aHwi8_nOlf)4*&yZc|)Pk40| zbA2#@d}L&oy!;*IL_UYE`hmW_%@<(2#fXwXWy}1+j)) zNYJH8#*}B43}}h;Cgd1d1U5Gb>yI*S)S;2%2Np|dqJPB3Tgz5vKwDy?i@BcI=wu>- zp?$|h_Oo;{_KUobxLSm~KhVW(pT6&-LhhgP>MJHfgt%%J{=;N~SV6ZDv=^9s5DDu< zO%7-*7Pse!vIODdvAa*vxa?S}MfnMNYK0LYLJJr;=XaK1yw_Y5M=i{VV0@HtJ!T1i z{Qy1D;N2B0SP1SjAj~u0qnH2vWf0D^9mJyR@+9OL{-9A;Cs=rSOI8Jkz}VK*RD}~n ztlbke7PF+k!jr%IpDHA`B6N{*SFheclTaoy=t^HMjB#lod*Zr0n%49V=;4}CbZDUM zmkysC@376`jG{OSOhBZc$zD0<==qVj<+;PKCKR5XZSh{LP*xpj+shaAInk{@wW3CN z(MR9@?N76B&iieEAKZ(j$c5)9w&vG8F|XPd^3$B+EyDO^)X0Ug+VjQ@zr*p#q4Y#P zcZ?UY}J&SN)qmk>=x(OGj(0l3fD{!6D;lUaE$&p+}x9I6SrKo$iu;~ zBS~OnV19 z)z$S>oxe{#^7if}#(&;2NL8KnsXWgs3Ewodq1T4r1QNi_FK>0O;Kj{L*9L|^O%~x! zI3f?a{IXHis5&HIPwMui&&o(`SfK5%rSl$FQ7T)R{Ii|O7p6+2$Fs$8f~xNyFQBQT zV?xmOoPS4B(>>W)hMHwDtG6iy5p&Zc<_nAR*IO+)jb+dL)F0twpmQPJE zEEa7EaNLwa?nh}hMa)=QNM9q=`lC$C4V0xzMex`)zWe!|xBpWi;@ND;;9^m{GOjP@0!Xum94t(c-H&gb>U5xAgg(0P_c)De4sUS zJ@DT-xKj)=2BT^(m)&;mX0Iv^*BMpK>_5xK=g0noy~apuaWX)+#S)re?K$ZVf=TPwDGAXHa-QH*G=Rt!Z}`f zb;B0FcF4oA)5A>G+LrM_lY>vxrkV+1Z*g`?L|k&dvUS43(Zv3T3BSGVuN$@j69iY6 z?xoCEpxVY$_LI>IaquqVEsh$|N2-Xrp^Zy8ITp9P`~H4ec=)3wf&Fa8PF|_L$C=X% zJ=YD{h}G4x_TrBpH)i^%5<1hf#Em&fUMpR_S{iemvOcl};VRm^OfHySR$OH$pRi!B zwDS7-kNz_JRS}ENPsasaZv5|(*(@l}78}~={FNT0@Jhu-ULGcd@&{ae+mJI}= zd8KDdeN<>~kjcJW!QuLa1ziLw9Q|q`TIFnKHwxXjm{#0V2!U*vY3V^GAua>LhxBP^ zs&52dLY_=i_mF-NaU(^Ljh5)_tc;9@1G&%~L~2W{i(OnU#gs|-pWq>uJnU$A(b1YY zGNpP|rVS`0UdU++9^}KVFkXRVl1qU=3Ic+a#><=>>z=HRk3`OfHU648T7BLhS=ySL z4ZfNS?}CXfKn|QGvqeRh!Pbiw2*R1>*_7W;%gbMk{W$+)h2wpTKGJh#Fb65L?g5C0 z@`UT|5TfPUG8VL%<6dEyu9a+TUM|U|k{O_*Z`nd{gKMZ}9_|z4a_YkE9hk zYpk?`KrqE9L>zN=dV-mw)p@Bp0uC*5zHu=zW#13QN6KSjMqXZtE13l`=)orO#YBaO zEbb#aCo3_mOV^QKZxXV)tV(7<<%tABTL^$g+4~t88GI~D$-k|G{MOAX1qZ;pgkD?Wq9gH3 z6hR;d?b641KI_;BRbG3*m6(D`TI%}id=|AFtx|WRe2&3F)0ogu-d)z`b>J4nM9eL( zEcpFyYdhZVybI*BmEN4^MMc*hg6Rr&yurW1s%-sYzT;e>`cv)qBLZWnwx_2`GaElE zONH0cUp3&Ca?*Er#-KH^W)unX&4A#V3IRJ2F|njo8vwOClYd|$$NNuUD9(EtU#xos zxq5>DtvZ0v)p|Oa&-9$;w#5eog95b2usqRltCe{ypZIid&zMcFaeisd=NH>EW zcDbTRiFJ?bc%|^L%#|ylSE;lSLJ`pCS}fnsO9|%SRhGYYL+)JeV>YRqy(Z0v^6slZ7S%ZQAPy%`gNX0o$Tx8ui+MR#Ogc{m$_bLGmnZ(j(%!YItDuQmIoH#$r?l9F_q&-?Nc zbff|~5dfVgw~ENBGDfS9aj>$&l{swF*jO*>L4%?D&AKO~Xr}4cK)`w5+;YCz9QWeHKC+C42xFK4-3GndunYuzMMgr}PKVp_9?JaQ(#p+f z;o7G6BSS;N&K0=G`}fp~F#u93F22P_=-tYW8@J3s8hRb~(r&I2BkbBPArceAZ)5!~ zBkdg>3(^Sz^}mA7xkq$_LFY?MYzBPO&XU5y-tg}%ckVz)L484uLrZJO=fR*zh0Ls` z=fDT_KKel;e#E^T+eFqNr5XW1u4s1sesrm5Mh>XYANGR)hmBOyd&hjD`qq4B%BS*3 zYy|hE#<9=6pI4FaFy-sHz<~KCuh^Cu#~g!;l=~j8&9((R9O#5+Bv|X!C4*nMZf@D^ zZp}tdPIABneD&&88xSK_Rk1_M7XnF31OMxGzI!NuuKV)keJv!{nK_seS5r%ip6GQB z(K9-*7hNMCB%`Y_t^qqZbfkoZ!okwGu;4LJAp5BgGk;cw1wW0K?{brqre;sjl4M+4 z-yQW_dAx?gh~ga*TnlOGYX~_7MbQvjvfouaN=Ajpc6QLVQ{{wYHEMh+#M$K%XrH+d zI#$-Ex;lL1yT`h)tJSM&iKG_u$K=3~A*HE?z3S1yEtYuD(iI#liNq*CEb(Bbq6cR| z7LYc-6&1k)@Z?)16~tHTh|INOieO$Y*WB;twG$5I9yvQ&xk zii$7?=9D^1yWbW>K)bZKn40f^ng%%CbYmFSxFAOWgD#oG1Cnq@LoC!&+FJ_AfJs8r@ldOp+tTa8j)^Ui+xi0+U^UJHJ+O?Pu5ZE z(NFzd>SG1^8oy2NE3gvTl%Xu=AsoSDot~9H4_IL$_b;r=F=|W%FB`kFCE%ov{7&HQ zX>I+=;pfoTTHxif4xShSYVs6FXQQPJnEsWX;-7enCNPTm7OEyt$% zdM!~C1vXMJ_E^;hrb5z2hHL@yv7|(cSt+ygYDrnytm6(E>;^(YnmNt zhhV;m303`Qx>xV1(R|;K+bk|Fq6tB+H*<`_CyXdeL>ltY$CYSYH8O-!UrOc12fhis(saQEev0LUS89{GlrnmXpn0vIOH zUopq9;6dmpXkfb~HE%#R)@+-O5@R%jyg(AzQJd@Q^S-x2@Aln0k|NzVrtuHbH+Ocx zCx4%t?SGb-ne(#qdqn$sDb-Z`&Kab|;CAG$GDyD(QVeu>+JV_&&McJ@xmfdx^kB(? z4&jE=AHv4*@!x;mVk6Lw&embXnHnm_y=_bq*Oqy7zA|(rc|l1*K|w}F<9TH(r~-ji zv=epV27P0P6qb}695~NbY~%zc#u{)0?0l-P%ii#OfPsbitEmQPds$d6eLy%mLY|;Nib1E-ss0=&`Pbc%Dm0i$;?me3Z|Q zekQcz&I?00rpLa|$wAETu1}&*o?L*N9zF76WXP~4PUx!gBJN9XdIcifkurjnKdCTn z$uW@4Eicb-nOD*3p!JU@BO}wfI}6insI4HN9`eL%q5Tf;nL2gR$NJAs|1e--8N0C8 zrqqB#hxr{(LgkcXfL zJdp&eE;#yt5TTx)hR|_xo&zS~$+*}lQ<&}Qpc4xO7g3>D*xCJH=9eVc3CzXx4wKA| z1=rIf<<)RZX+UXpB=VC<33kO47i)ry7jXoT0*Iq`UcYdz5R;Hd{rssv`*Mt(0ARbM zL8l|)w)E3DAi1UEx-Z*2d^AJ~wTYG1j+gz&Pmx-4OS!GHdgieeMlVPkub1lE}> zREqxB7jizota=k7)4et(Q=xONlEw_^eS3TTl8wwL{jeLNTZ2X0!oo%1?T34lI>^+y z;=;@g%D28!TU|9ZGJBj~&COP$)w^x2?;e7*R@#K+{2!LtX(Js{+d2zGm=LNw6I zh)3E-Iu0@4Wf&H6;Sq=4hs}hOqg7%8ML~~#j#grHG;3TN0#y+ZR`3x(xfB&`YHPo| zIM%LDk-QO2$D?32F_Cm#2uu>Z1v7dm7Q;cuYR#7jI*FN?nNsVXv%_uKlo1mPJS?Zl z+G|mm7v;~^aA^{g%6p8!&1u;p-P!a$_;}ts3m&IOhrrMA@&2w^yb8jD>#Y55%cQ=` z{hG`5{UIMkE$aR*>?&;o*E7&#Mjh`g-X;yT{f)rTO~j)01q{ja z4Sx)Gb(!ugs0RfZ*xIs6N*W`BKlWcmUMql2k5G7A%xegDV~@TgCVo0K#WGXt>{tkz z@V3#4V*eAT%R#1RXZ}R5XO4FDAtv)ot zPZ_4B>-)Dp6OaozeKxDU;4;{M7aI#|*XH42q9zJN&A`BU{`XjOvn(XZgi>T%`WvV*VRp^CykEjt4r>ziBImWiYm-ze}ULf z&^T3j?`E@bCCuI`-di~|yRiA=Ap;Pz>TUVOsH&^di|%2^5ctJ*mIXa0sxc6*$3GWl zW=QNiU_u0Iy0J@HdisRA;x2d{Ua&;AUB5md%Kz$(%Th0ex0kg^O{1p z3>`7KutA#>3xnYsh=|A983?Gn{bCegyi?`5xfQXg*53b(qO>?kUol5Zp+G4HRMvq; z%+W329mhd@{i9(6seUT2qVlNRakI%G9$goy&5-Yb&qqN$ih;oJTj7SKf|FAV=t1)G zMoVQuR3s1gFEx+(o7B`En0hZ3Fh|P4>v&w|BD9nRenjTyli4@rXr;NfCi18Jni3Wj z6clhz_y53WJq()S&th`}U&dTrcly^Jg6Z3WA6I-tFBt#kwQCVJpQwq61$_^!>`!6P zpVPNQx%5w)A1bQmbBuUhHf)5WOy)b>xEUI^qgzah-Ll{ClPsPWd5k|*erS&o;NYI< zni;)TwP^nCt9gr>IyKz_D?Z^hLdVG_$J8{sXU#;ZIL+gVd*koEx&Ep0NMh_zaflMF zmgER}8>^@1TQ{(MoGb42yCvGCQ&@1ng?9(?9qSVlZGL55kVS!uv$qgw?u3sX2>V*F zIcw<*XzL6d9v>eZ9(wv5gGiy*d*kHf*~!Vt=g&3>4$g*$iwk(HRe@eBh(}Di?>^VkfvM6Vy+|<+*L(~t7DGMGi@D*t17UANWot4`r zawolp<(h!N1Fzw8u5IyGp3Be3#gDx3=f|5M{LHfR1L*0%pcxtY&3f(%Zb)KMCZ_bp zp|7#Aq^xW(kRA>}hB-4g{yHS&aS@G(QC?P-`{_|HM7?f-xcI||F^7rYEEoLjjasRI zCr?sfS<`(#z?PA12?jYpM1o!V&mR+5E#JOX)T>uGl9ChJ>l!**T2TD} zm8RDwEH^i_rUr~`9-SZL`)PD#!%w7p-rbw(E-(&p^C;DWrRQPs(8A(SzRx~+q};t8 zR|^XWKz9dprV``+?(UXfLdl!|XaP1hUWJ70Z8&zew`;Ln2ldd_?rsqcX458^^MQ{< z-PHKFC?zE&J$-txh`3a5HR|>i*jS>{U97DiflnMp#ugT(b%8&=D^ylhLDgJP05X*F zSt3|>z-^bK)e2eJFJi9iZC zT6x82BC@QXO8uGJ(R-_qw7s>(M|m~K6w`EVs5q{yj7(uFT#63Zz35Njk5}jRG)ZW= ztR*GP?-XD`jfOQ<^znoANO{}YrKQ$sw}t1u1A<6koKBf++Wf7*zmp-;RsXBsaV!AX zJv{bR-k5Nk7*;rELW2r{33LalI4Q|iw9bz~9s4xC}?!bU7F_ zAL+QQ@R8iVL!ywZG7qhg*R}15iF)uYS*G0J^;moV?%j-l1z>ZP7@2U2<;>wFqgm1r zz!CMXO&@x*7yj|^{zmF+|9pgh{c(~nc1Eq6EJg41t^8goMoMRZu4eBvzu}^*H(rC? z(i(Wi&CO>RZi_cgZ_@T|nl8Swe%*oc^7a;6X{N?+YM4&-DaC;9ol|6ax!josQ`9F$B$CLMJ>`b=Sct*X9V?O`X}b)2+8m=;^#p~;7D03@Fh#Wy8J(j2&pc{93&QPrQSb~`f;%VT*iOT!un?ShE+*!Nwa zEUuc6m?r@{7AaA_RCmq}cQ<6s+LN}O$LJjSc$O<>b^x)=;mLZ<<3`Y59!ol`{-3vS z{SaV|pLhPyoW~1B@$T-x>Zp)O-Pzj0As|pzdIJC_S6A1SokC}?wgldJ4x>s~ZS^6( zJ3{R*Q^?U#(EIoA0p--%3Rf#+oAgxq+%qt+larG>uITN%<&d3rPOngS zGy`D$UdV_tF*R}Y$3vemzkgxZn~8}jav?w%zssD5l>|4s<(@j!=ht7atgPM;Q7^mp ze@;5_B_5NT|K}a(K3M5S=%fAn3jfcSgPA7&7VXM^|0E{*=Dp{5y8rWnf8P*Hl;*WE z|NEW(>*ROQVUYgoU;pQ|Q?Ico3jgn$5~}hw2fqBT%K?7WGff(c?f)LfPvWcpe~$P6 z<)Qta)}EAL4yorN4H9<{KYI$IA3O|*(|mk0eJ0@YGdkvw$Hfr1aO||a^(vJ)gy9ZC z2@pVl`BSTmSYA@@!IVb-!$z9h;YBAO#UQ^N>;B+a(2OSmZQ%d&Dler5C-{>G$b$!ts$@x z-q?O(7Y+cQ7C*RW&KZ*S`j0OmXH1_M+;>1Q`?8f`?L#3 zR&Ndiy;yu!2r-?&SxF#qz#!pI7(v!DzdevA@AtOQV4Ua4cpQX@3;P|}C7}lsoY&2Z zZsre`SmzGeosIOKXY+V&SV{jps?wx?q$VVcj#_#w`@M`V=71mYn*iHgg4vy6{%5$s|y)od39QvMt_?M4zY+8H1 z2GXGwmB+*!ASlVd>cF=qJB7vtszvO}mMB!!>0U{Z*~I5BUmP?+eXp9gAF4*~^cVem zF#W%;EU^l)xd}V@D2RyE1AWfek22k|&gA36-kfMZ-^%lslJ#xoUn?uopQEk!e`UF}mpW6zu8COFy5Q_}Spubimx+>Eg98Mo7vV*BQ^ zUR5R+1)13cUotH$CwM5s0^*j=&7ma2FoD$ZWSXZ<(^n~?qTZ1}#A$&+MPzhzs&=ku zcVwCswIIT*uQ$UOozsJRB20NZrWFaKqw$82G~d}ZMDYF%$%|6ob8lR z7J?U>CJZBe$j+$Rx8s|APADn6{|Z(f$lwisfKxP<mcKh?fsco}VNM6lw?g!$Y$#K{15GyQqG zDLKx|`td64^73+tC^(w~Ce7e3~^KPH~I*+-5l-QL?P7jGk~!g3^?Y zv@E4tH@oL=d1M;%Qz;WmCSNrkoo94Pj8KQci^+rj3VrEWyc1$xEDWTZd>_~s7AKgb zeZoYqRvXl_9JUi6#%%dp=tP~(OcV&e^FjJzC+1*@6kXwFHl2L89b-K0BnCQqJi}Uk zsRfo`(q)O1roXT??_YEk3NId__VIBN#V3PATNAEA-FP_$cp8%22e<%yv2`VX1l}@O z^HC1j;iq&$$~DRT*NuC=5>ODL{GpY&vNBv4|A!BJ$Xw)b|89EHM;h8DUmOW#16S2J zf{@&wI;a{lE8^ma8}W8_q!uK1d`8EGH@yiSuzGhCJiYU^E%_+D#J*I4Z=;%>5q3CS z@g1l{ESd;bLL7Zg6iSBcjRhAu&NEEVRkyRTKL~6v-S+%e1)7%ST~zVwG-mwZHnwbc zzC|1cdAMpr(kcwT$fPoJKB44ax*hf))Rg>w7g7r@+0kQE&?CI|;q9HBTCO*Z-tQ73 z?u2wN?mS4p)*wY^WtOB5OV^G!Mzl_72kJ5=x~S-nFUwLrCEB^bk8J-vyM1W?S-PjB z%gUUCFR6o3ULm(Hv4fE#j)^pMSop51NL7nDoVvZe$9N4iF?WrdQmu#K+~crC%8}5} zgqY?Dtj+WF8$Vk129oh z3}D^>WSAN=G^`2qJ~7BIxwik#6sG%ks0{eA)*LQR#o0rNy$pwM8xAYh_^I5h?*-cgnE2?#x_xaafp!vGIC*{HIs1xQvaB zZB?|s1coW`fZI1q%>r>F7*UCalfP4d*A#SNjD6p8nOfyU|fmHnz4f z)iyLV904jbL`vDEF+u?a`3z1@@&F}pDW<2Vhi9Y&OlQZ&I`me4zSczXJ~fTk&b@@> zX!-9hl>)daB+V+36bEzchpc|*8;u-0n<(J9PEncf{7=qi#`jRT|Mb8ha};`Mhi51C0m z2O<-Y#IUjP2WIyI_5n9CQd7B^=EGI8LCFs?XFGv>t+9C2YY#cCj;AXrB`lV9zCRX3s+cbX_?#FCK`-usHw$A zMm|zggB|=BXw_f55Gsn#?Q&I_P)X}qbQo8HyhtS+%KPe&4Dk1FYQAzBL=QmH9G`L+ z`KGH&F`K01Ib5d-nT$7Yq5!l5y~rD0qA?1|NlE&en)9oxF>eVip9FBu?fgzYfzD`R z7KL&C+ZsliX-K3}I6Ryy?cQ0Pb#Fj`S zr}sh|>5vJy)%*8f?yn|MQ&2q8(i$CQ+um?gRZ#Feu*SHU2!G1YC&0tQ!NX%_XRq=- z)Kgctc6N^VAWjSn7yEXl2kAvQ^239JF#CCEWR#V_E?Rf$jaIiU5SvG-`8@N88*90)%m{@I3@9&LG zP4^!>z{DI>0oo>}y1u^8_FO*nXc7~>MMYCnQaog243v~gva_*2lfC)(&ajK3M9(0% zaq$>H)#<>RVmw-x2Ga4+*Xzi*|M8fp$Ck(-TvR7x9+q4-1Qa})ff=u}q2X!B^<0Xl5`G^j#XN;MFmf?ZhCo52@?gpqq!a>)tTCT^dzIh#M$nv2O&|YDU?p+x zd-H;~+opE_L0bqufHIZkDNc5JI$s9y*s216+#cGdxLCb`0s8y*z6?By`i#Vy1Ly#A@_l_>23O_^^ z2dyJxGO_^p`)h_5T{Fk)0VT15Nv~nHGWebW0&~vV1dmpVIT4fHB{xRR5z8wV>5ebA z=lts44Aq?ffwCVxFj)2gP~#6-V#0jEkg}=7QA2)s<7Qj1bw_3K4Uf z%IFBTx3fFiYAZk%5N1jpBK=IJHcrZ(v}<&KB2}t$a*~2soT{bbr!f zNl@mq>0N*^05nvWIVSvn45EYq7n95Wav7mx{&XC5yDg6G@Y;nCgPr6EUCPR;9v~3y zsN&K}nbecnxZU=^D(|Z%{oRTD%O3*##fo2waz)y2cgeaSlW?Q4>26%-EuXcUfakeh z{x?!cOj#PQ;@q~8k!dY7?PO%!Gdmlr_R~oc)!~Q(Y}C6*Cr2D|312=J6i_IaP@(Y( znP8^pMNUq(0rS?v2eDw_DTM*nwQG?;IhDxQwv99{-w;I+TF!q=y_-TIu<{6@g+z}% zNtmn&?2}bg&JGx_$I?RXM}Vs<0dlZA&^uHt`FQV#N_JT+Cuc#t#Oc}>@Jsck5Z8mE zD-MvPJ6Z+C=Sgr^R{4F*wk$6$PAM)f$hD<&QTeJ{je&(H>3{MrZ1@5Z`$z@&s{w}( z5W?#*Ff47szP#Xi1TMS?+H*!kNE92Nl8>H&0Urs%^V$O ziFa=g4dL=TQcB9X`@aR>^ivD2$?Mnq5JDQ7xw*N$xGh9YX8?@Fp)oO!iY)`gto~@i zj*T(8;@dZfHM*{uDl%h|INiBbJaqCmnAiTXc>IK( zGGh;CO@_uhkVv_G`0#;^6u89~q~XaAf|}+T%Ng>#u&DywOjQ;1698H+=6kRJQ5ip- zP8tX-xg#y`@$sRHzCK`1)c7y1uXlQyTzfIp&@lE()u#7Tc0&V! zix72m%g$6NCj-NaZ;Qk)OxYMwriWXlV9A0V|L)!%BhEHVp4`_ZHhzmf5#Q~VS~f0( z(&>12`O0LuNnKvGpXSfUPInt-AhriYJH&`ylcYN#qeAAlZ$QX)^Y{0M0n^#v;B{1c zGbCl?K!j!<=;lP+6r`n1?d@+&V`O$&K~9vUMQa9`G4*jfuQ4VjX5kQZsW&vwWML<~ z9Tb!`+g3vsy6!FVUZUzHT|0RYjAwO>yzVe&ol`xjq#-4R{Q=T3e+5Pgc5^eQ`<4t$ z`_AsMkVy8Je6LG35puN7PqvRvkIR5Wr8lnx@qx{v>y;F=6UWa9vLH^aNH-6rL15RR z!VBuBjizh%m^f99pt-!ZwuX-%4*QUTfw-8Me8c1A+NY;aM&$qy#dHhcdI7NL;s=}Y zCH5Cgxb7^xZi${C7hJO_PC$?l`qPt>_?UJRKFZTmKZq2ugd*L?2RpJEzbUMvLm94U zpV=5PI5PY03_(#RLwE!*Z=^?{AV5jffMdToQqup_&8PE2QL$ys6HvzV@ZFCTaPYGe zV5O%&fiO;`=D*6Sm3i>4l zsCgC=T5t%M_UBRDzI{Dc`_$^%FD|^=fws1@pRalA>dwH34&Ji?8@GW1V@Sm40lc1GZq2 z&wO#`9HjXQcnAhJgumL*WJ%W0Fgo09il{kSI)@Nj#WrkSOO8)DEswt0%?_7JmTo`5 zefb!M!qH4M+rOxufESIXG^?eudq8}upOa_J8+EOL3wgp3SL(5zN+bRl z2tM?rp}jVs>mdUu{b98qHahxAzBn_Wcy`W?uONjW?hH5w{+*_d&hfA<@plhZEXT!= zo-`>sWD?|PndJw2pf5T-@x2rB`E%mI-pCW>_Xmu@#eL3_=tyE#dYa6*zfWFGO$}@b zrRew)l-%4(A(0@S%XAc=a4BA>jIg9}@Z3T#4-K*HKbe9GePO|zYe8R6&tXjA2?RE3 z-kz(s<{Oqg6FOVWHg5bC1fr4EoNO#T?DD@tXPZqapjjFm5fu^<`KmjJP0Q@!{1r5d zxqUV|1x5}-i&)S9LLS6=_3`iK$j&gDQ#)Nt$*;voa5Zap_c28?_Hw&zmDJ*RhnD+4C`^qYgBat~izTe8S*bZhI9 zj{QVm-gf%IdS+zk27+b6ni7^$mB~M`Tmg@TmuB5mfuZ#^HPl=sI9u zlc@pqabm|k9Tld3TJZt=5setRFkkJ?utqkP3#dx;3}r9sCmF;OGJIHBKIiR@R{N15 zmAm~JP*P>7Ge*OM;9^|-N&<8+ji;$uS$hoxl4wAu>kt{M5)^j~bozB|qC66H8ZP)G z3+)0d0W5y2^mdT=jT_l)4{$_dR4mpxK`b=AwK_ zYj5wlPwHkL%_J##xfml34rZ!+2ul2+n`^x}l?hOLY5*WTV%&n1Qs~-xjC+wGAXc(o zrQq}0!b8XfRw|B;uoS0ZH9^A!Fn&`COut>#xNY~=#BmT66}0vm*lZzOj+1{t8`O2N zk(@|xs-6GfGvs`o!?-%}y%@7Zb?4?ZQ@*7TFR$%Pa~I-xc5yE&t_s-x3ht{cpF%k=;;}D<6dDYD zfqbC{NN}8yw_(Bh+XyL_V!QVE%gAq^{k3z&zkA}45ym@Rx6`j54bv3%RiW_pu^+Su zqjI92uCBQ?V5$A4!^+UWPvAnDA{&&JMno;xoeUyO3yWFZV>h1nVqOF5d8vQL`$5Hy z02#!6<>1Ymk=Q-`GM=cYBaB)&lX+Ce{$64TbW?iMinVinwma@1^atzSCXZa!M!har zHP&WkR1(?nJX?aY1*tqgQwq%{Q0@VmEqdU>!o6h+>)EHJud}QZl=dJS4jrOC)-B9O zQ6I)>U#MhzIBjAF!rST9=ouRmOkyL^jLI!-ZDl3E?Sf7Z1(J8_wY*HlsNze70L#I2 z^+vlZt zELUqdfTAoL=1$|k+bfe}V}CQuUQbJ-J+7%aarg~jpa{nW1e#CdT zPb}0H@2;KQN{Kb?2Voa6$T31oNuS*vFkT(tY!qR#RZ|NL4gI;ryYlwtb2cLx(y3{) z8#fxZw?bH1So8@LqA;i3?nm9oztvwCVrJG94qc1Fj3per9RhsRGh#*Nkd}{lBFX-z zM==PO!zj>~0X7domT-N&!(ZybfBMwp^p>x0B@mkLPyPM-yW~X>R?93dNMWTiHD+hW zAa3a7-JK`9t3DHWObkDFSCh~YR_(lF-py_C_?(Z-pLZ4eF|n~9i6(PYZ z;`!l~LxB1tAAR;~*y}}+~AVjaDm1PnN3*UZu2V-~FSE0*m3kxPaXFEN2 zkr&9@*jTS~Rz75BZH$$hd%SyQX^F=~iU;8unxz1_!phi>be#g})1ypXSJKxj>E!Q;dcWm?9xQc^16^Jt_){ii@wMtsmc*n5i1yW5A274$Wj` zFpmAaSU0b1;sXwZw^{V>-;$NZPI_iTDxneUlBV@S zNiQa#djp$7t9;zx28h&zWiXN3tnLaY9#E@LHU4+UZSEqx3;#|%G${!Ub~ zlpv2>!M2o^bk5c0{C%bI2Xh+|*JJ>;H-?fy2xLGILBMd|u93UI>w6#znt*P~(Nw6{ zgY>R$j_8(nNxQEi&O+1y0X2~A{Lh}~Aa2`J24_(+IVg`-6ofud7D=A&m@#D&7U`<# z`(%Il68?G%kPm%UCCJAfYglU@b90!GXALZ$o_tRhKMs~LJ>H?Ye%;~pJ~2{mK!fn{ z$+1U_0veH>od@Ld!UJCni^UpE$tTOZeuonP)t0Dfvw!g^2F7$l!(F|ykqi8-qGAV% zciRG{Ii-5jtE->1bCns*j{Ruap*t39SB(c*Y6t{wvuoNEQDrw}PKFmVL$zu&L;&mT8o10CFAH}}C!V#CQ#WFgIj!!d+ zUs%zTI9Xow{rmUK%$IcJ#CRQl9haAukoOrH3HRB=#fcFELqnOn&+~t5A3n4EKv8I~ zFTWfKh2NJi;4EpskNt7TPQ}9FlG)q>JtW1uxw$FjC?sY*V$;5RH`=HG8?f9C(IaOm z_hHY2Y#dVOXn~XaVd(3pjrDM3GB;@v5?m0IpjMubj~gjfUWBVbesh__2L}g-{?cpT zUqMUO(9n!)fjy$mS0bg;LxA!s?#n6vM*!W^qOVvlfgvFc4b6pMn>hsaEZ)(80D)A` zvZC@KyD}ysN(5wY`DS>~*+i=~rw7v7Eqc4v3NW4k;VntR&juKBDFOZvaJ(;@igk^U zaC*UW;vwnldqDa`Y7a2EDHSr6J=U~-{@f|O^Yic068faF`VxojV-*GO*13BYq~>>@ zSAPB4{Qyj$6`wy3Tk)xr$oD{!0|y%$54kHMH9@P!7$bmIJ6OcI;kg=9R-6U%h4Zt! zkf5u>(q`=E_R!gR9lI}tKdA$H2~b`!Q2Y>n5cNVYA3>g#+sZaLK{hBB0&Us6fL{or z+UaoZS}K#us36M0;e){!bR@rj4=ZfCyryPgu}5~snc~EZn|uQTHlXoS4#(8dp^+uV z3ZX4|M@Qbjw3*||ghWMo+c+i89AaBw<4QoW^)5X<`o|A_rjV5X=w|Y~#IV@#gQwTm zuOJYw{g`UXvAnvv8fS8KZ# zcStp5tgS1Io{->(L2ShK$4E$6hHP!XJ!XmDyctsTsBff#t=hB&6m51kDcNe37a-ST?sj_tD|1bO!G<>qYjLv~B82N7h6 zSupHECj0Z#k_4F~Sb}o}H|&-iV4K zI`95EDgi14*zZ6_;>K)ScHYQK8P)QM99#sEv$Vuc>VfP@ULzA21~ObG4Go>@)A@lq77jz6lRsC})Jnd_isxdM{dGQc}`Yth-5Ad9eKf zO$%62*C%SycXMMyZTToE;zV?Gbf_fn!D0c659O=UQa6^EUtL|tLzc4Qa(7X)=Xbko zNfo_W;+=1Zko*AVh+66A8gRvfWO8&&oc`9W zx7h#ax9-h*!j(xA0UPN{@B~%J?%|C{q>r>}ewz(Q^61!Dj_A^Nar2L6_$l-2OuB8B z0cAXt)fJq^OeO1g;aOtSUM_fDQi}alAyXjfGWC;Th+8Ww(^;;wPK292JbdpDE`(8I zpSE_WX=#Z;)CG7LBB=I%wZ=@qeS>B~9t5IcRf)sO>gvOq_subFv)>+lAMuu9Gffgm zWhD>V^o%em9b^tPjh`Lk#xsjTM?<6mnuaTtka(o;>Z+AQmQ44mKc-FenE{6+Y+@j< zkeK-Ri+-7enAn@cLg;^#O?-oek7FC zZz5Mml~Is4xIsAJZ0cw?NkNfHB$ex~yZdiw;W#e*8HYmNsPe#tabGO7(ZeR2kK>)6;B&nk$^o=m*!%Z-By7OHnhEclVx zBy%@f;?#9`xuB+hk-5II@&rJQ;Cr4_E2LBMymer}a%;u|0JC$;%RT9`8uJQLx~$#( zbq-F46$3vp6E_bl`$a|uYed47=iIPlWw`@eA7e7%@JQB}oSnS1{7s!K;Wrm`JLN}t zIRfZ%7?X_`nGLi=%jW;c?W1HQ>KGpv*sHv;v=lP;+i-Gm5dvJtIcp52W@q^wCy}Jx zPLlJ}snA2@1C`(zGF!))j~Mmq0i;HVFDZf-9<>pa&#=5#cDzoGpYEBb91k?#w=&6 z7#{o${;^Bj1T&JYnKCTAg^7wJvVV&af7ZNjGOGm*gVLw_78Y)bidW2h9v44?-W#H( zuWxDTkz!rj*Qd<(|M2$S(Lnd{`~O=?n}#GR4HX&5EEz4EtVH(Sql|=%Xp&?nn~3bJ z$V|w}-YX$w@9gj8{@nNHd(Q9Q-#On-=RWsQ!h5`4&)4&LU5|^(FcS&nDX$A9M5=Fu zg<-F9(USjhz4MqP}~b&eWZ$T8%ZqL(eIkwd$i%kcY$~m zT)YFQo@Oudd!6*5KO+C5_bTly>eeHH*?<3jMn<~Gij$BKqR7_gv(0fOR_O~h zj2b?%le3g4njZ_EE=-JM@UeTJ7W?tzpTE<-PoHK3N4(Y~Ps%cqzv+a_W0Gb@hD1XQ z({u81wM^rh7yC;{NlBTd#W7%l=UZ?a2IETwEaH^&Tid z;HzrFH}1>IPPZg|@dAa^sG*aU)%-%p8b4B01K@_^;>?U1{GOZ@0KHe*1TtT z296sHe>XZ!<#8n8iFk}r)!CKdBt^9>s?6UfUriu)icPOl7gCspPjiU#Cf~VpW@-vQ z&G<*MWAfKd?Avlx-Zvxjhl0X9;Z^hu+<#@BmR5<2)l&2aE^d5m{sYWv=w++9V2c8W z@ywlo0|pE}(K3yc(QWK5DN$plB5}Fh(RE*{$Jx2;$<7peJ3GL+8RgGfbYwggD>GoR zTC?wXeawOQS>{>d?Y%$1(EMF2U__*M5}sBK=6-P~>JEQBr#g{;P%ech10(wT-slKc z48HMc_|VTQ=&fni^I++bz(I1Tof^{(eB9j39^`R@CrHb#dk<=8i3^_fqc)IEV7V|V zf6YSX)>BadX~PfU9#d|P=G%lJ`SX&Y+0NDC3RmSME!HE?v@ofy`5L;1Q>y>7_latP zTB>pLBd(?YitMBXyoMxRA=Fe-l9C9yY_;UCsQ#(xt$}7`#@%el4Bbnw6NnDw-YJzU zif8?5(Kdkj8=iA%uARZ!MCyX$mH-1oQSPzw>D*jZ>Dp9ohl}Q1#FVJqS$^ink4dWO z@F=v9F{igf?!T%be}n$O%E}7iqRM)D$JY+mI)PW-FJea?_;4mPf9%XosR`n^fR5(b ztFbXcqfq`Rp{b<%)|JW5jTLH!&KqzaG9p_Nre}Cpu&P9Qf_*>_-V@Wj`C6dB_AW zLZ^1%B?s~3*)te1pvSqO#+&(Yy7I@7R4A(*9r=k@M`j;cTl;0Ur^Uun6|MeEb|wj~ z(bpcXtV%Ey=Vb7&yhYJ@cFSX;C?0dDdh!(+{8KodlDf!73wP!CZuEOeY#}8r_o6FT zO)R8MQyTkC^=M{*L?ZXp?xm$x+<)@q{hd3f zTMmg5I2}Wf(rFDhKxg|)0$fs^uFrwIabgc2z6Ayt@Ls%o2&UcWw(WiPf5ixf0r^PpAa3V!SO_-YaLM8Zd7)Z#4*G(nPO10U1NT3esrmoqmHK>7Gp zkjjn3!pNxK58@@zg-ku!cbF^CMi^c_JsVg$y>=D0roG z@N~iUTK3AWXL%;`j!pB&=2N)6Mvq;>eHt)`|9$OiP0c5y4Bk;t_@rd&TX9MI+xPF^ zr(X9e{Hyy5J9=FD&~+*g$kD;=PF!780X%$HsUw92^|QN(WseZ?y7@Z@A;#TacMhIA z_x$Hi83MCzHLnM{gk}_*>2ax@u6#gR5N(fycRwnKu<`NUpy}!9-s*afNWD#BfOPJa z1%B7Wi^sk-HuAG3Um?&;`yI)*|E-c>QcJ`g!MfNIC29Cg&KO<9#)<%~c+V+$c)4B5 z%6?~LsI-jJc*2**&;1pySDu96cLUsI zY@gk|m#E|HZfZK^8*e5Vz#CeSm&Yf#Q6T^HBq!&dtDj8UcLhoITvK39Yr~14R$!&t zsy2TW9V6@(atZm0FwJ=qx6RC=J!>GPm>Fv?X<>oT4yoh>gbTVl$&e4_KWabgd6@oe z86GgA=tpRl$S*+;clX!^xlY(?ryi=t3Y5jm55>qC4Us|h-2Y2kUM}oTyq_7B90q?O z{3~wAeEt!}Z?!bDH;KPH@#GHe_0^noeMdHj1rVTHva-%AM>qcgf_wpI0)v`m%^xAs zG&D5FN7G#Xm2ub|_aXuFo1ee@l^r>eW!{}>P+Jfi>!7jg(5|Pq&u>qV*?;(O#XyAx zX;F1hFNotE_DA2vB3uL`JB_>TVj6D987GR?*E+K-di7>?73Acy3~JYJ3Eo0YLQ+)b z*%@@eea~T5)#ddSJtA?t&<@_qmoFANg$p>|iXW@HaY-jrD=k%ICiqVP3*hawVK>mC z(kd`uqI73b$%=_l8(#i->?Q-{gURC@=3S$L>z{SeiR7lR#Bu1$gK>EKEyll>C<#w= zF&5Y`b^Fv-k&!>&P2lj6{PANNXF#B$dB@yJ5Qh=57!w9Z){7Uzh^ih3NWOB=mPrlf zLwuRc_y><3A$XD5z4K1^w_br)jX1) z2)GSsk6`$N`5L~D^6Bz`g3yw_Pwl3}1CbVWO-;?)w|@;*odc{HXCqT}04!kTdsA^9 zQ>RA@V|Ef^G6Y+2O}2#rMllf||MYNQU}i>c=aU*=6-P%M1%++Ip5q}6Ino0Y6P11$ zojJ1wPi@y%OQ8pten1-djF>Df zCzJvXzV09Tq1KjZViDY5FyG=VC-;k(s|wsuRdWn~JO=3tEVIVxhpni!sp-$0ff1PO z>dbhy1k7VB!T{UyP*9|FbtOpZDLli`3S{e?c|-IxG@SDpuB?=y5e4;7uopWMlR
Fr zgpzW=qm&%wadf>Q=SMgogCupqI=JfMe2!C0Qu6P}2ZeNfsf}7^{lLJ$FJHd2x4)dT z&liqHwA;TU_zB9R$4IBaiR;wMmC80SWTIzJc5H`FpuxQ_cvOY-*z^3T!(P; z@={!!xJaZvT6$MjMz(2t)aknf((uCzDdqteGGQL6s?MwFOTD-Ul3ZfJGUpe}U)Z?b z&;uB$q|~-4<*X!s@T5LEJcz9iuNKdb&=tT(3SdJ@AeU zu7D5HbRN<-MMbB^+UbxlZe8-MDI(M)4^GtmACdG_CJye4ZL=Pd_)_>&$Q=CHe=A+LPE3AD;${2WB7g?a_&E{^;($D^2O%+;AG& z zMC?51vJJrh?`8(W9{KaM8>IoZ~d;KZH=sJF@j+hxZVWPXZC& zo-tBa9TaYoX>4I(;alMs7H0S7w(z}Fi@WV^u99@`U`1G8TNxVAt$sUgr=|5cP?5*y zJrud>_9NSbK|#TCSEN~&uEgv^4~;VM6TW|aj=rBiuQpN&)nCYCTaMJe+*#bygFuJK za3@}i>0d&{#l;wrd5E3gO5mYkW@e5u+Ev2lM#2*;ws}KZ(Y^b}^3|9gEHwVQ1j-uw zQBOFi*H&z2m!NxmNdDY6C@3^o1<#USO>nDC&a-FwbrIfZYr929x7F6txv*Zi06CKH z)t_s>gDsRQ#l`7;80CBT?rE+RyFG6UZr%ArK)5 z*(B}1#id_8i=-+;AmPLsxesw9U6pDzyCILxa2F~#d;vp7L|A%8CM`SUNL^kgo-^^I=bN>rr?)ua zXy)V&Pd*nn_eE`#(UXN5y9h`(Pwn_>|3t&-?xvfD!oOmmW!yOP_iw4r)E&?6rV9Wg zl`gx|6yLZxy$r?xdHfM?dV8Ktf?4Ja{urvMnMLU>F1Vao?QrUC23$#pYqcDMs7B1^ z)AvV<-3<#VW3JmY;%*zii^WJ+U}KeuxMV*^eeF$)1;Q2%5Y%ixkHBKmjVX)MU#%d$ zI7l|fdYy-{2NGc@PBT<}Oe7_ik}HEwY|! zT|c@PR)9ydH5EyM-5j-fA)%pF?>U(E6=T~ ztC-&Mpk+I(CfYs?+K$?$#KkRJy>Wn$6tOkq)xGp~ zy=PM6tXCeiKvQMXZL&0T$UeX4)ak$~Xh{q>K)fi_*Bf-dDL~vCy;D}AL8XG}=^29l zEV(w7bnr*ihGZRj4e#SAI%q(=+E{cBzq>m{CD54Vgg-Y2RotCa=f8a)Iy!hgbcM^t zcOL99XW_Z`lS3_J7sLgQE38+(xU2{^Sxcz?aX)0j{54?5FnE2+6b)?*cqb?S89+;# z>yw4v%GN12C!|Mk=t(^$hZO-DnA-o#`w z_w=#LmeuwH@80EtB(@ohYLGZdLobG+QZkIMo4v_}uF?I_t(18>93w!|I1|_#`e$ygT0Ngkg@VERiJpFs zdd9E_@o+MKF-hcq>Pe|!?y6I(^&%UA0RaWN6>`51Q14lEv@%3m_?N}2!HQFz7Kd#o zlC?-VIv^W#d~;R8sy6cd_ZHdA7TgFV>i9=#ZDGp2lTadEJ~07uu`+ge_Z^m>n*r-FU>?eo>6>+fAs zMHs}wX>)LsB|JXG#ii!u@p5u9oH`|WVjmQR-*wsF#Re79)$MN`wF!8%z$ta*^5wgV z&Wh*#0e8A4`;XfG5xW0W9zy$`+({_CADy4yCPzD3d+qjFU++?FF?v?+%Q>7hEU#(d zwR@(u<*`eRe(&e|R^MKHz=aiXT%Nnt#MWS#VW0oHRGZ_j6QetLU2yj!$FFLT-KJ8^ zXWz@4E#mBzCY&9Rd|-~2ri7ile`u&`X!qE7DaE@-ZX~TE8Px~26NDuFr}QItV&qVY z9X{mW*1j`3`t-4*M`6RceLk~7_Zu55kTv#KedzVr@9IQzVjt}7y}-wJ`@}vU`p5mB z;ah@uO~@yT0n;V?Qc}|9q=D53!%!Ih>kVP}rx&xg?=i?porsf*r!F}{uvL}x^b{}W zLYx~L8;jcxBZIE)+wAOYH@DOOy7?~i^0JG?=DLcJ{^hL?t;SsAH$UII zbTqB4=hu^lKP*jWed}i~KD~ZL;uUwKx6i)1e7wqnX z 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
>eb0HhRPEAdOSljG(dV?*ZHF!9XLszFW zzv53vguChaAz;UAuPSuU4l=tBsi@wed|s(Ny%2=EdNNzl`Z~ei9+?T1R_s%%s0;)2 z0gA_uAF`vP#0>YK9KZTvuc1b5Esob+mG@P0AApj!gGHB=pEz$8m#(ip>@wakm<_l4VDeUp`{o`RRcT6PCY3=cNgAw}}+z2>` zdXAy`L|#@F+oc=R!_Sn)y5pmT6xTbA3W9=Gh{yYSTjTI&j->?!KIG)i(DVNhjNtWq z>l;(mJr|i0sb`B3TFc$8Ay;h!Y|WFrYpSpMK-t%MSpp&-{ZnJKOSM-GVrPNiM&I4< z8Ahq=j4Wh`S5tLz_1WF^#=-iYejUeYbp}_2E{rbI+Q4wxV=droQ4@894W@p)*y_Sd+BbZzb7l!Gn{ z0+O=-eAy-yTt9G~y(Y@^VvB$fw{n^+odP_dQw=FVJn=r*EhpEsZ1M>MG@0Tk-+m`O z5){XmJ-t1}LE*B)f_xVeghHC_seWiocRA>jKvYdPF)asE|Nd5p2X#QDxEf~jjCWmk zgl{0Q-SP%AF~I6@JWMAmCh7Kle0~G#8Xd`MP8v@vFV}DKkw&x^+ua$|j-+kG5z1%J zz#ze~Zp+ni0J(iUUfbfpWFzL-lg-j;UdtJLBqi0q)D#;6VAA}T{l&z#&wH41avni~ zHBFcA=V}Jwf26E>*q0IUS_=_cZg1BMquaW=Nci1UEiEVZ7AZi4r9e8fZM$PmfjC{H zn$yb<9-8(&=)h?ikiJGm;J(ULC~jT!k>=Mx1<>>ba7WL6)jmOv(5v&x|@2CzBLXwvgOY!e!q_rr)ZQL?E-N|VJ3lx)@7EAD*G&r(F>aj%x~ z5Gs*3oK|xLgIX)HwCwCtF#!A!ldgns37{;Wr)Onmy02%0fVHa=pn&Rjx;TtzA8pWN zvrZQpPIoXdl^s3xeEmwUbNbMism8?E_<8!pYWiCw&wR4f+A**>&+YQq_ROtzCbxDA z@c=)PM#aH(j$NYwSI=Sx{|~V!Q;WpmW_Z+ts=30wzqjWTM$d2e5f=@?^pYujV+bDt zv};6$_Wk|{S$!rtx>VZV$*)U{`s5HGyiMAE1_2bQ3ujPMpnEPX%N6T(xYmQrG~y}o zo^Jr>ed(jdv`OPPicQ>f0^zpBz1*5JgOy$uB3>-FOFOT{wTPr&pzXnBonN#oMvpRl zjEG6c$3#b4sO<4yjj*|0$e$@O+T$b7)K4&~eH}OQX`sNu%s2miqx2GXEx0La)`LEM z`ZT+JJ4taJMSylA(NQWSMe&1PJ~R0?E~d|mWclAvXFfhQrpKzHrsk#2xNON87Y9gT zDr#!TfyCi9>xs~r@w#8}2+IyjNq7CeK>*&zrsdmkFzMVPgw=ttumXU&G;?7UYHn^$ zC4xO&vKg@qIl&I5TF2S1hFw!Qg@rcYJbUWnbkO&vgT{nCs@nOuqO7dBrDcGI$8xao z08|&pO@dNU76j_lQqu!>_x6PFQ))D=Ppt#mzVM%|BtIiE2rfK=5r@_XIEMpMpSxh| z3QP&GE|a#DtDDQn1Vu-$!!xPyHwJyPif)4kLJK zbn??{Yu%NVzpF$CCjEj30IZ77&cHh9sGSh+DUCWGsA==2&46=NACkzmM?B_JdwrXVEj z+a3lxDdcT{Zjd{?clyfS{y3OQloAWC4*DX_VGMX=QxKu)bXhv>rdI1VNfp@1V>PD- z%7jEJF4hikh{VLcm-;`K3i-R(Q4XNhWZC^wm&D%p{V6wXmiZt`79IXfjN^Y4z~T?V*SN=xLHFyOI`Br_qQAulJVsG`z0Ix6f-4aN-!TI1mbLKUTj1=GG! zvf>Be%cw)wU@xVhEIS>YI;}07&|vW^r=hXAvB9q2ZuiJSDdM8xt7&RMWvcMl6eE>* z1DyC;S^z-@)tp0eWFvm^V^Pu3rNmv_Hne!C@IreDj3cjt+`f|1>p$Bo(<0G+MaWa>kOXV`8wwsVo$M zCpTbp{6(k)@ezX02`DHipq4170ZX!?BCV_px+yag6T!+`QCWF<;@~T^1rq^0M-&aN zpkY~twgM1pMaBs6|)?!L4>-xLV5Wz0$NLpR5fH|JmTZ8VHP(d?QBeyEZ5i9FYdxe9+|i+qYc+U6e?bpte3dI=Y38?c?iP{P01JdYe|k!lf^92Q1gadZ0IIad2p8 z*MSGN>?0#(Cnw68iV!Ym;vr{ZVR=fuaOO2 D`jzx_-cV=(il3oy#fn>TW;`pe%7hzf;u#@UPOdUotGYxcN+rPhC@2^Q zTENb1<7$RzhI|}<{N!Zz_kaK&-^#6TRhg2SAoPTlz|_&+(=*(^wtuo43T1%-0o`B+ zD{8L=EEW*qE7erAnEF!R0}FU?I&su-1JE~gT&U-Jgc z+br=6)e>K9md1j-JMtly0qg>XdIbS+)tj5sJP`hT<(RlQ^I;MXk>t@*i&{@lW-hL? zZ(KSI4E>Pihfii~%!xqQ)6*03w=I4TbTeqa&!6OI)WQxEo1EuQhh$ct5u-+XSQ}Ro z45G=&NCG_nxzBZ=zgSO?I-;X*9Y@Rc@DTKID2sbAQfaYd{40*W6py3ce-nLBN2=mU=@VUj1n_vrJRM~;o-g#NK_S;u&p)?0X80&7y zWo5R9Ytp4==N4*e(Pqkvwa=}~Uol1$j+zn^8`87XyZZJSnOa0V@W&7p6(uHK=37uK zg(MLf8EdgB75)w!MV-bkp~HK0G_}u&mq&<0H{@H@ ztq-XF6Qh(Lu&duQtNVKb&`fWNP3xYv8N^`ynW_(X0NoMmR6W($*eFqBaa;e6E(<$* zYT8meJffk6Nm8*577+$Laqg@Ag-bP}n z+SnMEJY8yXvS(r8e(bGzv1GZ7@o{cuZ1^K8<_R74R}P&bvj+4UV0mV4o^xDR8mzI@ zgSWbGTyy2Z~CZRVoV4t%sbzLN|%i>6?tWMIfPeX&0EeKni;b{?QLUK(^l z-^WVO1AmeHk>tSBuheZNB_Cs@wih20VVU#%&K!LB_0@ak`=>5(U_;H8>AVXjp2=+1 z`v*5Z0ZOaMJTwhmnMP`1X_-Pw?0btD6t%ze9pI)I6PH64#zDj$=w_7OT*I_vn@yMki+Y1I7sFmN0W{ z4Ag*m#dojZA>`(E2l?_1x8l-q%N%w+chK@xpM^sS+9F{~OJEg$hYRw8}0xE!f%Wi=QHJh!D`d*yUi?i_wG77PKFJjgS}X^<wx+|@bc#3AiPY%x~sWj!;>I^0OhuCR+kY2|wC%Ob= z2@rtfNY?rslM~&pbUdZ<`44Wh5;vanG>TGePIX4ZI%h`SI}@piejSVbeV1FDoKk?a zbo($ei4Q2#=r+>Eym5J715jQZcJ4c%3{8Ti_!9g}9Rt1%jJA9W+3orlu+#ZB4pEoi%Jtk6(WM+Qh)X z00(#Yy7cvdU~2!d9ry?j5w{Dgj?I;A_7^XpNxib70!Y*#$j@>n%Fu$v=@tSrwuwts zv6fn_loHfCBI4qWUbt_oo$2i`zPSPTcX)6Ro*q!dbsGUor};wbl|#!vo8SL_91sU) zbY+QD>)p9PH8n|C+-yI-9Wqoq{9>?+yg1!Q{si*AV4 zwloPw{@A1(vd26DB#oXez^2@sJXca2dW49HKd5#(^x`OrzjPLqB?y>D1VY@?uU^Ui zP|QR((yw^wsbSPapWHX1hD@B_1p;8%>dOc?4Sjkq0F#|F1;QCa9`ej5>CKZH!hIwa z*Jb>(yAHa|*l)$fo2;r*Q^^{80U^@lOAJw}1Hj&W+MBj|{pFRQ)7i++pW0y(P{#NF zDErE&D%UOCkM2f9S~{gmX{13?0Z~K*L{daL6{WjFqy(fJq(MNWO9iB*5$Vo5Ib)nL z?iu&jU4OQ2bph*pW6ozjv9YwY0{}R@oBh{!4!3UgqdmTjiRpjGSD86k%;DARJ%*wO zMo(s#No&C@Zu9)`68;*_1BxniS<9;A&z}=xV?PaQ)#tpIB*w+a%i{oNLsl|qZ33Sb zI?OBb7?zv;D!kF!DqFp3$lcqcMng?aMnbZ*?%AnGnR+kxCn*Pq%J#N{sC`v?i%Eh% zCXPbXjT^c%ZqHXiW++>4>>b(S@F+{WzSa%cC)C7jkIv$T14@eLDGATU4RQ<^ra=fR#3ya-?$+Cj;$2PmFX!83MS6I zxeHW(p@$S9ETpwl4$|F+Xy~%9UATm)!a_oN&Sy8*Su@%;iP7hlmQGwqH2EggAY?%` z`_Hy3OjvxFR3g=X<&CVuclAzg?tIne-PIbHdvnc%ANchD^OB%UM|+Hbhaw?YZ}oq_=9>IT{@?eV9OXmh{@?e6RdPzD=nKf?|Gr*6X~QmsHo(!D?Ett1w%QyvhHmrQ8^OsJ%i$-6r9N( zTt~0^s=z>m5*?DhSMQkHzhDn$R2c?VX%WG$(&}mB#`K6v^xCljy27Rt{{{h?(NAYQ zMl zEkmecjQTIPxvyZX1bq7xr`sUJi+=%Jy3&umsi*5Q*N*74p3Ibb9%` zkjMr^_cclXym}xqN+~Qk^y%1ApV8`hm(0xsE^i=D_+!vYc~)-5GOLiHk1M@^ulvM@ z*0ih?ECt4GrSV-Nq04ibInOosxgofek(n9&=GLemzSmkyrLDimw>;fkzqkIk47Qwg zb$4YF7B`i^Z78H8S#Wt3e8Jw_!t?V|j&3-|Sm-OY8CRlQx|j^b--+&pf z&N=}kAYg?RFPlREZVHqS{y@!r;{GRy4d<;%nZfaKc1K47%KCRII?5kb8oIhnzE&m) zv*Ze3L58ZA_j3x(Ak^rqnZUp4M*IE`>WB~rhtr>SzS>E@p2fX*x=x2|9m2uSTHpWu z5(&-(7RI%p$(JA4xw*MOK}xACi-}lPJ*;gYLx7lB^xiNqbPmM=xh% z#c#}PY@HM0zhNG85~qJOjeiK z%AG~9xLA0lpsJb)UZ+#&p7@B|7jWfs_ax*_&I0ZGI6$mLMXW{7q$bNEw;|wQ8v1NYT$V%sOs-XP`!c zFEVGG`^g@MjmT-S6sXNmWTuCP9Q4z^0t2_kf&s&TTmdd<`?1pP5lwvpIthu}w}<=s z!kB~l`-?|%E1FNN=3zz+MRR22Y?0BW+GV3fpQu{=Bk$6Gyka!f5fO*!vSpP11eUVI zK+auQm;=lW?O~{qOzsF&Gpm28zf}#w(umOlWkT7=BiBvG<$QU$xBdibtqyM)UM3ZC-8mf|%JKkb zwB3tSHC>(PlS4~#1%G@M@s}pxs#R47c<7U=eB#+R|3b0fmKsnZ_+KKi+O$MPYZ4P% zArmCRj9kHXZ0o$*R(f-6+rwh1t+DFaHJ2H$E;zryq)y?qq=%%^HX=Jv@}Q= ze=)ppMFS})p@Vkd@|GaR>1 za&^U={cGjx9UZMGkB;Jk-%no0Peei? z4zKV0m#%je29!m5g`anD=ZTo z+hxYA5>5AE-@WlcfxLDsJYd^{f}d;HZ)abLdrGCzfy^GP3l1&ZYz2~5q`q2ItjLa; z32eJgPFISZVolx9V1?vo=!^(Ey?N8wVGc|krWnnvMLz#Z9Cq)f=^zFxHmU*%)J(+K zC&YWRV#On?4wLUP*&{mtKC@`J&mKJd7pkx~naUz506N%8(}$CZ*~t;V^Db^RNe>Hk zmH3O3y1~J$0-PQbzLqLk;FdiW9J~AFQTS9c7?Qg;zF{bS;AD?RsGtq>HDdIDwr_lp z)CI}`A*z)>`_CdppDPdaSL0y6$7k{Opel9~5NKKFMVN zYFc*eX-wbIRBg&XIQ40UE8bdz3Z^Yy*ELH~N>S|H%)vgQA zWS^RbEA(D26LxgRR|t}~q2~^GQa|;9j*$;vL0dg*2uj>phEGa-V3aD93|qn+52C7! zrvX?3DcDajWb7a8gs58(&RJ63_cPfW|8=S*t zeJ`hNWTgM-5ya|3?LI&MjErm^BnU;ngfRWIS^ol4@Q&BXBQ>>@N4FwE@k4@wf&;O^ zg1owZ2l(8e41iw;hlSn5X1sG}8Khdk?zgw!3=LH&D;tV;Y*zmT!Cw)ycZSB;@3WIj zNg0!nWaQ<^H#9VSNG;N!hD^MkZqDMcS!~(aHh%&qhq96qAiZ*N=EKnAf!>c#IjjV< z$!m*?_a8roA=%rvsPghyLtU?LdqIpc;1X7ACSX|L@BfWUe`j|GS5k6nWJIZ>{qBTt z$sO;r_9_JlIqgq?;e*RUb=TToY9Il$waKHQp224>D?0~%&_|vdfh2j5-(y-9@Q-_X zauQ@_AR;Z$$r~Q_&;7)F#lu}%a;Sy$X|1v^y#J!5#_C<96MC3bfIv%$0N$pV+Wlwu z7#O|iBqSt|O=g|cR8|H-6-&vQs_z&Ap=<$m*&P8|PV!(t5r&6%&d%h}TmQ^w>FSW8 zq4}Y|HNIZ%g2r`dAVDX}!GY3(mku4+LzZ8E_kr#Lm+p$%pq-nqyii^vdBbYp73Z6GGsL#*OZAWvgsva`FfPi@zf;=dwa&XYb!P%ah z%Lor|e3&@R!5sZMi``})4&#$;k9oe==zQ7wejT%Fabm1;o#`&Z+iFC;NkDmg@wB? zf|^*xW>!(nE@ENHzRqhrY~=*@7y#?aX;(Hip>zfT#4jqUe>+>971+9vD=cWC4$KHJ zrU5?ZzlDX^coA+Xsb8I)ot(gPT6pE==B5C!u$r2Or)Mv$0zjo49o3ACu2uw;J?FO$ z`haL*pf0m#_29Iwbs2(3H0PB^XKME4a z9URI`9U^Ml8~`x9vNfTgNQk@NZ6*+=)-g4v?qKX78|{dy8R#4mX|}S6xaWmn>}BKm{H=OcG!wY(ZNA@dwXntKFpgU zWm+O=shO)zAZQJqhPJkfvGG$|TS@nyuohwNT<>2dN|gj}6o z@j#&X$mr+|N%z>sMtIMUu|LrI2yow<+S{`kzD8P1_F(2Pv?}@L4T=t&!$XHFL(e$x z1E6&s0l_AOhyazu>9r6{7GSIjpG ztUbf27C&WV+;m!A-gbpUoVSF5jjbdn=c5e6%8I3%N4=4O!Jy^0u>pO3{j|6^kfXBQ zqX7&s9>Q8uj7%&n);2akh*6Z2!#aY;K)eOlSy2%WyouU_py(ioUMgGj)^0q6exs^DN;Z|`XsW=DH{$<3{Sq2iY>Kmz;J)TFJg-TLbn z*p&B=jkyk@CHE`>2?l~x$gd|rFUiHB4K_KC9x0BG85HE@b-gl&D+i`SpFaz+<@&*~UR#(zUmj+~a33kEk0lPoi_GA(%TzrsWdCQz}l zKVVpNJz{;fxb-wgCpDzJK^J zFjI$*2|nBMvN90?fv@*g;pB!4Fbxd?fuz{T$RFe5!ro^FaHjqK4LdS1Gjpfx85*kw z6>qKGOR*1-=tvp_s_dI=O8tF(Y8rhEQGp*nZV(bW!`Lyp@i9BOg_&7Zbu~%QC)mLo z8+4$D3sLeE&IBLasN@LfRBl{q_nb92Od&~c_plI$VM!bN$N6tpg(G6zG!B) z0BJQxr>9WG<7b_1Y%a$q=tDpUgDo)G8;dti1wPYnlhAKBld4-t$BgsRVP|NKjdsqx zbp7Ll4-wi(GD3Xg#(uFA1Wn^ZOmrH7Ld*O%94S6$+iXIL^l4>TN*-CwZEZ|rHU}*q zV^ya8v$B@o;f&bYd_Vz|Yw6;AYueb~=2Y`zJ4(y%suZvWI$R$QSkqzuwh{rM#~E6I z>^Jbg0hh_I+wU#wy(EE=)>hhcY6@qg>P4`)%p-zbC%i%lXt>M9WQe7N1gfQw2WOn~ z!uO!r*;NEcnix3dj*dOkjo`-ovtV@K!!gJV!e~Ro{%K7CbMEj^O%o|of3#)aG=AGs z6tYMVlhcDKkiZ`7QWK?HKik#m-v?QTyN5^i3NUg~Q_&Dargc=55`jkAWp~L|C>SDT zWYcyOvEQ$Fo2I9m6y{iD78aI#GW%R;BgafNx9yL-++P#U<0K)`w!~C@34t5rWM1s0 z2J66XMrpBcrlqT6`wEPZH1FTMNgl<;P0_slCVOEvzB*z)7o@%t2s4}Xb!_xgySr24o=T(@|kVH{?2L**it*P{pRp4yL zCfn9rW1TOb7?6a@4B&t+G~gH{p}ke7g7#? z4&g-4IJw+<8XNZ$0*_s{5|x>$g4e@9mbA3Kj)s7nbz7vy2eIo&)5VF03Ir}@{V)aF z*(RF~nDwG*q2R~Hs(;q=GB-!Ne_t23BT@Gq>{^UpZo; z$>`{mH#TA+p*IAhWcW~hwX@E;d$4*Xqm+M)jgeEiQ|^PzNMF9K_xEqx(PA&P_(F8B z*P0}8IZZ9SiphW>Z_gFY*teoWl!_I3RQsy2Btl%T19G6`QDw6{M6mu^*6AtX_7d8E7?m)qRhdIH23z8|ek{}5A(wf1l+3lvaOQ?sy`2 z;eHC}c6wI<5^-6rp$1BZ~S5 zm+LWvbX+;KafloQMMcp3)RDd3`?YC!sC&wEJ<|(Ow3RA#;-(oH>--` zVq;N!tEzPG-Mat@ps`&i)zV4?%+eZ05E6HH%90121d@_U$kr}ij#elF&Vs;_QP3e1 z77#f3X_xzV`8o|TADs*}&zrL|)N!vbz!>iBr3G(RbvE_H+jf(B8X9;=qV#129M9a@ z%FNxpy~bZ&-auAX4T1LP1zSZ?v3ljHj#6(N*SbnY@PD}gq6j4Bv2bu;c!4cBf8eW` zrYBGkl(t9Eb)XW<%f&;8&$GF&EQqg&5ag;P4^K*b5ATNjJV*msg~Kj-vOGArQr~*6 z(u}RvVcwj|Twt7!!K9)2QVij|GJOW$6ZL$Lt$3Wl^d@f*Ue^Do(+5Bpe^Y`1j`c?TTs0*`l;h+rZFeN{J z3MiU>@g(TJxsaEy_hjh3mU@qqlE!s@g5?RlMBq#30}RB`F*iLuLC~!AtvUE#8K^?; z2!g139MXYTzQk32jJ0JVif?$hlb+sQV2uE4jJSC>8&dje(H~qT(R{PAa#K^e+}r)I zNVwyLI)Qzm`SA=5;pUM9!Uc2fkNthyL3$#3MJ9m^Edw1L&RQu~SMW@n&X1 zA^Ruw={!?2J`%nS#l^yz5g{J9CMLG$(bO}|m!ddeV{`{GFbq4{sHcV4B22`^#fS4J zCGw#7QA%nmliN+2dzTwi9w;*R`VBPtzyL~1TRTEEyYWwf6ApS79AKtOoy)sWd{x^V z6H1PDKF6=y38ni-O-t)%L&{Gd<#2HZ_ON|@GebjAS<_#7jh8zir4IA@<@O~N667XIKAd32AZ-fAd z+Lm))k9GbrrABM9pUp=&KDq_w%w%Z_BrG_>!=p41piue{=M=WY^zc(NhXIQL6|4uzKQoz#xf_KSQO; z2W}+ja5J>F)(v;MVwC)Ysl$vFUhUw)Hi z`A2ErUGl0kX_bId{`UFq-rnBvuC(_3Y~ae_FAf|j&TfAJb!K;0SJ2%*P?gc%X-d28 zv^1Qp#!hbbh9!C|OU2~bGg>-tZ3g0(wGE(GoUU{7Q)X`RFYv)s>BYeO-^|MR(*LJUD>-nLqRNkWf?s zlT2Xqg>-Q8@}3?qw?W+ovN1SM19iA5Dh$>k0YWobNEQ<9R8$P_g#$i>ix&cs7-M5& zua367H8qJ;dTd0N5B}W&+sY4uY-Sf{wJ<9*<>#Xeh1Tx#XQe-H^OMf$}bsDoA-ZkgR=&Xc#ycQuHLAzlLWcm7O%h8eXU5W zNQfHcxy#G@>6w8M%@w`Y^Z47JKgp2H1@6#5sC`*`4n$5! zXE-<{0s!pQ>q`1@yxfsh{SxDu@zw~RF$#HuHe;m^m`Qma*C~Ic zjO=2*b`4gKBy|e^)pyU&9~Z*}><-)MhQrO~w$xN5+uxOR+E$j9o)^czfvy0(Hl(B3 zPRN~~EAc!eze*Sa>8~l&>cPQiM`5L<6W|et3`#jJU1wrq0?9K0_3iSC3ZDzNG-YPc z>_+G{0E8UT`xm^*p<$Jm%ef=wSpu|MV(f=TMquPKy^nq~rVBtWnAAx7T=Yh>q=6LK z#0SRrC7(Z|`?9D}s5--pA`G7ooDxc3&Ur!=$QpD1;lpyLzoJl}ioGZ# z5}lKi{3GG({I+F%+uW9pmtw3QCySuqv;DPAIeDTRR8-MjuV}ykz8tq>)I&f0v9dzP z)`a~bI!5h4+GPwhX&_JoH;fEkzZu`>_%H$va>yWm=YaZxd49Eh@xymY=DqS-T#!!77FJ*b#>-&$ANImFF(J#JFW-o_vUB# z@-{O~K7GlW*SP~3V!D8E4{BLe<-j^;9+)W)WH+I@f5^$Pf=UNO7tZTr=FguivBqGa z$^y|Gyii$r1nmB!VYLJJ<2!12>k5eM#b2)shEZRKCa7%530SWqIU4)|_&3Y4M za1|hpe0Y_bi>m+trtEv)pnn7}d~g>z3*i;o@$pMDK9|-TlZLP;lSJ+N z?|8mIP~W5jPXqz$6v5~B=z|^M6T?C{f0A2kJTf-+0*Q~jJO}{jwAf=|oPBikZg+Vg z{Kouqh`_v&1vRYC<=k*K*S~d|dmqHW^EcgOyhEJ#@wXy52+Yh!9PI&tOa*N(CW7^m^sg)ZS*( z1T9!XSq_!o5X{NT%L7yv(sc(1M|5+&Dd>Gf`S_4Ndd8^P+1aSry`%P^8OV2MWMtf& z48kU)tGAo_2Hs)dnNn;}w!YMN2ed0J0!4CF?jEN=78ic{b`y?&J-t}Sbb~yqD5hqV zmVFxcyd@1U=U#bxU;W6q3M39xVl-ppjY}czrjVKXFZf!D zfM6O3;=|yl0wq)00AxPa`&_mzbdjY=s(qct{@O-wH(pNWyVFUp1h+d%dRf`i#qP!G z>SDw%Q8crk>69A-gO-{)#)s{q?LQTYX1kC1o4Ai3QNWjyEKOR|YqYM-$Yg(iAB++S zu4F$sg@uoF`j>aXRTD3L@$a3oqN2w-)4zYme>i)@5IL-e2Y-Nt7*%`9=N>9cGD=CI zAc#<|=H}=2Ci3l@Ge3XC@mT`qow&H4P~v0yT91D9 zACi6Ca3qR=wW;;s6MD&DSxLwwvJcvTDIUn)(GW0g5BN#Vq!IQ0{WC?y_)n#onF4$- z8LxP5kk4wK=&}$=u(dyZ_LZB*!5KCJ%B)8lFC8z!C=AZe9|;|T%_&p% zwv^9BbXl1&qMT=|gn28W$7FARZ%?@?hddJFSF$kmT}B5V>4d(e*G_=PU1u061^ya% z&npMw;e`yU1BaUPAX`{S2vq6U5Lo$=E4tH`Z-8PRF60V7lccE4GlCF z@~eC8-4yc-ou`yEKR*s2A1CMqv=9oUNFSo;$jR;5C=wqbN#dWGJzddm$!#m}9GO&~r=_1AM&q06a~k4?eGL9Pr z()4{;B!AY{k~7?O3=NAi<B}=b8Qb1O4ll2g+>vZGeH287z&d^yDyM@9 z+pA2cTk9?m3v|sFi0=~Xe@H_*Kr{_9W^{y;Gyl_i5@5-QugqY1l~beJuE?)XfIL!< z_cU-p`;IX1mi%2c z?;)j?uNz!=Y1DX$u~SlvKJ~W5#H5{`groWH?V%hro0fg4tbEk{L7aPC1R)Ok4f4Y{ zgH`D9zkgRk_?~^6{PE*8&UThk8FGSb_3&bq9yB*!Pz6(@78VJm^kE_x7>^;32t4Xd z-TXd&oQ45Vkcz8{O5S=(NkKuHh^@#~tdp(|WOo8*{WciP*Q5jgMh$%0si{*+r&cyM z;e^LSO5OKQqN7pbA3?R48yzi$z=jN(A<4^Ig(%J+KdU;D?X$2eqJ6+HR0%Ptw7hn5 z-OvPuz35SGbxzJboyF~WF(i@iDW-Gv^3oDGMUo<4ye08H21kDiLt0g4AK4u%gbD#` zJnGX%NYZ)y=P-cnd(cREju22iPqE5Au)-X;^XsVaNlJUE&>4W}bihcwId`L^y`%2;dFhH=c=$ zyMYQC9pNToec#m71cO@C7HGKiA3yfvQ8Jo@U-FhE!8i~|$xOiird!%JPJ0dRvseHJ zT5I7ILca*Y$1K{h;o-%O5SJ!t?{>I4F6oc#KaH~gCPXYPKl^<4Z6yWAdoYDjRO+;X zD1-+O;-gqeiNcnhdkB#xWtcAdH>;$YcfN*CW1& z&pI(TcQ3pTvwOo1#5oKOMTPT#XymphA&{AUwVPDt0UiMakDPSp;Q$nnN8`_LB7Axs z@A00GkB_Sse(3Gf;Nj^*N&oce&wY0G7Y)Jq=a}f|>U%po0RMUZBm+%gP+c9sHW`#z z8%AY+un=rQ!gl`=0lvW}RaRZp^xN^oxK9*I6;l!eTy_Bc}AkOkV!nup&pBy)MnC$iVj)s(+W*r?xd zbA#kvioa{g9p9$CI_{wm24oF|Dn-z-{0xK%Fo-Wu(!YEuY;2U*={FM?YE%Y#wrYj# zvu9zC<0Rv{w@&hq=#S_UnzwaTp+u5sObx8rA_3xm!h>1b-J?Tp!f}@uiR84!}PK%s;3o9stVcNvNHUj#^-(&cta$p)rCMv3g1O~Z14_DCCblJ1a{q>8KaCz}2NG@Yy zW6#dq^35chT%#}%Sy}I~V4>tFAmasf^~@7RbW&4M0f@M`tiJ~{o$t`SmOQR+@IJo| z{KKzwd*8nK!{h@&Dv6#kU?L#>u3T^7lVUFr%eEuT6$g1$LGoQgwet;aEC+E62frvCQgs# zO>A^Ip*I2J+N-Zm;H(Be{dR}~h1Nm2J5MjazJ8+eg(DH|$^G(PT^-|3xyy*m)#f-r4Pk_*&X^71aCFyO zMMs!sQb~PZgsh#-se0$X4~{;F3&JCXdKVP^eaqHb z*+99I_p%5k%gEs5?jV<_uqH*8l0mxlaVrY;UYMa!>ji&X|iIy1O7({oFuyWBX z^Pf(h5P|LgDfhXFxzEndtCd+zFcEBUoogPZ1#76Sm6ez3K}$Irf1wHZvo4`3fO8{M zs=ZJvFBbA8&COZ5*qDg1P0N%O-hZ_~^BWTV95A)D^7onE{Y4BcO&)f3U?;`#v53(W zH>df1iSO+Ni*7a(YpBwEcx+`l7{98xzAUTVN|PSXiyM5ejQz1@K2x- z+9j`}<>2fFnhH=6ySiD3w}1h#^7d}73m}m5+ndfG$_#psj>r)(Lu zn72-keYM3;ESlJ${%byW*05YD2@6Y`7&BmM1=Qhzl@%u9>gJ}5e#4YMHr@hF#$*J5{0`BerWQMxn`|I(kBdLFU*cu~;bKcJG;QoDa z_@BUy0)QE~YVssZD{EF?zTmG^1A{Fg!NXw89Mca72>jHKn^TM!9xPyiLGVL%7Lu4Q zsvl|LazmBn<*~0G#3}el*T5pGsnLHW0J(m}#dZkp1OJe=Hz7Ti2ypM4+;+i9HvmWq zHq0LHfP~cB>xo#tco9EmV7wC#JQ?t`5e=}ElzjY&rl`aoXaTVa3828g*y#xastX@@ z$^t*t(~}iZUX8I7LSxE8u}+d<7_{_XUBw}-RRL8zsi96@Y-p%DkSK6E<(Ns8nNeXj z31g+FQty=I+w^oDeHjfw+pehzF%vZ5%FN!QUif&=o-sX}N14jeB4^V`K3W;_8n+SO zvXX}+oQ8GH670J!o2)A<2A0-p%cAKzdGnp8lXXrQT*{=l@1Z?eLE;j8k{)XBblksR z^yQKB6MC|V@SGgr#!);#%TH&BI7)l_Haf#jvQ37aTtu`6LEbZhaS*7JZw=MVZ65(4 z$lP23s)JRzj7S-V*Urvhp*u0|rot1fkC#D@>6gjaF*DQI-;Wv41_c8x?Tf{}{~#vx ztv*aG(FqCir}tc3h*Vw9GXOKC43z@USq`JxSI1gr!op5tStlJKKY%T;@q7P{%!rJf z6EGHD*OtF@D5GaJ#Qa)qYlMr})7?`65(kKNT3r%>njbE+wy`ng2euankV=e-jDNX@ z%q}i|NPZ}0$piUX%w^F?sv{uX=L`DK_}t2NV~y$35uazyw`sRCz1gvKzKN00)7Qh5 zqqBdV8~a8ut6;^^%-X$8NY$*dIgaj}2XK{*CHqk$73@B78j*yaxYAtE5G()lIeH1P zqZ#s5KL-c*ie=N$QBi`^sIDhaUB50)Zm6M=x?oSPa7*N%D~hRHvK6ct3XS`}e}DP) z-S$A*b2_oD-8inpTuu7Fe*|Dg8moGrO1K-Rrv$j$s51KckTzZqLPlXrQCR4hR9>F0 zl+@JX;^PAK7>$MbJRkqg*9kiF>bo8 z+)LVF>R@PCmz9O}p0V+B(A~_iFem%XSzbdC7M5$SjO8)?lKO2)t*n58<2`?q9pjD6(V1IaX6Cg16EA*p4GRmLUt?OFQrA&`w;p*)MTnA8 zyzQLd-{(huY|Qw$US90WzF7Nf6s2Fnt*-HciFkzw!^;Z|NS=dQ;OOh{vQ$(^h&ZGJ zh#o;f;N0}@>u+LVQBkx&L}u+PKI|=YtUDbYlIxq7$Z29e=g;2Wh4YElw|5y={t_wQ z@b8?D?9OOxBy+IC{`c=6G{g~fk{9z4^8$UJp%yRud(Y5twWRqLpmb+rW%6@#nov;k zxmPlUSpdt-+=4Zg^vC3+&9A~$USl(;;`@h&1jWXD_AJ?$nB?K$15*cCo@5Skj6C({ zuU?tOo|ZH=`rX@X{j_Pex~dXD$Q-k%RY61eTni;WC@4H7>;XQoJdk$d z2oFVu#QIKX+uWnasm;err!(HCPK({wAv@}De;))ELr}bqj*9YUJgphO@V@u-X;O6b z#bm8KW*rquryOHcWUYgRMR;y5ThLuQdwUEmjFr5C0+*Mi5LJyKlhKYv>CMT>schH_ z>P-v`aU}AC5prP@M+ti|?YHJR_p>IJcSdh`OybI)0gh4>yroc|C zmRVn45g?EX3b+An6hROFtz$<0IX>0Ary3m3gLQ?&XJzeb+wB7vi{vs4!HekR;?hM) zuc~^ch0zgsvsO?u>Ca^sTZM+YWqCZ9a0$bxSf|$KZ8}s*@D4v=LsI2X9oK7>-srWs1o!0a|kj9kDAWk2h zoV5GkLQn1z%SPd$qS8fV_vw>gs=EWg36Hhi7IY z%tA6U0zRZF5#7#)g0*;qdatbru%3i*8+ZtXX?U>{2i;}VJ_x~^d8SF+rbhShgfp;QC9uPnS`wmn#ke&|C{hXMfrn}f$9~ac&x@Tl$eSRVgg0Y|= zj-jD#kAwBQi$K_USo`m&_CAT?j%(>tFtZZ+J^Q>ensgt{0v||; zLdo0hL4sfq%V$4L0~62u{Nz7>NP*_`9P{8$pUED|EYe<12SOS`g(jcBJI#7A;B{TDYYo!BI2GJeb+@ z^Yiz2cZY|l-FDy0-gyR{H2^0V=;)t6H^if|b7*&lQG2XL-?OlAmXqrq%4*I4N@cFi zba9FyxxVUDTeNKNCh?<&y6cZbJZhn*ND~C=M zHoC;Gl=b`cnCf}}IwYO}`X_$-w&{5x3s_}8d^k4F#Y!4f-lb{mm2hb8Ykq8niW0HZ zn_m3Vv#F)O|1`|A$Qpu#M;0eP+}lfPNWIKxIq{YLq!s$42PEvz5cy$?$b3G zwC8hHefsnw5n+{=WhTApaG9x4At$#~@R^;+-3qR3Cc~RLYV4dkW;4yf-AbJ;5l4X$ zu4oq(-0xf^P>|r@VZ}lon!R8J))?(z3IYNrARQYS{S~d=?cvQp-ol6*I&a+7GZKJR z{PQpnGl5mxVmILGLgNAe3wSs+H8wIyNbC$qYub+M$gswYmOQy5P;btxA>;hRAh6@l zw{HisntMLv_VaH(XTPtE{qpf6U0&Kn&}o;n|6IQlV-$8e2k9I@Q@wpyWf7+dH|OLQ z78ilh3=!nODXa&!|Iv}_kmWaJV?PO_IrB-HW|yj58OqnRK=x;0F-Hc$?`MBMD!B6| z9z_T(=}wTJ-`|8Mb|5Ugtyn}L|3c}$UMw)Wf$#Cw&ktyHYHn^FRn|4&Yy)mopK@}f zY=4{G&B@3hgpeTc1t}^i8NkLok_A$BKm#ST(O^gm&Ca*bZ79TQJ&$c1960LClM+|d zII@*OYocU>I<}s6bi$U9Nw}Br>k!pfi{0|YDxH;!DIaBB-R&{jxYiX61V}Z)!q)(Q z*#7=ZFFIERK(YWcqf3Fh`fSLgx3sgv8l?G_PtIabwf7hNeHdEbef)TZ18r%-cnOk` z!LIh`r~VUO zt3trB>x&n8kUIvX@Vj>($+X<13iFR61-?h7Ahuzg=}pq0JGbjllm!xu8`h6|=ePY2 zNiNvleU-~l7RjM}*q@)TN_tZpBp>4y2}Ok;4mYOgC@FnYy*W5|kIrP7XF>?Suh`sCKzS#avZyIwp#QNKA+ z)7IHZ%@qO6qMI!YM)YA8W+v&Pkn#Q=Pu|^q1=ytE`~-Hq@(4&zsafVK1Miah))|C? zqUr0a=1n3mug0M)TEL3ADK3q5blgv!$1cvLVSo$(#wpkc-|e4;@b^`DQT)$(EDMd+ z=H|4-vzNElH>5kBcL#@JprXWd`Rf}K4xbZ;T)TG7|JsK+#J9t==iB1K?s3Ty-F{JR zl`LkzsRL%WF$#nPK2=kz@k6skA9j=Yn4X)9g}A%dK^tpuVXKwi@8U9IUOzg_=v8$b zc(th`zxuGYWa{Ku|FSvS9hiZ@&nbvgaINh?#UQ6t?FbX9adOg7Ruhzf#utcth)GxU zKnq{5X*v}wcKp2RzVGIpur1$xL?(lFlSfxjGOoFl%@eK`ql=li) zx!O?~g%WaY#XjUEv3i*x+O?^bVQ5h-K2O7^A&d<6VE+Z9yy>Z_TTD#bZNIO1vqNYa zWNFV2W}u1MO~U*Y8+!{40b5>jjhyQ0j~%AXF$i8jTbAXZUlTD6VSwFyTwIm?JV)q* z4_R6Ne&p$vP7*=6UP8}InvV|J5oOBf;Fr9y@y%q9g-!Z+e{`M{g`)f?=**yk^f?_m zCxcG^^~;xlp1?1@_i#zMZV7^83@FmZ#>5uL7Ut%5KDs?_ncKR!=vPr0 z`hJZN?^eRZw6TTRf|z9o(7y0OP$(opgoC7i{+xc53xkf@3OEb0viI@A`_`|E*glK< z`lEy+1$%qyX87#H*l@;3>CJX54>+1jKX7xa%g7KO&bmT+t*!D!genQFSpA@&Unr=o zq*17#T3QA26cZC3GC4K%=n>|Z)at4#m{{R!6Jevj4Z4=!$ok@=Rwc%;)QJPAuEeyUeRN2mKIcmhA_9N=>5GL)YL|I?wq1wk+-#N z!uaX-?cZuRw2A7@^72d%e1Fai*jiemBeu4EvRSvh4fgg1cXy0EFV6|}^{*H1;Ue(Y z19b8sHH)f`QehFq5%5Zt^jMmzkAS!WMiLVac6PBl6H5!syT|m2&-eud?y88x6~@Wg zO@RLapd}hwTF{57<{qYRIf4TVlO>cWcx8Qn0svPJ&3z}F(nf?jkA)d(RZA>7)h3aK zSh4_6z)$S#g;?A z=DwHX&uQtn^zG1Be6|@eP9KZW+|&D!by=!!PbBft_tOWMyV%C zTHnQUG|sTA9Wgn17C`T8{yZ11(~O&1?6^SKLV)PJTl}IU@GdH;x3FjpzEv3vtmftg z4-Wnn*vHZYb(oqZ19LaqR2wcnmix7xf#Qa z5I|6OSe!l-su)oXDRUk>%r^xEJEo`a$;w6fAsJn1p=i)gMSkT!ou_gG5Mq#jchvwp_;N zsw#j8o+cW@b+CB4dAL4VYkzjcGA4m+V!hAFX#gWS8@Ls55Xu{?V-pjE4+HKpj#y&u z?_)gLm`!O0hIVoB@q0Xda{`-e22j_#pCEu|DW}FkDFKbBy&xvsBsgT>P~ed$b@8Ks zoe&7R&{{w-q216ygblVImoZ8vOB~uNB1i4Lg99Y;6!I>zzfxc7 z1Nk#Wl(*6Qe6!w#K7H#ShzfNurI6W8dVGXECJP;Yl!gXU#A%;%IM_QVT3(p8-(DU;#NK5-Wf9<89xwruG_%Fcq!x(pCf@^`0@IdFr zhX32(;PQwFHr1XxpKm_b)%9?9XRUtMvnb^jjUa&T(Tnt-r^`4}n!jj?har6Pa7EM8 zw9%m@t}JV3GTDo$5bJ5wi>HK3!)f&x)cWRwp~6!P=0Mn?K9EHBE^>*_dh6@Lx! zf3e4fEt{)oW%U3STDlPE?}VN|PiblrARkhPpPCbCnZu-~P3cp)=iOv8o?ujMLqs4c zwL-haB=v{sf_GLr=5=J3nYDEf&^^9&D#7@ZM^Mn{l?ae_Vq>q57QZKmYyI8Vhk;mG zQQ1#7_zfGIJhim^V%ouod~sa1d-V$Upox5>y3Z#c@?n*pdT;4}t_GXOZVW0z2 zHzFi~H{kw*CZYH6VMDT05fn<$@a2#T0s;i;S6UJhVM}XVTwHcGcb(x~VD5jv9Z*+W z+y7DWn#}9f;hE!Ov{!gwdjZs)TgIL@7^wox}zySh6G#}MFE*3`ETA#L5BqLf|Wg#6vg}Z`@*PeVA?Sw$Y0#h@HREo z+-hy)|B&|9QB|$c`|kqj5JaU*(x9YEKt(`O0qF)Qkq)Ip1f;t`q(!KE=+mS87J*Nd8$B>S zew*wVi?!1OAH19}l|^=gDVz#*31;iwKj3|kidO6Bh6_49cxjyn?&}*H3aKKP2vn0& z-l1Zd_XPwe5N>cnN{6HXLmECk56|nJZSN;{MBUG1>6~u{wgSip>=l(|l&`@|`5fKf z;P!OQ?N_?G?74tpgFLhH_E04xBiRl%2x?(}u^26)D~{rb%>55H1$iDTF{J^<#1pR}5gdcA#F^w}6~ zF;cYzR<5%0&khZ0vV}z@5FSPU@q;Z9%$aDOz>7D^p>=L~`uMT_@YiPuAx$bN2?;xP z$xCf*yGwU|&v%1aw?BT|UiYcJ_UJy@nt=MBH|D#WuLnNgcCasV+B|u`J+lb}FVHja^6`N+64d#N?V;C@_wNM&LL z#puF!-nkkYDnX@>Xw^GwYiepT5J5u_AHQd9Fgr{N7!cJTK0I)D7hzVQMkkz{oCFF@ zS=qOWimhrp(ONrZOMmKmR{5kOs(bDbW)euUhJ=NOJHQr)>LtcP+}+(>TU||;-Qnb& znR&ds*yyp_`jNe1tbc4QCp{gQ)6sEp6$Y(!J3C|g3(FqXFtE3F{-XE&C++s@;N(m1zla> zcHdw_G`({xeM_eOp(h#Bhb~gQde*7jEp6^Nppd# z-+lKMIzGM}0!GH>-sD-jmqQ=04Lglo9UX5V`~vtpMTQ)tss&n+k&##Jb_rc`b3p_; zhm{o-*uGDS)ga9iKn!=Iz1=3t?&<3v8W?QR2pKD+lP&JP16z%OfuPNosJ?zb%fFn;LhdrIS*k*StW%_wi>ebPJIo zW#zlm(>wD9R)^>q^1|^ZJ_@>}_1OV)%PT2N>VFR41rmr`GIT=i6gxp;r&EqS4S+SGw`Jo4b z3%ft{mH6xKD`n-jAZ(2?Q;>4{fqM}uVlewz^TTVx*sCvvF;eOic(3SpWM|l zNj~Yu&AnTm0!~{$A5Ra$29hn8NOQx+?(`oGU=3m3K4zf;Q;O&ZtKL4@XqcFW!4;<5 z>7PG)Lgyd!?oPmk^YXfr+UIh{FR!H3J~}GOxV+ZLD~N=}GRG$*Kylj(k7g*yvIiq0 zl@b!98!p{zL;Kz|*Ml~ERM!e1R&$v$v0!uraSmXQR8$B$J=>FZiVvZg!R8&mO*TLsq2@N>T_$lB(9RI~fNV%9gM*dB6?uFpN9kns?Rv4Jw z$9p8enSkjY1U;CWPXv-w4`zo3getT(5EiSs9$JdOf8TkuYY5~BC{&@F1=}c8456d^ zPFpIVAi{p=B?hl++LwY4!;Pl-A0Y1m^)Lfbe2adm+BcXm=Bcs+S5w~_3{#YKc#3!H-iL;?dHLAw=(z*Zc* zeN`nTX2KoV3rkD6czBXq7oclEyZz+;D;wA`Lur^PMOTb}?x*Mi6eS*baX;OeN_B+^;ha(!3eKw^mmCma3{Y<{)4mpR zgg6rnpNGn=K;eLsrQw>#nN8}Fs+ZWWnHif+jWInYwk|2w9v;aEX@Ny$R65f!Of+*@E)n4x`V zYexa%F$P1>2T|~>mxrJ6&02K#_QHM zt31lf*1)p)*;R@=gjiqF4UxIhK4Pc{uRkLu6L=S*!-A0ya&$1z!u;)HCM6daqu636Zlz0UqJ!r z5Q50p)!`z4{px&q@xmfnGSq+pO_;hdE$v1R_r1IK)Is(C(Bch<1;PH&I&k;C2Fy6W zWInW8IfH{eHq5^Nd82n5B_156CM5`Vh_7$HW?*7UOe8QMFSVSG1+VG$QGz5^07F4Z ziL@e?*fr$UE6jTfF)=FRGX{^DCS#(aq=y%5-|z1BG07$PW=<992Y&GES%Cm+bObzS zt&6+G4yhu+mPk=fUBZUiJC z#`M&;h+(audIEvNak=Zji$;Ao14#v&yA^?uU^%g z_TL}xdu04`$mQ_+L%CwWizvThE#`(C*07{AgUJdi#Co;&5kTzHL~WPQKJJv0p2zAw zfqNt4q;qu-LQ5}cTvo|wUiI_r*i|wn8kKft9a2Aeg3oYkjZm!S)2)}{VxQ2TS%ikt zefGwu_~Pkrfbv*y;HH>4)}4&75Br<Uo8M9 z7;dTuSD^z7`IAAftgNm3V9R-yH(V}s?ZDYhzIP4Al2yzXOObYP9N=0pNp*Ynu{J|& zCUUIyunCe065Y_>KT8koqoQC1!4-MC1uyhkgDC|%wS&Nzn_GrdT!-@ai}NZD-8FG2g|Y*l4+Hcqs18sJrd{ z?*Q;BToZftj4@6Wf$eLBw$B8Q}uG44qVYL zh~C*z!16Mm_JY-9#q?`$=cAn)2q}kNP zZbbuHclO>BvG>P4fC2~7B3)9r4drZ^S>7ooYSYPqZf&<1;RnTB$S)N2_KBRPQ7@W% z7MPigi{jH)oJEyMCsGeKXgLZa>iY@RoXbVZkL9*pv z*D~m6X_c7v2X1ki7>5YhEI1miz7K@2EIQ$dQskdVg^_Db;OEiUF4lZf$On4`P19wv zlS;&-u{>PfmA}gmwt~ZH{Rh3s)a}&j;X}8aP)b4j_N8BzPSC}NyypCB9MXD-O9YTWkOgNvbVgzm5*`QJFNptx zv3v)+ZR}&VSUAY9_I5z#yE!Al4J_E!<8-Vr5UXvWia;AmKJt7#jOoF>hFQ6g#VSbR zA`Oz03x<<38VY1D0YuE*-93L+Ie(PGUXb;%PWm%$yNyyHSellB&lxtDOhrr#j34do zyYDVQ`Ug+6p{QZ=a;<_YoAf#`SSqBZ^!NAc=vZ9$16{#ydknwDr!`wybsB{#Z`4?_ zQd4y|F#8h|jQF>JUUD;l0mqk;J@5@fBN4-gjEsyJQXjxPyU}e^SRjw({ma}zBE32OjuzW!CXoKf z0crp17aYX&%QafQKehEnGOLyR(n{iBywfgUFr z{IFT2DX-?fb8@rZ+@7yNv3Mch2R}bZ^FjyQ00yt_zGJO6n<^>Z2^_N0UM#Gx0-uJ8 zh-iItb9u4FY^|WB7dAC=JdjS_ASYiJ##7Us^<3mnmdC}%&y=W`+{DMn&$ss>{dj!3 zmqXq28~~ac`DxCQ2AuKoPTBnO0Ew>GSzYVAjy3o4L57YMv{1RpduC?~-7bWrScn6q zGb=Rm`L}lVjZRNbmsfQYc{Yw4+y+Mqb!D8Bu6RUep&}YizkiA3tGp?nh>~88e()X+ zLsqje#}?_aCaGqrt9m3eZinaa!g~;;eSX+zMH>7O&|mB86Bp;FAN~Ax-=XxRoH}+=!kdXJxF0jZzHGKPkR+EluCZ~6K9 zLaKMUPw#xiHeGPcz7IoQMB6xOSG)wTF!i1+C7VmAcA07GQ2GL z?DBC7;25%vcpH~KV~YjOD>ZvlOZroH$0XBoLAFsoe*S+T8-`#5&iJ~V9RF5>gWuuA zgiUshyFgOSRW?t1p{%aHJU<^E6Z3uf#P@ zBjZv=K|xN)s%BsqgZ*W>sl3yOF0bsxT^J2I*7{KLK)DYJg6>~+E{8MmT-gfACr4h_ zTrw5SpuJ;erVjJ~0|VjMjnzfFc72Jf(1rEi_T-`M>GHU8Or;w6w)~WL?%ZK>AZWMA zRR#!eeZ89o-!NRV`_US-gz(dL{4=?^({648Am%n=_tGbQk1{1%ozGai`}M1Nylk@` z$HJl^9k>ioQTZuTjk9Sa(jg!HK{Sj@t~BqE+%z^8H#bL1+?`GzBLeAgMx4cJ)WRvE z0(1cUg+0xh9~BjK{Lkc~j7-nCL2=HodF}L;NG>ElWGYewV*qmJ<;xy}_u>*CnHhe( zfAD%glur#;KuYVh*h?4ddr^_!W*aI_;v@{kDj(sk?-iY2W zNZGS(dsD7)8^;%VBfWZ=1J20z$w|LI3IN)C@!}Ue|8zXghi}k-{3O2c_b(2H&rH6i zt&|j&UyE6$Dj#s+lT&D|SL?pF`z`7?0RK}XUnMu{_U%{X!MqF%{A_F>ehptFDGx2t z$OjTBON>^dPEs6cY*ZA`@pDx2-ttmJb}}TJzq}*UbA^M(@U*GcS~v9@xrW?F z(qM`8f3})1k&%{Y+o`H**lIIHdu%aY!pg}>=6REJEUz@-j+s}vL939_IjlYB`g!*< zo5UVV$TIj?%Po;NY|cSCX(|c3wZIs_3P?_CV?d%Ok)FF*SjEgjywUQDH2GX-wO4E_ z0I;~!ZuU4=#;r<5k$ZNU6S(7tGocG_a5KHt zdu*-96W;g{O!@)TH-DGRmQszV9Z!nJ9FxcfVmgetm|a47Rm@EK^mxMN8HKUwv9QO{6&?)!`1kG(Z?`<{W;`yAu%G_c;Os|P3 zD-Jd!byTPjm1SBi;ALkkQu}sYXTir5d*I2Zmff_Na&g7f$UQ#9=ykC9$o*f>H!9o( zlY0${6}5jR^u)m3o2PoIQ@N!?T}Wo=H87x9tcLPg$o{uqubroZCIbR%WYbYyF&y!RBoJ)kSJQF%8eg1P=>m-_Q#ti-=xM6dU^KIGYK)_nFi- ztNnRs=00pWG0-x&w(k;goKmyzST@eq*W%JeSQ0<0bh7!Ij2fe+Zdp*jIF40UdBA;Z z5_6{Hi}@nanvU72c!)&$G=UEQe0D{DKJ8zlpMYeHW|;8_nEs-F1;yM9uRiS&gNc;Zv=b{Y-r?_U6J*4_OA*r$KS8^ODIHf4tkA$&8#1Mtm+!1JDf zS~w}vu12@xJ((>}=hd9{nu=}lp@6F|h|2&);A;*wB_+)+f z%YZyAYrGW@V79ZBA29W@vAN^w9@%oou=q=*m9EfxTP~8eM-0$4qr2)^yTHR5e~PL!NU3q;fK2ovnYOIv|D@-(ZfBVUF$wuzTrg8p3tI?i+1}z zyZhmc%i!`qMap&u!KafqD>dGl^rZ;8{JRx+n}~RYosb*lZhE@Q#ra{iagV$WrX;wliV$Kk^9F$Okq`2PCmQzj*)qm+tvVrYIsBKtMF0A0o|Y z&rhk%+WkncauTI!&78`s>ZUhkodvIps*Ei`m`V$d@A~X8=?zc;NskKINS09)t3^cG zWqtj`9{a$+;LE_E%fWW)OmnTnHs5u>#kSy*y;b%AaU!2)7#0BIXS>18YBiE7z6`E`(r>V(#jqo+85`S1oAo+;|7DmNO;4^C!T-G$;2*+6pYsj> zkAH{%`{OCTq8_w-{?GqPZ61b-`#%fle}8uOh0iUu|JNTP^!FqG|9AshbmIU0ng4l( zg*1$NMgQ;DCnVsJ^78#}f&M>#_Fc|n9G3s{L;U~zXcDTp))bV?_JUN%{N`qlUKLK( zD8<*jyxcpW9^)xLy>_c8J+3DPxV{j13Ysf+c1P7fA5&)DM7g`S;(Lt!S|FUquO+}A z>u_hsl($5RK_zb(j;i6|H|zz^y|B%AHK8jHfPDBfK|u&oJ3TYRpmZN*%qe&7G*ez* zMe*0?PJj`ZPN9OVtZ6sJrlSi4o(4NUNWaQ6a0A-iv=EvTG}NM`8NuZ@!b;Xs6yl%% z;_k9-b&oMFF7D#)S?3T)omhz>|Md5GsiY*4ByG*7k`mj%R>;@9O-gD#+Cd%+FyR=9 z+VXDS#dm6IYEn`~Txd3;O*UW>xf|UDN$0#h*@X?pYwmkV_FZIX}TK zFF(VimoPLOT2f4>1JU~dEZR`*U1WSn^0+|LJq5eIvLNvECe!$eky@X8VH|8eC_Wm7(26P-~@;17kWB5L?8SOxO z3^X61NA-oJZa~U8{qEbHOo#nHU%;e&F?!6n#XVNm=~9!+b{dc0e+O$EQX6-^@4*sW zN)=AIEH-S%LIpEs2$c)8&b{@iw6jF?I&wYS>W3^W2fZnGi}Xv!ZEfWh5_uU}SZunY zYyycNL1nVAxCpv&O=t1!L5=)jqUVo7oO)TRgVpkRJ+tgq*^FP~Gd~42sbcQZUZD7w z4;6)3g8tK%l^Q+BueN6(G-_}5@q^uQ*u2_t^CW>M&y*YQvs@o6ByaCMgtRH-IyV02 z(T%Py%Pym3XauQS8x-^N9ol0mN!VkPfBw{I_@%Fw>s zN#pUSLhal6$pICwg_P#PBEKa!ISOP5IcSlDng+lVdul2VQV}+1MW+W#-(OpI`95EC zO{!cYzs2TIv4sPeWy+}{lE3Y1F(Gk#=qqjO>q(kAZHt7Aoov zxw)5@?I5~97-o!wbY#dO>jfjMGnZwHJfUjVxC$jV~z7e zwyRm$WY32)(PViKy|ZG|Q!`IJa2^xF#&mhUt(nMYwK-jDl6|)bdPV=PRgjULcU(dW4)wN-&*Mol z&i|fEyNy6zC;~|f-`k0kcACaQo%81XH3ewpLp&wIK`!TZvQLa9ZsEB1k##8D_mb}H z{2U@`Vd*iBBFEMmQTI`4Nw7s!&%jakJAPEwkh5tgu}k zZ({sUK}IHXaIHg4s#}yly)J z+NSpQ^v!e8$WBt>cQ0le-1sSJxXq`SA-1G4iWJW{c9amdeByN0|5+#u+F4gCg^`gD zwg8dWT{lBT1XI>Srn>`^6DA%#e3-T<@xZvW8gTJxFMh4RMGis8F}eL|e>t$D=p(GhfefDq1iiuITfY78W<{7=VL7MLYk1>5JmaV2Uj8u=l# z{+*Xd$fJ-mlaUY;*TkxMYj4u<(bL7h6XV3VPjino-*p@DCR;E=CmaN0l`L8 zo0LJh1|w0fEED`%X=%-%K_vKzUp;LJUp$OAoAo-3aFB{t16X-B{0-2$t0p0AdQ%Yy zcM1)y;}_ez~m0S)zHv4%czvm(yT-Qo!8<-L}soUXr=sca}KUqCn2;$=J*IS7EVqu zXlQ6470P?(uR*PSKB8ATzOjBJm^@=%4ngc7paAevMT8k-7`5AkOMwt!39L<2RKpgc zgCdZcAz*li-4GjpQ+ngcf4f%A2R0==xMW+CPNWEvoHI9LW}*w)0D0atEG-H?X&4hh z76K$Clw2uxJ`4?Q8MYf&|1^W)DWEc^0qLczJT;V|oX2Bh(~pf^+}YU)LE?`6&VcGT zKieyWe}Uqb2n%hrK)co^J*oLK*sR_T<-CNa!Bp!^!#Q8F{L}P)fZKl`9d+u8>fFMG zRo>QkAqZTK{iR3+qzOh~&^X8($lBQn3kq@v;O)w;7RgJXn*(49CRlTO&!%gcUmNXj z4Cft|zd;AJ_%+Pyri)(aPV&iJY%DCWp*qj|whmcGOCLk)n}Lxrgp3Q4J#fHPA^Gy< zE*xh{OWLgYMS!m{T1X&@_yIMw+s!s~@d#@7?&XsZ>PPqQ-P?sI;-7tuY{W9c!ehYuW0EDEE!3?k z^^|3@1GEc#P;gDaczelPl$F)t`v*zwti(j#bG>p6m}RU9N!*R16n^)6qWlei$mAxx z}7O0#3^FNG2RKZ-{?@UOfidPL0zxB&CQz1d+Ls zUrVvW2Cp|Q#&t>#*P|C*tEB9@y^mb}ZQCrCU=UC*l}MLOQmytTH`?E;{QNnLwg{4R zpfXN*w@@5oX=OogTYYx48);DdK|WibRDuvKar0n6Mn+RZ8%|8>>LBELCZhX7vpcp^ zxw#p|%!FB< zJJ1kREl|Op%WcB-fC+?} zQ+%N=`_JxLjaRR_z3bO z%gU5F8=Cd*-oMWVPlH?_58S*PZSLVQ`{Bb;TpZvv{G`(yZ2wma0QVK|Bq7us3MoGu z+|N(S-}n*-=BpN#L7fD*V%BX)FawLIG~{G~*-l-ZC$dvYMh3#BC^(Iz?Cp&(l`L^N z<1L{61n-+H6GXc7w)lW7s?u(?0Q6QRzig7!8eHRL1imVNg`yF*o>wX(QVa*rpYL{d zK97$lgG*{pV<1kqJL{49;K2jHuD!g^Lm8rAWCTW*uFsEs1_lO_KD9>8K zE{1G_*Ysku@+yU@wH30pN+mz`@(p-dV8QYw_T0PI37a529UbgX z@X<7_>ifHH9LX;QvN!zQTa-_}l25gg<&16+Pzfq(Y6`g?ajcqtQF$YuD&n%-6@9$7 ziXsLIfry9!P!iA0c|yNQE}rwApkUWB1-3W8{ckCNz5t2msSh4PNB4y2<|5R~S6h%> z7chFNt!7a;{r2_>QGUU^{6Qp7u^NjvBmfEv3Yr7KOg{R-V?vLMYSr}qTO_kr=e69j z8#nGij2Uz}VS9z!!{JhvoxKmns_eQANr{Q7FJIoKrjCh-5C#(S#rdF6oEQAU&^_1~ z#m&om14>m?RG4=y3=Rx{DDcgN+}@nW`q*)58W2>xWMHynX%12m~qJi2`i5+sPd0NXIaRc z^6muo`FDSc#}Q->id1GkD-}ihR8bEUgqTI`3}%`cnfRnU<_l$JrN|iy?SnVoVzkyI z#xr${04X}%CxdHBgTNjEijysBP_?;sMKPo3EqC!iJ5Zm42zqnzI`tTlCE(wqf3F=9 zSy%T)LHJ?d*}+;iNf;-)`rm=DJBBE8*{SZ;mBN`j(1JkG>j-0swe}K25Kv@jDl0$v zsKzn^5-g;t?maH(xbd5k9~y2!=@Y3~|8If<@S@WOum>PlVu)1db#>j@BM{68pYNk$ z(0^n(nVJ$FKtADAHzp?}T!1>!<6sy=F{r`K&z3&`**RX-%^4==%#vlAt#|3Gvbl-! zS+`Li_WIN8U-OHhqEK!Q8JYCy!0w)I*d|LRU<;=@VPTuOCfJ{qBtlb!t>@w(W)|Sk z0pyLJKLf-zbGqjB{stc&Eh(b&ep$|^d5$iB+(M`E;tdifTb#cXjTD5Z)dI_=&B7|c?#K?uMO0OKn#@<_DhJ%Zt3h;W^r*4 zh4#^TIEdI@(rdD0V47|bh@Oe#tKN^M;Il;a1U$;LMManwh~~Ou>M;-+_bSV=qHms_ zLx52ZA$O2@Qv~HNYbUgYfYghJq{4RuldgLSYAo*;gD-!yAId4vv>CSpRrbTQr4?^U ztHC3O_5Cl;WI8KBqir|;odi-I5CqIF$H${d4I6ZSP^`moPaVD`IZCCM$VRN-SA1p0q-xR8)g@h8{=2OSQ5Ne>~+6)xu^qYenH$-Rad zvS3S(oV5qV3p?)vb(=Yq^r3!l5;~mP6uFH0zr=Rhw*@CwyxT2VP0{>5&ww=T^|4pm zGWLxVJ%5;`kcy3L*H<##|0;yIbVjI_lw={E*(N`-{{_Z9`O1)3*pZ}GAP zrRdCX7)at?!$z>Mq}1!)jVmeiFr&L%o)Z9AN7MQ1%^Nt+3hV!k{7PGdR{~;XPTrK3hRMI+G|MY1c#1xWU0&ge2k?6X`UOWYW-9R+2G(|w7R071Pe}Y)>Jxd^wCSoQ$BJY7%Lt;J2yN(Pj}w$pcMM2 zGEMQ&U;&Pq>k;pCW`-XcX6^reSmdZ z$Jo%#1>#?Z1TSe21SdG}_je*;F}!*+b*=I7^oE8m4Mz)kMz5Sg0uCt@zb7S?4vEFf z!WskCu-oY--i<)UB`m;vZp5;>;M4vKU{0ZaxDeB@eK0y(p~k`%usuPAWGahL+909sN>) z!lIyL-nSz%?D;^WU=!f3+imlJ`yqW6BCpU8;gjEGCMod*gglOahD=h_u?WEsDk`%0 z-B*U~JmqGlVswHahe$&^sMR#P>On0)C3Hb5U`u(m{>|ZQ&yuYk_Hz9by>BeI9CFQPI05&l|{23&A9G`k@|GW2tt`pM#qf!&5G? zLa`hhSk|ylYCLW}s1a-cqjI4Yuz_zc|cy zU3V9jVTEEL&?9pgRq}6*s1X!NWv{Yd<3warg!AjpvTA>VSkUC>yN{iC7&{X+4w|oD zM??HHjxQ(|Q3>&y9OB%4V+Tu+qo^xfYXTLfS$Rb%ak7XT z27-Fc5akPKed%s}`eE?=_3Pn*O!ml|N{3O;(Nz=``vC9^JFWTQRz2)T4i0A^u7*xE zR37ZXD>3&Ogih_Hr3H~c5Uf*CA%8!gF z+b+_}wE;N(ov%-FMz0X_AQfVXsXN^|MRra$E*%O<(H?g!e=-|1MrndIEzib-kI@3= z925W+H`wnPKRYc6fxKjSr-dJ#kQ@;eHFck*bX-wI#eH4*U#3hoo5MZk)jxC1>E~x( z5WT}KQINsHmny}eQM@p6U^4V9q}2e$-#<_WU}M)Aa}{$Z%GNNEF?jCUdCe>9U8VD- z#>B)t&r}STI-9f-YH7KN0>fUro~~I5^q5uym`fO`TnQGNn#O+r7Gb?t^x?@%i8c;I zt>G*#RCM7uzTfNW@@QOlij}IL5`GY)6?WP>>x>+KlGc&STo0#U`QCUq#FjD0 zQWTF{%(|A|@VtH{&;-=v^UMRf@VGvbKNAP5rG0E!ZNeTGbjbdn_+xmc2Z|d6hy#G~ z%H@oRX=t=Tg=r+4uTps>1KqherJ1Qy2jy?Jyj#-Gf1t9-ElW|hb3K}8HgW~6sM(+j zu%-bv!NHgdF*h!3Btq2VzsHmnbzHirPIDCx{iHk)|ai)PF> zS0}h(SZyPtd_$w7xV~RLed>aHT`79>N~j94d9=hb|F#~@E#Jnt3g~;1<{zcbKtzF8 z>BI>$x`rczmWy*th-ybeO%tbs@0y3Fd}GuD8|f3NeQ`hEN#a7%YZ-e^z@+zym)PCt z5nMEHV2PuM+1jSU(&l^Mp?OOU?toec8B9-@_Jl{kZ9gzjVzZbP@y6ot{G)ukL2;Na z1F;N1p0CYu*(@x=2>oWjkKQLvWIQqK9ygJysVE3Qfb5Lu5m*g?SpE+|?7lhSU~XiK zrXbVJ?|Q_ZtE{0r3%|*c>qV}T0HjmA<(`@O7uJ1yY2$|hwitITMYZ#RMu}kf<&tf6 z;ErH&$hSN=AAi$1M?t``FH>k`Jfv3pj|=hlmy&-@W_|8_M}SkOK7od68W#a`4Hu6s zoP^MYuDf*?x&j- zyy|q}5u2@pTJHJN6UcP+j;Ca#hIPviBvXvAAk$Ly|MqxTE z0uxxntAB2ehxLX7V7C3}LY!TH--oMm4 zivyWcX-_3ln!xU{oyPFr(E2ELkOzmQcKUGwXE2qJ0C*pDXsoooUg^#Pecx|MRz6qx zr3X}Yu;DZy+{J1Oc%WB-zt~(1`9m(x4+XBk`}a~kCJR1YZ6fn6k~xFn+l{k$NF-B_ z^?Ul;#cH;y=)}l3wOtj!Pjb~26~!rIKn$|bC<04>x%G2FjU3ZnVdEAktJyES9u&>} z2vAaPZ3aJUMAQ&2GV%7Q`28Y8Z?YmaH}Vf?=Sxed(LLcltF*|+?1&IqEQL;QHqLd~4xaZ%<@!#%3 z&6j#NF5{#bnGYvQO++6P!tr=v(d9ZB=LviYDy_fZ?#&yPW`*9eWwF{@-b9&(<)tLI zrSN{F$YLC4{ZnOevCUY~O9Wa7p+iQKX-(@R`J%%(Ef&1+2%)(;DU5#Gd8@4V^7!JE zwYhm0w#^_3db3Bn-*MT&D!8uTSo@Ss^~D?SmiZzW5Cr;apk0M1Sp;(ATd(|_HEa{c zxeAf6NpK2>S$x1!#TV#g_r{n0SBQjZ+-WuFOyHqGX@Y~-^biC6U7T-l0t!#P9FQqQ zg~GBgJoN0}Bpaeuq}M6RUX$7M$zN)`Vw0qHdj4z&`j9xD_+$~!cy67;9t!~@D4$D8 zKHc95r*B80z5kV>{8<sLq?E)TbNeEmU^WlWHwn^zRsN@u1E+~)Ia9B>EA^gt!Mx~7r(87pVU)x*V9#d+z znbPA>%ipZDncG7T73L)Nbee0r6Pvp4?9)1M#_zIgz~*xUEnnjd^xEK>ol#$2B?(K% zaQJo%+Yt&fWLz+~7R&M;9r9s3lD|^f!BUIqF{Xce9>em!HM4wWl>}+3vWe9CCbG@9 zgl2fMpRM^Y`RbsROpS^xFFRS>?pU_9)t!fG%?5)U@1u6DP_r#er4CjtKAl{5~)+ z`O%#`_+Jm-93*OdTzrQiHe~HKKFwo_ zrzi7%G*_#AlNG<`hbYc#r&cBR3mzoy;o`lo(_2ugA!o=OjLdC`Q63Y5_Z?y&(D*jE zn4MnfMaQa!onnGf)G_>DdZ-9G7P4b`D1YaFX6}MDD<`*0#{qAS1=i6EwiG9!5XD@r za`WycFM2>FYiqrL6Rh+4&@S@M!GUKj7!?6i2`GjGOL6g9oDZ1}*h}EK7ON`!Z!8EJ zgX_sEAnBd1&DO0}lqO`IVR~9KU-dv;Jv~R{H4NcFkc0qMUZ~I;P<{-Exa8r_pMSQ4 zK;r(`IsDxY--K-3j<|&d-mv<%|BV(-PUmZ4puMFKtwT43sc4p94;cq-r2QA0zee(< z_ZF+}adEi;q*hsXNS4W`rFz*#hlSYV{D3`OLQYm;dt+hCeB>J$y@U}G2PlvP88S?m z^jIgErthQK#Ku7eJ3R1nzOh`uK^}q}4yK(F-@K7Yd2jp=-dpguCNLQxyxlzQ*P1L2uGA+5ww41Vw=^{F)vx1D{GVpm_S?uD+P=0Rgyd!hTMu!jUg7vs9k} zm7j7~`F`HCrN?&tRXyJElM>qN&&~tnv(eFZa(KKX(%~J51D~;?V)#79aD34VUAaGh z3?rHQeoxm{2KrD8yyjmHq-?yrFl=-W-TyNl*we6C1GXyHxh7eJ-|Ymb6Q8pPDJjLf zei}parTsoDvptX?Aq9t2>jN}7^qie(1d~_JKrC8ilB#Vz|NY)oHOq7hr>hHxnC0C= zx`pe7j{lK4Pn==Cp=R^gQkPP`rF$u^28+;zRD9m1JDGo$KYFOneIaE2Z$%%td_ja(eDhCzB25aStcf{ zu~Ac|l3kl02UIK7euD_bmY*EZzq9QctR#+H3dE(7g zQpnB>Eng<4@?biL+e+CY(wo+*>G-ucfYTtfzu~l{RGY z-2)!9mZF^Acrmhazd9J)b$AG439(2N0b9p`RtR+ZjAe+Gfn0D$R;WHq(O?XK?&n!cHg-#FK17RD7?kK?)Nkq$BthlBk#(Elw=leEJQ};rj>H=*8mgU zftkJAB@8~ev-8Zn1UE15$NeN2B?wuJ{UT1O6@r$RgL+E8DQWBm0n*yK+_S@UG(|v(vI2~m6oC$YB}@VW0X@cR2jF)G3xbAo zQ7NqhUqHY^HtKd74u1KtPic3aV$2MC)k|k$cy@HWICQ!1=IZM0Q+xaNbeTr}kTp9y zZ*DTf27#ZQ%mc|2Gv0VvwlxsbE4?yCnwC$%J%j40#a5}257-9t@^H?>t>pC*X%mj$ zW@e#LF*=Uwf~aC@YW^TOm?;5E$BP%A$6ftqK-YjO_V(@O*H?LDcppoj8Inp6$3ID9 zdr4Ma%l?-S(E7t72VmeWH$|{sd|`dr!hRqg4?{k zpCG?B4nW?vEaAJqFXYUN*AfvKiHPMYKhF$?K~P|_ac^t6l}WQJ?P+_Qth4co=g<(i z-;GFozh9%LrHvPC>o?`LZ5jrpL461wHz^(zAP|_0V>^Bi4+{$m7nc~Ti~4iNp{#{P zP@vCy0s;jjr_c(az1#l<`COw>W;PfDgHw1#cv)liTb49n2Vhn(-mupw9bd8rhA+^3 z^OSMeMn~tZ`>#_#=Vgi0u$hCFJ+{idKEn+aki1By8q3B0;DNh)gZwg;fZ+|S3~<@U zDy)A4K`pA+QEK*^TWatdFJ-)7QmW4L6ZGyeeq$bi0_4uwiu`A#H!>9$r-GTW)XL4} zU@#HM99r{iX`X+pz+ms-z@|U+m#Lb`HwjDa&}AZNHuB^ZRRoqF3N0`11S8W&{YNfL zNg~Ok`p>t5!@_6}hxy4Am0Gs_71{59jXzg_p*IFSH(%v3>-lF|(XS34alxR*6ba@{ z->NSLPi6X*zhYKS8I+E584EW!ZKowAHKw?qjJH!KuDC}+am7M^C`d_3`Dbx)E$gt# zZA5FX>^r2C`Ia?B@z1$KvARW7CnQD1ogJ zi7v~NR*l`Aov(7yoGv;rkXkCIK0*>)afFsf3&(e&^>bmce=AY6H01mpAFrmC-D=n4 zsMuGE{jBl^q_v(3kDG(Ny#ssN03^aR_%^*7M%BDlGd1sazvELhd_j>=O^EKAQwxTVgbBBG0RxsRcIc2?!?PWi41u(S?VYjY!^;4lP# z+s~gDLY7Q#F*ios93g}qX7IHiT;6>+IXbGE>}qX& zRy~TwHrhAHwLc|rNVYN!2MeP-7IqTIQ5aU_E(rugFgzG8uW6?PThUgus6l7sPg-b* zSnud+kBi0Hz^amB4UftEGdS(6E?m{CYNab~$kD&ao>G(964z!9*<57_$y#%NDUP6( z0^@bO&WEP*Udz`7XdL3xWaT zdCgr^Y`Cb>3u^;V9WD_@WX%Z2@=n~Oc`__azX2C^_q*zh8}5I{n(`HQw`h#2a*A%2lO#s0yDt5K; zZ`UVu+?CeWRwA@trg2&Y&?!z;Ep$&c&sjig(Yh8ea(`kPDw=ugoMD4}l|X$pJ71}? zK9;SEU4?v=w_`i!-spW3n_H{g*mx~Dj_F{#g(o_f>(Q@2e+J>uBH+AFNOm!*+dfjD z4d(Zp+6iSxI##Q=Y0G|6M;V^A8F#AdNi~fB^h_%p%N18mxiu(iH(=s?|5g_~&i~9_ zjcU-8~1t>k)3ADjTEV{&-8v%q%I-hN%~8V!?B+J zKXrbcMiC=?V5I6ani;O6X~+KCmG*Yh{ry(8Nsg!)H^B+5&Sb!+Pj#+j3=z(iy8aPF zUVf68u{fkvtU=h`rprdarL`64LPH#D!H#2?E?6>QVG&iE*Ayh-)2ev+JKYDy5Yc>) zbs2%d1oi@P z5PPmPaDYQKe}ph|+A`ZR8^%+%=)))Ls4brt?=uS~$Hb9hBIe~Pkn_dhz|rh@lbl@E z@r6Ng#sNA*vV7pDPY9CSJC{=ISS!b3xqqnO_;9gCb&oz-zHo3YM?#G$GN9}e4Ak#@ zbG?@KzgmDkbZ|;X+(<|;+PW|>H~#?C#clJIU&PNrTsbiIBAW|TOfQm0rfIem!{O_b zlIj5QN_%MEMA7`Z)D4e;0y+ zpn^(>5{gK7N{dQ2NSBCocb6zgmq-anmvlFZh;(;KcXytP=N<1ElJ>}G06}g)tWM{9U@*rf9 zHp)8y^#?;nWLPu6`E6Y?1|E*be=bD}XaaK+Shrj*pvXRrhUc_BT}qu%t6jC`DEHT| zK6&Z&R#oTMN2^Di zc~Eo<_176@V|ACC9-OvNTh6jmh=1L<)DWNEnY6)XzV)*1bYtvl50-B-MF^Qx2ZTp6JL8Z?6vha<@M)cVK%cpCk#}Sb+7mmaEYz z)oRJuZ$9vW)Ozlo9poL8WC87heE9hm0-O%4PX7()H%K*Se-k6%qE^mx#Y2Dzmc!FaFhB#?(VWsr$}^rhNTYL%-ABOp@>j7h=+XSfou=I#X%w_j>6tN< zfccw! z;QQE<*YMB$Nk!_b84wp%+pZ(v4E&)*M?(|dxD9Q{)057*U|8Zmn(o8qKRN=eLljt# zOc)3GnQozOJ>Cp9r4G(##76QoX{(05w6qa{)ic4}c@T`@`x|_+WYk8-ESMf~9XiE! z-S;Z_9G#toUw^y;x?5Mq0za{?sHo{zc-y>1?fwNisVmsu69LMTT0B=cLd39(NkmCQ zW6VSAX3$2=^jNne)*(YO=H}x8!&tdcaE~SUnAiF|xW#$@-aVh&k7n+fbHt&rbyhP{ zInK|=+YRl|;$k8q*4Dd}^USvb{4w*hsLir`b(o?NSv9qh1Hym~edwLFEH_^UHSQs= z<8Pqo$kIgS{uXdMY5&I66-3DDK3?G`DCo5@GsM%eNHxwn8;c# zbV{`ZQS??;0|r^U@SWWle;QUa&mlE}6fDktv%8^|TL!~{S0=t#qiD+!5d4Ezifyc@`y&JlbJt#2G8uG# zM_IrB9g-ucH*WD*zjuH-DKE+r*gKk>Vgw*9-0*xY1n|p(S;yh)Y<66CXv$NShtt z!H2-ijE@X0$8rh-n8NLBd&HoV2r{N-r$1%D^RE;jA-)1uI3P5vRy+SExZ@K{(a}^@ z^M^@hr>5qWl*nfEIjqGR{m+^Z1Fm6|7lwvQaCE@>PRPk%GL*;H>82mivNz$No-XY+ z>h!1t3v72+)xA4lt#30sOq28HoZ1AYB?ZaWsP+&<)39gzh?NiZ&jB6 zG_V3l`Z8n=_iWLj;I$1hH7U#iJbU*(Ep>?Rz{jCYl3`S{G6gD3n$$A5ZzB=S0uc=Fq%cQ~0j z@g}6D9nQBIfQ#kJw;%4m-1Q)q)S(YY&(h*`XdwV*5eiaweh_#2QQ4O$0b)8OHMNWR zDD`)`+I>0LKrsf?tSIPq$LT9ol6= z1TJt8A8gWhW@ZC1?YIOPkZ}Fz1ZA%8_2$>ck6ArI$*C(Va;{on))nrEVZDb42Y(|A z<0ZKcz`p%Kbsc1SrdM~VyIh+AHAVO~DO)Bf;^^X%wMPbKb@zi2A5ivc#$zLyWuE7$ z6qXdox-nrOpe7SAUWm?{?e+9HfD8RUf-Z54s!T3mot{bX2M1K=pXtfVw-)MNUV9-M zO1euIhY1C)o@&U^w724lzTq{np9%&Qc_N&plC-_#v`48 zUZ8%<8=HTkbk!&|zp6@qbMhQ;bfQjX?+VFjXjT$E?g);Z3qwmR0z=$6Z**dRwC!Wp z1;tyS%tb^P-$m2W)8n&W`(m>g44<#JQ<#u~!fyGL`6WQ8HS$*2w#2cnArBrJqZm32 zq*koWcR=scn5Zw=(7t)+PT*%ajCkL;{oLas+?kjIocZtE2FASFRPud-4&-8Kt9RW|A%4U@I?0ZlT8xVuF{Ae?t5a9U7% z_9S|ctSs@%!aA7I0YL0YXmA^~I6crrm|PBO0HaC~^M(eHuG+{0miK}69uJU;%1_a8 z0_%9z5rd4j+2?#JuM-tz8VCl^(w2Tvswek$ir z%5wekIJeUVFnz@Lk`mYBok(#HHoZd0=idw_m+iM_@Y3+arN2E-+iNCije!dE_1>3e zGQz@xU#MkJ6~RGhWpz`BAI5l!TzYP9jU`5#)RDt4niiq5NlB3}&kV|_IZTJq5HRz% zb85R+-bKpH&l8RD1Ks zk-Vfpjr;XW(aP}wA)i}UL!=jX0MQe~CNY8yxMRFVU_K^S?Y;W~CFT|DJpO za81rFEH5j|z;>?>>osh9BO~95L?5iMe?BfTpBMysA!-8{yIzysjZk5Tl8I&_M8H0} zDJB;prxCaSJJEYtWoWoCYl1W>XJq?pVPR&Ox6Cl`72l@B!n(ZslnnQh7`EAP2dU*B zEOe+NZ{NR1M;ta@N09Hc%#Zm%eCHJ{R64dAUA;0ALrB;R1IrKl7Msc}F6F|Cl9P9G z^2_*+12#gR%+k{(Xf2yhRHYm=q!_8KzZfOvN#Hsl;dM0B`Io=va2p<_Korm9$+03m z*b1Kbn${-F54+)^bQ0>J6s*QigCOHfWD- z@$u;d|FaT#o#XaB1iaMkjZYsytMhnGZKOI~IaPK?qx$2_N9;7$670^MQ^^Ds75CGn zWV-T0L%nF|@gwm7bL5Q&WaK=7_79*~fdQVFoqd3vUCNXrpli|5u>uPHl+~*{ zsE4PV4E%$F_7^&);7|b7gppBEtIK@x{7TBohZ7D4@TC^RTXwd#8j!zH`WoE~ic{a6 z+qZ*1M}JS-FKLFo93h(&koMGKBx4g2kncUfas-!(;ZnCCRKJ1YsO!$|6Xg4T_1w)5 zvSSVty}hq-d?+ZK(YBBLuw&E3XA5(N$UvOh1+$~&pXfe&4lO0C9G z$kp|wkPwhqAnqJNDNQ8ca_~}D_fJ%pK6l z^oZ_M?-yji+3mr@hr|NzGh6>s5Dj|zfQA?KDI(ZRU6HmvIXSyf2sAUZ0V<@Tnp#X* z*)!yFp~J)b!?jVh*9r==l~0SI&Os?p17H%RW@Eu3A>p&Lq}Tqkvv&ZIebPDS5Pqi7 zCFRtA+bLvbd0>6&DG3}|h7ODZu*eAYkT1XJV?*936R_}QdU?G<-i}wa#Bt;*YN3WS z-@dg6nok_`n8Rjr6qJ;ak;3!DJ|{LQFsgMW3Rv&23@GN*1^ZRzrRhDv9ZYy`<@)O* zGmRfmg74jr@b(t5u9QzINXrsCXd+mJq*z33EG9ySpTxV$%1UB9lxOjjY{PxGSUK*MZsebAViNF$)O&v0@jgXhM@!4`wD$mbd~V;~hdle+!az;Ubx_fV1`nQ1 zp&i~EAJ@1;JW6oyUWvoz)liDlTm$J|*zGvkyQy0EuFzT>N?qJe-B~MW` z@7-lSX=79dLVR}WH)dV`h=^I>x{ucp6Wq7C{{m?1qkVm|{aKCeC3`f(Yl9g#fA&kz z7(l7gzP1PP62$Ji1U4Z|7#LV{t6^ZE6bQ`^xcAlxSt)2K7q)*Kxw@-IzE@wY&B>9F z?ySvKua^*Ofuk#4K$9tlZ*l@56Cmh0b$$iT&3!2<${rrBhN_^iKv-Wc(%YSKbKu@x z@Qq4IO9Spi6(DE8+hw4iZlLe)#LEgmZPnuRA1Z~f*WYvp3I!|x2i*PgJa2S#WoM^# zK|d)YBXY-7+}{2`Iq$64em%V}BVQhukibD(eaw8ZGYGH;JT3>fN~&U+=Ibs0eJh{Z z0Kx@jSQr6{Ej?YJewVvJ+gHXhLdm3*6jqZ#9tw&-@R$O$6bDmie!fzJLD^{^PH!a4 z?}mSUBAr_#c=HBVvm&%%HinRJ`Q-Ezf=E3R6Hryji%SAtcgln)Rk5lrWomCUy*%4wRC;{oM6+GvUAoz4aaf zLgLUT483FS=RWW{9_VL-?p6F3$_jlo23-wytNZ{>G&14fzJ1#rUV@MSdPYtTFB~>b zPG!Y`%)onTRQ}BotE=kUjv5~x55rqbD3n}C&WBA(0asD|)HXp@pVP?5D070yH^q5! ze|6~aVEsOi!-e&s`43TYfHSLALm#P4TRczs7)_Ng_I>1gr7F?AUhsv5mW9{ih=`oR zhXkxyN%gU!v@}WWDR7SF!?IEar89;DHBQ#tIV9Mo99S>Z(=z#Z$3bWT9Uui7RnW0F zP(GKG(5vsz=Nqcxq9Tn->$J$o4k+~#7Z-=J9gw^XPhzOA0}!1-tA^Wb z^pu<$g5YrbEpL(@952$s3l1tvTzq^+Te$#>;W@jpQDeWp0v(4ParIEW(%Vz`MU-u3 zM*0TYQK`anAD9OjPr77 z|7mPo6Y@Rxyq(I#Kl$TJYTw4e?xi3fj3;@FISfwLGonv?SLl{KKWN^N1Lw{cjd<9!1oISY&NbOQ>UpvFp! za%*ejU&uzq#F**o>Y3zRl!`OvW@S-7eJTM^pSU<~E-spS>dnimg(6S2_z4F`e!s#Y{Hb3%@q-fL|#MVosQ1J+FJj18q7+c z-LsOFeLGb58nSheyLzLfq^7PuGOD(^oaHf`otb&nVgwGS`v@dVT<8A&>vA*MqJ;(U zYfKDWHysm`zRnyuxMP8!4>xFO2^&N}A;35)J`x`<;9=F5oMk$h7{>E77-Yo6fWZJg8=4m@RcmYGt*ta!Z{F$Z>KYh~DVE-sdZn+g zBqS6W5TMXZI)aa}0U&|+JAH`({qEPEO|E9 zMxVnL%38~kH5r2l^8xDr0Do}b7aaiYE3kjrqZvF)Y;1Rj1HeESS0yantQJF9ay$}y ztIhM)wKZDLck@5MC;v&vw^Iq)2?#J{YC?k(*KXW60au>8&JBV7AYtzTM>192_uN1LoR__b-6tYYFcXQpa6;3=T;@71Q^yUNo`$Oa~1!_kdS~1*`_^5JY3w#Y6tA^?ms`M=K50O;W0CEXJTPv6El6^H0fe_ z37?&;3zO%*HZ-;HI_;owmUn;td>7hj@bDrbiUe7)!SPD06DYbn5Hiibaa%?!XS``O z%?NocwuATMQPy`o7Ooe%lvCP%7q6msR~5fiV(>-1p)oNx2S$J=H1kA7W%&4<5XQ?= zhLJ;6B9F}iPl|}h-tv9px8Jp8Wse4w1yJA6Yt;a-qGX>)7=V0hQyvASr2|luIwhI_ zm*mOEQ7@Dqmo)0?ai6dV@bJH$oo>dAk7GJG#F6k3{Ry66fvNM*(HH!mi@Wr68n6|v zaut6{5;Byd>>(ks%aBNonl-(9oR=322-$q*4Zlh950C#VPOP0evQb~Ugeo!sYK#;c zL_w+jsX~2H=i9w3OcAUc`Aqg%n8!XtPqocV5H?gs8tgQZR zSD2eKr&bd4;FYSqN1a(D4Cp{&M%8;ha}}wmLd;_V&R* zjq&!@9FnF`)6xoqH{;vyn=>;%%Ho5n#367kElnb&P**p}&8^8%$hJ}@8cs(|-O<`w zSi*LAaKYGd?u+9r2OkmC_dw(UR|sw;peIbT#$EjsCn3KO{HyDR^WXoh3{K9)t^Ic) z|K}e#Gu(RnzyA{MIP=@6D*x{nzsyu`{Qv%8CeKg*^T)3KvMTof`$zw~R{tkmCcRC8 zf&cXa{QvVa?u_e1{^wrTGCWx}_~2-B?ATX8B-?!R(+o)MfD;7K*u_QtT1d1xBBS$h z^6~tAoKb#sSVO^hKalKr+ z427KyO`<1Y2XgZA{9hIX3ff@mPAe&OzB%R5 z-J-~+?C$>WV7(f&6AR-N5uCDDzS71ZrWFn?uo$qP>)n(MVk9kPUFX!04dB z)di+*b3?=3Td&tavN_pqo_H$!T15p7=i@T`)j-rA6L$s3n-^+xdqQnAdCQ=OnYsC$ z+r-&5+WK8u(O1LZ~QQNyj1<7Hrhvvg$=y;Tt>$mA6z{7KKsZVqL=z6jo z3k;B8Q#jxxYHGX$65-IYh64d8YHeTL-Wd@(o;$x6>0O-1!}%Cwy?mRPyUu&8%IYZ% zm0|Z+`Z4gybBE0@!akL}#XcAgp%XkWBJ`zd{}>(upxTli#^*M z=qJnn4Tfy_PjCMMH4?HY7|G2^uRI*Mp)Iug17#ZTb!+RLH^D2QHP(*M*{vHTL`L#C zY`i0gDmXg&7@XSm_pdy4=s-^WQg(ZE^n=4yPS@U4LXd9}7=>ZsOPqJp085d}M&JG7 zxJoQSUq$UerSP4qxVZml8(+;&5ezI$fBuuDU4@J{k3I_uqVgZTo&0?F6>Raf%sXJ; zl9hEAF;qLZFgM#<+Lq7y*!T|yu>ebukO`Rzdqjdj<*T&lXH3kUFXDQPQR>$rRi~(^ zst_?en72YxZXp7ky7`G}&L2OVpL54@aT^CTbs!Vl_R1n6)d1Fj!tsHD4{K{Ly}rNV zjIj8YmbN_ovl05Ij*o??sYBG%VlTST?`sLWyL&}MJVl~oxrawoRn&RHQcL2CQ)+5> zS$60=*X!J>`zZ>FSvi>=bpEr1%Hj8O>>nO$?^hnAkJmm@S02K_nKm#pJ5Jx-`6G)f z6fTb#nwoBi7JD|4jZdtbnhIN1ej6RFijE#5r&fM+%Z#3nkB5?y;mObJ;+PE%QF$#n zIW4(uQJP3waz3fP2+I0_;o-ltR;(;LMa2pTx3d(k-^cB3PFFWgtqH?VGc)1)tDJBP zsO1sXf?T|Ca^Mv{ zDl?xzL#90HZI*ivooWoo?hxIf(HD8I$yVMc{A)p_pr^n6Qm1@Xa{Y0V>{0#Yx~K9P%YKS9C`LhXNBg-l zUF2HlQ}2-(6VnnwU&s5OGP9c$kz*_ZW1>c1Y@jbO+pV;3&o&>QIPV_2@+ZQK^LT~h z#2PXe1a#5mZ-4S4;7a*9m^+oguQ`66sCl@%J5ss3eKgnT8`2)T&n!6YUBw6lz2&tL ztSidJmzD@hXqSL?SQA6T2ag_=m41dY=P?WHMJTyAhh3^j$VH1Q13i6lVd2J+(Z$ru zzP$uK7no1mLIhMS;!l0=Not&~yNkLe9}Rdmf=Mp}j?X~L0UYif1`K3j;m^;X|L)u= zV~pxDU*6u&^j`d2Ts+&85`zBjY^yN=s1Ci`CS)PahlkkgoSZtv+KP%!rw8%SP5TJ9 zpONlI)aa6;nApfd$11!k+GBP*yOUm-n&qOrfR6@mJ|hBZ4x+KKNq!$*9Xz|NiqwU+ zqrF#J!j9i)YM#%v6z6LTm|1Mz#hEsO+LS(9vs@UKVxg@E1q*<{pQS*+MWj$!6Wcsn zrVvV8cYXbi%0m#iO&!s$Ux)uPfeX^?^6WT=+i~F@8VHFddh?^7az!}e&ZlbM_OM+? zYMrk?cvv32Fupwfs>P{LdtN!n3=BLqJckdPl6Q34)2jP4`K)ypo<$)vzr(-h^Wx%dRP*tTA zK+r|Z{4Tn-mR`ymDhcCSWq33+zAdciD}oVAObS zakTXh;BGMFjf`ym{TmK(SxZZq^KHtc+$}=nk;th%1cJdHl zjVh!W2-E?AyaqZt7dKFanVGGSwkJQs_nd8cvv*bieSTFfxO8S1Elt+4 zv15wq+lW#?!;rmY`)=|&BN;BH zSa>Q`Y=^$pa}6n}po4O_A4JK&w#^gWQJ0X&i5P+ZODD}%zZz=K6t%c7J(rp)`iWF~pcT-A%4qqKqVD>4YfTnj~ z_3vW~X`bIc>RKP56q6?lV^LJ$Nu!Sxe|C@Bh77th_!Eb!NRQax>aQY?D>Uv1;;_U> z(&0yt12D4$K2LoyiU=`s`EYVzhWXq`91&@aj=(^oH372#k^H!hnO*jZ@q=s(Q1T*M zsr+ZGxm@|{cd!2<%7pL;`Mvo$+=^;+>q^(~_eCPbDs+%~Dsq5dX4f+s+HAwZ{@KX< zA$S%EEJ|vzZ~(G)4NY5)o(2Jg0Y*@4LRSp)9`K^pJ!GDjlw(WmQiu~}&}N=k}q=6S|-`>gx~w zM3o^6Yke=j@Lc(nl~A&UYG>-CBp`liTV24^;EIxc<9+)US3H$B3&AVD)2-{kN!B%3I8=w%?y=myE`ku zFUzi3HH!Tzp4NUdGEo~roSkog(tOVk*HfRHX&`|G>Wpb3S)R2ln(!XpdnNbfHJKc4 z9gql4@z@0s-#&Ks6_c$wniu!b0@~({4Y$-cMf8vEC3X=&p;wH?EAK8MA-Ha2VLOf* zr74cl))C?`nN(L$D9-)r28XCp6Uz8+HQ-1wTpO12-vqajaL~g^rLuYJV-UEY#C-~A z>N1J^@d+18?C2QLtuZ(4nG6^NaX@)4l^Q8q;aqURm+0_nJtKm-&OJY)*qPm9P3whU zea<0F92_jn%W1xSO~00HjnKv#KOtKK9f_Egk&6imJb!zlg~<(VCatDn-jE~ zsSN9;G^ip%`tdOo*zclAz+M09F{GA&r^Qm?qo0>S)AX{h1Y%=q*C37uE0A_)`;2^+ zB-ve5$dPV}+Kme03IScPQUeH(Ai^|kAL$&&A%#I2Df zNhl$4YS-%@9#&CTS0{6-kr^>%U&j<80s6$e?c5|d*d)^A^&b#Nwe|G(n;uFBRgzd8 zoh>>T)suma4!W+D8CC?+34QZAqcS%Cp7IzcW z7e&*cU`P^2(>0dXJTXSrMOpJ5?sFnT1Lu$Mj!UMB9l7mq0qVW)t>xVz?aHhyBM8w+ zwo&k3guRe80L6ZBF-KIa&ld9A^78(m{8?JQT~$jdEQGlPph(k`lSiAIpHfjZw6qjP z2*G&mOME<-`u~nE^st$kn$E4P^bS5>sj52h_xFcEIsslJObb-h)T*ivVRo4j6B7f9 z7@j<}wYkz+Qg z9=2SNy7RS3BlV$r*iKryGetyfd0BOE5Fhq+koSW=IAd(UZGY(Rx22_(U}VJ3dgFX( zZVHwlz*WEmb*ZNjT63!lB(f*8X&9)f!6rn_#Z_9Vy0p2uK07;+;%lSMch8zjRa+ZM zv;mn5bx8X6D;s;AAJj_XgD;-un5K)?ile z{QGxi*QwUU7mN@hA@?k%f}v>x&JmCJT{A)X-4T2i6#>o?RaI3#KkDn(n>su12nt?o zY;4esfV3(q(e~Ylo2gry{N6sL8V`tG428#_D9TemDBn9$Rsvjeci@aSlu;1ClL8S3gzocx6#cusCED+k9)Uq<a*~Yfy_MJPnHa6@`OtK}nVEKi?P0ULw28QbpXC&uOl)*uh zLY3+}IN*RpJB>Q@!ZI*00FDcOjxg~wets?Z$8gov)MQLR1cEp;9V@E>Nr=n3TIvf~ zPJpTw6okS73G7S|D#w1j30lXJ@BhV2z?C{Zbz#+wsQaI}$^tob_?&9i5@V3Po9$Kx0C7&>k5f%xF_ z@#F8Mr3ZemAL7n!uCD6B%q)h25rJ_vT%!H~cB)Pda2_cuN0kYSqP&0#H2`y3TSIKi zSw|-;B_+4M9_mrQ=jCbfaH0Zu2r?Q?P0PTjP~v(Gt~_1cO=iKgFJEkt%)Go>+hrOX z(qHci;rLfu!~2CGOq9H-=@}HzZf}dhT5N8fhk{ZU92^X{q}c!$@P%QH1><74`+|b# z6A~DH{`7*I8b&<+wNG&|;jg!`*^SQj>7W3g2F!-mpeUuIW709|hZ?yU$JM-DF(W-4 zE@f1d@e(<~f0?Qo~Crs3PI41J{Bd4x+=i9kB zNAvL5^g=zQP3!@lfInD|W@bs@A>)2NyuU%bGCP}V&r+RVH+l#8_pkO#igFhop55v6 z&!=&m9_t$$B!o`0&m{io`MsWjY5ela3c#%~KhbY*-z+S|-rp;MOIlOQ2bQNu2WN=@ zrl(JfYih{g-uU%P!-)?n#T6CVVFp9Pj_un>CYD`S_k@`l;HZGK{t_J-DH5I<6H{1UFC#1K34df2pC_P+ zOicW7W?O4(l?`QjQ4tN*-+E~A;^7$^wBiE>m!e{PSXfMGsD`ZU+Q#HlCZ>jtT;EZz zZ?Ji=@`BAM)LmLxS>3s{=U}y*l#??i6tC5#eN#vdPEGJefwzpRsuLQ@!a_QHl7O#( z5wCwdbY!f%|^$bv9aE1 zZOef@H(a9HnsH#54k%^AtBWiQtXu-lUvTc*U?a}^nA-;jAPQ{0pXlVR1uAKDXlQss zLRv}+-h-vh`FS09gqTzub*xEQT>CM0BZul9A@Lz)(;{1R7#~OtP0-?W?HQQ7@vN@(v_O}B{h`|**dTX zNx{ytz`|sMGB!QtQSX;8dnF~d9C3hShlTE)o}S*@?_H@$RN0l4Y3b?QPoL5h6N^7Yj>*hL#ql-cbC+%RBz# z2c3F(1Nft1Dm&2M|EF01ZZrVr!vk=1STx+!7;ZiJlSn|aedBSsdo}6*=4U`Vx3EC3x`Tq4 zjvpy1D6sC%g9{zy?LzyfR_ZkQWxx9wC~ud0v18-ZqZ#3~S#EK87dcovo&u0NO2Y(S zL({xf^%=}-$-**oHJY0E5KjPS0iL`pl7f#F;sj0%@gnGW zU8lz^LTv5!4K7^vmTpE42)}Men0W2ieq##&+mVuz)U#Q6M!kH4Y2c>>m|aH8f?^_D zJ~kI~Fcl08mFpMNqXeSdLV+hr*~X@LhYa}okR@_Ar)4Wi^z&myYW4@Gp&cGR^uf5J z!>I_Q!1cHpj;_!;OkMmq?!1Bze2LrET*?)0ryH4a0LBF@b}k#-r_I5932i?_uj_A0Tp*1 zhlxIYni7o$gkt~SiEal%@aDJfsf8JEk@fsT1R^qpbhmGr-o9GFvsU!$V1fk@mAx2rj=l&!DfL1n8{pvYA0uINVsDo$R0ummZ|;y+|m-$MBI4( zEB`$Hd`B3$s+!utYJR)?^ddp_-(6A0$2)k4<#dDg>>nvq=(2|uHRO>zWb(~3gkiCp%+@D!l(lJTITz|HD=TveD&6_S3m0No z2{JX!^!4$Py$wFgj@W$=)eH`vA_NHkg`=Xre%X$Zbl+Zg(oC0fX zahTHluHg(p0%$=nrgekijl+86`B;Y&`O5zpWYjc1iGZzoqwC+b3y?T`ax6Tc8fw~3ri4!Ruox4JE zlH&T^oJf0Y=?jUr;NzNiO&QuA=k!;@6x4=vDeaqRcK*Q6XD8-8ib@_|Tdzf?fd*)^ zK!qS5%!`4X=R45lH>w(Ibbe_{Ln&Be`~2 z@zRUK`dY*XyepY(7*|KVU&ZdndKT(_&=eB$4fVm{IuGQ^lJ49IF`0(!^!yh)yL|*U z*%cs@yKnt$My40=8#E3nC8O_=UW)2y0(7CkTRkLIN?U!+3_#kjjraGo{+}s zIg#-v=7gvWL_DskASzTV2LO8j?;KS|NQex^&70_+{{9B$w74={)D~$!ewd!@RT2fy zpX|rQtaP@~MpteCSOli<@@#k19|^c~BXpW4Ry_5z?CiH21drd3mzv1%41Itxvrqv4 zdwEcd4wqRmJiFE$nt0T;`yu|JrNxJ$0zyT1x3IFZ72&{jCM6>x=-v>xc-}DgbF4Ze zN||XFBEOfgzgNndGK>W?)yi#fujYY?MjxIi52!XXUP@XfOc#&jeAaJ=raDhZ;agEvVGSR%&~9 zcVGDb6@EY0QAUFkP9B5bc6N*fXO0B*K=8~mu~_fzVCH6K%EnE1gftjKe<=td_Yl~% z;yuyf<0D3735$N;LcM{Mdf$ZP1efj7cUZ?;0Pn&OMM*)Cz-_1BpLy5H>hQyd{#!#U zkKsUHX=4D55`k^=e}4Z47c~blaeP^N2QYCP!R?-sqytdVF*^EOM_zN-YQke7Cl^-b z^%jn}jcF1?(%+5_yin1hy(%^?4nPNvThkX^{9}#_?O{=IMiMeI2Gb1}&B5nw^VY1a z#Soifn+%E zY#ofDDsuePw?RC~vn=Y*!;;@aaF~ge6%N8=VOu-%Ic8D~gQb9z1ek0!14CT^LH!~O z?H6~kFflvhs|)lyXgK0Z-?yC7Y%fE~!(`C(b8sExlWDZINo{Ow!pWh=8eF}3+94^C z*Xk7&ON;euhpHVQc92w8M-tVRn~O(INeL~#f>fsPdWM4=Np8_@Hq>2EQfi~4kHzyG zLiYe{I}YI-4HKo8NlZ_kgb{w}tgw1&4VOG2!3*{bmUeany}kD^R!I2#uQG$ULiE~o z{XIQiVlDbM8XBffywRK%2O^|y)^mTE;k4%UVhe6^A_4czl9H8$4jcajveHz$cffr06gF}#M|@P>dSainf@=fek?gp3EtqT#&mXAn~?9-lz< zIQl0-NeOdvc$ZrOeHI$*gheP*(8+F;lS9)2=fz}*LMzj zdQBM_87sQwr6uSJho?MO{cxhjso2ggk??`z@eVsuP+;i?IhdoOJZZ=ZodyLt1rT^Z zZ!-?~LSiH-aA2sqv%j|&Nec!{XO>N=45JgklmLu(2J&x-l3S8}Z0pn0-)kzN{|Nk- z7YlJgusr}GeP&wPvw$WV1_mhof|u|@*wf2Exa2XnK+JP?L=zIy90x>oO3Ezs2S~?P z^=HT&ogHt6kP7gF*BY{>01!~Avh6AElE2&T0SO^vlYr4|3n+OD3wz=zy*Zh*S$lW^ zv#|D#4p@YNI18`bL-14x3u(&Y;tJv*6eJ|}G<>{hf=nSkSre_zr1{0gtUwq*Eh{Sn zwE#kPt3&z3Y=*7zJW!yBX}6^C5N-#<;APTPGU}WvtoDf_rha&#Tke2 zK=e=VDSKO6h33uTLiF6w;5&pF8$>CKM!+8;Ym3n^tIuIT$Y>+L1 zkPd@c7}|gIm1+B1F|%;6!}t`Q%vg4l(XD^p6&f25SFgWt4oFBaSAP}s@nsK;Yx6a@ zi0}1+?Z=^`T@n^q5Fr5UhD`!($%-HsKtyzJuViknLfc~^gO}nn7_&XrhGp2KibvL< z003B;7v+-=_m(qg-?MP-KHJ5Ab3-f~;+}!TJflrb4zqvgL2M(s0|bE;crilS5Y8O- zy9=c>aev!rVG50ow8yY|0RP~|4If^T^7Mss5T2^4eA3hPb#j?Y}5W>laFG&{5v+*2B%YP?Zo8F(a~7YRNO9( zv)kLp6WvEUiOOZNsWorko-EXLDK0MNKil#qbsvT#Fvq1ZBps8XO(%edDspj*21>k{cOO1st~Kn>Se;tm)||Ac%s^>iGCNxMhY022M|$ zSyNK+H21{0qBQGV_aWs6?&XlmO0K@BE%CN&_JwvcQ(X7$ron%WEWPox7eKz}=d=9zrmRZ+9M~4|@yC#pWnpK>^Lq_F zT>#c6$2j;CWb*2zR^23ooWSou0D~C6*RYA7toN``Pl4Inc1uJCq}5I#90<0wp3Y8u zPq3V4W@XjcF8hzNbhWnfxSxUiv)z-@3`r}f4oXQ*zC&`B;&E9HG`U;1NfWin#b6z> zUueIcm&XU5cV7}dX9�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 z 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
vy;A4f^X;zB8LzMQ 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 XjOrWG6RM6&@XtL3Rrx|$L&X0Ay)>Gb diff --git a/docs/img/soroban-rpc-promote-to-stable.png b/docs/img/soroban-rpc-promote-to-stable.png deleted file mode 100644 index 9318339b31e4a21f7d481b4e0f09823019f6c50b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24304 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

W47}&etz|M&})_7;7^=B17CKvX82{h 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 ImgC+30hh!{a{vGU From cfef39304e196b1d281e0fc0345c149b8cd348ed Mon Sep 17 00:00:00 2001 From: George Date: Fri, 13 Sep 2024 23:18:38 -0700 Subject: [PATCH 11/18] Update `simulateTransaction` fields to properly omit fields when empty (#291) --- .../integrationtest/infrastructure/client.go | 12 +++++---- .../simulate_transaction_test.go | 26 ++++++++++--------- .../internal/methods/simulate_transaction.go | 10 ++++--- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/cmd/soroban-rpc/internal/integrationtest/infrastructure/client.go b/cmd/soroban-rpc/internal/integrationtest/infrastructure/client.go index 9b08bb52..7621286a 100644 --- a/cmd/soroban-rpc/internal/integrationtest/infrastructure/client.go +++ b/cmd/soroban-rpc/internal/integrationtest/infrastructure/client.go @@ -159,11 +159,13 @@ func PreflightTransactionParamsLocally(t *testing.T, params txnbuild.Transaction SorobanData: &transactionData, } var auth []xdr.SorobanAuthorizationEntry - for _, b64 := range response.Results[0].AuthXDR { - var a xdr.SorobanAuthorizationEntry - err := xdr.SafeUnmarshalBase64(b64, &a) - require.NoError(t, err) - auth = append(auth, a) + if response.Results[0].AuthXDR != nil { + for _, b64 := range *response.Results[0].AuthXDR { + var a xdr.SorobanAuthorizationEntry + err := xdr.SafeUnmarshalBase64(b64, &a) + require.NoError(t, err) + auth = append(auth, a) + } } v.Auth = auth case *txnbuild.ExtendFootprintTtl: diff --git a/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go b/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go index c64f1bea..25573778 100644 --- a/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go +++ b/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go @@ -71,8 +71,8 @@ func TestSimulateTransactionSucceeds(t *testing.T) { // Then decode and check the result xdr, separately so we get a decent diff if it fails. require.Len(t, result.Results, 1) var resultXdr xdr.ScVal - err = xdr.SafeUnmarshalBase64(result.Results[0].ReturnValueXDR, &resultXdr) - require.NoError(t, err) + require.NotNil(t, result.Results[0].ReturnValueXDR) + require.NoError(t, xdr.SafeUnmarshalBase64(*result.Results[0].ReturnValueXDR, &resultXdr)) require.Equal(t, expectedXdr, resultXdr) // Check state diff @@ -130,11 +130,12 @@ func TestSimulateTransactionWithAuth(t *testing.T) { client := test.GetRPCLient() response := infrastructure.SimulateTransactionFromTxParams(t, client, deployContractParams) require.NotEmpty(t, response.Results) - require.Len(t, response.Results[0].AuthXDR, 1) + require.NotNil(t, response.Results[0].AuthXDR) + require.Len(t, *response.Results[0].AuthXDR, 1) require.Empty(t, deployContractOp.Auth) var auth xdr.SorobanAuthorizationEntry - require.NoError(t, xdr.SafeUnmarshalBase64(response.Results[0].AuthXDR[0], &auth)) + require.NoError(t, xdr.SafeUnmarshalBase64((*response.Results[0].AuthXDR)[0], &auth)) require.Equal(t, auth.Credentials.Type, xdr.SorobanCredentialsTypeSorobanCredentialsSourceAccount) deployContractOp.Auth = append(deployContractOp.Auth, auth) deployContractParams.Operations = []txnbuild.Operation{deployContractOp} @@ -193,8 +194,8 @@ func TestSimulateInvokeContractTransactionSucceeds(t *testing.T) { // check the result require.Len(t, response.Results, 1) var obtainedResult xdr.ScVal - err = xdr.SafeUnmarshalBase64(response.Results[0].ReturnValueXDR, &obtainedResult) - require.NoError(t, err) + require.NotNil(t, response.Results[0].ReturnValueXDR) + require.NoError(t, xdr.SafeUnmarshalBase64(*response.Results[0].ReturnValueXDR, &obtainedResult)) require.Equal(t, xdr.ScValTypeScvAddress, obtainedResult.Type) require.NotNil(t, obtainedResult.Address) require.Equal(t, authAccountIDArg, obtainedResult.Address.MustAccountId()) @@ -225,9 +226,10 @@ func TestSimulateInvokeContractTransactionSucceeds(t *testing.T) { require.NotZero(t, obtainedTransactionData.Resources.WriteBytes) // check the auth - require.Len(t, response.Results[0].AuthXDR, 1) + require.NotNil(t, response.Results[0].AuthXDR) + require.Len(t, *response.Results[0].AuthXDR, 1) var obtainedAuth xdr.SorobanAuthorizationEntry - err = xdr.SafeUnmarshalBase64(response.Results[0].AuthXDR[0], &obtainedAuth) + err = xdr.SafeUnmarshalBase64((*response.Results[0].AuthXDR)[0], &obtainedAuth) require.NoError(t, err) require.Equal(t, xdr.SorobanCredentialsTypeSorobanCredentialsAddress, obtainedAuth.Credentials.Type) require.Equal(t, xdr.ScValTypeScvVoid, obtainedAuth.Credentials.Address.Signature.Type) @@ -564,8 +566,8 @@ func TestSimulateInvokePrng_u64_in_range(t *testing.T) { // check the result require.Len(t, response.Results, 1) var obtainedResult xdr.ScVal - err = xdr.SafeUnmarshalBase64(response.Results[0].ReturnValueXDR, &obtainedResult) - require.NoError(t, err) + require.NotNil(t, response.Results[0].ReturnValueXDR) + require.NoError(t, xdr.SafeUnmarshalBase64(*response.Results[0].ReturnValueXDR, &obtainedResult)) require.Equal(t, xdr.ScValTypeScvU64, obtainedResult.Type) require.LessOrEqual(t, uint64(*obtainedResult.U64), uint64(high)) require.GreaterOrEqual(t, uint64(*obtainedResult.U64), uint64(low)) @@ -612,8 +614,8 @@ func TestSimulateSystemEvent(t *testing.T) { // check the result require.Len(t, response.Results, 1) var obtainedResult xdr.ScVal - err = xdr.SafeUnmarshalBase64(response.Results[0].ReturnValueXDR, &obtainedResult) - require.NoError(t, err) + require.NotNil(t, response.Results[0].ReturnValueXDR) + require.NoError(t, xdr.SafeUnmarshalBase64(*response.Results[0].ReturnValueXDR, &obtainedResult)) var transactionData xdr.SorobanTransactionData err = xdr.SafeUnmarshalBase64(response.TransactionDataXDR, &transactionData) diff --git a/cmd/soroban-rpc/internal/methods/simulate_transaction.go b/cmd/soroban-rpc/internal/methods/simulate_transaction.go index b4a332ce..b9968f61 100644 --- a/cmd/soroban-rpc/internal/methods/simulate_transaction.go +++ b/cmd/soroban-rpc/internal/methods/simulate_transaction.go @@ -33,10 +33,10 @@ type SimulateTransactionCost struct { // SimulateHostFunctionResult contains the simulation result of each HostFunction // within the single InvokeHostFunctionOp allowed in a Transaction type SimulateHostFunctionResult struct { - AuthXDR []string `json:"auth,omitempty"` + AuthXDR *[]string `json:"auth,omitempty"` AuthJSON []json.RawMessage `json:"authJson,omitempty"` - ReturnValueXDR string `json:"xdr,omitempty"` + ReturnValueXDR *string `json:"xdr,omitempty"` ReturnValueJSON json.RawMessage `json:"returnValueJson,omitempty"` } @@ -345,9 +345,11 @@ func NewSimulateTransactionHandler(logger *log.Entry, ledgerEntryReader db.Ledge }) default: + rv := base64.StdEncoding.EncodeToString(result.Result) + auth := base64EncodeSlice(result.Auth) results = append(results, SimulateHostFunctionResult{ - ReturnValueXDR: base64.StdEncoding.EncodeToString(result.Result), - AuthXDR: base64EncodeSlice(result.Auth), + ReturnValueXDR: &rv, + AuthXDR: &auth, }) } } From b17d430b647eed17f8e14d0f3dc2afa868e8a306 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 16 Sep 2024 14:05:12 -0700 Subject: [PATCH 12/18] Update changelog with upcoming patch changes (#294) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5aae50c..9292db39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased + +## [v21.5.1](https://github.com/stellar/soroban-rpc/compare/v21.5.0...v21.5.1) + +### Fixed +* Preserve field omission behavior of `simulateTransaction` ([#291](https://github.com/stellar/soroban-rpc/pull/291)). + +## [v21.5.0](https://github.com/stellar/soroban-rpc/compare/v21.4.1...v21.5.0) + ### Added - Add `EndLedger` in `GetEventsRequest`. This provides finer control and clarity on the range of ledgers being queried. From 3bca89badd0a486535fb9865e5512afababfbd65 Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:27:07 -0700 Subject: [PATCH 13/18] Add build-stellar-rpc in makefile (#296) --- Makefile | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 59e4f671..632e6165 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,10 @@ endif # (libpreflight.a is put at target/release-with-panic-unwind/ when not cross compiling) CARGO_BUILD_TARGET ?= $(shell rustc -vV | sed -n 's|host: ||p') +SOROBAN_RPC_BINARY := soroban-rpc +STELLAR_RPC_BINARY := stellar-rpc + + # update the Cargo.lock every time the Cargo.toml changes. Cargo.lock: Cargo.toml cargo update --workspace @@ -77,11 +81,19 @@ clean: cargo clean go clean ./... +# DEPRECATED - please use build-stellar-rpc instead # the build-soroban-rpc build target is an optimized build target used by -# https://github.com/stellar/pipelines/stellar-horizon/Jenkinsfile-soroban-rpc-package-builder +# https://github.com/stellar/pipelines/blob/master/soroban-rpc/Jenkinsfile-soroban-rpc-package-builder # as part of the package building. build-soroban-rpc: build-libs - go build -ldflags="${GOLDFLAGS}" ${MACOS_MIN_VER} -o soroban-rpc -trimpath -v ./cmd/soroban-rpc + go build -ldflags="${GOLDFLAGS}" ${MACOS_MIN_VER} -o ${SOROBAN_RPC_BINARY} -trimpath -v ./cmd/soroban-rpc + +# the build-stellar-rpc build target is an optimized build target used by +# https://github.com/stellar/pipelines/blob/master/soroban-rpc/Jenkinsfile-soroban-rpc-package-builder +# as part of the package building. +build-stellar-rpc: build-libs + go build -ldflags="${GOLDFLAGS}" ${MACOS_MIN_VER} -o ${STELLAR_RPC_BINARY} -trimpath -v ./cmd/soroban-rpc + go-check-branch: golangci-lint run ./... --new-from-rev $$(git rev-parse origin/main) From b8177505d3dc7f8f5c1b7a4121bd4df706667db9 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Fri, 20 Sep 2024 14:56:14 +0200 Subject: [PATCH 14/18] simulate-transaction: remove confusing Cost field in response (#295) * simulate-transaction: remove confusing Cost field in response * Appease linter --- .../simulate_transaction_test.go | 2 -- .../internal/methods/simulate_transaction.go | 21 +++++-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go b/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go index 25573778..650c8349 100644 --- a/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go +++ b/cmd/soroban-rpc/internal/integrationtest/simulate_transaction_test.go @@ -32,8 +32,6 @@ func TestSimulateTransactionSucceeds(t *testing.T) { contractHashBytes := xdr.ScBytes(contractHash[:]) expectedXdr := xdr.ScVal{Type: xdr.ScValTypeScvBytes, Bytes: &contractHashBytes} require.Greater(t, result.LatestLedger, uint32(0)) - require.Greater(t, result.Cost.CPUInstructions, uint64(0)) - require.Greater(t, result.Cost.MemoryBytes, uint64(0)) expectedTransactionData := xdr.SorobanTransactionData{ Resources: xdr.SorobanResources{ diff --git a/cmd/soroban-rpc/internal/methods/simulate_transaction.go b/cmd/soroban-rpc/internal/methods/simulate_transaction.go index 22868414..7e8a3e6d 100644 --- a/cmd/soroban-rpc/internal/methods/simulate_transaction.go +++ b/cmd/soroban-rpc/internal/methods/simulate_transaction.go @@ -25,13 +25,8 @@ type SimulateTransactionRequest struct { Format string `json:"xdrFormat,omitempty"` } -type SimulateTransactionCost struct { - CPUInstructions uint64 `json:"cpuInsns,string"` - MemoryBytes uint64 `json:"memBytes,string"` -} - -// SimulateHostFunctionResult contains the simulation result of each HostFunction -// within the single InvokeHostFunctionOp allowed in a Transaction +// SimulateHostFunctionResult contains the simulation result of each HostFunction within the single +// InvokeHostFunctionOp allowed in a Transaction type SimulateHostFunctionResult struct { AuthXDR *[]string `json:"auth,omitempty"` AuthJSON []json.RawMessage `json:"authJson,omitempty"` @@ -217,8 +212,6 @@ type SimulateTransactionResponse struct { MinResourceFee int64 `json:"minResourceFee,string,omitempty"` // an array of the individual host function call results Results []SimulateHostFunctionResult `json:"results,omitempty"` - // the effective cpu and memory cost of the invoked transaction execution. - Cost SimulateTransactionCost `json:"cost,omitempty"` // If present, it indicates that a prior RestoreFootprint is required RestorePreamble *RestorePreamble `json:"restorePreamble,omitempty"` // If present, it indicates how the state (ledger entries) will change as a result of the transaction execution. @@ -392,13 +385,9 @@ func NewSimulateTransactionHandler(logger *log.Entry, ledgerEntryReader db.Ledge } simResp := SimulateTransactionResponse{ - Error: result.Error, - Results: results, - MinResourceFee: result.MinFee, - Cost: SimulateTransactionCost{ - CPUInstructions: result.CPUInstructions, - MemoryBytes: result.MemoryBytes, - }, + Error: result.Error, + Results: results, + MinResourceFee: result.MinFee, LatestLedger: latestLedger, RestorePreamble: restorePreamble, StateChanges: stateChanges, From cae17400b3922539f45ad1cb2bc6c30200e4a6d9 Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Fri, 20 Sep 2024 08:06:32 -0700 Subject: [PATCH 15/18] Add cursor in GetEventResponse (#287) * Add endLedger in GetEventResponse * Add Cursor to response and deprecate PagingToken * Update cursor logic and tests * update CHANGELOG.md --- CHANGELOG.md | 2 ++ .../internal/methods/get_events.go | 32 +++++++++++++---- .../internal/methods/get_events_test.go | 34 ++++++++++++++----- 3 files changed, 54 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9292db39..02e11dbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ ### Added +- Add `Cursor` in `GetEventsResponse`. This tells the client until what ledger events are being queried. e.g.: `startLEdger` (inclusive) - `endLedger` (exclusive) +- Limitation: getEvents are capped by 10K `LedgerScanLimit` which means you can query events for 10K ledger at maximum for a given request. - Add `EndLedger` in `GetEventsRequest`. This provides finer control and clarity on the range of ledgers being queried. - Disk-Based Event Storage: Events are now stored on disk instead of in memory. For context, storing approximately 3 million events will require around 1.5 GB of disk space. This change enhances the scalability and can now support a larger retention window (~7 days) for events. diff --git a/cmd/soroban-rpc/internal/methods/get_events.go b/cmd/soroban-rpc/internal/methods/get_events.go index 48290fb7..8312b530 100644 --- a/cmd/soroban-rpc/internal/methods/get_events.go +++ b/cmd/soroban-rpc/internal/methods/get_events.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math" "strings" "time" @@ -85,11 +86,13 @@ func (e eventTypeSet) matches(event xdr.ContractEvent) bool { } type EventInfo struct { - EventType string `json:"type"` - Ledger int32 `json:"ledger"` - LedgerClosedAt string `json:"ledgerClosedAt"` - ContractID string `json:"contractId"` - ID string `json:"id"` + EventType string `json:"type"` + Ledger int32 `json:"ledger"` + LedgerClosedAt string `json:"ledgerClosedAt"` + ContractID string `json:"contractId"` + ID string `json:"id"` + + // Deprecated: PagingToken field is deprecated, please use Cursor at top level for pagination PagingToken string `json:"pagingToken"` InSuccessfulContractCall bool `json:"inSuccessfulContractCall"` TransactionHash string `json:"txHash"` @@ -336,6 +339,8 @@ type PaginationOptions struct { type GetEventsResponse struct { Events []EventInfo `json:"events"` LatestLedger uint32 `json:"latestLedger"` + // Cursor represents last populated event ID if total events reach the limit or end of the search window + Cursor string `json:"cursor"` } type eventsRPCHandler struct { @@ -439,7 +444,10 @@ func (h eventsRPCHandler) getEvents(ctx context.Context, request GetEventsReques limit = request.Pagination.Limit } } - endLedger := request.StartLedger + LedgerScanLimit + endLedger := start.Ledger + LedgerScanLimit + + // endLedger should not exceed ledger retention window + endLedger = min(ledgerRange.LastLedger.Sequence+1, endLedger) if request.EndLedger != 0 { endLedger = min(request.EndLedger, endLedger) @@ -509,9 +517,21 @@ func (h eventsRPCHandler) getEvents(ctx context.Context, request GetEventsReques results = append(results, info) } + var cursor string + if uint(len(results)) == limit { + lastEvent := results[len(results)-1] + cursor = lastEvent.ID + } else { + // cursor represents end of the search window if events does not reach limit + // here endLedger is always exclusive when fetching events + // so search window is max Cursor value with endLedger - 1 + cursor = db.Cursor{Ledger: endLedger - 1, Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + } + return GetEventsResponse{ LatestLedger: ledgerRange.LastLedger.Sequence, Events: results, + Cursor: cursor, }, nil } diff --git a/cmd/soroban-rpc/internal/methods/get_events_test.go b/cmd/soroban-rpc/internal/methods/get_events_test.go index a7373287..cd06b0e3 100644 --- a/cmd/soroban-rpc/internal/methods/get_events_test.go +++ b/cmd/soroban-rpc/internal/methods/get_events_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math" "path" "strconv" "strings" @@ -655,7 +656,8 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(i).HexString(), }) } - assert.Equal(t, GetEventsResponse{expected, 1}, results) + cursor := db.Cursor{Ledger: 1, Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + assert.Equal(t, GetEventsResponse{expected, 1, cursor}, results) }) t.Run("filtering by contract id", func(t *testing.T) { @@ -801,7 +803,9 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(4).HexString(), }, } - assert.Equal(t, GetEventsResponse{expected, 1}, results) + cursor := db.Cursor{Ledger: 1, Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + + assert.Equal(t, GetEventsResponse{expected, 1, cursor}, results) results, err = handler.getEvents(ctx, GetEventsRequest{ StartLedger: 1, @@ -835,7 +839,7 @@ func TestGetEvents(t *testing.T) { expected[0].ValueJSON = valueJs expected[0].TopicJSON = topicsJs - require.Equal(t, GetEventsResponse{expected, 1}, results) + require.Equal(t, GetEventsResponse{expected, 1, cursor}, results) }) t.Run("filtering by both contract id and topic", func(t *testing.T) { @@ -946,7 +950,9 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(3).HexString(), }, } - assert.Equal(t, GetEventsResponse{expected, 1}, results) + cursor := db.Cursor{Ledger: 1, Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + + assert.Equal(t, GetEventsResponse{expected, 1, cursor}, results) }) t.Run("filtering by event type", func(t *testing.T) { @@ -1021,7 +1027,9 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(0).HexString(), }, } - assert.Equal(t, GetEventsResponse{expected, 1}, results) + cursor := db.Cursor{Ledger: 1, Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + + assert.Equal(t, GetEventsResponse{expected, 1, cursor}, results) }) t.Run("with limit", func(t *testing.T) { @@ -1092,7 +1100,9 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(i).HexString(), }) } - assert.Equal(t, GetEventsResponse{expected, 1}, results) + cursor := expected[len(expected)-1].ID + + assert.Equal(t, GetEventsResponse{expected, 1, cursor}, results) }) t.Run("with cursor", func(t *testing.T) { @@ -1192,7 +1202,8 @@ func TestGetEvents(t *testing.T) { TransactionHash: ledgerCloseMeta.TransactionHash(i).HexString(), }) } - assert.Equal(t, GetEventsResponse{expected, 5}, results) + cursor := expected[len(expected)-1].ID + assert.Equal(t, GetEventsResponse{expected, 5, cursor}, results) results, err = handler.getEvents(context.TODO(), GetEventsRequest{ Pagination: &PaginationOptions{ @@ -1201,7 +1212,14 @@ func TestGetEvents(t *testing.T) { }, }) require.NoError(t, err) - assert.Equal(t, GetEventsResponse{[]EventInfo{}, 5}, results) + + latestLedger := 5 + endLedger := min(5+LedgerScanLimit, latestLedger+1) + + // Note: endLedger is always exclusive when fetching events + // so search window is always max Cursor value with endLedger - 1 + cursor = db.Cursor{Ledger: uint32(endLedger - 1), Tx: math.MaxUint32, Event: math.MaxUint32 - 1}.String() + assert.Equal(t, GetEventsResponse{[]EventInfo{}, 5, cursor}, results) }) } From e7debbe5de6ccf51cb47c773d54872bbbe7722de Mon Sep 17 00:00:00 2001 From: Aditya Vyas Date: Tue, 24 Sep 2024 11:51:14 -0400 Subject: [PATCH 16/18] Add hash to getTransactions response (#299) Add transaction hash in the transaction object in the getTransactions response --- cmd/soroban-rpc/internal/db/transaction.go | 2 ++ .../internal/methods/get_transactions.go | 4 ++++ .../internal/methods/get_transactions_test.go | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/cmd/soroban-rpc/internal/db/transaction.go b/cmd/soroban-rpc/internal/db/transaction.go index af836455..ef2d5cbf 100644 --- a/cmd/soroban-rpc/internal/db/transaction.go +++ b/cmd/soroban-rpc/internal/db/transaction.go @@ -25,6 +25,7 @@ const ( var ErrNoTransaction = errors.New("no transaction with this hash exists") type Transaction struct { + TransactionHash string Result []byte // XDR encoded xdr.TransactionResult Meta []byte // XDR encoded xdr.TransactionMeta Envelope []byte // XDR encoded xdr.TransactionEnvelope @@ -223,6 +224,7 @@ func ParseTransaction(lcm xdr.LedgerCloseMeta, ingestTx ingest.LedgerTransaction Sequence: lcm.LedgerSequence(), CloseTime: lcm.LedgerCloseTime(), } + tx.TransactionHash = ingestTx.Result.TransactionHash.HexString() if tx.Result, err = ingestTx.Result.Result.MarshalBinary(); err != nil { return tx, fmt.Errorf("couldn't encode transaction Result: %w", err) diff --git a/cmd/soroban-rpc/internal/methods/get_transactions.go b/cmd/soroban-rpc/internal/methods/get_transactions.go index d32fb61d..4ba5e09e 100644 --- a/cmd/soroban-rpc/internal/methods/get_transactions.go +++ b/cmd/soroban-rpc/internal/methods/get_transactions.go @@ -58,6 +58,9 @@ func (req GetTransactionsRequest) isValid(maxLimit uint, ledgerRange ledgerbucke type TransactionInfo struct { // Status is one of: TransactionSuccess, TransactionFailed. Status string `json:"status"` + // TransactionHash is the hex encoded hash of the transaction. Note that for fee-bump transaction + // this will be the hash of the fee-bump transaction instead of the inner transaction hash. + TransactionHash string `json:"txHash"` // ApplicationOrder is the index of the transaction among all the transactions // for that ledger. ApplicationOrder int32 `json:"applicationOrder"` @@ -194,6 +197,7 @@ func (h transactionsRPCHandler) processTransactionsInLedger( } txInfo := TransactionInfo{ + TransactionHash: tx.TransactionHash, ApplicationOrder: tx.ApplicationOrder, FeeBump: tx.FeeBump, Ledger: tx.Ledger.Sequence, diff --git a/cmd/soroban-rpc/internal/methods/get_transactions_test.go b/cmd/soroban-rpc/internal/methods/get_transactions_test.go index 5a90202f..24e3f429 100644 --- a/cmd/soroban-rpc/internal/methods/get_transactions_test.go +++ b/cmd/soroban-rpc/internal/methods/get_transactions_test.go @@ -20,6 +20,19 @@ const ( NetworkPassphrase string = "passphrase" ) +var expectedTransactionInfo = TransactionInfo{ + Status: "SUCCESS", + TransactionHash: "b0d0b35dcaed0152d62fbbaa28ed3fa4991c87e7e169a8fca2687b17ee26ca2d", + ApplicationOrder: 1, + FeeBump: false, + Ledger: 1, + LedgerCloseTime: 125, + EnvelopeXDR: "AAAAAgAAAQCAAAAAAAAAAD8MNL+TrQ2ZcdBMzJD3BVEcg4qtlzSkovsNegP8f+iaAAAAAQAAAAD///+dAAAAAAAAAAAAAAAAAAAAAAAAAAA=", //nolint:lll + ResultMetaXDR: "AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAA", + ResultXDR: "AAAAAAAAAGQAAAAAAAAAAAAAAAA=", + DiagnosticEventsXDR: []string{}, +} + // createTestLedger Creates a test ledger with 2 transactions func createTestLedger(sequence uint32) xdr.LedgerCloseMeta { sequence -= 100 @@ -70,6 +83,9 @@ func TestGetTransactions_DefaultLimit(t *testing.T) { // assert transactions result assert.Len(t, response.Transactions, 10) + + // assert the transaction structure. We will match only 1 tx for sanity purposes. + assert.Equal(t, expectedTransactionInfo, response.Transactions[0]) } func TestGetTransactions_DefaultLimitExceedsLatestLedger(t *testing.T) { @@ -104,6 +120,9 @@ func TestGetTransactions_DefaultLimitExceedsLatestLedger(t *testing.T) { // assert transactions result assert.Len(t, response.Transactions, 6) + + // assert the transaction structure. We will match only 1 tx for sanity purposes. + assert.Equal(t, expectedTransactionInfo, response.Transactions[0]) } func TestGetTransactions_CustomLimit(t *testing.T) { @@ -143,6 +162,9 @@ func TestGetTransactions_CustomLimit(t *testing.T) { assert.Len(t, response.Transactions, 2) assert.Equal(t, uint32(1), response.Transactions[0].Ledger) assert.Equal(t, uint32(1), response.Transactions[1].Ledger) + + // assert the transaction structure. We will match only 1 tx for sanity purposes. + assert.Equal(t, expectedTransactionInfo, response.Transactions[0]) } func TestGetTransactions_CustomLimitAndCursor(t *testing.T) { From 953a504f0391a131275f6cb95b5322388cd5d191 Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Wed, 25 Sep 2024 11:09:31 -0700 Subject: [PATCH 17/18] Update docker file to build 2 images based on `BINARY_NAME` (#300) * Update docker file to build 2 images based on argument * Update docker-build and makefile * remove duplicate assignments --- cmd/soroban-rpc/docker/Dockerfile | 15 +++++++++++---- cmd/soroban-rpc/docker/Makefile | 12 +++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cmd/soroban-rpc/docker/Dockerfile b/cmd/soroban-rpc/docker/Dockerfile index cbe03a87..a9608256 100644 --- a/cmd/soroban-rpc/docker/Dockerfile +++ b/cmd/soroban-rpc/docker/Dockerfile @@ -1,6 +1,7 @@ FROM golang:1.22-bullseye as build ARG RUST_TOOLCHAIN_VERSION=stable ARG REPOSITORY_VERSION +ARG BINARY_NAME=soroban-rpc WORKDIR /go/src/github.com/stellar/soroban-rpc @@ -18,11 +19,14 @@ RUN apt-get clean RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUST_TOOLCHAIN_VERSION -RUN make REPOSITORY_VERSION=${REPOSITORY_VERSION} build-soroban-rpc -RUN mv soroban-rpc /bin/soroban-rpc +RUN make REPOSITORY_VERSION=${REPOSITORY_VERSION} build-${BINARY_NAME} + +# Move the binary to a common location +RUN mv ${BINARY_NAME} /bin/${BINARY_NAME} FROM ubuntu:22.04 ARG STELLAR_CORE_VERSION +ARG BINARY_NAME=soroban-rpc ENV STELLAR_CORE_VERSION=${STELLAR_CORE_VERSION:-*} ENV STELLAR_CORE_BINARY_PATH /usr/bin/stellar-core ENV DEBIAN_FRONTEND=noninteractive @@ -35,5 +39,8 @@ RUN echo "deb https://apt.stellar.org focal unstable" >/etc/apt/sources.list.d/S RUN apt-get update && apt-get install -y stellar-core=${STELLAR_CORE_VERSION} RUN apt-get clean -COPY --from=build /bin/soroban-rpc /app/ -ENTRYPOINT ["/app/soroban-rpc"] +# Copy the binary from the build stage +COPY --from=build /bin/${BINARY_NAME} /app/${BINARY_NAME} + +# Set the entrypoint to the specific binary +ENTRYPOINT ["/app/${BINARY_NAME}"] \ No newline at end of file diff --git a/cmd/soroban-rpc/docker/Makefile b/cmd/soroban-rpc/docker/Makefile index f3f39994..1d02a5cd 100644 --- a/cmd/soroban-rpc/docker/Makefile +++ b/cmd/soroban-rpc/docker/Makefile @@ -22,12 +22,22 @@ ifndef STELLAR_CORE_VERSION $(error STELLAR_CORE_VERSION environment variable must be set. For example 19.10.1-1310.6649f5173.focal~soroban) endif -TAG ?= stellar/stellar-soroban-rpc:$(SOROBAN_RPC_VERSION_PACKAGE_VERSION) +# Set default value for BINARY_NAME if not provided +BINARY_NAME ?= soroban-rpc + +# Set the TAG based on the value of BINARY_NAME +ifeq ($(BINARY_NAME),stellar-rpc) + TAG := stellar/stellar-rpc:$(SOROBAN_RPC_VERSION_PACKAGE_VERSION) +else + TAG := stellar/stellar-soroban-rpc:$(SOROBAN_RPC_VERSION_PACKAGE_VERSION) +endif + docker-build: $(SUDO) docker build --pull --platform linux/amd64 $(DOCKER_OPTS) \ --label org.opencontainers.image.created="$(BUILD_DATE)" \ --build-arg STELLAR_CORE_VERSION=$(STELLAR_CORE_VERSION) --build-arg SOROBAN_RPC_VERSION=$(SOROBAN_RPC_VERSION_PACKAGE_VERSION) \ + --build-arg BINARY_NAME=$(BINARY_NAME) \ -t $(TAG) -f Dockerfile.release . docker-push: From 44db01f8c6aef623a10a83c0a27f728c918d9a04 Mon Sep 17 00:00:00 2001 From: Prit Sheth <124409873+psheth9@users.noreply.github.com> Date: Wed, 2 Oct 2024 08:29:33 -0700 Subject: [PATCH 18/18] Remove pagingToken from getEvents (#297) --- cmd/soroban-rpc/internal/methods/get_events.go | 3 --- cmd/soroban-rpc/internal/methods/get_events_test.go | 6 ------ 2 files changed, 9 deletions(-) diff --git a/cmd/soroban-rpc/internal/methods/get_events.go b/cmd/soroban-rpc/internal/methods/get_events.go index 8312b530..e63f9132 100644 --- a/cmd/soroban-rpc/internal/methods/get_events.go +++ b/cmd/soroban-rpc/internal/methods/get_events.go @@ -92,8 +92,6 @@ type EventInfo struct { ContractID string `json:"contractId"` ID string `json:"id"` - // Deprecated: PagingToken field is deprecated, please use Cursor at top level for pagination - PagingToken string `json:"pagingToken"` InSuccessfulContractCall bool `json:"inSuccessfulContractCall"` TransactionHash string `json:"txHash"` @@ -555,7 +553,6 @@ func eventInfoForEvent( Ledger: int32(cursor.Ledger), LedgerClosedAt: ledgerClosedAt, ID: cursor.String(), - PagingToken: cursor.String(), InSuccessfulContractCall: event.InSuccessfulContractCall, TransactionHash: txHash, } diff --git a/cmd/soroban-rpc/internal/methods/get_events_test.go b/cmd/soroban-rpc/internal/methods/get_events_test.go index cd06b0e3..81a9c169 100644 --- a/cmd/soroban-rpc/internal/methods/get_events_test.go +++ b/cmd/soroban-rpc/internal/methods/get_events_test.go @@ -649,7 +649,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", ID: id, - PagingToken: id, TopicXDR: []string{value}, ValueXDR: value, InSuccessfulContractCall: true, @@ -796,7 +795,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", ID: id, - PagingToken: id, TopicXDR: []string{counterXdr, value}, ValueXDR: value, InSuccessfulContractCall: true, @@ -943,7 +941,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: strkey.MustEncode(strkey.VersionByteContract, contractID[:]), ID: id, - PagingToken: id, TopicXDR: []string{counterXdr, value}, ValueXDR: value, InSuccessfulContractCall: true, @@ -1020,7 +1017,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: strkey.MustEncode(strkey.VersionByteContract, contractID[:]), ID: id, - PagingToken: id, TopicXDR: []string{counterXdr}, ValueXDR: counterXdr, InSuccessfulContractCall: true, @@ -1093,7 +1089,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSC4", ID: id, - PagingToken: id, TopicXDR: []string{value}, ValueXDR: value, InSuccessfulContractCall: true, @@ -1195,7 +1190,6 @@ func TestGetEvents(t *testing.T) { LedgerClosedAt: now.Format(time.RFC3339), ContractID: strkey.MustEncode(strkey.VersionByteContract, contractID[:]), ID: id, - PagingToken: id, TopicXDR: []string{counterXdr}, ValueXDR: expectedXdr, InSuccessfulContractCall: true,