diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a344591818545dcf0ebccf75d15fe54874d8ee4..8a7b2119e590cc8e556f9948afe50b6ddb4c69b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ stages: - test - build - trigger_integration + - version_check test: stage: test @@ -72,8 +73,19 @@ tag: image: $DOCKER_IMAGE script: - git remote add origin_tags git@$GITLAB_SERVER:elixxir/client.git || true - - git tag $(release/client.linux64 version | grep "Elixxir Client v"| cut -d ' ' -f3) -f - - git push origin_tags -f --tags + - git tag $(release/client.linux64 version | grep "Elixxir Client v"| cut -d ' ' -f3) + - git push origin_tags --tags + +version_check: + stage: version_check + only: + - master + - release + image: $DOCKER_IMAGE + script: + - GITTAG=$(git describe --tags) + - CODEVERS=$(release/client.darwin64 version | grep "Elixxir Client v"| cut -d ' ' -f3) + - if [[ $GITTAG != $CODEVERS ]]; then echo "VERSION NUMBER BAD $GITTAG != $CODEVER"; exit -1; fi bindings-ios: stage: build @@ -90,7 +102,7 @@ bindings-ios: - go get golang.org/x/mobile/bind - go install golang.org/x/mobile/cmd/gomobile@latest - gomobile init - - gomobile bind -target ios,iossimulator,macos gitlab.com/elixxir/client/bindings + - gomobile bind -target ios,iossimulator,macos gitlab.com/elixxir/client/v4/bindings - ls - zip -r iOS.zip Bindings.xcframework artifacts: @@ -114,7 +126,7 @@ bindings-android: - go get golang.org/x/mobile/bind - go install golang.org/x/mobile/cmd/gomobile@latest - gomobile init - - gomobile bind -target android -androidapi 21 gitlab.com/elixxir/client/bindings + - gomobile bind -target android -androidapi 21 gitlab.com/elixxir/client/v4/bindings artifacts: paths: - bindings.aar diff --git a/README.md b/README.md index dc58f697ff36740f76504073c92ae3d96676b16d..573f06b3a40dabcc1723c2ec61177ad7021f292a 100644 --- a/README.md +++ b/README.md @@ -462,19 +462,19 @@ use the correct versions as listed below. | | Version | Download | Documentation | |----------------------|--------:|---------------------------------------------------------------------|-------------------------------------------------------------------------| -| `protoc` | 3.15.6 | https://github.com/protocolbuffers/protobuf/releases/tag/v3.15.6 | https://developers.google.com/protocol-buffers/docs/gotutorial | -| `protoc-gen-go` | 1.27.1 | https://github.com/protocolbuffers/protobuf-go/releases/tag/v1.27.1 | https://pkg.go.dev/google.golang.org/protobuf@v1.27.1/cmd/protoc-gen-go | +| `protoc` | 3.21.9 | https://github.com/protocolbuffers/protobuf/releases/tag/v3.21.9 | https://developers.google.com/protocol-buffers/docs/gotutorial | +| `protoc-gen-go` | 1.28.1 | https://github.com/protocolbuffers/protobuf-go/releases/tag/v1.28.1 | https://pkg.go.dev/google.golang.org/protobuf@v1.28.1/cmd/protoc-gen-go | | `protoc-gen-go-grpc` | 1.2.0 | https://github.com/grpc/grpc-go/releases/tag/v1.2.0 | https://pkg.go.dev/google.golang.org/grpc/cmd/protoc-gen-go-grpc | 1. Download the correct release of `protoc` from the [release page](https://github.com/protocolbuffers/protobuf/releases) or use the link from the table above to get the download for your OS. - wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.6/protoc-3.15.6-linux-x86_64.zip + wget https://github.com/protocolbuffers/protobuf/releases/download/v3.21.9/protoc-3.21.9-linux-x86_64.zip 2. Extract the files to a folder, such as `$HOME/.local`. - unzip protoc-3.15.6-linux-x86_64.zip -d $HOME/.local + unzip protoc-3.21.9-linux-x86_64.zip -d $HOME/.local 3. Add the selected directory to your environment’s `PATH` variable, make sure to include it in your `.profile` or `.bashrc` file. Also, include your go bin @@ -492,18 +492,18 @@ use the correct versions as listed below. Which prints the current version - libprotoc 3.15.6 + libprotoc 3.21.9 5. Next, download `protoc-gen-go` and `protoc-gen-go-grpc` using the version found in the table above. - go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27 + go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 6. Check that `protoc-gen-go` is installed with the correct version. protoc-gen-go --version - protoc-gen-go v1.27.1 + protoc-gen-go v1.28.1 7. Check that `protoc-gen-go-grpc` is installed with the correct version. diff --git a/auth/confirm.go b/auth/confirm.go index 0b7278c6e1f08b8535384d729b95c46eba650b04..fec085c1b94c700db586d1ead22f6de60c6ae36a 100644 --- a/auth/confirm.go +++ b/auth/confirm.go @@ -12,11 +12,11 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/event" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/event" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/contact" cAuth "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/primitives/format" diff --git a/auth/fmt.go b/auth/fmt.go index 6318b7474a0fe91c22fedbfd9ef2cc91c8a8d729..015205aaacac5bc6d93870dc0083d3960dcd9526 100644 --- a/auth/fmt.go +++ b/auth/fmt.go @@ -11,8 +11,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" - util "gitlab.com/elixxir/client/storage/utility" + sidhinterface "gitlab.com/elixxir/client/v4/interfaces/sidh" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/auth/fmt_test.go b/auth/fmt_test.go index 0c045402062f0d4f7d3bda1ab2723aa5a9be6abd..c8215a4f533658c178d5fdce681a4447964f832b 100644 --- a/auth/fmt_test.go +++ b/auth/fmt_test.go @@ -13,7 +13,7 @@ import ( "reflect" "testing" - sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" + sidhinterface "gitlab.com/elixxir/client/v4/interfaces/sidh" "gitlab.com/xx_network/primitives/id" ) diff --git a/auth/interface.go b/auth/interface.go index c515973886b9387d3442ee6f134aa47a428bb0ea..62c08620800877716f33070b7f37e4fbd121b924 100644 --- a/auth/interface.go +++ b/auth/interface.go @@ -9,14 +9,14 @@ package auth import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/fact" diff --git a/auth/params.go b/auth/params.go index 01fa5ba810e108dc72407fd0e0bf90bccbf54904..b224f513460b53a444cd2dc140dfc9721d163fb6 100644 --- a/auth/params.go +++ b/auth/params.go @@ -9,7 +9,7 @@ package auth import ( "encoding/json" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" ) // Params is are the parameters for the auth package. diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go index 0b1109cd9410fe19b75cc891cb7eac9604ed4da9..c12fea760dd611ace8a479d57b6751d5d1e77053 100644 --- a/auth/receivedConfirm.go +++ b/auth/receivedConfirm.go @@ -12,10 +12,10 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/contact" cAuth "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/primitives/fact" diff --git a/auth/receivedRequest.go b/auth/receivedRequest.go index e94b82598ad12a5bb2b24246074f9936040b6d04..b1febe9016bd796b9f8235177ed130dacbb74fb9 100644 --- a/auth/receivedRequest.go +++ b/auth/receivedRequest.go @@ -15,10 +15,10 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/ratchet" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e/ratchet" "gitlab.com/elixxir/crypto/contact" cAuth "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/primitives/fact" diff --git a/auth/request.go b/auth/request.go index 17db1b2f64572d73a7601e606d72fa1d2fb5c2b1..f3f66aec7d1815c0d3ddeb52611f7f38ece8c8fd 100644 --- a/auth/request.go +++ b/auth/request.go @@ -15,11 +15,11 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" diff --git a/auth/sentRequestHandler.go b/auth/sentRequestHandler.go index f0e40fffb5f2fe47f68252dbbb9dc3cac3349642..aa4df76e7749db53194a8a33049427d8e66b40f6 100644 --- a/auth/sentRequestHandler.go +++ b/auth/sentRequestHandler.go @@ -9,8 +9,8 @@ package auth import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix/message" ) // sentRequestHandler interface which allows the lower level to register diff --git a/auth/state.go b/auth/state.go index a18baa7656ba4db4b812372f561732b3de172788..5dfafc023eb40a302305a85d626380717a526af1 100644 --- a/auth/state.go +++ b/auth/state.go @@ -11,14 +11,14 @@ import ( "encoding/base64" "github.com/pkg/errors" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" ) diff --git a/auth/state_test.go b/auth/state_test.go index 5dc12aca17520550e4857647e40c32bed212fcc4..a67179b5c242bb54c49787a8fbb4a3ad18b71efd 100644 --- a/auth/state_test.go +++ b/auth/state_test.go @@ -8,24 +8,24 @@ package auth import ( - "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/v4/e2e" "io" "math/rand" "testing" "time" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/storage" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/storage" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/auth/store/confirmation.go b/auth/store/confirmation.go index a7619fb3bfea265e1790cd0c1dc3cb6d4c5964a9..4f1ca8963bd0b818d66425afe0193f0a844edfda 100644 --- a/auth/store/confirmation.go +++ b/auth/store/confirmation.go @@ -10,7 +10,7 @@ package store import ( "encoding/base64" "encoding/json" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/auth/store/confirmation_test.go b/auth/store/confirmation_test.go index 570aeb0aa4077129ca429a7b8d27f0ae36c2ba32..b60f29f0a2d8f3d9149414bd9e4a2cd7e50c06b4 100644 --- a/auth/store/confirmation_test.go +++ b/auth/store/confirmation_test.go @@ -13,8 +13,8 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e/auth" diff --git a/auth/store/previousNegotiations.go b/auth/store/previousNegotiations.go index 6bc8931d78827ade1af9df355288ee761ca497d7..a0d3bc2fff082c5d405436d64c12dac422197162 100644 --- a/auth/store/previousNegotiations.go +++ b/auth/store/previousNegotiations.go @@ -9,12 +9,13 @@ package store import ( "bytes" + "crypto/hmac" "encoding/binary" "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -76,7 +77,7 @@ func (s *Store) CheckIfNegotiationIsNew(partner *id.ID, negotiationFingerprint [ // If the partner does exist and the fingerprint exists, then make no // changes to the list for i, fp := range fingerprints { - if bytes.Equal(fp, negotiationFingerprint) { + if hmac.Equal(fp, negotiationFingerprint) { newFingerprint = false // Latest = true if it is the last fingerprint in the list @@ -158,7 +159,7 @@ func marshalPreviousNegotiations(partners map[id.ID]bool) []byte { } // unmarshalPreviousNegotiations unmarshalls the marshalled json into a -//// list of partner IDs. +// // list of partner IDs. func unmarshalPreviousNegotiations(b []byte) (map[id.ID]bool, error) { unmarshal := make([]id.ID, 0) diff --git a/auth/store/previousNegotiations_test.go b/auth/store/previousNegotiations_test.go index e99414f7f5a8fb271e90941a78796da84df3fbe5..4c4f25a3065ebe4ed965ce5d78cdaf61921f9990 100644 --- a/auth/store/previousNegotiations_test.go +++ b/auth/store/previousNegotiations_test.go @@ -13,8 +13,8 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e/auth" diff --git a/auth/store/receivedRequest.go b/auth/store/receivedRequest.go index 63b338269f666f816b7d40e65db21417e7331b83..bc3bf8d7433f499dfbfb37a2cf38f3d3423d6d27 100644 --- a/auth/store/receivedRequest.go +++ b/auth/store/receivedRequest.go @@ -13,9 +13,9 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/rounds" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" ) diff --git a/auth/store/sentRequest.go b/auth/store/sentRequest.go index 7b0283766b9b0359157261bb327a263f0e627ab2..b8e95e44f7a0817caf1a3a693392238a46fbe648 100644 --- a/auth/store/sentRequest.go +++ b/auth/store/sentRequest.go @@ -16,8 +16,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" - "gitlab.com/elixxir/client/storage/versioned" + sidhinterface "gitlab.com/elixxir/client/v4/interfaces/sidh" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/auth/store/store.go b/auth/store/store.go index 5a42a0aa9cf2d356c62a4d23189746c16ef90349..b0c6f1ac74937cad79b938362bc692d63ef2dd04 100644 --- a/auth/store/store.go +++ b/auth/store/store.go @@ -14,8 +14,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/format" diff --git a/auth/store/store_test.go b/auth/store/store_test.go index acd6156c50ddca150e755826e8481fbb91c3d5f2..5c09170ce03aa335418a53f55c77fcc22d913e25 100644 --- a/auth/store/store_test.go +++ b/auth/store/store_test.go @@ -16,10 +16,10 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/cmix/rounds" - sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/rounds" + sidhinterface "gitlab.com/elixxir/client/v4/interfaces/sidh" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" diff --git a/auth/utils_test.go b/auth/utils_test.go index aa4689e7ae5bc74d38470e8179fd79b1a43fac68..c8742b7c0178ee70b4b45e40d755c598387643af 100644 --- a/auth/utils_test.go +++ b/auth/utils_test.go @@ -9,15 +9,15 @@ package auth import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/auth/store" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/auth/store" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" diff --git a/auth/verify.go b/auth/verify.go index d9a3259ecbf68067e07df6bac5dd3892a0113fb0..b40f9dca54d4a7c8b7cccd1815af9a37ae1e5526 100644 --- a/auth/verify.go +++ b/auth/verify.go @@ -8,7 +8,7 @@ package auth import ( - "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/v4/e2e" "gitlab.com/elixxir/crypto/contact" cAuth "gitlab.com/elixxir/crypto/e2e/auth" ) diff --git a/backup/backup.go b/backup/backup.go index b7fc57f5e3d46cb4e17277cc2d236b146cffd74f..464cc713ac95d3bff6c4aa9f7d32d07f4d5530b0 100644 --- a/backup/backup.go +++ b/backup/backup.go @@ -8,11 +8,11 @@ package backup import ( - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "sync" "time" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/id" diff --git a/backup/backupRestore.go b/backup/backupRestore.go index 2d408c173b49cd1a82d824b480bb3c2c47fcddce..4e146a707d72364cdd578e872a3b0984c4139d6a 100644 --- a/backup/backupRestore.go +++ b/backup/backupRestore.go @@ -10,12 +10,12 @@ package backup import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/ud" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/ud" + "gitlab.com/elixxir/client/v4/xxdk" cryptoBackup "gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/id" diff --git a/backup/backup_test.go b/backup/backup_test.go index 900ed84ec9abfe99389f19b1d26a369048f6daae..cc501ffcc930313af1174d8c3d5eb3edbfb9454f 100644 --- a/backup/backup_test.go +++ b/backup/backup_test.go @@ -9,13 +9,13 @@ package backup import ( "bytes" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "reflect" "testing" "time" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/crypto/backup" diff --git a/backup/jsonStorage.go b/backup/jsonStorage.go index 3e7b889f6bc2fc43ddbf14a95e01c325f39425f5..ac887bce8fc46dbbec86492ee15c8d76d9fdd972 100644 --- a/backup/jsonStorage.go +++ b/backup/jsonStorage.go @@ -8,7 +8,7 @@ package backup import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/backup/jsonStorage_test.go b/backup/jsonStorage_test.go index a5eb3d2bb06ef942612fcc6b2c86992e2c9adad0..02588ed20909c4014a1439c89d5b4937f78ed3e1 100644 --- a/backup/jsonStorage_test.go +++ b/backup/jsonStorage_test.go @@ -10,7 +10,7 @@ package backup import ( "testing" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" ) diff --git a/backup/keyStorage.go b/backup/keyStorage.go index f3164957954fe1eddb24fe5eaf69133484d1b550..d6b5afd8c01f7be0a56fa0d629ec2e791ff8ecf7 100644 --- a/backup/keyStorage.go +++ b/backup/keyStorage.go @@ -10,7 +10,7 @@ package backup import ( "bytes" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/backup" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/bindings/authenticatedConnection.go b/bindings/authenticatedConnection.go index 70ef4cf4921658b45223a9b7f254c1c1c029b67b..a32fc0b9b668f633f7d492b18e7352bc5777c1e0 100644 --- a/bindings/authenticatedConnection.go +++ b/bindings/authenticatedConnection.go @@ -12,7 +12,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/connect" + "gitlab.com/elixxir/client/v4/connect" "gitlab.com/elixxir/crypto/contact" ) diff --git a/bindings/backup.go b/bindings/backup.go index 50aaf5c29fb0aed49682fb582e158fb698ee9b9d..cf0d756b010f119add99ab5a02ebac69c649303d 100644 --- a/bindings/backup.go +++ b/bindings/backup.go @@ -9,7 +9,7 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/backup" + "gitlab.com/elixxir/client/v4/backup" "gitlab.com/xx_network/primitives/id" ) diff --git a/bindings/channels.go b/bindings/channels.go index f58af96029bfeb55ff800e13d6be032185e2823e..fcd8e2d460e599e70d08e78ef39ebbbca744d42e 100644 --- a/bindings/channels.go +++ b/bindings/channels.go @@ -15,11 +15,11 @@ import ( "time" "github.com/pkg/errors" - "gitlab.com/elixxir/client/channels" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/channels" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/rsa" @@ -906,6 +906,9 @@ func (cm *ChannelsManager) SendAdminGeneric(adminPrivateKey, chanMsgId, rnd, ephId, err := cm.api.SendAdminGeneric(rsaPrivKey, chanId, msgTy, message, time.Duration(leaseTimeMS), params.CMIX) + if err != nil { + return nil, err + } // Construct send report return constructChannelSendReport(chanMsgId, rnd.ID, ephId) diff --git a/bindings/cmix.go b/bindings/cmix.go index 5b5683f8aedb3e0e57f087de749c5e090823f0c0..1088c5c4c985a1d3a96e555972470d3278fc505d 100644 --- a/bindings/cmix.go +++ b/bindings/cmix.go @@ -12,7 +12,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" ) // init sets the log level to INFO. diff --git a/bindings/connect.go b/bindings/connect.go index df3d4ae46c7f7c0a016ecd75fb576e0e48c98e87..4a5a5175c69119b7b60a4334680d778cd99f998b 100644 --- a/bindings/connect.go +++ b/bindings/connect.go @@ -13,9 +13,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" ) diff --git a/bindings/delivery.go b/bindings/delivery.go index a645e9412dbbc99e49272843241f0dc22058c838..c57d548f339614e1636d4b5ea2210ee65ccb6cbd 100644 --- a/bindings/delivery.go +++ b/bindings/delivery.go @@ -14,7 +14,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "gitlab.com/xx_network/primitives/id" ) diff --git a/bindings/dummy.go b/bindings/dummy.go index e0915c6cf91022f8556a829787189f6bb0eaaf56..7f61560b42dc4a93844f7218a77a02c5c6792b23 100644 --- a/bindings/dummy.go +++ b/bindings/dummy.go @@ -8,7 +8,7 @@ package bindings import ( - "gitlab.com/elixxir/client/dummy" + "gitlab.com/elixxir/client/v4/dummy" "time" ) diff --git a/bindings/e2e.go b/bindings/e2e.go index c072c5cb4e0d6393a27e790d2c6c3b0852d79502..a5a133719406849c76f38356342bfde4149b47f3 100644 --- a/bindings/e2e.go +++ b/bindings/e2e.go @@ -13,9 +13,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" ) diff --git a/bindings/e2eAuth.go b/bindings/e2eAuth.go index f7c01b53650eb210398cf6be27289a8ef3f6de18..0576f231ad9855d5fc7e50211e0883c0ea2fe9d3 100644 --- a/bindings/e2eAuth.go +++ b/bindings/e2eAuth.go @@ -9,7 +9,7 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/id" diff --git a/bindings/e2eHandler.go b/bindings/e2eHandler.go index 4b63407520f8e1aa756f2e749e4b0971fc72fdd2..5853560f15925da5332cf1a3a20e4f111ec96083 100644 --- a/bindings/e2eHandler.go +++ b/bindings/e2eHandler.go @@ -13,9 +13,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" ) diff --git a/bindings/fileTransfer.go b/bindings/fileTransfer.go index 4b8b5adde300191ba85b524fdd1499c3319b1998..a8c98a4820e9ed6ad243e8bd7ed640911f01c962 100644 --- a/bindings/fileTransfer.go +++ b/bindings/fileTransfer.go @@ -8,12 +8,14 @@ package bindings import ( + "encoding/base64" "encoding/json" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "time" - "gitlab.com/elixxir/client/fileTransfer" - "gitlab.com/elixxir/client/fileTransfer/e2e" + "gitlab.com/elixxir/client/v4/fileTransfer" + "gitlab.com/elixxir/client/v4/fileTransfer/e2e" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" ) @@ -23,62 +25,77 @@ import ( //////////////////////////////////////////////////////////////////////////////// // FileTransfer object is a bindings-layer struct which wraps a -// fileTransfer.FileTransfer interface. +// [fileTransfer.FileTransfer] interface. type FileTransfer struct { w *e2e.Wrapper } -// ReceivedFile is a public struct that contains the metadata of a new file -// transfer. +// ReceivedFile contains the metadata of a new received file transfer. It is +// received from a sender on a new file transfer. It is returned by +// [ReceiveFileCallback.Callback]. // // Example JSON: // { -// "TransferID":"B4Z9cwU18beRoGbk5xBjbcd5Ryi9ZUFA2UBvi8FOHWo=", -// "SenderID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", -// "Preview":"aXQncyBtZSBhIHByZXZpZXc=", -// "Name":"testfile.txt", -// "Type":"text file", -// "Size":2048 +// "TransferID": "0U+QY1nMOUzQGxGpqZyxDw8Cd6+qm8t870CzLtVoUM8=", +// "SenderID": "UL3+S8XdJHAfUtCUm7iZMxW8orR8Nd5JM9Ky7/5jds8D", +// "Preview": "aXQNcyBtZSBhIHByZXZpZXc=", +// "Name": "testfile.txt", +// "Type": "text file", +// "Size": 2048 // } type ReceivedFile struct { - TransferID []byte // ID of the file transfer - SenderID []byte // ID of the file sender - Preview []byte // A preview of the file - Name string // Name of the file - Type string // String that indicates type of file - Size int // The size of the file, in bytes + TransferID *ftCrypto.TransferID // ID of the file transfer + SenderID *id.ID // ID of the file sender + Preview []byte // A preview of the file + Name string // Name of the file + Type string // String that indicates type of file + Size int // The size of the file, in bytes } -// FileSend is a public struct that contains the file contents and its name, -// type, and preview. +// FileSend contains the file and its metadata to send. This structure is JSON +// marshalled and passed as the payload to [FileTransfer.Send]. +// +// Example JSON: // { -// "Name":"testfile.txt", -// "Type":"text file", -// "Preview":"aXQncyBtZSBhIHByZXZpZXc=", -// "Contents":"VGhpcyBpcyB0aGUgZnVsbCBjb250ZW50cyBvZiB0aGUgZmlsZSBpbiBieXRlcw==" +// "Name": "testfile.txt", +// "Type": "text file", +// "Preview": "RMlsZSBwCmV2aWV3Lg==", +// "Contents": "RMlsZSBjb250ZW50cy4=" // } type FileSend struct { - Name string // Name of the file - Type string // String that indicates type of file - Preview []byte // A preview of the file - Contents []byte // Full contents of the file + // Name is the human-readable file name. Get max length from + // [FileTransfer.MaxFileNameLen]. + Name string + + // Type is a shorthand that identifies the type of file. Get max length from + // [FileTransfer.MaxFileTypeLen]. + Type string + + // Preview of the file data (e.g. a thumbnail). Get max length from + // [FileTransfer.MaxPreviewSize]. + Preview []byte + + // Contents is the full file contents. Get max length from + // [FileTransfer.MaxFileSize]. + Contents []byte } -// Progress is a public struct that represents the progress of an in-progress -// file transfer. +// Progress contains the progress information of a transfer. It is returned by +// [FileTransferSentProgressCallback.Callback] and +// [FileTransferReceiveProgressCallback.Callback]. // // Example JSON: // { -// "Completed":false, -// "Transmitted":128, -// "Total":2048, -// "Err":null +// "TransferID": "RyJcMqtI3IIM1+YMxRwCcFiOX6AGuIzS+vQaPnqXVT8=", +// "Completed": false, +// "Transmitted": 128, +// "Total": 2048 // } type Progress struct { - Completed bool // Status of transfer (true if done) - Transmitted int // Number of file parts sent/received - Total int // Total number of file parts - Err error // Error status (if any) + TransferID *ftCrypto.TransferID // Transfer ID + Completed bool // Status of transfer (true if done) + Transmitted int // Number of file parts sent/received + Total int // Total number of file parts } // ReceiveFileCallback is a bindings-layer interface that contains a callback @@ -87,33 +104,42 @@ type ReceiveFileCallback interface { // Callback is called when a new file transfer is received. // // Parameters: - // - payload - the JSON marshalled bytes of a ReceivedFile object. - // - err - any errors that occurred during reception - Callback(payload []byte, err error) + // - payload - JSON of [ReceivedFile], which contains information about the + // incoming file transfer. + Callback(payload []byte) } // FileTransferSentProgressCallback is a bindings-layer interface that contains // a callback that is called when the sent progress updates. type FileTransferSentProgressCallback interface { - // Callback is called when a file part is sent or an error occurs. + // Callback is called when a file part is sent or an error occurs. Once a + // transfer completes, it should be closed using [FileTransfer.CloseSend]. // // Parameters: - // - payload - the JSON marshalled bytes of a Progress object. - // - t - tracker that allows the lookup of the status of any file part - // - err - any errors that occurred during sending + // - payload - JSON of [Progress], which describes the progress of the + // current transfer. + // - t - file part tracker that allows the lookup of the status of + // individual file parts. + // - err - Fatal errors during sending. If an error is returned, the + // transfer has failed and will not resume. It must be cleared using + // [FileTransfer.CloseSend]. Callback(payload []byte, t *FilePartTracker, err error) } // FileTransferReceiveProgressCallback is a bindings-layer interface that is // called with the progress of a received file. -// type FileTransferReceiveProgressCallback interface { - // Callback is called when a file part is sent or an error occurs. + // Callback is called when a file part is received or an error occurs. Once + // a transfer completes, the file can be received using + // [FileTransfer.Receive]. // // Parameters: - // - payload - the JSON marshalled bytes of a Progress object. - // - t - tracker that allows the lookup of the status of any file part - // - err - any errors that occurred during sending + // - payload - JSON of [Progress], which describes the progress of the + // current transfer. + // - t - file part tracker that allows the lookup of the status of + // individual file parts. + // - err - Fatal errors during receiving. If an error is returned, the + // transfer has failed and will not resume. Callback(payload []byte, t *FilePartTracker, err error) } @@ -124,18 +150,28 @@ type FileTransferReceiveProgressCallback interface { // InitFileTransfer creates a bindings-level file transfer manager. // // Parameters: -// - e2eID - e2e object ID in the tracker -// - paramsJSON - JSON marshalled fileTransfer.Params +// - e2eID - ID of [E2e] object in tracker. +// - receiveFileCallback - A callback that is called when a new file transfer +// is received. +// - e2eFileTransferParamsJson - JSON of +// [gitlab.com/elixxir/client/v4/fileTransfer/e2e.Params]. +// - fileTransferParamsJson - JSON of [fileTransfer.Params]. +// +// Returns: +// - New [FileTransfer] object. func InitFileTransfer(e2eID int, receiveFileCallback ReceiveFileCallback, e2eFileTransferParamsJson, fileTransferParamsJson []byte) (*FileTransfer, error) { - jww.INFO.Printf("Calling InitFileTransfer()") + jww.INFO.Printf("[FT] Calling InitFileTransfer(e2eID:%d params:%s)", + e2eID, fileTransferParamsJson) + // Get user from singleton user, err := e2eTrackerSingleton.get(e2eID) if err != nil { return nil, err } - e2eFileTransferParams, err := parseE2eFileTransferParams(e2eFileTransferParamsJson) + e2eFileTransferParams, err := + parseE2eFileTransferParams(e2eFileTransferParamsJson) if err != nil { return nil, err } @@ -147,17 +183,26 @@ func InitFileTransfer(e2eID int, receiveFileCallback ReceiveFileCallback, // Create file transfer manager m, err := fileTransfer.NewManager(fileTransferParams, user.api) + if err != nil { + return nil, errors.Errorf( + "could not create new file transfer manager: %+v", err) + } rcb := func(tid *ftCrypto.TransferID, fileName, fileType string, sender *id.ID, size uint32, preview []byte) { - receiveFileCallback.Callback(json.Marshal(ReceivedFile{ - TransferID: tid.Bytes(), - SenderID: sender.Marshal(), + data, err := json.Marshal(ReceivedFile{ + TransferID: tid, + SenderID: sender, Preview: preview, Name: fileName, Type: fileType, Size: int(size), - })) + }) + if err != nil { + jww.FATAL.Panicf( + "[FT] Failed to JSON marshal ReceivedFile: %+v", err) + } + receiveFileCallback.Callback(data) } w, err := e2e.NewWrapper(rcb, e2eFileTransferParams, m, user.api) @@ -175,21 +220,31 @@ func InitFileTransfer(e2eID int, receiveFileCallback ReceiveFileCallback, return &FileTransfer{w: w}, nil } -// Send is the bindings-level function for sending a file. +// Send initiates the sending of a file to a recipient and returns a transfer ID +// that uniquely identifies this file transfer. Progress for the file transfer +// is reported to that passed in callback. // // Parameters: -// - payload - JSON marshalled FileSend -// - recipientID - marshalled recipient id.ID -// - retry - number of retries allowed -// - callback - callback that reports file sending progress -// - period - Duration (in ms) to wait between progress callbacks triggering. -// This value should depend on how frequently you want to receive updates, -// and should be tuned to your implementation. +// - payload - JSON of [FileSend], which contains the file contents and its +// metadata. +// - recipientID - marshalled bytes of the recipient's [id.ID]. +// - retry - The number of sending retries allowed on send failure (e.g. a +// retry of 2.0 with 6 parts means 12 total possible sends). +// - callback - A callback that reports the progress of the file transfer. The +// callback is called once on initialization, on every progress update (or +// less if restricted by the period), or on fatal error. +// - period - The progress callback will be limited from triggering only once +// per period. It is a duration in milliseconds. This value should depend on +// how frequently you want to receive updates, and should be tuned to your +// implementation. // // Returns: -// - []byte - unique file transfer ID +// - The bytes of the unique [fileTransfer.TransferID]. func (f *FileTransfer) Send(payload, recipientID []byte, retry float32, callback FileTransferSentProgressCallback, period int) ([]byte, error) { + jww.INFO.Printf("[FT] Sending file transfer to %s.", + base64.StdEncoding.EncodeToString(recipientID)) + // Unmarshal recipient ID recipient, err := id.Unmarshal(recipientID) if err != nil { @@ -201,25 +256,29 @@ func (f *FileTransfer) Send(payload, recipientID []byte, retry float32, // Wrap transfer progress callback to be passed to fileTransfer layer cb := func(completed bool, arrived, total uint16, st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) { - prog := &Progress{ + progress := &Progress{ + TransferID: st.TransferID(), Completed: completed, Transmitted: int(arrived), Total: int(total), - Err: err, } - pm, err := json.Marshal(prog) + pm, err2 := json.Marshal(progress) + if err2 != nil { + jww.FATAL.Panicf( + "[FT] Failed to JSON marshal sent Progress object: %+v", err) + } callback.Callback(pm, &FilePartTracker{t}, err) } // Unmarshal payload - fs := &FileSend{} - err = json.Unmarshal(payload, fs) - if err != nil { + var fs FileSend + if err = json.Unmarshal(payload, &fs); err != nil { return nil, err } // Send file - ftID, err := f.w.Send(recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p) + ftID, err := f.w.Send( + recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p) if err != nil { return nil, err } @@ -230,28 +289,28 @@ func (f *FileTransfer) Send(payload, recipientID []byte, retry float32, // Receive returns the full file on the completion of the transfer. It deletes // internal references to the data and unregisters any attached progress -// callbacks. Returns an error if the transfer is not complete, the full file +// callback. Returns an error if the transfer is not complete, the full file // cannot be verified, or if the transfer cannot be found. // -// Receive can only be called once the progress callback returns that the -// file transfer is complete. +// Receive can only be called once the progress callback returns that the file +// transfer is complete. // // Parameters: -// - tidBytes - file transfer ID +// - tidBytes - The file transfer's unique [fileTransfer.TransferID]. func (f *FileTransfer) Receive(tidBytes []byte) ([]byte, error) { tid := ftCrypto.UnmarshalTransferID(tidBytes) return f.w.Receive(&tid) } // CloseSend deletes a file from the internal storage once a transfer has -// completed or reached the retry limit. Returns an error if the transfer has -// not run out of retries. +// completed or reached the retry limit. If neither of those condition are met, +// an error is returned. // // This function should be called once a transfer completes or errors out (as // reported by the progress callback). // // Parameters: -// - tidBytes - file transfer ID +// - tidBytes - the file transfer's unique [fileTransfer.TransferID]. func (f *FileTransfer) CloseSend(tidBytes []byte) error { tid := ftCrypto.UnmarshalTransferID(tidBytes) return f.w.CloseSend(&tid) @@ -264,26 +323,39 @@ func (f *FileTransfer) CloseSend(tidBytes []byte) error { // RegisterSentProgressCallback allows for the registration of a callback to // track the progress of an individual sent file transfer. // -// SentProgressCallback is auto registered on Send; this function should be -// called when resuming clients or registering extra callbacks. +// The callback will be called immediately when added to report the current +// progress of the transfer. It will then call every time a file part +// arrives, the transfer completes, or a fatal error occurs. It is called at +// most once every period regardless of the number of progress updates. +// +// In the event that the client is closed and resumed, this function must be +// used to re-register any callbacks previously registered with this +// function or Send. // // Parameters: -// - tidBytes - file transfer ID -// - callback - callback that reports file reception progress -// - period - Duration (in ms) to wait between progress callbacks triggering. -// This value should depend on how frequently you want to receive updates, -// and should be tuned to your implementation. +// - tidBytes - The file transfer's unique [fileTransfer.TransferID]. +// - callback - A callback that reports the progress of the file transfer. The +// callback is called once on initialization, on every progress update (or +// less if restricted by the period), or on fatal error. +// - period - The progress callback will be limited from triggering only once +// per period. It is a duration in milliseconds. This value should depend on +// how frequently you want to receive updates, and should be tuned to your +// implementation. func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte, callback FileTransferSentProgressCallback, period int) error { cb := func(completed bool, arrived, total uint16, st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) { - prog := &Progress{ + progress := &Progress{ + TransferID: st.TransferID(), Completed: completed, Transmitted: int(arrived), Total: int(total), - Err: err, } - pm, err := json.Marshal(prog) + pm, err2 := json.Marshal(progress) + if err2 != nil { + jww.FATAL.Panicf( + "[FT] Failed to JSON marshal sent Progress object: %+v", err) + } callback.Callback(pm, &FilePartTracker{t}, err) } p := time.Millisecond * time.Duration(period) @@ -295,25 +367,42 @@ func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte, // RegisterReceivedProgressCallback allows for the registration of a callback to // track the progress of an individual received file transfer. // -// This should be done when a new transfer is received on the ReceiveCallback. +// The callback will be called immediately when added to report the current +// progress of the transfer. It will then call every time a file part is +// received, the transfer completes, or a fatal error occurs. It is called at +// most once every period regardless of the number of progress updates. +// +// In the event that the client is closed and resumed, this function must be +// used to re-register any callbacks previously registered. +// +// Once the callback reports that the transfer has completed, the recipient can +// get the full file by calling Receive. // // Parameters: -// - tidBytes - file transfer ID -// - callback - callback that reports file reception progress -// - period - Duration (in ms) to wait between progress callbacks triggering. -// This value should depend on how frequently you want to receive updates, -// and should be tuned to your implementation. +// - tidBytes - The file transfer's unique [fileTransfer.TransferID]. +// - callback - A callback that reports the progress of the file transfer. The +// callback is called once on initialization, on every progress update (or +// less if restricted by the period), or on fatal error. +// - period - The progress callback will be limited from triggering only once +// per period. It is a duration in milliseconds. This value should depend on +// how frequently you want to receive updates, and should be tuned to your +// implementation. func (f *FileTransfer) RegisterReceivedProgressCallback(tidBytes []byte, callback FileTransferReceiveProgressCallback, period int) error { cb := func(completed bool, received, total uint16, - rt fileTransfer.ReceivedTransfer, t fileTransfer.FilePartTracker, err error) { - prog := &Progress{ + rt fileTransfer.ReceivedTransfer, t fileTransfer.FilePartTracker, + err error) { + progress := &Progress{ + TransferID: rt.TransferID(), Completed: completed, Transmitted: int(received), Total: int(total), - Err: err, } - pm, err := json.Marshal(prog) + pm, err2 := json.Marshal(progress) + if err2 != nil { + jww.FATAL.Panicf( + "[FT] Failed to JSON marshal received Progress object: %+v", err) + } callback.Callback(pm, &FilePartTracker{t}, err) } p := time.Millisecond * time.Duration(period) @@ -380,10 +469,10 @@ func (fpt FilePartTracker) GetNumParts() int { // // Example JSON: // { -// "Priority":1, -// "Category":"Test Events", -// "EventType":"Ping", -// "Details":"This is an example of an event report" +// "Priority": 1, +// "Category": "Test Events", +// "EventType": "Ping", +// "Details": "This is an example of an event report" // } type EventReport struct { Priority int diff --git a/bindings/fileTransfer_test.go b/bindings/fileTransfer_test.go index 81a0679e0a9737e4db9465e23d8d3519d70b9b9b..462658c61c49554f0882ee2dfb441f3f7f433c8c 100644 --- a/bindings/fileTransfer_test.go +++ b/bindings/fileTransfer_test.go @@ -9,6 +9,7 @@ package bindings import ( "encoding/json" + "fmt" "testing" "gitlab.com/elixxir/crypto/fileTransfer" @@ -16,52 +17,53 @@ import ( "gitlab.com/xx_network/primitives/id" ) +// Creates example JSON outputs used in documentation. func TestFileTransfer_inputs(t *testing.T) { - fs := &FileSend{ - Name: "testfile.txt", - Type: "text file", - Preview: []byte("it's me a preview"), - Contents: []byte("This is the full contents of the file in bytes"), - } - fsm, _ := json.Marshal(fs) - t.Log("FileSend example json:") - t.Log(string(fsm)) - t.Log("\n") - + // ReceivedFile tid, _ := fileTransfer.NewTransferID(csprng.NewSystemRNG()) - sid := id.NewIdFromString("zezima", id.User, t) + sid, _ := id.NewRandomID(csprng.NewSystemRNG(), id.User) rf := &ReceivedFile{ - TransferID: tid.Bytes(), - SenderID: sid.Marshal(), + TransferID: &tid, + SenderID: sid, Preview: []byte("it's me a preview"), Name: "testfile.txt", Type: "text file", Size: 2048, } - rfm, _ := json.Marshal(rf) - t.Log("ReceivedFile example json:") - t.Log(string(rfm)) - t.Log("\n") + rfm, _ := json.MarshalIndent(rf, "", " ") + t.Log("ReceivedFile example JSON:") + fmt.Printf("%s\n\n", rfm) + + // FileSend + fs := &FileSend{ + Name: "testFile", + Type: "txt", + Preview: []byte("File preview."), + Contents: []byte("File contents."), + } + fsm, _ := json.MarshalIndent(fs, "", " ") + t.Log("FileSend example JSON:") + fmt.Printf("%s\n\n", fsm) + // Progress p := &Progress{ + TransferID: &tid, Completed: false, Transmitted: 128, Total: 2048, - Err: nil, } - pm, _ := json.Marshal(p) - t.Log("Progress example json:") - t.Log(string(pm)) - t.Log("\n") + pm, _ := json.MarshalIndent(p, "", " ") + t.Log("Progress example JSON:") + fmt.Printf("%s\n\n", pm) + // EventReport er := &EventReport{ Priority: 1, Category: "Test Events", EventType: "Ping", Details: "This is an example of an event report", } - erm, _ := json.Marshal(er) - t.Log("EventReport example json:") - t.Log(string(erm)) - t.Log("\n") + erm, _ := json.MarshalIndent(er, "", " ") + t.Log("EventReport example JSON:") + fmt.Printf("%s\n\n", erm) } diff --git a/bindings/follow.go b/bindings/follow.go index 08a9d0bffe2ed250c076b918c76926b0e2544cfa..b545981892576fc3136854e3af8a07cd3ae1c2e3 100644 --- a/bindings/follow.go +++ b/bindings/follow.go @@ -11,7 +11,7 @@ import ( "encoding/json" "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/message" "time" "github.com/pkg/errors" @@ -28,28 +28,28 @@ import ( // they are stopped if there is no internet access. // // Threads Started: -// - Network Follower (/network/follow.go) -// tracks the network events and hands them off to workers for handling. -// - Historical Round Retrieval (/network/rounds/historical.go) -// retrieves data about rounds that are too old to be stored by the client. -// - Message Retrieval Worker Group (/network/rounds/retrieve.go) -// requests all messages in a given round from the gateway of the last nodes. -// - Message Handling Worker Group (/network/message/handle.go) -// decrypts and partitions messages when signals via the Switchboard. -// - Health Tracker (/network/health), -// via the network instance, tracks the state of the network. -// - Garbled Messages (/network/message/garbled.go) -// can be signaled to check all recent messages that could be decoded. It -// uses a message store on disk for persistence. -// - Critical Messages (/network/message/critical.go) -// ensures all protocol layer mandatory messages are sent. It uses a message -// store on disk for persistence. -// - KeyExchange Trigger (/keyExchange/trigger.go) -// responds to sent rekeys and executes them. -// - KeyExchange Confirm (/keyExchange/confirm.go) -// responds to confirmations of successful rekey operations. -// - Auth Callback (/auth/callback.go) -// handles both auth confirm and requests. +// - Network Follower (/network/follow.go) +// tracks the network events and hands them off to workers for handling. +// - Historical Round Retrieval (/network/rounds/historical.go) +// retrieves data about rounds that are too old to be stored by the client. +// - Message Retrieval Worker Group (/network/rounds/retrieve.go) +// requests all messages in a given round from the gateway of the last nodes. +// - Message Handling Worker Group (/network/message/handle.go) +// decrypts and partitions messages when signals via the Switchboard. +// - Health Tracker (/network/health), +// via the network instance, tracks the state of the network. +// - Garbled Messages (/network/message/garbled.go) +// can be signaled to check all recent messages that could be decoded. It +// uses a message store on disk for persistence. +// - Critical Messages (/network/message/critical.go) +// ensures all protocol layer mandatory messages are sent. It uses a message +// store on disk for persistence. +// - KeyExchange Trigger (/keyExchange/trigger.go) +// responds to sent rekeys and executes them. +// - KeyExchange Confirm (/keyExchange/confirm.go) +// responds to confirmations of successful rekey operations. +// - Auth Callback (/auth/callback.go) +// handles both auth confirm and requests. func (c *Cmix) StartNetworkFollower(timeoutMS int) error { timeout := time.Duration(timeoutMS) * time.Millisecond return c.api.StartNetworkFollower(timeout) @@ -106,10 +106,11 @@ func (c *Cmix) ReadyToSend() bool { // is to being ready. // // Example JSON: -// { -// "IsReady": true, -// "HowClose": 0.534 -// } +// +// { +// "IsReady": true, +// "HowClose": 0.534 +// } type IsReadyInfo struct { IsReady bool HowClose float64 @@ -117,9 +118,10 @@ type IsReadyInfo struct { // NetworkFollowerStatus gets the state of the network follower. It returns a // status with the following values: -// Stopped - 0 -// Running - 2000 -// Stopping - 3000 +// +// Stopped - 0 +// Running - 2000 +// Stopping - 3000 func (c *Cmix) NetworkFollowerStatus() int { return int(c.api.NetworkFollowerStatus()) } @@ -134,11 +136,11 @@ type NodeRegistrationReport struct { // GetNodeRegistrationStatus returns the current state of node registration. // // Returns: -// - []byte - A marshalled NodeRegistrationReport containing the number of -// nodes the user is registered with and the number of nodes present in the -// NDF. -// - An error if it cannot get the node registration status. The most likely -// cause is that the network is unhealthy. +// - []byte - A marshalled NodeRegistrationReport containing the number of +// nodes the user is registered with and the number of nodes present in the +// NDF. +// - An error if it cannot get the node registration status. The most likely +// cause is that the network is unhealthy. func (c *Cmix) GetNodeRegistrationStatus() ([]byte, error) { numNodesRegistered, numNodes, err := c.api.GetNodeRegistrationStatus() if err != nil { @@ -158,11 +160,11 @@ func (c *Cmix) GetNodeRegistrationStatus() ([]byte, error) { // be a percent (0-1) of node registrations completed. // // Parameters: -// - percentReady - The percentage of nodes required to be registered with to -// be ready. This is a number between 0 and 1. +// - percentReady - The percentage of nodes required to be registered with to +// be ready. This is a number between 0 and 1. // // Returns: -// - JSON of [IsReadyInfo]. +// - JSON of [IsReadyInfo]. func (c *Cmix) IsReady(percentReady float64) ([]byte, error) { isReady, howClose := c.api.IsReady(percentReady) return json.Marshal(&IsReadyInfo{isReady, howClose}) @@ -172,8 +174,8 @@ func (c *Cmix) IsReady(percentReady float64) ([]byte, error) { // resume them. // // Parameters: -// - timeoutMS - The timeout, in milliseconds, to wait when stopping threads -// before failing. +// - timeoutMS - The timeout, in milliseconds, to wait when stopping threads +// before failing. func (c *Cmix) PauseNodeRegistrations(timeoutMS int) error { timeout := time.Duration(timeoutMS) * time.Millisecond return c.api.PauseNodeRegistrations(timeout) @@ -183,9 +185,9 @@ func (c *Cmix) PauseNodeRegistrations(timeoutMS int) error { // registrations up to the initialized maximum. // // Parameters: -// - toRun - The number of parallel node registrations. -// - timeoutMS - The timeout, in milliseconds, to wait when changing node -// registrations before failing. +// - toRun - The number of parallel node registrations. +// - timeoutMS - The timeout, in milliseconds, to wait when changing node +// registrations before failing. func (c *Cmix) ChangeNumberOfNodeRegistrations(toRun, timeoutMS int) error { timeout := time.Duration(timeoutMS) * time.Millisecond return c.api.ChangeNumberOfNodeRegistrations(toRun, timeout) @@ -212,13 +214,14 @@ func (c *Cmix) IsHealthy() bool { // conditions if multiple threads are in the process of starting or stopping. // // Returns: -// - []byte - A JSON marshalled list of all running processes. +// - []byte - A JSON marshalled list of all running processes. // // JSON Example: -// { -// "FileTransfer{BatchBuilderThread, FilePartSendingThread#0, FilePartSendingThread#1, FilePartSendingThread#2, FilePartSendingThread#3}", -// "MessageReception Worker 0" -// } +// +// { +// "FileTransfer{BatchBuilderThread, FilePartSendingThread#0, FilePartSendingThread#1, FilePartSendingThread#2, FilePartSendingThread#3}", +// "MessageReception Worker 0" +// } func (c *Cmix) GetRunningProcesses() ([]byte, error) { return json.Marshal(c.api.GetRunningProcesses()) } @@ -262,45 +265,74 @@ func (c *Cmix) RegisterClientErrorCallback(clientError ClientError) { // there is an error for the second parameter which will be non-null. // // Parameters: -// - marshalData - JSON marshalled bytes of [message.ServiceList], which is an -// array of [id.ID] and [message.Service]. -// - err - JSON unmarshalling error +// - marshalData - JSON marshalled bytes of [message.ServiceList], which is an +// array of [id.ID] and [message.Service]. +// - err - JSON unmarshalling error // // Example JSON: -// [ -// { -// "Id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // bytes of id.ID encoded as base64 string -// "Services": [ -// { -// "Identifier": "AQID", // bytes encoded as base64 string -// "Tag": "TestTag 1", // string -// "Metadata": "BAUG" // bytes encoded as base64 string -// } -// ] -// }, -// { -// "Id": "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", -// "Services": [ -// { -// "Identifier": "AQID", -// "Tag": "TestTag 2", -// "Metadata": "BAUG" -// } -// ] -// }, -// ] +// +// [ +// { +// "Id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // bytes of id.ID encoded as base64 string +// "Services": [ +// { +// "Identifier": "AQID", // bytes encoded as base64 string +// "Tag": "TestTag 1", // string +// "Metadata": "BAUG" // bytes encoded as base64 string +// } +// ] +// }, +// { +// "Id": "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", +// "Services": [ +// { +// "Identifier": "AQID", +// "Tag": "TestTag 2", +// "Metadata": "BAUG" +// } +// ] +// }, +// ] type TrackServicesCallback interface { Callback(marshalData []byte, err error) } +// TrackServicesWithIdentity will return via a callback the list of services the +// backend keeps track of for the provided identity. This may be passed into +// other bindings call which may need context on the available services for this +// single identity. This will only return services for the given identity. +// +// Parameters: +// - e2eID - e2e object ID in the tracker. +// - cb - A TrackServicesCallback, which will be passed the marshalled +// message.ServiceList. +func (c *Cmix) TrackServicesWithIdentity(e2eId int, + cb TrackServicesCallback) error { + // Retrieve the user from the tracker + user, err := e2eTrackerSingleton.get(e2eId) + if err != nil { + return err + } + + receptionId := user.api.GetReceptionIdentity().ID + c.api.GetCmix().TrackServices(func(list message.ServiceList) { + res := make(message.ServiceList) + res[*receptionId] = list[*receptionId] + cb.Callback(json.Marshal(res)) + }) + + return nil +} + // TrackServices will return via a callback the list of services the // backend keeps track of, which is formally referred to as a // [message.ServiceList]. This may be passed into other bindings call which -// may need context on the available services for this client. +// may need context on the available services for this client. This will +// provide services for all identities that the client tracks. // // Parameters: -// - cb - A TrackServicesCallback, which will be passed the marshalled -// message.ServiceList. +// - cb - A TrackServicesCallback, which will be passed the marshalled +// message.ServiceList. func (c *Cmix) TrackServices(cb TrackServicesCallback) { c.api.GetCmix().TrackServices(func(list message.ServiceList) { cb.Callback(json.Marshal(list)) diff --git a/bindings/group.go b/bindings/group.go index b7faa628b8b1439b27b0f27413b7049e0f926a97..10aa4ffc9fa18fdff5e8948cc1abc7b938c14221 100644 --- a/bindings/group.go +++ b/bindings/group.go @@ -11,10 +11,10 @@ import ( "encoding/json" "fmt" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - gc "gitlab.com/elixxir/client/groupChat" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + gc "gitlab.com/elixxir/client/v4/groupChat" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "time" diff --git a/bindings/identity.go b/bindings/identity.go index c48bd0d18814ae65037ed0a0cfd715fb7b8210ee..fbb43182845fc0097a79f44b0f53aae4e78b235b 100644 --- a/bindings/identity.go +++ b/bindings/identity.go @@ -9,7 +9,7 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" ) diff --git a/bindings/listener.go b/bindings/listener.go index 8eaf0faff2e58bb188a9451f624d2eae1926bd9c..4847ae85eef62bda113bff64d9286fbdbd212e29 100644 --- a/bindings/listener.go +++ b/bindings/listener.go @@ -11,7 +11,7 @@ import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" ) // Listener provides a callback to hear a message. diff --git a/bindings/ndf.go b/bindings/ndf.go index 605d5fa7ec6abdab136410893c14f5f06ff034f3..356ea30d38c47353ed5714bc70fbacad1e9feb26 100644 --- a/bindings/ndf.go +++ b/bindings/ndf.go @@ -7,7 +7,7 @@ package bindings -import "gitlab.com/elixxir/client/xxdk" +import "gitlab.com/elixxir/client/v4/xxdk" // DownloadAndVerifySignedNdfWithUrl retrieves the NDF from a specified URL. // The NDF is processed into a protobuf containing a signature that is verified diff --git a/bindings/notifications.go b/bindings/notifications.go index 217accf1163a6d12d426a0ebd90f6902f9e05244..2f35cf51c5ae9d1b93bb91b63dab1729f521115d 100644 --- a/bindings/notifications.go +++ b/bindings/notifications.go @@ -9,7 +9,7 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/message" "gitlab.com/elixxir/primitives/notifications" ) @@ -17,23 +17,24 @@ import ( // via GetNotificationsReport as a JSON marshalled byte data. // // Example JSON: -// [ -// { -// "ForMe": true, // boolean -// "Type": "e2e", // string -// "Source": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" // bytes of id.ID encoded as base64 string -// }, -// { -// "ForMe": true, -// "Type": "e2e", -// "Source": "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" -// }, -// { -// "ForMe": true, -// "Type": "e2e", -// "Source": "AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" -// } -// ] +// +// [ +// { +// "ForMe": true, // boolean +// "Type": "e2e", // string +// "Source": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" // bytes of id.ID encoded as base64 string +// }, +// { +// "ForMe": true, +// "Type": "e2e", +// "Source": "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" +// }, +// { +// "ForMe": true, +// "Type": "e2e", +// "Source": "AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD" +// } +// ] type NotificationReports []NotificationReport // TODO: The table in the docstring below needs to be checked for completeness @@ -44,27 +45,28 @@ type NotificationReports []NotificationReport // this user. // // Example NotificationReport JSON: -// { -// "ForMe": true, -// "Type": "e2e", -// "Source": "dGVzdGVyMTIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -// } +// +// { +// "ForMe": true, +// "Type": "e2e", +// "Source": "dGVzdGVyMTIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +// } // // Given the Type, the Source value will have specific contextual meanings. // Below is a table that will define the contextual meaning of the Source field // given all possible Type fields. // -// TYPE | SOURCE | DESCRIPTION -// ----------+--------------------+-------------------------------------------------------- -// "default" | recipient user ID | A message with no association. -// "request" | sender user ID | A channel request has been received, from Source. -// "reset" | sender user ID | A channel reset has been received. -// "confirm" | sender user ID | A channel request has been accepted. -// "silent" | sender user ID | A message where the user should not be notified. -// "e2e" | sender user ID | A reception of an E2E message. -// "group" | group ID | A reception of a group chat message. -// "endFT" | sender user ID | The last message sent confirming end of file transfer. -// "groupRQ" | sender user ID | A request from Source to join a group chat. +// TYPE | SOURCE | DESCRIPTION +// ----------+--------------------+-------------------------------------------------------- +// "default" | recipient user ID | A message with no association. +// "request" | sender user ID | A channel request has been received, from Source. +// "reset" | sender user ID | A channel reset has been received. +// "confirm" | sender user ID | A channel request has been accepted. +// "silent" | sender user ID | A message where the user should not be notified. +// "e2e" | sender user ID | A reception of an E2E message. +// "group" | group ID | A reception of a group chat message. +// "endFT" | sender user ID | The last message sent confirming end of file transfer. +// "groupRQ" | sender user ID | A request from Source to join a group chat. type NotificationReport struct { // ForMe determines whether this value is for the user. If it is // false, this report may be ignored. @@ -80,33 +82,27 @@ type NotificationReport struct { // NotificationReports. // // Parameters: -// - e2eID - e2e object ID in the tracker -// - notificationCSV - the notification data received from the -// notifications' server. -// - marshalledServices - the JSON-marshalled list of services the backend -// keeps track of. Refer to Cmix.TrackServices for information about this. +// - notificationCSV - the notification data received from the +// notifications' server. +// - marshalledServices - the JSON-marshalled list of services the backend +// keeps track of. Refer to Cmix.TrackServices or +// Cmix.TrackServicesWithIdentity for information about this. // // Returns: -// - []byte - A JSON marshalled NotificationReports. Some NotificationReport's -// within in this structure may have their NotificationReport.ForMe -// set to false. These may be ignored. -func GetNotificationsReport(e2eId int, notificationCSV string, +// - []byte - A JSON marshalled NotificationReports. Some NotificationReport's +// within in this structure may have their NotificationReport.ForMe +// set to false. These may be ignored. +func GetNotificationsReport(notificationCSV string, marshalledServices []byte) ([]byte, error) { - // Retrieve user - user, err := e2eTrackerSingleton.get(e2eId) - if err != nil { - return nil, err - } + // If services are retrieved using TrackServicesWithIdentity, this + // should return a single list. serviceList := message.ServiceList{} - err = json.Unmarshal(marshalledServices, &serviceList) + err := json.Unmarshal(marshalledServices, &serviceList) if err != nil { return nil, err } - // Retrieve the services for this user - services := serviceList[*user.api.GetReceptionIdentity().ID] - // Decode notifications' server data notificationList, err := notifications.DecodeNotificationsCSV(notificationCSV) if err != nil { @@ -117,24 +113,26 @@ func GetNotificationsReport(e2eId int, notificationCSV string, reportList := make([]*NotificationReport, len(notificationList)) // Iterate over data provided by server - for i := range notificationList { - notifData := notificationList[i] - - // Iterate over all services - for j := range services { - // Pull data from services and from notification data - service := services[j] - messageHash := notifData.MessageHash - hash := service.HashFromMessageHash(notifData.MessageHash) - - // Check if this notification data is recognized by - // this service, ie "ForMe" - if service.ForMeFromMessageHash(messageHash, hash) { - // Fill report list with service data - reportList[i] = &NotificationReport{ - ForMe: true, - Type: service.Tag, - Source: service.Identifier, + for _, services := range serviceList { + for i := range notificationList { + notifData := notificationList[i] + + // Iterate over all services + for j := range services { + // Pull data from services and from notification data + service := services[j] + messageHash := notifData.MessageHash + hash := service.HashFromMessageHash(notifData.MessageHash) + + // Check if this notification data is recognized by + // this service, ie "ForMe" + if service.ForMeFromMessageHash(messageHash, hash) { + // Fill report list with service data + reportList[i] = &NotificationReport{ + ForMe: true, + Type: service.Tag, + Source: service.Identifier, + } } } } @@ -147,7 +145,7 @@ func GetNotificationsReport(e2eId int, notificationCSV string, // The token is a firebase messaging token. // // Parameters: -// - e2eId - ID of the E2E object in the E2E tracker +// - e2eId - ID of the E2E object in the E2E tracker func RegisterForNotifications(e2eId int, token string) error { user, err := e2eTrackerSingleton.get(e2eId) if err != nil { @@ -160,7 +158,7 @@ func RegisterForNotifications(e2eId int, token string) error { // UnregisterForNotifications turns off notifications for this client. // // Parameters: -// - e2eId - ID of the E2E object in the E2E tracker +// - e2eId - ID of the E2E object in the E2E tracker func UnregisterForNotifications(e2eId int) error { user, err := e2eTrackerSingleton.get(e2eId) if err != nil { diff --git a/bindings/notifications_test.go b/bindings/notifications_test.go index 91d2974593719c9094def579d34b74a01325ac74..96e8ed21fbaaa2f45dc7d740bfda6591be1638e7 100644 --- a/bindings/notifications_test.go +++ b/bindings/notifications_test.go @@ -10,7 +10,7 @@ package bindings import ( "encoding/json" "fmt" - "gitlab.com/elixxir/client/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/ratchet" "gitlab.com/xx_network/primitives/id" "testing" ) diff --git a/bindings/params.go b/bindings/params.go index c1444e70320f8351514f6d3ddbb2c26872329b83..d32a5f21ef92f581ab86609187e9c0f692f04a07 100644 --- a/bindings/params.go +++ b/bindings/params.go @@ -12,10 +12,10 @@ package bindings import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/fileTransfer" - e2eFileTransfer "gitlab.com/elixxir/client/fileTransfer/e2e" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/fileTransfer" + e2eFileTransfer "gitlab.com/elixxir/client/v4/fileTransfer/e2e" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/xxdk" ) // GetDefaultCMixParams returns a JSON serialized object with all of the cMix diff --git a/bindings/restlike.go b/bindings/restlike.go index bebe90bc88fe54f8d8f35c652f67830b3259562d..6bd33e3e0d8e8b7b8f7450d4d0979b9a2eba69dd 100644 --- a/bindings/restlike.go +++ b/bindings/restlike.go @@ -11,8 +11,8 @@ import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/restlike/connect" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/restlike/connect" ) // RestlikeMessage is the bindings' representation of a restlike.Message diff --git a/bindings/restlikeSingle.go b/bindings/restlikeSingle.go index c71d0e05b4c02f74354957671e40f0f642565bdb..3625dcc452d8cc44f39e5f7c2ec647125f79a6a3 100644 --- a/bindings/restlikeSingle.go +++ b/bindings/restlikeSingle.go @@ -10,8 +10,8 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/restlike/single" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/restlike/single" "gitlab.com/elixxir/crypto/contact" ) diff --git a/bindings/single.go b/bindings/single.go index d6625cd71d8fe027fa2a64ca1b146d30e6f6eef0..50ec375d8b77802522c8becbc64096d7a31585c8 100644 --- a/bindings/single.go +++ b/bindings/single.go @@ -10,9 +10,9 @@ package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" ) diff --git a/bindings/single_test.go b/bindings/single_test.go index 1f34d616f3af0e447b472e6675472f800131babf..b49503819833f95674c6cfc416556e20fa506fde 100644 --- a/bindings/single_test.go +++ b/bindings/single_test.go @@ -12,7 +12,7 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" diff --git a/bindings/ud.go b/bindings/ud.go index 9332ea975b90db019389bfe569a73ccbaa40880d..dfd27b1f09a740dc77e19b748e7c8f61c0c794c1 100644 --- a/bindings/ud.go +++ b/bindings/ud.go @@ -12,9 +12,9 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/ud" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/ud" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/id" diff --git a/bindings/version.go b/bindings/version.go index 1dae09cc111915e2b0556d386f041f73c7dc9b62..e5c58ba750ed594ab79b6e8871df7b9ba286fa77 100644 --- a/bindings/version.go +++ b/bindings/version.go @@ -9,7 +9,7 @@ package bindings -import "gitlab.com/elixxir/client/xxdk" +import "gitlab.com/elixxir/client/v4/xxdk" // GetVersion returns the xxdk.SEMVER. func GetVersion() string { diff --git a/broadcast/client.go b/broadcast/client.go index 678c7e9dccf7ef0322aea6369a92d6dcfde032ca..7e897881e74d6d021994c0814c506cc425a6d0c1 100644 --- a/broadcast/client.go +++ b/broadcast/client.go @@ -10,8 +10,8 @@ package broadcast import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/crypto/fastRNG" ) @@ -24,6 +24,8 @@ type broadcastClient struct { rng *fastRNG.StreamGenerator } +// NewBroadcastChannelFunc creates a broadcast Channel. Used so that it can be +// replaced in tests. type NewBroadcastChannelFunc func(channel *crypto.Channel, net Client, rng *fastRNG.StreamGenerator) (Channel, error) @@ -52,7 +54,8 @@ func NewBroadcastChannel(channel *crypto.Channel, net Client, } // RegisterListener registers a listener for broadcast messages. -func (bc *broadcastClient) RegisterListener(listenerCb ListenerFunc, method Method) error { +func (bc *broadcastClient) RegisterListener( + listenerCb ListenerFunc, method Method) error { var tag string switch method { case Symmetric: diff --git a/broadcast/interface.go b/broadcast/interface.go index 4c390995abaf0b942e5d17ae03b14064fd7fac0d..bb4e592c89865838d48ccc64154069a7d6479126 100644 --- a/broadcast/interface.go +++ b/broadcast/interface.go @@ -8,10 +8,10 @@ package broadcast import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/crypto/rsa" "gitlab.com/xx_network/primitives/id" @@ -83,7 +83,7 @@ type Channel interface { Stop() } -// Assembler is a function which allows a bre +// Assembler is a function which allows a bre. type Assembler func(rid id.Round) (payload []byte, err error) // Client contains the methods from [cmix.Client] that are required by @@ -92,7 +92,8 @@ type Client interface { SendWithAssembler(recipient *id.ID, assembler cmix.MessageAssembler, cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) IsHealthy() bool - AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) + AddIdentityWithHistory( + id *id.ID, validUntil, beginning time.Time, persistent bool) AddService(clientID *id.ID, newService message.Service, response message.Processor) DeleteClientService(clientID *id.ID) diff --git a/broadcast/method.go b/broadcast/method.go index c154fc027b81a55f600c5f54fa3847aa7616ea89..5a87d0f00dbd272c37c725e6662aff5b21b5d767 100644 --- a/broadcast/method.go +++ b/broadcast/method.go @@ -7,7 +7,7 @@ package broadcast -// Method enum for broadcast type +// Method enum for broadcast type. type Method uint8 const ( diff --git a/broadcast/processor.go b/broadcast/processor.go index 8ee1f85d07ad093337711ef15e7f6e3ced3dd1f8..79f14fb363ef4afb6e788d9a4491523f68e31d89 100644 --- a/broadcast/processor.go +++ b/broadcast/processor.go @@ -10,8 +10,8 @@ package broadcast import ( "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/primitives/format" ) @@ -21,7 +21,7 @@ const ( errDecrypt = "[BCAST] Failed to decrypt payload for broadcast %s (%q): %+v" ) -// processor struct for message handling +// processor struct for message handling. type processor struct { c *crypto.Channel cb ListenerFunc @@ -36,16 +36,19 @@ func (p *processor) Process(msg format.Message, var err error switch p.method { case RSAToPublic: - decodedMessage, decryptErr := p.c.DecryptRSAToPublic(msg.GetContents(), msg.GetMac(), msg.GetKeyFP()) + decodedMessage, decryptErr := p.c.DecryptRSAToPublic( + msg.GetContents(), msg.GetMac(), msg.GetKeyFP()) if decryptErr != nil { jww.ERROR.Printf(errDecrypt, p.c.ReceptionID, p.c.Name, decryptErr) return } - size := binary.BigEndian.Uint16(decodedMessage[:internalPayloadSizeLength]) + size := binary.BigEndian.Uint16( + decodedMessage[:internalPayloadSizeLength]) payload = decodedMessage[internalPayloadSizeLength : size+internalPayloadSizeLength] case Symmetric: - payload, err = p.c.DecryptSymmetric(msg.GetContents(), msg.GetMac(), msg.GetKeyFP()) + payload, err = p.c.DecryptSymmetric( + msg.GetContents(), msg.GetMac(), msg.GetKeyFP()) if err != nil { jww.ERROR.Printf(errDecrypt, p.c.ReceptionID, p.c.Name, err) return @@ -57,7 +60,8 @@ func (p *processor) Process(msg format.Message, p.cb(payload, receptionID, round) } -// String returns a string identifying the symmetricProcessor for debugging purposes. +// String returns a string identifying the symmetricProcessor for debugging +// purposes. func (p *processor) String() string { return "broadcastChannel-" + p.c.Name } diff --git a/broadcast/rsaToPublic.go b/broadcast/rsaToPublic.go index 26c4d0924af04c6464610f20fe8040ac1aa7b082..ec007bcfc7928ea3345748c60fcafee144089aab 100644 --- a/broadcast/rsaToPublic.go +++ b/broadcast/rsaToPublic.go @@ -10,9 +10,9 @@ package broadcast import ( "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/rsa" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" @@ -35,13 +35,10 @@ const ( // or smaller and the channel [rsa.PrivateKey] must be passed in. // // The network must be healthy to send. -func (bc *broadcastClient) BroadcastRSAtoPublic(pk rsa.PrivateKey, - payload []byte, cMixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) { - // Confirm network health - - assemble := func(rid id.Round) ([]byte, error) { - return payload, nil - } +func (bc *broadcastClient) BroadcastRSAtoPublic( + pk rsa.PrivateKey, payload []byte, cMixParams cmix.CMIXParams) ( + rounds.Round, ephemeral.Id, error) { + assemble := func(rid id.Round) ([]byte, error) { return payload, nil } return bc.BroadcastRSAToPublicWithAssembler(pk, assemble, cMixParams) } @@ -91,7 +88,7 @@ func (bc *broadcastClient) BroadcastRSAToPublicWithAssembler( "asymmetric broadcast message") } - // Create service using asymmetric broadcast service tag & channel + // Create service using asymmetric broadcast service tag and channel // reception ID allows anybody with this info to listen for messages on // this channel service = message.Service{ diff --git a/broadcast/rsaToPublic_test.go b/broadcast/rsaToPublic_test.go index 9be17453b96db68ca8a735fdcd9234ccd7ad2e3e..17edc3169815af23325b8fd9658fe551bd5a3278 100644 --- a/broadcast/rsaToPublic_test.go +++ b/broadcast/rsaToPublic_test.go @@ -17,10 +17,10 @@ import ( "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/format" @@ -158,7 +158,8 @@ func Test_asymmetricClient_Smoke(t *testing.T) { } // Broadcast payload - _, _, err := clients[0].BroadcastRSAtoPublic(pk, payload, cmix.GetDefaultCMIXParams()) + _, _, err := clients[0].BroadcastRSAtoPublic( + pk, payload, cmix.GetDefaultCMIXParams()) if err != nil { t.Errorf("Cmix 0 failed to send broadcast: %+v", err) } diff --git a/broadcast/symmetric.go b/broadcast/symmetric.go index 432c53c8cab2ae80ea16f915d0142136a0d1532d..e2bebe025bf9433e7aed7830f940b74f59a70686 100644 --- a/broadcast/symmetric.go +++ b/broadcast/symmetric.go @@ -9,9 +9,9 @@ package broadcast import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" @@ -20,9 +20,8 @@ import ( // Error messages. const ( // broadcastClient.Broadcast - errNetworkHealth = "cannot send broadcast when the network is not healthy" - errPayloadSize = "size of payload %d must be less than %d" - errBroadcastMethodType = "cannot call %s broadcast using %s channel" + errNetworkHealth = "cannot send broadcast when the network is not healthy" + errPayloadSize = "size of payload %d must be less than %d" ) // Tags. @@ -50,7 +49,8 @@ func (bc *broadcastClient) Broadcast(payload []byte, cMixParams cmix.CMIXParams) // The payload must be of the size [Channel.MaxPayloadSize] or smaller. // // The network must be healthy to send. -func (bc *broadcastClient) BroadcastWithAssembler(assembler Assembler, cMixParams cmix.CMIXParams) ( +func (bc *broadcastClient) BroadcastWithAssembler( + assembler Assembler, cMixParams cmix.CMIXParams) ( rounds.Round, ephemeral.Id, error) { if !bc.net.IsHealthy() { return rounds.Round{}, ephemeral.Id{}, errors.New(errNetworkHealth) @@ -59,7 +59,7 @@ func (bc *broadcastClient) BroadcastWithAssembler(assembler Assembler, cMixParam assemble := func(rid id.Round) (fp format.Fingerprint, service message.Service, encryptedPayload, mac []byte, err error) { - //assemble the passed payload + // Assemble the passed payload payload, err := assembler(rid) if err != nil { return format.Fingerprint{}, message.Service{}, nil, nil, err @@ -93,6 +93,6 @@ func (bc *broadcastClient) BroadcastWithAssembler(assembler Assembler, cMixParam return } - return bc.net.SendWithAssembler(bc.channel.ReceptionID, assemble, - cMixParams) + return bc.net.SendWithAssembler( + bc.channel.ReceptionID, assemble, cMixParams) } diff --git a/broadcast/symmetric_test.go b/broadcast/symmetric_test.go index 3386a71ead8fb2ffada89329017975216be91507..640824c019e25e81e90beb11908b5282ee49a41c 100644 --- a/broadcast/symmetric_test.go +++ b/broadcast/symmetric_test.go @@ -11,9 +11,9 @@ package broadcast import ( "bytes" "fmt" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/broadcast/utils_test.go b/broadcast/utils_test.go index 299a2f663d387ea0f911f58bf2a18623e1d7f8c2..61c4c414782e17ad5316c4869834a9705218faf5 100644 --- a/broadcast/utils_test.go +++ b/broadcast/utils_test.go @@ -14,10 +14,10 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" ) diff --git a/channels/readme.md b/channels/README.md similarity index 72% rename from channels/readme.md rename to channels/README.md index 9327e9635afd9c109054bf7b486d24c97a53c0bc..33a8253c1746a98a607ac4ac91e29ae6b77f0efb 100644 --- a/channels/readme.md +++ b/channels/README.md @@ -1,21 +1,30 @@ -Channels provides a channels implementation on top of broadcast which is capable of handing the user facing features of -channels, including replies, reactions, and eventually admin commands. +Channels provide a channels implementation on top of broadcast which is capable +of handing the user facing features of channels, including replies, reactions, +and eventually admin commands. on sending, data propagates as follows: +```text Send function (Example: SendMessage) - > SendGeneric -> Broadcast.BroadcastWithAssembler -> cmix.SendWithAssembler +``` on receiving messages propagate as follows: +```text cmix message pickup (by service)- > broadcast.Processor -> userListener -> events.triggerEvent -> messageTypeHandler (example: Text) -> eventModel (example: ReceiveMessage) +``` on sendingAdmin, data propagates as follows: +```text Send function - > SendAdminGeneric -> Broadcast.BroadcastAsymmetricWithAssembler -> cmix.SendWithAssembler +``` on receiving admin messages propagate as follows: +```text cmix message pickup (by service)- > broadcast.Processor -> adminListener -> events.triggerAdminEvent -> messageTypeHandler (example: Text) -> -eventModel (example: ReceiveMessage) \ No newline at end of file +eventModel (example: ReceiveMessage) +``` diff --git a/channels/adminListener.go b/channels/adminListener.go index 86f80142ef5345a3aad346907d96940097a281a6..9511ba480003e92d7501d2bcc44f37e5a7221c2d 100644 --- a/channels/adminListener.go +++ b/channels/adminListener.go @@ -10,8 +10,8 @@ package channels import ( "github.com/golang/protobuf/proto" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" @@ -26,7 +26,7 @@ type adminListener struct { checkSent messageReceiveFunc } -// Listen is called when a message is received for the admin listener +// Listen is called when a message is received for the admin listener. func (al *adminListener) Listen(payload []byte, receptionID receptionID.EphemeralIdentity, round rounds.Round) { // Get the message ID @@ -40,7 +40,7 @@ func (al *adminListener) Listen(payload []byte, return } - //check if we sent the message, ignore triggering if we sent + // Check if we sent the message, ignore triggering if we sent if al.checkSent(msgID, round) { return } @@ -49,14 +49,13 @@ func (al *adminListener) Listen(payload []byte, // Check the round to ensure that the message is not a replay if id.Round(cm.RoundID) != round.ID { - jww.WARN.Printf("The round message %s send on %s referenced "+ - "(%d) was not the same as the round the message was found on (%d)", + jww.WARN.Printf("The round message %s send on %s referenced (%d) was "+ + "not the same as the round the message was found on (%d)", msgID, al.chID, cm.RoundID, round.ID) return } - // Replace the timestamp on the message if it is outside of the - // allowable range + // Replace the timestamp on the message if it is outside the allowable range ts := vetTimestamp(time.Unix(0, cm.LocalTimestamp), round.Timestamps[states.QUEUED], msgID) diff --git a/channels/adminListener_test.go b/channels/adminListener_test.go index cb571d5724dcd7318d7ab4dec78bd2c0fe14866c..e735772cfd3c6da15c998114a5613a3f42ac2822 100644 --- a/channels/adminListener_test.go +++ b/channels/adminListener_test.go @@ -15,8 +15,8 @@ import ( "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" @@ -33,9 +33,9 @@ type triggerAdminEventDummy struct { } func (taed *triggerAdminEventDummy) triggerAdminEvent(chID *id.ID, - cm *ChannelMessage, ts time.Time, messageID cryptoChannel.MessageID, + cm *ChannelMessage, _ time.Time, messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, round rounds.Round, - status SentStatus) (uint64, error) { + _ SentStatus) (uint64, error) { taed.gotData = true taed.chID = chID @@ -49,7 +49,6 @@ func (taed *triggerAdminEventDummy) triggerAdminEvent(chID *id.ID, // Tests the happy path. func TestAdminListener_Listen(t *testing.T) { - // Build inputs chID := &id.ID{} chID[0] = 1 @@ -75,9 +74,11 @@ func TestAdminListener_Listen(t *testing.T) { dummy := &triggerAdminEventDummy{} al := adminListener{ - chID: chID, - trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + trigger: dummy.triggerAdminEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } // Call the listener @@ -111,8 +112,7 @@ func TestAdminListener_Listen(t *testing.T) { // Tests that the message is rejected when the round it came on doesn't match // the round in the channel message. func TestAdminListener_Listen_BadRound(t *testing.T) { - - // build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -136,20 +136,21 @@ func TestAdminListener_Listen_BadRound(t *testing.T) { dummy := &triggerAdminEventDummy{} al := adminListener{ - chID: chID, - trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + trigger: dummy.triggerAdminEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } // Call the listener al.Listen(cmSerial, receptionID.EphemeralIdentity{}, r) - // check the results + // Check the results if dummy.gotData { - t.Fatalf("payload handled when it should have failed due to " + - "a round issue") + t.Fatal( + "Payload handled when it should have failed due to a round issue.") } - } // Tests that the message is rejected when the channel message is malformed. @@ -168,9 +169,11 @@ func TestAdminListener_Listen_BadChannelMessage(t *testing.T) { dummy := &triggerAdminEventDummy{} al := adminListener{ - chID: chID, - trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + trigger: dummy.triggerAdminEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } // Call the listener @@ -181,14 +184,12 @@ func TestAdminListener_Listen_BadChannelMessage(t *testing.T) { t.Fatalf("payload handled when it should have failed due to " + "a malformed channel message") } - } // Tests that the message is rejected when the sized broadcast message is // malformed. func TestAdminListener_Listen_BadSizedBroadcast(t *testing.T) { - - // build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -215,9 +216,11 @@ func TestAdminListener_Listen_BadSizedBroadcast(t *testing.T) { dummy := &triggerAdminEventDummy{} al := adminListener{ - chID: chID, - trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + trigger: dummy.triggerAdminEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } // Call the listener diff --git a/channels/channelMessages.pb.go b/channels/channelMessages.pb.go index 1a7a414fe860fcfbf9439ed5422a3e550c5a55a0..7a042de31f13966682132daefdd6786cce9a030c 100644 --- a/channels/channelMessages.pb.go +++ b/channels/channelMessages.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: channelMessages.proto package channels @@ -44,17 +44,17 @@ type ChannelMessage struct { // Payload is the actual message payload. It will be processed differently // based on the PayloadType. Payload []byte `protobuf:"bytes,4,opt,name=Payload,proto3" json:"Payload,omitempty"` - // nickname is the name which the user is using for this message - // it will not be longer than 24 characters + // nickname is the name which the user is using for this message it will not + // be longer than 24 characters. Nickname string `protobuf:"bytes,5,opt,name=Nickname,proto3" json:"Nickname,omitempty"` // Nonce is 32 bits of randomness to ensure that two messages in the same // round with that have the same nickname, payload, and lease will not have // the same message ID. Nonce []byte `protobuf:"bytes,6,opt,name=Nonce,proto3" json:"Nonce,omitempty"` - // LocalTimestamp is the timestamp when the "send call" is made based upon the - // local clock. If this differs by more than 5 seconds +/- from when the round - // it sent on is queued, then a random mutation on the queued time (+/- 200ms) - // will be used by local clients instead + // LocalTimestamp is the timestamp when the "send call" is made based upon + // the local clock. If this differs by more than 5 seconds +/- from when the + // round it sent on is queued, then a random mutation on the queued time + // (+/- 200ms) will be used by local clients instead. LocalTimestamp int64 `protobuf:"varint,7,opt,name=LocalTimestamp,proto3" json:"LocalTimestamp,omitempty"` } @@ -152,7 +152,7 @@ type UserMessage struct { // Signature is the signature proving this message has been sent by the // owner of this user's public key. // - // Signature = Sig(User_ECCPublicKey, Message) + // Signature = Sig(User_ECCPublicKey, Message) Signature []byte `protobuf:"bytes,3,opt,name=Signature,proto3" json:"Signature,omitempty"` // ECCPublicKey is the user's EC Public key. This is provided by the // network. diff --git a/channels/channelMessages.proto b/channels/channelMessages.proto index d89337d366a8cc4cfc27948f9e37e7570eddb254..e949765b448816cc76fa341ebfb4f3f8676f9454 100644 --- a/channels/channelMessages.proto +++ b/channels/channelMessages.proto @@ -15,7 +15,7 @@ package channels; // the channel sent by a user with admin access of the channel. message ChannelMessage{ // Lease is the length that this channel message will take effect. - int64 Lease = 1; + int64 Lease = 1; // The round this message was sent on. uint64 RoundID = 2; @@ -26,10 +26,10 @@ message ChannelMessage{ // Payload is the actual message payload. It will be processed differently // based on the PayloadType. - bytes Payload = 4; + bytes Payload = 4; - // nickname is the name which the user is using for this message - // it will not be longer than 24 characters + // nickname is the name which the user is using for this message it will not + // be longer than 24 characters. string Nickname = 5; // Nonce is 32 bits of randomness to ensure that two messages in the same @@ -37,10 +37,10 @@ message ChannelMessage{ // the same message ID. bytes Nonce = 6; - // LocalTimestamp is the timestamp when the "send call" is made based upon the - // local clock. If this differs by more than 5 seconds +/- from when the round - // it sent on is queued, then a random mutation on the queued time (+/- 200ms) - // will be used by local clients instead + // LocalTimestamp is the timestamp when the "send call" is made based upon + // the local clock. If this differs by more than 5 seconds +/- from when the + // round it sent on is queued, then a random mutation on the queued time + // (+/- 200ms) will be used by local clients instead. int64 LocalTimestamp = 7; } @@ -49,15 +49,15 @@ message UserMessage { // Message contains the contents of the message. This is typically what the // end-user has submitted to the channel. This is a serialization of the // ChannelMessage. - bytes Message = 1; + bytes Message = 1; // Signature is the signature proving this message has been sent by the // owner of this user's public key. // // Signature = Sig(User_ECCPublicKey, Message) - bytes Signature = 3; + bytes Signature = 3; // ECCPublicKey is the user's EC Public key. This is provided by the // network. - bytes ECCPublicKey = 5; + bytes ECCPublicKey = 5; } \ No newline at end of file diff --git a/channels/dummyNameServer.go b/channels/dummyNameServer.go index 8c14e40279d8091bf34f29a5a881246715c27c34..50c6c4578871ab6c748fce4af0aabd6be0e9bbf4 100644 --- a/channels/dummyNameServer.go +++ b/channels/dummyNameServer.go @@ -16,8 +16,8 @@ import ( "time" ) -// NewDummyNameService returns a dummy object adhering to the name service -// This neither produces valid signatures nor validates passed signatures. +// NewDummyNameService returns a dummy object adhering to the name service. This +// neither produces valid signatures nor validates passed signatures. // // THIS IS FOR DEVELOPMENT AND DEBUGGING PURPOSES ONLY. func NewDummyNameService(username string, rng io.Reader) (NameService, error) { @@ -31,23 +31,23 @@ func NewDummyNameService(username string, rng io.Reader) (NameService, error) { lease: netTime.Now().Add(35 * 24 * time.Hour), } - //generate the private key + // Generate the private key var err error dns.public, dns.private, err = ed25519.GenerateKey(rng) if err != nil { return nil, err } - //generate a dummy user discover identity to produce a validation signature - //just sign with our own key, it wont be evaluated anyhow + // Generate a dummy user discover identity to produce a validation signature + // just sign with our own key, it will not be evaluated anyhow dns.validationSig = channel.SignChannelLease(dns.public, dns.username, dns.lease, dns.private) return dns, nil } -// dummyNameService is a dummy NameService implementation. This is NOT meant -// for use in production +// dummyNameService is a dummy NameService implementation. This is NOT meant for +// use in production. type dummyNameService struct { private ed25519.PrivateKey public ed25519.PublicKey @@ -94,14 +94,14 @@ func (dns *dummyNameService) SignChannelMessage(message []byte) ( return sig, nil } -// ValidateChannelMessage will always return true, indicating the the channel +// ValidateChannelMessage will always return true, indicating that the channel // message is valid. This will ignore the passed in arguments. As a result, // these values may be dummy or precanned. // // THIS IS FOR DEVELOPMENT AND DEBUGGING PURPOSES ONLY. -func (dns *dummyNameService) ValidateChannelMessage(username string, lease time.Time, - pubKey ed25519.PublicKey, authorIDSignature []byte) bool { - //ignore the authorIDSignature +func (dns *dummyNameService) ValidateChannelMessage( + string, time.Time, ed25519.PublicKey, []byte) bool { + // Ignore the authorIDSignature jww.WARN.Printf("ValidateChannelMessage called on Dummy Name Service, " + "no validation done - identity not validated. YOU SHOULD NEVER SEE " + "THIS MESSAGE IN PRODUCTION") diff --git a/channels/dummyNameServer_test.go b/channels/dummyNameServer_test.go index 183da2abaa10cbd811048023c6447f61f3261ae4..444e5bd2188268c2eeb9e9a74b5b4bec60da8616 100644 --- a/channels/dummyNameServer_test.go +++ b/channels/dummyNameServer_test.go @@ -24,7 +24,6 @@ func TestNewDummyNameService(t *testing.T) { if err != nil { t.Fatalf("NewDummyNameService error: %+v", err) } - } // Smoke test. @@ -38,10 +37,8 @@ func TestDummyNameService_GetUsername(t *testing.T) { if username != ns.GetUsername() { t.Fatalf("GetUsername did not return expected value."+ - "\nExpected: %s"+ - "\nReceived: %s", username, ns.GetUsername()) + "\nexpected: %s\nreceived: %s", username, ns.GetUsername()) } - } // Smoke test. @@ -57,16 +54,15 @@ func TestDummyNameService_SignChannelMessage(t *testing.T) { signature, err := ns.SignChannelMessage(message) if err != nil { - t.Fatalf("SignChannelMessage error: %v", err) + t.Fatalf("SignChannelMessage error: %+v", err) } if len(signature) != ed25519.SignatureSize { t.Errorf("DummyNameService's SignChannelMessage did not return a "+ "signature of expected size, according to ed25519 specifications."+ - "\nExpected: %d"+ - "\nReceived: %d", ed25519.SignatureSize, len(signature)) + "\nexpected: %d\nreceived: %d", + ed25519.SignatureSize, len(signature)) } - } // Smoke test. @@ -83,11 +79,9 @@ func TestDummyNameService_GetChannelValidationSignature(t *testing.T) { if len(validationSig) != ed25519.SignatureSize { t.Errorf("DummyNameService's GetChannelValidationSignature did not "+ "return a validation signature of expected size, according to "+ - "ed25519 specifications."+ - "\nExpected: %d"+ - "\nReceived: %d", ed25519.SignatureSize, len(validationSig)) + "ed25519 specifications.\nexpected: %d\nreceived: %d", + ed25519.SignatureSize, len(validationSig)) } - } // Smoke test. diff --git a/channels/emoji.go b/channels/emoji.go index bb9250601f324a9ff964b23cd7559ab6c99701d2..3c442dfcd3fb125cb5a8e32324950eda1945b966 100644 --- a/channels/emoji.go +++ b/channels/emoji.go @@ -7,19 +7,17 @@ package channels -import ( - "regexp" -) - -//based on emojis found at https://unicode.org/emoji/charts/full-emoji-list.html +/*// Based on emojis found at +// https://unicode.org/emoji/charts/full-emoji-list.html const findEmoji = `[\xA9\xAE\x{2000}-\x{3300}\x{1F000}-\x{1FBFF}]` -var compiledFindEmoji = regexp.MustCompile(findEmoji) +// compiledFindEmoji is a regular expression for matching an emoji. +var compiledFindEmoji = regexp.MustCompile(findEmoji)*/ // ValidateReaction checks that the reaction only contains a single emoji. func ValidateReaction(reaction string) error { - //make sure it is only only character + // Make sure it is the only character reactRunes := []rune(reaction) if len(reactRunes) > 1 { return InvalidReaction @@ -27,10 +25,10 @@ func ValidateReaction(reaction string) error { /* reader := bytes.NewReader([]byte(reaction)) - // make sure it has emojis - if !compiledFindEmoji.MatchReader(reader) { - return InvalidReaction - } + // Make sure it has emojis + if !compiledFindEmoji.MatchReader(reader) { + return InvalidReaction + } */ return nil } diff --git a/channels/emoji_test.go b/channels/emoji_test.go index ea0f2a3bae58903ecd785fd1eb60727dde6032bf..d85602662ddfc982596c8ca91ccc2c4590bcbea5 100644 --- a/channels/emoji_test.go +++ b/channels/emoji_test.go @@ -34,19 +34,21 @@ func TestValidateReaction(t *testing.T) { }*/ func TestValidateReaction(t *testing.T) { - - testReactions := []string{"🍆", "😂", "❤", "🤣", "👍", "😭", "🙏", "😘", "🥰", - "😍", "😊", "☺", "A", "b", "AA", "1", "🍆🍆", "🍆A", "👍👍👍", "👍😘A"} + testReactions := []string{ + "🍆", "😂", "❤", "🤣", "👍", "😭", "🙏", "😘", "🥰", "😍", "😊", + "☺", "A", "b", "AA", "1", "🍆🍆", "🍆A", "👍👍👍", "👍😘A", + } expected := []error{ - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, InvalidReaction, nil, - InvalidReaction, InvalidReaction, InvalidReaction, InvalidReaction} + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + InvalidReaction, nil, InvalidReaction, InvalidReaction, InvalidReaction, + InvalidReaction, + } for i, r := range testReactions { err := ValidateReaction(r) if err != expected[i] { - t.Errorf("Got incorrect response for `%s` (%d): "+ + t.Errorf("Got incorrect response for %q (%d): "+ "`%s` vs `%s`", r, i, err, expected[i]) } } diff --git a/channels/errors.go b/channels/errors.go index 319f065966a899f5a64c05b41eda84caa887fd02..ec6d8bfde368da2a24472fe3fd4b2efbcc1b96a2 100644 --- a/channels/errors.go +++ b/channels/errors.go @@ -10,16 +10,31 @@ package channels import "github.com/pkg/errors" var ( + // ChannelAlreadyExistsErr is returned when attempting to join a channel + // that the user is already in. ChannelAlreadyExistsErr = errors.New( "the channel cannot be added because it already exists") - ChannelDoesNotExistsErr = errors.New( - "the channel cannot be found") - MessageTooLongErr = errors.New( - "the passed message is too long") + + // ChannelDoesNotExistsErr is returned when a channel does not exist. + ChannelDoesNotExistsErr = errors.New("the channel cannot be found") + + // MessageTooLongErr is returned when attempting to send a message that is + // too large. + MessageTooLongErr = errors.New("the passed message is too long") + + // WrongPrivateKey is returned when the private key does not match the + // channel's public key. WrongPrivateKey = errors.New( "the passed private key does not match the channel") - MessageTypeAlreadyRegistered = errors.New("the given message type has " + - "already been registered") + + // MessageTypeAlreadyRegistered is returned if a handler has already been + // registered with the supplied message type. Only one handler can be + // registered per type. + MessageTypeAlreadyRegistered = errors.New( + "the given message type has already been registered") + + // InvalidReaction is returned if the passed reaction string is an invalid + // emoji. InvalidReaction = errors.New( "The reaction is not valid, it must be a single emoji") ) diff --git a/channels/eventModel.go b/channels/eventModel.go index 153a6bd68df07144219fc249332c5c3f0f316db2..c2c8251ed72856b404a14048b287fdc903005c29 100644 --- a/channels/eventModel.go +++ b/channels/eventModel.go @@ -14,11 +14,12 @@ import ( "fmt" "github.com/golang/protobuf/proto" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "strconv" "sync" "time" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/xx_network/primitives/id" @@ -28,15 +29,40 @@ import ( // unique users for every channel defined by the channel's private key. const AdminUsername = "Admin" +// SentStatus represents the current status of a channel message. type SentStatus uint8 const ( + // Unsent is the status of a message when it is pending to be sent. Unsent SentStatus = iota + + // Sent is the status of a message once the round it is sent on completed. Sent + + // Delivered is the status of a message once is has been received. Delivered + + // Failed is the status of a message if it failed to send. Failed ) +// String returns a human-readable version of [SentStatus], used for debugging +// and logging. This function adheres to the [fmt.Stringer] interface. +func (ss SentStatus) String() string { + switch ss { + case Unsent: + return "unsent" + case Sent: + return "sent" + case Delivered: + return "delivered" + case Failed: + return "failed" + default: + return "Invalid SentStatus: " + strconv.Itoa(int(ss)) + } +} + var AdminFakePubKey = ed25519.PublicKey{} // EventModel is an interface which an external party which uses the channels @@ -187,8 +213,8 @@ func initEvents(model EventModel) *events { // // There can only be one handler per message type, and this will return an error // on a multiple registration. -func (e *events) RegisterReceiveHandler(messageType MessageType, - listener MessageTypeReceiveMessage) error { +func (e *events) RegisterReceiveHandler( + messageType MessageType, listener MessageTypeReceiveMessage) error { e.mux.Lock() defer e.mux.Unlock() @@ -225,16 +251,17 @@ func (e *events) triggerEvent(chID *id.ID, umi *userMessageInternal, if !exists { errStr := fmt.Sprintf("Received message from %x on channel %s in "+ "round %d which could not be handled due to unregistered message "+ - "type %s; Contents: %v", um.ECCPublicKey, chID, round.ID, messageType, - cm.Payload) + "type %s; Contents: %v", + um.ECCPublicKey, chID, round.ID, messageType, cm.Payload) jww.WARN.Printf(errStr) return 0, errors.New(errStr) } - // Call the listener. This is already in an instanced event, no new thread needed. - uuid := listener(chID, umi.GetMessageID(), messageType, cm.Nickname, cm.Payload, - um.ECCPublicKey, 0, ts, time.Duration(cm.Lease), - round, status) + // Call the listener. This is already in an instanced event; no new thread + // is needed. + uuid := listener( + chID, umi.GetMessageID(), messageType, cm.Nickname, cm.Payload, + um.ECCPublicKey, 0, ts, time.Duration(cm.Lease), round, status) return uuid, nil } @@ -257,18 +284,19 @@ func (e *events) triggerAdminEvent(chID *id.ID, cm *ChannelMessage, listener, exists := e.registered[messageType] e.mux.RUnlock() if !exists { - errStr := fmt.Sprintf("Received Admin message from %s on channel %s in "+ - "round %d which could not be handled due to unregistered message "+ - "type %s; Contents: %v", AdminUsername, chID, round.ID, messageType, - cm.Payload) + errStr := fmt.Sprintf("Received Admin message from %s on channel %s "+ + "in round %d which could not be handled due to unregistered "+ + "message type %s; Contents: %v", + AdminUsername, chID, round.ID, messageType, cm.Payload) jww.WARN.Printf(errStr) return 0, errors.New(errStr) } - // Call the listener. This is already in an instanced event, no new thread needed. - uuid := listener(chID, messageID, messageType, AdminUsername, cm.Payload, - AdminFakePubKey, 0, ts, - time.Duration(cm.Lease), round, status) + // Call the listener. This is already in an instanced event; no new thread + // is needed. + uuid := listener( + chID, messageID, messageType, AdminUsername, cm.Payload, + AdminFakePubKey, 0, ts, time.Duration(cm.Lease), round, status) return uuid, nil } @@ -303,8 +331,8 @@ func (e *events) receiveTextMessage(channelID *id.ID, "to %s on %s", tag, base64.StdEncoding.EncodeToString(pubKey), base64.StdEncoding.EncodeToString(txt.ReplyMessageID), channelID) - return e.model.ReceiveReply(channelID, messageID, replyTo, - nickname, txt.Text, pubKey, codeset, timestamp, lease, round, Text, status) + return e.model.ReceiveReply(channelID, messageID, replyTo, nickname, + txt.Text, pubKey, codeset, timestamp, lease, round, Text, status) } else { jww.ERROR.Printf("Failed process reply to for message %s from "+ @@ -320,11 +348,10 @@ func (e *events) receiveTextMessage(channelID *id.ID, tag := makeChaDebugTag(channelID, pubKey, content, SendMessageTag) jww.INFO.Printf("[%s]Channels - Received message from %s "+ "to %s on %s", tag, base64.StdEncoding.EncodeToString(pubKey), - base64.StdEncoding.EncodeToString(txt.ReplyMessageID), - channelID) + base64.StdEncoding.EncodeToString(txt.ReplyMessageID), channelID) - return e.model.ReceiveMessage(channelID, messageID, nickname, txt.Text, pubKey, codeset, - timestamp, lease, round, Text, status) + return e.model.ReceiveMessage(channelID, messageID, nickname, txt.Text, + pubKey, codeset, timestamp, lease, round, Text, status) } // receiveReaction is the internal function that handles the reception of @@ -358,7 +385,8 @@ func (e *events) receiveReaction(channelID *id.ID, return 0 } - if react.ReactionMessageID != nil && len(react.ReactionMessageID) == cryptoChannel.MessageIDLen { + if react.ReactionMessageID != nil && + len(react.ReactionMessageID) == cryptoChannel.MessageIDLen { var reactTo cryptoChannel.MessageID copy(reactTo[:], react.ReactionMessageID) @@ -369,7 +397,8 @@ func (e *events) receiveReaction(channelID *id.ID, channelID) return e.model.ReceiveReaction(channelID, messageID, reactTo, nickname, - react.Reaction, pubKey, codeset, timestamp, lease, round, Reaction, status) + react.Reaction, pubKey, codeset, timestamp, lease, round, Reaction, + status) } else { jww.ERROR.Printf("Failed process reaction %s from public key %v "+ "(codeset %d) on channel %s, type %s, ts: %s, lease: %s, "+ diff --git a/channels/eventModel_test.go b/channels/eventModel_test.go index 4edf780c46076867789a298c224bfb6194e073b0..0ec6d87807b79e9faed0f7c9be6c0ca1efa49558 100644 --- a/channels/eventModel_test.go +++ b/channels/eventModel_test.go @@ -10,10 +10,9 @@ package channels import ( "bytes" "crypto/ed25519" - "fmt" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/primitives/states" @@ -70,7 +69,6 @@ func (m *MockEvent) ReceiveReply(channelID *id.ID, messageID cryptoChannel.MessageID, reactionTo cryptoChannel.MessageID, nickname, text string, _ ed25519.PublicKey, _ uint8, timestamp time.Time, lease time.Duration, round rounds.Round, _ MessageType, _ SentStatus) uint64 { - fmt.Println(reactionTo) m.eventReceive = eventReceive{ channelID: channelID, messageID: messageID, @@ -102,7 +100,6 @@ func (m *MockEvent) ReceiveReaction(channelID *id.ID, func (m *MockEvent) UpdateSentStatus(uint64, cryptoChannel.MessageID, time.Time, rounds.Round, SentStatus) { - // TODO implement me panic("implement me") } @@ -248,7 +245,8 @@ func TestEvents_triggerEvents(t *testing.T) { r.Timestamps[states.QUEUED] = netTime.Now() // call the trigger - _, err = e.triggerEvent(chID, umi, netTime.Now(), receptionID.EphemeralIdentity{}, r, Delivered) + _, err = e.triggerEvent( + chID, umi, netTime.Now(), receptionID.EphemeralIdentity{}, r, Delivered) if err != nil { t.Fatalf(err.Error()) } @@ -319,7 +317,8 @@ func TestEvents_triggerEvents_noChannel(t *testing.T) { r.Timestamps[states.QUEUED] = netTime.Now() // call the trigger - _, err := e.triggerEvent(chID, umi, netTime.Now(), receptionID.EphemeralIdentity{}, r, Delivered) + _, err := e.triggerEvent( + chID, umi, netTime.Now(), receptionID.EphemeralIdentity{}, r, Delivered) if err != nil { t.Fatalf(err.Error()) } @@ -357,8 +356,8 @@ func TestEvents_triggerAdminEvents(t *testing.T) { msgID := cryptoChannel.MakeMessageID(u.userMessage.Message, chID) // call the trigger - _, err = e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, receptionID.EphemeralIdentity{}, r, - Delivered) + _, err = e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, + receptionID.EphemeralIdentity{}, r, Delivered) if err != nil { t.Fatalf(err.Error()) } @@ -432,8 +431,8 @@ func TestEvents_triggerAdminEvents_noChannel(t *testing.T) { msgID := cryptoChannel.MakeMessageID(u.userMessage.Message, chID) // call the trigger - _, err := e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, receptionID.EphemeralIdentity{}, r, - Delivered) + _, err := e.triggerAdminEvent(chID, cm, netTime.Now(), msgID, + receptionID.EphemeralIdentity{}, r, Delivered) if err != nil { t.Fatalf(err.Error()) } @@ -461,7 +460,7 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -470,7 +469,7 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } senderNickname := "Alice" @@ -497,8 +496,7 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) { } if !me.eventReceive.reactionTo.Equals(cryptoChannel.MessageID{}) { - t.Errorf("Reaction ID is not blank, %s", - me.eventReceive.reactionTo) + t.Errorf("Reaction ID is not blank, %s", me.eventReceive.reactionTo) } if me.eventReceive.nickname != senderNickname { @@ -524,7 +522,6 @@ func TestEvents_receiveTextMessage_Message(t *testing.T) { func TestEvents_receiveTextMessage_Reply(t *testing.T) { me := &MockEvent{} - e := initEvents(me) // craft the input for the event @@ -541,7 +538,7 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -604,7 +601,6 @@ func TestEvents_receiveTextMessage_Reply(t *testing.T) { func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { me := &MockEvent{} - e := initEvents(me) // craft the input for the event @@ -621,7 +617,7 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -657,8 +653,7 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { } if !me.eventReceive.reactionTo.Equals(cryptoChannel.MessageID{}) { - t.Errorf("Reaction ID is not blank, %s", - me.eventReceive.reactionTo) + t.Errorf("Reaction ID is not blank, %s", me.eventReceive.reactionTo) } if me.eventReceive.nickname != senderUsername { @@ -667,8 +662,8 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { } if me.eventReceive.timestamp != ts { - t.Errorf("Message timestamp did not propogate correctly, "+ - "%s vs %s", me.eventReceive.timestamp, ts) + t.Errorf("Message timestamp did not propogate correctly, %s vs %s", + me.eventReceive.timestamp, ts) } if me.eventReceive.lease != lease { @@ -684,7 +679,6 @@ func TestEvents_receiveTextMessage_Reply_BadReply(t *testing.T) { func TestEvents_receiveReaction(t *testing.T) { me := &MockEvent{} - e := initEvents(me) // craft the input for the event @@ -701,7 +695,7 @@ func TestEvents_receiveReaction(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -737,8 +731,8 @@ func TestEvents_receiveReaction(t *testing.T) { } if !me.eventReceive.reactionTo.Equals(replyMsgId) { - t.Errorf("Reaction ID is not equal to what was passed in, "+ - "%s vs %s", me.eventReceive.reactionTo, replyMsgId) + t.Errorf("Reaction ID is not equal to what was passed in, %s vs %s", + me.eventReceive.reactionTo, replyMsgId) } if me.eventReceive.nickname != senderUsername { @@ -764,7 +758,6 @@ func TestEvents_receiveReaction(t *testing.T) { func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) { me := &MockEvent{} - e := initEvents(me) // craft the input for the event @@ -781,7 +774,7 @@ func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -807,34 +800,28 @@ func TestEvents_receiveReaction_InvalidReactionMessageID(t *testing.T) { // check the results on the model if me.eventReceive.channelID != nil { - t.Errorf("Channel ID did propogated correctly when the reaction " + - "is bad") + t.Error("Channel ID did propagate correctly when the reaction is bad.") } if me.eventReceive.messageID.Equals(msgID) { - t.Errorf("Message ID propogated correctly when the reaction is " + - "bad") + t.Errorf("Message ID propagate correctly when the reaction is bad.") } if !me.eventReceive.reactionTo.Equals(cryptoChannel.MessageID{}) { - t.Errorf("Reaction ID propogated correctly when the reaction " + - "is bad") + t.Errorf("Reaction ID propagate correctly when the reaction is bad.") } if me.eventReceive.nickname != "" { - t.Errorf("SenderID propogated correctly when the reaction " + - "is bad") + t.Errorf("SenderID propagate correctly when the reaction is bad.") } if me.eventReceive.lease != 0 { - t.Errorf("Message lease propogated correctly when the " + - "reaction is bad") + t.Errorf("Message lease propagate correctly when the reaction is bad.") } } func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) { me := &MockEvent{} - e := initEvents(me) // craft the input for the event @@ -851,7 +838,7 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) { textMarshaled, err := proto.Marshal(textPayload) if err != nil { - t.Fatalf("failed to marshael the message proto: %+v", err) + t.Fatalf("Failed to marshael the message proto: %+v", err) } msgID := cryptoChannel.MakeMessageID(textMarshaled, chID) @@ -870,34 +857,30 @@ func TestEvents_receiveReaction_InvalidReactionContent(t *testing.T) { if err != nil { t.Fatalf(err.Error()) } - // call the handler + + // Call the handler e.receiveReaction(chID, msgID, 0, senderUsername, textMarshaled, pi.PubKey, pi.CodesetVersion, ts, lease, r, Delivered) - // check the results on the model + // Check the results on the model if me.eventReceive.channelID != nil { - t.Errorf("Channel ID did propogated correctly when the reaction " + - "is bad") + t.Error("Channel ID did propagate correctly when the reaction is bad.") } if me.eventReceive.messageID.Equals(msgID) { - t.Errorf("Message ID propogated correctly when the reaction is " + - "bad") + t.Error("Message ID propagate correctly when the reaction is bad.") } if !me.eventReceive.reactionTo.Equals(cryptoChannel.MessageID{}) { - t.Errorf("Reaction ID propogated correctly when the reaction " + - "is bad") + t.Error("Reaction ID propagate correctly when the reaction is bad.") } if me.eventReceive.nickname != "" { - t.Errorf("SenderID propogated correctly when the reaction " + - "is bad") + t.Error("SenderID propagate correctly when the reaction is bad.") } if me.eventReceive.lease != 0 { - t.Errorf("Message lease propogated correctly when the " + - "reaction is bad") + t.Error("Message lease propagate correctly when the reaction is bad.") } } diff --git a/channels/identityStore.go b/channels/identityStore.go index 2432a86c8ee10449502319ae443e32a88c74a908..2a98eb93903ce85eb79683f570fc3f742a38c50d 100644 --- a/channels/identityStore.go +++ b/channels/identityStore.go @@ -1,7 +1,7 @@ package channels import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/channels/identityStore_test.go b/channels/identityStore_test.go index ec2d72f9b90d77accb42d757682fa83f333689f2..bb80542e75dc0f6acd68e1697f6de68ebe1d09f4 100644 --- a/channels/identityStore_test.go +++ b/channels/identityStore_test.go @@ -10,7 +10,7 @@ package channels import ( "bytes" "encoding/base64" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" @@ -36,11 +36,8 @@ func TestStoreLoadIdentity(t *testing.T) { } if !bytes.Equal(loadedIdentity.Marshal(), privIdentity.Marshal()) { - t.Fatalf("Failed to load private identity."+ - "\nExpected: %s"+ - "\nReceived: %s", + t.Fatalf("Failed to load private identity.\nexpected: %s\nreceived: %s", base64.StdEncoding.EncodeToString(privIdentity.Marshal()), base64.StdEncoding.EncodeToString(loadedIdentity.Marshal())) } - -} \ No newline at end of file +} diff --git a/channels/interface.go b/channels/interface.go index b7d5445ced2690ef80a77ca0b30f087f814de43f..c1b1a2a745634f0dff6ec38acf36fb5a2449393d 100644 --- a/channels/interface.go +++ b/channels/interface.go @@ -11,8 +11,8 @@ import ( "math" "time" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/rsa" @@ -20,23 +20,25 @@ import ( "gitlab.com/xx_network/primitives/id/ephemeral" ) -// ValidForever is used as a validUntil lease when sending to denote the -// message or operation never expires. Note: A message relay must be -// present to enforce this otherwise things expire after 3 weeks due to -// network retention. +// ValidForever is used as a validUntil lease when sending to denote the message +// or operation never expires. +// +// Note: A message relay must be present to enforce this otherwise things expire +// after 3 weeks due to network retention. var ValidForever = time.Duration(math.MaxInt64) +// Manager provides an interface to manager channels. type Manager interface { - - // GetIdentity returns the public identity associated with this channel manager + // GetIdentity returns the public identity associated with this channel + // manager. GetIdentity() cryptoChannel.Identity // ExportPrivateIdentity encrypts and exports the private identity to a // portable string. ExportPrivateIdentity(password string) ([]byte, error) - // GetStorageTag returns the tag at which this manager is store for loading - // it is derived from the public key + // GetStorageTag returns the tag at where this manager is stored. To be used + // when loading the manager. The storage tag is derived from the public key. GetStorageTag() string // JoinChannel joins the given channel. It will fail if the channel has @@ -48,44 +50,52 @@ type Manager interface { LeaveChannel(channelID *id.ID) error // SendGeneric is used to send a raw message over a channel. In general, it - // should be wrapped in a function which defines the wire protocol - // If the final message, before being sent over the wire, is too long, this will - // return an error. Due to the underlying encoding using compression, it isn't - // possible to define the largest payload that can be sent, but - // it will always be possible to send a payload of 802 bytes at minimum - // Them meaning of validUntil depends on the use case. + // should be wrapped in a function that defines the wire protocol. + // + // If the final message, before being sent over the wire, is too long, this + // will return an error. Due to the underlying encoding using compression, + // it is not possible to define the largest payload that can be sent, but it + // will always be possible to send a payload of 802 bytes at minimum. + // + // The meaning of validUntil depends on the use case. SendGeneric(channelID *id.ID, messageType MessageType, msg []byte, validUntil time.Duration, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) // SendAdminGeneric is used to send a raw message over a channel encrypted // with admin keys, identifying it as sent by the admin. In general, it - // should be wrapped in a function which defines the wire protocol - // If the final message, before being sent over the wire, is too long, this will - // return an error. The message must be at most 510 bytes long. + // should be wrapped in a function that defines the wire protocol. + // + // If the final message, before being sent over the wire, is too long, this + // will return an error. The message must be at most 510 bytes long. SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, messageType MessageType, msg []byte, validUntil time.Duration, params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) // SendMessage is used to send a formatted message over a channel. - // Due to the underlying encoding using compression, it isn't - // possible to define the largest payload that can be sent, but - // it will always be possible to send a payload of 798 bytes at minimum + // + // Due to the underlying encoding using compression, it is not possible to + // define the largest payload that can be sent, but it will always be + // possible to send a payload of 798 bytes at minimum. + // // The message will auto delete validUntil after the round it is sent in, - // lasting forever if ValidForever is used + // lasting forever if ValidForever is used. SendMessage(channelID *id.ID, msg string, validUntil time.Duration, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) // SendReply is used to send a formatted message over a channel. - // Due to the underlying encoding using compression, it isn't - // possible to define the largest payload that can be sent, but - // it will always be possible to send a payload of 766 bytes at minimum. - // If the message ID the reply is sent to doesnt exist, the other side will - // post the message as a normal message and not a reply. + // + // Due to the underlying encoding using compression, it is not possible to + // define the largest payload that can be sent, but it will always be + // possible to send a payload of 766 bytes at minimum. + // + // If the message ID that the reply is sent to does not exist, then the + // other side will post the message as a normal message and not as a reply. + // // The message will auto delete validUntil after the round it is sent in, - // lasting forever if ValidForever is used + // lasting forever if ValidForever is used. SendReply(channelID *id.ID, msg string, replyTo cryptoChannel.MessageID, validUntil time.Duration, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) @@ -106,8 +116,8 @@ type Manager interface { // // There can only be one handler per message type, and this will return an // error on a multiple registration. - RegisterReceiveHandler(messageType MessageType, - listener MessageTypeReceiveMessage) error + RegisterReceiveHandler( + messageType MessageType, listener MessageTypeReceiveMessage) error // GetChannels returns the IDs of all channels that have been joined. Use // getChannelsUnsafe if you already have taken the mux. @@ -120,17 +130,17 @@ type Manager interface { // ReplayChannel replays all messages from the channel within the network's // memory (~3 weeks) over the event model. It does this by wiping the // underlying state tracking for message pickup for the channel, causing all - // messages to be re-retrieved from the network + // messages to be re-retrieved from the network. ReplayChannel(chID *id.ID) error // SetNickname sets the nickname for a channel after checking that the - // nickname is valid using IsNicknameValid. - SetNickname(newNick string, ch *id.ID) error + // nickname is valid using [IsNicknameValid]. + SetNickname(newNick string, chID *id.ID) error // DeleteNickname removes the nickname for a given channel, using the // codename for that channel instead. - DeleteNickname(ch *id.ID) error + DeleteNickname(chID *id.ID) error - // GetNickname returns the nickname for the given channel if it exists. - GetNickname(ch *id.ID) (nickname string, exists bool) + // GetNickname returns the nickname for the given channel, if it exists. + GetNickname(chID *id.ID) (nickname string, exists bool) } diff --git a/channels/joinedChannel.go b/channels/joinedChannel.go index 1b6aa53e7f9b2539b983c418eab52368d7c129c0..3071007301460d308a8814082ed449ab6acfc759 100644 --- a/channels/joinedChannel.go +++ b/channels/joinedChannel.go @@ -10,8 +10,8 @@ package channels import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/broadcast" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/broadcast" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" @@ -211,7 +211,8 @@ func (jc *joinedChannel) Store(kv *versioned.KV) error { // loadJoinedChannel loads a given channel from ekv storage. func loadJoinedChannel(chId *id.ID, kv *versioned.KV, net broadcast.Client, rngGen *fastRNG.StreamGenerator, e *events, - broadcastMaker broadcast.NewBroadcastChannelFunc, mr messageReceiveFunc) (*joinedChannel, error) { + broadcastMaker broadcast.NewBroadcastChannelFunc, mr messageReceiveFunc) ( + *joinedChannel, error) { obj, err := kv.Get(makeJoinedChannelKey(chId), joinedChannelVersion) if err != nil { return nil, err @@ -240,10 +241,10 @@ func makeJoinedChannelKey(chId *id.ID) string { return joinedChannelKey + chId.HexEncode() } -func initBroadcast(c *cryptoBroadcast.Channel, - e *events, net broadcast.Client, +func initBroadcast(c *cryptoBroadcast.Channel, e *events, net broadcast.Client, broadcastMaker broadcast.NewBroadcastChannelFunc, - rngGen *fastRNG.StreamGenerator, mr messageReceiveFunc) (broadcast.Channel, error) { + rngGen *fastRNG.StreamGenerator, mr messageReceiveFunc) ( + broadcast.Channel, error) { b, err := broadcastMaker(c, net, rngGen) if err != nil { return nil, err diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go index 5b77b6a0114cfcf715e98b9cb071ef746efb5dd1..30b7d9b4e0a72f7264bb9dd85313d59209633762 100644 --- a/channels/joinedChannel_test.go +++ b/channels/joinedChannel_test.go @@ -15,14 +15,15 @@ import ( "reflect" "sort" "strconv" + "sync" "testing" "time" - "gitlab.com/elixxir/client/broadcast" - clientCmix "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/broadcast" + clientCmix "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" @@ -39,7 +40,7 @@ func Test_manager_store(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -47,7 +48,7 @@ func Test_manager_store(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -86,7 +87,7 @@ func Test_manager_loadChannels(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -94,7 +95,7 @@ func Test_manager_loadChannels(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -103,7 +104,8 @@ func Test_manager_loadChannels(t *testing.T) { for i := range expected { ch, _, err := newTestChannel( - "name_"+strconv.Itoa(i), "description_"+strconv.Itoa(i), m.rng.GetStream(), cryptoBroadcast.Public) + "name_"+strconv.Itoa(i), "description_"+strconv.Itoa(i), + m.rng.GetStream(), cryptoBroadcast.Public) if err != nil { t.Errorf("Failed to create new channel %d: %+v", i, err) } @@ -168,7 +170,7 @@ func Test_manager_addChannel(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -176,7 +178,7 @@ func Test_manager_addChannel(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -214,7 +216,7 @@ func Test_manager_addChannel_ChannelAlreadyExistsErr(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -222,7 +224,7 @@ func Test_manager_addChannel_ChannelAlreadyExistsErr(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -251,7 +253,7 @@ func Test_manager_removeChannel(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -259,7 +261,7 @@ func Test_manager_removeChannel(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -297,7 +299,7 @@ func Test_manager_removeChannel_ChannelDoesNotExistsErr(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -305,7 +307,7 @@ func Test_manager_removeChannel_ChannelDoesNotExistsErr(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -330,7 +332,7 @@ func Test_manager_getChannel(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -338,7 +340,7 @@ func Test_manager_getChannel(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -372,7 +374,7 @@ func Test_manager_getChannel_ChannelDoesNotExistsErr(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -380,7 +382,7 @@ func Test_manager_getChannel_ChannelDoesNotExistsErr(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -406,7 +408,7 @@ func Test_manager_getChannels(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -414,7 +416,7 @@ func Test_manager_getChannels(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -423,7 +425,8 @@ func Test_manager_getChannels(t *testing.T) { for i := range expected { ch, _, err := newTestChannel( - "name_"+strconv.Itoa(i), "description_"+strconv.Itoa(i), m.rng.GetStream(), cryptoBroadcast.Public) + "name_"+strconv.Itoa(i), "description_"+strconv.Itoa(i), + m.rng.GetStream(), cryptoBroadcast.Public) if err != nil { t.Errorf("Failed to create new channel %d: %+v", i, err) } @@ -486,7 +489,7 @@ func Test_loadJoinedChannel(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } mFace, err := NewManager(pi, versioned.NewKV(ekv.MakeMemstore()), @@ -494,7 +497,7 @@ func Test_loadJoinedChannel(t *testing.T) { fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG), mockEventModelBuilder) if err != nil { - t.Errorf(err.Error()) + t.Errorf("NewManager error: %+v", err) } m := mFace.(*manager) @@ -511,9 +514,8 @@ func Test_loadJoinedChannel(t *testing.T) { } loadedJc, err := loadJoinedChannel(ch.ReceptionID, m.kv, m.net, m.rng, - m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID, r rounds.Round) bool { - return false - }) + m.events, m.broadcastMaker, + func(cryptoChannel.MessageID, rounds.Round) bool { return false }) if err != nil { t.Errorf("Failed to load joinedChannel: %+v", err) } @@ -589,7 +591,6 @@ func Test_makeJoinedChannelKey_Consistency(t *testing.T) { binary.BigEndian.Uint64(chID[:8]), expected, key) } } - } // newTestChannel creates a new cryptoBroadcast.Channel in the same way that @@ -618,13 +619,12 @@ func (m *mockBroadcastClient) SendWithAssembler(*id.ID, return rounds.Round{ID: id.Round(567)}, ephemeral.Id{}, nil } -func (m *mockBroadcastClient) IsHealthy() bool { return true } -func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {} -func (m *mockBroadcastClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { -} -func (m *mockBroadcastClient) AddService(*id.ID, message.Service, message.Processor) {} -func (m *mockBroadcastClient) DeleteClientService(*id.ID) {} -func (m *mockBroadcastClient) RemoveIdentity(*id.ID) {} +func (m *mockBroadcastClient) IsHealthy() bool { return true } +func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockBroadcastClient) AddIdentityWithHistory(*id.ID, time.Time, time.Time, bool) {} +func (m *mockBroadcastClient) AddService(*id.ID, message.Service, message.Processor) {} +func (m *mockBroadcastClient) DeleteClientService(*id.ID) {} +func (m *mockBroadcastClient) RemoveIdentity(*id.ID) {} func (m *mockBroadcastClient) GetRoundResults(time.Duration, clientCmix.RoundEventCallback, ...id.Round) { } func (m *mockBroadcastClient) AddHealthCallback(func(bool)) uint64 { return 0 } @@ -642,10 +642,34 @@ func mockEventModelBuilder(string) (EventModel, error) { type mockEventModel struct { joinedCh *cryptoBroadcast.Channel leftCh *id.ID + + // Used to prevent fix race condition + sync.Mutex } -func (m *mockEventModel) JoinChannel(c *cryptoBroadcast.Channel) { m.joinedCh = c } -func (m *mockEventModel) LeaveChannel(c *id.ID) { m.leftCh = c } +func (m *mockEventModel) getJoinedCh() *cryptoBroadcast.Channel { + m.Lock() + defer m.Unlock() + return m.joinedCh +} + +func (m *mockEventModel) getLeftCh() *id.ID { + m.Lock() + defer m.Unlock() + return m.leftCh +} + +func (m *mockEventModel) JoinChannel(c *cryptoBroadcast.Channel) { + m.Lock() + defer m.Unlock() + m.joinedCh = c +} + +func (m *mockEventModel) LeaveChannel(c *id.ID) { + m.Lock() + defer m.Unlock() + m.leftCh = c +} func (m *mockEventModel) ReceiveMessage(*id.ID, cryptoChannel.MessageID, string, string, ed25519.PublicKey, uint8, time.Time, time.Duration, rounds.Round, @@ -667,6 +691,5 @@ func (m *mockEventModel) ReceiveReaction(*id.ID, cryptoChannel.MessageID, func (m *mockEventModel) UpdateSentStatus(uint64, cryptoChannel.MessageID, time.Time, rounds.Round, SentStatus) { - // TODO implement me panic("implement me") } diff --git a/channels/manager.go b/channels/manager.go index 56926aa1a474c992b48eae10cccedb9a1fd3bb6b..26e09ca287456833605e02776a7bae162c07ae82 100644 --- a/channels/manager.go +++ b/channels/manager.go @@ -16,11 +16,11 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/broadcast" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/broadcast" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" @@ -67,7 +67,8 @@ type Client interface { cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) IsHealthy() bool AddIdentity(id *id.ID, validUntil time.Time, persistent bool) - AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) + AddIdentityWithHistory( + id *id.ID, validUntil, beginning time.Time, persistent bool) AddService(clientID *id.ID, newService message.Service, response message.Processor) DeleteClientService(clientID *id.ID) @@ -194,7 +195,8 @@ func (m *manager) GetChannels() []*id.ID { return m.getChannelsUnsafe() } -// GetChannel returns the underlying cryptographic structure for a given channel. +// GetChannel returns the underlying cryptographic structure for a given +// channel. func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) { jww.INFO.Printf("GetChannel(%s)", chID) jc, err := m.getChannel(chID) @@ -207,9 +209,9 @@ func (m *manager) GetChannel(chID *id.ID) (*cryptoBroadcast.Channel, error) { } // ReplayChannel replays all messages from the channel within the network's -// memory (~3 weeks) over the event model. It does this by wiping the -// underlying state tracking for message pickup for the channel, causing all -// messages to be re-retrieved from the network +// memory (~3 weeks) over the event model. It does this by wiping the underlying +// state tracking for message pickup for the channel, causing all messages to be +// re-retrieved from the network. func (m *manager) ReplayChannel(chID *id.ID) error { jww.INFO.Printf("ReplayChannel(%s)", chID) m.mux.RLock() @@ -238,13 +240,7 @@ func (m *manager) ReplayChannel(chID *id.ID) error { } -// GetStorageTag returns the tag at which this manager is store for loading -// it is derived from the public key -func (m *manager) GetStorageTag() string { - return getStorageTag(m.me.PubKey) -} - -// GetIdentity returns the public identity associated with this channel manager +// GetIdentity returns the public identity associated with this channel manager. func (m *manager) GetIdentity() cryptoChannel.Identity { return m.me.Identity } @@ -258,6 +254,13 @@ func (m *manager) ExportPrivateIdentity(password string) ([]byte, error) { return m.me.Export(password, rng) } +// GetStorageTag returns the tag at where this manager is stored. To be used +// when loading the manager. The storage tag is derived from the public key. +func (m *manager) GetStorageTag() string { + return getStorageTag(m.me.PubKey) +} + +// getStorageTag generates a storage tag from an Ed25519 public key. func getStorageTag(pub ed25519.PublicKey) string { return fmt.Sprintf(storageTagFormat, base64.StdEncoding.EncodeToString(pub)) } diff --git a/channels/manager_test.go b/channels/manager_test.go index e4213bd7c369143fec41c60895150bf79e0ea3a6..4bc2cceadf65fa4d23c7bdf7313ad5acb3db7d1b 100644 --- a/channels/manager_test.go +++ b/channels/manager_test.go @@ -9,8 +9,8 @@ package channels import ( "fmt" - "gitlab.com/elixxir/client/broadcast" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/broadcast" + "gitlab.com/elixxir/client/v4/storage/versioned" broadcast2 "gitlab.com/elixxir/crypto/broadcast" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" @@ -27,9 +27,10 @@ import ( ) func TestMain(m *testing.M) { - // Many tests trigger WARN prints;, set the out threshold so the WARN prints + // Many tests trigger WARN prints; set the out threshold so the WARN prints // can be seen in the logs jww.SetStdoutThreshold(jww.LevelWarn) + os.Exit(m.Run()) } @@ -60,19 +61,18 @@ func TestManager_JoinChannel(t *testing.T) { err = m.JoinChannel(ch) if err != nil { - t.Fatalf("Join Channel Errored: %s", err) + t.Fatalf("Join Channel Errored: %+v", err) } if _, exists := m.channels[*ch.ReceptionID]; !exists { t.Errorf("Channel %s not added to channel map.", ch.Name) } - //wait because the event model is called in another thread + // Wait because the event model is called in another thread time.Sleep(1 * time.Second) - if mem.joinedCh == nil { - t.Errorf("the channel join call was not propogated to the event " + - "model") + if mem.getJoinedCh() == nil { + t.Error("The channel join call was not propagated to the event model.") } } @@ -104,24 +104,23 @@ func TestManager_LeaveChannel(t *testing.T) { err = m.JoinChannel(ch) if err != nil { - t.Fatalf("Join Channel Errored: %s", err) + t.Fatalf("Join Channel Errored: %+v", err) } err = m.LeaveChannel(ch.ReceptionID) if err != nil { - t.Fatalf("Leave Channel Errored: %s", err) + t.Fatalf("Leave Channel Errored: %+v", err) } if _, exists := m.channels[*ch.ReceptionID]; exists { t.Errorf("Channel %s still in map.", ch.Name) } - //wait because the event model is called in another thread + // Wait because the event model is called in another thread time.Sleep(1 * time.Second) - if mem.leftCh == nil { - t.Errorf("the channel join call was not propogated to the event " + - "model") + if mem.getLeftCh() == nil { + t.Error("The channel join call was not propagated to the event model.") } } @@ -133,12 +132,12 @@ func TestManager_GetChannels(t *testing.T) { rng := fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG) - numtests := 10 + n := 10 chList := make(map[id.ID]interface{}) for i := 0; i < 10; i++ { - name := fmt.Sprintf("testChannel_%d", numtests) + name := fmt.Sprintf("testChannel_%d", n) s := rng.GetStream() tc, _, err := newTestChannel(name, "blarg", s, broadcast2.Public) s.Close() @@ -170,12 +169,12 @@ func TestManager_GetChannel(t *testing.T) { rng := fastRNG.NewStreamGenerator(1, 1, csprng.NewSystemRNG) - numtests := 10 + n := 10 - chList := make([]*id.ID, 0, numtests) + chList := make([]*id.ID, 0, n) for i := 0; i < 10; i++ { - name := fmt.Sprintf("testChannel_%d", numtests) + name := fmt.Sprintf("testChannel_%d", n) s := rng.GetStream() tc, _, err := newTestChannel(name, "blarg", s, broadcast2.Public) s.Close() @@ -206,9 +205,9 @@ func TestManager_GetChannel_BadChannel(t *testing.T) { mux: sync.RWMutex{}, } - numtests := 10 + n := 10 - chList := make([]*id.ID, 0, numtests) + chList := make([]*id.ID, 0, n) for i := 0; i < 10; i++ { chId := &id.ID{} @@ -219,7 +218,7 @@ func TestManager_GetChannel_BadChannel(t *testing.T) { for i, receivedCh := range chList { _, err := m.GetChannel(receivedCh) if err == nil { - t.Errorf("Channel %d returned when it doesnt exist", i) + t.Errorf("Channel %d returned when it does not exist", i) } } } diff --git a/channels/messageTypes.go b/channels/messageTypes.go index 5ac6e2de3c914131655e484599171c5ac6114d90..e0ae79a0c09c91ac00489496ff99a257d881ed27 100644 --- a/channels/messageTypes.go +++ b/channels/messageTypes.go @@ -7,16 +7,28 @@ package channels -import "fmt" +import ( + "strconv" +) +// MessageType is the type of message being sent to a channel. type MessageType uint32 const ( - Text = MessageType(1) - AdminText = MessageType(2) - Reaction = MessageType(3) + // Text is the default type for a message. It denotes that the message only + // contains text. + Text MessageType = 1 + + // AdminText denotes that the message only contains text and that it comes + // from the channel admin. + AdminText MessageType = 2 + + // Reaction denotes that the message is a reaction to another message. + Reaction MessageType = 3 ) +// String returns a human-readable version of [MessageType], used for debugging +// and logging. This function adheres to the [fmt.Stringer] interface. func (mt MessageType) String() string { switch mt { case Text: @@ -26,6 +38,6 @@ func (mt MessageType) String() string { case Reaction: return "Reaction" default: - return fmt.Sprintf("Unknown messageType %d", mt) + return "Unknown messageType " + strconv.Itoa(int(mt)) } } diff --git a/channels/messages.go b/channels/messages.go index 0162c3c62f62c10c7c652d206e405e7a2383327b..c57ba731276fd989712e3c267d0e76006fc30b8c 100644 --- a/channels/messages.go +++ b/channels/messages.go @@ -20,7 +20,8 @@ type userMessageInternal struct { messageID channel.MessageID } -func newUserMessageInternal(ursMsg *UserMessage, chid *id.ID) (*userMessageInternal, error) { +func newUserMessageInternal( + ursMsg *UserMessage, chID *id.ID) (*userMessageInternal, error) { chanMessage := &ChannelMessage{} err := proto.Unmarshal(ursMsg.Message, chanMessage) if err != nil { @@ -31,11 +32,12 @@ func newUserMessageInternal(ursMsg *UserMessage, chid *id.ID) (*userMessageInter return &userMessageInternal{ userMessage: ursMsg, channelMessage: channelMessage, - messageID: channel.MakeMessageID(ursMsg.Message, chid), + messageID: channel.MakeMessageID(ursMsg.Message, chID), }, nil } -func unmarshalUserMessageInternal(usrMsg []byte, chid *id.ID) (*userMessageInternal, error) { +func unmarshalUserMessageInternal( + usrMsg []byte, chID *id.ID) (*userMessageInternal, error) { um := &UserMessage{} if err := proto.Unmarshal(usrMsg, um); err != nil { @@ -53,7 +55,7 @@ func unmarshalUserMessageInternal(usrMsg []byte, chid *id.ID) (*userMessageInter return &userMessageInternal{ userMessage: um, channelMessage: channelMessage, - messageID: channel.MakeMessageID(um.Message, chid), + messageID: channel.MakeMessageID(um.Message, chID), }, nil } diff --git a/channels/messages_test.go b/channels/messages_test.go index b5109bd30a535156edc2e80556b9db51d55313e4..2f99e6e851700e6055d0e2130e9832d39f18acfd 100644 --- a/channels/messages_test.go +++ b/channels/messages_test.go @@ -120,10 +120,10 @@ func TestUserMessageInternal_GetMessageID(t *testing.T) { } } -// Ensures the serialization hasn't changed, changing the message IDs. The -// protocol is tolerant of this because only the sender seralizes, but -// it would be good to know when this changes. If this test breaks, report it, -// but it should be safe to update the expected +// Ensures the serialization has not changed, changing the message IDs. The +// protocol is tolerant of this because only the sender serializes, but it would +// be good to know when this changes. If this test breaks, report it, but it +// should be safe to update the expected. func TestUserMessageInternal_GetMessageID_Consistency(t *testing.T) { expected := "ChMsgID-LrGYLFCaPamZk44X+c/b08qtmJIorgNnoE68v1HYrf8=" @@ -138,7 +138,8 @@ func TestUserMessageInternal_GetMessageID_Consistency(t *testing.T) { } } -func builtTestUMI(t *testing.T, mt MessageType) (*userMessageInternal, *UserMessage, *ChannelMessage) { +func builtTestUMI(t *testing.T, mt MessageType) ( + *userMessageInternal, *UserMessage, *ChannelMessage) { channelMsg := &ChannelMessage{ Lease: 69, RoundID: 42, diff --git a/channels/mutateTimestamp.go b/channels/mutateTimestamp.go index 791bfc1601d840e6dfebb70aadb95b036ee5da98..a91c2e2e9b49dfceb97c353c5b5b5686cb73d0be 100644 --- a/channels/mutateTimestamp.go +++ b/channels/mutateTimestamp.go @@ -14,8 +14,8 @@ import ( ) const ( - // tenMsInNs is a prime close to one million to ensure patterns dont - // arise due to cofactors with the message ID when doing the modulo + // tenMsInNs is a prime close to one million to ensure that patterns do not + // arise due to cofactors with the message ID when doing the modulo. tenMsInNs = 10000019 halfTenMsInNs = tenMsInNs / 2 beforeGrace = 25 * time.Second @@ -24,10 +24,10 @@ const ( var tenMsInNsLargeInt = large.NewInt(tenMsInNs) -// vetTimestamp determines which timestamp to use for a message. It will -// use the local timestamp provided in the message as long as it is within 25 -// seconds before the round and 2 second after the round. Otherwise, it will -// use the round timestamp via mutateTimestamp +// vetTimestamp determines which timestamp to use for a message. It will use the +// local timestamp provided in the message as long as it is within 25 seconds +// before the round and 2 second after the round. Otherwise, it will use the +// round timestamp via mutateTimestamp. func vetTimestamp(localTS, ts time.Time, msgID channel.MessageID) time.Time { before := ts.Add(-beforeGrace) @@ -40,17 +40,18 @@ func vetTimestamp(localTS, ts time.Time, msgID channel.MessageID) time.Time { return localTS } -// mutateTimestamp is used to modify the the timestamps on all messages in a +// mutateTimestamp is used to modify the timestamps on all messages in a // deterministic manner. This is because message ordering is done by timestamp // and the timestamps come from the rounds, which means multiple messages can // have the same timestamp due to being in the same round. The meaning of // conversations can change depending on order, so while no explicit order // can be discovered because to do so can leak potential ordering info for the // mix, choosing an arbitrary order and having all clients agree will at least -// ensure that misunderstandings due to disagreements in order cannot occur +// ensure that misunderstandings due to disagreements in order cannot occur. // // In order to do this, this function mutates the timestamp of the round within // +/- 5ms seeded based upon the message ID. +// // It should be noted that this is only a reasonable assumption when the number // of messages in a channel isn't too much. For example, under these conditions // the birthday paradox of getting a collision if there are 10 messages for the @@ -59,7 +60,7 @@ func vetTimestamp(localTS, ts time.Time, msgID channel.MessageID) time.Time { // channel (1000 messages), .0487. func mutateTimestamp(ts time.Time, msgID channel.MessageID) time.Time { - // Treat the message ID as a number and mod it by the number of ns in an ms + // Treat the message ID as a number and mod it by the number of ns in a ms // to get an offset factor. Use a prime close to 1000000 to make sure there // are no patterns in the output and reduce the chance of collision. While // the fields do not align, so there is some bias towards some parts of the diff --git a/channels/mutateTimestamp_test.go b/channels/mutateTimestamp_test.go index 93561868b10ac781ef2c86cc0b483a0fed1815f8..5e8ff98422a2030aea954c1dfa10ee6e96e4d1b6 100644 --- a/channels/mutateTimestamp_test.go +++ b/channels/mutateTimestamp_test.go @@ -48,16 +48,16 @@ func TestMutateTimestampDeltaAverage(t *testing.T) { } avg := sum / int64(samples) - diff := abs(avg - 2502865) - if diff > 30000 { - t.Fatal() + diff := abs(avg - 2_502_865) + if diff > 30_000 { + t.Fatalf("Difference %d is greater than %d", diff, 30_000) } } const generationRange = beforeGrace + afterGrace -// TestVetTimestamp_Happy tests that when the localTS is within -// the allowed range, it is unmodified +// TestVetTimestamp_Happy tests that when the localTS is within the allowed +// range, it is unmodified. func TestVetTimestamp_Happy(t *testing.T) { samples := 10000 @@ -67,7 +67,8 @@ func TestVetTimestamp_Happy(t *testing.T) { now := time.Now() - tested := now.Add(-beforeGrace).Add(time.Duration(rng.Int63()) % generationRange) + tested := now.Add(-beforeGrace).Add( + time.Duration(rng.Int63()) % generationRange) var msgID channel.MessageID rng.Read(msgID[:]) @@ -80,8 +81,8 @@ func TestVetTimestamp_Happy(t *testing.T) { } } -// TestVetTimestamp_Happy tests that when the localTS is less than -// the allowed time period it is replaced +// TestVetTimestamp_Happy tests that when the localTS is less than the allowed +// time period it is replaced. func TestVetTimestamp_BeforePeriod(t *testing.T) { samples := 10000 @@ -91,7 +92,8 @@ func TestVetTimestamp_BeforePeriod(t *testing.T) { now := time.Now() - tested := now.Add(-beforeGrace).Add(-time.Duration(rng.Int63()) % (100000 * time.Hour)) + tested := now.Add(-beforeGrace).Add( + -time.Duration(rng.Int63()) % (100000 * time.Hour)) var msgID channel.MessageID rng.Read(msgID[:]) @@ -104,8 +106,8 @@ func TestVetTimestamp_BeforePeriod(t *testing.T) { } } -// TestVetTimestamp_Happy tests that when the localTS is greater than -// the allowed time period it is replaced +// TestVetTimestamp_Happy tests that when the localTS is greater than the +// allowed time period it is replaced func TestVetTimestamp_AfterPeriod(t *testing.T) { samples := 10000 @@ -115,7 +117,8 @@ func TestVetTimestamp_AfterPeriod(t *testing.T) { now := time.Now() - tested := now.Add(afterGrace).Add(-time.Duration(rng.Int63()) % (100000 * time.Hour)) + tested := now.Add(afterGrace).Add( + -time.Duration(rng.Int63()) % (100000 * time.Hour)) var msgID channel.MessageID rng.Read(msgID[:]) diff --git a/channels/nameService.go b/channels/nameService.go index d77fa9414a4f0fe1d8a32fae130936187f2fcf92..23714e4d1166fc869ca0596a4576027980e9d0a8 100644 --- a/channels/nameService.go +++ b/channels/nameService.go @@ -12,27 +12,26 @@ import ( "time" ) -// NameService is an interface which encapsulates -// the user identity channel tracking service. -// NameService is currently unused +// NameService is an interface which encapsulates the user identity channel +// tracking service. +// +// NameService is currently unused. type NameService interface { - // GetUsername returns the username. GetUsername() string - // GetChannelValidationSignature returns the validation - // signature and the time it was signed. + // GetChannelValidationSignature returns the validation signature and the + // time it was signed. GetChannelValidationSignature() ([]byte, time.Time) // GetChannelPubkey returns the user's public key. GetChannelPubkey() ed25519.PublicKey - // SignChannelMessage returns the signature of the - // given message. + // SignChannelMessage returns the signature of the given message. SignChannelMessage(message []byte) (signature []byte, err error) // ValidateChannelMessage validates that a received channel message's - // username lease is signed by the NameService + // username lease is signed by the NameService. ValidateChannelMessage(username string, lease time.Time, pubKey ed25519.PublicKey, authorIDSignature []byte) bool } diff --git a/channels/nickname.go b/channels/nickname.go index 5116b597f754c09ce1b6bae06ec878c5192debfe..adc989c06bda6eefb72965a7236ce5511d76f319 100644 --- a/channels/nickname.go +++ b/channels/nickname.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" @@ -23,8 +23,8 @@ type nicknameManager struct { kv *versioned.KV } -// loadOrNewNicknameManager returns the stored nickname manager if there is -// one or returns a new one +// loadOrNewNicknameManager returns the stored nickname manager if there is one +// or returns a new one. func loadOrNewNicknameManager(kv *versioned.KV) *nicknameManager { nm := &nicknameManager{ byChannel: make(map[id.ID]string), @@ -39,19 +39,19 @@ func loadOrNewNicknameManager(kv *versioned.KV) *nicknameManager { } -// GetNickname returns the nickname for the given channel if it exists -func (nm *nicknameManager) GetNickname(ch *id.ID) ( +// GetNickname returns the nickname for the given channel if it exists. +func (nm *nicknameManager) GetNickname(chID *id.ID) ( nickname string, exists bool) { nm.mux.RLock() defer nm.mux.RUnlock() - nickname, exists = nm.byChannel[*ch] + nickname, exists = nm.byChannel[*chID] return } // SetNickname sets the nickname for a channel after checking that the nickname -// is valid using IsNicknameValid -func (nm *nicknameManager) SetNickname(newNick string, ch *id.ID) error { +// is valid using [IsNicknameValid]. +func (nm *nicknameManager) SetNickname(newNick string, chID *id.ID) error { nm.mux.Lock() defer nm.mux.Unlock() @@ -59,17 +59,17 @@ func (nm *nicknameManager) SetNickname(newNick string, ch *id.ID) error { return err } - nm.byChannel[*ch] = newNick + nm.byChannel[*chID] = newNick return nm.save() } // DeleteNickname removes the nickname for a given channel, using the codename -// for that channel instead -func (nm *nicknameManager) DeleteNickname(ch *id.ID) error { +// for that channel instead. +func (nm *nicknameManager) DeleteNickname(chID *id.ID) error { nm.mux.Lock() defer nm.mux.Unlock() - delete(nm.byChannel, *ch) + delete(nm.byChannel, *chID) return nm.save() } @@ -126,12 +126,13 @@ func (nm *nicknameManager) load() error { return nil } -// IsNicknameValid checks if a nickname is valid +// IsNicknameValid checks if a nickname is valid. // -// rules -// - a nickname must not be longer than 24 characters -// - a nickname must not be shorter than 1 character -// todo: add character filtering +// Rules: +// - A nickname must not be longer than 24 characters. +// - A nickname must not be shorter than 1 character. +// +// TODO: Add character filtering. func IsNicknameValid(nick string) error { runeNick := []rune(nick) if len(runeNick) > 24 { diff --git a/channels/nickname_test.go b/channels/nickname_test.go index cf535245f82bb1e4b5c4caf5ac0b65f6355b4653..e8fc2313c4ab69f1a201aa1efa2a2d113b7e6b8b 100644 --- a/channels/nickname_test.go +++ b/channels/nickname_test.go @@ -1,7 +1,7 @@ package channels import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "strconv" @@ -56,7 +56,8 @@ func TestNicknameManager_SetGetNickname_Reload(t *testing.T) { } expected := "nickname#" + strconv.Itoa(i) if nick != expected { - t.Fatalf("Nickname %d not found, expected: %s, received: %s ", i, expected, nick) + t.Fatalf("Nickname %d not found, expected: %s, received: %s ", + i, expected, nick) } } } @@ -104,5 +105,4 @@ func TestNicknameManager_DeleteNickname(t *testing.T) { "that are not set.") } } - } diff --git a/channels/send.go b/channels/send.go index 0e508d4cc6d6c952554d90849541ba6514f46463..bd8ff456bffc47d36564170a10e4d90160401a3f 100644 --- a/channels/send.go +++ b/channels/send.go @@ -15,8 +15,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/rsa" "gitlab.com/xx_network/primitives/id" @@ -29,20 +29,30 @@ import ( const ( cmixChannelTextVersion = 0 cmixChannelReactionVersion = 0 - SendMessageTag = "ChMessage" - SendReplyTag = "ChReply" - SendReactionTag = "ChReaction" + + // SendMessageTag is the base tag used when generating a debug tag for + // sending a message. + SendMessageTag = "ChMessage" + + // SendReplyTag is the base tag used when generating a debug tag for + // sending a reply. + SendReplyTag = "ChReply" + + // SendReactionTag is the base tag used when generating a debug tag for + // sending a reaction. + SendReactionTag = "ChReaction" ) // The size of the nonce used in the message ID. const messageNonceSize = 4 // SendGeneric is used to send a raw message over a channel. In general, it -// should be wrapped in a function which defines the wire protocol +// should be wrapped in a function that defines the wire protocol. +// // If the final message, before being sent over the wire, is too long, this will -// return an error. Due to the underlying encoding using compression, it isn't -// possible to define the largest payload that can be sent, but -// it will always be possible to send a payload of 802 bytes at minimum +// return an error. Due to the underlying encoding using compression, it is not +// possible to define the largest payload that can be sent, but it will always +// be possible to send a payload of 802 bytes at minimum. func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, msg []byte, validUntil time.Duration, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) { @@ -50,15 +60,13 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, // Note: We log sends on exit, and append what happened to the message // this cuts down on clutter in the log. sendPrint := fmt.Sprintf("[%s] Sending ch %s type %d at %s", - params.DebugTag, channelID, messageType, - netTime.Now()) + params.DebugTag, channelID, messageType, netTime.Now()) defer jww.INFO.Println(sendPrint) - //find the channel + // Find the channel ch, err := m.getChannel(channelID) if err != nil { - return cryptoChannel.MessageID{}, rounds.Round{}, - ephemeral.Id{}, err + return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } nickname, _ := m.GetNickname(channelID) @@ -74,56 +82,52 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, LocalTimestamp: netTime.Now().UnixNano(), } - // Generate random nonce to be used for message ID - // generation. This makes it so two identical messages sent on - // the same round have different message IDs + // Generate random nonce to be used for message ID generation. This makes it + // so two identical messages sent on the same round have different message + // IDs. rng := m.rng.GetStream() n, err := rng.Read(chMsg.Nonce) rng.Close() if err != nil { sendPrint += fmt.Sprintf(", failed to generate nonce: %+v", err) - return cryptoChannel.MessageID{}, rounds.Round{}, - ephemeral.Id{}, + return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, errors.Errorf("Failed to generate nonce: %+v", err) } else if n != messageNonceSize { - sendPrint += fmt.Sprintf(", got %d bytes for %d-byte nonce", n, - messageNonceSize) - return cryptoChannel.MessageID{}, rounds.Round{}, - ephemeral.Id{}, + sendPrint += fmt.Sprintf( + ", got %d bytes for %d-byte nonce", n, messageNonceSize) + return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, errors.Errorf( - "Generated %d bytes for %d-byte nonce", n, - messageNonceSize) + "Generated %d bytes for %d-byte nonce", n, messageNonceSize) } usrMsg := &UserMessage{ ECCPublicKey: m.me.PubKey, } - //Note: we are not checking if message is too long before trying to - //find a round + // Note: we are not checking if message is too long before trying to find a + // round - //Build the function pointer that will build the message + // Build the function pointer that will build the message assemble := func(rid id.Round) ([]byte, error) { - - //Build the message + // Build the message chMsg.RoundID = uint64(rid) - //Serialize the message + // Serialize the message chMsgSerial, err := proto.Marshal(chMsg) if err != nil { return nil, err } - //make the messageID + // Make the messageID msgId = cryptoChannel.MakeMessageID(chMsgSerial, channelID) - //Sign the message + // Sign the message messageSig := ed25519.Sign(*m.me.Privkey, chMsgSerial) usrMsg.Message = chMsgSerial usrMsg.Signature = messageSig - //Serialize the user message + // Serialize the user message usrMsgSerial, err := proto.Marshal(usrMsg) if err != nil { return nil, err @@ -139,37 +143,37 @@ func (m *manager) SendGeneric(channelID *id.ID, messageType MessageType, messageID: msgId, }) if err != nil { - sendPrint += fmt.Sprintf(", pending send failed %s", - err.Error()) + sendPrint += fmt.Sprintf(", pending send failed %s", err.Error()) return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now()) - r, ephid, err := ch.broadcast.BroadcastWithAssembler(assemble, params) + r, ephID, err := ch.broadcast.BroadcastWithAssembler(assemble, params) if err != nil { - sendPrint += fmt.Sprintf(", broadcast failed %s, %s", - netTime.Now(), err.Error()) + sendPrint += fmt.Sprintf( + ", broadcast failed %s, %s", netTime.Now(), err.Error()) errDenote := m.st.failedSend(uuid) if errDenote != nil { - sendPrint += fmt.Sprintf(", failed to denote failed "+ - "broadcast: %s", err.Error()) + sendPrint += fmt.Sprintf( + ", failed to denote failed broadcast: %s", err.Error()) } return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } - sendPrint += fmt.Sprintf(", broadcast succeeded %s, success!", - netTime.Now()) + sendPrint += fmt.Sprintf( + ", broadcast succeeded %s, success!", netTime.Now()) err = m.st.send(uuid, msgId, r) if err != nil { sendPrint += fmt.Sprintf(", broadcast failed: %s ", err.Error()) } - return msgId, r, ephid, err + return msgId, r, ephID, err } -// SendAdminGeneric is used to send a raw message over a channel encrypted -// with admin keys, identifying it as sent by the admin. In general, it -// should be wrapped in a function which defines the wire protocol +// SendAdminGeneric is used to send a raw message over a channel encrypted with +// admin keys, identifying it as sent by the admin. In general, it should be +// wrapped in a function that defines the wire protocol. +// // If the final message, before being sent over the wire, is too long, this will // return an error. The message must be at most 510 bytes long. func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, @@ -180,11 +184,10 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, // Note: We log sends on exit, and append what happened to the message // this cuts down on clutter in the log. sendPrint := fmt.Sprintf("[%s] Admin sending ch %s type %d at %s", - params.DebugTag, channelID, messageType, - netTime.Now()) + params.DebugTag, channelID, messageType, netTime.Now()) defer jww.INFO.Println(sendPrint) - //find the channel + // Find the channel ch, err := m.getChannel(channelID) if err != nil { return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err @@ -201,7 +204,8 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, } // Generate random nonce to be used for message ID generation. This makes it - // so two identical messages sent on the same round have different message IDs + // so two identical messages sent on the same round have different message + // IDs rng := m.rng.GetStream() n, err := rng.Read(chMsg.Nonce) rng.Close() @@ -217,13 +221,12 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, // Note: we are not checking if message is too long before trying to // find a round - //Build the function pointer that will build the message + // Build the function pointer that will build the message assemble := func(rid id.Round) ([]byte, error) { - - //Build the message + // Build the message chMsg.RoundID = uint64(rid) - //Serialize the message + // Serialize the message chMsgSerial, err := proto.Marshal(chMsg) if err != nil { return nil, err @@ -231,7 +234,7 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, msgId = cryptoChannel.MakeMessageID(chMsgSerial, channelID) - //check if the message is too long + // Check if the message is too long if len(chMsgSerial) > ch.broadcast.MaxRSAToPublicPayloadSize() { return nil, MessageTooLongErr } @@ -242,39 +245,42 @@ func (m *manager) SendAdminGeneric(privKey rsa.PrivateKey, channelID *id.ID, sendPrint += fmt.Sprintf(", pending send %s", netTime.Now()) uuid, err := m.st.denotePendingAdminSend(channelID, chMsg) if err != nil { - sendPrint += fmt.Sprintf(", pending send failed %s", - err.Error()) + sendPrint += fmt.Sprintf(", pending send failed %s", err.Error()) return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } sendPrint += fmt.Sprintf(", broadcasting message %s", netTime.Now()) - r, ephid, err := ch.broadcast.BroadcastRSAToPublicWithAssembler(privKey, + r, ephID, err := ch.broadcast.BroadcastRSAToPublicWithAssembler(privKey, assemble, params) if err != nil { - sendPrint += fmt.Sprintf(", broadcast failed %s, %s", - netTime.Now(), err.Error()) + sendPrint += fmt.Sprintf( + ", broadcast failed %s, %s", netTime.Now(), err.Error()) errDenote := m.st.failedSend(uuid) if errDenote != nil { - sendPrint += fmt.Sprintf(", failed to denote failed "+ - "broadcast: %s", err.Error()) - jww.ERROR.Printf("Failed to update for a failed send to "+ - "%s: %+v", channelID, err) + sendPrint += fmt.Sprintf( + ", failed to denote failed broadcast: %s", err.Error()) + jww.ERROR.Printf( + "Failed to update for a failed send to %s: %+v", channelID, err) } return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } - sendPrint += fmt.Sprintf(", broadcast succeeded %s, success!", - netTime.Now()) + sendPrint += fmt.Sprintf( + ", broadcast succeeded %s, success!", netTime.Now()) err = m.st.send(uuid, msgId, r) if err != nil { sendPrint += fmt.Sprintf(", broadcast failed: %s ", err.Error()) } - return msgId, r, ephid, err + return msgId, r, ephID, err } // SendMessage is used to send a formatted message over a channel. -// Due to the underlying encoding using compression, it isn't -// possible to define the largest payload that can be sent, but -// it will always be possible to send a payload of 798 bytes at minimum +// +// Due to the underlying encoding using compression, it is not possible to +// define the largest payload that can be sent, but it will always be possible +// to send a payload of 798 bytes at minimum. +// +// The message will auto delete validUntil after the round it is sent in, +// lasting forever if ValidForever is used. func (m *manager) SendMessage(channelID *id.ID, msg string, validUntil time.Duration, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) { @@ -294,20 +300,24 @@ func (m *manager) SendMessage(channelID *id.ID, msg string, return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } - return m.SendGeneric(channelID, Text, txtMarshaled, validUntil, - params) + return m.SendGeneric(channelID, Text, txtMarshaled, validUntil, params) } // SendReply is used to send a formatted message over a channel. -// Due to the underlying encoding using compression, it isn't -// possible to define the largest payload that can be sent, but -// it will always be possible to send a payload of 766 bytes at minimum. -// If the message ID the reply is sent to doesnt exist, the other side will -// post the message as a normal message and not a reply. +// +// Due to the underlying encoding using compression, it is not possible to +// define the largest payload that can be sent, but it will always be possible +// to send a payload of 766 bytes at minimum. +// +// If the message ID that the reply is sent to does not exist, then the other +// side will post the message as a normal message and not as a reply. +// +// The message will auto delete validUntil after the round it is sent in, +// lasting forever if ValidForever is used. func (m *manager) SendReply(channelID *id.ID, msg string, replyTo cryptoChannel.MessageID, validUntil time.Duration, - params cmix.CMIXParams) (cryptoChannel.MessageID, rounds.Round, - ephemeral.Id, error) { + params cmix.CMIXParams) ( + cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) { tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(msg), SendReplyTag) jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, replyTo) txt := &CMIXChannelText{ @@ -327,14 +337,16 @@ func (m *manager) SendReply(channelID *id.ID, msg string, params) } -// SendReaction is used to send a reaction to a message over a channel. -// The reaction must be a single emoji with no other characters, and will -// be rejected otherwise. -// Clients will drop the reaction if they do not recognize the reactTo message +// SendReaction is used to send a reaction to a message over a channel. The +// reaction must be a single emoji with no other characters, and will be +// rejected otherwise. +// +// Clients will drop the reaction if they do not recognize the reactTo message. func (m *manager) SendReaction(channelID *id.ID, reaction string, reactTo cryptoChannel.MessageID, params cmix.CMIXParams) ( cryptoChannel.MessageID, rounds.Round, ephemeral.Id, error) { - tag := makeChaDebugTag(channelID, m.me.PubKey, []byte(reaction), SendReactionTag) + tag := makeChaDebugTag( + channelID, m.me.PubKey, []byte(reaction), SendReactionTag) jww.INFO.Printf("[%s]SendReply(%s, to %s)", tag, channelID, reactTo) if err := ValidateReaction(reaction); err != nil { @@ -354,13 +366,14 @@ func (m *manager) SendReaction(channelID *id.ID, reaction string, return cryptoChannel.MessageID{}, rounds.Round{}, ephemeral.Id{}, err } - return m.SendGeneric(channelID, Reaction, reactMarshaled, ValidForever, - params) + return m.SendGeneric( + channelID, Reaction, reactMarshaled, ValidForever, params) } -// makeChaDebugTag is a debug helper that creates non-unique msg identifier -// This is set as the debug tag on messages and enables some level -// of tracing a message (if it's contents/chan/type are unique) +// makeChaDebugTag is a debug helper that creates non-unique msg identifier. +// +// This is set as the debug tag on messages and enables some level of tracing a +// message (if its contents/chan/type are unique). func makeChaDebugTag(channelID *id.ID, id ed25519.PublicKey, msg []byte, baseTag string) string { @@ -369,6 +382,6 @@ func makeChaDebugTag(channelID *id.ID, id ed25519.PublicKey, h.Write(msg) h.Write(id) - tripcode := base64.RawStdEncoding.EncodeToString(h.Sum(nil))[:12] - return fmt.Sprintf("%s-%s", baseTag, tripcode) + tripCode := base64.RawStdEncoding.EncodeToString(h.Sum(nil))[:12] + return fmt.Sprintf("%s-%s", baseTag, tripCode) } diff --git a/channels/sendTracker.go b/channels/sendTracker.go index f75819fe2ccea74308cce60ee9087a3b1fc40320..11aed9026d7998165ace00bbf0345d68ec69ae0a 100644 --- a/channels/sendTracker.go +++ b/channels/sendTracker.go @@ -11,10 +11,10 @@ import ( "encoding/json" "errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/states" @@ -32,9 +32,8 @@ const ( sendTrackerUnsentStorageVersion = 0 getRoundResultsTimeout = 60 * time.Second - // number of times it will attempt to get round status before the round - // is assumed to have failed. Tracking per round does not persist across - // runs + // Number of times it will attempt to get round status before the round is + // assumed to have failed. Tracking per round does not persist across runs maxChecks = 3 oneSecond = 1000 * time.Millisecond @@ -52,10 +51,10 @@ type trackedList struct { RoundCompleted bool } -// the sendTracker tracks outbound messages and denotes when they are delivered -// to the event model. It also captures incoming messages and in the event they +// sendTracker tracks outbound messages and denotes when they are delivered to +// the event model. It also captures incoming messages and in the event they // were sent by this user diverts them as status updates on the previously sent -// messages +// messages. type sendTracker struct { byRound map[id.Round]trackedList @@ -77,8 +76,9 @@ type sendTracker struct { } // messageReceiveFunc is a function type for sendTracker.MessageReceive so it -// can be mocked for testing where used -type messageReceiveFunc func(messageID cryptoChannel.MessageID, r rounds.Round) bool +// can be mocked for testing where used. +type messageReceiveFunc func( + messageID cryptoChannel.MessageID, r rounds.Round) bool // loadSendTracker loads a sent tracker, restoring from disk. It will register a // function with the cmix client, delayed on when the network goes healthy, @@ -98,27 +98,25 @@ func loadSendTracker(net Client, kv *versioned.KV, trigger triggerEventFunc, rngSrc: rngSource, } - /*if err := st.load(); !kv.Exists(err){ - jww.FATAL.Panicf("failed to load sent tracker: %+v", err) - }*/ - st.load() + if err := st.load(); err != nil && kv.Exists(err) { + jww.FATAL.Panicf("Failed to load channels sent tracker: %+v", err) + } - //denote all unsent messages as failed and clear + // Denote all unsent messages as failed and clear for uuid, t := range st.unsent { - updateStatus(uuid, t.MsgID, - time.Time{}, rounds.Round{}, Failed) + updateStatus(uuid, t.MsgID, time.Time{}, rounds.Round{}, Failed) } st.unsent = make(map[uint64]*tracked) - //register to check all outstanding rounds when the network becomes healthy + // Register to check all outstanding rounds when the network becomes healthy var callBackID uint64 callBackID = net.AddHealthCallback(func(f bool) { if !f { return } + net.RemoveHealthCallback(callBackID) for rid, oldTracked := range st.byRound { - if oldTracked.RoundCompleted { continue } @@ -127,16 +125,16 @@ func loadSendTracker(net Client, kv *versioned.KV, trigger triggerEventFunc, round: rid, st: st, } - st.net.GetRoundResults(getRoundResultsTimeout, rr.callback, rr.round) + st.net.GetRoundResults( + getRoundResultsTimeout, rr.callback, rr.round) } }) return st } -// store writes the list of rounds that have been +// store writes the list of rounds that have been. func (st *sendTracker) store() error { - if err := st.storeSent(); err != nil { return err } @@ -145,8 +143,7 @@ func (st *sendTracker) store() error { } func (st *sendTracker) storeSent() error { - - //save sent messages + // Save sent messages data, err := json.Marshal(&st.byRound) if err != nil { return err @@ -158,9 +155,9 @@ func (st *sendTracker) storeSent() error { }) } -// store writes the list of rounds that have been +// store writes the list of rounds that have been. func (st *sendTracker) storeUnsent() error { - //save unsent messages + // Save unsent messages data, err := json.Marshal(&st.unsent) if err != nil { return err @@ -173,8 +170,8 @@ func (st *sendTracker) storeUnsent() error { }) } -// load will get the stored rounds to be checked from disk and builds -// internal datastructures +// load will get the stored rounds to be checked from disk and builds internal +// datastructures. func (st *sendTracker) load() error { obj, err := st.kv.Get(sendTrackerStorageKey, sendTrackerStorageVersion) if err != nil { @@ -193,7 +190,8 @@ func (st *sendTracker) load() error { } } - obj, err = st.kv.Get(sendTrackerUnsentStorageKey, sendTrackerUnsentStorageVersion) + obj, err = st.kv.Get( + sendTrackerUnsentStorageKey, sendTrackerUnsentStorageVersion) if err != nil { return err } @@ -207,78 +205,78 @@ func (st *sendTracker) load() error { } // denotePendingSend is called before the pending send. It tracks the send -// internally and notifies the UI of the send +// internally and notifies the UI of the send. func (st *sendTracker) denotePendingSend(channelID *id.ID, umi *userMessageInternal) (uint64, error) { - // for a timestamp for the message, use 1 second from now to - // approximate the lag due to round submission + // For the message timestamp, use 1 second from now to approximate the lag + // due to round submission ts := netTime.Now().Add(oneSecond) - // create a random message id so there will not be collisions in a database - // that requires a unique message ID + // Create a random message ID so that there won't be collisions in a + // database that requires a unique message ID stream := st.rngSrc.GetStream() umi.messageID = cryptoChannel.MessageID{} - num, err := stream.Read(umi.messageID[:]) - if num != len(umi.messageID[:]) || err != nil { - jww.FATAL.Panicf("failed to get a random message ID, read "+ - "len: %d, err: %+v", num, err) + n, err := stream.Read(umi.messageID[:]) + if err != nil { + jww.FATAL.Panicf("Failed to get generate random message ID: %+v", err) + } else if n != len(umi.messageID[:]) { + jww.FATAL.Panicf("Generated %d bytes for message ID; %d bytes required.", + n, len(umi.messageID[:])) } stream.Close() - // submit the message to the UI + // Submit the message to the UI uuid, err := st.trigger(channelID, umi, ts, receptionID.EphemeralIdentity{}, rounds.Round{}, Unsent) if err != nil { return 0, err } - // track the message on disk - st.handleDenoteSend(uuid, channelID, umi.messageID, - rounds.Round{}) + // Track the message on disk + st.handleDenoteSend(uuid, channelID, umi.messageID, rounds.Round{}) return uuid, nil } // denotePendingAdminSend is called before the pending admin send. It tracks the -// send internally and notifies the UI of the send +// send internally and notifies the UI of the send. func (st *sendTracker) denotePendingAdminSend(channelID *id.ID, cm *ChannelMessage) (uint64, error) { - // for a timestamp for the message, use 1 second from now to - // approximate the lag due to round submission + // For a timestamp for the message, use 1 second from now to approximate the + // lag due to round submission ts := netTime.Now().Add(oneSecond) - // create a random message id so there will not be collisions in a database + // Create a random message ID so there will not be collisions in a database // that requires a unique message ID stream := st.rngSrc.GetStream() randMid := cryptoChannel.MessageID{} num, err := stream.Read(randMid[:]) if num != len(randMid[:]) || err != nil { - jww.FATAL.Panicf("failed to get a random message ID, read "+ - "len: %d, err: %+v", num, err) + jww.FATAL.Panicf( + "Failed to get a random message ID, read len: %d, err: %+v", + num, err) } stream.Close() - // submit the message to the UI + // Submit the message to the UI uuid, err := st.adminTrigger(channelID, cm, ts, randMid, - receptionID.EphemeralIdentity{}, - rounds.Round{}, Unsent) + receptionID.EphemeralIdentity{}, rounds.Round{}, Unsent) if err != nil { return 0, err } - // track the message on disk - st.handleDenoteSend(uuid, channelID, randMid, - rounds.Round{}) + // Track the message on disk + st.handleDenoteSend(uuid, channelID, randMid, rounds.Round{}) return uuid, nil } -// handleDenoteSend does the nity gritty of editing internal structures +// handleDenoteSend does the nitty-gritty of editing internal structures. func (st *sendTracker) handleDenoteSend(uuid uint64, channelID *id.ID, messageID cryptoChannel.MessageID, round rounds.Round) { st.mux.Lock() defer st.mux.Unlock() - //skip if already added + // Skip if already added _, existsMessage := st.unsent[uuid] if existsMessage { return @@ -292,11 +290,10 @@ func (st *sendTracker) handleDenoteSend(uuid uint64, channelID *id.ID, } } -// send tracks a generic send message -func (st *sendTracker) send(uuid uint64, msgID cryptoChannel.MessageID, - round rounds.Round) error { - - // update the on disk message status +// send tracks a generic send message. +func (st *sendTracker) send( + uuid uint64, msgID cryptoChannel.MessageID, round rounds.Round) error { + // Update the on disk message status t, err := st.handleSend(uuid, msgID, round) if err != nil { return err @@ -305,32 +302,32 @@ func (st *sendTracker) send(uuid uint64, msgID cryptoChannel.MessageID, // Modify the timestamp to reduce the chance message order will be ambiguous ts := mutateTimestamp(round.Timestamps[states.QUEUED], msgID) - //update the message on the UI + // Update the message in the UI go st.updateStatus(t.UUID, msgID, ts, round, Sent) return nil } -// send tracks a generic send message +// send tracks a generic send message. func (st *sendTracker) failedSend(uuid uint64) error { - - // update the on disk message status + // Update the on disk message status t, err := st.handleSendFailed(uuid) if err != nil { return err } - //update the message on the UI - go st.updateStatus(t.UUID, cryptoChannel.MessageID{}, time.Time{}, rounds.Round{}, Failed) + // Update the message in the UI + go st.updateStatus( + t.UUID, cryptoChannel.MessageID{}, time.Time{}, rounds.Round{}, Failed) return nil } -// handleSend does the nity gritty of editing internal structures +// handleSend does the nitty-gritty of editing internal structures. func (st *sendTracker) handleSend(uuid uint64, messageID cryptoChannel.MessageID, round rounds.Round) (*tracked, error) { st.mux.Lock() defer st.mux.Unlock() - //check if in unsent + // Check if it is in unsent t, exists := st.unsent[uuid] if !exists { return nil, errors.New("cannot handle send on an unprepared message") @@ -338,19 +335,19 @@ func (st *sendTracker) handleSend(uuid uint64, _, existsMessage := st.byMessageID[messageID] if existsMessage { - return nil, errors.New("cannot handle send on a message which was " + - "already sent") + return nil, + errors.New("cannot handle send on a message which was already sent") } t.MsgID = messageID t.RoundID = round.ID - //add the roundID + // Add the roundID roundsList, existsRound := st.byRound[round.ID] roundsList.List = append(roundsList.List, t) st.byRound[round.ID] = roundsList - //add the round + // Add the round st.byMessageID[messageID] = t if !existsRound { @@ -363,7 +360,7 @@ func (st *sendTracker) handleSend(uuid uint64, delete(st.unsent, uuid) - //store the changed list to disk + // Store the changed list to disk err := st.store() if err != nil { jww.FATAL.Panicf(err.Error()) @@ -372,12 +369,12 @@ func (st *sendTracker) handleSend(uuid uint64, return t, nil } -// handleSendFailed does the nity gritty of editing internal structures +// handleSendFailed does the nitty-gritty of editing internal structures. func (st *sendTracker) handleSendFailed(uuid uint64) (*tracked, error) { st.mux.Lock() defer st.mux.Unlock() - //check if in unsent + // Check if it is in unsent t, exists := st.unsent[uuid] if !exists { return nil, errors.New("cannot handle send on an unprepared message") @@ -385,7 +382,7 @@ func (st *sendTracker) handleSendFailed(uuid uint64) (*tracked, error) { delete(st.unsent, uuid) - //store the changed list to disk + // Store the changed list to disk err := st.storeUnsent() if err != nil { jww.FATAL.Panicf(err.Error()) @@ -394,14 +391,15 @@ func (st *sendTracker) handleSendFailed(uuid uint64) (*tracked, error) { return t, nil } -// MessageReceive is used when a message is received to check if the message -// was sent by this user. If it was, the correct signal is sent to the event -// model and the function returns true, notifying the caller to not process -// the message -func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID, round rounds.Round) bool { +// MessageReceive is used when a message is received to check if the message was +// sent by this user. If it was, the correct signal is sent to the event model +// and the function returns true, notifying the caller to not process the +// message. +func (st *sendTracker) MessageReceive( + messageID cryptoChannel.MessageID, round rounds.Round) bool { st.mux.RLock() - //skip if already added + // Skip if already added _, existsMessage := st.byMessageID[messageID] st.mux.RUnlock() if !existsMessage { @@ -444,7 +442,8 @@ func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID, round r return true } -// roundResults represents a round which results are waiting on from the cmix layer +// roundResults represents a round which results are waiting on from the cMix +// layer. type roundResults struct { round id.Round st *sendTracker @@ -453,11 +452,11 @@ type roundResults struct { // callback is called when results are known about a round. it will re-trigger // the wait if it fails up to 'maxChecks' times. -func (rr *roundResults) callback(allRoundsSucceeded, timedOut bool, results map[id.Round]cmix.RoundResult) { - +func (rr *roundResults) callback( + allRoundsSucceeded, timedOut bool, results map[id.Round]cmix.RoundResult) { rr.st.mux.Lock() - //if the message was already handled, do nothing + // If the message was already handled, then do nothing registered, existsRound := rr.st.byRound[rr.round] if !existsRound { rr.st.mux.Unlock() @@ -480,8 +479,9 @@ func (rr *roundResults) callback(allRoundsSucceeded, timedOut bool, results map[ rr.st.mux.Unlock() - //retry if timed out - go rr.st.net.GetRoundResults(getRoundResultsTimeout, rr.callback, []id.Round{rr.round}...) + // Retry if timed out + go rr.st.net.GetRoundResults( + getRoundResultsTimeout, rr.callback, []id.Round{rr.round}...) return } @@ -498,8 +498,8 @@ func (rr *roundResults) callback(allRoundsSucceeded, timedOut bool, results map[ if status == Failed { for i := range registered.List { round := results[rr.round].Round - go rr.st.updateStatus(registered.List[i].UUID, registered.List[i].MsgID, time.Time{}, - round, Failed) + go rr.st.updateStatus(registered.List[i].UUID, + registered.List[i].MsgID, time.Time{}, round, Failed) } } } diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go index 2f564b88cd7f0d2468f1009c2f478de0c2f6a277..448c721ff38da7ba0495e3392314edc944869cc3 100644 --- a/channels/sendTracker_test.go +++ b/channels/sendTracker_test.go @@ -1,11 +1,11 @@ package channels import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" @@ -23,30 +23,23 @@ type mockClient struct{} func (mc *mockClient) GetMaxMessageLength() int { return 2048 } -func (mc *mockClient) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAssembler, - cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) { +func (mc *mockClient) SendWithAssembler(*id.ID, cmix.MessageAssembler, + cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) { return rounds.Round{}, ephemeral.Id{}, nil } func (mc *mockClient) IsHealthy() bool { return true } -func (mc *mockClient) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {} -func (mc *mockClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { -} -func (mc *mockClient) AddService(clientID *id.ID, newService message.Service, - response message.Processor) { -} -func (mc *mockClient) DeleteClientService(clientID *id.ID) {} -func (mc *mockClient) RemoveIdentity(id *id.ID) {} -func (mc *mockClient) GetRoundResults(timeout time.Duration, roundCallback cmix.RoundEventCallback, - roundList ...id.Round) { -} -func (mc *mockClient) AddHealthCallback(f func(bool)) uint64 { - return 0 -} -func (mc *mockClient) RemoveHealthCallback(uint64) {} - -// Test MessageReceive basic logic +func (mc *mockClient) AddIdentity(*id.ID, time.Time, bool) {} +func (mc *mockClient) AddIdentityWithHistory(*id.ID, time.Time, time.Time, bool) {} +func (mc *mockClient) AddService(*id.ID, message.Service, message.Processor) {} +func (mc *mockClient) DeleteClientService(*id.ID) {} +func (mc *mockClient) RemoveIdentity(*id.ID) {} +func (mc *mockClient) GetRoundResults(time.Duration, cmix.RoundEventCallback, ...id.Round) {} +func (mc *mockClient) AddHealthCallback(func(bool)) uint64 { return 0 } +func (mc *mockClient) RemoveHealthCallback(uint64) {} + +// Test MessageReceive basic logic. func TestSendTracker_MessageReceive(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uuidNum := uint64(0) @@ -128,8 +121,8 @@ func TestSendTracker_MessageReceive(t *testing.T) { } } -// Test failedSend function, confirming that data is stored appropriately -// and callbacks are called +// Test failedSend function, confirming that data is stored appropriately and +// callbacks are called. func TestSendTracker_failedSend(t *testing.T) { triggerCh := make(chan SentStatus) @@ -174,7 +167,6 @@ func TestSendTracker_failedSend(t *testing.T) { if s != Failed { t.Fatalf("Did not receive failed from failed message") } - t.Log("Received over trigger chan") case <-timeout.C: t.Fatal("Timed out waiting for trigger chan") } @@ -205,7 +197,8 @@ func TestSendTracker_send(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time, - receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) (uint64, error) { + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil } @@ -246,7 +239,6 @@ func TestSendTracker_send(t *testing.T) { timeout := time.NewTicker(time.Second * 5) select { case <-triggerCh: - t.Log("Received over trigger chan") case <-timeout.C: t.Fatal("Timed out waiting for trigger chan") } @@ -271,7 +263,7 @@ func TestSendTracker_send(t *testing.T) { } } -// Test loading stored byRound map from storage +// Test loading stored byRound map from storage. func TestSendTracker_load_store(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) @@ -341,15 +333,12 @@ func TestRoundResult_callback(t *testing.T) { numChecks: 0, } - rr.callback(true, false, map[id.Round]cmix.RoundResult{rid: {cmix.Succeeded, rounds.Round{ - ID: rid, - State: 0, - }}}) + rr.callback(true, false, map[id.Round]cmix.RoundResult{ + rid: {Status: cmix.Succeeded, Round: rounds.Round{ID: rid, State: 0}}}) timeout := time.NewTicker(time.Second * 5) select { case <-triggerCh: - t.Log("Received trigger") case <-timeout.C: t.Fatal("Did not receive update") } diff --git a/channels/send_test.go b/channels/send_test.go index 7c3205115a1947cf3f5a20b81d79f794959d57dd..71c30e26a2996f4f6fe7eb71d856628ea4d812c6 100644 --- a/channels/send_test.go +++ b/channels/send_test.go @@ -16,9 +16,9 @@ import ( "time" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/rsa" @@ -29,8 +29,8 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "gitlab.com/elixxir/client/broadcast" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/broadcast" + "gitlab.com/elixxir/client/v4/cmix" cryptoBroadcast "gitlab.com/elixxir/crypto/broadcast" ) @@ -59,8 +59,8 @@ func (m *mockBroadcastChannel) Get() *cryptoBroadcast.Channel { return m.crypto } -func (m *mockBroadcastChannel) Broadcast(payload []byte, cMixParams cmix.CMIXParams) ( - rounds.Round, ephemeral.Id, error) { +func (m *mockBroadcastChannel) Broadcast(payload []byte, + cMixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) { m.hasRun = true @@ -70,7 +70,8 @@ func (m *mockBroadcastChannel) Broadcast(payload []byte, cMixParams cmix.CMIXPar return rounds.Round{ID: 123}, ephemeral.Id{}, nil } -func (m *mockBroadcastChannel) BroadcastWithAssembler(assembler broadcast.Assembler, cMixParams cmix.CMIXParams) ( +func (m *mockBroadcastChannel) BroadcastWithAssembler( + assembler broadcast.Assembler, cMixParams cmix.CMIXParams) ( rounds.Round, ephemeral.Id, error) { m.hasRun = true @@ -82,8 +83,9 @@ func (m *mockBroadcastChannel) BroadcastWithAssembler(assembler broadcast.Assemb return rounds.Round{ID: 123}, ephemeral.Id{}, err } -func (m *mockBroadcastChannel) BroadcastRSAtoPublic(pk rsa.PrivateKey, payload []byte, - cMixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) { +func (m *mockBroadcastChannel) BroadcastRSAtoPublic(pk rsa.PrivateKey, + payload []byte, cMixParams cmix.CMIXParams) ( + rounds.Round, ephemeral.Id, error) { m.hasRun = true m.payload = payload @@ -109,12 +111,11 @@ func (m *mockBroadcastChannel) BroadcastRSAToPublicWithAssembler( return rounds.Round{ID: 123}, ephemeral.Id{}, err } -func (m *mockBroadcastChannel) RegisterListener(listenerCb broadcast.ListenerFunc, method broadcast.Method) error { +func (m *mockBroadcastChannel) RegisterListener( + broadcast.ListenerFunc, broadcast.Method) error { return nil } - -func (m *mockBroadcastChannel) Stop() { -} +func (m *mockBroadcastChannel) Stop() {} type mockNameService struct { validChMsg bool @@ -124,7 +125,8 @@ func (m *mockNameService) GetUsername() string { return "Alice" } -func (m *mockNameService) GetChannelValidationSignature() (signature []byte, lease time.Time) { +func (m *mockNameService) GetChannelValidationSignature() ( + signature []byte, lease time.Time) { return []byte("fake validation sig"), netTime.Now() } @@ -132,17 +134,16 @@ func (m *mockNameService) GetChannelPubkey() ed25519.PublicKey { return []byte("fake pubkey") } -func (m *mockNameService) SignChannelMessage(message []byte) (signature []byte, err error) { +func (m *mockNameService) SignChannelMessage([]byte) (signature []byte, err error) { return []byte("fake sig"), nil } -func (m *mockNameService) ValidateChannelMessage(username string, lease time.Time, - pubKey ed25519.PublicKey, authorIDSignature []byte) bool { +func (m *mockNameService) ValidateChannelMessage( + string, time.Time, ed25519.PublicKey, []byte) bool { return m.validChMsg } func TestSendGeneric(t *testing.T) { - nameService := new(mockNameService) nameService.validChMsg = true @@ -150,7 +151,7 @@ func TestSendGeneric(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(rng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } crng := fastRNG.NewStreamGenerator(100, 5, csprng.NewSystemRNG) @@ -171,8 +172,9 @@ func TestSendGeneric(t *testing.T) { round rounds.Round, status SentStatus) (uint64, error) { return 0, nil }, func(chID *id.ID, cm *ChannelMessage, ts time.Time, - messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, - round rounds.Round, status SentStatus) (uint64, error) { + messageID cryptoChannel.MessageID, + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil }, func(uuid uint64, messageID cryptoChannel.MessageID, timestamp time.Time, round rounds.Round, status SentStatus) { @@ -191,34 +193,28 @@ func TestSendGeneric(t *testing.T) { broadcast: mbc, } - messageId, roundId, ephemeralId, err := m.SendGeneric( - channelID, - messageType, - msg, - validUntil, - *params) + messageId, _, _, err := + m.SendGeneric(channelID, messageType, msg, validUntil, *params) if err != nil { - t.Logf("ERROR %v", err) - t.Fail() + t.Fatalf("SendGeneric error: %+v", err) } - t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) - // verify the message was handled correctly + // Verify the message was handled correctly - // decode the user message + // Decode the user message umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { - t.Fatalf("Failed to decode the user message: %s", err) + t.Fatalf("Failed to decode the user message: %+v", err) } - // do checks of the data + // Do checks of the data if !umi.GetMessageID().Equals(messageId) { - t.Errorf("The message IDs do not match. %s vs %s ", + t.Errorf("The message IDs do not match. %s vs %s", umi.messageID, messageId) } if !bytes.Equal(umi.GetChannelMessage().Payload, msg) { - t.Errorf("The payload does not match. %s vs %s ", + t.Errorf("The payload does not match. %s vs %s", umi.GetChannelMessage().Payload, msg) } @@ -231,16 +227,14 @@ func TestSendGeneric(t *testing.T) { t.Errorf("The returned round is incorrect, %d vs %d", umi.GetChannelMessage().RoundID, returnedRound) } - } func TestAdminGeneric(t *testing.T) { - prng := rand.New(rand.NewSource(64)) pi, err := cryptoChannel.GenerateIdentity(prng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } crng := fastRNG.NewStreamGenerator(100, 5, csprng.NewSystemRNG) @@ -260,8 +254,9 @@ func TestAdminGeneric(t *testing.T) { round rounds.Round, status SentStatus) (uint64, error) { return 0, nil }, func(chID *id.ID, cm *ChannelMessage, ts time.Time, - messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, - round rounds.Round, status SentStatus) (uint64, error) { + messageID cryptoChannel.MessageID, + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil }, func(uuid uint64, messageID cryptoChannel.MessageID, timestamp time.Time, round rounds.Round, status SentStatus) { @@ -285,28 +280,25 @@ func TestAdminGeneric(t *testing.T) { broadcast: mbc, } - messageId, roundId, ephemeralId, err := m.SendAdminGeneric(priv, - ch.ReceptionID, messageType, msg, validUntil, - cmix.GetDefaultCMIXParams()) + messageId, _, _, err := + m.SendAdminGeneric(priv, ch.ReceptionID, messageType, msg, validUntil, + cmix.GetDefaultCMIXParams()) if err != nil { t.Fatalf("Failed to SendAdminGeneric: %v", err) } - t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) - // verify the message was handled correctly + // Verify the message was handled correctly msgID := cryptoChannel.MakeMessageID(mbc.payload, ch.ReceptionID) if !msgID.Equals(messageId) { - t.Errorf("The message IDs do not match. %s vs %s ", - msgID, messageId) + t.Errorf("The message IDs do not match. %s vs %s", msgID, messageId) } - // decode the channel message + // Decode the channel message chMgs := &ChannelMessage{} - err = proto.Unmarshal(mbc.payload, chMgs) - if err != nil { - t.Fatalf("Failed to decode the channel message: %s", err) + if err = proto.Unmarshal(mbc.payload, chMgs); err != nil { + t.Fatalf("Failed to decode the channel message: %+v", err) } if !bytes.Equal(chMgs.Payload, msg) { @@ -325,7 +317,6 @@ func TestAdminGeneric(t *testing.T) { } func TestSendMessage(t *testing.T) { - nameService := new(mockNameService) nameService.validChMsg = true @@ -333,7 +324,7 @@ func TestSendMessage(t *testing.T) { pi, err := cryptoChannel.GenerateIdentity(prng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } crng := fastRNG.NewStreamGenerator(100, 5, csprng.NewSystemRNG) @@ -353,8 +344,9 @@ func TestSendMessage(t *testing.T) { round rounds.Round, status SentStatus) (uint64, error) { return 0, nil }, func(chID *id.ID, cm *ChannelMessage, ts time.Time, - messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, - round rounds.Round, status SentStatus) (uint64, error) { + messageID cryptoChannel.MessageID, + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil }, func(uuid uint64, messageID cryptoChannel.MessageID, timestamp time.Time, round rounds.Round, status SentStatus) { @@ -373,28 +365,22 @@ func TestSendMessage(t *testing.T) { broadcast: mbc, } - messageId, roundId, ephemeralId, err := m.SendMessage( - channelID, - msg, - validUntil, - *params) + messageId, _, _, err := m.SendMessage(channelID, msg, validUntil, *params) if err != nil { - t.Logf("ERROR %v", err) - t.Fail() + t.Fatalf("SendMessage error: %+v", err) } - t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) - // verify the message was handled correctly + // Verify the message was handled correctly - // decode the user message + // Decode the user message umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { - t.Fatalf("Failed to decode the user message: %s", err) + t.Fatalf("Failed to decode the user message: %+v", err) } - // do checks of the data + // Do checks of the data if !umi.GetMessageID().Equals(messageId) { - t.Errorf("The message IDs do not match. %s vs %s ", + t.Errorf("The message IDs do not match. %s vs %s", umi.messageID, messageId) } @@ -408,11 +394,11 @@ func TestSendMessage(t *testing.T) { umi.GetChannelMessage().RoundID, returnedRound) } - // decode the text message + // Decode the text message txt := &CMIXChannelText{} err = proto.Unmarshal(umi.GetChannelMessage().Payload, txt) if err != nil { - t.Fatalf("Could not decode cmix channel text: %s", err) + t.Fatalf("Could not decode cmix channel text: %+v", err) } if txt.Text != msg { @@ -425,12 +411,11 @@ func TestSendMessage(t *testing.T) { } func TestSendReply(t *testing.T) { - prng := rand.New(rand.NewSource(64)) pi, err := cryptoChannel.GenerateIdentity(prng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } crng := fastRNG.NewStreamGenerator(100, 5, csprng.NewSystemRNG) @@ -450,8 +435,9 @@ func TestSendReply(t *testing.T) { round rounds.Round, status SentStatus) (uint64, error) { return 0, nil }, func(chID *id.ID, cm *ChannelMessage, ts time.Time, - messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, - round rounds.Round, status SentStatus) (uint64, error) { + messageID cryptoChannel.MessageID, + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil }, func(uuid uint64, messageID cryptoChannel.MessageID, timestamp time.Time, round rounds.Round, status SentStatus) { @@ -473,25 +459,22 @@ func TestSendReply(t *testing.T) { broadcast: mbc, } - messageId, roundId, ephemeralId, err := m.SendReply( - channelID, msg, replyMsgID, validUntil, *params) + messageId, _, _, err := + m.SendReply(channelID, msg, replyMsgID, validUntil, *params) if err != nil { - t.Logf("ERROR %v", err) - t.Fail() + t.Fatalf("SendReply error: %+v", err) } - t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) - - // verify the message was handled correctly + // Verify the message was handled correctly - // decode the user message + // Decode the user message umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { - t.Fatalf("Failed to decode the user message: %s", err) + t.Fatalf("Failed to decode the user message: %+v", err) } - // do checks of the data + // Do checks of the data if !umi.GetMessageID().Equals(messageId) { - t.Errorf("The message IDs do not match. %s vs %s ", + t.Errorf("The message IDs do not match. %s vs %s", umi.messageID, messageId) } @@ -505,11 +488,11 @@ func TestSendReply(t *testing.T) { umi.GetChannelMessage().RoundID, returnedRound) } - // decode the text message + // Decode the text message txt := &CMIXChannelText{} err = proto.Unmarshal(umi.GetChannelMessage().Payload, txt) if err != nil { - t.Fatalf("Could not decode cmix channel text: %s", err) + t.Fatalf("Could not decode cmix channel text: %+v", err) } if txt.Text != msg { @@ -522,12 +505,11 @@ func TestSendReply(t *testing.T) { } func TestSendReaction(t *testing.T) { - prng := rand.New(rand.NewSource(64)) pi, err := cryptoChannel.GenerateIdentity(prng) if err != nil { - t.Fatalf(err.Error()) + t.Fatalf("GenerateIdentity error: %+v", err) } crng := fastRNG.NewStreamGenerator(100, 5, csprng.NewSystemRNG) @@ -547,8 +529,9 @@ func TestSendReaction(t *testing.T) { round rounds.Round, status SentStatus) (uint64, error) { return 0, nil }, func(chID *id.ID, cm *ChannelMessage, ts time.Time, - messageID cryptoChannel.MessageID, receptionID receptionID.EphemeralIdentity, - round rounds.Round, status SentStatus) (uint64, error) { + messageID cryptoChannel.MessageID, + receptionID receptionID.EphemeralIdentity, round rounds.Round, + status SentStatus) (uint64, error) { return 0, nil }, func(uuid uint64, messageID cryptoChannel.MessageID, timestamp time.Time, round rounds.Round, status SentStatus) { @@ -569,25 +552,22 @@ func TestSendReaction(t *testing.T) { broadcast: mbc, } - messageId, roundId, ephemeralId, err := m.SendReaction( - channelID, msg, replyMsgID, *params) + messageId, _, _, err := m.SendReaction(channelID, msg, replyMsgID, *params) if err != nil { - t.Logf("ERROR %v", err) - t.Fail() + t.Fatalf("SendReaction error: %+v", err) } - t.Logf("messageId %v, roundId %v, ephemeralId %v", messageId, roundId, ephemeralId) - // verify the message was handled correctly + // Verify the message was handled correctly - // decode the user message + // Decode the user message umi, err := unmarshalUserMessageInternal(mbc.payload, channelID) if err != nil { - t.Fatalf("Failed to decode the user message: %s", err) + t.Fatalf("Failed to decode the user message: %+v", err) } - // do checks of the data + // Do checks of the data if !umi.GetMessageID().Equals(messageId) { - t.Errorf("The message IDs do not match. %s vs %s ", + t.Errorf("The message IDs do not match. %s vs %s", umi.messageID, messageId) } @@ -601,11 +581,11 @@ func TestSendReaction(t *testing.T) { umi.GetChannelMessage().RoundID, returnedRound) } - // decode the text message + // Decode the text message txt := &CMIXChannelReaction{} err = proto.Unmarshal(umi.GetChannelMessage().Payload, txt) if err != nil { - t.Fatalf("Could not decode cmix channel text: %s", err) + t.Fatalf("Could not decode cmix channel text: %+v", err) } if txt.Reaction != msg { diff --git a/channels/text.pb.go b/channels/text.pb.go index 5eea7e0ed48b0a5decd88d14d002fbf24c03b39a..5003edd4ff9993e67a25c873765e6e3916af0472 100644 --- a/channels/text.pb.go +++ b/channels/text.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: text.proto package channels @@ -28,7 +28,7 @@ const ( ) // CMIXChannelText is the payload for sending normal text messages to channels -// the replyMessageID is nil when it is not a reply +// the replyMessageID is nil when it is not a reply. type CMIXChannelText struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -94,7 +94,7 @@ func (x *CMIXChannelText) GetReplyMessageID() []byte { // CMIXChannelReaction is the payload for reactions. The reaction must be a // single emoji and the reactionMessageID must be non nil and a real message -// in the channel +// in the channel. type CMIXChannelReaction struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/channels/text.proto b/channels/text.proto index 26cc59ca76ed8b888b9969730ad9fe2e1fe80d8b..30048e36e014aea59656689fd60ad30cc492f4ce 100644 --- a/channels/text.proto +++ b/channels/text.proto @@ -12,18 +12,18 @@ option go_package = "gitlab.com/elixxir/client/channels"; package channels; // CMIXChannelText is the payload for sending normal text messages to channels -// the replyMessageID is nil when it is not a reply +// the replyMessageID is nil when it is not a reply. message CMIXChannelText { - uint32 version = 1; - string text = 2; - bytes replyMessageID = 3; + uint32 version = 1; + string text = 2; + bytes replyMessageID = 3; } // CMIXChannelReaction is the payload for reactions. The reaction must be a // single emoji and the reactionMessageID must be non nil and a real message -// in the channel +// in the channel. message CMIXChannelReaction { - uint32 version = 1; - string reaction = 2; - bytes reactionMessageID = 3; + uint32 version = 1; + string reaction = 2; + bytes reactionMessageID = 3; } \ No newline at end of file diff --git a/channels/userListener.go b/channels/userListener.go index 202e5fa7d93b4ba15485cc2549806e0b8b014dea..b05477829c851bd5019e0330c32661a55b9bb299 100644 --- a/channels/userListener.go +++ b/channels/userListener.go @@ -10,15 +10,15 @@ package channels import ( "crypto/ed25519" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" "time" ) -// the userListener adheres to the [broadcast.ListenerFunc] interface and is -// used when user messages are received on the channel +// userListener adheres to the [broadcast.ListenerFunc] interface and is used +// when user messages are received on the channel. type userListener struct { name NameService chID *id.ID @@ -26,15 +26,15 @@ type userListener struct { checkSent messageReceiveFunc } -// Listen is called when a message is received for the user listener +// Listen is called when a message is received for the user listener. func (ul *userListener) Listen(payload []byte, receptionID receptionID.EphemeralIdentity, round rounds.Round) { - //Decode the message as a user message + // Decode the message as a user message umi, err := unmarshalUserMessageInternal(payload, ul.chID) if err != nil { - jww.WARN.Printf("Failed to unmarshal User Message on "+ - "channel %s", ul.chID) + jww.WARN.Printf( + "Failed to unmarshal User Message on channel %s", ul.chID) return } @@ -42,14 +42,14 @@ func (ul *userListener) Listen(payload []byte, cm := umi.GetChannelMessage() msgID := umi.GetMessageID() - //check if we sent the message, ignore triggering if we sent + // Check if we sent the message and ignore triggering if we sent if ul.checkSent(msgID, round) { return } - /*CRYPTOGRAPHICALLY RELEVANT CHECKS*/ + /* CRYPTOGRAPHICALLY RELEVANT CHECKS */ - // check the round to ensure the message is not a replay + // Check the round to ensure the message is not a replay if id.Round(cm.RoundID) != round.ID { jww.WARN.Printf("The round message %s send on %d referenced "+ "(%d) was not the same as the round the message was found on (%d)", @@ -57,7 +57,7 @@ func (ul *userListener) Listen(payload []byte, return } - // check that the user properly signed the message + // Check that the user properly signed the message if !ed25519.Verify(um.ECCPublicKey, um.Message, um.Signature) { jww.WARN.Printf("Message %s on channel %s purportedly from %s "+ "failed its user signature with signature %v", msgID, @@ -65,15 +65,15 @@ func (ul *userListener) Listen(payload []byte, return } - // Replace the timestamp on the message if it is outside of the - // allowable range - ts := vetTimestamp(time.Unix(0, cm.LocalTimestamp), round.Timestamps[states.QUEUED], msgID) + // Replace the timestamp on the message if it is outside the allowable range + ts := vetTimestamp( + time.Unix(0, cm.LocalTimestamp), round.Timestamps[states.QUEUED], msgID) - //TODO: Processing of the message relative to admin commands will be here + // TODO: Processing of the message relative to admin commands will be here. - //Submit the message to the event model for listening - if uuid, err := ul.trigger(ul.chID, umi, ts, receptionID, round, - Delivered); err != nil { + // Submit the message to the event model for listening + uuid, err := ul.trigger(ul.chID, umi, ts, receptionID, round, Delivered) + if err != nil { jww.WARN.Printf("Error in passing off trigger for "+ "message (UUID: %d): %+v", uuid, err) } diff --git a/channels/userListener_test.go b/channels/userListener_test.go index 23d8ae8c1188ef7c717680f4b6a980dace81e0cc..c22777c02980d6b612c2cc792f9029223bdba474 100644 --- a/channels/userListener_test.go +++ b/channels/userListener_test.go @@ -17,8 +17,8 @@ import ( "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" @@ -35,8 +35,8 @@ type triggerEventDummy struct { } func (ted *triggerEventDummy) triggerEvent(chID *id.ID, umi *userMessageInternal, - ts time.Time, receptionID receptionID.EphemeralIdentity, round rounds.Round, - sent SentStatus) (uint64, error) { + _ time.Time, receptionID receptionID.EphemeralIdentity, round rounds.Round, + _ SentStatus) (uint64, error) { ted.gotData = true ted.chID = chID @@ -48,10 +48,10 @@ func (ted *triggerEventDummy) triggerEvent(chID *id.ID, umi *userMessageInternal return 0, nil } -// Tests the happy path +// Tests the happy path. func TestUserListener_Listen(t *testing.T) { - //build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -92,20 +92,22 @@ func TestUserListener_Listen(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - //build the listener + // Build the listener dummy := &triggerEventDummy{} al := userListener{ - chID: chID, - name: ns, - trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + name: ns, + trigger: dummy.triggerEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } - //call the listener + // Call the listener al.Listen(umSerial, receptionID.EphemeralIdentity{}, r) - //check the results + // Check the results if !dummy.gotData { t.Fatalf("No data returned after valid listen") } @@ -130,10 +132,9 @@ func TestUserListener_Listen(t *testing.T) { } } -//tests that the message is rejected when the user signature is invalid +// Tests that the message is rejected when the user signature is invalid. func TestUserListener_Listen_BadUserSig(t *testing.T) { - - //build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -158,12 +159,12 @@ func TestUserListener_Listen_BadUserSig(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - _, badpriv, err := ed25519.GenerateKey(rng) + _, badPrivKey, err := ed25519.GenerateKey(rng) if err != nil { t.Fatalf("failed to generate ed25519 keypair, cant run test") } - sig := ed25519.Sign(badpriv, cmSerial) + sig := ed25519.Sign(badPrivKey, cmSerial) ns := &mockNameService{validChMsg: true} um := &UserMessage{ @@ -177,30 +178,31 @@ func TestUserListener_Listen_BadUserSig(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - //build the listener + // Build the listener dummy := &triggerEventDummy{} al := userListener{ - chID: chID, - name: ns, - trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + name: ns, + trigger: dummy.triggerEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } - //call the listener + // Call the listener al.Listen(umSerial, receptionID.EphemeralIdentity{}, r) - //check the results + // Check the results if dummy.gotData { t.Fatalf("Data returned after invalid listen") } } -//tests that the message is rejected when the round in the message does not -//match the round passed in +// Tests that the message is rejected when the round in the message does not +// match the round passed in. func TestUserListener_Listen_BadRound(t *testing.T) { - - //build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -214,9 +216,8 @@ func TestUserListener_Listen_BadRound(t *testing.T) { } cm := &ChannelMessage{ - Lease: int64(time.Hour), - //make the round not match - RoundID: 69, + Lease: int64(time.Hour), + RoundID: 69, // Make the round not match PayloadType: 42, Payload: []byte("blarg"), } @@ -240,29 +241,30 @@ func TestUserListener_Listen_BadRound(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - //build the listener + // Build the listener dummy := &triggerEventDummy{} al := userListener{ - chID: chID, - name: ns, - trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + name: ns, + trigger: dummy.triggerEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } - //call the listener + // Call the listener al.Listen(umSerial, receptionID.EphemeralIdentity{}, r) - //check the results + // Check the results if dummy.gotData { t.Fatalf("Data returned after invalid listen") } } -//tests that the message is rejected when the user message is malformed +// Tests that the message is rejected when the user message is malformed. func TestUserListener_Listen_BadMessage(t *testing.T) { - - //build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -273,29 +275,30 @@ func TestUserListener_Listen_BadMessage(t *testing.T) { umSerial := []byte("malformed") - //build the listener + // Build the listener dummy := &triggerEventDummy{} al := userListener{ - chID: chID, - name: ns, - trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + name: ns, + trigger: dummy.triggerEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } - //call the listener + // Call the listener al.Listen(umSerial, receptionID.EphemeralIdentity{}, r) - //check the results + // Check the results if dummy.gotData { t.Fatalf("Data returned after invalid listen") } } -//tests that the message is rejected when the sized broadcast is malformed +// Tests that the message is rejected when the sized broadcast is malformed. func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) { - - //build inputs + // Build inputs chID := &id.ID{} chID[0] = 1 @@ -309,9 +312,8 @@ func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) { } cm := &ChannelMessage{ - Lease: int64(time.Hour), - //make the round not match - RoundID: 69, + Lease: int64(time.Hour), + RoundID: 69, // Make the round not match PayloadType: 42, Payload: []byte("blarg"), } @@ -335,23 +337,25 @@ func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) { t.Fatalf("Failed to marshal proto: %+v", err) } - //remove half the sized broadcast to make it malformed + // Remove half the sized broadcast to make it malformed umSerial = umSerial[:len(umSerial)/2] - //build the listener + // Build the listener dummy := &triggerEventDummy{} al := userListener{ - chID: chID, - name: ns, - trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, + chID: chID, + name: ns, + trigger: dummy.triggerEvent, + checkSent: func(cryptoChannel.MessageID, rounds.Round) bool { + return false + }, } - //call the listener + // Call the listener al.Listen(umSerial, receptionID.EphemeralIdentity{}, r) - //check the results + // Check the results if dummy.gotData { t.Fatalf("Data returned after invalid listen") } diff --git a/cmd/backup.go b/cmd/backup.go index 91cc194d71596ce22601dddb333fff6f24742bfd..a6596491737aa0f7d62c557aefc6c52084c8cbf9 100644 --- a/cmd/backup.go +++ b/cmd/backup.go @@ -16,8 +16,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/backup" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/backup" + "gitlab.com/elixxir/client/v4/xxdk" backupCrypto "gitlab.com/elixxir/crypto/backup" "gitlab.com/xx_network/primitives/utils" ) diff --git a/cmd/broadcast.go b/cmd/broadcast.go index df52c82f13ae29ae780670a9a502d68be86e2142..8c1f33a908163d602bd76f0e516844974aeb75b1 100644 --- a/cmd/broadcast.go +++ b/cmd/broadcast.go @@ -15,10 +15,10 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/broadcast" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/broadcast" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" crypto "gitlab.com/elixxir/crypto/broadcast" rsa2 "gitlab.com/elixxir/crypto/rsa" "gitlab.com/xx_network/primitives/utils" diff --git a/cmd/callbacks.go b/cmd/callbacks.go index 058c79dd0430b81243a4077f167694b37a909c3d..8b07c6584328c2d62311ea4ed0e186507f81d9c0 100644 --- a/cmd/callbacks.go +++ b/cmd/callbacks.go @@ -12,13 +12,13 @@ import ( "fmt" "github.com/spf13/viper" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e/receive" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmd/connect.go b/cmd/connect.go index 67059fc616f6f05658b180ef68142e08421abbdf..7307b2f8ac30a80225dab3f3d279bab093ffc9c9 100644 --- a/cmd/connect.go +++ b/cmd/connect.go @@ -12,11 +12,11 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/xxdk" "os" "os/signal" "syscall" diff --git a/cmd/dumpRounds.go b/cmd/dumpRounds.go index b7e8daf14ef5d7be1f67a7c8ab2f2d2e5f1f11e7..68c265d8aeb4747841f9f7b62bd706750f6147eb 100644 --- a/cmd/dumpRounds.go +++ b/cmd/dumpRounds.go @@ -18,8 +18,8 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/comms/signature" "gitlab.com/xx_network/crypto/signature/ec" "gitlab.com/xx_network/primitives/id" diff --git a/cmd/fileTransfer.go b/cmd/fileTransfer.go index dbe42e5cdea1bfe94bed39090f08e37f297386c8..f344722293b26d910e3c5b774ac32bfea1305a80 100644 --- a/cmd/fileTransfer.go +++ b/cmd/fileTransfer.go @@ -12,13 +12,13 @@ import ( "io/ioutil" "time" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - ft "gitlab.com/elixxir/client/fileTransfer" - ftE2e "gitlab.com/elixxir/client/fileTransfer/e2e" + ft "gitlab.com/elixxir/client/v4/fileTransfer" + ftE2e "gitlab.com/elixxir/client/v4/fileTransfer/e2e" "gitlab.com/elixxir/crypto/contact" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" diff --git a/cmd/getndf.go b/cmd/getndf.go index b94540bbdfb6b3ad6a74ff86d5ffa0f6384aad32..5528885a4c9fd88ccaf3ccba9f0bf51a9c3cb98f 100644 --- a/cmd/getndf.go +++ b/cmd/getndf.go @@ -16,11 +16,11 @@ import ( "gitlab.com/elixxir/comms/client" // "gitlab.com/elixxir/crypto/contact" - // "gitlab.com/elixxir/client/interfaces/message" - // "gitlab.com/elixxir/client/switchboard" - // "gitlab.com/elixxir/client/ud" + // "gitlab.com/elixxir/client/v4/interfaces/message" + // "gitlab.com/elixxir/client/v4/switchboard" + // "gitlab.com/elixxir/client/v4/ud" // "gitlab.com/elixxir/primitives/fact" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/comms/connect" //"time" pb "gitlab.com/elixxir/comms/mixmessages" diff --git a/cmd/group.go b/cmd/group.go index 0cf296b4cca2bdc8f2206eb40b4a15367df3a167..69a478862cb637b2405a1dd90230fdb6efa63a85 100644 --- a/cmd/group.go +++ b/cmd/group.go @@ -15,16 +15,16 @@ import ( "os" "time" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/primitives/format" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/groupChat" - "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/groupChat" + "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmd/init.go b/cmd/init.go index deef974a0a0a4a98069dfbd26a8a01fecb73437d..0ab347c0af4ac0cca2f50289515b918dcb612676 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -19,7 +19,7 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" ) // initCmd creates a new user object with the given NDF diff --git a/cmd/pickup.go b/cmd/pickup.go index d1171e7a4e044bca1fc55450c8c304019c269ede..5073d4dc133ba06ce6476957a3a201b6a6c3ec00 100644 --- a/cmd/pickup.go +++ b/cmd/pickup.go @@ -18,7 +18,7 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/cmix/pickup" + "gitlab.com/elixxir/client/v4/cmix/pickup" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/crypto/csprng" diff --git a/cmd/precan.go b/cmd/precan.go index 824b17d3a838caa05dfee5a794ee0d0bfa5a90ee..81696c97ef1b29d3fbb683ff68c849353132e3fc 100644 --- a/cmd/precan.go +++ b/cmd/precan.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" "io/fs" diff --git a/cmd/proto.go b/cmd/proto.go index 0203d1e5f49d81f71204c1ceafdb1c31900a38df..80e60cbe753063e51c26999ad186658b23abe08c 100644 --- a/cmd/proto.go +++ b/cmd/proto.go @@ -12,8 +12,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/utils" "io/fs" "io/ioutil" diff --git a/cmd/root.go b/cmd/root.go index 81d197451d72494298a87613c71ec24a44c86d5f..b1e271d09aa78a2eedf6b4bf43338f70bd8344ef 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -27,11 +27,11 @@ import ( "sync" "time" - "gitlab.com/elixxir/client/backup" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/backup" + "gitlab.com/elixxir/client/v4/xxdk" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" diff --git a/cmd/single.go b/cmd/single.go index a8d45e57bb143497ff179d9d9d78f167e7f7fcc4..eb605ff473766869e1d2d515cadbd22d99da7f84 100644 --- a/cmd/single.go +++ b/cmd/single.go @@ -16,11 +16,11 @@ import ( "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/utils" ) diff --git a/cmd/ud.go b/cmd/ud.go index 2877615046282534aa506b569c5ea5cc9de066ce..76a6eb5e459c088884436767b25cce65a6164bd5 100644 --- a/cmd/ud.go +++ b/cmd/ud.go @@ -10,13 +10,13 @@ package cmd import ( "fmt" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/id" "time" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/ud" - "gitlab.com/elixxir/client/xxmutils" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/ud" + "gitlab.com/elixxir/client/v4/xxmutils" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/utils" diff --git a/cmd/utils.go b/cmd/utils.go index ad6de14de40c1b265dca23bb9b996c0e8f4b5e9d..c5ddd304d6788d48692b8e3de66962c651e8610d 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -10,15 +10,15 @@ package cmd import ( "fmt" "github.com/spf13/cobra" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/xxdk" "io/ioutil" "strconv" "strings" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmd/version.go b/cmd/version.go index 1ee33eb6914f5520e40249e16197fc7d5c47cfba..4d8cf6d2bf0558bd23151d4ab23c586671a2bcfc 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -13,12 +13,12 @@ import ( "fmt" "github.com/spf13/cobra" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/utils" ) // Change this value to set the version for this build -const currentVersion = "4.3.3" +const currentVersion = "4.3.6" func Version() string { out := fmt.Sprintf("Elixxir Client v%s -- %s\n\n", xxdk.SEMVER, diff --git a/cmix/check.go b/cmix/check.go index ed010a7625cafae25ed8bc7f87520529099b2ed1..e99fa6b691f5f15bfe24190292793d22f9d4b5b4 100644 --- a/cmix/check.go +++ b/cmix/check.go @@ -9,7 +9,7 @@ package cmix import ( "encoding/binary" - "gitlab.com/elixxir/client/cmix/identity/receptionID/store" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID/store" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmix/check_test.go b/cmix/check_test.go index e828e4c1d64a981b5d878ff98b267c050f14829f..12b72bd146baa5b10fcec22fe802ac4fa891fbac 100644 --- a/cmix/check_test.go +++ b/cmix/check_test.go @@ -11,8 +11,8 @@ import ( "testing" bloom "gitlab.com/elixxir/bloomfilter" - "gitlab.com/elixxir/client/cmix/identity/receptionID/store" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID/store" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/client.go b/cmix/client.go index 675e44be877c277301acafbcb65320d4f5a5fa03..706018eab984f523049bdc9093f5bb7ea79ba0f3 100644 --- a/cmix/client.go +++ b/cmix/client.go @@ -11,8 +11,8 @@ package cmix // and intra-client state are accessible through the context object. import ( - "gitlab.com/elixxir/client/cmix/attempts" - "gitlab.com/elixxir/client/cmix/clockSkew" + "gitlab.com/elixxir/client/v4/cmix/attempts" + "gitlab.com/elixxir/client/v4/cmix/clockSkew" "gitlab.com/xx_network/primitives/netTime" "math" "strconv" @@ -20,17 +20,17 @@ import ( "time" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/address" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/health" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/nodes" - "gitlab.com/elixxir/client/cmix/pickup" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/address" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/health" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/nodes" + "gitlab.com/elixxir/client/v4/cmix/pickup" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" commClient "gitlab.com/elixxir/comms/client" commNetwork "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/cmix/cmixMessageBuffer.go b/cmix/cmixMessageBuffer.go index 0b4ac483889a938cee6335a888e3a122dd1fe4bb..59fbf7de587ba17c406e3ac745082837e0b1efde 100644 --- a/cmix/cmixMessageBuffer.go +++ b/cmix/cmixMessageBuffer.go @@ -11,8 +11,8 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/cmixMessageBuffer_test.go b/cmix/cmixMessageBuffer_test.go index 1318b3544c7fb393c23cac8593106649cccc111b..985b9c5cdedaf732692f307177d0275a3e57d638 100644 --- a/cmix/cmixMessageBuffer_test.go +++ b/cmix/cmixMessageBuffer_test.go @@ -13,8 +13,8 @@ import ( "reflect" "testing" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/critical.go b/cmix/critical.go index 6e9dd64e5a30d95a0933818c9b79e763ec67fe05..22cd3b8ad664df72682b68f22352744cbc4fc495 100644 --- a/cmix/critical.go +++ b/cmix/critical.go @@ -8,13 +8,13 @@ package cmix import ( - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "time" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/health" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/health" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" diff --git a/cmix/critical_test.go b/cmix/critical_test.go index 4b09fff7e44c281873b774833999514999c5e5f0..e540e46756ef1b5f492ffd922e488e7e41f0e5cd 100644 --- a/cmix/critical_test.go +++ b/cmix/critical_test.go @@ -11,8 +11,8 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/follow.go b/cmix/follow.go index 87f45b1314eb91ce00b002c9fbb3f3fc9a0da707..df112c3f28c587a921af735470622f2b9060c6dd 100644 --- a/cmix/follow.go +++ b/cmix/follow.go @@ -23,18 +23,19 @@ package cmix // instance import ( - "bytes" + "crypto/hmac" "encoding/binary" "fmt" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/xx_network/primitives/ndf" "sync" "sync/atomic" "time" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/xx_network/primitives/ndf" + jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID/store" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID/store" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/knownRounds" "gitlab.com/elixxir/primitives/states" @@ -294,7 +295,7 @@ func (c *client) follow(identity receptionID.IdentityUse, marshaledTid := c.session.GetTransmissionID().Marshal() for _, clientErr := range update.ClientErrors { // If this ClientId appears in the ClientError - if bytes.Equal(clientErr.ClientId, marshaledTid) { + if hmac.Equal(clientErr.ClientId, marshaledTid) { // Obtain relevant NodeGateway information nid, err := id.Unmarshal(clientErr.Source) @@ -417,7 +418,7 @@ func (c *client) follow(identity receptionID.IdentityUse, // remaining earliestRemaining, roundsWithMessages, roundsUnknown := gwRoundsState.RangeUnchecked( - updatedEarliestRound, c.param.KnownRoundsThreshold, roundChecker) + updatedEarliestRound, c.param.KnownRoundsThreshold, roundChecker, 100) jww.DEBUG.Printf("Processed RangeUnchecked for %d, Oldest: %d, "+ "firstUnchecked: %d, last Checked: %d, threshold: %d, "+ @@ -436,16 +437,15 @@ func (c *client) follow(identity receptionID.IdentityUse, var roundsWithMessages2 []id.Round - if !c.param.RealtimeOnly { - roundsWithMessages2 = identity.UR.Iterate(func(rid id.Round) bool { - if gwRoundsState.Checked(rid) { - return Checker(rid, filterList, identity.CR) - } - return false - }, roundsUnknown, abandon) - } + roundsWithMessages2 = identity.UR.Iterate(func(rid id.Round) bool { + if gwRoundsState.Checked(rid) { + return Checker(rid, filterList, identity.CR) + } + return false + }, roundsUnknown, abandon) - for _, rid := range roundsWithMessages { + for i := 0; i < len(roundsWithMessages); i++ { + rid := roundsWithMessages[i] // Denote that the round has been looked at in the tracking store if identity.CR.Check(rid) { c.GetMessagesFromRound(rid, identity.EphemeralIdentity) diff --git a/cmix/gateway/hostPool.go b/cmix/gateway/hostPool.go index 31f9ba3ca400705a2ddf82268bc6e0b5f4d1c266..89497df7be10be01280ef51facf6767a15b7670d 100644 --- a/cmix/gateway/hostPool.go +++ b/cmix/gateway/hostPool.go @@ -22,8 +22,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/shuffle" @@ -49,6 +49,7 @@ var errorsList = []string{ grpc.ErrClientConnClosing.Error(), connect.TooManyProxyError, "Failed to fetch", + "NetworkError when attempting to fetch resource.", } // HostManager Interface allowing storage and retrieval of Host objects diff --git a/cmix/gateway/hostpool_test.go b/cmix/gateway/hostpool_test.go index 8f35e91f41d508806469a5f4f274f61d1a0c2adf..abccaa1d504c8e15f780d91981250df8e9f68705 100644 --- a/cmix/gateway/hostpool_test.go +++ b/cmix/gateway/hostpool_test.go @@ -10,7 +10,7 @@ package gateway import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/gateway/sender.go b/cmix/gateway/sender.go index 3919fad03137a65591836be7a4358de14b0e9f68..b511151babdcd27c7ce19cd0a27578ffdb3f128f 100644 --- a/cmix/gateway/sender.go +++ b/cmix/gateway/sender.go @@ -12,8 +12,8 @@ package gateway import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/gateway/sender_test.go b/cmix/gateway/sender_test.go index b891940d13983a8dc314757c11ecc6580d520e63..5b4ad651c30d99cc348ce24a084d905935046daa 100644 --- a/cmix/gateway/sender_test.go +++ b/cmix/gateway/sender_test.go @@ -8,7 +8,7 @@ package gateway import ( - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/gateway/storeHostList.go b/cmix/gateway/storeHostList.go index d227111f7319a67963bbc14d511f25d6b228b025..4b689ddd9f7dd4d3e5d06d4493c480ef096ed900 100644 --- a/cmix/gateway/storeHostList.go +++ b/cmix/gateway/storeHostList.go @@ -10,7 +10,7 @@ package gateway import ( "bytes" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/cmix/gateway/storeHostList_test.go b/cmix/gateway/storeHostList_test.go index 54757ab5cbeaac6a680274729b32529e7e6c3f7a..1e2080375af4ebd57a6fec9e72a45a7db7b1bf19 100644 --- a/cmix/gateway/storeHostList_test.go +++ b/cmix/gateway/storeHostList_test.go @@ -9,7 +9,7 @@ package gateway import ( "fmt" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/xx_network/primitives/id" "reflect" "strings" diff --git a/cmix/health/tracker.go b/cmix/health/tracker.go index 1476b788ce6feba441c6b2facb97ea884482bcae..c53dcf8ecd0dea01b90f3fab98bb5ae87f4c6302 100644 --- a/cmix/health/tracker.go +++ b/cmix/health/tracker.go @@ -15,7 +15,7 @@ import ( "time" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" ) diff --git a/cmix/identity/receptionID/IdentityUse.go b/cmix/identity/receptionID/IdentityUse.go index de9ade02301a5a9a84c7363e3582b4228a70ae62..d689d84f785d6e076498449984f503001d83529f 100644 --- a/cmix/identity/receptionID/IdentityUse.go +++ b/cmix/identity/receptionID/IdentityUse.go @@ -9,7 +9,7 @@ package receptionID import ( "fmt" - "gitlab.com/elixxir/client/cmix/identity/receptionID/store" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID/store" "strconv" "strings" ) diff --git a/cmix/identity/receptionID/identity.go b/cmix/identity/receptionID/identity.go index e8126015c290ab86ef44bc317b5bf65d727c0ddd..586cbe9b945c3e30e549209365c3a32c9be8ae86 100644 --- a/cmix/identity/receptionID/identity.go +++ b/cmix/identity/receptionID/identity.go @@ -15,8 +15,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" diff --git a/cmix/identity/receptionID/identity_test.go b/cmix/identity/receptionID/identity_test.go index c893a7dbd87fd3d559801f8be7007cf4535fcc6a..8822a89a73a7b2ba3e85e043bf0b6ee83506caea 100644 --- a/cmix/identity/receptionID/identity_test.go +++ b/cmix/identity/receptionID/identity_test.go @@ -8,12 +8,13 @@ package receptionID import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" "math/rand" + "reflect" "testing" "time" ) @@ -109,3 +110,109 @@ func TestIdentity_Equal(t *testing.T) { "\na: %s\nc: %s", a, c) } } + +// TestIdentity_store_loadProcessNext tests that when an Identity is stored, +// Identity.ProcessNext is loaded. This test is exhaustive by making a reasonably +// long Identity.ProcessNext linked list, and checking if all Identity's are loaded. +func TestIdentity_store_loadProcessNext(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + const numTests = 10 + + // Construct the first identity, which will be stored + ephId := ephemeral.Id{} + copy(ephId[:], []byte{0}) + first := &Identity{ + EphemeralIdentity: EphemeralIdentity{ + EphId: ephId, + Source: &id.Permissioning, + }, + AddressSize: 0, + End: netTime.Now().Round(0), + ExtraChecks: 0, + StartValid: netTime.Now().Round(0), + EndValid: netTime.Now().Round(0), + Ephemeral: false, + } + + // Build the linked list with unique identities. Use temp as a temporary + // head, such that the previous node in the linked list can have its next + // set with the next identity, and then set temp to the next identity for + // the next iteration + temp := first + for i := 1; i < numTests; i++ { + // Ensure uniqueness of every identity by having the ephemeral ID + // contain the number of the iteration (ie the value of i) + ephId = ephemeral.Id{} + copy(ephId[:], []byte{byte(i)}) + + next := &Identity{ + EphemeralIdentity: EphemeralIdentity{ + EphId: ephId, + Source: &id.Permissioning, + }, + AddressSize: 25, + End: netTime.Now().Round(0), + ExtraChecks: 16, + StartValid: netTime.Now().Round(0), + EndValid: netTime.Now().Round(0), + Ephemeral: false, + } + + temp.ProcessNext = next + temp = next + } + + // Save the first identity. This should be the head of + // the created linked list, and thus all nodes (Identity's) should be saved. + err := first.store(kv) + if err != nil { + t.Errorf("Failed to store: %s", err) + } + + // Load the identity + loadedIdentity, err := loadIdentity(kv) + if err != nil { + t.Errorf("Failed to load: %+v", err) + } + + // Smoke test: Check that there is a next element in the linked list + if loadedIdentity.ProcessNext == nil { + t.Fatalf("Failed to load processNext for identity!") + } + + // Serialize the linked list, such that we can iterate over + // it to check for expected values later + temp = &loadedIdentity + serializedList := make([]*Identity, 0) + for temp != nil { + serializedList = append(serializedList, temp) + temp = temp.ProcessNext + } + + // Smoke test: Check that the number of loaded identities is of the + // expected quantity + if len(serializedList) != numTests { + t.Fatalf("Bad number of identities from Identity.ProcessNext."+ + "\nExpected: %d"+ + "\nReceived: %d", numTests, len(serializedList)) + } + + // Go through every identity to make sure it has the expected value + for i := 0; i < len(serializedList); i++ { + + // The loaded identity should have an ephemeral ID + // contain the number of the iteration (ie the value of i) + ephId = ephemeral.Id{} + copy(ephId[:], []byte{byte(i)}) + + received := serializedList[i] + + if !reflect.DeepEqual(ephId, received.EphId) { + t.Errorf("Identity #%d loaded is not expected."+ + "\nExpected: %+v"+ + "\nReceived: %+v", i, ephId, received.EphId) + } + + } + +} diff --git a/cmix/identity/receptionID/registration.go b/cmix/identity/receptionID/registration.go index 9f25f54097a72448825e44452f3411f829237844..a2150001fde9ebecc4e09ce6ed4564696131afd9 100644 --- a/cmix/identity/receptionID/registration.go +++ b/cmix/identity/receptionID/registration.go @@ -10,8 +10,8 @@ package receptionID import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID/store" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID/store" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" // "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/identity/receptionID/registration_test.go b/cmix/identity/receptionID/registration_test.go index 7206df57b4788dee47712662e4d373e33591df0f..5e5ae2e3b08bbe10ddc37d170a39149a5ad07f41 100644 --- a/cmix/identity/receptionID/registration_test.go +++ b/cmix/identity/receptionID/registration_test.go @@ -8,7 +8,7 @@ package receptionID import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "math/rand" diff --git a/cmix/identity/receptionID/store.go b/cmix/identity/receptionID/store.go index bfd11eece56e01726cfed7bbbfa33e80ab03053f..d671458d3f91cedb484ed23177d3b60b0343f21a 100644 --- a/cmix/identity/receptionID/store.go +++ b/cmix/identity/receptionID/store.go @@ -11,7 +11,7 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/shuffle" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/identity/receptionID/store/checkedRounds.go b/cmix/identity/receptionID/store/checkedRounds.go index b117f0e06a58664094f78a3bee3325c3a30f5239..adbe9ee43a059666a6bee54ee43e259fab0f3cb8 100644 --- a/cmix/identity/receptionID/store/checkedRounds.go +++ b/cmix/identity/receptionID/store/checkedRounds.go @@ -11,8 +11,8 @@ import ( "container/list" "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmix/identity/receptionID/store/checkedRounds_test.go b/cmix/identity/receptionID/store/checkedRounds_test.go index 1f9f623785c13167167b81655023152eb02b0870..924b052441da26cbd95132a9be295df13d1df8c4 100644 --- a/cmix/identity/receptionID/store/checkedRounds_test.go +++ b/cmix/identity/receptionID/store/checkedRounds_test.go @@ -10,8 +10,8 @@ package store import ( "container/list" "encoding/binary" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "reflect" diff --git a/cmix/identity/receptionID/store/earliestRound.go b/cmix/identity/receptionID/store/earliestRound.go index 3d2ea3272b88bfe1764501897eb810c302f62ae5..dd57f681a3a37382afd2a18ca6bf259d2950e118 100644 --- a/cmix/identity/receptionID/store/earliestRound.go +++ b/cmix/identity/receptionID/store/earliestRound.go @@ -10,7 +10,7 @@ package store import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" diff --git a/cmix/identity/receptionID/store/unknownRounds.go b/cmix/identity/receptionID/store/unknownRounds.go index da9fead7e48c774c7a866626a2000e13e90a2aab..0a6db9b4b90ada596641d21e60c778b98a39cd37 100644 --- a/cmix/identity/receptionID/store/unknownRounds.go +++ b/cmix/identity/receptionID/store/unknownRounds.go @@ -10,7 +10,7 @@ package store import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" diff --git a/cmix/identity/receptionID/store/unknownRounds_test.go b/cmix/identity/receptionID/store/unknownRounds_test.go index ac0c85da6efdf74c847f87676c29eb645951487c..02c33d5c6fe680bf7747ded69641aa24be333509 100644 --- a/cmix/identity/receptionID/store/unknownRounds_test.go +++ b/cmix/identity/receptionID/store/unknownRounds_test.go @@ -10,7 +10,7 @@ package store import ( "bytes" "encoding/json" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "reflect" diff --git a/cmix/identity/receptionID/store_test.go b/cmix/identity/receptionID/store_test.go index 5161469cfd7c044eddade131e8f76b90c6c30678..981312e5096f9a399ff239355b7a513f3dea2563 100644 --- a/cmix/identity/receptionID/store_test.go +++ b/cmix/identity/receptionID/store_test.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" "encoding/json" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/hash" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/identity/tracker.go b/cmix/identity/tracker.go index a292711b7fad381838b82584fa30ee8afe0ba0f8..3db5b08665a1a700cabc619d5d826cb3a962c43e 100644 --- a/cmix/identity/tracker.go +++ b/cmix/identity/tracker.go @@ -17,11 +17,11 @@ import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/address" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/address" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/identity/tracker_test.go b/cmix/identity/tracker_test.go index d1d75b078e5d21c326d1658247177aa10a2d4d2d..6c68c863d52584431684a4184f8179cf4aead2a0 100644 --- a/cmix/identity/tracker_test.go +++ b/cmix/identity/tracker_test.go @@ -13,9 +13,9 @@ import ( "time" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/address" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/address" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/cmix/interface.go b/cmix/interface.go index 8fd4d51dbcc8e73513bb048ab2933397d2235f13..5584c9b892d7fa57f71617e1304d65c0eb06310d 100644 --- a/cmix/interface.go +++ b/cmix/interface.go @@ -10,12 +10,12 @@ package cmix import ( "time" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/nodes" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/nodes" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/message/bundle.go b/cmix/message/bundle.go index 7e8b20fb943988e00e39e27bbc9dc68ed3145b14..827e71cb765b06f6c87a3e9f65e42848c007eaa6 100644 --- a/cmix/message/bundle.go +++ b/cmix/message/bundle.go @@ -8,8 +8,8 @@ package message import ( - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmix/message/fingerprints_test.go b/cmix/message/fingerprints_test.go index 582480bd90973ce4e62102fa5f5319eeb1c55ca3..63ca1f5c880645f9d8bc92507d547e719d5712ce 100644 --- a/cmix/message/fingerprints_test.go +++ b/cmix/message/fingerprints_test.go @@ -9,8 +9,8 @@ package message import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "reflect" diff --git a/cmix/message/handler.go b/cmix/message/handler.go index 45b693c5aba110a8c910148d59d75096b5d17fc6..d4f79efb852c20a9a6654953d20b7ccb7e41869e 100644 --- a/cmix/message/handler.go +++ b/cmix/message/handler.go @@ -14,12 +14,12 @@ import ( "sync" "time" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/cmix/message/handler_test.go b/cmix/message/handler_test.go index 33247a786a64b5fcadb01e7c62c5d5f88c2137cd..5fa164ae76060c30525fe3432d6277b246d3a281 100644 --- a/cmix/message/handler_test.go +++ b/cmix/message/handler_test.go @@ -11,10 +11,10 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/sih" "gitlab.com/elixxir/ekv" diff --git a/cmix/message/inProgress.go b/cmix/message/inProgress.go index 91760e5865ba99944e4d0b3b5ca78a4b393c34f1..e1a21c085e2bac354055280f8fd04e7f23bfb1c1 100644 --- a/cmix/message/inProgress.go +++ b/cmix/message/inProgress.go @@ -9,8 +9,8 @@ package message import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" ) diff --git a/cmix/message/inProgress_test.go b/cmix/message/inProgress_test.go index c85dc5d0971324c43f502ed337ac6bd6d356e37b..3db5c543109f66465cdf6cf450f2631a2b55c119 100644 --- a/cmix/message/inProgress_test.go +++ b/cmix/message/inProgress_test.go @@ -9,9 +9,9 @@ package message import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" diff --git a/cmix/message/meteredCmixMessageBuffer.go b/cmix/message/meteredCmixMessageBuffer.go index 826f8cab50f4e645652229830a56afd459fd70ad..f58d67563e4d17c081590f63a3a295b79435cbc1 100644 --- a/cmix/message/meteredCmixMessageBuffer.go +++ b/cmix/message/meteredCmixMessageBuffer.go @@ -14,9 +14,9 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" diff --git a/cmix/message/meteredCmixMessageBuffer_test.go b/cmix/message/meteredCmixMessageBuffer_test.go index ec1d6f76e30265a988150e84e72dec012afa7010..2002df7ad9e90c106eff0450d23ba8559507ae50 100644 --- a/cmix/message/meteredCmixMessageBuffer_test.go +++ b/cmix/message/meteredCmixMessageBuffer_test.go @@ -10,9 +10,9 @@ package message import ( "bytes" "encoding/json" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" diff --git a/cmix/message/params.go b/cmix/message/params.go index 61bc149c329f920e8afe523c7d0c3779b282d1fd..2b63ee6d21c8cdc0a1aab3aba13b774b2d8449a7 100644 --- a/cmix/message/params.go +++ b/cmix/message/params.go @@ -35,7 +35,7 @@ type paramsDisk struct { func GetDefaultParams() Params { return Params{ MessageReceptionBuffLen: 500, - MessageReceptionWorkerPoolSize: 4, + MessageReceptionWorkerPoolSize: 2, MaxChecksInProcessMessage: 10, InProcessMessageWait: 15 * time.Minute, RealtimeOnly: false, diff --git a/cmix/message/processor.go b/cmix/message/processor.go index b59ef05bf593b56935cdd2e96e2c2bdc1eafad3c..cb3707c93563aa9bd5be2a79602b51001a360077 100644 --- a/cmix/message/processor.go +++ b/cmix/message/processor.go @@ -10,8 +10,8 @@ package message import ( "fmt" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" ) diff --git a/cmix/message/services.go b/cmix/message/services.go index 665c4f858dfb2b0af472cd08a4fbdb436df000f0..64f3eed1f9a982854497cca038f08e42625c9eb8 100644 --- a/cmix/message/services.go +++ b/cmix/message/services.go @@ -8,7 +8,7 @@ package message import ( - "bytes" + "crypto/hmac" "sync" jww "github.com/spf13/jwalterweatherman" @@ -116,10 +116,12 @@ func (sm *ServicesManager) get(clientID *id.ID, receivedSIH, // AddService adds a service which can call a message handing function or be // used for notifications. In general a single service can only be registered // for the same identifier/tag pair. -// preimage - the preimage which is triggered on -// type - a descriptive string of the service. Generally used in notifications -// source - a byte buffer of related data. Mostly used in notifications. -// Example: Sender ID +// +// preimage - the preimage which is triggered on +// type - a descriptive string of the service. Generally used in notifications +// source - a byte buffer of related data. Mostly used in notifications. +// Example: Sender ID +// // There can be multiple "default" services, they must use the "default" tag // and the identifier must be the client reception ID. // A service may have a nil response unless it is default. @@ -140,7 +142,7 @@ func (sm *ServicesManager) AddService(clientID *id.ID, newService Service, respo // Handle default tag behavior if newService.Tag == sih.Default { - if !bytes.Equal(newService.Identifier, clientID[:]) { + if !hmac.Equal(newService.Identifier, clientID[:]) { jww.FATAL.Panicf("Cannot accept a malformed 'Default' " + "service, Identifier must match clientID") } diff --git a/cmix/nodes/interfaces.go b/cmix/nodes/interfaces.go index 77520a2ec0c74b7d5903b92889450f3dfbf32671..469137c4412d47a09d1865e15b071aef649ddd80 100644 --- a/cmix/nodes/interfaces.go +++ b/cmix/nodes/interfaces.go @@ -8,8 +8,8 @@ package nodes import ( - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" diff --git a/cmix/nodes/register.go b/cmix/nodes/register.go index f446c80a328ec966c7a101d5b83cc53943652c3c..daad4c163d3be77890f735d49134b64b78cb5156 100644 --- a/cmix/nodes/register.go +++ b/cmix/nodes/register.go @@ -18,8 +18,8 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/ndf" diff --git a/cmix/nodes/register_test.go b/cmix/nodes/register_test.go index 8ed9e6c897869e8ad9b5142b20a0e66e992b5621..0ebbdd4171f8a80b99b312071c030c748289f060 100644 --- a/cmix/nodes/register_test.go +++ b/cmix/nodes/register_test.go @@ -8,7 +8,7 @@ package nodes import ( - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" diff --git a/cmix/nodes/registrar.go b/cmix/nodes/registrar.go index 51a3b7d1d0d1c99f9d1bd0ccf8aec37102233ca9..6d3ba71d22e90b78bef9b2bb48b7eda8dcce9b68 100644 --- a/cmix/nodes/registrar.go +++ b/cmix/nodes/registrar.go @@ -10,9 +10,9 @@ package nodes import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/nodes/registrar_test.go b/cmix/nodes/registrar_test.go index 55b684495decc278b4eb3147c3b0398676879901..9659428d648e0d67697192a17f46ab377dc4fbfb 100644 --- a/cmix/nodes/registrar_test.go +++ b/cmix/nodes/registrar_test.go @@ -9,8 +9,8 @@ package nodes import ( "bytes" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/storage" commNetwork "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/cmix/nodes/request.go b/cmix/nodes/request.go index c47d8c9bfa4cbf363e584bf1e0cc0c094cc0d617..fe2d620c2b6590edf45c807ccca7bc1886b9ef20 100644 --- a/cmix/nodes/request.go +++ b/cmix/nodes/request.go @@ -14,8 +14,8 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" diff --git a/cmix/nodes/store.go b/cmix/nodes/store.go index 8ec0e706b1e637d8272fac785c68f5905f98a23e..04ef3ddf25da78c4cb21b296bbdbbd7ef12f9c4a 100644 --- a/cmix/nodes/store.go +++ b/cmix/nodes/store.go @@ -11,7 +11,7 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/nodes/storeKey.go b/cmix/nodes/storeKey.go index 19f9a636c69102926966ec2f3a53f759d2df4032..b6de84269464e20cf66a95833a3eede010a548f1 100644 --- a/cmix/nodes/storeKey.go +++ b/cmix/nodes/storeKey.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/cmix/nodes/utils_test.go b/cmix/nodes/utils_test.go index 9f9657db116623508c86db323425feaf293982a9..cf0a6488406cc7a918aea580432adaf1dc4f126d 100644 --- a/cmix/nodes/utils_test.go +++ b/cmix/nodes/utils_test.go @@ -9,10 +9,10 @@ package nodes import ( "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" commNetwork "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" diff --git a/cmix/params.go b/cmix/params.go index ec4148ea782f62079898dc829f0b28a495cd9032..74e639b3cb8023db379558ffe2caa732a5d4830b 100644 --- a/cmix/params.go +++ b/cmix/params.go @@ -13,10 +13,10 @@ import ( "fmt" "time" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/pickup" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/pickup" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/primitives/excludedRounds" "gitlab.com/xx_network/primitives/id" ) @@ -52,9 +52,6 @@ type Params struct { // for debugging. VerboseRoundTracking bool - // RealtimeOnly disables all attempts to pick up dropped or missed messages. - RealtimeOnly bool - // ReplayRequests Resends auth requests up the stack if received multiple // times. ReplayRequests bool @@ -96,7 +93,7 @@ type paramsDisk struct { // default parameters. func GetDefaultParams() Params { n := Params{ - TrackNetworkPeriod: 100 * time.Millisecond, + TrackNetworkPeriod: 1000 * time.Millisecond, MaxCheckedRounds: 500, RegNodesBufferLen: 1000, NetworkHealthTimeout: 15 * time.Second, @@ -104,7 +101,6 @@ func GetDefaultParams() Params { KnownRoundsThreshold: 1500, // 5 rounds/sec * 60 sec/min * 5 min FastPolling: true, VerboseRoundTracking: false, - RealtimeOnly: false, ReplayRequests: true, MaxParallelIdentityTracks: 5, ClockSkewClamp: 50 * time.Millisecond, @@ -141,7 +137,6 @@ func (p Params) MarshalJSON() ([]byte, error) { KnownRoundsThreshold: p.KnownRoundsThreshold, FastPolling: p.FastPolling, VerboseRoundTracking: p.VerboseRoundTracking, - RealtimeOnly: p.RealtimeOnly, ReplayRequests: p.ReplayRequests, Rounds: p.Rounds, Pickup: p.Pickup, @@ -170,7 +165,6 @@ func (p *Params) UnmarshalJSON(data []byte) error { KnownRoundsThreshold: pDisk.KnownRoundsThreshold, FastPolling: pDisk.FastPolling, VerboseRoundTracking: pDisk.VerboseRoundTracking, - RealtimeOnly: pDisk.RealtimeOnly, ReplayRequests: pDisk.ReplayRequests, Rounds: pDisk.Rounds, Pickup: pDisk.Pickup, @@ -182,13 +176,6 @@ func (p *Params) UnmarshalJSON(data []byte) error { return nil } -func (p Params) SetRealtimeOnlyAll() Params { - p.RealtimeOnly = true - p.Pickup.RealtimeOnly = true - p.Message.RealtimeOnly = true - return p -} - const DefaultDebugTag = "External" type CMIXParams struct { diff --git a/cmix/pickup/get.go b/cmix/pickup/get.go index a31fb36300a2b116ef17ceec9d7eb7e401aef644..ce2d9bec890ece7327c19b2bdd4b134987f7e6b4 100644 --- a/cmix/pickup/get.go +++ b/cmix/pickup/get.go @@ -9,8 +9,8 @@ package pickup import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/xx_network/primitives/id" ) @@ -59,13 +59,11 @@ func (m *pickup) GetMessagesFromRound( identity.Source) // store the round as an un-retrieved round - if !m.params.RealtimeOnly { - err = m.unchecked.AddRound(roundID, ri, - identity.Source, identity.EphId) - if err != nil { - jww.FATAL.Panicf( - "Failed to denote Unchecked Round for round %d", roundID) - } + err = m.unchecked.AddRound(roundID, ri, + identity.Source, identity.EphId) + if err != nil { + jww.FATAL.Panicf( + "Failed to denote Unchecked Round for round %d", roundID) } // If found, send to Message Retrieval Workers diff --git a/cmix/pickup/params.go b/cmix/pickup/params.go index bdddf820e786caebc3c8912fb7a33786eb022ce0..a30a065290b34701d4f11da91594778c9fdbbfcd 100644 --- a/cmix/pickup/params.go +++ b/cmix/pickup/params.go @@ -35,9 +35,6 @@ type Params struct { // tried SendTimeout time.Duration - // Disables all attempts to pick up dropped or missed messages - RealtimeOnly bool - // Toggles if historical rounds should always be used ForceHistoricalRounds bool } @@ -57,13 +54,12 @@ type paramsDisk struct { // GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ - NumMessageRetrievalWorkers: 4, - LookupRoundsBufferLen: 2000, - MaxHistoricalRoundsRetries: 3, - UncheckRoundPeriod: 20 * time.Second, + NumMessageRetrievalWorkers: 2, + LookupRoundsBufferLen: 100000, + MaxHistoricalRoundsRetries: 2, + UncheckRoundPeriod: 120 * time.Second, ForceMessagePickupRetry: false, SendTimeout: 3 * time.Second, - RealtimeOnly: false, } } @@ -89,7 +85,6 @@ func (p Params) MarshalJSON() ([]byte, error) { UncheckRoundPeriod: p.UncheckRoundPeriod, ForceMessagePickupRetry: p.ForceMessagePickupRetry, SendTimeout: p.SendTimeout, - RealtimeOnly: p.RealtimeOnly, ForceHistoricalRounds: p.ForceHistoricalRounds, } @@ -112,7 +107,6 @@ func (p *Params) UnmarshalJSON(data []byte) error { UncheckRoundPeriod: pDisk.UncheckRoundPeriod, ForceMessagePickupRetry: pDisk.ForceMessagePickupRetry, SendTimeout: pDisk.SendTimeout, - RealtimeOnly: pDisk.RealtimeOnly, ForceHistoricalRounds: pDisk.ForceHistoricalRounds, } diff --git a/cmix/pickup/pickup.go b/cmix/pickup/pickup.go index 581aeaf285553f55586a5c6006a93dc64f941203..5d9ea653f5de648b2a0d387583a57a8cf1940308 100644 --- a/cmix/pickup/pickup.go +++ b/cmix/pickup/pickup.go @@ -10,13 +10,13 @@ package pickup import ( "strconv" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/pickup/store" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/pickup/store" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" ) @@ -80,12 +80,10 @@ func (m *pickup) StartProcessors() stoppable.Stoppable { } // Start the periodic unchecked round worker - if !m.params.RealtimeOnly { - stopper := stoppable.NewSingle("UncheckRound") - go m.processUncheckedRounds( - m.params.UncheckRoundPeriod, backOffTable, stopper) - multi.Add(stopper) - } + stopper := stoppable.NewSingle("UncheckRound") + go m.processUncheckedRounds( + m.params.UncheckRoundPeriod, backOffTable, stopper) + multi.Add(stopper) return multi } diff --git a/cmix/pickup/retrieve.go b/cmix/pickup/retrieve.go index 45c8a7e3f66c2d321fbd3882acb40f4ed8e3c9ea..f7d0925ce2f68a485aa281ff2721976b1f63bb9f 100644 --- a/cmix/pickup/retrieve.go +++ b/cmix/pickup/retrieve.go @@ -13,11 +13,11 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/shuffle" "gitlab.com/elixxir/primitives/format" @@ -53,14 +53,12 @@ func (m *pickup) processMessageRetrieval(comms MessageRetrievalComms, ri := rl.Round jww.DEBUG.Printf("Checking for messages in round %d", ri.ID) - if !m.params.RealtimeOnly { - err := m.unchecked.AddRound(id.Round(ri.ID), ri.Raw, - rl.Identity.Source, rl.Identity.EphId) - if err != nil { - jww.FATAL.Panicf( - "Failed to denote Unchecked Round for round %d", - id.Round(ri.ID)) - } + err := m.unchecked.AddRound(id.Round(ri.ID), ri.Raw, + rl.Identity.Source, rl.Identity.EphId) + if err != nil { + jww.FATAL.Panicf( + "Failed to denote Unchecked Round for round %d", + id.Round(ri.ID)) } // Convert gateways in round to proper ID format @@ -80,7 +78,7 @@ func (m *pickup) processMessageRetrieval(comms MessageRetrievalComms, // first, randomize other members of the team var rndBytes [32]byte stream := m.rng.GetStream() - _, err := stream.Read(rndBytes[:]) + _, err = stream.Read(rndBytes[:]) stream.Close() if err != nil { jww.FATAL.Panicf("Failed to randomize shuffle in round %d "+ @@ -142,13 +140,11 @@ func (m *pickup) processMessageRetrieval(comms MessageRetrievalComms, m.messageBundles <- bundle jww.DEBUG.Printf("Removing round %d from unchecked store", ri.ID) - if !m.params.RealtimeOnly { - err = m.unchecked.Remove( - id.Round(ri.ID), rl.Identity.Source, rl.Identity.EphId) - if err != nil { - jww.ERROR.Printf("Could not remove round %d from "+ - "unchecked rounds store: %v", ri.ID, err) - } + err = m.unchecked.Remove( + id.Round(ri.ID), rl.Identity.Source, rl.Identity.EphId) + if err != nil { + jww.ERROR.Printf("Could not remove round %d from "+ + "unchecked rounds store: %v", ri.ID, err) } } @@ -212,11 +208,10 @@ func (m *pickup) getMessagesFromGateway(roundID id.Round, " in round %d. This happening every once in a while is normal,"+ " but can be indicative of a problem if it is consistent", identity.Source, roundID) - if m.params.RealtimeOnly { - err = m.unchecked.Remove(roundID, identity.Source, identity.EphId) - if err != nil { - jww.ERROR.Printf("Failed to remove round %d: %+v", roundID, err) - } + + err = m.unchecked.EndCheck(roundID, identity.Source, identity.EphId) + if err != nil { + jww.ERROR.Printf("Failed to end the check for the round round %d: %+v", roundID, err) } return message.Bundle{}, nil diff --git a/cmix/pickup/retrieve_test.go b/cmix/pickup/retrieve_test.go index a14b34a4cadce84b4b73b0447f163355b6138cc1..04f92627fd39dd3db78a07e81ac065ce1fbc857b 100644 --- a/cmix/pickup/retrieve_test.go +++ b/cmix/pickup/retrieve_test.go @@ -9,11 +9,11 @@ package pickup import ( "bytes" - "gitlab.com/elixxir/client/cmix/gateway" - ephemeral2 "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + ephemeral2 "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/crypto/csprng" diff --git a/cmix/pickup/store/store.go b/cmix/pickup/store/store.go index 88a300494aaa2003c3181c60cec46b6c6e884821..43a5effdd19bd332ed63b8c7e55d0ff0903d3c45 100644 --- a/cmix/pickup/store/store.go +++ b/cmix/pickup/store/store.go @@ -15,7 +15,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" @@ -133,6 +133,9 @@ func (s *UncheckedRoundStore) IterateOverList(iterator func(rid id.Round, defer s.mux.RUnlock() for _, rnd := range s.list { + if rnd.beingChecked { + continue + } jww.DEBUG.Printf("Round for lookup: %d, %+v\n", rnd.Id, rnd) go func(localRid id.Round, localRnd UncheckedRound) { iterator(localRid, localRnd) @@ -140,6 +143,23 @@ func (s *UncheckedRoundStore) IterateOverList(iterator func(rid id.Round, } } +// EndCheck increments the amount of checks performed on this stored +// round. +func (s *UncheckedRoundStore) EndCheck(rid id.Round, recipient *id.ID, + ephId ephemeral.Id) error { + s.mux.Lock() + defer s.mux.Unlock() + nri := newRoundIdentity(rid, recipient, ephId) + rnd, exists := s.list[nri] + if !exists { + return errors.Errorf("round %d could not be found in RAM", rid) + } + + rnd.beingChecked = false + s.list[nri] = rnd + return nil +} + // IncrementCheck increments the amount of checks performed on this stored // round. func (s *UncheckedRoundStore) IncrementCheck(rid id.Round, recipient *id.ID, @@ -165,6 +185,7 @@ func (s *UncheckedRoundStore) IncrementCheck(rid id.Round, recipient *id.ID, // Update the rounds state rnd.LastCheck = netTime.Now() rnd.NumChecks++ + rnd.storageUpToDate = false s.list[nri] = rnd return s.save() } diff --git a/cmix/pickup/store/uncheckedRounds.go b/cmix/pickup/store/uncheckedRounds.go index bc62d8a1d64583c44ca690af23aa733ee2e742e8..b4f77054c2b3578ca3040d48868d6a621f812982 100644 --- a/cmix/pickup/store/uncheckedRounds.go +++ b/cmix/pickup/store/uncheckedRounds.go @@ -12,7 +12,7 @@ import ( "encoding/binary" "github.com/golang/protobuf/proto" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" @@ -55,17 +55,21 @@ type UncheckedRound struct { LastCheck time.Time // Number of times a round has been checked NumChecks uint64 + + storageUpToDate bool + beingChecked bool } // marshal serializes UncheckedRound r into a byte slice. func (r UncheckedRound) marshal(kv *versioned.KV) ([]byte, error) { buf := bytes.NewBuffer(nil) // Store teh round info - if r.Info != nil { + if r.Info != nil && !r.storageUpToDate { if err := storeRoundInfo(kv, r.Info, r.Source, r.EpdId); err != nil { return nil, errors.WithMessagef(err, "failed to marshal unchecked rounds") } + r.storageUpToDate = true } // Marshal the round ID @@ -126,6 +130,7 @@ func (r *UncheckedRound) unmarshal(kv *versioned.KV, buff *bytes.Buffer) error { r.NumChecks = binary.LittleEndian.Uint64(buff.Next(uint64Size)) r.Info, _ = loadRoundInfo(kv, r.Id, r.Source, r.EpdId) + r.storageUpToDate = true return nil } diff --git a/cmix/pickup/store/uncheckedRounds_test.go b/cmix/pickup/store/uncheckedRounds_test.go index 2f8354b09e6df0fa244d6299c34ca96ce160da4e..95f527253f2edb07c41f696ec3d479443ec03132 100644 --- a/cmix/pickup/store/uncheckedRounds_test.go +++ b/cmix/pickup/store/uncheckedRounds_test.go @@ -9,7 +9,7 @@ package store import ( "bytes" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/pickup/unchecked.go b/cmix/pickup/unchecked.go index ca289a1ee390bfb7dd9df3c634590d8a54be7752..37e3572a023d4dfd9e8632e5e1b0b8c3cce2886e 100644 --- a/cmix/pickup/unchecked.go +++ b/cmix/pickup/unchecked.go @@ -9,9 +9,9 @@ package pickup import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/pickup/store" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/pickup/store" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "time" @@ -46,41 +46,40 @@ func (m *pickup) processUncheckedRounds(checkInterval time.Duration, ticker := time.NewTicker(checkInterval) uncheckedRoundStore := m.unchecked for { + iterator := func(rid id.Round, rnd store.UncheckedRound) { + jww.DEBUG.Printf( + "Checking if round %d is due for a message lookup.", rid) + // If this round is due for a round check, send the round over + // to the retrieval thread. If not due, then check next round. + if !isRoundCheckDue(rnd.NumChecks, rnd.LastCheck, backoffTable) { + return + } + + jww.INFO.Printf( + "Round %d due for a message lookup, retrying...", rid) + + // Check if it needs to be processed by historical Rounds + m.GetMessagesFromRound(rid, receptionID.EphemeralIdentity{ + EphId: rnd.EpdId, + Source: rnd.Source, + }) + + // Update the state of the round for next look-up (if needed) + err := uncheckedRoundStore.IncrementCheck(rid, rnd.Source, rnd.EpdId) + if err != nil { + jww.ERROR.Printf("processUncheckedRounds error: Could not "+ + "increment check attempts for round %d: %v", rid, err) + } + } + + // Pull and iterate through uncheckedRound list + m.unchecked.IterateOverList(iterator) select { case <-stop.Quit(): ticker.Stop() stop.ToStopped() return - case <-ticker.C: - iterator := func(rid id.Round, rnd store.UncheckedRound) { - jww.DEBUG.Printf( - "Checking if round %d is due for a message lookup.", rid) - // If this round is due for a round check, send the round over - // to the retrieval thread. If not due, then check next round. - if !isRoundCheckDue(rnd.NumChecks, rnd.LastCheck, backoffTable) { - return - } - - jww.INFO.Printf( - "Round %d due for a message lookup, retrying...", rid) - - // Check if it needs to be processed by historical Rounds - m.GetMessagesFromRound(rid, receptionID.EphemeralIdentity{ - EphId: rnd.EpdId, - Source: rnd.Source, - }) - - // Update the state of the round for next look-up (if needed) - err := uncheckedRoundStore.IncrementCheck(rid, rnd.Source, rnd.EpdId) - if err != nil { - jww.ERROR.Printf("processUncheckedRounds error: Could not "+ - "increment check attempts for round %d: %v", rid, err) - } - } - - // Pull and iterate through uncheckedRound list - m.unchecked.IterateOverList(iterator) } } } diff --git a/cmix/pickup/unchecked_test.go b/cmix/pickup/unchecked_test.go index 6db1b9ec67c2f767cf04e0d170325173622f0c52..2650bee31f61756c6f6d225f613f1456ab37ace5 100644 --- a/cmix/pickup/unchecked_test.go +++ b/cmix/pickup/unchecked_test.go @@ -8,9 +8,9 @@ package pickup import ( - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/comms/connect" diff --git a/cmix/pickup/utils_test.go b/cmix/pickup/utils_test.go index 2b325987ac6fab5a1bcfd205a10ba25837f53a2e..a0d9b3da3c161dde5f256eb4a675a28d4b626e33 100644 --- a/cmix/pickup/utils_test.go +++ b/cmix/pickup/utils_test.go @@ -10,9 +10,9 @@ package pickup import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/pickup/store" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/pickup/store" + "gitlab.com/elixxir/client/v4/storage" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/testkeys" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/cmix/results.go b/cmix/results.go index 916bdb206610fc2c98ed0509acba705d6c9c1a33..d9e258b487193a0e589dcfcc475fc8d58e4134ea 100644 --- a/cmix/results.go +++ b/cmix/results.go @@ -9,7 +9,7 @@ package cmix import ( "fmt" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "time" jww "github.com/spf13/jwalterweatherman" diff --git a/cmix/rounds/historical.go b/cmix/rounds/historical.go index 165ce22817fd2e9e01dda3de8c410ab0c174f40c..03a323f2677038f3b4b5b470a7a4a2798a7761c0 100644 --- a/cmix/rounds/historical.go +++ b/cmix/rounds/historical.go @@ -13,9 +13,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" @@ -210,7 +210,8 @@ func processHistoricalRoundsResponse(response *pb.HistoricalRoundsResponse, // The interface has missing returns returned as nil, such roundRequests // need to be removed as processing so that the network follower will // pick them up in the future. - if roundInfo == nil { + if roundInfo == nil || roundInfo.ID == 0 || + roundInfo.Topology == nil || len(roundInfo.Topology) == 0 { var errMsg string roundRequests[i].numAttempts++ diff --git a/cmix/rounds/historical_test.go b/cmix/rounds/historical_test.go index 7fec1ae6629ba7bbb6640d4d17acddc96a480fc9..3926f6e734881bda2901b005933bdf2876a7178b 100644 --- a/cmix/rounds/historical_test.go +++ b/cmix/rounds/historical_test.go @@ -12,8 +12,8 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" diff --git a/cmix/rounds/roundStorage.go b/cmix/rounds/roundStorage.go index f05914ba2918612c1cb382e95e870f7c6fc7157c..91f8ac99e810d23f98bf687b59a7a6a084a15566 100644 --- a/cmix/rounds/roundStorage.go +++ b/cmix/rounds/roundStorage.go @@ -9,7 +9,7 @@ package rounds import ( "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/cmix/sendCmix.go b/cmix/sendCmix.go index 87f882333c1ee4a7883a2f6c966e82758d2a1163..1b292cd91544aafcb96910a527109030d7f7aa7b 100644 --- a/cmix/sendCmix.go +++ b/cmix/sendCmix.go @@ -9,19 +9,19 @@ package cmix import ( "fmt" - "gitlab.com/elixxir/client/cmix/attempts" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/attempts" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/states" "strings" "time" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/nodes" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/nodes" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cmix" diff --git a/cmix/sendCmixUtils.go b/cmix/sendCmixUtils.go index e2d8ea178920d52c3fd3dcfbd78b4386896d5b75..61a115619889746c1f3fe0f58e08f72b92c09c8f 100644 --- a/cmix/sendCmixUtils.go +++ b/cmix/sendCmixUtils.go @@ -14,7 +14,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/nodes" + "gitlab.com/elixxir/client/v4/cmix/nodes" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/cmix/sendManyCmix.go b/cmix/sendManyCmix.go index 3dcd12dda6043620ee9c48f8fd33d394a4352ab6..9c3e687dbc038f32306e3a4b3584f6dab1bfc0f0 100644 --- a/cmix/sendManyCmix.go +++ b/cmix/sendManyCmix.go @@ -9,18 +9,18 @@ package cmix import ( "fmt" - "gitlab.com/elixxir/client/cmix/attempts" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/attempts" + "gitlab.com/elixxir/client/v4/cmix/rounds" "strings" "time" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/nodes" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/nodes" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cmix" diff --git a/cmix/utils_test.go b/cmix/utils_test.go index 0a0cb6d2264412e767de7840fc73f07230e0b2c6..6d6a8351661e6422a9a5eb4b946a11d58ecefc63 100644 --- a/cmix/utils_test.go +++ b/cmix/utils_test.go @@ -8,13 +8,13 @@ package cmix import ( - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "time" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/nodes" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/nodes" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/mixmessages" commsNetwork "gitlab.com/elixxir/comms/network" ds "gitlab.com/elixxir/comms/network/dataStructures" diff --git a/connect/authCallbacks.go b/connect/authCallbacks.go index ab1ff7b0a2138e7fbea34486425759dd37b28c1c..84fd39d33e1a882b175a6c62b8c9431af119186a 100644 --- a/connect/authCallbacks.go +++ b/connect/authCallbacks.go @@ -9,11 +9,11 @@ package connect import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - clientE2e "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/auth" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + clientE2e "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" ) diff --git a/connect/authenticated.go b/connect/authenticated.go index c5493deb0da13d227017e6695789f9317da2c830..628d22bf1203ec21f8847100e3d66e6c9d2238ca 100644 --- a/connect/authenticated.go +++ b/connect/authenticated.go @@ -13,10 +13,10 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - clientE2e "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + clientE2e "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/signature/rsa" diff --git a/connect/authenticated.pb.go b/connect/authenticated.pb.go index f78d97c7c552b5e888f61a7cbe89aa4f908cb1f0..3afa2b54c120c1bcc234ece9a885bcc48eb3331e 100644 --- a/connect/authenticated.pb.go +++ b/connect/authenticated.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: authenticated.proto package connect diff --git a/connect/authenticated_test.go b/connect/authenticated_test.go index 2a40522904027498015e3e56eec9d8deebb30e35..21162751083d3faa878590b1d369a4c57a9465df 100644 --- a/connect/authenticated_test.go +++ b/connect/authenticated_test.go @@ -12,7 +12,7 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/connect/client.go b/connect/client.go index 3c335f3d02398c2b118d00b43fde388b4bd936c1..49e47f4414ab214ed018b821bea5870c06e467d7 100644 --- a/connect/client.go +++ b/connect/client.go @@ -10,7 +10,7 @@ package connect import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" - "gitlab.com/elixxir/client/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/signature/rsa" ) diff --git a/connect/connect.go b/connect/connect.go index d786676958b11edc0dd4137e492039c8fa37707e..4620e44b359334c1b1ff9b38e4174bd5cabbf991 100644 --- a/connect/connect.go +++ b/connect/connect.go @@ -13,16 +13,16 @@ import ( "sync/atomic" "time" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/netTime" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/client/catalog" - clientE2e "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/auth" + "gitlab.com/elixxir/client/v4/catalog" + clientE2e "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/receive" "gitlab.com/elixxir/crypto/contact" ) diff --git a/connect/connectionList.go b/connect/connectionList.go index 4d35bd2338f5742961f37c6883de9050feb619c4..07bec5d0c6d7218d6ea80a25cdb8ee411f2d12ca 100644 --- a/connect/connectionList.go +++ b/connect/connectionList.go @@ -9,7 +9,7 @@ package connect import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "sync" diff --git a/connect/listenerTracker.go b/connect/listenerTracker.go index 07f926ba591f0cbe0c384cdf865754d479a09976..b2db2646d168978f515d51b3eb0a2357126714ab 100644 --- a/connect/listenerTracker.go +++ b/connect/listenerTracker.go @@ -8,7 +8,7 @@ package connect import ( - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/connect/listenerTracker_test.go b/connect/listenerTracker_test.go index f0c69253464c469e8a760b42c71c044f70c07f1b..910847a36327b9653d7ae3643fa1dde6ee3d0080 100644 --- a/connect/listenerTracker_test.go +++ b/connect/listenerTracker_test.go @@ -8,7 +8,7 @@ package connect import ( - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "reflect" diff --git a/connect/params_test.go b/connect/params_test.go index 6d84c7699cd5389850b6725da85fafd49ad6ea77..aa8a7aab50ec785482993745027c400494d2708c 100644 --- a/connect/params_test.go +++ b/connect/params_test.go @@ -12,7 +12,7 @@ import ( "encoding/json" "testing" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/xxdk" ) func TestParams_MarshalUnmarshal(t *testing.T) { diff --git a/connect/server.go b/connect/server.go index 96eb01294a6afb75516bad22026186c933ecdb9c..84981f7ea25587b0bdb5dc84def9eaff2156cb2a 100644 --- a/connect/server.go +++ b/connect/server.go @@ -10,7 +10,7 @@ package connect import ( "github.com/golang/protobuf/proto" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" ) diff --git a/connect/utils_test.go b/connect/utils_test.go index edbf629f8a6f7dccb89d5fe791c2239f398bea1f..c3f5a96402695d1631aa4e43b7ecc29d58aaac48 100644 --- a/connect/utils_test.go +++ b/connect/utils_test.go @@ -9,17 +9,17 @@ package connect import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" diff --git a/dummy/manager.go b/dummy/manager.go index 4a7d19f9e1766dfd1dcf1db7e5f2134c7df646a8..5df8571be98fc33674296c28b5476da086291abe 100644 --- a/dummy/manager.go +++ b/dummy/manager.go @@ -12,10 +12,10 @@ package dummy import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/fastRNG" "sync/atomic" "time" diff --git a/dummy/manager_test.go b/dummy/manager_test.go index 13b46275a85429bc4a542a91f9cea58d7fa7bc84..06b4b8969e7a0264710dfaa387cbae7f6e6a6f31 100644 --- a/dummy/manager_test.go +++ b/dummy/manager_test.go @@ -9,7 +9,7 @@ package dummy import ( "fmt" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "reflect" "sync/atomic" "testing" diff --git a/dummy/mockCmix_test.go b/dummy/mockCmix_test.go index 34b7d5b36dc41cccf13a2737b20b7c5ea37636e1..aed2446c973fea4f753f62d6da717c13953ba2a7 100644 --- a/dummy/mockCmix_test.go +++ b/dummy/mockCmix_test.go @@ -8,12 +8,12 @@ package dummy import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" diff --git a/dummy/random.go b/dummy/random.go index 2f1abc73ec290ead86c142f527e85e8db176a136..64deddd4f178ff7e82b8e885fee356e217ba2521 100644 --- a/dummy/random.go +++ b/dummy/random.go @@ -10,7 +10,7 @@ package dummy import ( "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/message" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" diff --git a/dummy/send.go b/dummy/send.go index c35910feeebf0272ff6d27c3ab67c069dd431883..46b14829081dd25d4102386e74b005e33e01de0c 100644 --- a/dummy/send.go +++ b/dummy/send.go @@ -8,7 +8,7 @@ package dummy import ( - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "gitlab.com/xx_network/crypto/csprng" "sync" "sync/atomic" @@ -16,7 +16,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" ) // Error messages for the Manager.sendThread and its helper functions. diff --git a/dummy/send_test.go b/dummy/send_test.go index edc4b4e2f83f41da04dfe12c2111fc553fc528c9..42927c7484526252be7f9e89fcd8a9fed519ffd4 100644 --- a/dummy/send_test.go +++ b/dummy/send_test.go @@ -9,7 +9,7 @@ package dummy import ( "bytes" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "reflect" diff --git a/dummy/utils_test.go b/dummy/utils_test.go index 4e787f88699de65ecc9878a95db0609649c7b4cd..8df8f30bda6a183ca340fe2a7a3f43d1b713833f 100644 --- a/dummy/utils_test.go +++ b/dummy/utils_test.go @@ -8,8 +8,8 @@ package dummy import ( - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/crypto/csprng" diff --git a/e2e/callbacks.go b/e2e/callbacks.go index 8f4655a277a3ed8280bb513e7fc7475fe75ba47c..f1f83a5c07852005e90f6ae4d3366b68f683c42d 100644 --- a/e2e/callbacks.go +++ b/e2e/callbacks.go @@ -9,7 +9,7 @@ package e2e import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/xx_network/primitives/id" "sync" ) diff --git a/e2e/callbacks_test.go b/e2e/callbacks_test.go index ab93edae6fc38556ac12e45b920e91a8a310fe09..078452f52552e55249260ff8e2ffd43f99ea15e8 100644 --- a/e2e/callbacks_test.go +++ b/e2e/callbacks_test.go @@ -8,7 +8,7 @@ package e2e import ( - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/xx_network/primitives/id" "reflect" "testing" diff --git a/e2e/critical.go b/e2e/critical.go index ddad76743d756a225d65122a2e8fdc285d497169..4122fbaf763b11b37a9856ecb8d5a043184d46a9 100644 --- a/e2e/critical.go +++ b/e2e/critical.go @@ -12,10 +12,10 @@ import ( "time" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" diff --git a/e2e/e2eMessageBuffer.go b/e2e/e2eMessageBuffer.go index 3b47ed10b9d5d31fb0d086228e941cb9c6c6f981..af33b779c84234228e8dfa276bceb52c5a8e6035 100644 --- a/e2e/e2eMessageBuffer.go +++ b/e2e/e2eMessageBuffer.go @@ -12,9 +12,9 @@ import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "golang.org/x/crypto/blake2b" diff --git a/e2e/e2eMessageBuffer_test.go b/e2e/e2eMessageBuffer_test.go index 782f3beeef774f6e2503c6152b40926395ca65b7..e2166aa25b6b0b1a987401ba6cc8198c37c3e43e 100644 --- a/e2e/e2eMessageBuffer_test.go +++ b/e2e/e2eMessageBuffer_test.go @@ -9,10 +9,10 @@ package e2e import ( "encoding/json" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "reflect" diff --git a/e2e/fpGenerator.go b/e2e/fpGenerator.go index 22c77222f9c5c5f8590eb4ddd89c05a91d331013..8799e1774e983cfa887a7023e51d1102bb0946fb 100644 --- a/e2e/fpGenerator.go +++ b/e2e/fpGenerator.go @@ -9,7 +9,7 @@ package e2e import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" ) // fpGenerator is a wrapper that allows the network manager's fingerprint diff --git a/e2e/fpGenerator_test.go b/e2e/fpGenerator_test.go index 75b03c161d502bef8bb21a84ab681af0c3f47b23..c0f5c613a4397c70c39b0730d5d67fb301c83ba8 100644 --- a/e2e/fpGenerator_test.go +++ b/e2e/fpGenerator_test.go @@ -8,13 +8,13 @@ package e2e import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/primitives/format" diff --git a/e2e/interface.go b/e2e/interface.go index 05731802b42446c49c06796a066c1bec3d74ffbd..81898c57f0f55631244ff85093b123300ee51564 100644 --- a/e2e/interface.go +++ b/e2e/interface.go @@ -8,17 +8,17 @@ package e2e import ( - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/e2e" "time" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" ) diff --git a/e2e/manager.go b/e2e/manager.go index 72197eb40c645bbc4e55a5d7485fcab4240203f4..7a982e4e7017595172db976666d959392008549c 100644 --- a/e2e/manager.go +++ b/e2e/manager.go @@ -8,26 +8,27 @@ package e2e import ( - "bytes" + "crypto/hmac" "encoding/base64" "encoding/json" + "sync" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/crypto/e2e" - "sync" "gitlab.com/xx_network/primitives/netTime" "github.com/pkg/errors" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/parse" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/parse" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" @@ -315,7 +316,7 @@ func (m *manager) closeE2eListener(item receive.Message) { // Check the connection fingerprint to verify that the message is // from the expected E2E relationship (refer to the comment in // DeletePartner for more details) - if !bytes.Equal(p.ConnectionFingerprint().Bytes(), item.Payload) { + if !hmac.Equal(p.ConnectionFingerprint().Bytes(), item.Payload) { jww.ERROR.Printf("Received %s message from %s with incorrect "+ "connection fingerprint %s.", catalog.E2eClose, item.Sender, base64.StdEncoding.EncodeToString(item.Payload)) diff --git a/e2e/params.go b/e2e/params.go index 1e5cbcb5f852740fc20ce1e38268e6cb700bd3d4..7f1c9cfbbcc4845bbe3d2b3ee99ffeb097b388b3 100644 --- a/e2e/params.go +++ b/e2e/params.go @@ -11,8 +11,8 @@ import ( "encoding/json" "time" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" ) type Params struct { diff --git a/e2e/parse/conversation/partner.go b/e2e/parse/conversation/partner.go index 03158a059eb85b8e27c30ae3302740e2f239bdfd..9336dfba889d79f04163ce17d6c1f5877c9dd70c 100644 --- a/e2e/parse/conversation/partner.go +++ b/e2e/parse/conversation/partner.go @@ -11,7 +11,7 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "math" diff --git a/e2e/parse/conversation/partner_test.go b/e2e/parse/conversation/partner_test.go index 0d7e9883c30bee788126abb67d3b591007427902..68460b5e2165c3d3afbae223186508082dbecb64 100644 --- a/e2e/parse/conversation/partner_test.go +++ b/e2e/parse/conversation/partner_test.go @@ -8,7 +8,7 @@ package conversation import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "math/rand" diff --git a/e2e/parse/conversation/ring.go b/e2e/parse/conversation/ring.go index 88304e97c61662af209edf81a64de540236b569c..c99b6c9005dc4cee435bd20091603b0221e83d00 100644 --- a/e2e/parse/conversation/ring.go +++ b/e2e/parse/conversation/ring.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "math" "sync" diff --git a/e2e/parse/conversation/ring_test.go b/e2e/parse/conversation/ring_test.go index fd70ef07fa260e68edd7ac8c28fde2ded6ce2e41..b5517501233b2447e88164663d5283883e7379ae 100644 --- a/e2e/parse/conversation/ring_test.go +++ b/e2e/parse/conversation/ring_test.go @@ -8,7 +8,7 @@ package conversation import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "reflect" "strconv" diff --git a/e2e/parse/conversation/store.go b/e2e/parse/conversation/store.go index b1fc1f08e8deb91bae8ef1d2ddb1392daa60dfe6..651f37cc3fa5b91e89c1eca924f260a8f55b6631 100644 --- a/e2e/parse/conversation/store.go +++ b/e2e/parse/conversation/store.go @@ -11,7 +11,7 @@ import ( "sync" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" ) diff --git a/e2e/parse/conversation/store_test.go b/e2e/parse/conversation/store_test.go index b7f8ab5f5a00d4e912ce13256a1cce3952b67d1f..68ee8e2ba1b73b550d55244afce6715e7a19d612 100644 --- a/e2e/parse/conversation/store_test.go +++ b/e2e/parse/conversation/store_test.go @@ -8,7 +8,7 @@ package conversation import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "math/rand" diff --git a/e2e/parse/firstMessagePart.go b/e2e/parse/firstMessagePart.go index f44007ad32ee2190ee75a2572082d120ea6bedae..a0b75b2ea481e56d60a099a8a7e427cb525bcea4 100644 --- a/e2e/parse/firstMessagePart.go +++ b/e2e/parse/firstMessagePart.go @@ -12,7 +12,7 @@ import ( "time" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" ) // Sizes of message parts, in bytes. diff --git a/e2e/parse/firstMessagePart_test.go b/e2e/parse/firstMessagePart_test.go index 9d895ee89aff09bdd552df7c61613a6257ee1f7c..aef6bc44633fb8a5823daf59d5024f9507e6a588 100644 --- a/e2e/parse/firstMessagePart_test.go +++ b/e2e/parse/firstMessagePart_test.go @@ -13,7 +13,7 @@ import ( "testing" "time" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" ) // Expected firstMessagePart for checking against, generated by fmp in diff --git a/e2e/parse/partition.go b/e2e/parse/partition.go index b951df9f6f3e5f8d54b80e16a04484249afb3821..64667c15a99f7336ec715bb40b830805c1d2c6c8 100644 --- a/e2e/parse/partition.go +++ b/e2e/parse/partition.go @@ -12,11 +12,11 @@ import ( "time" "github.com/pkg/errors" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/parse/conversation" - "gitlab.com/elixxir/client/e2e/parse/partition" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/parse/conversation" + "gitlab.com/elixxir/client/v4/e2e/parse/partition" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/e2e/parse/partition/multiPartMessage.go b/e2e/parse/partition/multiPartMessage.go index e716cdbc2f6180e5cfc464e6ca432eb64f276d67..b050388fd17d38b9acc604fa91f73a1ee2160c00 100644 --- a/e2e/parse/partition/multiPartMessage.go +++ b/e2e/parse/partition/multiPartMessage.go @@ -11,9 +11,9 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/e2e/parse/partition/multiPartMessage_test.go b/e2e/parse/partition/multiPartMessage_test.go index 2a2da3064140e123cb9f7305a4d1cf8fdd0b1fbd..182137a7cd164befb19c2abf89c6f063f21db81e 100644 --- a/e2e/parse/partition/multiPartMessage_test.go +++ b/e2e/parse/partition/multiPartMessage_test.go @@ -10,9 +10,9 @@ package partition import ( "bytes" "encoding/json" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/parse/partition/part.go b/e2e/parse/partition/part.go index 78b3a8e4b337d98657fba68273de01f57f7b04d1..0a2932f12d70f79ac5ec42b0e597d0c25f48329a 100644 --- a/e2e/parse/partition/part.go +++ b/e2e/parse/partition/part.go @@ -8,7 +8,7 @@ package partition import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "strconv" ) diff --git a/e2e/parse/partition/part_test.go b/e2e/parse/partition/part_test.go index 9556771c022bc9615948d082c9e369a49f1596be..5d4a5889fe495ac2d966d0ce782f9982f361bdf8 100644 --- a/e2e/parse/partition/part_test.go +++ b/e2e/parse/partition/part_test.go @@ -9,7 +9,7 @@ package partition import ( "bytes" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "math/rand" diff --git a/e2e/parse/partition/store.go b/e2e/parse/partition/store.go index 713fc291a9bb530994c3598b26e595eea52a6b03..06805acf6d95554de57f19e46f801f1c345d7d10 100644 --- a/e2e/parse/partition/store.go +++ b/e2e/parse/partition/store.go @@ -8,19 +8,20 @@ package partition import ( - "bytes" + "crypto/hmac" "encoding/binary" "encoding/json" + "sync" + "time" + jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "golang.org/x/crypto/blake2b" - "sync" - "time" ) type multiPartID [16]byte @@ -60,7 +61,7 @@ func (s *Store) AddFirst(partner *id.ID, mt catalog.MessageType, mpm := s.load(partner, messageID) mpm.AddFirst(mt, partNum, numParts, senderTimestamp, storageTimestamp, part) - if bytes.Equal(residue.Marshal(), []byte{}) { + if hmac.Equal(residue.Marshal(), []byte{}) { // fixme: should this error or crash? jww.WARN.Printf("Key reside from first message " + "is empty, continuing...") diff --git a/e2e/parse/partition/store_test.go b/e2e/parse/partition/store_test.go index 9ef6fcfd1b2a847e8d17aec4064923630fb57496..c26c50c19ad4597a909ef6a0dc8ba7005c1fafa8 100644 --- a/e2e/parse/partition/store_test.go +++ b/e2e/parse/partition/store_test.go @@ -9,8 +9,8 @@ package partition import ( "bytes" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/parse/partition_test.go b/e2e/parse/partition_test.go index 2f1c41418805b0f6f31d267023c4b602802c04d4..cf9900e5aa335554c9f51da399b1d7319ff69281 100644 --- a/e2e/parse/partition_test.go +++ b/e2e/parse/partition_test.go @@ -11,8 +11,8 @@ import ( "gitlab.com/elixxir/crypto/e2e" "testing" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/e2e/processor.go b/e2e/processor.go index 86673f81f235b905eaae31df7a2e786415584f3b..e13a74aee3b7df068137277b01aff5e08bd11b10 100644 --- a/e2e/processor.go +++ b/e2e/processor.go @@ -10,11 +10,11 @@ package e2e import ( "fmt" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" ) diff --git a/e2e/ratchet/partner/interface.go b/e2e/ratchet/partner/interface.go index c0fa978410da820c2b3f7d800bd2525375b913d3..08515e103b53ea7ca26cc2b2a35c576adbaa2bbf 100644 --- a/e2e/ratchet/partner/interface.go +++ b/e2e/ratchet/partner/interface.go @@ -9,8 +9,8 @@ package partner import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/ratchet/partner/manager.go b/e2e/ratchet/partner/manager.go index 42169477dc2a5749c14de2e102f36b37f54eb40e..2d05c8d5c223236c45d64bfea436fd4dd8daaf30 100644 --- a/e2e/ratchet/partner/manager.go +++ b/e2e/ratchet/partner/manager.go @@ -15,10 +15,10 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/partner/manager_test.go b/e2e/ratchet/partner/manager_test.go index 78ae006db5251246110e90892d2694a712ad6df6..dfa88ec2584598b512242d123ee873d67cf1f766 100644 --- a/e2e/ratchet/partner/manager_test.go +++ b/e2e/ratchet/partner/manager_test.go @@ -14,9 +14,9 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" dh "gitlab.com/elixxir/crypto/diffieHellman" e2eCrypto "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/partner/relationship.go b/e2e/ratchet/partner/relationship.go index c7eb260f78f79f22847a45e653e0110873caeeb6..3cfd2a706c2902ece45811b2f1d2a7cae8f7a31a 100644 --- a/e2e/ratchet/partner/relationship.go +++ b/e2e/ratchet/partner/relationship.go @@ -14,8 +14,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/ratchet/partner/relationshipFingerprint.go b/e2e/ratchet/partner/relationshipFingerprint.go index 3bad30633b9556df8e5fe0e4ba97a07dc5254089..396e65f6b8d13c2ebf63f4142615b9382bae08d0 100644 --- a/e2e/ratchet/partner/relationshipFingerprint.go +++ b/e2e/ratchet/partner/relationshipFingerprint.go @@ -9,8 +9,8 @@ package partner import ( jww "github.com/spf13/jwalterweatherman" - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/storage/versioned" + session2 "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e" diff --git a/e2e/ratchet/partner/relationship_test.go b/e2e/ratchet/partner/relationship_test.go index 3df242bcbfeb5612412420746177bc234471fd13..4698751fd46206db13b776c1c5eb98de6937abe9 100644 --- a/e2e/ratchet/partner/relationship_test.go +++ b/e2e/ratchet/partner/relationship_test.go @@ -12,9 +12,9 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/partner/session/session.go b/e2e/ratchet/partner/session/session.go index 1ab3c1e771b64e2e5edd2d65aa0ace8a8abcbd89..d2715da975f0d5e9d7ae93f5de666631618b286e 100644 --- a/e2e/ratchet/partner/session/session.go +++ b/e2e/ratchet/partner/session/session.go @@ -19,8 +19,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/partner/session/session_test.go b/e2e/ratchet/partner/session/session_test.go index ed7e7d0b5ff09e4dcf9ba5e1c90e7531c6ff656f..f157b41064c556ce7d6de88f6c4197b65ba80471 100644 --- a/e2e/ratchet/partner/session/session_test.go +++ b/e2e/ratchet/partner/session/session_test.go @@ -8,7 +8,7 @@ package session import ( - "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/xx_network/primitives/netTime" "reflect" "testing" diff --git a/e2e/ratchet/partner/session/testUtils.go b/e2e/ratchet/partner/session/testUtils.go index 300d5e764d4fd8766fec9ee7c03d9bdb7ee73c1c..4540b67a10cb168cd19b8b8bcbf1a58f97fa7041 100644 --- a/e2e/ratchet/partner/session/testUtils.go +++ b/e2e/ratchet/partner/session/testUtils.go @@ -13,8 +13,8 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/partner/utils.go b/e2e/ratchet/partner/utils.go index ff0eef555cfda79fcc3fc8275375fb2e742f9388..009b308713533f424011405cd160967128e8fa14 100644 --- a/e2e/ratchet/partner/utils.go +++ b/e2e/ratchet/partner/utils.go @@ -11,8 +11,8 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/ratchet/partner/utils_test.go b/e2e/ratchet/partner/utils_test.go index 1aac1087aca130b60a0002da12f744f4cff2df6d..4d485f183bd180312a323d1fb65c6d8fb8139874 100644 --- a/e2e/ratchet/partner/utils_test.go +++ b/e2e/ratchet/partner/utils_test.go @@ -13,9 +13,9 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/ratchet.go b/e2e/ratchet/ratchet.go index b2421805ed9c3e0adac8971ed7959049589a735f..6f70d4669fc9e993f195efde11a1358531dab76e 100644 --- a/e2e/ratchet/ratchet.go +++ b/e2e/ratchet/ratchet.go @@ -13,11 +13,11 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/e2e/ratchet/ratchet_test.go b/e2e/ratchet/ratchet_test.go index 45f0c3ed822ec0d491dc3bf82fde5ce8f4f46619..740015a57d4d0f9d83cc0a058941c18f03232302 100644 --- a/e2e/ratchet/ratchet_test.go +++ b/e2e/ratchet/ratchet_test.go @@ -15,9 +15,9 @@ import ( "testing" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" diff --git a/e2e/ratchet/serviceList.go b/e2e/ratchet/serviceList.go index 857a5be18218644bb58ec0d3746b8930daf76074..017deb10e79d59a4ecbc8dea45175ec50c18ee9c 100644 --- a/e2e/ratchet/serviceList.go +++ b/e2e/ratchet/serviceList.go @@ -9,8 +9,8 @@ package ratchet import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" "gitlab.com/xx_network/primitives/id" ) diff --git a/e2e/ratchet/storage.go b/e2e/ratchet/storage.go index 7db9c13a7c2ee1aa16e34ab55f70536f708230d4..ceefc9d236001e78a290858ed0b242f272826d01 100644 --- a/e2e/ratchet/storage.go +++ b/e2e/ratchet/storage.go @@ -12,11 +12,11 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/ratchet/utils_test.go b/e2e/ratchet/utils_test.go index 4444dd3a95df0f567c4239bd2f253e27633ff458..6a2b8ec6b298d2045131c5bf589c37346a74c06a 100644 --- a/e2e/ratchet/utils_test.go +++ b/e2e/ratchet/utils_test.go @@ -8,8 +8,8 @@ package ratchet import ( - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" "io" "reflect" @@ -17,11 +17,11 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" diff --git a/e2e/receive/any.go b/e2e/receive/any.go index e849ef5924b42e4963db0e034e77368a026d3cf1..ffa7ca18c6901270e1941efa3ccec1f8dba35a91 100644 --- a/e2e/receive/any.go +++ b/e2e/receive/any.go @@ -8,7 +8,7 @@ package receive import ( - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "gitlab.com/xx_network/primitives/id" ) diff --git a/e2e/receive/byType.go b/e2e/receive/byType.go index f43badcd32d6f0b58c00508b88e610af14243b0b..b87fdc892ff854d1f8d9bcae4210cbe47739e93d 100644 --- a/e2e/receive/byType.go +++ b/e2e/receive/byType.go @@ -9,7 +9,7 @@ package receive import ( "github.com/golang-collections/collections/set" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" ) type byType struct { diff --git a/e2e/receive/byType_test.go b/e2e/receive/byType_test.go index 140a7d2c3a99a558b7ee3a6744ae2ba260038e64..6f71b57550b3977fcae4475eb86373fb848b7aa4 100644 --- a/e2e/receive/byType_test.go +++ b/e2e/receive/byType_test.go @@ -9,7 +9,7 @@ package receive import ( "github.com/golang-collections/collections/set" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "gitlab.com/xx_network/primitives/id" "testing" ) diff --git a/e2e/receive/listener.go b/e2e/receive/listener.go index e30365a9e6ce23a6608108f3ac2e0ae5809f5858..bbf5d5b02ce4102c273c5ed611e485a72fcbab9b 100644 --- a/e2e/receive/listener.go +++ b/e2e/receive/listener.go @@ -9,7 +9,7 @@ package receive import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "gitlab.com/xx_network/primitives/id" "strconv" "strings" diff --git a/e2e/receive/message.go b/e2e/receive/message.go index bdde788c0cc6dba4304842e2adb29ce141a1013a..061a9b44d578def354fcc4de9f313cf0665191a7 100644 --- a/e2e/receive/message.go +++ b/e2e/receive/message.go @@ -8,8 +8,8 @@ package receive import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" diff --git a/e2e/receive/switchboard.go b/e2e/receive/switchboard.go index 99b6bf170ddfd57f125873b390ed91f17b7c906c..45ea7e12594ba7f6d26047c589fb55ab450747d6 100644 --- a/e2e/receive/switchboard.go +++ b/e2e/receive/switchboard.go @@ -12,7 +12,7 @@ import ( "github.com/golang-collections/collections/set" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "gitlab.com/xx_network/primitives/id" ) diff --git a/e2e/receive/switchboard_test.go b/e2e/receive/switchboard_test.go index 9edc9526f82df58c37e5a69c07ff7ffd943d63e1..52440510d026eaf0cb9142973b6d9e2468705ddb 100644 --- a/e2e/receive/switchboard_test.go +++ b/e2e/receive/switchboard_test.go @@ -8,7 +8,7 @@ package receive import ( - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "gitlab.com/xx_network/primitives/id" "strings" "testing" diff --git a/e2e/rekey/confirm.go b/e2e/rekey/confirm.go index 4e399584a95bf26ff3db3909f920fae43e256b1a..1c60a7b20f1aac7dd70afb9509944cab2475fec7 100644 --- a/e2e/rekey/confirm.go +++ b/e2e/rekey/confirm.go @@ -11,10 +11,10 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/ratchet" - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + session2 "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" ) func startConfirm(ratchet *ratchet.Ratchet, c chan receive.Message, diff --git a/e2e/rekey/confirm_test.go b/e2e/rekey/confirm_test.go index 28623e1a97d58193b24ed4f840c96c48d35d181f..114a82ddb33ac2ecf206ea02a511f4ce0a50baf0 100644 --- a/e2e/rekey/confirm_test.go +++ b/e2e/rekey/confirm_test.go @@ -13,12 +13,12 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" diff --git a/e2e/rekey/exchange.go b/e2e/rekey/exchange.go index f90baf0f0909b76ecb6bb64cca4526c7a00e4132..4cec192bd9d22de94a4a648011ee729d66fde2b3 100644 --- a/e2e/rekey/exchange.go +++ b/e2e/rekey/exchange.go @@ -8,11 +8,11 @@ package rekey import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/rekey/exchange_test.go b/e2e/rekey/exchange_test.go index a6b2f7fa1e87070ba102a94bbc585fa29437fb95..b65f9fac8c502fda36be004a6452028d693eab71 100644 --- a/e2e/rekey/exchange_test.go +++ b/e2e/rekey/exchange_test.go @@ -15,12 +15,12 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" diff --git a/e2e/rekey/params.go b/e2e/rekey/params.go index 988526e7a7f4bf18ad3e16ce29063ca22113c52b..33bbd5acbeb49492844a79c015c100df9c8c79a6 100644 --- a/e2e/rekey/params.go +++ b/e2e/rekey/params.go @@ -9,7 +9,7 @@ package rekey import ( "encoding/json" - "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/v4/catalog" "time" ) diff --git a/e2e/rekey/rekey.go b/e2e/rekey/rekey.go index c66e3c241637ae4d3984fc69002f74445337d141..de986022af042d061801952be4247a426ecbbbf1 100644 --- a/e2e/rekey/rekey.go +++ b/e2e/rekey/rekey.go @@ -14,11 +14,11 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - session "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/event" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + session "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/event" + util "gitlab.com/elixxir/client/v4/storage/utility" commsNetwork "gitlab.com/elixxir/comms/network" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/crypto/cyclic" diff --git a/e2e/rekey/trigger.go b/e2e/rekey/trigger.go index 0567c3c341f6b9f35b1b8d239dc3b65658a2c2b1..2402ccb9ffe6205024bd0b2b6095648c7fc68e70 100644 --- a/e2e/rekey/trigger.go +++ b/e2e/rekey/trigger.go @@ -14,12 +14,12 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/cyclic" ) diff --git a/e2e/rekey/trigger_test.go b/e2e/rekey/trigger_test.go index 0384d1b6a70c732bda30fd628cd16870142432cb..8cf5888ebdb5cd3e2b6194c91a1f6221cd238733 100644 --- a/e2e/rekey/trigger_test.go +++ b/e2e/rekey/trigger_test.go @@ -14,13 +14,13 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/ratchet" - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + session2 "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" diff --git a/e2e/rekey/utils_test.go b/e2e/rekey/utils_test.go index 08c7ec154ed2b8b85ee900a3d52a3f7475964e65..aab5128b6cea8eb8cb067352c7e317b224155fce 100644 --- a/e2e/rekey/utils_test.go +++ b/e2e/rekey/utils_test.go @@ -15,16 +15,16 @@ import ( "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + session2 "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" + util "gitlab.com/elixxir/client/v4/storage/utility" network2 "gitlab.com/elixxir/comms/network" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/crypto/cyclic" diff --git a/e2e/rekey/xchange.pb.go b/e2e/rekey/xchange.pb.go index 48b98f7823388a708a2de226046bbf11bdb44ee2..bc7e228ae4ee207a39a1908466b6b58affce9fa2 100644 --- a/e2e/rekey/xchange.pb.go +++ b/e2e/rekey/xchange.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: xchange.proto package rekey diff --git a/e2e/sendE2E.go b/e2e/sendE2E.go index c05700842e7264a04358be6803e8ac4ed038afb9..5b0ae11ca2096c57e2c04c3d072f42a22ef3bb57 100644 --- a/e2e/sendE2E.go +++ b/e2e/sendE2E.go @@ -13,13 +13,13 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/parse" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/parse" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/e2e/sendE2E_test.go b/e2e/sendE2E_test.go index 58afc0e9c3062ee0b768deff58004cb6f45bfdbf..7f6b0c593ad75f41f2778508da1fb7bea03cc56b 100644 --- a/e2e/sendE2E_test.go +++ b/e2e/sendE2E_test.go @@ -11,15 +11,15 @@ import ( "bytes" "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/parse" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/stoppable" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/parse" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/stoppable" + util "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e" diff --git a/e2e/sendUnsafe.go b/e2e/sendUnsafe.go index b59bd3243bfb6a9208c302761580cf6f90417983..6f95246301233910d13d24f32e7c67b24bedd892 100644 --- a/e2e/sendUnsafe.go +++ b/e2e/sendUnsafe.go @@ -13,9 +13,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e/ratchet" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/e2e/sendUnsafe_test.go b/e2e/sendUnsafe_test.go index 0df0532e61a3035c8e6ea6a4e2bc0355beeb911f..b9d87c15f0343f5b59ce734a1e69932df45f85a8 100644 --- a/e2e/sendUnsafe_test.go +++ b/e2e/sendUnsafe_test.go @@ -8,12 +8,12 @@ package e2e import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/parse" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/parse" + "gitlab.com/elixxir/client/v4/e2e/ratchet" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/storage/versioned" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" diff --git a/e2e/unsafeProcessor.go b/e2e/unsafeProcessor.go index 5f1c7fb3eb7094e49d00b49b426f093e25745a60..3f5e1609ade2bc0cc9ee2f0a1d15674e931fecb8 100644 --- a/e2e/unsafeProcessor.go +++ b/e2e/unsafeProcessor.go @@ -11,8 +11,8 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/primitives/format" ) diff --git a/e2e/utils_test.go b/e2e/utils_test.go index 52579e52870adbdfeac35087e9cf6558a60549d8..d3a803e5e20c15daff06f87be614fbc4e90dbebe 100644 --- a/e2e/utils_test.go +++ b/e2e/utils_test.go @@ -10,14 +10,14 @@ package e2e import ( "bytes" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" diff --git a/event/event.go b/event/event.go index 441fa394413d66d87259a744cf51ec7a595451d2..4e21f304187422918106efdd0029703e39b3c842 100644 --- a/event/event.go +++ b/event/event.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" ) // ReportableEvent is used to surface events to client users. diff --git a/fileTransfer/batchBuilder.go b/fileTransfer/batchBuilder.go index 6b529d5ba187394b85e207fb53024a733bd9ea12..1c67a36409071ae433f4348490a9ac8bf6cc6cb7 100644 --- a/fileTransfer/batchBuilder.go +++ b/fileTransfer/batchBuilder.go @@ -10,8 +10,8 @@ package fileTransfer import ( "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/fileTransfer/store" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/fileTransfer/store" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/format" @@ -29,6 +29,7 @@ const ( // batchBuilderThread creates batches of file parts as they become available and // buffer them to send. Also rate limits adding to the buffer. func (m *manager) batchBuilderThread(stop *stoppable.Single) { + jww.INFO.Printf("[FT] Starting batch builder thread.") // Calculate rate and make rate limiter rl := newRateLimiter(m.params.MaxThroughput, m.cmixGroup) diff --git a/fileTransfer/callbackTracker/callbackTracker.go b/fileTransfer/callbackTracker/callbackTracker.go index 40728d9b6437f88636a6621045862df969587a8d..fb1aa6a6272c04226b8829dc7b3354c55cfa202d 100644 --- a/fileTransfer/callbackTracker/callbackTracker.go +++ b/fileTransfer/callbackTracker/callbackTracker.go @@ -8,7 +8,7 @@ package callbackTracker import ( - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/xx_network/primitives/netTime" "sync" "time" diff --git a/fileTransfer/callbackTracker/callbackTracker_test.go b/fileTransfer/callbackTracker/callbackTracker_test.go index ad6882cc3833d42fe7133212945bab5b13a0ebcd..0b45cbac04b6b765b431006a69bca2edfc4b83e7 100644 --- a/fileTransfer/callbackTracker/callbackTracker_test.go +++ b/fileTransfer/callbackTracker/callbackTracker_test.go @@ -9,7 +9,7 @@ package callbackTracker import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "reflect" "testing" "time" diff --git a/fileTransfer/callbackTracker/manager.go b/fileTransfer/callbackTracker/manager.go index 4f03b0e3e26d25ce0cf4c9adde5766b272244907..4dee45a25ef104b6f25b168db7c77b8f0bdac771 100644 --- a/fileTransfer/callbackTracker/manager.go +++ b/fileTransfer/callbackTracker/manager.go @@ -9,7 +9,7 @@ package callbackTracker import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "strconv" "sync" diff --git a/fileTransfer/callbackTracker/manager_test.go b/fileTransfer/callbackTracker/manager_test.go index 920fb2f9eb165e4731d91b243d91ad56b811e6c1..64ab857c737e53e8e40326aec1822e9dca6e2ead 100644 --- a/fileTransfer/callbackTracker/manager_test.go +++ b/fileTransfer/callbackTracker/manager_test.go @@ -9,7 +9,7 @@ package callbackTracker import ( "errors" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/crypto/csprng" "io" diff --git a/fileTransfer/connect/listener.go b/fileTransfer/connect/listener.go index 94627f5fb6180d4d8cd792bd2f7d79d595b041cf..278b801311cc02a42f46fb2f80fc1ddebed480af 100644 --- a/fileTransfer/connect/listener.go +++ b/fileTransfer/connect/listener.go @@ -9,7 +9,7 @@ package connect import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" ) // Error messages. diff --git a/fileTransfer/connect/send.go b/fileTransfer/connect/send.go index dadd7b4d23f64035a17f2efc2db47a9146d74c51..1674d8eecea8f2c4062fe629fd09d8026e3ae187 100644 --- a/fileTransfer/connect/send.go +++ b/fileTransfer/connect/send.go @@ -10,9 +10,9 @@ package connect import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + ft "gitlab.com/elixxir/client/v4/fileTransfer" ) // Error messages. diff --git a/fileTransfer/connect/utils_test.go b/fileTransfer/connect/utils_test.go index eb365c0ec7b3737532c33d776e570dc1ef2bb5c5..f111e5268d7696b0ad2d4e5fc9697814829491dc 100644 --- a/fileTransfer/connect/utils_test.go +++ b/fileTransfer/connect/utils_test.go @@ -9,21 +9,21 @@ package connect import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" diff --git a/fileTransfer/connect/wrapper.go b/fileTransfer/connect/wrapper.go index c0a89973144d6b338bbadbefccbcffe813b0b112..76d23e9fd43f43f143c788b37abd0a9f780481f8 100644 --- a/fileTransfer/connect/wrapper.go +++ b/fileTransfer/connect/wrapper.go @@ -8,11 +8,11 @@ package connect import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/receive" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/receive" + ft "gitlab.com/elixxir/client/v4/fileTransfer" cryptoE2e "gitlab.com/elixxir/crypto/e2e" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "time" diff --git a/fileTransfer/connect/wrapper_test.go b/fileTransfer/connect/wrapper_test.go index 2a470a19a2945f50f744f9cea4b4f6b0c6c5a435..dd051273919a755e0558fd72907ecb4a1a1601a7 100644 --- a/fileTransfer/connect/wrapper_test.go +++ b/fileTransfer/connect/wrapper_test.go @@ -9,10 +9,10 @@ package connect import ( "bytes" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/e2e/receive" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/e2e/receive" + ft "gitlab.com/elixxir/client/v4/fileTransfer" "gitlab.com/elixxir/crypto/fastRNG" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/e2e/listener.go b/fileTransfer/e2e/listener.go index ff43c933f16214d1816ab1a7887211b134efc307..0135ff4a52b34ca8a8cbb0540d44cd5942305638 100644 --- a/fileTransfer/e2e/listener.go +++ b/fileTransfer/e2e/listener.go @@ -9,7 +9,7 @@ package e2e import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/v4/e2e/receive" ) // Error messages. diff --git a/fileTransfer/e2e/send.go b/fileTransfer/e2e/send.go index 653e59b647cfbd0bf39bf3b6154db2d2d3e696ed..6b0a66d55098db3175caef36bd65071cf8dcceb7 100644 --- a/fileTransfer/e2e/send.go +++ b/fileTransfer/e2e/send.go @@ -10,9 +10,9 @@ package e2e import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + ft "gitlab.com/elixxir/client/v4/fileTransfer" "gitlab.com/xx_network/primitives/id" ) diff --git a/fileTransfer/e2e/utils_test.go b/fileTransfer/e2e/utils_test.go index 7635d9a88e32e9a6cb2a719bd6435813a210d804..38a6043ccab82ac96eeb942260194d6b6acc7ebf 100644 --- a/fileTransfer/e2e/utils_test.go +++ b/fileTransfer/e2e/utils_test.go @@ -10,22 +10,22 @@ package e2e import ( "github.com/cloudflare/circl/dh/sidh" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - userStorage "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + userStorage "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" diff --git a/fileTransfer/e2e/wrapper.go b/fileTransfer/e2e/wrapper.go index fa59905cef8c5efffae9e514ab18562f2aadb6f0..a5d90401227c7f61160c349f94099e16a6f73f25 100644 --- a/fileTransfer/e2e/wrapper.go +++ b/fileTransfer/e2e/wrapper.go @@ -8,10 +8,10 @@ package e2e import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/receive" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/receive" + ft "gitlab.com/elixxir/client/v4/fileTransfer" cryptoE2e "gitlab.com/elixxir/crypto/e2e" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" @@ -118,6 +118,7 @@ func (w *Wrapper) addEndMessageToCallback( if !w.p.NotifyUponCompletion { return progressCB } + return func(completed bool, arrived, total uint16, st ft.SentTransfer, t ft.FilePartTracker, err error) { diff --git a/fileTransfer/e2e/wrapper_test.go b/fileTransfer/e2e/wrapper_test.go index c1924066a91828feafc071683b4ca21961158036..b5bf807a2d2b251f38e83d9aa97deed770d8a015 100644 --- a/fileTransfer/e2e/wrapper_test.go +++ b/fileTransfer/e2e/wrapper_test.go @@ -9,10 +9,10 @@ package e2e import ( "bytes" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/receive" - ft "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/receive" + ft "gitlab.com/elixxir/client/v4/fileTransfer" "gitlab.com/elixxir/crypto/fastRNG" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/exampleFile_test.go b/fileTransfer/exampleFile_test.go new file mode 100644 index 0000000000000000000000000000000000000000..3fd52f23881039e4ec67a2eb975e8808b042f456 --- /dev/null +++ b/fileTransfer/exampleFile_test.go @@ -0,0 +1,342 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer + +const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at efficitur urna, et ultrices leo. Sed lacinia vestibulum tortor eu convallis. Proin imperdiet accumsan magna, sed volutpat tortor consectetur at. Mauris sed dolor sed sapien porta consectetur in eu sem. Maecenas vestibulum varius erat, eget porta eros vehicula mattis. Phasellus tempor odio at tortor maximus convallis. Nullam ut lorem laoreet, tincidunt ex sollicitudin, aliquam urna. Mauris vel enim consequat, sodales nibh quis, sollicitudin ipsum. Quisque lacinia, sapien a tempor eleifend, dolor nibh posuere neque, sit amet tempus dolor ante non nunc. Proin tempor blandit mollis. Mauris nunc sem, egestas eget velit ut, luctus molestie ipsum. Pellentesque sed eleifend dolor. Nullam pulvinar dignissim ante, eget luctus quam hendrerit vel. Proin ornare non tortor vitae rhoncus. Etiam tellus sem, condimentum id bibendum sed, blandit ac lorem. Maecenas gravida, neque quis blandit ultrices, nisl elit pretium nulla, ac volutpat massa odio sed arcu. + +Etiam at nibh dui. Vestibulum eget odio vestibulum sapien volutpat facilisis. Phasellus tempor risus in nisi viverra, ut porta est dictum. Aliquam in urna gravida, pulvinar sem ac, luctus erat. Fusce posuere id mauris non placerat. Quisque porttitor sagittis sapien nec scelerisque. Aenean sed mi nec ante tincidunt maximus. Etiam accumsan, dui eget varius mattis, ex quam efficitur est, id ornare nulla orci id mi. Mauris vulputate tincidunt nunc, et tempor augue sollicitudin eget. + +Sed vitae commodo neque, euismod finibus libero. Integer eget condimentum elit, id volutpat odio. Donec convallis magna lacus, varius volutpat augue lacinia a. Proin venenatis ex et ullamcorper faucibus. Nulla scelerisque, mauris id molestie hendrerit, magna justo faucibus lacus, quis convallis nulla lorem nec nisi. Nunc dictum nisi a molestie efficitur. Etiam vel nibh sit amet nibh finibus gravida eget id tellus. Donec elementum blandit molestie. Donec fringilla sapien ut neque bibendum, at ultrices dui molestie. Sed lobortis auctor justo at tincidunt. In vitae velit augue. Vestibulum pharetra ex quam, in vehicula urna ullamcorper sit amet. Phasellus at rhoncus diam, nec interdum ligula. Pellentesque eget risus dictum, ultrices velit at, fermentum justo. Nulla orci ex, tempor vitae velit eu, gravida pellentesque dolor. + +Aenean auctor at lorem in auctor. Sed at mi non quam aliquam aliquet vitae eu erat. Sed eu orci ac elit scelerisque rhoncus eget at orci. Donec a imperdiet ipsum. Phasellus efficitur lobortis mauris, et scelerisque diam consectetur sit amet. Nunc nunc lectus, accumsan vel eleifend vel, tempor vitae sapien. Nunc dictum tempus turpis non blandit. Sed condimentum pretium velit ac sodales. In accumsan leo vel sem commodo, eget hendrerit risus interdum. Nullam quis malesuada purus, non euismod turpis. In augue lorem, convallis quis urna vel, euismod tincidunt nunc. Ut eget luctus lacus, in commodo diam. + +Aenean ut ante sed ex ornare maximus quis venenatis urna. Fusce commodo fermentum velit nec varius. Etiam vitae odio vel nisl condimentum fringilla. Donec in risus tincidunt ex placerat vestibulum. Donec hendrerit tellus convallis malesuada vulputate. Aenean condimentum metus id est mollis viverra. Quisque at auctor turpis. Aenean est metus, laoreet eu justo a, consequat suscipit nibh. Etiam mattis massa in sem sollicitudin, non blandit dolor pharetra. Vivamus pretium nunc ut lacus interdum, ut feugiat lectus blandit. Vestibulum sit amet scelerisque lectus. Nam ut lorem mattis urna semper rutrum. + +Maecenas imperdiet libero et metus porta maximus. Duis lobortis porttitor sem, ut dictum urna consequat vitae. Sed consectetur est at arcu fringilla scelerisque. Nulla finibus libero eu nibh vulputate euismod. Praesent volutpat nisi eget elit dignissim, ac imperdiet nisi mollis. Integer a venenatis neque. Fusce leo leo, auctor sit amet auctor in, elementum quis magna. + +Donec efficitur ullamcorper ex eget pretium. Suspendisse pharetra sagittis neque, eget laoreet sem maximus et. Etiam sit amet mi ut purus ornare molestie a nec diam. Sed eleifend dui at orci sollicitudin bibendum. Mauris non leo eu est consequat porttitor consectetur vel massa. Nullam pretium molestie leo in hendrerit. Etiam dapibus ante tellus, quis hendrerit turpis feugiat vitae. Maecenas id lorem quis nibh tincidunt accumsan sed sed nisi. Duis non faucibus odio. Fusce porta enim vitae ex ultrices, non euismod nibh posuere. + +Suspendisse luctus orci blandit, tempor ipsum in, molestie erat. Fusce commodo sed sapien quis interdum. Etiam sollicitudin ipsum a ipsum tempus, a vestibulum ligula hendrerit. Integer eget nisl a arcu hendrerit sollicitudin. Fusce a purus ornare, sollicitudin ante in, gravida elit. Vestibulum ut tortor volutpat, sodales enim eget, aliquam risus. Pellentesque efficitur nec sem id molestie. Mauris molestie, risus sit amet dignissim dictum, turpis ante vehicula tellus, in eleifend risus metus in mi. Aenean interdum ac metus ac porttitor. Vivamus nec blandit arcu. Maecenas fringilla varius metus, sed viverra diam facilisis a. + +Curabitur placerat cursus sem, in laoreet elit mollis in. Nam convallis aliquam placerat. Sed quis efficitur est. Proin id massa quam. Fusce nec porttitor quam. Nunc ac massa imperdiet, pretium nibh quis, maximus nisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec pretium purus id viverra fringilla. Cras congue facilisis orci et ullamcorper. In ac turpis arcu. Praesent convallis in ligula vitae suscipit. + +Etiam et egestas ipsum, ac lacinia erat. Nunc in metus sit amet lectus ultricies viverra in sed elit. Ut euismod urna eget nisl faucibus, accumsan vestibulum dolor suscipit. Aenean a volutpat ipsum. Nulla pharetra enim eu lorem vestibulum malesuada. Nulla facilisi. In congue at odio vel imperdiet. Fusce in elit in nibh dapibus rutrum. Donec consequat mauris a sem viverra egestas. Suspendisse sollicitudin dapibus finibus. Nullam tempus et lacus sed feugiat. Suspendisse aliquet, sem a fringilla elementum, ante lorem elementum odio, quis sollicitudin magna nibh sed libero. Maecenas convallis congue neque, ut molestie nibh porttitor ac. Vestibulum quis justo sed ipsum tempus viverra. Quisque mauris erat, varius a ipsum eu, porta molestie odio. Morbi mauris ante, sagittis eget nibh vel, volutpat faucibus nunc. + +Donec id neque feugiat, tristique neque et, luctus nibh. Duis vel lacus eu nisl dignissim sagittis sed sed lacus. Praesent luctus eleifend aliquet. Sed tempus facilisis lorem, sit amet tristique metus suscipit ac. Vestibulum id sapien ac erat luctus fermentum venenatis sit amet erat. Maecenas posuere finibus mi. Phasellus facilisis efficitur turpis sed auctor. Nullam lobortis ornare velit ac scelerisque. Vestibulum facilisis, odio ac finibus viverra, leo leo sodales arcu, sed ornare ex ligula vel lacus. Nullam odio orci, pulvinar eu urna in, tristique ornare augue. + +Vivamus scelerisque egestas justo, at dignissim erat elementum id. Etiam vel suscipit erat. Nulla accumsan ex sem, id pharetra eros tincidunt sodales. Nullam enim augue, interdum ut est ac, faucibus semper justo. Aliquam ut iaculis magna. Sed magna turpis, pretium nec lobortis vel, facilisis vitae mauris. Donec tincidunt eros in mauris maximus porta id vehicula mi. Integer ut orci lobortis turpis vehicula viverra. Vestibulum at blandit nunc, ac pretium quam. Morbi ac metus placerat, congue lorem nec, pharetra neque. + +Sed vestibulum nibh ex, fringilla lobortis libero sodales sed. Aenean vehicula nibh tellus, egestas eleifend diam sollicitudin non. Fusce ut sollicitudin leo. Nam tempor dictum erat sit amet vestibulum. Pellentesque ornare mattis ex, nec malesuada elit sollicitudin vitae. Nulla nec semper enim, venenatis ornare orci. Aliquam urna purus, ornare eu ipsum vitae, consectetur faucibus elit. Nulla vestibulum semper ligula, id rhoncus tortor accumsan nec. Vestibulum non ante sed urna efficitur imperdiet vitae quis felis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque rutrum quam sit amet nisl facilisis, quis maximus ante bibendum. + +Integer vel tortor nec est sodales posuere ut ac ipsum. Curabitur id odio nisl. Sed id augue iaculis, viverra risus nec, bibendum nunc. Cras ex risus, semper ac lorem nec, mattis dictum purus. Aenean semper et lacus at condimentum. Fusce nisl dolor, facilisis nec velit at, tempus pharetra mauris. Nam ac magna urna. Nulla convallis libero sed ex eleifend, ac molestie magna rhoncus. + +Donec blandit aliquam metus molestie suscipit. Cras et malesuada urna, non facilisis turpis. Donec non orci at leo aliquet porttitor vel non turpis. Nam consequat libero quam, non egestas ipsum eleifend quis. Mauris laoreet tellus enim, ac porta sapien condimentum quis. Nunc non sagittis orci. Aenean leo nibh, feugiat in turpis eget, hendrerit faucibus ligula. Morbi et massa nulla. Curabitur ac tempus nibh. Quisque commodo imperdiet viverra. Quisque sit amet condimentum mauris. + +Aliquam vel velit sed turpis consectetur eleifend quis et quam. Integer sed magna vel nisl consectetur lacinia vitae et ante. Duis consequat nulla ac leo auctor, ac euismod ipsum semper. Aliquam libero neque, imperdiet et nisi fringilla, vehicula elementum leo. Phasellus facilisis felis nec sagittis sodales. Donec ac consectetur odio. Aliquam eu aliquam lacus. Aliquam dictum eleifend risus, hendrerit eleifend nibh feugiat at. Aenean id tristique justo. Maecenas vel nibh quis massa aliquam convallis in eget mauris. + +Vestibulum nec fringilla neque, sit amet pellentesque dolor. Aenean a dolor enim. Morbi urna orci, mollis in viverra vel, volutpat vitae magna. Aenean sodales nec nisi ultrices condimentum. Quisque in turpis lobortis purus elementum maximus lacinia et nibh. Donec sed tortor eu nibh bibendum convallis in quis massa. Integer efficitur ultricies odio vel commodo. + +Quisque fermentum odio sit amet nunc tempus, vel porta nunc lobortis. Nam pellentesque elit non leo interdum, blandit eleifend purus suscipit. Nullam porta est non enim vulputate, ut molestie tortor ullamcorper. Donec fermentum, lectus suscipit commodo aliquet, tellus lacus rutrum ante, quis condimentum risus nisi id risus. Ut dapibus hendrerit odio non aliquet. Integer neque odio, dictum ac efficitur sit amet, facilisis a lacus. Nulla placerat erat et tortor placerat, vel posuere felis dignissim. Morbi non scelerisque ipsum. Aliquam hendrerit vestibulum metus vel pellentesque. Nunc fringilla turpis sodales nisi vestibulum faucibus. Quisque vehicula est arcu, tempus eleifend lorem scelerisque vitae. + +Nullam vehicula tortor vel purus hendrerit convallis. Cras sagittis metus ex, sit amet sollicitudin lectus vulputate quis. Integer sem odio, lobortis et pretium non, pharetra ut lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque aliquam aliquet lorem, faucibus venenatis diam viverra in. Nullam pulvinar, nisi vel elementum venenatis, lacus risus convallis neque, ac eleifend lorem enim ac turpis. Pellentesque tellus quam, dictum eu nisl non, cursus pellentesque justo. + +Cras pharetra lorem sed magna vulputate, eget iaculis elit molestie. Morbi a est finibus, condimentum nunc at, feugiat magna. Curabitur turpis turpis, placerat sed risus vitae, porta volutpat elit. Phasellus id neque diam. Maecenas eu metus a urna iaculis egestas eget at elit. Nunc vehicula molestie dapibus. In auctor sapien eget mi tempus, eu tempor massa egestas. Pellentesque metus sem, pharetra non urna ac, convallis hendrerit massa. Mauris nunc velit, maximus sit amet est sit amet, gravida ultrices elit. Vivamus ut luctus nisl. Nam et ultrices ipsum. Maecenas eget blandit mi. Curabitur eu lorem nec est vehicula sodales. + +Vestibulum hendrerit sed est vitae egestas. Nam molestie, augue non consequat efficitur, elit purus commodo orci, et pharetra ante risus eget augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas a nulla enim. Ut accumsan sodales ultrices. Quisque gravida, leo rhoncus placerat egestas, eros felis posuere diam, ut eleifend orci nisl vitae lorem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam sit amet urna venenatis, pulvinar nisi eget, tristique nisi. Nam nec purus hendrerit, congue augue et, facilisis diam. Donec aliquet eleifend mauris. Vivamus eu libero rhoncus, scelerisque metus at, hendrerit quam. Cras vulputate, magna eget pretium accumsan, tortor nunc molestie quam, at vulputate turpis velit eget arcu. Etiam tristique sollicitudin est, in condimentum diam faucibus vitae. + +Curabitur id lorem elementum diam sollicitudin gravida a sit amet ipsum. Pellentesque tortor ligula, auctor at ultricies non, pulvinar et risus. Ut vitae cursus metus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed quis tortor feugiat, fermentum nunc at, sodales massa. Donec efficitur euismod diam non sodales. In eu augue quis enim elementum auctor. In hac habitasse platea dictumst. Cras in libero nec urna tempor venenatis vitae a diam. Nam vulputate nisl nulla, ut porttitor elit euismod non. Praesent eget tempus lacus, vel ullamcorper nulla. Quisque ut risus nibh. Nam rhoncus commodo consectetur. Sed ultrices sapien id lectus imperdiet, sed tincidunt est dapibus. + +Integer posuere mattis ipsum congue ullamcorper. Nunc ac vulputate magna. Ut bibendum scelerisque lectus. Nullam laoreet porta nunc, in viverra dolor blandit eu. Ut semper id urna quis bibendum. Vivamus sed felis nec sapien faucibus volutpat sed et nisi. Morbi faucibus venenatis imperdiet. Mauris semper ex ac blandit scelerisque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Suspendisse vitae lectus diam. Nulla vel lectus non magna congue pharetra eget nec augue. Morbi elementum, nisl ut vestibulum varius, quam sapien convallis magna, tempus maximus nunc est vel purus. In molestie ligula sed placerat sagittis. In rutrum, felis volutpat pulvinar pharetra, arcu odio egestas augue, ut dapibus leo libero nec urna. Curabitur tortor sapien, aliquam id suscipit et, feugiat a leo. Sed mollis imperdiet tellus, ac placerat felis tristique sed. Fusce pulvinar est felis, sed rutrum neque sollicitudin sit amet. Donec tincidunt elit vel felis sagittis, sit amet vestibulum enim pellentesque. Nam accumsan rhoncus tellus vitae auctor. + +Praesent mattis risus eget dui finibus lobortis. Suspendisse auctor commodo viverra. Quisque a ante ante. Proin magna mi, efficitur vitae arcu vel, vehicula viverra lacus. Nulla rhoncus aliquet tortor eget iaculis. Vestibulum ac mollis risus. Curabitur non rhoncus neque. Donec non ipsum quis lectus fermentum convallis ac quis risus. + +Pellentesque aliquam diam diam, in tempus nisi rhoncus sed. Praesent ultricies nisl justo, sit amet suscipit lectus pharetra quis. Praesent non diam in dolor vulputate molestie ut vel nulla. Cras vel congue neque, in ultricies metus. Aliquam ultricies quam eget placerat accumsan. Aenean sodales cursus semper. Donec justo ex, euismod et mollis at, congue a arcu. + +In at sapien pulvinar, scelerisque felis sit amet, hendrerit diam. Aliquam pellentesque est vel augue dignissim, quis ornare sapien tincidunt. Nullam porta tincidunt tempus. Morbi eget arcu sed mauris tincidunt malesuada. Vivamus eleifend tortor in diam vulputate, non convallis nisi sodales. Vestibulum id arcu quis nisl maximus semper. Nunc quis dui vitae lectus dapibus luctus. Mauris mattis convallis mi, ut fringilla velit pulvinar non. + +Nam auctor ligula id dignissim pretium. Aliquam id ultricies massa. Suspendisse ullamcorper nec enim non egestas. Sed tristique, est eu cursus elementum, mauris nisi consectetur nulla, dapibus ultricies tortor mi ut augue. Sed vitae velit luctus, viverra velit a, malesuada eros. Mauris efficitur tortor quam, sed sodales velit suscipit varius. Integer varius nisi sit amet pharetra consequat. Fusce a fringilla felis, vel porta risus. Maecenas nibh magna, euismod quis tellus nec, faucibus mattis erat. Nulla facilisi. Cras maximus tempor dolor, a tristique diam consectetur in. Nam semper sapien tincidunt justo ornare vehicula. Suspendisse sit amet egestas lacus, ac bibendum urna. + +Integer sed est id tortor molestie placerat. Pellentesque vehicula risus eget massa lacinia hendrerit. Sed ut elit quis diam posuere bibendum in et ligula. Donec lobortis lacus eget aliquet maximus. Nullam risus massa, imperdiet eu urna ut, luctus fringilla tortor. Ut imperdiet nibh metus. Sed vitae purus nisl. + +Nunc sed magna arcu. Proin ornare lectus at semper hendrerit. Donec mi nunc, mattis in nibh a, facilisis ornare arcu. Curabitur in pretium turpis. Donec vulputate turpis sem, quis consectetur felis euismod a. Nullam sapien libero, dictum a odio a, pretium accumsan mauris. Nunc et velit varius, gravida metus non, mollis dui. Praesent nec dictum lorem, id bibendum nisi. In hac habitasse platea dictumst. Curabitur in imperdiet eros. Quisque vitae turpis lorem. In hac habitasse platea dictumst. Aliquam lobortis felis sit amet metus maximus, sit amet vulputate lorem ornare. In non ultrices eros. + +Praesent tellus nisl, feugiat ut rhoncus at, euismod ac ipsum. Donec vitae felis consectetur dolor ultricies scelerisque et at mauris. Donec justo lorem, euismod non velit ac, malesuada tempus sem. Pellentesque nunc sem, pharetra sed fermentum non, dignissim at nunc. Sed placerat dignissim dolor vitae malesuada. Maecenas in orci in arcu dictum facilisis eget et dui. Sed sed elit sed augue cursus rhoncus gravida sit amet mauris. In vel tempor lectus. Vestibulum congue, quam et feugiat placerat, tortor urna elementum magna, et laoreet neque orci id felis. Aliquam scelerisque nisi eget nisl dignissim, id luctus dolor tempus. Etiam ornare, magna vel dictum faucibus, ante lacus interdum sem, non malesuada urna felis quis dolor. Donec faucibus sagittis elementum. Fusce id risus eu nulla ornare tincidunt iaculis id erat. + +Suspendisse potenti. Nunc tristique nulla ac elementum ornare. Quisque finibus vitae erat at molestie. Maecenas consectetur mollis odio eu luctus. Phasellus id velit et nunc euismod varius vel vel dolor. Duis tempus nisi eu risus laoreet porta. Sed tempor eget neque eget pharetra. Duis non massa ac sem vulputate congue. Aliquam sodales sapien nisi, ut egestas orci ornare volutpat. Ut dui libero, viverra vel turpis vitae, molestie auctor justo. Pellentesque lacinia arcu vitae nunc auctor, nec elementum lorem malesuada. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer at aliquet diam. Duis sit amet orci nec urna convallis ultrices at nec nunc. + +Quisque rutrum eros vel ipsum tincidunt, quis pulvinar mi tincidunt. Quisque eget condimentum diam. Fusce porttitor maximus dolor et suscipit. In turpis tellus, semper hendrerit elit at, elementum fringilla nisl. Curabitur a maximus nunc. Ut dictum dignissim lectus, et convallis eros volutpat non. Sed tempor orci risus, nec fringilla nisl dictum quis. Nunc id sagittis ipsum. + +Fusce sollicitudin suscipit risus, tincidunt fermentum odio cursus eget. Proin tempus, felis et dignissim gravida, quam libero condimentum ligula, eget commodo libero sapien eget magna. Quisque feugiat purus mi, in facilisis augue euismod non. In euismod pharetra enim, non tristique purus dictum ac. Maecenas sed diam tincidunt, mollis neque a, imperdiet est. Sed eu orci non nulla mollis consequat et quis metus. Fusce odio metus, tincidunt ac velit sit amet, tempor posuere tortor. Vestibulum ornare, quam non vulputate feugiat, diam nibh finibus augue, at pharetra lectus nibh quis metus. Nam dignissim quis tellus eget aliquet. Proin iaculis sit amet ex eu vehicula. Etiam vehicula sollicitudin laoreet. Praesent venenatis luctus est. Suspendisse potenti. Donec luctus molestie mollis. Vestibulum quis tortor ut mauris porta gravida sed sit amet felis. Aliquam in ex condimentum, volutpat eros scelerisque, accumsan orci. + +Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas vitae viverra sapien. Suspendisse vel accumsan libero, ac rutrum purus. Aliquam in risus sed metus sollicitudin convallis eget in purus. Phasellus sagittis vestibulum magna, quis scelerisque augue malesuada vel. Quisque felis leo, vulputate laoreet enim lacinia, gravida viverra urna. Aliquam faucibus vestibulum maximus. Praesent scelerisque velit quis pellentesque varius. Ut consectetur ut risus a bibendum. In mollis sapien vitae ipsum volutpat, sit amet mattis nibh dictum. Curabitur eros ipsum, tincidunt et mauris id, maximus mattis sem. Mauris quis elit laoreet, porttitor nulla sit amet, feugiat tortor. Cras nec enim pulvinar, tincidunt lorem molestie, ornare arcu. Cras imperdiet quis ante vitae hendrerit. Sed tincidunt dignissim viverra. + +Aenean varius turpis dui, id efficitur lorem placerat sit amet. In hac habitasse platea dictumst. Integer quis pulvinar massa. Proin efficitur, ipsum eget vulputate lobortis, nibh ipsum faucibus magna, non luctus lorem nulla sed magna. Vestibulum scelerisque sed tortor eu aliquet. Curabitur et leo ac tellus pretium egestas. Cras blandit neque dui, eget dictum leo porttitor sed. Sed ultricies commodo tortor, a molestie ante scelerisque vitae. Duis faucibus quis magna nec lacinia. Morbi congue justo id dui ultricies condimentum. Pellentesque maximus faucibus gravida. Mauris vestibulum non libero sit amet fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras id lorem condimentum, sodales dui id, blandit dolor. Sed elit mauris, aliquet nec enim vitae, sollicitudin pretium dui. Cras lacus sapien, maximus in libero et, elementum fermentum nunc. + +Vestibulum gravida cursus nisi sed congue. Nam velit lorem, porttitor id pharetra finibus, malesuada eget dui. Vestibulum at est ultrices, venenatis nulla sed, suscipit risus. Maecenas posuere pretium odio nec accumsan. Aliquam dui dui, laoreet sed felis non, dignissim hendrerit ante. Etiam id commodo ante. Aenean bibendum enim aliquet fringilla dictum. Morbi eu feugiat risus. + +Praesent gravida a ante non placerat. Mauris ultricies ullamcorper justo id viverra. Aenean semper metus eu nisl euismod suscipit. Proin erat quam, viverra ut metus eget, imperdiet accumsan nunc. Curabitur non enim a odio maximus pulvinar ac et elit. In auctor ex a malesuada malesuada. Nullam dapibus quam neque, a lacinia magna tempor eget. Nam pellentesque, nisl eget gravida porta, felis magna lacinia ipsum, eu lacinia felis dui non libero. Phasellus ut convallis urna. Curabitur convallis sem vel tortor lobortis molestie. Nunc vel fringilla mi. Donec eget libero ultricies, euismod nibh non, gravida mauris. Praesent malesuada, lectus at sollicitudin interdum, mi lacus aliquam metus, non gravida tortor velit ac justo. Suspendisse auctor tellus sapien, at eleifend erat mollis et. + +Sed a dictum quam. Sed accumsan libero vel feugiat vulputate. Cras mattis massa nec velit rhoncus luctus. Sed ornare, augue vel ornare lobortis, purus nulla interdum ipsum, a semper massa enim quis nunc. Nunc tempor efficitur odio, vel consequat dui fringilla ac. Quisque at quam sed lacus rhoncus sollicitudin. Nunc dolor libero, dictum a ornare id, euismod ac lectus. Quisque a hendrerit lectus. Nam ut diam eu neque viverra porttitor. Proin vitae accumsan eros, ut iaculis lorem. Nulla libero odio, mollis sed venenatis et, imperdiet ut ligula. + +Aliquam dignissim erat erat, vel imperdiet arcu sagittis id. In in dolor orci. Aliquam congue fermentum dui tristique viverra. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur a turpis in dolor consequat pulvinar. Pellentesque sed posuere nisl. Etiam pellentesque euismod sem. Quisque vitae nibh urna. Phasellus elementum arcu urna, ac scelerisque leo iaculis non. Etiam laoreet, nunc a consectetur rhoncus, nunc tortor feugiat nibh, vitae volutpat metus mauris in est. Pellentesque at neque eu arcu faucibus auctor nec vitae urna. Suspendisse semper tristique nisl id interdum. + +Integer dui libero, auctor id elementum a, convallis eu est. Praesent auctor sodales faucibus. Aenean faucibus euismod orci, vestibulum pharetra magna consectetur vel. Praesent a enim vel nisi aliquam tristique ut id metus. Donec at purus dui. Sed a aliquam velit, non viverra ex. Ut molestie interdum urna vel facilisis. Nunc iaculis aliquet turpis eu luctus. Vestibulum mollis diam vel ante finibus, a efficitur est tempus. Nulla auctor cursus sagittis. Nullam id odio vitae orci tristique eleifend. + +Ut iaculis turpis at sollicitudin accumsan. Cras eleifend nisl sed porta euismod. Nullam non nisi turpis. Cras feugiat justo nec augue pretium fermentum. Nunc malesuada at nulla a interdum. Proin ullamcorper commodo ligula ac rutrum. Praesent eros augue, venenatis vitae enim sit amet, ultricies eleifend risus. Nunc bibendum, leo ac consequat porttitor, diam ante posuere turpis, ut mattis odio justo consectetur justo. Phasellus ex dolor, aliquam et malesuada vitae, porttitor sed tellus. + +Praesent vitae lorem efficitur, consequat enim ut, laoreet nisi. Aliquam volutpat, nisl vel lobortis dapibus, risus justo lacinia justo, viverra lacinia justo lorem egestas nibh. Suspendisse pellentesque justo sed interdum sagittis. Maecenas vel ultricies magna. Duis feugiat vel arcu ac placerat. In tincidunt a orci at feugiat. Maecenas gravida tincidunt nibh eu convallis. Quisque pulvinar rutrum cursus. + +Proin nec maximus tortor. Morbi pellentesque magna vitae risus scelerisque elementum. Nulla fringilla neque at arcu malesuada rutrum. Fusce nisi magna, elementum fringilla elit ut, lacinia varius purus. In accumsan justo ex, vitae suscipit velit finibus cursus. Morbi sed suscipit orci. Fusce nulla erat, fermentum vel aliquam vitae, eleifend et elit. Maecenas id elit a ligula vestibulum blandit ut at eros. Etiam ac bibendum massa, sagittis viverra dolor. Maecenas sed sapien nec elit fringilla molestie a vel purus. In in semper odio, quis consectetur dolor. In sed metus a nisi tincidunt posuere nec eget erat. + +Maecenas non auctor sem. Nullam in turpis sagittis, fermentum neque finibus, fermentum justo. Sed id nisl mattis, commodo felis in, dapibus turpis. Nullam in elit in nunc aliquam laoreet vel vitae magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tincidunt tempus imperdiet. Nulla est est, mollis imperdiet varius nec, porta in nulla. Vestibulum volutpat euismod nisi vel laoreet. + +Cras congue egestas sodales. Nam commodo malesuada est nec volutpat. Ut gravida, turpis ac congue molestie, sapien augue molestie nulla, quis lacinia sapien dui eu nunc. Aliquam eleifend, leo et finibus pharetra, ante sapien congue purus, quis euismod urna nulla et metus. Donec vulputate hendrerit tortor quis mollis. Vestibulum et condimentum purus, vel aliquam lacus. Ut id congue sapien. Pellentesque ante lectus, hendrerit sit amet luctus quis, feugiat dignissim leo. Aenean aliquam imperdiet cursus. Praesent vulputate turpis ullamcorper felis tincidunt tincidunt. Duis quis augue vitae nibh finibus sagittis. Sed sollicitudin scelerisque tellus, ut interdum diam sollicitudin bibendum. Vestibulum iaculis fermentum sem sit amet tempus. Suspendisse lobortis eleifend fermentum. + +Etiam consectetur est sit amet nisl aliquet, eget fermentum tellus rhoncus. Quisque vulputate sit amet mauris eget lacinia. Fusce ac eros tellus. Suspendisse et tellus felis. Praesent ultricies nunc lorem, sed sodales orci viverra eu. Vestibulum maximus nibh et turpis efficitur, in tempus ipsum efficitur. Vivamus finibus lorem nec malesuada egestas. Praesent in nibh sagittis, volutpat risus et, commodo est. Suspendisse facilisis eu augue nec tincidunt. Fusce quis nisl tempus, tincidunt lacus nec, dapibus purus. + +Vivamus et ante eu ante sodales elementum sed id urna. In tincidunt vel tortor sed feugiat. Praesent iaculis diam eget pellentesque ornare. Praesent aliquet convallis odio sit amet suscipit. Morbi et nisi nulla. Nunc vestibulum risus a faucibus efficitur. Pellentesque commodo odio eu leo vestibulum, id iaculis risus sagittis. Cras a ipsum posuere, rhoncus eros in, euismod nulla. Nam semper, mi id tempor sodales, diam sem blandit odio, eget posuere tellus nisi nec tortor. Etiam nec tortor congue, sodales ante ac, malesuada elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce fringilla eros sit amet orci vestibulum aliquam. Suspendisse fermentum malesuada est, sit amet condimentum ante volutpat nec. Integer sit amet magna molestie, feugiat odio a, condimentum lectus. + +Nullam odio ligula, mollis eu massa ac, maximus interdum velit. Vestibulum vulputate a justo ac efficitur. Quisque ex est, pretium id velit nec, malesuada posuere arcu. Sed congue lacus nec velit vehicula, a egestas erat mattis. Nunc eget leo a metus rhoncus mollis. Maecenas at elit nec est condimentum suscipit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nisi mauris, consequat varius mollis at, porta ac dolor. Mauris vitae euismod lorem, ut dapibus turpis. Vivamus sit amet iaculis turpis. Nulla molestie feugiat urna in pharetra. + +Nam ac elit vulputate magna venenatis pharetra ac eu elit. Donec sed eros id lacus molestie rutrum. Sed iaculis mauris nunc, non fringilla ante semper eu. Maecenas in auctor eros. Vestibulum eu enim lorem. Etiam tristique dui id justo blandit dignissim. Aenean quis faucibus eros. Quisque vel dolor lectus. Etiam lacus enim, laoreet varius dolor ut, sollicitudin imperdiet lacus. + +Quisque vel nibh sollicitudin urna pellentesque euismod sed sed lorem. Suspendisse in condimentum ipsum, eu convallis ipsum. Nunc faucibus condimentum ante efficitur imperdiet. Donec tempor egestas efficitur. Morbi et aliquam nisl, quis iaculis elit. Fusce eu elit et sapien auctor ullamcorper. Curabitur sem orci, pharetra vitae facilisis non, scelerisque et mi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut molestie eu velit id ultricies. Maecenas vehicula id tortor sit amet faucibus. Duis porta enim nec vestibulum posuere. Aenean blandit fringilla lacus accumsan pellentesque. Integer ut ante elementum, imperdiet metus sit amet, consequat orci. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget libero non arcu luctus pulvinar. Vestibulum condimentum tellus nec enim bibendum aliquam. Nulla non placerat massa. Donec vestibulum nibh at rutrum mollis. Aliquam erat volutpat. Vivamus metus est, rhoncus a efficitur id, blandit id dolor. + +Nunc rutrum lacus ut pharetra feugiat. Sed volutpat semper metus sit amet placerat. Phasellus efficitur porta venenatis. Quisque imperdiet metus nunc, nec porttitor turpis iaculis ut. Sed at orci eget eros lacinia volutpat. Etiam sagittis euismod diam quis ullamcorper. Nulla facilisi. Praesent faucibus neque vel tortor pharetra, ac tincidunt nunc rutrum. Phasellus aliquam nulla in augue rhoncus, a lacinia tellus pretium. + +Praesent in mauris lectus. Aliquam molestie nulla vitae nulla consectetur convallis. Sed eu molestie velit, vitae venenatis elit. Quisque eget ultricies mauris, at euismod risus. Sed gravida velit ut risus tempor suscipit. Maecenas metus nisi, pellentesque in ornare et, fermentum et lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Quisque in mi congue, molestie massa a, fermentum tellus. Integer vitae tortor iaculis, tincidunt magna et, egestas ligula. Sed feugiat metus id erat faucibus, ac bibendum enim sollicitudin. Cras hendrerit massa sapien, et consequat tellus accumsan lacinia. Nam pharetra, ipsum ut vestibulum fringilla, sapien eros finibus leo, eget suscipit nibh arcu aliquam quam. Quisque sollicitudin id est eu rutrum. Nunc vitae tincidunt nisi, euismod viverra enim. Maecenas mattis sapien at felis hendrerit dignissim. + +Quisque eu urna nulla. Integer at eros fermentum est mattis rutrum at nec massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ut hendrerit nunc. Vestibulum est velit, rhoncus quis nisi sed, lobortis aliquet metus. Nunc faucibus egestas magna sit amet ornare. Maecenas eu justo mi. Proin tincidunt sem vel metus efficitur, sit amet malesuada augue cursus. + +Vestibulum viverra augue ut lorem accumsan, nec lacinia ligula accumsan. Maecenas viverra mauris dolor, vitae molestie mi accumsan nec. Ut nec sagittis nisl, fringilla viverra magna. Cras condimentum ultrices sollicitudin. Morbi tempor, massa ut iaculis posuere, arcu erat luctus massa, vitae pulvinar nulla ex nec nulla. Mauris vitae scelerisque ipsum. Nullam tincidunt consequat augue, quis aliquam nulla. Integer non arcu erat. Etiam scelerisque sodales vestibulum. Sed luctus arcu eu leo consectetur, at porta arcu elementum. + +Morbi in eleifend neque. Quisque a blandit libero, dignissim porta tortor. Sed nunc metus, aliquam a elit et, sagittis dictum arcu. Vestibulum lacinia nisi quis luctus ultricies. Fusce erat eros, euismod sit amet luctus vel, tempor a nunc. Aliquam nec nulla id est molestie tincidunt ac sit amet arcu. Donec molestie laoreet sapien, sit amet vulputate turpis facilisis at. Nullam eget nisi vel nibh elementum euismod non tempus leo. Nulla suscipit consectetur ante, nec fringilla lectus porta ac. Proin nec odio in lacus suscipit lacinia et sagittis ante. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed rhoncus lacinia porttitor. Pellentesque sapien ipsum, sagittis posuere arcu ut, laoreet gravida elit. Aenean eu tortor sit amet massa tincidunt facilisis. Aenean congue eget orci vitae vestibulum. + +Nunc tempus augue rhoncus condimentum vehicula. Sed in dui sit amet arcu varius pellentesque quis cursus nisl. Proin faucibus erat id egestas suscipit. Nam accumsan in tellus nec elementum. Phasellus nunc orci, mattis nec sollicitudin ultrices, feugiat eu lectus. Morbi ullamcorper rutrum sapien non rhoncus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque orci sapien, fringilla et dictum sit amet, tristique vel arcu. Maecenas tempus porttitor mattis. Cras eget faucibus enim. + +Mauris ornare mattis tortor. Duis convallis a ipsum id cursus. Aenean viverra, eros pellentesque ullamcorper posuere, orci ligula luctus odio, vel rutrum ex lectus eu erat. Etiam mollis nulla orci, fringilla gravida mauris viverra eu. Sed et orci non purus ultricies elementum. Cras at lectus hendrerit, fringilla lacus nec, feugiat sem. Morbi in metus felis. Etiam tempor bibendum ex eu venenatis. + +Cras ac nibh condimentum, lacinia sem ut, pretium felis. Sed congue, mi at accumsan semper, felis lorem vestibulum nisl, ac commodo lorem eros at mi. Curabitur condimentum nunc justo. Nulla efficitur venenatis nibh sed finibus. Integer iaculis volutpat mi dictum bibendum. Nullam tempus id ante euismod placerat. In placerat auctor lacus ac molestie. Aenean ultricies egestas imperdiet. + +Ut interdum cursus accumsan. Aliquam a mi ligula. Nunc blandit, metus in pellentesque aliquet, velit libero aliquam quam, nec egestas est turpis at ante. Quisque et magna eget massa gravida suscipit. Ut in lectus a massa eleifend sagittis rhoncus faucibus lectus. Maecenas sit amet elit vel tellus varius feugiat ac ut diam. Ut iaculis non ante in molestie. Integer pulvinar vulputate velit, ornare dignissim sapien laoreet ut. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Aliquam finibus tristique laoreet. Pellentesque et diam tincidunt orci hendrerit euismod. Phasellus viverra orci vitae interdum imperdiet. Phasellus gravida auctor nisi, vitae rhoncus est dignissim eget. Phasellus eu facilisis eros, vitae iaculis quam. In condimentum velit non iaculis porta. Proin ipsum ex, egestas nec molestie sit amet, vehicula sed ante. Proin eget eros at nibh sollicitudin luctus a id magna. Nam eget turpis finibus, tempor libero nec, auctor velit. Nunc neque magna, dictum vel semper nec, facilisis eu lectus. Maecenas maximus tortor eget ex dictum, sit amet lacinia quam tincidunt. Nulla ultrices, nunc ac porta feugiat, diam dolor aliquet sapien, sit amet dignissim purus ante in ipsum. Maecenas eget fringilla urna. Etiam posuere porttitor interdum. Vestibulum quam magna, finibus et urna auctor, pulvinar viverra mauris. Fusce sollicitudin ante erat. + +Maecenas pretium facilisis magna, at porttitor turpis egestas non. Morbi in suscipit felis. Duis eget vehicula velit, posuere sodales lorem. Curabitur elementum a lectus non ornare. Donec vel eros scelerisque ipsum iaculis accumsan. Phasellus tincidunt tincidunt lobortis. Vestibulum maximus risus tellus, eu faucibus urna tincidunt quis. Fusce dignissim lectus vel enim ultricies, in efficitur purus semper. Etiam sit amet velit pulvinar, hendrerit erat et, maximus eros. + +Maecenas iaculis convallis consectetur. Duis ante nulla, commodo sit amet diam sed, tempus mattis risus. Maecenas volutpat leo leo, in mollis eros mollis quis. Aenean sagittis, neque id mattis varius, tortor leo cursus ligula, a ultricies justo turpis ut libero. Ut sit amet nibh et erat pellentesque rhoncus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer rhoncus ligula nec iaculis faucibus. Curabitur tincidunt eu diam eget ultrices. + +Vestibulum quis nisl nec lacus commodo efficitur eu eleifend turpis. Etiam pretium id nisl a vehicula. Praesent elementum malesuada nisl. In condimentum interdum faucibus. In sed mauris vestibulum dui ultricies congue. Ut posuere mattis ante, in blandit mauris suscipit quis. Pellentesque ligula turpis, tincidunt a laoreet vel, consectetur in est. Nulla gravida ligula vel lectus faucibus accumsan. Praesent rhoncus eros arcu, id ultrices ipsum maximus ac. Mauris tincidunt cursus erat nec vulputate. Nulla tristique imperdiet eros vitae lobortis. Nullam a urna et sem condimentum blandit sed ut nulla. + +Maecenas auctor sodales facilisis. Pellentesque facilisis augue a odio varius suscipit. Etiam malesuada justo vel leo dignissim tincidunt. Sed magna metus, sagittis at diam gravida, dictum iaculis sem. Aliquam erat volutpat. Maecenas euismod egestas tortor non sollicitudin. Nulla quis odio tincidunt, auctor est sed, pretium turpis. Quisque aliquet semper magna, sit amet gravida enim luctus at. + +Nulla orci risus, ultrices a nunc et, dictum tincidunt lectus. Aliquam erat volutpat. Mauris at justo feugiat, efficitur lectus id, facilisis turpis. Sed ornare sodales fermentum. Suspendisse interdum tellus ac auctor sagittis. In auctor convallis metus non elementum. Mauris id dolor aliquam, euismod sapien id, tristique mi. Duis ac eleifend lectus. Etiam odio turpis, molestie vitae posuere vel, feugiat ac lorem. Fusce tempus ligula non hendrerit maximus. Nulla facilisi. Ut pretium turpis eget eros fringilla, vel aliquam mi pulvinar. + +Donec rhoncus augue ac viverra lacinia. Aliquam suscipit risus id sem varius, eget aliquet justo varius. Phasellus molestie, neque vitae semper posuere, est risus blandit ligula, id lacinia lectus orci id lectus. Cras vitae massa sit amet sapien pulvinar sollicitudin facilisis sed leo. Donec risus nulla, finibus id nulla quis, ornare sollicitudin neque. Curabitur id sapien vehicula, tempor velit sit amet, auctor augue. Nunc venenatis urna quis ante mollis bibendum. + +Pellentesque in varius massa. Donec non odio ultricies purus hendrerit fermentum. Aliquam quis elit vitae risus porttitor efficitur in vel sapien. Vestibulum sed urna sed lorem convallis bibendum nec non eros. Nullam molestie accumsan tincidunt. Aenean interdum sapien quis sapien dictum porttitor. Ut sit amet mollis magna, sed finibus urna. Etiam porta congue nunc eu aliquam. In congue mollis tincidunt. Nunc id metus ultricies, aliquam risus vel, sollicitudin dui. In nec felis consectetur, gravida dolor eu, consectetur lorem. Ut hendrerit, velit vitae malesuada placerat, felis metus vehicula odio, in iaculis ex tortor id metus. Donec mattis elit a est sollicitudin, in lacinia nisi gravida. Nullam ornare, tellus eget pharetra mollis, purus nisl condimentum sapien, vel ultricies enim libero ac ex. Fusce sed ligula a arcu lacinia tempor sit amet et magna. Maecenas fermentum nec diam in ornare. + +Cras pellentesque facilisis accumsan. Curabitur vehicula volutpat diam, vel tincidunt felis cursus sed. In malesuada leo et porta pulvinar. Integer at ultrices nunc, a tincidunt metus. Vivamus eu tellus vel lectus volutpat fringilla. Donec ut egestas est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non hendrerit turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam in ipsum quis ipsum hendrerit egestas. Donec vitae lectus malesuada, consequat enim et, lobortis velit. Vestibulum nec augue ex. Nullam ut porta lacus. Morbi pellentesque gravida purus, a interdum felis. Nulla lacus libero, euismod quis posuere in, congue pretium ipsum. Aliquam at suscipit nisi. + +Sed et venenatis purus, at maximus dolor. Fusce varius eget turpis ac sodales. Nullam sed mauris quis diam hendrerit dapibus consectetur eget dolor. Suspendisse maximus ac velit quis condimentum. Praesent ac mattis mauris. Morbi aliquet dignissim sem, sed mattis enim vestibulum vitae. Morbi sed dui in sapien elementum ullamcorper. Proin feugiat viverra ipsum et commodo. Nam pellentesque turpis nec condimentum aliquam. + +Praesent luctus elit sit amet est fermentum, nec egestas lectus scelerisque. Proin ornare mi eu turpis sodales, at vestibulum magna placerat. Suspendisse potenti. Nulla vel elit semper, blandit nunc vel, ullamcorper turpis. Morbi eu posuere sapien, ac iaculis tellus. Etiam tincidunt nunc vitae cursus faucibus. Phasellus rhoncus sollicitudin metus, id lobortis mi iaculis nec. Donec elementum venenatis purus at commodo. Aenean egestas facilisis metus, quis posuere nisi fringilla aliquam. Fusce ac porta nibh. Aliquam hendrerit lectus magna, at auctor felis viverra a. Integer elementum posuere nunc a fringilla. + +Nunc metus lectus, molestie nec tincidunt at, facilisis id enim. Aenean nulla quam, convallis non lectus vehicula, dignissim interdum velit. Ut vestibulum finibus mauris. Vivamus sed euismod elit, ut pulvinar dolor. Suspendisse dictum viverra pharetra. Curabitur non erat finibus orci sodales pulvinar. Sed at consectetur quam, ut commodo lacus. Suspendisse mollis convallis lorem, nec venenatis nunc lacinia a. Proin in est dui. Nunc nec lacus lectus. Aenean faucibus dui ornare magna varius fermentum. Aenean eu justo pulvinar libero rhoncus sollicitudin at et nunc. Integer sit amet mauris hendrerit, fringilla magna quis, tincidunt nunc. Fusce sit amet aliquam leo, pretium fermentum nisl. Vestibulum hendrerit tempus suscipit. + +Pellentesque et augue varius, aliquam justo vel, sagittis erat. Suspendisse tincidunt maximus velit, porttitor interdum ligula elementum vel. Nunc a dictum lectus, gravida tristique magna. Quisque id risus arcu. Vestibulum porta in mi sed finibus. Nam tristique in mauris nec gravida. Vivamus arcu sem, fringilla ac purus eget, vestibulum posuere arcu. Integer aliquet elit a est scelerisque pharetra vel sit amet augue. Sed quis finibus nunc, non ornare felis. Suspendisse potenti. Maecenas sollicitudin eros urna, vel bibendum mi sollicitudin facilisis. Nam elementum ligula non augue accumsan, ut laoreet tellus ultricies. Nunc in pellentesque quam. Proin eu varius lectus. Donec gravida massa non rhoncus dignissim. Sed est sapien, vestibulum ac egestas nec, posuere id metus. + +Phasellus quis interdum felis. Pellentesque ac elementum lacus. Proin posuere tempor ante, et consectetur nulla convallis ut. Etiam porta sem orci, eget convallis risus hendrerit in. Mauris gravida libero id tincidunt lacinia. Donec tempus ultrices ipsum, vitae finibus velit. Sed consectetur dictum velit, in consequat dolor fermentum eget. Pellentesque porttitor tellus velit, quis dignissim purus imperdiet et. Phasellus leo lectus, mollis nec ultricies ut, placerat ut quam. Integer imperdiet mauris sed magna gravida accumsan. Nulla congue turpis at urna tincidunt, at tempus urna condimentum. Praesent ac nibh lectus. Pellentesque id odio at purus tincidunt mollis nec id massa. Nulla eget venenatis erat, ornare lobortis nulla. Fusce rhoncus metus turpis, at mattis magna blandit sed. Aliquam sed mattis massa, ut bibendum nisl. + +Mauris commodo vulputate nulla at sodales. Vivamus sagittis viverra ex, in scelerisque dui commodo in. Maecenas eget ante euismod, tristique tortor at, placerat turpis. Fusce hendrerit, orci et hendrerit tristique, turpis tortor hendrerit elit, vel dictum eros nisl vitae enim. Nullam et lacus velit. Donec rutrum tortor risus, eu volutpat lorem placerat tempor. Etiam rhoncus lorem quis turpis gravida placerat. Nam at magna efficitur, interdum mauris vel, tristique odio. Phasellus augue nisl, fermentum luctus sapien non, rhoncus convallis dui. Aenean nibh tellus, congue ut nulla eu, luctus lacinia est. Sed vel augue tellus. Ut congue sit amet risus ut consequat. Vestibulum id magna sed augue condimentum porttitor. In nec leo ac justo condimentum dignissim. Nullam eu gravida ipsum. + +Proin iaculis imperdiet nisl. Vestibulum at lectus bibendum ipsum mattis viverra. Suspendisse facilisis non nulla non dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce scelerisque turpis ante, tincidunt laoreet risus pharetra in. Nam nisi est, hendrerit in tincidunt sit amet, accumsan placerat odio. Vivamus nec egestas ligula. Nam sit amet dignissim nulla, sit amet lobortis ex. + +Etiam ac tellus lectus. Cras egestas urna id ornare vestibulum. Donec ut magna id velit finibus sagittis eget at nibh. Pellentesque tempus tempor justo, sit amet rutrum massa convallis eu. Ut lacus quam, sollicitudin vel consectetur vel, cursus eu velit. Sed aliquam ex a est lacinia pretium. Sed volutpat dui at iaculis accumsan. Nam feugiat libero a ante consectetur, nec maximus metus venenatis. + +Fusce in nunc lorem. Aliquam vel tincidunt nisl. Duis sed laoreet dui. Nam eu dapibus lacus. Nulla odio lectus, ornare sit amet leo sed, laoreet tempus massa. Curabitur venenatis ipsum vel turpis lacinia, sed euismod diam commodo. Etiam ac turpis cursus, auctor lectus eu, sodales ex. Ut eget dolor aliquet mauris maximus volutpat vitae ut lorem. Sed vulputate arcu ex, a porttitor risus porttitor vel. Duis sed accumsan purus. + +Pellentesque nisi est, scelerisque eu magna in, venenatis dapibus elit. Morbi porttitor, lectus dapibus dapibus sodales, mauris eros tristique metus, vitae porta tellus quam eu arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam fringilla nibh sed fermentum vestibulum. Aliquam quis mollis elit. Etiam lobortis purus sed nunc pulvinar malesuada. Morbi varius mattis velit efficitur convallis. + +Pellentesque facilisis ante id metus porta, et tincidunt quam tristique. Proin non sem vel eros venenatis tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus sollicitudin non risus at mollis. Cras leo orci, tempus eget felis a, efficitur tincidunt massa. In quis augue tristique, condimentum nulla eget, vulputate sem. Sed purus neque, ultricies eu turpis facilisis, dignissim bibendum eros. Vivamus congue accumsan dui. Sed congue dolor ut nisl mattis laoreet eu eu purus. Mauris vehicula, quam vel feugiat imperdiet, libero nibh commodo mi, at ullamcorper nulla enim sed leo. In eget ante sit amet metus luctus vulputate non sed dolor. In sapien odio, egestas sit amet sapien quis, congue mattis ante. Quisque tempus ligula ut eleifend facilisis. Vivamus ornare suscipit laoreet. Nulla vitae placerat massa, interdum sollicitudin augue. + +Suspendisse potenti. Morbi sed scelerisque diam. Suspendisse vitae tortor arcu. Nullam a ligula condimentum, sollicitudin arcu et, fringilla elit. Vivamus dignissim gravida ornare. Etiam scelerisque ligula at est porta, in dignissim sem hendrerit. In ut mollis urna. Sed blandit purus at volutpat scelerisque. Nullam vel finibus odio. In eu neque eu ante pretium posuere. Nullam vitae accumsan neque. Nam nec elit dolor. Ut sit amet urna eros. Maecenas efficitur dui id tempor porta. Pellentesque et quam felis. + +Proin aliquet sem nec ipsum porta, eu tempus velit vestibulum. Nulla sed ligula sed metus sollicitudin porttitor. Fusce non posuere lacus. Phasellus luctus, eros quis rhoncus ultricies, arcu tellus rutrum tellus, eu vulputate orci ante vitae lorem. Maecenas porttitor mauris purus, ut eleifend metus sollicitudin sit amet. Curabitur ultricies erat id libero egestas, ut ullamcorper eros vehicula. Vestibulum lorem nibh, aliquam ut tincidunt elementum, tempor quis sem. Donec vehicula tempor eleifend. In hac habitasse platea dictumst. Nunc ut sem elementum, aliquam dolor sit amet, eleifend enim. In elementum viverra mi, eget pulvinar lorem fermentum non. Nam ac ligula vel dolor convallis pellentesque. In sed lectus sed arcu consequat finibus vel et ante. In iaculis id tellus in congue. Donec imperdiet lorem quis erat maximus, vitae molestie ex accumsan. Donec pharetra, orci ac rutrum pretium, nunc mauris vestibulum magna, sagittis consequat risus orci ut felis. + +Sed id metus eget odio suscipit efficitur id eget ligula. Phasellus massa metus, varius et metus quis, porta lobortis turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in augue semper, consequat nunc at, tristique eros. Nullam vitae consectetur neque. Duis dignissim urna metus, vitae condimentum erat eleifend ac. In pellentesque nunc sed convallis sagittis. Integer venenatis, felis a mollis tristique, diam neque laoreet orci, ac varius diam ligula pulvinar augue. Nullam dapibus libero id est sollicitudin, non efficitur dui sollicitudin. Mauris sem diam, feugiat non ante elementum, eleifend lobortis urna. Nullam pharetra tristique diam in aliquam. Donec finibus sit amet lectus non auctor. + +Ut nibh tortor, sagittis ut sem eget, ultricies auctor enim. Cras malesuada ligula velit, sit amet consequat mauris interdum eget. Curabitur fermentum tristique magna facilisis ultricies. Sed quis porta arcu. Ut in nunc id velit egestas consectetur. Nulla fermentum porta nisi, vitae dapibus risus consectetur faucibus. Mauris quis magna aliquam libero dictum porta. Mauris sed iaculis turpis, non auctor turpis. Sed eget lorem ex. Sed pulvinar, mi ut rhoncus dapibus, est lorem maximus orci, ac tempor justo erat vel purus. Proin euismod turpis eu ex blandit semper. Nulla suscipit molestie ex sed auctor. In facilisis nisi convallis nulla rutrum bibendum. In aliquet leo eget quam auctor, at eleifend felis commodo. + +Vivamus at elit scelerisque, tristique mi non, ornare nisl. Integer posuere orci diam, sit amet malesuada nisl vestibulum ut. Sed convallis urna id arcu luctus, faucibus interdum urna varius. In hac habitasse platea dictumst. Mauris laoreet mauris vel nisi ultrices facilisis. Suspendisse mattis purus eu dui lobortis bibendum. Fusce cursus risus tellus, non fermentum lectus tristique sed. Curabitur ullamcorper tincidunt tortor vel blandit. Quisque at ligula ut sapien convallis tincidunt eu vitae dolor. Etiam consectetur lacinia sollicitudin. Sed sagittis dolor vel nulla congue mollis. In ut felis gravida, luctus massa sed, venenatis ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc facilisis lobortis dapibus. + +In a velit nibh. Nam mollis nunc sed faucibus eleifend. Sed maximus malesuada ultrices. Donec mattis finibus nunc, eu viverra massa egestas non. Donec arcu velit, sagittis et tempor mollis, malesuada in mi. Duis rhoncus suscipit lorem ac lobortis. Vestibulum malesuada nibh at nulla ornare, at pulvinar magna tincidunt. Ut tellus risus, commodo vitae fringilla nec, semper quis nulla. Suspendisse euismod eros vel leo commodo, ac sollicitudin velit porta. Donec non dolor blandit, tempor magna eu, suscipit risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec libero nisl, auctor in rhoncus sed, viverra a arcu. Etiam diam ex, luctus non ultrices quis, viverra ut quam. Mauris lobortis suscipit quam, malesuada pretium nibh ultrices non. Suspendisse molestie, risus sit amet venenatis semper, justo justo tempor tortor, vel iaculis ligula dui sed erat. + +Donec odio ligula, aliquam id mollis eget, tincidunt nec arcu. Duis aliquam elementum facilisis. Vivamus lobortis fermentum egestas. Etiam ac orci sit amet dui dignissim condimentum. Maecenas magna arcu, mollis eget nisl a, vestibulum finibus lacus. Praesent et metus risus. Morbi semper neque vel erat fermentum, commodo posuere sem porta. Proin sit amet ipsum at lectus vestibulum luctus. Nullam convallis nulla ac pretium facilisis. Nunc porttitor convallis mi nec vestibulum. Phasellus vehicula vestibulum ornare. Curabitur commodo sapien quis vulputate egestas. Suspendisse potenti. Vestibulum quis mattis nisi. + +Maecenas mattis ex eget placerat aliquet. Pellentesque est nibh, ultrices eu laoreet in, interdum vitae nunc. Suspendisse sit amet metus hendrerit, fringilla quam at, mollis arcu. Nullam tempus metus volutpat felis fermentum, et accumsan nisl placerat. Maecenas pharetra feugiat eros sit amet consectetur. Donec vehicula tincidunt massa eu sagittis. Integer massa nisl, luctus quis nisi et, molestie cursus turpis. Aliquam congue ipsum eget turpis vehicula, commodo eleifend neque placerat. Nam vel consequat urna. In pellentesque lobortis tempus. Pellentesque pharetra, purus in pretium convallis, turpis orci maximus tortor, eu malesuada ex elit sit amet lorem. + +Curabitur sit amet aliquet quam, non aliquet tellus. Pellentesque nec ipsum dolor. Aliquam blandit gravida dolor vitae porta. Integer enim purus, scelerisque id molestie sed, accumsan vel nulla. Aenean vel ultricies urna. Nam consequat ipsum tempor mi placerat, id pretium dolor cursus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; + +Sed venenatis dui mauris, pellentesque varius magna malesuada blandit. Etiam sed tempor ipsum, id tincidunt nisl. Sed a felis mi. Nulla orci metus, auctor ac malesuada lobortis, facilisis vel nisl. Pellentesque at scelerisque est. Nulla vel mi ut magna commodo lobortis in ut diam. Etiam a lacus dui. Integer ut turpis arcu. In hac habitasse platea dictumst. Quisque porta neque at velit eleifend consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Nam pretium turpis a sem placerat, non mollis diam dictum. Sed at nulla purus. + +Sed auctor neque nec consectetur sollicitudin. Donec aliquam arcu id diam commodo posuere. Nulla nec accumsan ante, at fringilla ligula. Sed nisi libero, iaculis ut convallis nec, ultrices ac ex. Mauris aliquam mi nec ultricies porttitor. Mauris malesuada odio ut hendrerit tempus. Aliquam non aliquam dui. Nam mi mauris, volutpat in ligula vel, blandit iaculis lectus. + +Integer vel maximus massa, sit amet mollis nibh. Proin at aliquet sapien. Nullam a turpis id libero facilisis dignissim. Sed convallis nulla vitae turpis consectetur, eu pharetra libero posuere. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi venenatis massa id massa commodo suscipit. Cras magna lorem, porta eget velit at, vehicula semper velit. Maecenas cursus libero sit amet eleifend tempus. Suspendisse sed odio nisi. Suspendisse pulvinar felis semper magna hendrerit, ac posuere neque ullamcorper. Vivamus aliquam, elit id vulputate convallis, dolor lectus tempor nisi, id dapibus nulla eros in dui. Pellentesque ante libero, eleifend ac consequat vel, sodales in enim. Proin gravida sapien in nulla cursus, sagittis faucibus quam aliquam. Phasellus sit amet diam molestie, luctus urna eget, convallis elit. Nunc interdum erat fringilla, finibus neque quis, scelerisque justo. Donec interdum id risus at pharetra. + +Cras finibus magna turpis, sollicitudin viverra felis bibendum sagittis. Cras blandit facilisis euismod. Curabitur finibus enim gravida erat faucibus rhoncus. Aenean tempor elit vel sem ornare viverra. Ut at tortor nisl. Aenean in quam enim. Mauris pulvinar augue at nunc commodo, eget efficitur turpis laoreet. In vel fermentum nisi, eget porttitor diam. Mauris placerat eu ligula eu cursus. Curabitur ac tincidunt dolor, eu molestie est. Quisque ullamcorper vehicula faucibus. Phasellus euismod, arcu a scelerisque tempor, massa lectus ultricies velit, at mattis mauris mauris ultricies arcu. Proin condimentum ultrices nisl a rutrum. Proin bibendum sem quis accumsan fermentum. + +Integer sit amet velit sed urna rutrum molestie id non nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus ac ornare dolor. Quisque ante massa, tincidunt eget iaculis sit amet, dapibus vitae arcu. Fusce sagittis leo eu varius egestas. Nam a ex non tellus vestibulum consequat sit amet ac est. Donec mi purus, varius non finibus sit amet, maximus ut mauris. Etiam a sapien lacinia, faucibus massa non, tempus libero. Aliquam ac lorem id purus vehicula consectetur quis non metus. + +Nam id imperdiet nulla, eu luctus sem. Nunc non risus vel quam dapibus porta. Aliquam laoreet dictum tristique. Curabitur et varius leo. Nulla hendrerit sem at tellus sodales, in porta nisl cursus. In et tincidunt tellus, vel commodo nulla. Etiam mattis dolor vestibulum libero aliquet, eget accumsan mi iaculis. Aenean in lacus congue, iaculis ipsum eu, condimentum ligula. Cras lorem leo, eleifend eget risus at, efficitur malesuada turpis. + +Suspendisse potenti. Pellentesque laoreet neque quis molestie finibus. Mauris id sapien in dui efficitur feugiat ut efficitur justo. Mauris quis faucibus ante. Suspendisse interdum sodales purus, sed semper ante venenatis vel. Aliquam rutrum, magna ut faucibus molestie, tortor ante iaculis nisi, in sollicitudin tellus arcu nec ex. Donec eu accumsan orci. + +Integer elementum metus rhoncus hendrerit molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris efficitur ultricies orci eget vulputate. Etiam pharetra sem lacus, eu convallis lacus fringilla vitae. Nunc accumsan volutpat tincidunt. Nam non mauris pretium urna iaculis venenatis. Aenean tempor tortor a urna eleifend maximus. Donec ornare dui non ornare bibendum. Phasellus suscipit posuere lacus ac vestibulum. Pellentesque sit amet eleifend quam, fermentum pharetra diam. Vestibulum in porta sapien. Aenean in rhoncus dui. Quisque euismod, metus non luctus vulputate, sem diam maximus lorem, porttitor volutpat est justo sed sapien. Etiam maximus eros eu elit cursus elementum. + +Nunc ut aliquet dolor. Nam nunc nibh, consequat non mollis eget, dignissim a sapien. Aenean luctus suscipit massa id pharetra. Vestibulum eget velit vitae lectus porttitor blandit vitae eget odio. Pellentesque ullamcorper finibus massa at pretium. Nunc nec sapien at lacus vehicula dictum sed quis elit. In vitae sem urna. Sed porttitor sodales ante, ut varius justo blandit eu. + +Proin faucibus tempus velit, nec bibendum mauris bibendum vitae. Sed auctor, massa feugiat tristique iaculis, massa dolor accumsan eros, feugiat blandit odio diam ut purus. In at magna semper, mollis risus et, viverra lectus. Ut diam nibh, ultrices id tellus eget, venenatis auctor orci. Praesent eget semper orci. Proin vel nisl leo. Nulla sit amet mi quis eros feugiat rutrum sed vel dolor. Ut ullamcorper ultrices est vel tincidunt. Mauris a tortor nec nibh egestas interdum et quis lectus. Etiam vitae rhoncus tellus. Quisque facilisis odio at justo tempus consectetur. + +Duis vitae diam nec odio pulvinar eleifend. Suspendisse convallis lacus sit amet nunc elementum sodales. Integer commodo accumsan lacinia. Aliquam dapibus dolor dolor, a laoreet augue finibus et. Integer faucibus sapien ac interdum lobortis. Vestibulum blandit varius eleifend. Nunc id lobortis ipsum. Nunc porttitor et risus quis interdum. Integer ante lectus, cursus et urna tincidunt, fringilla varius arcu. In bibendum quis turpis efficitur laoreet. Etiam sollicitudin dictum diam, euismod luctus ante varius sed. Cras vel hendrerit risus. Morbi et leo fermentum, tincidunt ligula ultrices, tempus arcu. Quisque non arcu at mauris luctus tempus eu vitae erat. Morbi ut est ac orci vulputate tincidunt id ac lorem. + +Mauris et sodales tellus. Curabitur metus orci, fermentum sed est in, porttitor fermentum mauris. Aliquam mollis elit nulla, in varius lectus tempus eget. Sed lacinia tempus lacus, sed pulvinar nulla congue a. In a congue est, vitae egestas nisi. Aenean interdum, leo ac fermentum suscipit, sapien dui luctus diam, non iaculis massa felis id ligula. Sed euismod placerat nunc quis tempor. Sed eu leo luctus, pretium elit vitae, laoreet dolor. Mauris aliquet ac lectus malesuada sagittis. Suspendisse placerat tincidunt nisi, id semper urna consequat at. Suspendisse sollicitudin eu augue sit amet faucibus. Ut vitae justo sagittis, euismod tortor vitae, ullamcorper dolor. Suspendisse ultricies at enim ac congue. Curabitur auctor neque lectus, nec condimentum sem eleifend et. + +Nullam id sem in risus vulputate facilisis. Sed iaculis ante sit amet iaculis luctus. Suspendisse ut aliquet sapien, eget hendrerit nisi. Ut malesuada velit dui, a egestas odio dapibus a. Phasellus rutrum sit amet dui vulputate ultrices. Maecenas iaculis ex eu tortor lacinia, consequat maximus mi tempus. Vestibulum neque odio, accumsan eu ornare ut, elementum sed lacus. Nulla ipsum leo, consectetur in ullamcorper sit amet, volutpat sit amet nulla. + +Praesent tincidunt, justo et venenatis mattis, enim ex lobortis elit, ut tristique dui eros eu urna. Suspendisse sodales tellus quam, nec hendrerit sem mollis vel. Duis nunc nulla, mollis eu nisl et, sagittis volutpat sem. Fusce dolor turpis, dapibus quis sollicitudin in, semper vitae felis. Fusce id ante velit. Praesent ac ornare velit. Proin non erat quis neque accumsan iaculis. Donec faucibus orci at malesuada finibus. Nam venenatis tempus venenatis. + +Aenean vel risus ultricies, tempor augue id, pretium diam. Aenean at nunc orci. Cras sit amet tortor eget arcu efficitur vulputate. Phasellus sed quam diam. Proin enim felis, luctus nec orci a, porta blandit tellus. Nulla ac erat suscipit, sagittis enim rutrum, scelerisque mi. Nullam vestibulum luctus lectus at cursus. Morbi ut orci lorem. + +Sed est justo, placerat id rhoncus eget, finibus vitae lectus. Aliquam ultricies porta nulla, eget aliquet ligula placerat a. Nulla suscipit laoreet elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc a arcu id nisi tincidunt ultrices vitae pharetra nisl. Quisque facilisis at dui vel dignissim. Etiam imperdiet in libero non venenatis. Vivamus consectetur lectus non ultricies laoreet. Aenean vel laoreet lectus, et laoreet tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ex arcu, consequat eu diam non, tristique faucibus purus. Duis nisi elit, bibendum quis lacinia ac, fermentum a lorem. Suspendisse molestie nulla sed velit accumsan lobortis. Aliquam erat volutpat. In pharetra ultricies urna aliquet congue. + +Quisque ante metus, maximus et dui eget, sollicitudin accumsan risus. Ut malesuada neque et ex facilisis, sed egestas augue pellentesque. Suspendisse potenti. Nunc sapien libero, maximus vitae purus eu, lobortis sagittis diam. Aliquam ultricies vehicula lorem, sit amet vehicula dolor venenatis vitae. Phasellus consequat nisi ut quam tincidunt, eu bibendum nisi bibendum. Vivamus a interdum sapien. Vestibulum interdum pharetra molestie. Sed facilisis dui non velit malesuada, semper rhoncus sapien volutpat. Etiam arcu nisl, dignissim sit amet purus non, tempus finibus orci. Pellentesque viverra faucibus enim, eget dignissim justo accumsan ac. Quisque pellentesque orci nisl, in vestibulum massa auctor a. + +Pellentesque condimentum odio in turpis mattis, ac blandit dui commodo. Sed consectetur purus sit amet quam dapibus placerat nec ut orci. Maecenas mollis ex in mi commodo sodales. Sed est enim, consequat dapibus convallis quis, iaculis non dolor. Donec sagittis fermentum velit ut convallis. Nunc accumsan mi vel enim consequat commodo. Nunc varius id massa nec consequat. Donec purus sem, pellentesque gravida mollis ac, convallis a tellus. Praesent convallis massa lacus, eget pellentesque neque sodales nec. Sed ut velit diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Suspendisse lacus erat, mattis eu tellus sit amet, vehicula bibendum mi. Nam aliquam, nisi dapibus condimentum congue, ante mauris bibendum turpis, a consequat risus arcu eget felis. Aenean dictum, nisi in facilisis sollicitudin, felis diam convallis magna, eu pulvinar nisl odio quis massa. Suspendisse imperdiet tincidunt tortor, sit amet dignissim augue eleifend a. Vivamus consequat mauris vel tellus ullamcorper, in mattis ex auctor. + +Donec eros nunc, maximus non faucibus id, malesuada nec dui. Mauris rutrum accumsan nisi, volutpat tristique justo vulputate posuere. Vestibulum iaculis neque ut sapien sagittis, et volutpat erat finibus. Maecenas volutpat varius orci, ac lobortis justo fermentum vel. Ut nec tortor non erat sagittis dignissim at sed nunc. Sed porttitor dapibus velit a pretium. Proin id placerat magna, fringilla volutpat diam. Cras non ipsum non est porttitor fringilla eget sit amet turpis. Vestibulum vel pharetra nulla. Praesent ultricies mi urna, eget aliquam augue feugiat eu. Aenean efficitur ex ut luctus facilisis. Fusce leo odio, suscipit eget est eget, pretium posuere mauris. Fusce vulputate est sed felis mattis, at sollicitudin magna consequat. Aliquam erat volutpat. Mauris tincidunt tristique diam id tincidunt. Aenean sagittis dictum risus. + +Nunc vehicula mattis justo at placerat. Duis ultrices metus urna, et mollis erat blandit non. Pellentesque tincidunt vitae mi eget placerat. Nullam at condimentum arcu. Vestibulum sit amet orci et metus fringilla pretium ac ut magna. Suspendisse vitae accumsan orci. Donec convallis nunc odio, tincidunt volutpat tellus placerat ac. Phasellus sed bibendum eros, a auctor quam. + +Etiam sagittis accumsan sem ut interdum. Nullam eleifend eget felis in convallis. Donec sagittis enim interdum, suscipit metus ut, cursus orci. Integer vitae dapibus enim. Integer venenatis ligula ut lacus pretium, a pharetra massa posuere. Vivamus eu volutpat ipsum. Mauris tempus volutpat aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ac odio bibendum, dictum neque sed, sollicitudin nulla. + +Quisque vulputate at ligula ut placerat. Morbi mollis ante id felis tempus consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas eleifend odio a lectus sagittis, nec tristique ante egestas. Ut tempor, libero vel mattis interdum, risus quam condimentum turpis, nec viverra massa arcu ut turpis. Duis pharetra vehicula ligula, rhoncus commodo elit rutrum non. Nullam leo nisi, semper quis risus et, faucibus viverra odio. + +Quisque luctus nec arcu ut aliquam. Phasellus commodo ligula ut aliquet accumsan. Cras ac erat ac purus varius convallis. Vivamus nec gravida ipsum. Fusce euismod, massa ut cursus laoreet, eros urna semper odio, sed cursus turpis massa non lectus. Proin ac nisl lobortis, placerat elit in, placerat turpis. Nulla sollicitudin dolor ut sagittis consequat. Aenean augue felis, condimentum nec fermentum at, condimentum non nulla. Quisque et dignissim sapien, ac tincidunt elit. Nunc aliquet lacus id quam placerat suscipit. Mauris rutrum facilisis ipsum, at tristique mi. Sed iaculis eros sem, ut eleifend arcu hendrerit et. Sed euismod dignissim diam interdum ultrices. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed lobortis massa vel ultricies feugiat. Aenean non lobortis erat. + +Aenean commodo euismod massa vitae accumsan. Vivamus ac tristique mauris. Nunc hendrerit sapien a dictum scelerisque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque sit amet eleifend nulla, vel posuere lorem. Phasellus eu porta metus. Pellentesque eget sollicitudin dui, sed commodo magna. Integer tincidunt, diam vitae dapibus tincidunt, diam lorem rutrum erat, ut consequat ex metus sed leo. + +Suspendisse odio metus, suscipit at congue at, consectetur auctor justo. Integer vel rutrum lacus. Quisque a ullamcorper ligula, nec placerat arcu. Ut hendrerit orci sit amet leo pellentesque iaculis. Integer neque erat, dapibus vel pharetra ut, sagittis id diam. Duis eget ex felis. Donec eget odio in sem hendrerit varius. Sed malesuada euismod erat. Sed bibendum malesuada lacus at euismod. Ut ornare pretium imperdiet. Maecenas ut orci id massa lobortis pulvinar vitae et neque. Nullam iaculis dictum sagittis. Vivamus vel finibus libero, eget congue ligula. Etiam faucibus orci felis, eu accumsan enim sollicitudin at. Donec accumsan libero at pharetra malesuada. + +Nullam luctus, metus eu varius dignissim, lectus neque aliquet massa, nec pellentesque ligula ligula vel leo. Cras rutrum eleifend viverra. Sed lobortis eget erat tincidunt imperdiet. Nullam ac fringilla urna. Fusce pretium, lorem ac mollis semper, sem felis ornare odio, eget feugiat dolor orci ut dui. Curabitur ac odio mollis, convallis ex eget, hendrerit nulla. Nunc vel turpis nisl. Ut neque urna, fermentum interdum est non, lobortis luctus elit. Phasellus bibendum malesuada gravida. Phasellus lacinia scelerisque erat sit amet iaculis. Nulla in ultricies lectus. + +Praesent blandit ante congue urna eleifend porta. Nulla sagittis urna quis molestie viverra. Praesent in lorem porttitor, vestibulum orci hendrerit, faucibus enim. Donec sapien enim, porta at sapien eget, condimentum mattis dui. Aliquam rhoncus dui elit, non laoreet ex condimentum ut. Nam arcu sem, suscipit quis diam vel, pharetra bibendum ligula. Duis vel ipsum gravida libero iaculis feugiat. Aliquam congue augue mi, gravida dignissim ipsum commodo id. + +Suspendisse vel tincidunt odio. Donec quis hendrerit felis, sed sagittis mi. Cras ultricies justo et ligula dignissim, ac porta nisi maximus. Suspendisse vitae facilisis sapien, ut consequat lacus. Morbi dapibus in diam in tempus. Curabitur viverra leo libero, et molestie lacus interdum eu. Donec ut odio sit amet nisl viverra fermentum eget eget sem. Donec id ante consectetur, porta velit a, consectetur mauris. Donec imperdiet dolor turpis, at maximus purus volutpat ac. Ut hendrerit eros sit amet mi porttitor, nec ultrices purus posuere. Etiam elementum mauris ligula, nec viverra neque luctus quis. + +Donec ultrices lectus nec sollicitudin egestas. Mauris ac lacinia mauris. Proin accumsan leo et quam venenatis mattis. Pellentesque laoreet interdum feugiat. Phasellus arcu justo, blandit vel faucibus vel, maximus in sapien. Mauris semper, leo quis accumsan tristique, arcu massa tempus sapien, nec luctus turpis mi id enim. Donec egestas consectetur augue non viverra. Mauris pellentesque turpis non ante posuere, bibendum laoreet nunc semper. Aliquam accumsan semper nulla, sed tincidunt nulla pretium id. Mauris ut sapien vel felis pharetra congue. Curabitur ac euismod risus. + +Integer a lectus lorem. Phasellus a sodales odio. In consectetur bibendum ex eu blandit. Nam eu feugiat sapien, id efficitur orci. Quisque fermentum sem eget orci mattis tristique. Donec sit amet pharetra massa. Pellentesque molestie, neque a viverra dignissim, magna quam sagittis ligula, at tincidunt tellus risus quis enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent scelerisque faucibus nunc eget consequat. Fusce aliquet egestas eros quis auctor. + +Sed aliquam mauris non lacus rhoncus, id eleifend nunc ullamcorper. Nulla cursus erat non purus gravida, porta ultricies libero vestibulum. Nulla sagittis metus eleifend porttitor molestie. Suspendisse rutrum consequat ullamcorper. Ut pellentesque dolor eget gravida cursus. In posuere, ipsum nec pulvinar varius, massa odio aliquam mauris, vitae facilisis ligula orci quis augue. Pellentesque a tortor ultricies, ullamcorper libero ut, ullamcorper augue. Nullam id felis non dui viverra placerat id eu metus. Aenean ac dui condimentum, dapibus tellus non, blandit ex. Maecenas et odio vitae massa gravida consequat eu sed nunc. Nullam laoreet, nisi sed imperdiet laoreet, sapien nisl aliquam augue, vitae ornare velit ligula id neque. Ut tincidunt, lacus at porta ultricies, tellus felis fringilla dolor, tempus posuere nibh nisi eu felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; + +Proin ac nulla turpis. Aenean pretium congue viverra. Donec vitae sem venenatis, luctus lacus non, rhoncus purus. Etiam sit amet lorem consequat, mollis nibh quis, congue neque. Sed vulputate justo quis porttitor malesuada. Nullam id ex sit amet ante aliquet tincidunt. Praesent pretium maximus orci ut cursus. + +Mauris vitae aliquam magna. Sed quis ante cursus, dapibus risus vel, tristique nisi. Fusce suscipit porta quam, vel vestibulum ligula dapibus vel. Nunc consequat eu mi at aliquam. Donec sit amet dolor nulla. Praesent gravida tellus enim, in porttitor sem scelerisque vitae. Nullam consequat, nunc eu iaculis tempor, sem augue placerat ex, sed ultrices erat nisi a tellus. Nunc tortor nisl, feugiat lobortis rutrum ut, pharetra ac nulla. Donec eu tortor eros. Proin maximus nisl sit amet velit accumsan facilisis. Praesent posuere tristique faucibus. Vivamus nec hendrerit tellus, id vulputate eros. Aliquam a lacus efficitur, consectetur ipsum eu, ullamcorper ex. Aliquam erat volutpat. + +Vivamus ultrices scelerisque elit, ac ultrices erat consequat id. Sed ac aliquet nulla. Pellentesque vel justo magna. Suspendisse dictum, sem eget ullamcorper iaculis, sapien metus tristique mauris, et dictum elit eros sit amet ex. Mauris placerat odio eu ligula egestas sagittis. Integer vel turpis lacinia tortor molestie egestas et id dui. Donec porta interdum justo, ac ornare lacus dictum at. Quisque mollis, odio sed eleifend rhoncus, purus turpis fringilla quam, ac fermentum enim ante sed massa. + +Vestibulum neque ipsum, congue vel lacus et, faucibus mattis sem. Ut venenatis, tortor non tincidunt mollis, sapien leo suscipit dolor, posuere tristique libero massa eu augue. Donec eu luctus velit. Nulla egestas, tellus sed commodo gravida, metus nibh placerat sem, nec mollis nulla nunc id lorem. Nulla facilisi. Donec ut tincidunt sapien. Quisque dapibus convallis interdum. Nulla tempor malesuada turpis non vehicula. In nec tortor ultrices, vestibulum odio non, ultrices sapien. Pellentesque mattis feugiat arcu, id tincidunt leo malesuada at. Fusce vitae pretium ante. Pellentesque eu augue non lectus efficitur rutrum. Cras vitae nisl elementum, congue est eget, faucibus quam. Donec in dapibus metus. + +In imperdiet metus eget leo rhoncus, et pharetra dui laoreet. Morbi arcu augue, eleifend a est eget, gravida suscipit risus. Ut sodales ex vel eleifend bibendum. Nam varius nisl sit amet dolor porta pulvinar. Ut mollis purus sit amet tempus vulputate. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur a lacinia velit, in feugiat elit. Sed ut vestibulum lorem. Proin fermentum elit quis venenatis placerat. Cras sit amet congue tortor. Curabitur eget sapien massa. Suspendisse in turpis arcu. + +Quisque vitae risus scelerisque, rutrum tellus et, posuere massa. Vestibulum vitae rhoncus libero, vel ultrices elit. Vivamus nec ipsum ac urna tristique sollicitudin non nec tellus. Donec bibendum dui eget ipsum laoreet, sed tincidunt tellus laoreet. Proin in rhoncus nibh. Integer vel quam id felis interdum aliquet. Nulla tempus volutpat consequat. Suspendisse nec massa malesuada, finibus est non, eleifend odio. Aliquam libero turpis, consequat vel pellentesque vitae, laoreet vitae tellus. Donec finibus diam id accumsan luctus. + +Cras at lorem ligula. Praesent tincidunt justo eu purus suscipit ornare. Morbi malesuada dui non ligula congue, ac fringilla diam commodo. Proin vel arcu non tortor tempus lacinia eget ut arcu. Sed tristique lorem et purus tristique, nec ultrices tortor lacinia. Nunc id nibh id mauris volutpat rutrum at in nisl. Cras in cursus lectus, nec fermentum dolor. Morbi at tempus tortor. Aenean pulvinar ex erat, vitae aliquet nisl finibus at. Praesent pellentesque tempor imperdiet. Aliquam eu aliquet purus. Maecenas hendrerit volutpat ultrices. Aliquam metus tellus, porttitor sit amet sem ut, bibendum ultricies urna. + +Cras accumsan lacus ac ullamcorper tincidunt. Fusce imperdiet nunc vel diam condimentum, viverra dignissim magna mollis. Aliquam rutrum gravida libero non congue. Morbi pretium, nulla ac eleifend sodales, dolor orci feugiat ipsum, ut posuere dolor augue quis mauris. Cras tincidunt enim dui, at porta orci consectetur vel. In id purus ante. Donec luctus mattis dictum. Curabitur tortor orci, accumsan finibus sodales ac, maximus eget purus. Suspendisse efficitur vitae dui ut faucibus. Integer bibendum ipsum massa, sagittis posuere sapien elementum at. Vivamus tristique at quam id congue. Maecenas eu augue vel erat varius congue at id quam. + +Sed tristique nisl elit, finibus venenatis urna facilisis id. Integer cursus interdum justo, et viverra diam interdum quis. Sed in vestibulum arcu. Pellentesque elementum ex vitae diam tincidunt bibendum. Nunc eu mi suscipit, faucibus metus sit amet, tincidunt dolor. Integer vulputate sodales luctus. In ut scelerisque sem, sed egestas eros. Etiam lobortis diam ac augue pulvinar, eu aliquam massa blandit. + +In dui magna, faucibus at purus in, sagittis dapibus diam. Cras commodo massa tortor, eu consequat libero placerat eu. Ut mauris metus, facilisis et erat sed, rhoncus maximus nisl. Sed ac aliquet nisi. Aenean in rhoncus velit. Sed mollis, nunc vitae imperdiet pharetra, arcu ex pulvinar nibh, ac rhoncus lectus enim nec erat. Donec rutrum molestie nibh et lobortis. Proin nec nibh in ex pretium ultrices non et arcu. Nam consequat tempor viverra. Fusce vitae pharetra diam, ac bibendum ex. Quisque cursus, tellus ac interdum accumsan, lectus nunc lobortis elit, id varius orci diam a metus. Etiam at mauris vitae metus ullamcorper bibendum nec sed leo. Pellentesque eu arcu varius, imperdiet ligula non, maximus tellus. Aliquam erat volutpat. + +Curabitur fringilla ligula in consectetur varius. Donec eget tortor ex. Nunc quis lacus lobortis, vulputate lorem eu, scelerisque sapien. Aliquam non pretium ante. Aenean maximus ornare eros, ut condimentum nibh pulvinar eu. Morbi venenatis sollicitudin justo, non tincidunt ligula lacinia vitae. Nam vitae quam ligula. Fusce in finibus urna, a laoreet dui. Quisque urna arcu, aliquam sed dolor quis, pellentesque convallis risus. Vestibulum faucibus maximus justo, eget gravida elit tincidunt quis. Cras in arcu dui. Aliquam eu nibh gravida, lacinia ipsum sit amet, scelerisque nisl. Integer luctus sagittis mattis. Etiam dolor sapien, dapibus at neque nec, rhoncus scelerisque odio. Pellentesque laoreet justo ac augue eleifend placerat. In vitae hendrerit ex. + +Nam sit amet dui in libero volutpat lacinia. Quisque vel luctus purus. Aenean arcu magna, luctus sed interdum vitae, elementum quis eros. Mauris aliquet diam mi, ut tincidunt magna consequat quis. Cras vitae lacus posuere urna pretium lacinia. Fusce ultricies maximus hendrerit. Donec et augue quis lectus lacinia accumsan. Nunc tortor neque, vestibulum porta bibendum id, varius quis sapien. Vestibulum et ultricies odio, id pharetra lacus. Suspendisse sollicitudin nisl nec justo fermentum, vitae volutpat lectus aliquam. Duis blandit quam at erat sodales, ut suscipit erat aliquet. Fusce faucibus dui enim, eu varius neque imperdiet id. Vestibulum dapibus neque libero, vitae viverra erat mattis id. Quisque ullamcorper diam ut porta finibus. Donec faucibus, diam quis pellentesque euismod, enim velit mattis justo, at ultricies urna enim ac leo. + +Fusce fringilla dolor sit amet ante pharetra ornare. Aliquam erat volutpat. Donec laoreet, lorem nec pulvinar ullamcorper, urna justo bibendum nunc, in laoreet nisl tortor vel justo. Donec a magna molestie, gravida tortor a, malesuada tortor. Praesent vestibulum ultricies metus, vitae fringilla tellus viverra sed. Suspendisse sed odio sit amet nibh ultricies interdum accumsan egestas ex. Fusce ac lacus arcu. Ut ultricies at justo elementum mattis. Nullam augue tortor, lacinia tempor turpis a, porta finibus neque. Donec id diam tristique arcu vestibulum fermentum vitae id tellus. Vestibulum sit amet ligula neque. Aliquam neque ante, ultricies nec diam malesuada, feugiat consequat risus. Pellentesque ac varius orci. + +Etiam nunc ex, laoreet eget eros ut, ultricies fermentum sem. Nullam venenatis diam a lectus vulputate luctus. Integer laoreet libero et tellus fermentum, ut maximus neque tristique. Ut in odio posuere, lobortis augue non, tristique orci. Quisque vel ultricies mauris, non consectetur enim. Sed dictum vitae felis vel scelerisque. Vestibulum id viverra leo. Etiam libero neque, cursus eu augue eget, fringilla luctus arcu. Donec aliquet maximus ipsum, ut faucibus velit posuere non. Praesent finibus erat nec massa cursus, ac blandit ante bibendum. Ut vel magna pretium, interdum quam non, sodales erat. + +Sed et orci nunc. Vestibulum elit sem, dapibus id dictum eu, interdum sit amet justo. Morbi interdum hendrerit tempus. Quisque id magna justo. Donec sollicitudin, nunc a efficitur hendrerit, mi neque semper nisl, sed consectetur urna justo vel velit. Nullam at sodales eros. Donec eu nunc vel dui tristique blandit ut eget enim. + +Nulla velit neque, euismod vitae lectus vel, finibus egestas magna. Ut sed justo sed erat pretium sollicitudin nec nec felis. In mattis augue ut erat mollis, in posuere purus tincidunt. Vivamus rhoncus sem at purus gravida, et vestibulum justo elementum. Aenean sit amet elit ac ligula tincidunt varius. Donec feugiat, orci vel interdum lobortis, elit magna fringilla nulla, non euismod urna dolor auctor est. Mauris laoreet sagittis ligula, et semper nisi finibus et. Donec pharetra nibh in eros iaculis aliquam. Nam malesuada ornare elit, ac semper massa molestie sed. Maecenas laoreet diam eu ipsum rutrum, ut varius enim bibendum. Donec luctus dolor eu ipsum varius, malesuada condimentum sapien tempor. + +Aenean vel rhoncus lacus, sit amet faucibus nisl. Aliquam laoreet nisl et diam eleifend molestie non vel lectus. Duis tortor augue, congue luctus malesuada sit amet, posuere mattis mauris. Aliquam quis ligula ut ipsum placerat luctus. Aliquam accumsan mauris ligula. Sed quis lacinia augue. Proin feugiat diam lectus, vel elementum libero varius non. Proin porta neque sed dolor gravida venenatis. Donec vitae euismod nibh. Morbi mattis, enim quis mattis dignissim, lacus tellus tristique nisl, in luctus leo nisl vel elit. Sed posuere justo in iaculis mattis. + +Curabitur in felis et metus blandit auctor ac in nulla. Vestibulum dictum nulla posuere augue ultrices, non gravida velit placerat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In malesuada pharetra ante sit amet sodales. Suspendisse et tincidunt lorem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer viverra justo ut nisi elementum dictum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam dictum tincidunt venenatis. Aliquam neque urna, pellentesque vitae ultrices eget, lobortis sed augue. Etiam at ex ultricies, egestas dui sit amet, laoreet lorem. Ut nulla velit, bibendum in arcu sed, dignissim mattis odio. Suspendisse varius dictum vulputate. Sed nisl tellus, eleifend quis augue ac, malesuada elementum arcu. + +Morbi dignissim laoreet imperdiet. Vivamus tincidunt turpis quis posuere mattis. Nam mollis, elit eget lacinia auctor, lorem magna mattis elit, eget pulvinar mauris quam sed turpis. Suspendisse nibh libero, volutpat nec metus tempus, euismod lobortis sapien. Pellentesque interdum urna a leo dignissim lobortis. Suspendisse quis diam pretium, vehicula augue eget, sodales nibh. Cras dignissim lorem ac velit mollis, ac hendrerit urna varius. Fusce venenatis elit ut mauris volutpat, sed imperdiet arcu pellentesque. + +Phasellus auctor nec ex eu tempor. Quisque ut elit eget ligula euismod pretium. Quisque ac lectus et est fringilla convallis. Mauris tincidunt turpis non ullamcorper suscipit. Suspendisse consectetur lacus at lacinia iaculis. Morbi purus metus, tincidunt ac ultricies a, rhoncus varius magna. Suspendisse mattis vehicula enim at ultrices. Phasellus eu ipsum nisi. Duis dignissim massa non convallis rutrum. Sed placerat consectetur ex, quis malesuada lectus cursus a. Nulla non mi egestas, scelerisque urna vitae, pulvinar libero. Vestibulum pretium purus at odio pharetra, ut egestas nibh pretium. + +Nulla facilisi. Duis in augue eu elit accumsan imperdiet a a odio. Curabitur vitae ante in velit condimentum venenatis id vitae mi. Sed in ante fringilla, mollis metus vel, consectetur nisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non dolor congue neque dapibus varius. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam sit amet convallis velit. Praesent a efficitur massa, non finibus ex. Maecenas pharetra elit eget sem rhoncus, vel mollis eros pretium. Donec vehicula dolor a nulla ornare, at lacinia ex venenatis. + +Suspendisse aliquam blandit est, rutrum luctus turpis cursus vitae. Pellentesque in magna eget risus egestas rhoncus. Maecenas sed odio non ex interdum eleifend mollis convallis neque. Quisque a orci fringilla, maximus arcu id, rhoncus magna. Aenean at aliquam est. Aenean faucibus consequat tempus. Aliquam congue viverra ante, non aliquet sapien viverra ac. Etiam ullamcorper neque in metus malesuada suscipit. Curabitur quis placerat mi. + +Integer at mauris ut lacus vulputate mattis sit amet at purus. Proin arcu nisl, lacinia eu venenatis ac, mattis ut velit. Suspendisse elementum mattis mauris, in faucibus lorem. Suspendisse bibendum nulla in commodo ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus iaculis volutpat mattis. Pellentesque ut ex interdum, consequat diam egestas, blandit nisi. + +Nullam odio turpis, pretium ac ante porttitor, fringilla lacinia ante. Fusce commodo quam vel dui blandit, nec eleifend tellus aliquam. Fusce sodales efficitur urna, vitae vehicula erat lacinia eu. Praesent maximus nunc id sapien feugiat, in euismod nibh rutrum. Vivamus at volutpat libero. Praesent quis mattis mi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In hac habitasse platea dictumst. Integer quam odio, pharetra nec molestie porttitor, auctor at ligula. Fusce id turpis non tellus facilisis tincidunt. + +Morbi lorem risus, sagittis sit amet venenatis sit amet, lacinia at dui. Vestibulum volutpat, urna ac ultrices efficitur, tortor augue convallis dolor, nec commodo arcu arcu id ante. Quisque facilisis mauris in molestie tincidunt. Fusce aliquet sagittis interdum. Vivamus sit amet odio nec augue volutpat placerat non nec nibh. Nunc auctor purus eu dignissim euismod. Ut sollicitudin urna et erat placerat, vel accumsan lectus malesuada. Proin fringilla magna sit amet massa dignissim lobortis ut ac felis. Donec ornare dignissim tristique. Phasellus semper, est sit amet vestibulum suscipit, arcu est elementum nulla, in sagittis sapien ligula a sem. + +Morbi at justo molestie, gravida lacus quis, placerat est. Mauris non libero ultricies, convallis dui et, scelerisque est. Nunc iaculis, libero sed ullamcorper feugiat, eros ante lacinia ex, vel efficitur velit arcu eu metus. Quisque fermentum blandit fermentum. Vestibulum quis ante in dolor porta efficitur eu nec libero. Mauris vitae ex mattis mi fringilla pharetra. Donec eget est nec lorem pretium pretium. Fusce eget risus eros. Vivamus eu nulla et libero tincidunt malesuada at ac dolor. Donec facilisis tempus sem, in posuere orci sagittis vel. Donec pellentesque sapien mi, eu tempus enim tempor vel. Cras consequat purus sed ornare vehicula. Nunc molestie eu ex et fermentum. In vestibulum, arcu nec cursus efficitur, leo ex fringilla neque, in molestie nisl diam mattis sapien. Nunc et semper ante. + +Sed pellentesque laoreet sollicitudin. Ut sed ex eu sapien bibendum posuere. Mauris non sem dui. Fusce sit amet nulla a tortor blandit blandit. Proin venenatis ligula quis sapien viverra accumsan. Proin ac turpis a dolor rhoncus facilisis eget vel ipsum. In gravida porttitor quam, quis dignissim lacus laoreet porta. Nulla ante risus, luctus at pharetra vitae, vehicula id elit. Etiam sagittis dui vitae metus mollis, in porttitor elit fringilla. Duis dapibus dignissim faucibus. Duis elementum facilisis leo eget ornare. Cras feugiat libero at efficitur tempus. Suspendisse sit amet laoreet nunc, at faucibus tellus. Vestibulum in ipsum ac risus vehicula porta. Fusce maximus libero mattis risus aliquam condimentum. Fusce ut consectetur risus, a fermentum arcu. + +Curabitur hendrerit eu lacus non congue. Fusce ac dictum magna. Nulla elit ante, sodales sed lobortis sodales, fermentum vitae urna. Cras pharetra vel sapien dignissim ullamcorper. Phasellus auctor elementum suscipit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lacus odio, venenatis lobortis ullamcorper et, tempor nec augue. + +Mauris scelerisque vestibulum metus, vitae porta sem pharetra nec. Nam tempus dolor sed turpis lobortis sodales. Vestibulum nec mauris auctor velit pellentesque vestibulum tristique vel eros. Vivamus vel justo vel dui lobortis dapibus a at sapien. Maecenas ac metus nec tortor vulputate laoreet in nec augue. Aliquam tellus leo, imperdiet non dapibus a, facilisis non tellus. Suspendisse condimentum tincidunt lacus, ut scelerisque diam viverra nec. Etiam ante mauris, viverra sit amet vulputate ut, porta a ligula. Donec sit amet luctus massa. Morbi iaculis, tortor sit amet ullamcorper iaculis, mauris augue feugiat risus, eu bibendum dui tellus nec purus. In gravida sodales egestas. Sed tincidunt pellentesque tincidunt. In non neque non erat mattis iaculis. Cras et ipsum justo. Phasellus ex elit, dictum ut nulla et, consectetur auctor lectus. + +Donec vitae velit nisi. Cras lobortis a nisi eu molestie. Nunc mattis arcu id neque aliquam, quis sollicitudin lectus lobortis. Donec nec convallis purus, eget sagittis sapien. Maecenas viverra ullamcorper quam in vehicula. Pellentesque imperdiet nisl in elit varius, eu fringilla orci ullamcorper. Donec blandit ultrices volutpat. Nulla nec tempor mi, ac finibus nisl. Phasellus et urna non lorem tincidunt pulvinar nec nec ligula. Ut hendrerit volutpat diam. Morbi vel sollicitudin libero, ac molestie purus. Nulla sit amet metus ut leo molestie faucibus. Nunc porttitor, est in pulvinar vestibulum, justo nibh placerat ipsum, at interdum metus mi vitae dui. Curabitur in egestas nunc. Ut malesuada ipsum sed velit rutrum accumsan ac in quam. + +Quisque ex est, fermentum vitae placerat sit amet, porta ac nulla. Morbi accumsan tellus quis dolor cursus, in elementum sapien condimentum. In non dui ultrices, sagittis dui quis, blandit nunc. Curabitur blandit justo sed tincidunt imperdiet. Sed a odio aliquet, gravida augue non, faucibus magna. Phasellus pulvinar volutpat sem, ut bibendum nibh semper eu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur at tellus in nulla vulputate feugiat vitae id dui. Suspendisse nec velit ac arcu fringilla venenatis. Duis urna massa, eleifend sit amet venenatis in, lobortis ac odio. Aliquam blandit vitae ipsum quis tempor. Curabitur a interdum sapien, vitae tempus arcu. Maecenas condimentum, justo vel rhoncus facilisis, lectus nisl commodo massa, eget maximus odio enim sit amet libero. Morbi at erat purus. Aenean dictum diam ut lorem venenatis consectetur. Praesent sit amet dolor eget lectus mollis tempus ac sit amet diam. + +Maecenas at convallis magna, nec iaculis metus. Quisque pulvinar ultricies vehicula. Aliquam quis tortor in elit semper tincidunt. Nullam aliquet ex dapibus lorem mattis gravida. Suspendisse volutpat, nibh sit amet efficitur egestas, lorem justo convallis enim, nec efficitur nunc mauris vel nisl. Sed condimentum ac justo sit amet accumsan. Suspendisse ultricies dolor nulla, at euismod nisl semper eu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. + +Donec hendrerit, ex non tincidunt molestie, lacus mauris euismod risus, vitae suscipit sem orci et risus. Donec sollicitudin eros non ante gravida aliquam. Etiam at augue risus. Mauris vitae ante ac eros sodales ornare non in enim. Fusce consequat tortor urna. Aenean condimentum neque quis viverra interdum. Aliquam ultricies convallis ipsum, nec lacinia massa bibendum nec. Suspendisse ac ultricies diam, sit amet mollis mi. Mauris at tincidunt elit. Morbi fringilla nisl ligula, nec scelerisque magna viverra non. Aliquam aliquam porttitor eros, cursus congue eros maximus vel. + +Pellentesque mattis sapien eu scelerisque feugiat. In hendrerit rutrum sem vel convallis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed varius velit et erat lacinia ornare ut sed nibh. Nam imperdiet hendrerit urna, ultricies dapibus elit blandit sit amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam porttitor, purus scelerisque ornare aliquam, massa nulla semper erat, sit amet cursus diam risus vitae mauris. Ut rhoncus pellentesque elementum. + +In a ipsum in dui venenatis scelerisque ut a ante. Quisque tincidunt turpis vitae arcu rhoncus, quis maximus nisl venenatis. Sed ac tortor et nibh aliquam posuere. Praesent ipsum tortor, scelerisque nec sem vitae, efficitur mollis lacus. Sed dui tellus, mattis eu turpis in, accumsan mattis elit. Donec eu nunc dolor. Ut ornare dui quis tortor hendrerit ornare. Sed finibus ornare nulla, vitae vehicula urna vestibulum at. Integer fermentum diam sit amet congue suscipit. Donec massa lectus, dignissim ut metus eu, vehicula dictum nisi. + +Phasellus ligula tortor, consequat a urna quis, interdum congue libero. Sed condimentum sapien sed gravida tristique. Suspendisse vel condimentum orci. Pellentesque pharetra hendrerit malesuada. Morbi commodo ut quam et iaculis. Ut finibus dapibus metus, ut varius orci dapibus non. Nunc efficitur efficitur ultricies. Sed laoreet quam vel volutpat laoreet. Nullam placerat suscipit neque at aliquet. Curabitur luctus nisi eget rutrum interdum. Nam lacinia turpis sed massa euismod tincidunt. Aenean odio nisi, hendrerit et lacus et, sodales mollis leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec posuere erat nibh, a tristique quam bibendum sed. + +Nulla vestibulum leo laoreet, mattis purus at, tempus dolor. Morbi nibh lacus, vehicula eu nibh vel, pellentesque pulvinar magna. Suspendisse urna lorem, pretium non lorem eu, maximus porttitor eros. Integer in purus consectetur, pretium massa ac, bibendum quam. Vivamus venenatis finibus feugiat. Donec ornare neque eu convallis varius. Nullam sodales, tortor id semper varius, nibh odio tincidunt mi, vitae gravida purus erat nec libero. Nam varius tincidunt maximus. Nunc quis metus a diam porta tincidunt ac quis ex. Nunc bibendum nisl tortor, interdum luctus augue suscipit et. Phasellus pretium egestas aliquam. Maecenas in libero enim. + +Duis lacinia dolor eu nunc viverra, quis blandit nunc posuere. Suspendisse ultricies ultrices tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin imperdiet finibus dui, sed vehicula ligula semper vitae. Vestibulum elementum a ante quis vestibulum. Integer sit amet ullamcorper sapien. Cras sapien odio, commodo at consequat non, auctor volutpat ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas ut congue urna, eu iaculis lectus. Curabitur consequat, lectus non pharetra ultricies, massa sapien pellentesque lectus, eu laoreet elit turpis et sapien. + +Pellentesque vel vehicula arcu. Proin aliquam hendrerit turpis aliquam ultrices. Nunc pellentesque urna tempor ipsum porta faucibus. Morbi lobortis quam eget lacus tempor, tempor commodo justo molestie. Suspendisse cursus turpis diam, eget pulvinar velit dignissim ut. Donec vulputate sodales justo ac hendrerit. Donec ultricies mauris id lorem bibendum pulvinar. In sed dictum ex. Phasellus sit amet lacus eget risus scelerisque congue id vitae ex. Vestibulum pellentesque rhoncus lacus, non lobortis dui faucibus non. Cras efficitur dictum rutrum. Pellentesque euismod id felis sit amet faucibus. Maecenas tristique urna ac mi tristique, ac varius ante cursus. + +Vestibulum eu mi sed felis consequat fermentum. Duis sit amet nulla a diam maximus tristique. Sed in turpis diam. Cras sodales egestas massa. Maecenas eget dui tellus. Quisque vulputate tellus sem, non dictum nisi feugiat eget. Suspendisse interdum urna id quam facilisis tristique. Proin dolor ex, vestibulum quis dui ac, dignissim blandit dolor. Sed nec interdum ante. Nullam fermentum iaculis augue ut sodales. Mauris dapibus interdum maximus. Aliquam laoreet nisl et tellus congue, nec molestie justo hendrerit. Suspendisse eros libero, semper a nulla a, placerat convallis leo. Ut ornare turpis velit, id ultrices nulla lobortis non. + +In hac habitasse platea dictumst. Etiam condimentum, nunc vitae faucibus mattis, diam neque accumsan urna, eu tincidunt augue odio sit amet metus. Quisque at mauris eget purus ultricies ultricies vel eget ligula. Phasellus tortor urna, vestibulum eget tincidunt ut, malesuada nec ligula. Phasellus congue dignissim erat ut lacinia. Duis massa lacus, placerat quis ipsum sit amet, maximus ornare velit. Nulla commodo, urna maximus vehicula suscipit, arcu elit commodo leo, ut luctus mauris ipsum sit amet turpis. Donec ornare dignissim tincidunt. Duis efficitur tristique eros, bibendum mattis lorem auctor sit amet. Donec fermentum imperdiet venenatis. Praesent scelerisque purus in scelerisque dignissim. Nulla eu rhoncus nisl. + +Integer quis orci in nisl egestas porta vel efficitur ligula. Sed urna nibh, efficitur ac odio eget, rhoncus viverra magna. Nunc at luctus velit. Nullam laoreet, diam non semper faucibus, purus nisl sagittis mauris, in fringilla dolor sapien et massa. Duis rhoncus lectus nibh, in molestie ante consequat vitae. Fusce a enim vel justo posuere tempor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque eget mi id nulla tristique pellentesque. Aenean lacinia metus lacus, eu viverra turpis interdum at. Aliquam ut convallis mauris. Donec scelerisque ex nulla, id convallis magna vehicula auctor. Maecenas aliquam, felis dapibus convallis congue, odio nisl accumsan dui, vel molestie ex massa quis metus. Vestibulum id vulputate justo. Sed aliquet, est quis varius scelerisque, erat lorem mattis lorem, in sollicitudin risus lorem a justo. Praesent fermentum posuere turpis, vitae fermentum velit rhoncus ut. + +Quisque pellentesque urna vehicula est vestibulum blandit. Donec molestie sagittis erat, sed interdum est dignissim a. Fusce accumsan orci mauris, quis feugiat sem consequat sit amet. Nulla ultricies euismod molestie. Proin eleifend sodales diam vitae facilisis. Nullam sit amet urna tortor. Sed laoreet sapien eu quam cursus eleifend. Praesent vulputate metus turpis, quis aliquam enim semper ut. Donec dignissim libero quis magna euismod faucibus. Nulla aliquam ante id enim consectetur placerat. + +Fusce ullamcorper tellus id pulvinar dignissim. Nam sagittis luctus ipsum, non dictum urna pulvinar quis. Nunc hendrerit quam eu dui egestas, vitae semper sem vestibulum. In efficitur ligula ante, nec faucibus libero tristique ac. Suspendisse potenti. Ut vestibulum massa erat. Proin ornare mi et est varius, in fringilla mi laoreet. Sed libero nisi, gravida sed felis sit amet, bibendum semper risus. Curabitur luctus nunc vulputate elementum cursus. + +Aliquam feugiat, est sed congue fermentum, nibh dolor suscipit nunc, sed porttitor velit dui quis eros. Nam aliquet neque sed faucibus sagittis. Ut iaculis dictum odio in vestibulum.` diff --git a/fileTransfer/ftMessages.pb.go b/fileTransfer/ftMessages.pb.go index 3bde058fbcd1d3bab95d9ee4545f7e0616928a4f..90766209d2a62e9cd6275ca8f8a5040347585d80 100644 --- a/fileTransfer/ftMessages.pb.go +++ b/fileTransfer/ftMessages.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: ftMessages.proto package fileTransfer diff --git a/fileTransfer/groupChat/processor.go b/fileTransfer/groupChat/processor.go index 178c774c2eee9e72e8bb5abd11b822e49b7be91e..86bef7509f994963c68333474f9dc4f96f2c3f1a 100644 --- a/fileTransfer/groupChat/processor.go +++ b/fileTransfer/groupChat/processor.go @@ -9,9 +9,9 @@ package groupChat import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/groupChat" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/groupChat" "gitlab.com/elixxir/primitives/format" ) diff --git a/fileTransfer/groupChat/utils_test.go b/fileTransfer/groupChat/utils_test.go index ee03acb237a2c83c7703448ae0a412bf2d5f8748..f4f3fd631e6bce3b50f44b2c9a89589e49841115 100644 --- a/fileTransfer/groupChat/utils_test.go +++ b/fileTransfer/groupChat/utils_test.go @@ -9,19 +9,19 @@ package groupChat import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/groupChat" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/groupChat" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/fileTransfer/groupChat/wrapper.go b/fileTransfer/groupChat/wrapper.go index 73bbf2cb0e26677c19046be47e31c444a7a33718..ab32dcb26c709157586331b8952587ee271df4e4 100644 --- a/fileTransfer/groupChat/wrapper.go +++ b/fileTransfer/groupChat/wrapper.go @@ -9,9 +9,9 @@ package groupChat import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/rounds" - ft "gitlab.com/elixxir/client/fileTransfer" - "gitlab.com/elixxir/client/groupChat" + "gitlab.com/elixxir/client/v4/cmix/rounds" + ft "gitlab.com/elixxir/client/v4/fileTransfer" + "gitlab.com/elixxir/client/v4/groupChat" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" diff --git a/fileTransfer/groupChat/wrapper_test.go b/fileTransfer/groupChat/wrapper_test.go index c6c8f3950441f760a1541a33aacb65cbdf4e96a8..ffa0fc0bc59abda9c08288a7f7797a4e2684ffed 100644 --- a/fileTransfer/groupChat/wrapper_test.go +++ b/fileTransfer/groupChat/wrapper_test.go @@ -9,8 +9,8 @@ package groupChat import ( "bytes" - ft "gitlab.com/elixxir/client/fileTransfer" - "gitlab.com/elixxir/client/groupChat" + ft "gitlab.com/elixxir/client/v4/fileTransfer" + "gitlab.com/elixxir/client/v4/groupChat" "gitlab.com/elixxir/crypto/fastRNG" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/interface.go b/fileTransfer/interface.go index 37f7dbf0c85b6bac1ac8e07722f9d71a84788ddb..a41a2fbaa2502e4d48cdbd9a5bfd31e5791c2e9b 100644 --- a/fileTransfer/interface.go +++ b/fileTransfer/interface.go @@ -8,7 +8,7 @@ package fileTransfer import ( - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" "strconv" @@ -85,32 +85,32 @@ type FileTransfer interface { // In-progress transfers are restored when closing and reopening; however, a // SentProgressCallback must be registered again. // - // recipient - ID of the receiver of the file transfer. The sender must - // have an E2E relationship with the recipient. - // fileName - Human-readable file name. Max length defined by - // MaxFileNameLen. - // fileType - Shorthand that identifies the type of file. Max length - // defined by MaxFileTypeLen. - // fileData - File contents. Max size defined by MaxFileSize. - // retry - The number of sending retries allowed on send failure (e.g. - // a retry of 2.0 with 6 parts means 12 total possible sends). - // preview - A preview of the file data (e.g. a thumbnail). Max size - // defined by MaxPreviewSize. - // progressCB - A callback that reports the progress of the file transfer. - // The callback is called once on initialization, on every progress - // update (or less if restricted by the period), or on fatal error. - // period - A progress callback will be limited from triggering only once - // per period. - // sendNew - Function that sends the file transfer information to the - // recipient. + // Parameters: + // - recipient - ID of the receiver of the file transfer. The sender must + // have an E2E relationship with the recipient. + // - fileName - Human-readable file name. Max length defined by + // MaxFileNameLen. + // - fileType - Shorthand that identifies the type of file. Max length + // defined by MaxFileTypeLen. + // - fileData - File contents. Max size defined by MaxFileSize. + // - retry - The number of sending retries allowed on send failure (e.g. + // a retry of 2.0 with 6 parts means 12 total possible sends). + // - preview - A preview of the file data (e.g. a thumbnail). Max size + // defined by MaxPreviewSize. + // - progressCB - A callback that reports the progress of the file + // transfer. The callback is called once on initialization, on every + // progress update (or less if restricted by the period), or on fatal + // error. + // - period - The progress callback will be limited from triggering only + // once per period. + // - sendNew - Function that sends the file transfer information to the + // recipient. Send(recipient *id.ID, fileName, fileType string, fileData []byte, retry float32, preview []byte, progressCB SentProgressCallback, period time.Duration, sendNew SendNew) (*ftCrypto.TransferID, error) // RegisterSentProgressCallback allows for the registration of a callback to // track the progress of an individual sent file transfer. - // SentProgressCallback is auto registered on Send; this function should be - // called when resuming clients or registering extra callbacks. // // The callback will be called immediately when added to report the current // progress of the transfer. It will then call every time a file part @@ -124,8 +124,8 @@ type FileTransfer interface { progressCB SentProgressCallback, period time.Duration) error // CloseSend deletes a file from the internal storage once a transfer has - // completed or reached the retry limit. Returns an error if the transfer - // has not run out of retries. + // completed or reached the retry limit. If neither of those condition are + // met, an error is returned. // // This function should be called once a transfer completes or errors out // (as reported by the progress callback). @@ -173,8 +173,6 @@ type FileTransfer interface { // RegisterReceivedProgressCallback allows for the registration of a // callback to track the progress of an individual received file transfer. - // This should be done when a new transfer is received on the - // ReceiveCallback. // // The callback will be called immediately when added to report the current // progress of the transfer. It will then call every time a file part is @@ -189,8 +187,8 @@ type FileTransfer interface { RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, progressCB ReceivedProgressCallback, period time.Duration) error - // Receive returns the full file on the completion of the transfer. - // It deletes internal references to the data and unregisters any attached + // Receive returns the full file on the completion of the transfer. It + // deletes internal references to the data and unregisters any attached // progress callback. Returns an error if the transfer is not complete, the // full file cannot be verified, or if the transfer cannot be found. // diff --git a/fileTransfer/manager.go b/fileTransfer/manager.go index 0e8a92694366138286469acb472f60dfedb1247f..f4f72824921afec1c2483f3e829862008baf00d9 100644 --- a/fileTransfer/manager.go +++ b/fileTransfer/manager.go @@ -11,17 +11,17 @@ import ( "bytes" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/fileTransfer/callbackTracker" - "gitlab.com/elixxir/client/fileTransfer/store" - "gitlab.com/elixxir/client/fileTransfer/store/fileMessage" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/fileTransfer/callbackTracker" + "gitlab.com/elixxir/client/v4/fileTransfer/store" + "gitlab.com/elixxir/client/v4/fileTransfer/store/fileMessage" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" @@ -209,6 +209,12 @@ func NewManager(params Params, user FtE2e) (FileTransfer, error) { m.addFingerprints(rt) } + jww.INFO.Printf( + "[FT] Created new file transfer manager with parameters: %+v"+ + "\nAdding %d unsent parts to be sent."+ + "\nQueueing %d incomplete received transfers.", + params, len(unsentParts), len(incompleteTransfers)) + return m, nil } @@ -319,6 +325,7 @@ func (m *manager) Send(recipient *id.ID, fileName, fileType string, if err != nil { return nil, errors.Errorf(errMarshalInfo, err) } + err = sendNew(transferInfo) if err != nil { return nil, errors.Errorf(errSendNewMsg, err) @@ -334,6 +341,10 @@ func (m *manager) Send(recipient *id.ID, fileName, fileType string, return nil, errors.Errorf(errAddSentTransfer, err) } + jww.DEBUG.Printf("[FT] Created new sent file transfer %s for %q "+ + "(type %s, size %d bytes, %d parts, retry %f)", + st.TransferID(), fileName, fileType, fileSize, numParts, retry) + // Add all parts to the send queue for _, p := range st.GetUnsentParts() { m.batchQueue <- p diff --git a/fileTransfer/manager_test.go b/fileTransfer/manager_test.go index 80e6bec4f19f00badcf5a03011dff76233288414..a84a49f4f2b2010b774ae3a0e6a12603f873aac2 100644 --- a/fileTransfer/manager_test.go +++ b/fileTransfer/manager_test.go @@ -9,8 +9,8 @@ package fileTransfer import ( "bytes" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" @@ -230,337 +230,3 @@ func Test_FileTransfer_Smoke(t *testing.T) { t.Errorf("Failed to close processes for manager 2: %+v", err) } } - -const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at efficitur urna, et ultrices leo. Sed lacinia vestibulum tortor eu convallis. Proin imperdiet accumsan magna, sed volutpat tortor consectetur at. Mauris sed dolor sed sapien porta consectetur in eu sem. Maecenas vestibulum varius erat, eget porta eros vehicula mattis. Phasellus tempor odio at tortor maximus convallis. Nullam ut lorem laoreet, tincidunt ex sollicitudin, aliquam urna. Mauris vel enim consequat, sodales nibh quis, sollicitudin ipsum. Quisque lacinia, sapien a tempor eleifend, dolor nibh posuere neque, sit amet tempus dolor ante non nunc. Proin tempor blandit mollis. Mauris nunc sem, egestas eget velit ut, luctus molestie ipsum. Pellentesque sed eleifend dolor. Nullam pulvinar dignissim ante, eget luctus quam hendrerit vel. Proin ornare non tortor vitae rhoncus. Etiam tellus sem, condimentum id bibendum sed, blandit ac lorem. Maecenas gravida, neque quis blandit ultrices, nisl elit pretium nulla, ac volutpat massa odio sed arcu. - -Etiam at nibh dui. Vestibulum eget odio vestibulum sapien volutpat facilisis. Phasellus tempor risus in nisi viverra, ut porta est dictum. Aliquam in urna gravida, pulvinar sem ac, luctus erat. Fusce posuere id mauris non placerat. Quisque porttitor sagittis sapien nec scelerisque. Aenean sed mi nec ante tincidunt maximus. Etiam accumsan, dui eget varius mattis, ex quam efficitur est, id ornare nulla orci id mi. Mauris vulputate tincidunt nunc, et tempor augue sollicitudin eget. - -Sed vitae commodo neque, euismod finibus libero. Integer eget condimentum elit, id volutpat odio. Donec convallis magna lacus, varius volutpat augue lacinia a. Proin venenatis ex et ullamcorper faucibus. Nulla scelerisque, mauris id molestie hendrerit, magna justo faucibus lacus, quis convallis nulla lorem nec nisi. Nunc dictum nisi a molestie efficitur. Etiam vel nibh sit amet nibh finibus gravida eget id tellus. Donec elementum blandit molestie. Donec fringilla sapien ut neque bibendum, at ultrices dui molestie. Sed lobortis auctor justo at tincidunt. In vitae velit augue. Vestibulum pharetra ex quam, in vehicula urna ullamcorper sit amet. Phasellus at rhoncus diam, nec interdum ligula. Pellentesque eget risus dictum, ultrices velit at, fermentum justo. Nulla orci ex, tempor vitae velit eu, gravida pellentesque dolor. - -Aenean auctor at lorem in auctor. Sed at mi non quam aliquam aliquet vitae eu erat. Sed eu orci ac elit scelerisque rhoncus eget at orci. Donec a imperdiet ipsum. Phasellus efficitur lobortis mauris, et scelerisque diam consectetur sit amet. Nunc nunc lectus, accumsan vel eleifend vel, tempor vitae sapien. Nunc dictum tempus turpis non blandit. Sed condimentum pretium velit ac sodales. In accumsan leo vel sem commodo, eget hendrerit risus interdum. Nullam quis malesuada purus, non euismod turpis. In augue lorem, convallis quis urna vel, euismod tincidunt nunc. Ut eget luctus lacus, in commodo diam. - -Aenean ut ante sed ex ornare maximus quis venenatis urna. Fusce commodo fermentum velit nec varius. Etiam vitae odio vel nisl condimentum fringilla. Donec in risus tincidunt ex placerat vestibulum. Donec hendrerit tellus convallis malesuada vulputate. Aenean condimentum metus id est mollis viverra. Quisque at auctor turpis. Aenean est metus, laoreet eu justo a, consequat suscipit nibh. Etiam mattis massa in sem sollicitudin, non blandit dolor pharetra. Vivamus pretium nunc ut lacus interdum, ut feugiat lectus blandit. Vestibulum sit amet scelerisque lectus. Nam ut lorem mattis urna semper rutrum. - -Maecenas imperdiet libero et metus porta maximus. Duis lobortis porttitor sem, ut dictum urna consequat vitae. Sed consectetur est at arcu fringilla scelerisque. Nulla finibus libero eu nibh vulputate euismod. Praesent volutpat nisi eget elit dignissim, ac imperdiet nisi mollis. Integer a venenatis neque. Fusce leo leo, auctor sit amet auctor in, elementum quis magna. - -Donec efficitur ullamcorper ex eget pretium. Suspendisse pharetra sagittis neque, eget laoreet sem maximus et. Etiam sit amet mi ut purus ornare molestie a nec diam. Sed eleifend dui at orci sollicitudin bibendum. Mauris non leo eu est consequat porttitor consectetur vel massa. Nullam pretium molestie leo in hendrerit. Etiam dapibus ante tellus, quis hendrerit turpis feugiat vitae. Maecenas id lorem quis nibh tincidunt accumsan sed sed nisi. Duis non faucibus odio. Fusce porta enim vitae ex ultrices, non euismod nibh posuere. - -Suspendisse luctus orci blandit, tempor ipsum in, molestie erat. Fusce commodo sed sapien quis interdum. Etiam sollicitudin ipsum a ipsum tempus, a vestibulum ligula hendrerit. Integer eget nisl a arcu hendrerit sollicitudin. Fusce a purus ornare, sollicitudin ante in, gravida elit. Vestibulum ut tortor volutpat, sodales enim eget, aliquam risus. Pellentesque efficitur nec sem id molestie. Mauris molestie, risus sit amet dignissim dictum, turpis ante vehicula tellus, in eleifend risus metus in mi. Aenean interdum ac metus ac porttitor. Vivamus nec blandit arcu. Maecenas fringilla varius metus, sed viverra diam facilisis a. - -Curabitur placerat cursus sem, in laoreet elit mollis in. Nam convallis aliquam placerat. Sed quis efficitur est. Proin id massa quam. Fusce nec porttitor quam. Nunc ac massa imperdiet, pretium nibh quis, maximus nisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec pretium purus id viverra fringilla. Cras congue facilisis orci et ullamcorper. In ac turpis arcu. Praesent convallis in ligula vitae suscipit. - -Etiam et egestas ipsum, ac lacinia erat. Nunc in metus sit amet lectus ultricies viverra in sed elit. Ut euismod urna eget nisl faucibus, accumsan vestibulum dolor suscipit. Aenean a volutpat ipsum. Nulla pharetra enim eu lorem vestibulum malesuada. Nulla facilisi. In congue at odio vel imperdiet. Fusce in elit in nibh dapibus rutrum. Donec consequat mauris a sem viverra egestas. Suspendisse sollicitudin dapibus finibus. Nullam tempus et lacus sed feugiat. Suspendisse aliquet, sem a fringilla elementum, ante lorem elementum odio, quis sollicitudin magna nibh sed libero. Maecenas convallis congue neque, ut molestie nibh porttitor ac. Vestibulum quis justo sed ipsum tempus viverra. Quisque mauris erat, varius a ipsum eu, porta molestie odio. Morbi mauris ante, sagittis eget nibh vel, volutpat faucibus nunc. - -Donec id neque feugiat, tristique neque et, luctus nibh. Duis vel lacus eu nisl dignissim sagittis sed sed lacus. Praesent luctus eleifend aliquet. Sed tempus facilisis lorem, sit amet tristique metus suscipit ac. Vestibulum id sapien ac erat luctus fermentum venenatis sit amet erat. Maecenas posuere finibus mi. Phasellus facilisis efficitur turpis sed auctor. Nullam lobortis ornare velit ac scelerisque. Vestibulum facilisis, odio ac finibus viverra, leo leo sodales arcu, sed ornare ex ligula vel lacus. Nullam odio orci, pulvinar eu urna in, tristique ornare augue. - -Vivamus scelerisque egestas justo, at dignissim erat elementum id. Etiam vel suscipit erat. Nulla accumsan ex sem, id pharetra eros tincidunt sodales. Nullam enim augue, interdum ut est ac, faucibus semper justo. Aliquam ut iaculis magna. Sed magna turpis, pretium nec lobortis vel, facilisis vitae mauris. Donec tincidunt eros in mauris maximus porta id vehicula mi. Integer ut orci lobortis turpis vehicula viverra. Vestibulum at blandit nunc, ac pretium quam. Morbi ac metus placerat, congue lorem nec, pharetra neque. - -Sed vestibulum nibh ex, fringilla lobortis libero sodales sed. Aenean vehicula nibh tellus, egestas eleifend diam sollicitudin non. Fusce ut sollicitudin leo. Nam tempor dictum erat sit amet vestibulum. Pellentesque ornare mattis ex, nec malesuada elit sollicitudin vitae. Nulla nec semper enim, venenatis ornare orci. Aliquam urna purus, ornare eu ipsum vitae, consectetur faucibus elit. Nulla vestibulum semper ligula, id rhoncus tortor accumsan nec. Vestibulum non ante sed urna efficitur imperdiet vitae quis felis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque rutrum quam sit amet nisl facilisis, quis maximus ante bibendum. - -Integer vel tortor nec est sodales posuere ut ac ipsum. Curabitur id odio nisl. Sed id augue iaculis, viverra risus nec, bibendum nunc. Cras ex risus, semper ac lorem nec, mattis dictum purus. Aenean semper et lacus at condimentum. Fusce nisl dolor, facilisis nec velit at, tempus pharetra mauris. Nam ac magna urna. Nulla convallis libero sed ex eleifend, ac molestie magna rhoncus. - -Donec blandit aliquam metus molestie suscipit. Cras et malesuada urna, non facilisis turpis. Donec non orci at leo aliquet porttitor vel non turpis. Nam consequat libero quam, non egestas ipsum eleifend quis. Mauris laoreet tellus enim, ac porta sapien condimentum quis. Nunc non sagittis orci. Aenean leo nibh, feugiat in turpis eget, hendrerit faucibus ligula. Morbi et massa nulla. Curabitur ac tempus nibh. Quisque commodo imperdiet viverra. Quisque sit amet condimentum mauris. - -Aliquam vel velit sed turpis consectetur eleifend quis et quam. Integer sed magna vel nisl consectetur lacinia vitae et ante. Duis consequat nulla ac leo auctor, ac euismod ipsum semper. Aliquam libero neque, imperdiet et nisi fringilla, vehicula elementum leo. Phasellus facilisis felis nec sagittis sodales. Donec ac consectetur odio. Aliquam eu aliquam lacus. Aliquam dictum eleifend risus, hendrerit eleifend nibh feugiat at. Aenean id tristique justo. Maecenas vel nibh quis massa aliquam convallis in eget mauris. - -Vestibulum nec fringilla neque, sit amet pellentesque dolor. Aenean a dolor enim. Morbi urna orci, mollis in viverra vel, volutpat vitae magna. Aenean sodales nec nisi ultrices condimentum. Quisque in turpis lobortis purus elementum maximus lacinia et nibh. Donec sed tortor eu nibh bibendum convallis in quis massa. Integer efficitur ultricies odio vel commodo. - -Quisque fermentum odio sit amet nunc tempus, vel porta nunc lobortis. Nam pellentesque elit non leo interdum, blandit eleifend purus suscipit. Nullam porta est non enim vulputate, ut molestie tortor ullamcorper. Donec fermentum, lectus suscipit commodo aliquet, tellus lacus rutrum ante, quis condimentum risus nisi id risus. Ut dapibus hendrerit odio non aliquet. Integer neque odio, dictum ac efficitur sit amet, facilisis a lacus. Nulla placerat erat et tortor placerat, vel posuere felis dignissim. Morbi non scelerisque ipsum. Aliquam hendrerit vestibulum metus vel pellentesque. Nunc fringilla turpis sodales nisi vestibulum faucibus. Quisque vehicula est arcu, tempus eleifend lorem scelerisque vitae. - -Nullam vehicula tortor vel purus hendrerit convallis. Cras sagittis metus ex, sit amet sollicitudin lectus vulputate quis. Integer sem odio, lobortis et pretium non, pharetra ut lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque aliquam aliquet lorem, faucibus venenatis diam viverra in. Nullam pulvinar, nisi vel elementum venenatis, lacus risus convallis neque, ac eleifend lorem enim ac turpis. Pellentesque tellus quam, dictum eu nisl non, cursus pellentesque justo. - -Cras pharetra lorem sed magna vulputate, eget iaculis elit molestie. Morbi a est finibus, condimentum nunc at, feugiat magna. Curabitur turpis turpis, placerat sed risus vitae, porta volutpat elit. Phasellus id neque diam. Maecenas eu metus a urna iaculis egestas eget at elit. Nunc vehicula molestie dapibus. In auctor sapien eget mi tempus, eu tempor massa egestas. Pellentesque metus sem, pharetra non urna ac, convallis hendrerit massa. Mauris nunc velit, maximus sit amet est sit amet, gravida ultrices elit. Vivamus ut luctus nisl. Nam et ultrices ipsum. Maecenas eget blandit mi. Curabitur eu lorem nec est vehicula sodales. - -Vestibulum hendrerit sed est vitae egestas. Nam molestie, augue non consequat efficitur, elit purus commodo orci, et pharetra ante risus eget augue. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Maecenas a nulla enim. Ut accumsan sodales ultrices. Quisque gravida, leo rhoncus placerat egestas, eros felis posuere diam, ut eleifend orci nisl vitae lorem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam sit amet urna venenatis, pulvinar nisi eget, tristique nisi. Nam nec purus hendrerit, congue augue et, facilisis diam. Donec aliquet eleifend mauris. Vivamus eu libero rhoncus, scelerisque metus at, hendrerit quam. Cras vulputate, magna eget pretium accumsan, tortor nunc molestie quam, at vulputate turpis velit eget arcu. Etiam tristique sollicitudin est, in condimentum diam faucibus vitae. - -Curabitur id lorem elementum diam sollicitudin gravida a sit amet ipsum. Pellentesque tortor ligula, auctor at ultricies non, pulvinar et risus. Ut vitae cursus metus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed quis tortor feugiat, fermentum nunc at, sodales massa. Donec efficitur euismod diam non sodales. In eu augue quis enim elementum auctor. In hac habitasse platea dictumst. Cras in libero nec urna tempor venenatis vitae a diam. Nam vulputate nisl nulla, ut porttitor elit euismod non. Praesent eget tempus lacus, vel ullamcorper nulla. Quisque ut risus nibh. Nam rhoncus commodo consectetur. Sed ultrices sapien id lectus imperdiet, sed tincidunt est dapibus. - -Integer posuere mattis ipsum congue ullamcorper. Nunc ac vulputate magna. Ut bibendum scelerisque lectus. Nullam laoreet porta nunc, in viverra dolor blandit eu. Ut semper id urna quis bibendum. Vivamus sed felis nec sapien faucibus volutpat sed et nisi. Morbi faucibus venenatis imperdiet. Mauris semper ex ac blandit scelerisque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - -Suspendisse vitae lectus diam. Nulla vel lectus non magna congue pharetra eget nec augue. Morbi elementum, nisl ut vestibulum varius, quam sapien convallis magna, tempus maximus nunc est vel purus. In molestie ligula sed placerat sagittis. In rutrum, felis volutpat pulvinar pharetra, arcu odio egestas augue, ut dapibus leo libero nec urna. Curabitur tortor sapien, aliquam id suscipit et, feugiat a leo. Sed mollis imperdiet tellus, ac placerat felis tristique sed. Fusce pulvinar est felis, sed rutrum neque sollicitudin sit amet. Donec tincidunt elit vel felis sagittis, sit amet vestibulum enim pellentesque. Nam accumsan rhoncus tellus vitae auctor. - -Praesent mattis risus eget dui finibus lobortis. Suspendisse auctor commodo viverra. Quisque a ante ante. Proin magna mi, efficitur vitae arcu vel, vehicula viverra lacus. Nulla rhoncus aliquet tortor eget iaculis. Vestibulum ac mollis risus. Curabitur non rhoncus neque. Donec non ipsum quis lectus fermentum convallis ac quis risus. - -Pellentesque aliquam diam diam, in tempus nisi rhoncus sed. Praesent ultricies nisl justo, sit amet suscipit lectus pharetra quis. Praesent non diam in dolor vulputate molestie ut vel nulla. Cras vel congue neque, in ultricies metus. Aliquam ultricies quam eget placerat accumsan. Aenean sodales cursus semper. Donec justo ex, euismod et mollis at, congue a arcu. - -In at sapien pulvinar, scelerisque felis sit amet, hendrerit diam. Aliquam pellentesque est vel augue dignissim, quis ornare sapien tincidunt. Nullam porta tincidunt tempus. Morbi eget arcu sed mauris tincidunt malesuada. Vivamus eleifend tortor in diam vulputate, non convallis nisi sodales. Vestibulum id arcu quis nisl maximus semper. Nunc quis dui vitae lectus dapibus luctus. Mauris mattis convallis mi, ut fringilla velit pulvinar non. - -Nam auctor ligula id dignissim pretium. Aliquam id ultricies massa. Suspendisse ullamcorper nec enim non egestas. Sed tristique, est eu cursus elementum, mauris nisi consectetur nulla, dapibus ultricies tortor mi ut augue. Sed vitae velit luctus, viverra velit a, malesuada eros. Mauris efficitur tortor quam, sed sodales velit suscipit varius. Integer varius nisi sit amet pharetra consequat. Fusce a fringilla felis, vel porta risus. Maecenas nibh magna, euismod quis tellus nec, faucibus mattis erat. Nulla facilisi. Cras maximus tempor dolor, a tristique diam consectetur in. Nam semper sapien tincidunt justo ornare vehicula. Suspendisse sit amet egestas lacus, ac bibendum urna. - -Integer sed est id tortor molestie placerat. Pellentesque vehicula risus eget massa lacinia hendrerit. Sed ut elit quis diam posuere bibendum in et ligula. Donec lobortis lacus eget aliquet maximus. Nullam risus massa, imperdiet eu urna ut, luctus fringilla tortor. Ut imperdiet nibh metus. Sed vitae purus nisl. - -Nunc sed magna arcu. Proin ornare lectus at semper hendrerit. Donec mi nunc, mattis in nibh a, facilisis ornare arcu. Curabitur in pretium turpis. Donec vulputate turpis sem, quis consectetur felis euismod a. Nullam sapien libero, dictum a odio a, pretium accumsan mauris. Nunc et velit varius, gravida metus non, mollis dui. Praesent nec dictum lorem, id bibendum nisi. In hac habitasse platea dictumst. Curabitur in imperdiet eros. Quisque vitae turpis lorem. In hac habitasse platea dictumst. Aliquam lobortis felis sit amet metus maximus, sit amet vulputate lorem ornare. In non ultrices eros. - -Praesent tellus nisl, feugiat ut rhoncus at, euismod ac ipsum. Donec vitae felis consectetur dolor ultricies scelerisque et at mauris. Donec justo lorem, euismod non velit ac, malesuada tempus sem. Pellentesque nunc sem, pharetra sed fermentum non, dignissim at nunc. Sed placerat dignissim dolor vitae malesuada. Maecenas in orci in arcu dictum facilisis eget et dui. Sed sed elit sed augue cursus rhoncus gravida sit amet mauris. In vel tempor lectus. Vestibulum congue, quam et feugiat placerat, tortor urna elementum magna, et laoreet neque orci id felis. Aliquam scelerisque nisi eget nisl dignissim, id luctus dolor tempus. Etiam ornare, magna vel dictum faucibus, ante lacus interdum sem, non malesuada urna felis quis dolor. Donec faucibus sagittis elementum. Fusce id risus eu nulla ornare tincidunt iaculis id erat. - -Suspendisse potenti. Nunc tristique nulla ac elementum ornare. Quisque finibus vitae erat at molestie. Maecenas consectetur mollis odio eu luctus. Phasellus id velit et nunc euismod varius vel vel dolor. Duis tempus nisi eu risus laoreet porta. Sed tempor eget neque eget pharetra. Duis non massa ac sem vulputate congue. Aliquam sodales sapien nisi, ut egestas orci ornare volutpat. Ut dui libero, viverra vel turpis vitae, molestie auctor justo. Pellentesque lacinia arcu vitae nunc auctor, nec elementum lorem malesuada. Interdum et malesuada fames ac ante ipsum primis in faucibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer at aliquet diam. Duis sit amet orci nec urna convallis ultrices at nec nunc. - -Quisque rutrum eros vel ipsum tincidunt, quis pulvinar mi tincidunt. Quisque eget condimentum diam. Fusce porttitor maximus dolor et suscipit. In turpis tellus, semper hendrerit elit at, elementum fringilla nisl. Curabitur a maximus nunc. Ut dictum dignissim lectus, et convallis eros volutpat non. Sed tempor orci risus, nec fringilla nisl dictum quis. Nunc id sagittis ipsum. - -Fusce sollicitudin suscipit risus, tincidunt fermentum odio cursus eget. Proin tempus, felis et dignissim gravida, quam libero condimentum ligula, eget commodo libero sapien eget magna. Quisque feugiat purus mi, in facilisis augue euismod non. In euismod pharetra enim, non tristique purus dictum ac. Maecenas sed diam tincidunt, mollis neque a, imperdiet est. Sed eu orci non nulla mollis consequat et quis metus. Fusce odio metus, tincidunt ac velit sit amet, tempor posuere tortor. Vestibulum ornare, quam non vulputate feugiat, diam nibh finibus augue, at pharetra lectus nibh quis metus. Nam dignissim quis tellus eget aliquet. Proin iaculis sit amet ex eu vehicula. Etiam vehicula sollicitudin laoreet. Praesent venenatis luctus est. Suspendisse potenti. Donec luctus molestie mollis. Vestibulum quis tortor ut mauris porta gravida sed sit amet felis. Aliquam in ex condimentum, volutpat eros scelerisque, accumsan orci. - -Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas vitae viverra sapien. Suspendisse vel accumsan libero, ac rutrum purus. Aliquam in risus sed metus sollicitudin convallis eget in purus. Phasellus sagittis vestibulum magna, quis scelerisque augue malesuada vel. Quisque felis leo, vulputate laoreet enim lacinia, gravida viverra urna. Aliquam faucibus vestibulum maximus. Praesent scelerisque velit quis pellentesque varius. Ut consectetur ut risus a bibendum. In mollis sapien vitae ipsum volutpat, sit amet mattis nibh dictum. Curabitur eros ipsum, tincidunt et mauris id, maximus mattis sem. Mauris quis elit laoreet, porttitor nulla sit amet, feugiat tortor. Cras nec enim pulvinar, tincidunt lorem molestie, ornare arcu. Cras imperdiet quis ante vitae hendrerit. Sed tincidunt dignissim viverra. - -Aenean varius turpis dui, id efficitur lorem placerat sit amet. In hac habitasse platea dictumst. Integer quis pulvinar massa. Proin efficitur, ipsum eget vulputate lobortis, nibh ipsum faucibus magna, non luctus lorem nulla sed magna. Vestibulum scelerisque sed tortor eu aliquet. Curabitur et leo ac tellus pretium egestas. Cras blandit neque dui, eget dictum leo porttitor sed. Sed ultricies commodo tortor, a molestie ante scelerisque vitae. Duis faucibus quis magna nec lacinia. Morbi congue justo id dui ultricies condimentum. Pellentesque maximus faucibus gravida. Mauris vestibulum non libero sit amet fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras id lorem condimentum, sodales dui id, blandit dolor. Sed elit mauris, aliquet nec enim vitae, sollicitudin pretium dui. Cras lacus sapien, maximus in libero et, elementum fermentum nunc. - -Vestibulum gravida cursus nisi sed congue. Nam velit lorem, porttitor id pharetra finibus, malesuada eget dui. Vestibulum at est ultrices, venenatis nulla sed, suscipit risus. Maecenas posuere pretium odio nec accumsan. Aliquam dui dui, laoreet sed felis non, dignissim hendrerit ante. Etiam id commodo ante. Aenean bibendum enim aliquet fringilla dictum. Morbi eu feugiat risus. - -Praesent gravida a ante non placerat. Mauris ultricies ullamcorper justo id viverra. Aenean semper metus eu nisl euismod suscipit. Proin erat quam, viverra ut metus eget, imperdiet accumsan nunc. Curabitur non enim a odio maximus pulvinar ac et elit. In auctor ex a malesuada malesuada. Nullam dapibus quam neque, a lacinia magna tempor eget. Nam pellentesque, nisl eget gravida porta, felis magna lacinia ipsum, eu lacinia felis dui non libero. Phasellus ut convallis urna. Curabitur convallis sem vel tortor lobortis molestie. Nunc vel fringilla mi. Donec eget libero ultricies, euismod nibh non, gravida mauris. Praesent malesuada, lectus at sollicitudin interdum, mi lacus aliquam metus, non gravida tortor velit ac justo. Suspendisse auctor tellus sapien, at eleifend erat mollis et. - -Sed a dictum quam. Sed accumsan libero vel feugiat vulputate. Cras mattis massa nec velit rhoncus luctus. Sed ornare, augue vel ornare lobortis, purus nulla interdum ipsum, a semper massa enim quis nunc. Nunc tempor efficitur odio, vel consequat dui fringilla ac. Quisque at quam sed lacus rhoncus sollicitudin. Nunc dolor libero, dictum a ornare id, euismod ac lectus. Quisque a hendrerit lectus. Nam ut diam eu neque viverra porttitor. Proin vitae accumsan eros, ut iaculis lorem. Nulla libero odio, mollis sed venenatis et, imperdiet ut ligula. - -Aliquam dignissim erat erat, vel imperdiet arcu sagittis id. In in dolor orci. Aliquam congue fermentum dui tristique viverra. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur a turpis in dolor consequat pulvinar. Pellentesque sed posuere nisl. Etiam pellentesque euismod sem. Quisque vitae nibh urna. Phasellus elementum arcu urna, ac scelerisque leo iaculis non. Etiam laoreet, nunc a consectetur rhoncus, nunc tortor feugiat nibh, vitae volutpat metus mauris in est. Pellentesque at neque eu arcu faucibus auctor nec vitae urna. Suspendisse semper tristique nisl id interdum. - -Integer dui libero, auctor id elementum a, convallis eu est. Praesent auctor sodales faucibus. Aenean faucibus euismod orci, vestibulum pharetra magna consectetur vel. Praesent a enim vel nisi aliquam tristique ut id metus. Donec at purus dui. Sed a aliquam velit, non viverra ex. Ut molestie interdum urna vel facilisis. Nunc iaculis aliquet turpis eu luctus. Vestibulum mollis diam vel ante finibus, a efficitur est tempus. Nulla auctor cursus sagittis. Nullam id odio vitae orci tristique eleifend. - -Ut iaculis turpis at sollicitudin accumsan. Cras eleifend nisl sed porta euismod. Nullam non nisi turpis. Cras feugiat justo nec augue pretium fermentum. Nunc malesuada at nulla a interdum. Proin ullamcorper commodo ligula ac rutrum. Praesent eros augue, venenatis vitae enim sit amet, ultricies eleifend risus. Nunc bibendum, leo ac consequat porttitor, diam ante posuere turpis, ut mattis odio justo consectetur justo. Phasellus ex dolor, aliquam et malesuada vitae, porttitor sed tellus. - -Praesent vitae lorem efficitur, consequat enim ut, laoreet nisi. Aliquam volutpat, nisl vel lobortis dapibus, risus justo lacinia justo, viverra lacinia justo lorem egestas nibh. Suspendisse pellentesque justo sed interdum sagittis. Maecenas vel ultricies magna. Duis feugiat vel arcu ac placerat. In tincidunt a orci at feugiat. Maecenas gravida tincidunt nibh eu convallis. Quisque pulvinar rutrum cursus. - -Proin nec maximus tortor. Morbi pellentesque magna vitae risus scelerisque elementum. Nulla fringilla neque at arcu malesuada rutrum. Fusce nisi magna, elementum fringilla elit ut, lacinia varius purus. In accumsan justo ex, vitae suscipit velit finibus cursus. Morbi sed suscipit orci. Fusce nulla erat, fermentum vel aliquam vitae, eleifend et elit. Maecenas id elit a ligula vestibulum blandit ut at eros. Etiam ac bibendum massa, sagittis viverra dolor. Maecenas sed sapien nec elit fringilla molestie a vel purus. In in semper odio, quis consectetur dolor. In sed metus a nisi tincidunt posuere nec eget erat. - -Maecenas non auctor sem. Nullam in turpis sagittis, fermentum neque finibus, fermentum justo. Sed id nisl mattis, commodo felis in, dapibus turpis. Nullam in elit in nunc aliquam laoreet vel vitae magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tincidunt tempus imperdiet. Nulla est est, mollis imperdiet varius nec, porta in nulla. Vestibulum volutpat euismod nisi vel laoreet. - -Cras congue egestas sodales. Nam commodo malesuada est nec volutpat. Ut gravida, turpis ac congue molestie, sapien augue molestie nulla, quis lacinia sapien dui eu nunc. Aliquam eleifend, leo et finibus pharetra, ante sapien congue purus, quis euismod urna nulla et metus. Donec vulputate hendrerit tortor quis mollis. Vestibulum et condimentum purus, vel aliquam lacus. Ut id congue sapien. Pellentesque ante lectus, hendrerit sit amet luctus quis, feugiat dignissim leo. Aenean aliquam imperdiet cursus. Praesent vulputate turpis ullamcorper felis tincidunt tincidunt. Duis quis augue vitae nibh finibus sagittis. Sed sollicitudin scelerisque tellus, ut interdum diam sollicitudin bibendum. Vestibulum iaculis fermentum sem sit amet tempus. Suspendisse lobortis eleifend fermentum. - -Etiam consectetur est sit amet nisl aliquet, eget fermentum tellus rhoncus. Quisque vulputate sit amet mauris eget lacinia. Fusce ac eros tellus. Suspendisse et tellus felis. Praesent ultricies nunc lorem, sed sodales orci viverra eu. Vestibulum maximus nibh et turpis efficitur, in tempus ipsum efficitur. Vivamus finibus lorem nec malesuada egestas. Praesent in nibh sagittis, volutpat risus et, commodo est. Suspendisse facilisis eu augue nec tincidunt. Fusce quis nisl tempus, tincidunt lacus nec, dapibus purus. - -Vivamus et ante eu ante sodales elementum sed id urna. In tincidunt vel tortor sed feugiat. Praesent iaculis diam eget pellentesque ornare. Praesent aliquet convallis odio sit amet suscipit. Morbi et nisi nulla. Nunc vestibulum risus a faucibus efficitur. Pellentesque commodo odio eu leo vestibulum, id iaculis risus sagittis. Cras a ipsum posuere, rhoncus eros in, euismod nulla. Nam semper, mi id tempor sodales, diam sem blandit odio, eget posuere tellus nisi nec tortor. Etiam nec tortor congue, sodales ante ac, malesuada elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce fringilla eros sit amet orci vestibulum aliquam. Suspendisse fermentum malesuada est, sit amet condimentum ante volutpat nec. Integer sit amet magna molestie, feugiat odio a, condimentum lectus. - -Nullam odio ligula, mollis eu massa ac, maximus interdum velit. Vestibulum vulputate a justo ac efficitur. Quisque ex est, pretium id velit nec, malesuada posuere arcu. Sed congue lacus nec velit vehicula, a egestas erat mattis. Nunc eget leo a metus rhoncus mollis. Maecenas at elit nec est condimentum suscipit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nisi mauris, consequat varius mollis at, porta ac dolor. Mauris vitae euismod lorem, ut dapibus turpis. Vivamus sit amet iaculis turpis. Nulla molestie feugiat urna in pharetra. - -Nam ac elit vulputate magna venenatis pharetra ac eu elit. Donec sed eros id lacus molestie rutrum. Sed iaculis mauris nunc, non fringilla ante semper eu. Maecenas in auctor eros. Vestibulum eu enim lorem. Etiam tristique dui id justo blandit dignissim. Aenean quis faucibus eros. Quisque vel dolor lectus. Etiam lacus enim, laoreet varius dolor ut, sollicitudin imperdiet lacus. - -Quisque vel nibh sollicitudin urna pellentesque euismod sed sed lorem. Suspendisse in condimentum ipsum, eu convallis ipsum. Nunc faucibus condimentum ante efficitur imperdiet. Donec tempor egestas efficitur. Morbi et aliquam nisl, quis iaculis elit. Fusce eu elit et sapien auctor ullamcorper. Curabitur sem orci, pharetra vitae facilisis non, scelerisque et mi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut molestie eu velit id ultricies. Maecenas vehicula id tortor sit amet faucibus. Duis porta enim nec vestibulum posuere. Aenean blandit fringilla lacus accumsan pellentesque. Integer ut ante elementum, imperdiet metus sit amet, consequat orci. - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget libero non arcu luctus pulvinar. Vestibulum condimentum tellus nec enim bibendum aliquam. Nulla non placerat massa. Donec vestibulum nibh at rutrum mollis. Aliquam erat volutpat. Vivamus metus est, rhoncus a efficitur id, blandit id dolor. - -Nunc rutrum lacus ut pharetra feugiat. Sed volutpat semper metus sit amet placerat. Phasellus efficitur porta venenatis. Quisque imperdiet metus nunc, nec porttitor turpis iaculis ut. Sed at orci eget eros lacinia volutpat. Etiam sagittis euismod diam quis ullamcorper. Nulla facilisi. Praesent faucibus neque vel tortor pharetra, ac tincidunt nunc rutrum. Phasellus aliquam nulla in augue rhoncus, a lacinia tellus pretium. - -Praesent in mauris lectus. Aliquam molestie nulla vitae nulla consectetur convallis. Sed eu molestie velit, vitae venenatis elit. Quisque eget ultricies mauris, at euismod risus. Sed gravida velit ut risus tempor suscipit. Maecenas metus nisi, pellentesque in ornare et, fermentum et lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. - -Quisque in mi congue, molestie massa a, fermentum tellus. Integer vitae tortor iaculis, tincidunt magna et, egestas ligula. Sed feugiat metus id erat faucibus, ac bibendum enim sollicitudin. Cras hendrerit massa sapien, et consequat tellus accumsan lacinia. Nam pharetra, ipsum ut vestibulum fringilla, sapien eros finibus leo, eget suscipit nibh arcu aliquam quam. Quisque sollicitudin id est eu rutrum. Nunc vitae tincidunt nisi, euismod viverra enim. Maecenas mattis sapien at felis hendrerit dignissim. - -Quisque eu urna nulla. Integer at eros fermentum est mattis rutrum at nec massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ut hendrerit nunc. Vestibulum est velit, rhoncus quis nisi sed, lobortis aliquet metus. Nunc faucibus egestas magna sit amet ornare. Maecenas eu justo mi. Proin tincidunt sem vel metus efficitur, sit amet malesuada augue cursus. - -Vestibulum viverra augue ut lorem accumsan, nec lacinia ligula accumsan. Maecenas viverra mauris dolor, vitae molestie mi accumsan nec. Ut nec sagittis nisl, fringilla viverra magna. Cras condimentum ultrices sollicitudin. Morbi tempor, massa ut iaculis posuere, arcu erat luctus massa, vitae pulvinar nulla ex nec nulla. Mauris vitae scelerisque ipsum. Nullam tincidunt consequat augue, quis aliquam nulla. Integer non arcu erat. Etiam scelerisque sodales vestibulum. Sed luctus arcu eu leo consectetur, at porta arcu elementum. - -Morbi in eleifend neque. Quisque a blandit libero, dignissim porta tortor. Sed nunc metus, aliquam a elit et, sagittis dictum arcu. Vestibulum lacinia nisi quis luctus ultricies. Fusce erat eros, euismod sit amet luctus vel, tempor a nunc. Aliquam nec nulla id est molestie tincidunt ac sit amet arcu. Donec molestie laoreet sapien, sit amet vulputate turpis facilisis at. Nullam eget nisi vel nibh elementum euismod non tempus leo. Nulla suscipit consectetur ante, nec fringilla lectus porta ac. Proin nec odio in lacus suscipit lacinia et sagittis ante. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed rhoncus lacinia porttitor. Pellentesque sapien ipsum, sagittis posuere arcu ut, laoreet gravida elit. Aenean eu tortor sit amet massa tincidunt facilisis. Aenean congue eget orci vitae vestibulum. - -Nunc tempus augue rhoncus condimentum vehicula. Sed in dui sit amet arcu varius pellentesque quis cursus nisl. Proin faucibus erat id egestas suscipit. Nam accumsan in tellus nec elementum. Phasellus nunc orci, mattis nec sollicitudin ultrices, feugiat eu lectus. Morbi ullamcorper rutrum sapien non rhoncus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque orci sapien, fringilla et dictum sit amet, tristique vel arcu. Maecenas tempus porttitor mattis. Cras eget faucibus enim. - -Mauris ornare mattis tortor. Duis convallis a ipsum id cursus. Aenean viverra, eros pellentesque ullamcorper posuere, orci ligula luctus odio, vel rutrum ex lectus eu erat. Etiam mollis nulla orci, fringilla gravida mauris viverra eu. Sed et orci non purus ultricies elementum. Cras at lectus hendrerit, fringilla lacus nec, feugiat sem. Morbi in metus felis. Etiam tempor bibendum ex eu venenatis. - -Cras ac nibh condimentum, lacinia sem ut, pretium felis. Sed congue, mi at accumsan semper, felis lorem vestibulum nisl, ac commodo lorem eros at mi. Curabitur condimentum nunc justo. Nulla efficitur venenatis nibh sed finibus. Integer iaculis volutpat mi dictum bibendum. Nullam tempus id ante euismod placerat. In placerat auctor lacus ac molestie. Aenean ultricies egestas imperdiet. - -Ut interdum cursus accumsan. Aliquam a mi ligula. Nunc blandit, metus in pellentesque aliquet, velit libero aliquam quam, nec egestas est turpis at ante. Quisque et magna eget massa gravida suscipit. Ut in lectus a massa eleifend sagittis rhoncus faucibus lectus. Maecenas sit amet elit vel tellus varius feugiat ac ut diam. Ut iaculis non ante in molestie. Integer pulvinar vulputate velit, ornare dignissim sapien laoreet ut. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. - -Aliquam finibus tristique laoreet. Pellentesque et diam tincidunt orci hendrerit euismod. Phasellus viverra orci vitae interdum imperdiet. Phasellus gravida auctor nisi, vitae rhoncus est dignissim eget. Phasellus eu facilisis eros, vitae iaculis quam. In condimentum velit non iaculis porta. Proin ipsum ex, egestas nec molestie sit amet, vehicula sed ante. Proin eget eros at nibh sollicitudin luctus a id magna. Nam eget turpis finibus, tempor libero nec, auctor velit. Nunc neque magna, dictum vel semper nec, facilisis eu lectus. Maecenas maximus tortor eget ex dictum, sit amet lacinia quam tincidunt. Nulla ultrices, nunc ac porta feugiat, diam dolor aliquet sapien, sit amet dignissim purus ante in ipsum. Maecenas eget fringilla urna. Etiam posuere porttitor interdum. Vestibulum quam magna, finibus et urna auctor, pulvinar viverra mauris. Fusce sollicitudin ante erat. - -Maecenas pretium facilisis magna, at porttitor turpis egestas non. Morbi in suscipit felis. Duis eget vehicula velit, posuere sodales lorem. Curabitur elementum a lectus non ornare. Donec vel eros scelerisque ipsum iaculis accumsan. Phasellus tincidunt tincidunt lobortis. Vestibulum maximus risus tellus, eu faucibus urna tincidunt quis. Fusce dignissim lectus vel enim ultricies, in efficitur purus semper. Etiam sit amet velit pulvinar, hendrerit erat et, maximus eros. - -Maecenas iaculis convallis consectetur. Duis ante nulla, commodo sit amet diam sed, tempus mattis risus. Maecenas volutpat leo leo, in mollis eros mollis quis. Aenean sagittis, neque id mattis varius, tortor leo cursus ligula, a ultricies justo turpis ut libero. Ut sit amet nibh et erat pellentesque rhoncus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer rhoncus ligula nec iaculis faucibus. Curabitur tincidunt eu diam eget ultrices. - -Vestibulum quis nisl nec lacus commodo efficitur eu eleifend turpis. Etiam pretium id nisl a vehicula. Praesent elementum malesuada nisl. In condimentum interdum faucibus. In sed mauris vestibulum dui ultricies congue. Ut posuere mattis ante, in blandit mauris suscipit quis. Pellentesque ligula turpis, tincidunt a laoreet vel, consectetur in est. Nulla gravida ligula vel lectus faucibus accumsan. Praesent rhoncus eros arcu, id ultrices ipsum maximus ac. Mauris tincidunt cursus erat nec vulputate. Nulla tristique imperdiet eros vitae lobortis. Nullam a urna et sem condimentum blandit sed ut nulla. - -Maecenas auctor sodales facilisis. Pellentesque facilisis augue a odio varius suscipit. Etiam malesuada justo vel leo dignissim tincidunt. Sed magna metus, sagittis at diam gravida, dictum iaculis sem. Aliquam erat volutpat. Maecenas euismod egestas tortor non sollicitudin. Nulla quis odio tincidunt, auctor est sed, pretium turpis. Quisque aliquet semper magna, sit amet gravida enim luctus at. - -Nulla orci risus, ultrices a nunc et, dictum tincidunt lectus. Aliquam erat volutpat. Mauris at justo feugiat, efficitur lectus id, facilisis turpis. Sed ornare sodales fermentum. Suspendisse interdum tellus ac auctor sagittis. In auctor convallis metus non elementum. Mauris id dolor aliquam, euismod sapien id, tristique mi. Duis ac eleifend lectus. Etiam odio turpis, molestie vitae posuere vel, feugiat ac lorem. Fusce tempus ligula non hendrerit maximus. Nulla facilisi. Ut pretium turpis eget eros fringilla, vel aliquam mi pulvinar. - -Donec rhoncus augue ac viverra lacinia. Aliquam suscipit risus id sem varius, eget aliquet justo varius. Phasellus molestie, neque vitae semper posuere, est risus blandit ligula, id lacinia lectus orci id lectus. Cras vitae massa sit amet sapien pulvinar sollicitudin facilisis sed leo. Donec risus nulla, finibus id nulla quis, ornare sollicitudin neque. Curabitur id sapien vehicula, tempor velit sit amet, auctor augue. Nunc venenatis urna quis ante mollis bibendum. - -Pellentesque in varius massa. Donec non odio ultricies purus hendrerit fermentum. Aliquam quis elit vitae risus porttitor efficitur in vel sapien. Vestibulum sed urna sed lorem convallis bibendum nec non eros. Nullam molestie accumsan tincidunt. Aenean interdum sapien quis sapien dictum porttitor. Ut sit amet mollis magna, sed finibus urna. Etiam porta congue nunc eu aliquam. In congue mollis tincidunt. Nunc id metus ultricies, aliquam risus vel, sollicitudin dui. In nec felis consectetur, gravida dolor eu, consectetur lorem. Ut hendrerit, velit vitae malesuada placerat, felis metus vehicula odio, in iaculis ex tortor id metus. Donec mattis elit a est sollicitudin, in lacinia nisi gravida. Nullam ornare, tellus eget pharetra mollis, purus nisl condimentum sapien, vel ultricies enim libero ac ex. Fusce sed ligula a arcu lacinia tempor sit amet et magna. Maecenas fermentum nec diam in ornare. - -Cras pellentesque facilisis accumsan. Curabitur vehicula volutpat diam, vel tincidunt felis cursus sed. In malesuada leo et porta pulvinar. Integer at ultrices nunc, a tincidunt metus. Vivamus eu tellus vel lectus volutpat fringilla. Donec ut egestas est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce non hendrerit turpis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam in ipsum quis ipsum hendrerit egestas. Donec vitae lectus malesuada, consequat enim et, lobortis velit. Vestibulum nec augue ex. Nullam ut porta lacus. Morbi pellentesque gravida purus, a interdum felis. Nulla lacus libero, euismod quis posuere in, congue pretium ipsum. Aliquam at suscipit nisi. - -Sed et venenatis purus, at maximus dolor. Fusce varius eget turpis ac sodales. Nullam sed mauris quis diam hendrerit dapibus consectetur eget dolor. Suspendisse maximus ac velit quis condimentum. Praesent ac mattis mauris. Morbi aliquet dignissim sem, sed mattis enim vestibulum vitae. Morbi sed dui in sapien elementum ullamcorper. Proin feugiat viverra ipsum et commodo. Nam pellentesque turpis nec condimentum aliquam. - -Praesent luctus elit sit amet est fermentum, nec egestas lectus scelerisque. Proin ornare mi eu turpis sodales, at vestibulum magna placerat. Suspendisse potenti. Nulla vel elit semper, blandit nunc vel, ullamcorper turpis. Morbi eu posuere sapien, ac iaculis tellus. Etiam tincidunt nunc vitae cursus faucibus. Phasellus rhoncus sollicitudin metus, id lobortis mi iaculis nec. Donec elementum venenatis purus at commodo. Aenean egestas facilisis metus, quis posuere nisi fringilla aliquam. Fusce ac porta nibh. Aliquam hendrerit lectus magna, at auctor felis viverra a. Integer elementum posuere nunc a fringilla. - -Nunc metus lectus, molestie nec tincidunt at, facilisis id enim. Aenean nulla quam, convallis non lectus vehicula, dignissim interdum velit. Ut vestibulum finibus mauris. Vivamus sed euismod elit, ut pulvinar dolor. Suspendisse dictum viverra pharetra. Curabitur non erat finibus orci sodales pulvinar. Sed at consectetur quam, ut commodo lacus. Suspendisse mollis convallis lorem, nec venenatis nunc lacinia a. Proin in est dui. Nunc nec lacus lectus. Aenean faucibus dui ornare magna varius fermentum. Aenean eu justo pulvinar libero rhoncus sollicitudin at et nunc. Integer sit amet mauris hendrerit, fringilla magna quis, tincidunt nunc. Fusce sit amet aliquam leo, pretium fermentum nisl. Vestibulum hendrerit tempus suscipit. - -Pellentesque et augue varius, aliquam justo vel, sagittis erat. Suspendisse tincidunt maximus velit, porttitor interdum ligula elementum vel. Nunc a dictum lectus, gravida tristique magna. Quisque id risus arcu. Vestibulum porta in mi sed finibus. Nam tristique in mauris nec gravida. Vivamus arcu sem, fringilla ac purus eget, vestibulum posuere arcu. Integer aliquet elit a est scelerisque pharetra vel sit amet augue. Sed quis finibus nunc, non ornare felis. Suspendisse potenti. Maecenas sollicitudin eros urna, vel bibendum mi sollicitudin facilisis. Nam elementum ligula non augue accumsan, ut laoreet tellus ultricies. Nunc in pellentesque quam. Proin eu varius lectus. Donec gravida massa non rhoncus dignissim. Sed est sapien, vestibulum ac egestas nec, posuere id metus. - -Phasellus quis interdum felis. Pellentesque ac elementum lacus. Proin posuere tempor ante, et consectetur nulla convallis ut. Etiam porta sem orci, eget convallis risus hendrerit in. Mauris gravida libero id tincidunt lacinia. Donec tempus ultrices ipsum, vitae finibus velit. Sed consectetur dictum velit, in consequat dolor fermentum eget. Pellentesque porttitor tellus velit, quis dignissim purus imperdiet et. Phasellus leo lectus, mollis nec ultricies ut, placerat ut quam. Integer imperdiet mauris sed magna gravida accumsan. Nulla congue turpis at urna tincidunt, at tempus urna condimentum. Praesent ac nibh lectus. Pellentesque id odio at purus tincidunt mollis nec id massa. Nulla eget venenatis erat, ornare lobortis nulla. Fusce rhoncus metus turpis, at mattis magna blandit sed. Aliquam sed mattis massa, ut bibendum nisl. - -Mauris commodo vulputate nulla at sodales. Vivamus sagittis viverra ex, in scelerisque dui commodo in. Maecenas eget ante euismod, tristique tortor at, placerat turpis. Fusce hendrerit, orci et hendrerit tristique, turpis tortor hendrerit elit, vel dictum eros nisl vitae enim. Nullam et lacus velit. Donec rutrum tortor risus, eu volutpat lorem placerat tempor. Etiam rhoncus lorem quis turpis gravida placerat. Nam at magna efficitur, interdum mauris vel, tristique odio. Phasellus augue nisl, fermentum luctus sapien non, rhoncus convallis dui. Aenean nibh tellus, congue ut nulla eu, luctus lacinia est. Sed vel augue tellus. Ut congue sit amet risus ut consequat. Vestibulum id magna sed augue condimentum porttitor. In nec leo ac justo condimentum dignissim. Nullam eu gravida ipsum. - -Proin iaculis imperdiet nisl. Vestibulum at lectus bibendum ipsum mattis viverra. Suspendisse facilisis non nulla non dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce scelerisque turpis ante, tincidunt laoreet risus pharetra in. Nam nisi est, hendrerit in tincidunt sit amet, accumsan placerat odio. Vivamus nec egestas ligula. Nam sit amet dignissim nulla, sit amet lobortis ex. - -Etiam ac tellus lectus. Cras egestas urna id ornare vestibulum. Donec ut magna id velit finibus sagittis eget at nibh. Pellentesque tempus tempor justo, sit amet rutrum massa convallis eu. Ut lacus quam, sollicitudin vel consectetur vel, cursus eu velit. Sed aliquam ex a est lacinia pretium. Sed volutpat dui at iaculis accumsan. Nam feugiat libero a ante consectetur, nec maximus metus venenatis. - -Fusce in nunc lorem. Aliquam vel tincidunt nisl. Duis sed laoreet dui. Nam eu dapibus lacus. Nulla odio lectus, ornare sit amet leo sed, laoreet tempus massa. Curabitur venenatis ipsum vel turpis lacinia, sed euismod diam commodo. Etiam ac turpis cursus, auctor lectus eu, sodales ex. Ut eget dolor aliquet mauris maximus volutpat vitae ut lorem. Sed vulputate arcu ex, a porttitor risus porttitor vel. Duis sed accumsan purus. - -Pellentesque nisi est, scelerisque eu magna in, venenatis dapibus elit. Morbi porttitor, lectus dapibus dapibus sodales, mauris eros tristique metus, vitae porta tellus quam eu arcu. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam fringilla nibh sed fermentum vestibulum. Aliquam quis mollis elit. Etiam lobortis purus sed nunc pulvinar malesuada. Morbi varius mattis velit efficitur convallis. - -Pellentesque facilisis ante id metus porta, et tincidunt quam tristique. Proin non sem vel eros venenatis tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus sollicitudin non risus at mollis. Cras leo orci, tempus eget felis a, efficitur tincidunt massa. In quis augue tristique, condimentum nulla eget, vulputate sem. Sed purus neque, ultricies eu turpis facilisis, dignissim bibendum eros. Vivamus congue accumsan dui. Sed congue dolor ut nisl mattis laoreet eu eu purus. Mauris vehicula, quam vel feugiat imperdiet, libero nibh commodo mi, at ullamcorper nulla enim sed leo. In eget ante sit amet metus luctus vulputate non sed dolor. In sapien odio, egestas sit amet sapien quis, congue mattis ante. Quisque tempus ligula ut eleifend facilisis. Vivamus ornare suscipit laoreet. Nulla vitae placerat massa, interdum sollicitudin augue. - -Suspendisse potenti. Morbi sed scelerisque diam. Suspendisse vitae tortor arcu. Nullam a ligula condimentum, sollicitudin arcu et, fringilla elit. Vivamus dignissim gravida ornare. Etiam scelerisque ligula at est porta, in dignissim sem hendrerit. In ut mollis urna. Sed blandit purus at volutpat scelerisque. Nullam vel finibus odio. In eu neque eu ante pretium posuere. Nullam vitae accumsan neque. Nam nec elit dolor. Ut sit amet urna eros. Maecenas efficitur dui id tempor porta. Pellentesque et quam felis. - -Proin aliquet sem nec ipsum porta, eu tempus velit vestibulum. Nulla sed ligula sed metus sollicitudin porttitor. Fusce non posuere lacus. Phasellus luctus, eros quis rhoncus ultricies, arcu tellus rutrum tellus, eu vulputate orci ante vitae lorem. Maecenas porttitor mauris purus, ut eleifend metus sollicitudin sit amet. Curabitur ultricies erat id libero egestas, ut ullamcorper eros vehicula. Vestibulum lorem nibh, aliquam ut tincidunt elementum, tempor quis sem. Donec vehicula tempor eleifend. In hac habitasse platea dictumst. Nunc ut sem elementum, aliquam dolor sit amet, eleifend enim. In elementum viverra mi, eget pulvinar lorem fermentum non. Nam ac ligula vel dolor convallis pellentesque. In sed lectus sed arcu consequat finibus vel et ante. In iaculis id tellus in congue. Donec imperdiet lorem quis erat maximus, vitae molestie ex accumsan. Donec pharetra, orci ac rutrum pretium, nunc mauris vestibulum magna, sagittis consequat risus orci ut felis. - -Sed id metus eget odio suscipit efficitur id eget ligula. Phasellus massa metus, varius et metus quis, porta lobortis turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In in augue semper, consequat nunc at, tristique eros. Nullam vitae consectetur neque. Duis dignissim urna metus, vitae condimentum erat eleifend ac. In pellentesque nunc sed convallis sagittis. Integer venenatis, felis a mollis tristique, diam neque laoreet orci, ac varius diam ligula pulvinar augue. Nullam dapibus libero id est sollicitudin, non efficitur dui sollicitudin. Mauris sem diam, feugiat non ante elementum, eleifend lobortis urna. Nullam pharetra tristique diam in aliquam. Donec finibus sit amet lectus non auctor. - -Ut nibh tortor, sagittis ut sem eget, ultricies auctor enim. Cras malesuada ligula velit, sit amet consequat mauris interdum eget. Curabitur fermentum tristique magna facilisis ultricies. Sed quis porta arcu. Ut in nunc id velit egestas consectetur. Nulla fermentum porta nisi, vitae dapibus risus consectetur faucibus. Mauris quis magna aliquam libero dictum porta. Mauris sed iaculis turpis, non auctor turpis. Sed eget lorem ex. Sed pulvinar, mi ut rhoncus dapibus, est lorem maximus orci, ac tempor justo erat vel purus. Proin euismod turpis eu ex blandit semper. Nulla suscipit molestie ex sed auctor. In facilisis nisi convallis nulla rutrum bibendum. In aliquet leo eget quam auctor, at eleifend felis commodo. - -Vivamus at elit scelerisque, tristique mi non, ornare nisl. Integer posuere orci diam, sit amet malesuada nisl vestibulum ut. Sed convallis urna id arcu luctus, faucibus interdum urna varius. In hac habitasse platea dictumst. Mauris laoreet mauris vel nisi ultrices facilisis. Suspendisse mattis purus eu dui lobortis bibendum. Fusce cursus risus tellus, non fermentum lectus tristique sed. Curabitur ullamcorper tincidunt tortor vel blandit. Quisque at ligula ut sapien convallis tincidunt eu vitae dolor. Etiam consectetur lacinia sollicitudin. Sed sagittis dolor vel nulla congue mollis. In ut felis gravida, luctus massa sed, venenatis ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc facilisis lobortis dapibus. - -In a velit nibh. Nam mollis nunc sed faucibus eleifend. Sed maximus malesuada ultrices. Donec mattis finibus nunc, eu viverra massa egestas non. Donec arcu velit, sagittis et tempor mollis, malesuada in mi. Duis rhoncus suscipit lorem ac lobortis. Vestibulum malesuada nibh at nulla ornare, at pulvinar magna tincidunt. Ut tellus risus, commodo vitae fringilla nec, semper quis nulla. Suspendisse euismod eros vel leo commodo, ac sollicitudin velit porta. Donec non dolor blandit, tempor magna eu, suscipit risus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec libero nisl, auctor in rhoncus sed, viverra a arcu. Etiam diam ex, luctus non ultrices quis, viverra ut quam. Mauris lobortis suscipit quam, malesuada pretium nibh ultrices non. Suspendisse molestie, risus sit amet venenatis semper, justo justo tempor tortor, vel iaculis ligula dui sed erat. - -Donec odio ligula, aliquam id mollis eget, tincidunt nec arcu. Duis aliquam elementum facilisis. Vivamus lobortis fermentum egestas. Etiam ac orci sit amet dui dignissim condimentum. Maecenas magna arcu, mollis eget nisl a, vestibulum finibus lacus. Praesent et metus risus. Morbi semper neque vel erat fermentum, commodo posuere sem porta. Proin sit amet ipsum at lectus vestibulum luctus. Nullam convallis nulla ac pretium facilisis. Nunc porttitor convallis mi nec vestibulum. Phasellus vehicula vestibulum ornare. Curabitur commodo sapien quis vulputate egestas. Suspendisse potenti. Vestibulum quis mattis nisi. - -Maecenas mattis ex eget placerat aliquet. Pellentesque est nibh, ultrices eu laoreet in, interdum vitae nunc. Suspendisse sit amet metus hendrerit, fringilla quam at, mollis arcu. Nullam tempus metus volutpat felis fermentum, et accumsan nisl placerat. Maecenas pharetra feugiat eros sit amet consectetur. Donec vehicula tincidunt massa eu sagittis. Integer massa nisl, luctus quis nisi et, molestie cursus turpis. Aliquam congue ipsum eget turpis vehicula, commodo eleifend neque placerat. Nam vel consequat urna. In pellentesque lobortis tempus. Pellentesque pharetra, purus in pretium convallis, turpis orci maximus tortor, eu malesuada ex elit sit amet lorem. - -Curabitur sit amet aliquet quam, non aliquet tellus. Pellentesque nec ipsum dolor. Aliquam blandit gravida dolor vitae porta. Integer enim purus, scelerisque id molestie sed, accumsan vel nulla. Aenean vel ultricies urna. Nam consequat ipsum tempor mi placerat, id pretium dolor cursus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; - -Sed venenatis dui mauris, pellentesque varius magna malesuada blandit. Etiam sed tempor ipsum, id tincidunt nisl. Sed a felis mi. Nulla orci metus, auctor ac malesuada lobortis, facilisis vel nisl. Pellentesque at scelerisque est. Nulla vel mi ut magna commodo lobortis in ut diam. Etiam a lacus dui. Integer ut turpis arcu. In hac habitasse platea dictumst. Quisque porta neque at velit eleifend consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Nam pretium turpis a sem placerat, non mollis diam dictum. Sed at nulla purus. - -Sed auctor neque nec consectetur sollicitudin. Donec aliquam arcu id diam commodo posuere. Nulla nec accumsan ante, at fringilla ligula. Sed nisi libero, iaculis ut convallis nec, ultrices ac ex. Mauris aliquam mi nec ultricies porttitor. Mauris malesuada odio ut hendrerit tempus. Aliquam non aliquam dui. Nam mi mauris, volutpat in ligula vel, blandit iaculis lectus. - -Integer vel maximus massa, sit amet mollis nibh. Proin at aliquet sapien. Nullam a turpis id libero facilisis dignissim. Sed convallis nulla vitae turpis consectetur, eu pharetra libero posuere. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi venenatis massa id massa commodo suscipit. Cras magna lorem, porta eget velit at, vehicula semper velit. Maecenas cursus libero sit amet eleifend tempus. Suspendisse sed odio nisi. Suspendisse pulvinar felis semper magna hendrerit, ac posuere neque ullamcorper. Vivamus aliquam, elit id vulputate convallis, dolor lectus tempor nisi, id dapibus nulla eros in dui. Pellentesque ante libero, eleifend ac consequat vel, sodales in enim. Proin gravida sapien in nulla cursus, sagittis faucibus quam aliquam. Phasellus sit amet diam molestie, luctus urna eget, convallis elit. Nunc interdum erat fringilla, finibus neque quis, scelerisque justo. Donec interdum id risus at pharetra. - -Cras finibus magna turpis, sollicitudin viverra felis bibendum sagittis. Cras blandit facilisis euismod. Curabitur finibus enim gravida erat faucibus rhoncus. Aenean tempor elit vel sem ornare viverra. Ut at tortor nisl. Aenean in quam enim. Mauris pulvinar augue at nunc commodo, eget efficitur turpis laoreet. In vel fermentum nisi, eget porttitor diam. Mauris placerat eu ligula eu cursus. Curabitur ac tincidunt dolor, eu molestie est. Quisque ullamcorper vehicula faucibus. Phasellus euismod, arcu a scelerisque tempor, massa lectus ultricies velit, at mattis mauris mauris ultricies arcu. Proin condimentum ultrices nisl a rutrum. Proin bibendum sem quis accumsan fermentum. - -Integer sit amet velit sed urna rutrum molestie id non nunc. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus ac ornare dolor. Quisque ante massa, tincidunt eget iaculis sit amet, dapibus vitae arcu. Fusce sagittis leo eu varius egestas. Nam a ex non tellus vestibulum consequat sit amet ac est. Donec mi purus, varius non finibus sit amet, maximus ut mauris. Etiam a sapien lacinia, faucibus massa non, tempus libero. Aliquam ac lorem id purus vehicula consectetur quis non metus. - -Nam id imperdiet nulla, eu luctus sem. Nunc non risus vel quam dapibus porta. Aliquam laoreet dictum tristique. Curabitur et varius leo. Nulla hendrerit sem at tellus sodales, in porta nisl cursus. In et tincidunt tellus, vel commodo nulla. Etiam mattis dolor vestibulum libero aliquet, eget accumsan mi iaculis. Aenean in lacus congue, iaculis ipsum eu, condimentum ligula. Cras lorem leo, eleifend eget risus at, efficitur malesuada turpis. - -Suspendisse potenti. Pellentesque laoreet neque quis molestie finibus. Mauris id sapien in dui efficitur feugiat ut efficitur justo. Mauris quis faucibus ante. Suspendisse interdum sodales purus, sed semper ante venenatis vel. Aliquam rutrum, magna ut faucibus molestie, tortor ante iaculis nisi, in sollicitudin tellus arcu nec ex. Donec eu accumsan orci. - -Integer elementum metus rhoncus hendrerit molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Mauris efficitur ultricies orci eget vulputate. Etiam pharetra sem lacus, eu convallis lacus fringilla vitae. Nunc accumsan volutpat tincidunt. Nam non mauris pretium urna iaculis venenatis. Aenean tempor tortor a urna eleifend maximus. Donec ornare dui non ornare bibendum. Phasellus suscipit posuere lacus ac vestibulum. Pellentesque sit amet eleifend quam, fermentum pharetra diam. Vestibulum in porta sapien. Aenean in rhoncus dui. Quisque euismod, metus non luctus vulputate, sem diam maximus lorem, porttitor volutpat est justo sed sapien. Etiam maximus eros eu elit cursus elementum. - -Nunc ut aliquet dolor. Nam nunc nibh, consequat non mollis eget, dignissim a sapien. Aenean luctus suscipit massa id pharetra. Vestibulum eget velit vitae lectus porttitor blandit vitae eget odio. Pellentesque ullamcorper finibus massa at pretium. Nunc nec sapien at lacus vehicula dictum sed quis elit. In vitae sem urna. Sed porttitor sodales ante, ut varius justo blandit eu. - -Proin faucibus tempus velit, nec bibendum mauris bibendum vitae. Sed auctor, massa feugiat tristique iaculis, massa dolor accumsan eros, feugiat blandit odio diam ut purus. In at magna semper, mollis risus et, viverra lectus. Ut diam nibh, ultrices id tellus eget, venenatis auctor orci. Praesent eget semper orci. Proin vel nisl leo. Nulla sit amet mi quis eros feugiat rutrum sed vel dolor. Ut ullamcorper ultrices est vel tincidunt. Mauris a tortor nec nibh egestas interdum et quis lectus. Etiam vitae rhoncus tellus. Quisque facilisis odio at justo tempus consectetur. - -Duis vitae diam nec odio pulvinar eleifend. Suspendisse convallis lacus sit amet nunc elementum sodales. Integer commodo accumsan lacinia. Aliquam dapibus dolor dolor, a laoreet augue finibus et. Integer faucibus sapien ac interdum lobortis. Vestibulum blandit varius eleifend. Nunc id lobortis ipsum. Nunc porttitor et risus quis interdum. Integer ante lectus, cursus et urna tincidunt, fringilla varius arcu. In bibendum quis turpis efficitur laoreet. Etiam sollicitudin dictum diam, euismod luctus ante varius sed. Cras vel hendrerit risus. Morbi et leo fermentum, tincidunt ligula ultrices, tempus arcu. Quisque non arcu at mauris luctus tempus eu vitae erat. Morbi ut est ac orci vulputate tincidunt id ac lorem. - -Mauris et sodales tellus. Curabitur metus orci, fermentum sed est in, porttitor fermentum mauris. Aliquam mollis elit nulla, in varius lectus tempus eget. Sed lacinia tempus lacus, sed pulvinar nulla congue a. In a congue est, vitae egestas nisi. Aenean interdum, leo ac fermentum suscipit, sapien dui luctus diam, non iaculis massa felis id ligula. Sed euismod placerat nunc quis tempor. Sed eu leo luctus, pretium elit vitae, laoreet dolor. Mauris aliquet ac lectus malesuada sagittis. Suspendisse placerat tincidunt nisi, id semper urna consequat at. Suspendisse sollicitudin eu augue sit amet faucibus. Ut vitae justo sagittis, euismod tortor vitae, ullamcorper dolor. Suspendisse ultricies at enim ac congue. Curabitur auctor neque lectus, nec condimentum sem eleifend et. - -Nullam id sem in risus vulputate facilisis. Sed iaculis ante sit amet iaculis luctus. Suspendisse ut aliquet sapien, eget hendrerit nisi. Ut malesuada velit dui, a egestas odio dapibus a. Phasellus rutrum sit amet dui vulputate ultrices. Maecenas iaculis ex eu tortor lacinia, consequat maximus mi tempus. Vestibulum neque odio, accumsan eu ornare ut, elementum sed lacus. Nulla ipsum leo, consectetur in ullamcorper sit amet, volutpat sit amet nulla. - -Praesent tincidunt, justo et venenatis mattis, enim ex lobortis elit, ut tristique dui eros eu urna. Suspendisse sodales tellus quam, nec hendrerit sem mollis vel. Duis nunc nulla, mollis eu nisl et, sagittis volutpat sem. Fusce dolor turpis, dapibus quis sollicitudin in, semper vitae felis. Fusce id ante velit. Praesent ac ornare velit. Proin non erat quis neque accumsan iaculis. Donec faucibus orci at malesuada finibus. Nam venenatis tempus venenatis. - -Aenean vel risus ultricies, tempor augue id, pretium diam. Aenean at nunc orci. Cras sit amet tortor eget arcu efficitur vulputate. Phasellus sed quam diam. Proin enim felis, luctus nec orci a, porta blandit tellus. Nulla ac erat suscipit, sagittis enim rutrum, scelerisque mi. Nullam vestibulum luctus lectus at cursus. Morbi ut orci lorem. - -Sed est justo, placerat id rhoncus eget, finibus vitae lectus. Aliquam ultricies porta nulla, eget aliquet ligula placerat a. Nulla suscipit laoreet elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc a arcu id nisi tincidunt ultrices vitae pharetra nisl. Quisque facilisis at dui vel dignissim. Etiam imperdiet in libero non venenatis. Vivamus consectetur lectus non ultricies laoreet. Aenean vel laoreet lectus, et laoreet tellus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam ex arcu, consequat eu diam non, tristique faucibus purus. Duis nisi elit, bibendum quis lacinia ac, fermentum a lorem. Suspendisse molestie nulla sed velit accumsan lobortis. Aliquam erat volutpat. In pharetra ultricies urna aliquet congue. - -Quisque ante metus, maximus et dui eget, sollicitudin accumsan risus. Ut malesuada neque et ex facilisis, sed egestas augue pellentesque. Suspendisse potenti. Nunc sapien libero, maximus vitae purus eu, lobortis sagittis diam. Aliquam ultricies vehicula lorem, sit amet vehicula dolor venenatis vitae. Phasellus consequat nisi ut quam tincidunt, eu bibendum nisi bibendum. Vivamus a interdum sapien. Vestibulum interdum pharetra molestie. Sed facilisis dui non velit malesuada, semper rhoncus sapien volutpat. Etiam arcu nisl, dignissim sit amet purus non, tempus finibus orci. Pellentesque viverra faucibus enim, eget dignissim justo accumsan ac. Quisque pellentesque orci nisl, in vestibulum massa auctor a. - -Pellentesque condimentum odio in turpis mattis, ac blandit dui commodo. Sed consectetur purus sit amet quam dapibus placerat nec ut orci. Maecenas mollis ex in mi commodo sodales. Sed est enim, consequat dapibus convallis quis, iaculis non dolor. Donec sagittis fermentum velit ut convallis. Nunc accumsan mi vel enim consequat commodo. Nunc varius id massa nec consequat. Donec purus sem, pellentesque gravida mollis ac, convallis a tellus. Praesent convallis massa lacus, eget pellentesque neque sodales nec. Sed ut velit diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Suspendisse lacus erat, mattis eu tellus sit amet, vehicula bibendum mi. Nam aliquam, nisi dapibus condimentum congue, ante mauris bibendum turpis, a consequat risus arcu eget felis. Aenean dictum, nisi in facilisis sollicitudin, felis diam convallis magna, eu pulvinar nisl odio quis massa. Suspendisse imperdiet tincidunt tortor, sit amet dignissim augue eleifend a. Vivamus consequat mauris vel tellus ullamcorper, in mattis ex auctor. - -Donec eros nunc, maximus non faucibus id, malesuada nec dui. Mauris rutrum accumsan nisi, volutpat tristique justo vulputate posuere. Vestibulum iaculis neque ut sapien sagittis, et volutpat erat finibus. Maecenas volutpat varius orci, ac lobortis justo fermentum vel. Ut nec tortor non erat sagittis dignissim at sed nunc. Sed porttitor dapibus velit a pretium. Proin id placerat magna, fringilla volutpat diam. Cras non ipsum non est porttitor fringilla eget sit amet turpis. Vestibulum vel pharetra nulla. Praesent ultricies mi urna, eget aliquam augue feugiat eu. Aenean efficitur ex ut luctus facilisis. Fusce leo odio, suscipit eget est eget, pretium posuere mauris. Fusce vulputate est sed felis mattis, at sollicitudin magna consequat. Aliquam erat volutpat. Mauris tincidunt tristique diam id tincidunt. Aenean sagittis dictum risus. - -Nunc vehicula mattis justo at placerat. Duis ultrices metus urna, et mollis erat blandit non. Pellentesque tincidunt vitae mi eget placerat. Nullam at condimentum arcu. Vestibulum sit amet orci et metus fringilla pretium ac ut magna. Suspendisse vitae accumsan orci. Donec convallis nunc odio, tincidunt volutpat tellus placerat ac. Phasellus sed bibendum eros, a auctor quam. - -Etiam sagittis accumsan sem ut interdum. Nullam eleifend eget felis in convallis. Donec sagittis enim interdum, suscipit metus ut, cursus orci. Integer vitae dapibus enim. Integer venenatis ligula ut lacus pretium, a pharetra massa posuere. Vivamus eu volutpat ipsum. Mauris tempus volutpat aliquet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ac odio bibendum, dictum neque sed, sollicitudin nulla. - -Quisque vulputate at ligula ut placerat. Morbi mollis ante id felis tempus consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas eleifend odio a lectus sagittis, nec tristique ante egestas. Ut tempor, libero vel mattis interdum, risus quam condimentum turpis, nec viverra massa arcu ut turpis. Duis pharetra vehicula ligula, rhoncus commodo elit rutrum non. Nullam leo nisi, semper quis risus et, faucibus viverra odio. - -Quisque luctus nec arcu ut aliquam. Phasellus commodo ligula ut aliquet accumsan. Cras ac erat ac purus varius convallis. Vivamus nec gravida ipsum. Fusce euismod, massa ut cursus laoreet, eros urna semper odio, sed cursus turpis massa non lectus. Proin ac nisl lobortis, placerat elit in, placerat turpis. Nulla sollicitudin dolor ut sagittis consequat. Aenean augue felis, condimentum nec fermentum at, condimentum non nulla. Quisque et dignissim sapien, ac tincidunt elit. Nunc aliquet lacus id quam placerat suscipit. Mauris rutrum facilisis ipsum, at tristique mi. Sed iaculis eros sem, ut eleifend arcu hendrerit et. Sed euismod dignissim diam interdum ultrices. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed lobortis massa vel ultricies feugiat. Aenean non lobortis erat. - -Aenean commodo euismod massa vitae accumsan. Vivamus ac tristique mauris. Nunc hendrerit sapien a dictum scelerisque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque sit amet eleifend nulla, vel posuere lorem. Phasellus eu porta metus. Pellentesque eget sollicitudin dui, sed commodo magna. Integer tincidunt, diam vitae dapibus tincidunt, diam lorem rutrum erat, ut consequat ex metus sed leo. - -Suspendisse odio metus, suscipit at congue at, consectetur auctor justo. Integer vel rutrum lacus. Quisque a ullamcorper ligula, nec placerat arcu. Ut hendrerit orci sit amet leo pellentesque iaculis. Integer neque erat, dapibus vel pharetra ut, sagittis id diam. Duis eget ex felis. Donec eget odio in sem hendrerit varius. Sed malesuada euismod erat. Sed bibendum malesuada lacus at euismod. Ut ornare pretium imperdiet. Maecenas ut orci id massa lobortis pulvinar vitae et neque. Nullam iaculis dictum sagittis. Vivamus vel finibus libero, eget congue ligula. Etiam faucibus orci felis, eu accumsan enim sollicitudin at. Donec accumsan libero at pharetra malesuada. - -Nullam luctus, metus eu varius dignissim, lectus neque aliquet massa, nec pellentesque ligula ligula vel leo. Cras rutrum eleifend viverra. Sed lobortis eget erat tincidunt imperdiet. Nullam ac fringilla urna. Fusce pretium, lorem ac mollis semper, sem felis ornare odio, eget feugiat dolor orci ut dui. Curabitur ac odio mollis, convallis ex eget, hendrerit nulla. Nunc vel turpis nisl. Ut neque urna, fermentum interdum est non, lobortis luctus elit. Phasellus bibendum malesuada gravida. Phasellus lacinia scelerisque erat sit amet iaculis. Nulla in ultricies lectus. - -Praesent blandit ante congue urna eleifend porta. Nulla sagittis urna quis molestie viverra. Praesent in lorem porttitor, vestibulum orci hendrerit, faucibus enim. Donec sapien enim, porta at sapien eget, condimentum mattis dui. Aliquam rhoncus dui elit, non laoreet ex condimentum ut. Nam arcu sem, suscipit quis diam vel, pharetra bibendum ligula. Duis vel ipsum gravida libero iaculis feugiat. Aliquam congue augue mi, gravida dignissim ipsum commodo id. - -Suspendisse vel tincidunt odio. Donec quis hendrerit felis, sed sagittis mi. Cras ultricies justo et ligula dignissim, ac porta nisi maximus. Suspendisse vitae facilisis sapien, ut consequat lacus. Morbi dapibus in diam in tempus. Curabitur viverra leo libero, et molestie lacus interdum eu. Donec ut odio sit amet nisl viverra fermentum eget eget sem. Donec id ante consectetur, porta velit a, consectetur mauris. Donec imperdiet dolor turpis, at maximus purus volutpat ac. Ut hendrerit eros sit amet mi porttitor, nec ultrices purus posuere. Etiam elementum mauris ligula, nec viverra neque luctus quis. - -Donec ultrices lectus nec sollicitudin egestas. Mauris ac lacinia mauris. Proin accumsan leo et quam venenatis mattis. Pellentesque laoreet interdum feugiat. Phasellus arcu justo, blandit vel faucibus vel, maximus in sapien. Mauris semper, leo quis accumsan tristique, arcu massa tempus sapien, nec luctus turpis mi id enim. Donec egestas consectetur augue non viverra. Mauris pellentesque turpis non ante posuere, bibendum laoreet nunc semper. Aliquam accumsan semper nulla, sed tincidunt nulla pretium id. Mauris ut sapien vel felis pharetra congue. Curabitur ac euismod risus. - -Integer a lectus lorem. Phasellus a sodales odio. In consectetur bibendum ex eu blandit. Nam eu feugiat sapien, id efficitur orci. Quisque fermentum sem eget orci mattis tristique. Donec sit amet pharetra massa. Pellentesque molestie, neque a viverra dignissim, magna quam sagittis ligula, at tincidunt tellus risus quis enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent scelerisque faucibus nunc eget consequat. Fusce aliquet egestas eros quis auctor. - -Sed aliquam mauris non lacus rhoncus, id eleifend nunc ullamcorper. Nulla cursus erat non purus gravida, porta ultricies libero vestibulum. Nulla sagittis metus eleifend porttitor molestie. Suspendisse rutrum consequat ullamcorper. Ut pellentesque dolor eget gravida cursus. In posuere, ipsum nec pulvinar varius, massa odio aliquam mauris, vitae facilisis ligula orci quis augue. Pellentesque a tortor ultricies, ullamcorper libero ut, ullamcorper augue. Nullam id felis non dui viverra placerat id eu metus. Aenean ac dui condimentum, dapibus tellus non, blandit ex. Maecenas et odio vitae massa gravida consequat eu sed nunc. Nullam laoreet, nisi sed imperdiet laoreet, sapien nisl aliquam augue, vitae ornare velit ligula id neque. Ut tincidunt, lacus at porta ultricies, tellus felis fringilla dolor, tempus posuere nibh nisi eu felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; - -Proin ac nulla turpis. Aenean pretium congue viverra. Donec vitae sem venenatis, luctus lacus non, rhoncus purus. Etiam sit amet lorem consequat, mollis nibh quis, congue neque. Sed vulputate justo quis porttitor malesuada. Nullam id ex sit amet ante aliquet tincidunt. Praesent pretium maximus orci ut cursus. - -Mauris vitae aliquam magna. Sed quis ante cursus, dapibus risus vel, tristique nisi. Fusce suscipit porta quam, vel vestibulum ligula dapibus vel. Nunc consequat eu mi at aliquam. Donec sit amet dolor nulla. Praesent gravida tellus enim, in porttitor sem scelerisque vitae. Nullam consequat, nunc eu iaculis tempor, sem augue placerat ex, sed ultrices erat nisi a tellus. Nunc tortor nisl, feugiat lobortis rutrum ut, pharetra ac nulla. Donec eu tortor eros. Proin maximus nisl sit amet velit accumsan facilisis. Praesent posuere tristique faucibus. Vivamus nec hendrerit tellus, id vulputate eros. Aliquam a lacus efficitur, consectetur ipsum eu, ullamcorper ex. Aliquam erat volutpat. - -Vivamus ultrices scelerisque elit, ac ultrices erat consequat id. Sed ac aliquet nulla. Pellentesque vel justo magna. Suspendisse dictum, sem eget ullamcorper iaculis, sapien metus tristique mauris, et dictum elit eros sit amet ex. Mauris placerat odio eu ligula egestas sagittis. Integer vel turpis lacinia tortor molestie egestas et id dui. Donec porta interdum justo, ac ornare lacus dictum at. Quisque mollis, odio sed eleifend rhoncus, purus turpis fringilla quam, ac fermentum enim ante sed massa. - -Vestibulum neque ipsum, congue vel lacus et, faucibus mattis sem. Ut venenatis, tortor non tincidunt mollis, sapien leo suscipit dolor, posuere tristique libero massa eu augue. Donec eu luctus velit. Nulla egestas, tellus sed commodo gravida, metus nibh placerat sem, nec mollis nulla nunc id lorem. Nulla facilisi. Donec ut tincidunt sapien. Quisque dapibus convallis interdum. Nulla tempor malesuada turpis non vehicula. In nec tortor ultrices, vestibulum odio non, ultrices sapien. Pellentesque mattis feugiat arcu, id tincidunt leo malesuada at. Fusce vitae pretium ante. Pellentesque eu augue non lectus efficitur rutrum. Cras vitae nisl elementum, congue est eget, faucibus quam. Donec in dapibus metus. - -In imperdiet metus eget leo rhoncus, et pharetra dui laoreet. Morbi arcu augue, eleifend a est eget, gravida suscipit risus. Ut sodales ex vel eleifend bibendum. Nam varius nisl sit amet dolor porta pulvinar. Ut mollis purus sit amet tempus vulputate. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur a lacinia velit, in feugiat elit. Sed ut vestibulum lorem. Proin fermentum elit quis venenatis placerat. Cras sit amet congue tortor. Curabitur eget sapien massa. Suspendisse in turpis arcu. - -Quisque vitae risus scelerisque, rutrum tellus et, posuere massa. Vestibulum vitae rhoncus libero, vel ultrices elit. Vivamus nec ipsum ac urna tristique sollicitudin non nec tellus. Donec bibendum dui eget ipsum laoreet, sed tincidunt tellus laoreet. Proin in rhoncus nibh. Integer vel quam id felis interdum aliquet. Nulla tempus volutpat consequat. Suspendisse nec massa malesuada, finibus est non, eleifend odio. Aliquam libero turpis, consequat vel pellentesque vitae, laoreet vitae tellus. Donec finibus diam id accumsan luctus. - -Cras at lorem ligula. Praesent tincidunt justo eu purus suscipit ornare. Morbi malesuada dui non ligula congue, ac fringilla diam commodo. Proin vel arcu non tortor tempus lacinia eget ut arcu. Sed tristique lorem et purus tristique, nec ultrices tortor lacinia. Nunc id nibh id mauris volutpat rutrum at in nisl. Cras in cursus lectus, nec fermentum dolor. Morbi at tempus tortor. Aenean pulvinar ex erat, vitae aliquet nisl finibus at. Praesent pellentesque tempor imperdiet. Aliquam eu aliquet purus. Maecenas hendrerit volutpat ultrices. Aliquam metus tellus, porttitor sit amet sem ut, bibendum ultricies urna. - -Cras accumsan lacus ac ullamcorper tincidunt. Fusce imperdiet nunc vel diam condimentum, viverra dignissim magna mollis. Aliquam rutrum gravida libero non congue. Morbi pretium, nulla ac eleifend sodales, dolor orci feugiat ipsum, ut posuere dolor augue quis mauris. Cras tincidunt enim dui, at porta orci consectetur vel. In id purus ante. Donec luctus mattis dictum. Curabitur tortor orci, accumsan finibus sodales ac, maximus eget purus. Suspendisse efficitur vitae dui ut faucibus. Integer bibendum ipsum massa, sagittis posuere sapien elementum at. Vivamus tristique at quam id congue. Maecenas eu augue vel erat varius congue at id quam. - -Sed tristique nisl elit, finibus venenatis urna facilisis id. Integer cursus interdum justo, et viverra diam interdum quis. Sed in vestibulum arcu. Pellentesque elementum ex vitae diam tincidunt bibendum. Nunc eu mi suscipit, faucibus metus sit amet, tincidunt dolor. Integer vulputate sodales luctus. In ut scelerisque sem, sed egestas eros. Etiam lobortis diam ac augue pulvinar, eu aliquam massa blandit. - -In dui magna, faucibus at purus in, sagittis dapibus diam. Cras commodo massa tortor, eu consequat libero placerat eu. Ut mauris metus, facilisis et erat sed, rhoncus maximus nisl. Sed ac aliquet nisi. Aenean in rhoncus velit. Sed mollis, nunc vitae imperdiet pharetra, arcu ex pulvinar nibh, ac rhoncus lectus enim nec erat. Donec rutrum molestie nibh et lobortis. Proin nec nibh in ex pretium ultrices non et arcu. Nam consequat tempor viverra. Fusce vitae pharetra diam, ac bibendum ex. Quisque cursus, tellus ac interdum accumsan, lectus nunc lobortis elit, id varius orci diam a metus. Etiam at mauris vitae metus ullamcorper bibendum nec sed leo. Pellentesque eu arcu varius, imperdiet ligula non, maximus tellus. Aliquam erat volutpat. - -Curabitur fringilla ligula in consectetur varius. Donec eget tortor ex. Nunc quis lacus lobortis, vulputate lorem eu, scelerisque sapien. Aliquam non pretium ante. Aenean maximus ornare eros, ut condimentum nibh pulvinar eu. Morbi venenatis sollicitudin justo, non tincidunt ligula lacinia vitae. Nam vitae quam ligula. Fusce in finibus urna, a laoreet dui. Quisque urna arcu, aliquam sed dolor quis, pellentesque convallis risus. Vestibulum faucibus maximus justo, eget gravida elit tincidunt quis. Cras in arcu dui. Aliquam eu nibh gravida, lacinia ipsum sit amet, scelerisque nisl. Integer luctus sagittis mattis. Etiam dolor sapien, dapibus at neque nec, rhoncus scelerisque odio. Pellentesque laoreet justo ac augue eleifend placerat. In vitae hendrerit ex. - -Nam sit amet dui in libero volutpat lacinia. Quisque vel luctus purus. Aenean arcu magna, luctus sed interdum vitae, elementum quis eros. Mauris aliquet diam mi, ut tincidunt magna consequat quis. Cras vitae lacus posuere urna pretium lacinia. Fusce ultricies maximus hendrerit. Donec et augue quis lectus lacinia accumsan. Nunc tortor neque, vestibulum porta bibendum id, varius quis sapien. Vestibulum et ultricies odio, id pharetra lacus. Suspendisse sollicitudin nisl nec justo fermentum, vitae volutpat lectus aliquam. Duis blandit quam at erat sodales, ut suscipit erat aliquet. Fusce faucibus dui enim, eu varius neque imperdiet id. Vestibulum dapibus neque libero, vitae viverra erat mattis id. Quisque ullamcorper diam ut porta finibus. Donec faucibus, diam quis pellentesque euismod, enim velit mattis justo, at ultricies urna enim ac leo. - -Fusce fringilla dolor sit amet ante pharetra ornare. Aliquam erat volutpat. Donec laoreet, lorem nec pulvinar ullamcorper, urna justo bibendum nunc, in laoreet nisl tortor vel justo. Donec a magna molestie, gravida tortor a, malesuada tortor. Praesent vestibulum ultricies metus, vitae fringilla tellus viverra sed. Suspendisse sed odio sit amet nibh ultricies interdum accumsan egestas ex. Fusce ac lacus arcu. Ut ultricies at justo elementum mattis. Nullam augue tortor, lacinia tempor turpis a, porta finibus neque. Donec id diam tristique arcu vestibulum fermentum vitae id tellus. Vestibulum sit amet ligula neque. Aliquam neque ante, ultricies nec diam malesuada, feugiat consequat risus. Pellentesque ac varius orci. - -Etiam nunc ex, laoreet eget eros ut, ultricies fermentum sem. Nullam venenatis diam a lectus vulputate luctus. Integer laoreet libero et tellus fermentum, ut maximus neque tristique. Ut in odio posuere, lobortis augue non, tristique orci. Quisque vel ultricies mauris, non consectetur enim. Sed dictum vitae felis vel scelerisque. Vestibulum id viverra leo. Etiam libero neque, cursus eu augue eget, fringilla luctus arcu. Donec aliquet maximus ipsum, ut faucibus velit posuere non. Praesent finibus erat nec massa cursus, ac blandit ante bibendum. Ut vel magna pretium, interdum quam non, sodales erat. - -Sed et orci nunc. Vestibulum elit sem, dapibus id dictum eu, interdum sit amet justo. Morbi interdum hendrerit tempus. Quisque id magna justo. Donec sollicitudin, nunc a efficitur hendrerit, mi neque semper nisl, sed consectetur urna justo vel velit. Nullam at sodales eros. Donec eu nunc vel dui tristique blandit ut eget enim. - -Nulla velit neque, euismod vitae lectus vel, finibus egestas magna. Ut sed justo sed erat pretium sollicitudin nec nec felis. In mattis augue ut erat mollis, in posuere purus tincidunt. Vivamus rhoncus sem at purus gravida, et vestibulum justo elementum. Aenean sit amet elit ac ligula tincidunt varius. Donec feugiat, orci vel interdum lobortis, elit magna fringilla nulla, non euismod urna dolor auctor est. Mauris laoreet sagittis ligula, et semper nisi finibus et. Donec pharetra nibh in eros iaculis aliquam. Nam malesuada ornare elit, ac semper massa molestie sed. Maecenas laoreet diam eu ipsum rutrum, ut varius enim bibendum. Donec luctus dolor eu ipsum varius, malesuada condimentum sapien tempor. - -Aenean vel rhoncus lacus, sit amet faucibus nisl. Aliquam laoreet nisl et diam eleifend molestie non vel lectus. Duis tortor augue, congue luctus malesuada sit amet, posuere mattis mauris. Aliquam quis ligula ut ipsum placerat luctus. Aliquam accumsan mauris ligula. Sed quis lacinia augue. Proin feugiat diam lectus, vel elementum libero varius non. Proin porta neque sed dolor gravida venenatis. Donec vitae euismod nibh. Morbi mattis, enim quis mattis dignissim, lacus tellus tristique nisl, in luctus leo nisl vel elit. Sed posuere justo in iaculis mattis. - -Curabitur in felis et metus blandit auctor ac in nulla. Vestibulum dictum nulla posuere augue ultrices, non gravida velit placerat. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In malesuada pharetra ante sit amet sodales. Suspendisse et tincidunt lorem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer viverra justo ut nisi elementum dictum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nullam dictum tincidunt venenatis. Aliquam neque urna, pellentesque vitae ultrices eget, lobortis sed augue. Etiam at ex ultricies, egestas dui sit amet, laoreet lorem. Ut nulla velit, bibendum in arcu sed, dignissim mattis odio. Suspendisse varius dictum vulputate. Sed nisl tellus, eleifend quis augue ac, malesuada elementum arcu. - -Morbi dignissim laoreet imperdiet. Vivamus tincidunt turpis quis posuere mattis. Nam mollis, elit eget lacinia auctor, lorem magna mattis elit, eget pulvinar mauris quam sed turpis. Suspendisse nibh libero, volutpat nec metus tempus, euismod lobortis sapien. Pellentesque interdum urna a leo dignissim lobortis. Suspendisse quis diam pretium, vehicula augue eget, sodales nibh. Cras dignissim lorem ac velit mollis, ac hendrerit urna varius. Fusce venenatis elit ut mauris volutpat, sed imperdiet arcu pellentesque. - -Phasellus auctor nec ex eu tempor. Quisque ut elit eget ligula euismod pretium. Quisque ac lectus et est fringilla convallis. Mauris tincidunt turpis non ullamcorper suscipit. Suspendisse consectetur lacus at lacinia iaculis. Morbi purus metus, tincidunt ac ultricies a, rhoncus varius magna. Suspendisse mattis vehicula enim at ultrices. Phasellus eu ipsum nisi. Duis dignissim massa non convallis rutrum. Sed placerat consectetur ex, quis malesuada lectus cursus a. Nulla non mi egestas, scelerisque urna vitae, pulvinar libero. Vestibulum pretium purus at odio pharetra, ut egestas nibh pretium. - -Nulla facilisi. Duis in augue eu elit accumsan imperdiet a a odio. Curabitur vitae ante in velit condimentum venenatis id vitae mi. Sed in ante fringilla, mollis metus vel, consectetur nisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla non dolor congue neque dapibus varius. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam sit amet convallis velit. Praesent a efficitur massa, non finibus ex. Maecenas pharetra elit eget sem rhoncus, vel mollis eros pretium. Donec vehicula dolor a nulla ornare, at lacinia ex venenatis. - -Suspendisse aliquam blandit est, rutrum luctus turpis cursus vitae. Pellentesque in magna eget risus egestas rhoncus. Maecenas sed odio non ex interdum eleifend mollis convallis neque. Quisque a orci fringilla, maximus arcu id, rhoncus magna. Aenean at aliquam est. Aenean faucibus consequat tempus. Aliquam congue viverra ante, non aliquet sapien viverra ac. Etiam ullamcorper neque in metus malesuada suscipit. Curabitur quis placerat mi. - -Integer at mauris ut lacus vulputate mattis sit amet at purus. Proin arcu nisl, lacinia eu venenatis ac, mattis ut velit. Suspendisse elementum mattis mauris, in faucibus lorem. Suspendisse bibendum nulla in commodo ultrices. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus iaculis volutpat mattis. Pellentesque ut ex interdum, consequat diam egestas, blandit nisi. - -Nullam odio turpis, pretium ac ante porttitor, fringilla lacinia ante. Fusce commodo quam vel dui blandit, nec eleifend tellus aliquam. Fusce sodales efficitur urna, vitae vehicula erat lacinia eu. Praesent maximus nunc id sapien feugiat, in euismod nibh rutrum. Vivamus at volutpat libero. Praesent quis mattis mi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In hac habitasse platea dictumst. Integer quam odio, pharetra nec molestie porttitor, auctor at ligula. Fusce id turpis non tellus facilisis tincidunt. - -Morbi lorem risus, sagittis sit amet venenatis sit amet, lacinia at dui. Vestibulum volutpat, urna ac ultrices efficitur, tortor augue convallis dolor, nec commodo arcu arcu id ante. Quisque facilisis mauris in molestie tincidunt. Fusce aliquet sagittis interdum. Vivamus sit amet odio nec augue volutpat placerat non nec nibh. Nunc auctor purus eu dignissim euismod. Ut sollicitudin urna et erat placerat, vel accumsan lectus malesuada. Proin fringilla magna sit amet massa dignissim lobortis ut ac felis. Donec ornare dignissim tristique. Phasellus semper, est sit amet vestibulum suscipit, arcu est elementum nulla, in sagittis sapien ligula a sem. - -Morbi at justo molestie, gravida lacus quis, placerat est. Mauris non libero ultricies, convallis dui et, scelerisque est. Nunc iaculis, libero sed ullamcorper feugiat, eros ante lacinia ex, vel efficitur velit arcu eu metus. Quisque fermentum blandit fermentum. Vestibulum quis ante in dolor porta efficitur eu nec libero. Mauris vitae ex mattis mi fringilla pharetra. Donec eget est nec lorem pretium pretium. Fusce eget risus eros. Vivamus eu nulla et libero tincidunt malesuada at ac dolor. Donec facilisis tempus sem, in posuere orci sagittis vel. Donec pellentesque sapien mi, eu tempus enim tempor vel. Cras consequat purus sed ornare vehicula. Nunc molestie eu ex et fermentum. In vestibulum, arcu nec cursus efficitur, leo ex fringilla neque, in molestie nisl diam mattis sapien. Nunc et semper ante. - -Sed pellentesque laoreet sollicitudin. Ut sed ex eu sapien bibendum posuere. Mauris non sem dui. Fusce sit amet nulla a tortor blandit blandit. Proin venenatis ligula quis sapien viverra accumsan. Proin ac turpis a dolor rhoncus facilisis eget vel ipsum. In gravida porttitor quam, quis dignissim lacus laoreet porta. Nulla ante risus, luctus at pharetra vitae, vehicula id elit. Etiam sagittis dui vitae metus mollis, in porttitor elit fringilla. Duis dapibus dignissim faucibus. Duis elementum facilisis leo eget ornare. Cras feugiat libero at efficitur tempus. Suspendisse sit amet laoreet nunc, at faucibus tellus. Vestibulum in ipsum ac risus vehicula porta. Fusce maximus libero mattis risus aliquam condimentum. Fusce ut consectetur risus, a fermentum arcu. - -Curabitur hendrerit eu lacus non congue. Fusce ac dictum magna. Nulla elit ante, sodales sed lobortis sodales, fermentum vitae urna. Cras pharetra vel sapien dignissim ullamcorper. Phasellus auctor elementum suscipit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec lacus odio, venenatis lobortis ullamcorper et, tempor nec augue. - -Mauris scelerisque vestibulum metus, vitae porta sem pharetra nec. Nam tempus dolor sed turpis lobortis sodales. Vestibulum nec mauris auctor velit pellentesque vestibulum tristique vel eros. Vivamus vel justo vel dui lobortis dapibus a at sapien. Maecenas ac metus nec tortor vulputate laoreet in nec augue. Aliquam tellus leo, imperdiet non dapibus a, facilisis non tellus. Suspendisse condimentum tincidunt lacus, ut scelerisque diam viverra nec. Etiam ante mauris, viverra sit amet vulputate ut, porta a ligula. Donec sit amet luctus massa. Morbi iaculis, tortor sit amet ullamcorper iaculis, mauris augue feugiat risus, eu bibendum dui tellus nec purus. In gravida sodales egestas. Sed tincidunt pellentesque tincidunt. In non neque non erat mattis iaculis. Cras et ipsum justo. Phasellus ex elit, dictum ut nulla et, consectetur auctor lectus. - -Donec vitae velit nisi. Cras lobortis a nisi eu molestie. Nunc mattis arcu id neque aliquam, quis sollicitudin lectus lobortis. Donec nec convallis purus, eget sagittis sapien. Maecenas viverra ullamcorper quam in vehicula. Pellentesque imperdiet nisl in elit varius, eu fringilla orci ullamcorper. Donec blandit ultrices volutpat. Nulla nec tempor mi, ac finibus nisl. Phasellus et urna non lorem tincidunt pulvinar nec nec ligula. Ut hendrerit volutpat diam. Morbi vel sollicitudin libero, ac molestie purus. Nulla sit amet metus ut leo molestie faucibus. Nunc porttitor, est in pulvinar vestibulum, justo nibh placerat ipsum, at interdum metus mi vitae dui. Curabitur in egestas nunc. Ut malesuada ipsum sed velit rutrum accumsan ac in quam. - -Quisque ex est, fermentum vitae placerat sit amet, porta ac nulla. Morbi accumsan tellus quis dolor cursus, in elementum sapien condimentum. In non dui ultrices, sagittis dui quis, blandit nunc. Curabitur blandit justo sed tincidunt imperdiet. Sed a odio aliquet, gravida augue non, faucibus magna. Phasellus pulvinar volutpat sem, ut bibendum nibh semper eu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur at tellus in nulla vulputate feugiat vitae id dui. Suspendisse nec velit ac arcu fringilla venenatis. Duis urna massa, eleifend sit amet venenatis in, lobortis ac odio. Aliquam blandit vitae ipsum quis tempor. Curabitur a interdum sapien, vitae tempus arcu. Maecenas condimentum, justo vel rhoncus facilisis, lectus nisl commodo massa, eget maximus odio enim sit amet libero. Morbi at erat purus. Aenean dictum diam ut lorem venenatis consectetur. Praesent sit amet dolor eget lectus mollis tempus ac sit amet diam. - -Maecenas at convallis magna, nec iaculis metus. Quisque pulvinar ultricies vehicula. Aliquam quis tortor in elit semper tincidunt. Nullam aliquet ex dapibus lorem mattis gravida. Suspendisse volutpat, nibh sit amet efficitur egestas, lorem justo convallis enim, nec efficitur nunc mauris vel nisl. Sed condimentum ac justo sit amet accumsan. Suspendisse ultricies dolor nulla, at euismod nisl semper eu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. - -Donec hendrerit, ex non tincidunt molestie, lacus mauris euismod risus, vitae suscipit sem orci et risus. Donec sollicitudin eros non ante gravida aliquam. Etiam at augue risus. Mauris vitae ante ac eros sodales ornare non in enim. Fusce consequat tortor urna. Aenean condimentum neque quis viverra interdum. Aliquam ultricies convallis ipsum, nec lacinia massa bibendum nec. Suspendisse ac ultricies diam, sit amet mollis mi. Mauris at tincidunt elit. Morbi fringilla nisl ligula, nec scelerisque magna viverra non. Aliquam aliquam porttitor eros, cursus congue eros maximus vel. - -Pellentesque mattis sapien eu scelerisque feugiat. In hendrerit rutrum sem vel convallis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed varius velit et erat lacinia ornare ut sed nibh. Nam imperdiet hendrerit urna, ultricies dapibus elit blandit sit amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam porttitor, purus scelerisque ornare aliquam, massa nulla semper erat, sit amet cursus diam risus vitae mauris. Ut rhoncus pellentesque elementum. - -In a ipsum in dui venenatis scelerisque ut a ante. Quisque tincidunt turpis vitae arcu rhoncus, quis maximus nisl venenatis. Sed ac tortor et nibh aliquam posuere. Praesent ipsum tortor, scelerisque nec sem vitae, efficitur mollis lacus. Sed dui tellus, mattis eu turpis in, accumsan mattis elit. Donec eu nunc dolor. Ut ornare dui quis tortor hendrerit ornare. Sed finibus ornare nulla, vitae vehicula urna vestibulum at. Integer fermentum diam sit amet congue suscipit. Donec massa lectus, dignissim ut metus eu, vehicula dictum nisi. - -Phasellus ligula tortor, consequat a urna quis, interdum congue libero. Sed condimentum sapien sed gravida tristique. Suspendisse vel condimentum orci. Pellentesque pharetra hendrerit malesuada. Morbi commodo ut quam et iaculis. Ut finibus dapibus metus, ut varius orci dapibus non. Nunc efficitur efficitur ultricies. Sed laoreet quam vel volutpat laoreet. Nullam placerat suscipit neque at aliquet. Curabitur luctus nisi eget rutrum interdum. Nam lacinia turpis sed massa euismod tincidunt. Aenean odio nisi, hendrerit et lacus et, sodales mollis leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Donec posuere erat nibh, a tristique quam bibendum sed. - -Nulla vestibulum leo laoreet, mattis purus at, tempus dolor. Morbi nibh lacus, vehicula eu nibh vel, pellentesque pulvinar magna. Suspendisse urna lorem, pretium non lorem eu, maximus porttitor eros. Integer in purus consectetur, pretium massa ac, bibendum quam. Vivamus venenatis finibus feugiat. Donec ornare neque eu convallis varius. Nullam sodales, tortor id semper varius, nibh odio tincidunt mi, vitae gravida purus erat nec libero. Nam varius tincidunt maximus. Nunc quis metus a diam porta tincidunt ac quis ex. Nunc bibendum nisl tortor, interdum luctus augue suscipit et. Phasellus pretium egestas aliquam. Maecenas in libero enim. - -Duis lacinia dolor eu nunc viverra, quis blandit nunc posuere. Suspendisse ultricies ultrices tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin imperdiet finibus dui, sed vehicula ligula semper vitae. Vestibulum elementum a ante quis vestibulum. Integer sit amet ullamcorper sapien. Cras sapien odio, commodo at consequat non, auctor volutpat ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas ut congue urna, eu iaculis lectus. Curabitur consequat, lectus non pharetra ultricies, massa sapien pellentesque lectus, eu laoreet elit turpis et sapien. - -Pellentesque vel vehicula arcu. Proin aliquam hendrerit turpis aliquam ultrices. Nunc pellentesque urna tempor ipsum porta faucibus. Morbi lobortis quam eget lacus tempor, tempor commodo justo molestie. Suspendisse cursus turpis diam, eget pulvinar velit dignissim ut. Donec vulputate sodales justo ac hendrerit. Donec ultricies mauris id lorem bibendum pulvinar. In sed dictum ex. Phasellus sit amet lacus eget risus scelerisque congue id vitae ex. Vestibulum pellentesque rhoncus lacus, non lobortis dui faucibus non. Cras efficitur dictum rutrum. Pellentesque euismod id felis sit amet faucibus. Maecenas tristique urna ac mi tristique, ac varius ante cursus. - -Vestibulum eu mi sed felis consequat fermentum. Duis sit amet nulla a diam maximus tristique. Sed in turpis diam. Cras sodales egestas massa. Maecenas eget dui tellus. Quisque vulputate tellus sem, non dictum nisi feugiat eget. Suspendisse interdum urna id quam facilisis tristique. Proin dolor ex, vestibulum quis dui ac, dignissim blandit dolor. Sed nec interdum ante. Nullam fermentum iaculis augue ut sodales. Mauris dapibus interdum maximus. Aliquam laoreet nisl et tellus congue, nec molestie justo hendrerit. Suspendisse eros libero, semper a nulla a, placerat convallis leo. Ut ornare turpis velit, id ultrices nulla lobortis non. - -In hac habitasse platea dictumst. Etiam condimentum, nunc vitae faucibus mattis, diam neque accumsan urna, eu tincidunt augue odio sit amet metus. Quisque at mauris eget purus ultricies ultricies vel eget ligula. Phasellus tortor urna, vestibulum eget tincidunt ut, malesuada nec ligula. Phasellus congue dignissim erat ut lacinia. Duis massa lacus, placerat quis ipsum sit amet, maximus ornare velit. Nulla commodo, urna maximus vehicula suscipit, arcu elit commodo leo, ut luctus mauris ipsum sit amet turpis. Donec ornare dignissim tincidunt. Duis efficitur tristique eros, bibendum mattis lorem auctor sit amet. Donec fermentum imperdiet venenatis. Praesent scelerisque purus in scelerisque dignissim. Nulla eu rhoncus nisl. - -Integer quis orci in nisl egestas porta vel efficitur ligula. Sed urna nibh, efficitur ac odio eget, rhoncus viverra magna. Nunc at luctus velit. Nullam laoreet, diam non semper faucibus, purus nisl sagittis mauris, in fringilla dolor sapien et massa. Duis rhoncus lectus nibh, in molestie ante consequat vitae. Fusce a enim vel justo posuere tempor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque eget mi id nulla tristique pellentesque. Aenean lacinia metus lacus, eu viverra turpis interdum at. Aliquam ut convallis mauris. Donec scelerisque ex nulla, id convallis magna vehicula auctor. Maecenas aliquam, felis dapibus convallis congue, odio nisl accumsan dui, vel molestie ex massa quis metus. Vestibulum id vulputate justo. Sed aliquet, est quis varius scelerisque, erat lorem mattis lorem, in sollicitudin risus lorem a justo. Praesent fermentum posuere turpis, vitae fermentum velit rhoncus ut. - -Quisque pellentesque urna vehicula est vestibulum blandit. Donec molestie sagittis erat, sed interdum est dignissim a. Fusce accumsan orci mauris, quis feugiat sem consequat sit amet. Nulla ultricies euismod molestie. Proin eleifend sodales diam vitae facilisis. Nullam sit amet urna tortor. Sed laoreet sapien eu quam cursus eleifend. Praesent vulputate metus turpis, quis aliquam enim semper ut. Donec dignissim libero quis magna euismod faucibus. Nulla aliquam ante id enim consectetur placerat. - -Fusce ullamcorper tellus id pulvinar dignissim. Nam sagittis luctus ipsum, non dictum urna pulvinar quis. Nunc hendrerit quam eu dui egestas, vitae semper sem vestibulum. In efficitur ligula ante, nec faucibus libero tristique ac. Suspendisse potenti. Ut vestibulum massa erat. Proin ornare mi et est varius, in fringilla mi laoreet. Sed libero nisi, gravida sed felis sit amet, bibendum semper risus. Curabitur luctus nunc vulputate elementum cursus. - -Aliquam feugiat, est sed congue fermentum, nibh dolor suscipit nunc, sed porttitor velit dui quis eros. Nam aliquet neque sed faucibus sagittis. Ut iaculis dictum odio in vestibulum.` diff --git a/fileTransfer/params.go b/fileTransfer/params.go index b4988da4de909721cc81602f6f2c460aa513b5b7..f14a00005c3e74ec775373ec1899d026545d8290 100644 --- a/fileTransfer/params.go +++ b/fileTransfer/params.go @@ -9,7 +9,7 @@ package fileTransfer import ( "encoding/json" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "time" ) diff --git a/fileTransfer/params_test.go b/fileTransfer/params_test.go index 23e92d46a0bc98aa86034506cb9c25a3fa45b138..45665a71458cc9d1d908517ccf0eaa828609db96 100644 --- a/fileTransfer/params_test.go +++ b/fileTransfer/params_test.go @@ -9,7 +9,7 @@ package fileTransfer import ( "encoding/json" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "reflect" "testing" ) diff --git a/fileTransfer/partTracker.go b/fileTransfer/partTracker.go index 1d432c50fe5756b1a1ce7af3e9440888bcde2396..6dae85995a8ae309ca14cf8d835196d98c3ad585 100644 --- a/fileTransfer/partTracker.go +++ b/fileTransfer/partTracker.go @@ -8,7 +8,7 @@ package fileTransfer import ( - "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/storage/utility" ) // sentFilePartTracker contains utility.StateVector that tracks which parts have diff --git a/fileTransfer/processor.go b/fileTransfer/processor.go index adcf474a77ffebc499abbbceeb759ba0b909ca64..6d625a6216b7d951e3ebaa4b397a30d2525e16c4 100644 --- a/fileTransfer/processor.go +++ b/fileTransfer/processor.go @@ -11,11 +11,11 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/fileTransfer/store" - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/fileTransfer/store/fileMessage" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/fileTransfer/store" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/fileTransfer/store/fileMessage" "gitlab.com/elixxir/primitives/format" ) diff --git a/fileTransfer/send.go b/fileTransfer/send.go index e4a107f7b3e588318056706dc2b8f6dba9bf3d02..c3504c2ca53dc824a0be524fe8b453ba271c229f 100644 --- a/fileTransfer/send.go +++ b/fileTransfer/send.go @@ -10,11 +10,11 @@ package fileTransfer import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/fileTransfer/sentRoundTracker" - "gitlab.com/elixxir/client/fileTransfer/store" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/fileTransfer/sentRoundTracker" + "gitlab.com/elixxir/client/v4/fileTransfer/store" + "gitlab.com/elixxir/client/v4/stoppable" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" "strconv" @@ -50,6 +50,7 @@ const ( // startSendingWorkerPool initialises a worker pool of file part sending // threads. func (m *manager) startSendingWorkerPool(multiStop *stoppable.Multi) { + jww.INFO.Printf("[FT] Starting %d sending worker threads.", workerPoolThreads) // Set up cMix sending parameters m.params.Cmix.SendTimeout = m.params.SendTimeout m.params.Cmix.ExcludedRounds = @@ -70,6 +71,7 @@ func (m *manager) startSendingWorkerPool(multiStop *stoppable.Multi) { // sendingThread sends part packets that become available oin the send queue. func (m *manager) sendingThread(stop *stoppable.Single) { + jww.INFO.Printf("[FT] Starting sending worker thread %s.", stop.Name()) healthChan := make(chan bool, 10) healthChanID := m.cmix.AddHealthCallback(func(b bool) { healthChan <- b }) for { diff --git a/fileTransfer/store/cypher/manager.go b/fileTransfer/store/cypher/manager.go index 88d67d7c4488b2b0122ccb9808ed52e2a4fc97b0..0ccaa89388c42f09ede3d6b2da8175445016b1f8 100644 --- a/fileTransfer/store/cypher/manager.go +++ b/fileTransfer/store/cypher/manager.go @@ -9,8 +9,8 @@ package cypher import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/fileTransfer/store/cypher/manager_test.go b/fileTransfer/store/cypher/manager_test.go index f88bc48390f09fc22472529e972daebae5c63860..1646c0f74f8ac62a6cabbcc31c508348b9d038c0 100644 --- a/fileTransfer/store/cypher/manager_test.go +++ b/fileTransfer/store/cypher/manager_test.go @@ -9,8 +9,8 @@ package cypher import ( "fmt" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/store/part.go b/fileTransfer/store/part.go index 742d5a391c4b38ac2cfbb6998598d606ae0d1e50..0b1ba24de828a6511c930b7c66342a9de8b7fdb0 100644 --- a/fileTransfer/store/part.go +++ b/fileTransfer/store/part.go @@ -8,8 +8,8 @@ package store import ( - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/fileTransfer/store/fileMessage" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/fileTransfer/store/fileMessage" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/fileTransfer/store/part_test.go b/fileTransfer/store/part_test.go index 871e3d10bd9b6acdd5e5b0f122fae449e0326e50..1581bfbc24835fda3acfaf9fe3624fde5a13b6d6 100644 --- a/fileTransfer/store/part_test.go +++ b/fileTransfer/store/part_test.go @@ -9,7 +9,7 @@ package store import ( "bytes" - "gitlab.com/elixxir/client/fileTransfer/store/fileMessage" + "gitlab.com/elixxir/client/v4/fileTransfer/store/fileMessage" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/primitives/format" "testing" diff --git a/fileTransfer/store/received.go b/fileTransfer/store/received.go index 9cb666ac246350c5f9d1855181bb160db69db1cb..a62ce9acf7e6dfce7193f381345a0997ad61283a 100644 --- a/fileTransfer/store/received.go +++ b/fileTransfer/store/received.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/netTime" ) @@ -31,7 +31,7 @@ const ( errLoadReceived = "error loading received transfer list from storage: %+v" errUnmarshalReceived = "could not unmarshal received transfer list: %+v" warnLoadReceivedTransfer = "[FT] failed to load received transfer %d of %d with ID %s: %+v" - errLoadAllReceivedTransfer = "failed to load all %d transfers" + errLoadAllReceivedTransfer = "failed to load all %d received transfers" // Received.AddTransfer errAddExistingReceivedTransfer = "received transfer with ID %s already exists in map." @@ -84,7 +84,7 @@ func NewOrLoadReceived(kv *versioned.KV) (*Received, []*ReceivedTransfer, error) } // Return an error if all transfers failed to load - if errCount == len(tidList) { + if len(tidList) > 0 && errCount == len(tidList) { return nil, nil, errors.Errorf(errLoadAllReceivedTransfer, len(tidList)) } diff --git a/fileTransfer/store/receivedTransfer.go b/fileTransfer/store/receivedTransfer.go index 5ae7a07d52e1ecc73ba9fb6582ee2e3094730fcb..f6512ee44aea07cae3c6c2eb6d5af16804a01bf7 100644 --- a/fileTransfer/store/receivedTransfer.go +++ b/fileTransfer/store/receivedTransfer.go @@ -13,9 +13,9 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/netTime" "strconv" diff --git a/fileTransfer/store/receivedTransfer_test.go b/fileTransfer/store/receivedTransfer_test.go index b68e0b071480d9e84569c745a0024e42d07838b8..b04cbe1b06a7db887ad545bc9c1bcbc21aae9061 100644 --- a/fileTransfer/store/receivedTransfer_test.go +++ b/fileTransfer/store/receivedTransfer_test.go @@ -10,9 +10,9 @@ package store import ( "bytes" "fmt" - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/store/received_test.go b/fileTransfer/store/received_test.go index 11d34d143c76e42507e1b8c709a9a7e96140ea4f..4e75c30bf37f12051457ce77ed35c6dfed3dfc4c 100644 --- a/fileTransfer/store/received_test.go +++ b/fileTransfer/store/received_test.go @@ -10,7 +10,7 @@ package store import ( "bytes" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/store/sent.go b/fileTransfer/store/sent.go index a7f89a598dd79ec14b421b0101d0dae5ab7e05cf..02cef8801bbe7e4ac0916cc1c890d94553ed65cf 100644 --- a/fileTransfer/store/sent.go +++ b/fileTransfer/store/sent.go @@ -11,7 +11,7 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -31,7 +31,7 @@ const ( errLoadSent = "error loading sent transfer list from storage: %+v" errUnmarshalSent = "could not unmarshal sent transfer list: %+v" warnLoadSentTransfer = "[FT] Failed to load sent transfer %d of %d with ID %s: %+v" - errLoadAllSentTransfer = "failed to load all %d transfers" + errLoadAllSentTransfer = "failed to load all %d sent transfers" // Sent.AddTransfer errAddExistingSentTransfer = "sent transfer with ID %s already exists in map." @@ -91,7 +91,7 @@ func NewOrLoadSent(kv *versioned.KV) (*Sent, []Part, error) { } // Return an error if all transfers failed to load - if errCount == len(tidList) { + if len(tidList) > 0 && errCount == len(tidList) { return nil, nil, errors.Errorf(errLoadAllSentTransfer, len(tidList)) } diff --git a/fileTransfer/store/sentTransfer.go b/fileTransfer/store/sentTransfer.go index 39e826ccb7bd3c4f47e4c9c7fbc436fdc8cc46e7..7b3742718684aef522b0d028b4375e9efacc58c0 100644 --- a/fileTransfer/store/sentTransfer.go +++ b/fileTransfer/store/sentTransfer.go @@ -12,9 +12,9 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/fileTransfer/store/sentTransfer_test.go b/fileTransfer/store/sentTransfer_test.go index 20f1428a57759e94f86c22e811f25b2c4dfd5eff..c2f4896065dc63abca74d7da88100ada823c7fdd 100644 --- a/fileTransfer/store/sentTransfer_test.go +++ b/fileTransfer/store/sentTransfer_test.go @@ -10,10 +10,10 @@ package store import ( "bytes" "fmt" - "gitlab.com/elixxir/client/fileTransfer/store/cypher" - "gitlab.com/elixxir/client/fileTransfer/store/fileMessage" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/fileTransfer/store/cypher" + "gitlab.com/elixxir/client/v4/fileTransfer/store/fileMessage" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" diff --git a/fileTransfer/store/sent_test.go b/fileTransfer/store/sent_test.go index f397569ee119526b5536a82f8c4d3efbd0d024ab..79031b8073f14742bb512beee40b92ae1c939d15 100644 --- a/fileTransfer/store/sent_test.go +++ b/fileTransfer/store/sent_test.go @@ -10,7 +10,7 @@ package store import ( "bytes" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" diff --git a/fileTransfer/utils_test.go b/fileTransfer/utils_test.go index 6eb83a34d60fe5ff6c37cf08f2587ef9c04bf731..275d829ed67acf41a3dc4d925cebddfd738e568b 100644 --- a/fileTransfer/utils_test.go +++ b/fileTransfer/utils_test.go @@ -11,18 +11,18 @@ import ( "bytes" "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - userStorage "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + userStorage "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/go.mod b/go.mod index 745e14f8604de97de58b4f7442588b0d5175e687..fd5943de3d5c235a3b45e0bbfcb71215dc5d4eb4 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ -module gitlab.com/elixxir/client +module gitlab.com/elixxir/client/v4 -go 1.17 +go 1.19 require ( github.com/cloudflare/circl v1.2.0 @@ -14,13 +14,13 @@ require ( github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f - gitlab.com/elixxir/comms v0.0.4-0.20221028214815-365171b3cb36 - gitlab.com/elixxir/crypto v0.0.7-0.20221028214442-29091a3c04b1 + gitlab.com/elixxir/comms v0.0.4-0.20221110181420-84bca6216fe4 + gitlab.com/elixxir/crypto v0.0.7-0.20221110181326-dd7e5293feb0 gitlab.com/elixxir/ekv v0.2.1 - gitlab.com/elixxir/primitives v0.0.3-0.20221025020430-f5d2eb330fbc - gitlab.com/xx_network/comms v0.0.4-0.20221027213956-c8a8cf68ee4f - gitlab.com/xx_network/crypto v0.0.5-0.20221025020316-517fa8f91d2c - gitlab.com/xx_network/primitives v0.0.4-0.20221025020003-cbec15a71b8f + gitlab.com/elixxir/primitives v0.0.3-0.20221110181119-e83320a48b13 + gitlab.com/xx_network/comms v0.0.4-0.20221110181111-4f0694876936 + gitlab.com/xx_network/crypto v0.0.5-0.20221110181048-76f0c556fe95 + gitlab.com/xx_network/primitives v0.0.4-0.20221110180011-fd6ea3058225 go.uber.org/ratelimit v0.2.0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c @@ -29,7 +29,7 @@ require ( ) require ( - git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221027213839-7343cd399f14 // indirect + git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221102223039-dc1f37d94e70 // indirect github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect github.com/badoux/checkmail v1.2.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect diff --git a/go.sum b/go.sum index 8bd0da9fd713fcdc3fa1c9f1b26bb121470bb719..596ea41c2d698b7e9a88be3db73804fc9dc9e7e9 100644 --- a/go.sum +++ b/go.sum @@ -17,32 +17,14 @@ 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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 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= @@ -54,13 +36,11 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX 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= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221027213839-7343cd399f14 h1:D2yUHVsLgCmHrWA7yDTw9+VhQGWsG8+MOuaxU+TVrho= -git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221027213839-7343cd399f14/go.mod h1:uFKw2wmgtlYMdiIm08dM0Vj4XvX9ZKVCj71c8O7SAPo= +git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221102223039-dc1f37d94e70 h1:p24wUpzdil0wgyFerGJM69fD5Xz9hsBDBK8f9m01pq8= +git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221102223039-dc1f37d94e70/go.mod h1:uFKw2wmgtlYMdiIm08dM0Vj4XvX9ZKVCj71c8O7SAPo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= @@ -72,14 +52,11 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -90,47 +67,32 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwesterb/go-ristretto v1.2.1/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cloudflare/circl v1.2.0 h1:NheeISPSUcYftKlfrLuOo4T62FkmD4t4jviLfFFYaec= github.com/cloudflare/circl v1.2.0/go.mod h1:Ch2UgYr6ti2KTtlejELlROl0YIYj7SLjAC8M+INXlMk= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -138,7 +100,6 @@ github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -151,20 +112,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -178,7 +131,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -197,12 +149,10 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -210,7 +160,6 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -218,8 +167,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -235,11 +182,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -250,18 +195,13 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 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= @@ -272,21 +212,11 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -300,51 +230,32 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/improbable-eng/grpc-web v0.12.0/go.mod h1:6hRR09jOEG81ADP5wCQju1z71g6OL4eEvELdran/3cs= -github.com/improbable-eng/grpc-web v0.14.1/go.mod h1:zEjGHa8DAlkoOXmswrNvhUGEYQA9UI7DhrGeHR1DMGU= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -358,22 +269,17 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7 h1:0hzRabrMN4tSTvMfnL3SCv1ZGeAP23ynzodBgaHeMeg= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= @@ -382,53 +288,29 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/ktr0731/dept v0.1.3/go.mod h1:b1EtCEjbjGShAfhZue+BrFKTG7sQmK7aSD7Q6VcGvO0= -github.com/ktr0731/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:ZWayuE/hCzOD96CJizvcYnqrbmTC7RAG332yNtlKj6w= -github.com/ktr0731/grpc-test v0.1.4/go.mod h1:v47616grayBYXQveGWxO3OwjLB3nEEnHsZuMTc73FM0= github.com/ktr0731/grpc-test v0.1.12 h1:Yha+zH2hB48huOfbsEMfyG7FeHCrVWq4fYmHfr3iH3U= -github.com/ktr0731/grpc-test v0.1.12/go.mod h1:AP4+ZrqSzdDaUNhAsp2fye06MXO2fdYY6YQJifb588M= github.com/ktr0731/grpc-web-go-client v0.2.8 h1:nUf9p+YWirmFwmH0mwtAWhuXvzovc+/3C/eAY2Fshnk= -github.com/ktr0731/grpc-web-go-client v0.2.8/go.mod h1:1Iac8gFJvC/DRfZoGnFZsfEbEq/wQFK+2Ve1o3pHkCQ= -github.com/ktr0731/modfile v1.11.2/go.mod h1:LzNwnHJWHbuDh3BO17lIqzqDldXqGu1HCydWH3SinE0= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea h1:uyJ13zfy6l79CM3HnVhDalIyZ4RJAyVfDrbnfFeJoC4= -github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea/go.mod h1:w4pGU9PkiX2hAWyF0yuHEHmYTQFAd6WHzp6+IY7JVjE= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -437,20 +319,14 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -464,7 +340,6 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -482,11 +357,9 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -503,14 +376,11 @@ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qR github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -520,31 +390,24 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rakyll/statik v0.1.6/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sethvargo/go-diceware v0.3.0 h1:UVVEfmN/uF50JfWAN7nbY6CiAlp5xeSx+5U0lWKkMCQ= @@ -562,9 +425,6 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -595,7 +455,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -603,7 +462,6 @@ github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w= github.com/ttacon/libphonenumber v1.2.1 h1:fzOfY5zUADkCkbIafAed11gL1sW+bJ26p6zWLBMElR4= github.com/ttacon/libphonenumber v1.2.1/go.mod h1:E0TpmdVMq5dyVlQ7oenAkhsLu86OkUl+yR4OAxyEg/M= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -617,54 +475,46 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeebo/assert v0.0.0-20181109011804-10f827ce2ed6/go.mod h1:yssERNPivllc1yU3BvpjYI5BUW+zglcz6QWqeVRL5t0= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/blake3 v0.0.4/go.mod h1:YOZo8A49yNqM0X/Y+JmDUZshJWLt1laHsNSn5ny2i34= -github.com/zeebo/blake3 v0.1.1/go.mod h1:G9pM4qQwjRzF1/v7+vabMj/c5mWpGZ2Wzo3Eb4z0pb4= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= -github.com/zeebo/pcg v0.0.0-20181207190024-3cdc6b625a05/go.mod h1:Gr+78ptB0MwXxm//LBaEvBiaXY7hXJ6KGe2V32X2F6E= -github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwAhDYlSnxPRbgor6JWoOt1Z7s3z1O9JR40= gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k= -gitlab.com/elixxir/comms v0.0.4-0.20221028214815-365171b3cb36 h1:ej6jwRfVHCLce0DscCfvxLNxY3YY5O7SUcsppYuJ3Jw= -gitlab.com/elixxir/comms v0.0.4-0.20221028214815-365171b3cb36/go.mod h1:GdU1wB0oM2A0nnN+yL09/o6vifoBBmlMggjDbzJG+Ck= -gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= -gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= -gitlab.com/elixxir/crypto v0.0.7-0.20221028214442-29091a3c04b1 h1:a4hhtw6ZUQD1iCSJepvCTrjn0LQtcrwtxLWl8TQm72k= -gitlab.com/elixxir/crypto v0.0.7-0.20221028214442-29091a3c04b1/go.mod h1:NImDa7951+jSolkYN/BBUm6qG6f+k0hsFZOCIxBlLhE= +gitlab.com/elixxir/comms v0.0.4-0.20221108183306-7c473bca3cd6 h1:9oxGMvOC8UPG5ocBlEjZjKBA2X2P9dpwyd48ywL+Uyk= +gitlab.com/elixxir/comms v0.0.4-0.20221108183306-7c473bca3cd6/go.mod h1:fWr0w/UMT/A7aw+Fw7y9kOOTqE3aYxwo5cl6obrysHM= +gitlab.com/elixxir/comms v0.0.4-0.20221110181420-84bca6216fe4 h1:bLRjVCyMVde4n2hTVgoyyIAWrKI4CevpChchkPeb6A0= +gitlab.com/elixxir/comms v0.0.4-0.20221110181420-84bca6216fe4/go.mod h1:XhI2/CMng+xcH3mAs+1aPz29PSNu1079XMJ8V+xxihw= +gitlab.com/elixxir/crypto v0.0.7-0.20221108183134-3f4a29c68e97 h1:xZFh1e1vq/j1DF61Bta3Wb4ePcCS+NHyk3ri3VcMOuk= +gitlab.com/elixxir/crypto v0.0.7-0.20221108183134-3f4a29c68e97/go.mod h1:fhS9lyG4zNKC39Hd3YXPo9HYI0WnVz/JDTJw9nwnYHQ= +gitlab.com/elixxir/crypto v0.0.7-0.20221110181326-dd7e5293feb0 h1:IgspAliiN6MGqJX7LZ+1GinCX6bNJw6KlIa+rvEo2+A= +gitlab.com/elixxir/crypto v0.0.7-0.20221110181326-dd7e5293feb0/go.mod h1:IqswRNqsGooEOt2tP1LzeAcBOccVW0aUiJFH5B7UGfg= gitlab.com/elixxir/ekv v0.2.1 h1:dtwbt6KmAXG2Tik5d60iDz2fLhoFBgWwST03p7T+9Is= gitlab.com/elixxir/ekv v0.2.1/go.mod h1:USLD7xeDnuZEavygdrgzNEwZXeLQJK/w1a+htpN+JEU= -gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg= -gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0VelQda72OzoUckr1O+vPW0AiFe0nyKQ6gYcmFSuF8= -gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc= -gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE= -gitlab.com/elixxir/primitives v0.0.3-0.20221025020430-f5d2eb330fbc h1:o/qBYkVm9hBCgsA01y/8iwZN9z2ODC8jVrPQF2ZB1I0= -gitlab.com/elixxir/primitives v0.0.3-0.20221025020430-f5d2eb330fbc/go.mod h1:2JdloMJCUyXaaGcIJ4ogKrjlI48Nop0Zuzkk3edhIZU= -gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw= -gitlab.com/xx_network/comms v0.0.4-0.20221027213956-c8a8cf68ee4f h1:gwhm0a9S9wk5M79Z99xiVu5XAQu9JDe3Vb1jjru+Hd4= -gitlab.com/xx_network/comms v0.0.4-0.20221027213956-c8a8cf68ee4f/go.mod h1:/RX6ZuRlQQL0IVnMdkgsS9RyXkVeNJcBDpAeEPUZqA4= -gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE= -gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk= -gitlab.com/xx_network/crypto v0.0.5-0.20221025020316-517fa8f91d2c h1:MR2dwUhl3BFZRNkvd+UP1Ymiu+pxbAv5wk6OIsOXKvU= -gitlab.com/xx_network/crypto v0.0.5-0.20221025020316-517fa8f91d2c/go.mod h1:/BSQb9RFRu8ynVk7lIn9W+JciJMpJ8RzmRLYGe6/Les= -gitlab.com/xx_network/primitives v0.0.0-20200803231956-9b192c57ea7c/go.mod h1:wtdCMr7DPePz9qwctNoAUzZtbOSHSedcK++3Df3psjA= -gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug= -gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc= -gitlab.com/xx_network/primitives v0.0.4-0.20221025020003-cbec15a71b8f h1:bfdEV/BfYLP4bntW4TZkKCcyGJCekVd9E9hPeJtc/0s= -gitlab.com/xx_network/primitives v0.0.4-0.20221025020003-cbec15a71b8f/go.mod h1:AXVVFt7dDAeIUpOGPiStCcUIKsBXLWbmV/BgZ4T+tOo= +gitlab.com/elixxir/primitives v0.0.3-0.20221108183049-7bdff545bf8e h1:U9aMSBhc2ShJEeCXHNoUPVwrxKAGRhbGZWsbqES8iGA= +gitlab.com/elixxir/primitives v0.0.3-0.20221108183049-7bdff545bf8e/go.mod h1:KeMEPwtmA0zJpetvv5SeyOePIAzsBmQSwJ2nAHYnczw= +gitlab.com/elixxir/primitives v0.0.3-0.20221109183528-7cbb24d14a5b h1:d9FdXv6CB5elYH3cYMcgnRkRGLYm7SPPneSCeQGUsqs= +gitlab.com/elixxir/primitives v0.0.3-0.20221109183528-7cbb24d14a5b/go.mod h1:KeMEPwtmA0zJpetvv5SeyOePIAzsBmQSwJ2nAHYnczw= +gitlab.com/elixxir/primitives v0.0.3-0.20221110181119-e83320a48b13 h1:U3tbClFN5BLYlAoMj+o6VWAs9akbFiJstMGCuk1aB94= +gitlab.com/elixxir/primitives v0.0.3-0.20221110181119-e83320a48b13/go.mod h1:DUnCTXYKgjpro5+6ITySKIf+qzW2vhW40IVHMimdsqw= +gitlab.com/xx_network/comms v0.0.4-0.20221108183032-8732b403e506 h1:QoFyWFGuUquPvam/rHvnUEDdTQ3DzIhxn3x8WTWxXMA= +gitlab.com/xx_network/comms v0.0.4-0.20221108183032-8732b403e506/go.mod h1:/zveWGwSqQbPhPSiGIbS3v78nga8nD5XD1oXr0vD/Zc= +gitlab.com/xx_network/comms v0.0.4-0.20221110181111-4f0694876936 h1:eQQ4zUvGWIzCWdBJ6qlysWUMwrc2tM8GripFqdT1SAs= +gitlab.com/xx_network/comms v0.0.4-0.20221110181111-4f0694876936/go.mod h1:+RfHgk75ywMvmucOpPS7rSUlsnbPyBuLsr13tsthUTE= +gitlab.com/xx_network/crypto v0.0.5-0.20221108182939-05998dc093e9 h1:A/gYzA36bQxj6tRczs11JEUsWzaLmTRXN89tlqWEOUc= +gitlab.com/xx_network/crypto v0.0.5-0.20221108182939-05998dc093e9/go.mod h1:0Bk5bSyAqH/GAU4CJ8Wbm24YkMoDVz4JF7585dAMkss= +gitlab.com/xx_network/crypto v0.0.5-0.20221110181048-76f0c556fe95 h1:rC6lx6sD6u617Qu0ZndKZQRjXuRkyrI9Q6Y0Ki+dnK4= +gitlab.com/xx_network/crypto v0.0.5-0.20221110181048-76f0c556fe95/go.mod h1:acWUBKCpae/XVaQF7J9RnLAlBT13i5r7gnON+mrIxBk= +gitlab.com/xx_network/primitives v0.0.4-0.20221104175439-f0d440beacd9 h1:XE7OBn2gYmfLudiaWOl6LzYblZZqYIsScrSzJqPwymY= +gitlab.com/xx_network/primitives v0.0.4-0.20221104175439-f0d440beacd9/go.mod h1:rP/2IsqIFHapuIB4mstXKItvwoJRQ9Wlms/NGeutHsk= +gitlab.com/xx_network/primitives v0.0.4-0.20221110180011-fd6ea3058225 h1:TAn87e6Zt9KwcSnWKyIul5eu8T0RHY9FDubCGs3G0dw= +gitlab.com/xx_network/primitives v0.0.4-0.20221110180011-fd6ea3058225/go.mod h1:rP/2IsqIFHapuIB4mstXKItvwoJRQ9Wlms/NGeutHsk= gitlab.com/xx_network/ring v0.0.3-0.20220902183151-a7d3b15bc981 h1:1s0vX9BbkiD0IVXwr3LOaTBcq1wBrWcUWMBK0s8r0Z0= gitlab.com/xx_network/ring v0.0.3-0.20220902183151-a7d3b15bc981/go.mod h1:aLzpP2TiZTQut/PVHR40EJAomzugDdHXetbieRClXIM= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -673,46 +523,31 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200707235045-ab33eee955e0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 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-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -739,7 +574,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -750,7 +584,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -771,7 +604,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -789,24 +621,12 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -818,17 +638,6 @@ 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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= @@ -839,8 +648,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -850,7 +657,6 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -860,11 +666,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -873,7 +675,6 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -884,68 +685,34 @@ golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210319071255-635bc2c9138d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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/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= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -969,12 +736,10 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -998,7 +763,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1007,20 +771,12 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1041,26 +797,6 @@ 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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1085,7 +821,6 @@ google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200204235621-fb4a7afc5178/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1095,7 +830,6 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1109,48 +843,7 @@ 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-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/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-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1172,27 +865,11 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= 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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.49.0 h1:WTLtQzmQori5FUH25Pq4WT22oCsv8USpQ+F6rqtsmxw= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -1205,22 +882,17 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1229,7 +901,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1237,9 +908,7 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1250,7 +919,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= @@ -1258,5 +926,4 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/groupChat/e2eManager_test.go b/groupChat/e2eManager_test.go index 2d89504277be61b03a78908a61a7391d5f61efa5..1afa4afbd2f1a43c0c6513a549a816e06f95a009 100644 --- a/groupChat/e2eManager_test.go +++ b/groupChat/e2eManager_test.go @@ -10,13 +10,13 @@ package groupChat import ( "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/message" - clientE2E "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/message" + clientE2E "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + sessionImport "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/gcMessages.pb.go b/groupChat/gcMessages.pb.go index 17cdd83d6f1ab07b2f0b44ed1a33ee017ccb63ed..a62e201623a097346f6a9a44679231dd776cd627 100644 --- a/groupChat/gcMessages.pb.go +++ b/groupChat/gcMessages.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: gcMessages.proto package groupChat diff --git a/groupChat/groupStore/group.go b/groupChat/groupStore/group.go index 6a9ac4192f4939a8dcbf0c7d54b7c8c6dedb9b9d..ed8c3d0292a7374cae42318460759639e901881a 100644 --- a/groupChat/groupStore/group.go +++ b/groupChat/groupStore/group.go @@ -12,7 +12,7 @@ import ( "encoding/binary" "fmt" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/groupStore/group_test.go b/groupChat/groupStore/group_test.go index a45be564da007da3164f2f3dc4e6853b3bcce773..c311fb3451ac38ecefa925801226a4d0d2216ce5 100644 --- a/groupChat/groupStore/group_test.go +++ b/groupChat/groupStore/group_test.go @@ -8,7 +8,7 @@ package groupStore import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/groupStore/store.go b/groupChat/groupStore/store.go index 74140e19f91c1711f05b0f5c7f91abcee6ee0631..610db4703d02da7267712cfb94f224a8731f0d80 100644 --- a/groupChat/groupStore/store.go +++ b/groupChat/groupStore/store.go @@ -11,7 +11,7 @@ import ( "bytes" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/groupStore/store_test.go b/groupChat/groupStore/store_test.go index aaeaebe7eff15e4d51c566359d50ff22ae31b99c..fd54413afec41c4bd1ec19ca40f6a135a828358e 100644 --- a/groupChat/groupStore/store_test.go +++ b/groupChat/groupStore/store_test.go @@ -10,7 +10,7 @@ package groupStore import ( "bytes" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/interface.go b/groupChat/interface.go index e9b14c911abe56c1072e571d552dca6047d35cbd..391e60954034dd9015355024e03d831e934548d7 100644 --- a/groupChat/interface.go +++ b/groupChat/interface.go @@ -21,17 +21,17 @@ package groupChat import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + sessionImport "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go index aeaea8efc6de93e130204137bf9096d56f8eead0..89ac7872ea84565061a2a9d4120427366c5a7619 100644 --- a/groupChat/makeGroup.go +++ b/groupChat/makeGroup.go @@ -12,7 +12,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/group" diff --git a/groupChat/makeGroup_test.go b/groupChat/makeGroup_test.go index 34596d71e8c38d5a5ee28a17c7e7edfe606a1f25..1a24adeab7226c904a0ff38ca29ca9beb7be2ff6 100644 --- a/groupChat/makeGroup_test.go +++ b/groupChat/makeGroup_test.go @@ -11,9 +11,9 @@ import ( "bytes" "fmt" "github.com/cloudflare/circl/dh/sidh" - sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - util "gitlab.com/elixxir/client/storage/utility" + sessionImport "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/crypto/csprng" diff --git a/groupChat/manager.go b/groupChat/manager.go index 82b7d432636713788d8e33a4d4e9a3b9db0034fb..309de74648b6ee72665ca6504bcadeddfe0b24fe 100644 --- a/groupChat/manager.go +++ b/groupChat/manager.go @@ -10,9 +10,9 @@ package groupChat import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/crypto/group" diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go index 7cb7d2f59d3b4550286531d458921c3d9f96f08a..f27fece9412bbb5c658e9c410d4d1c00ba785940 100644 --- a/groupChat/manager_test.go +++ b/groupChat/manager_test.go @@ -8,12 +8,12 @@ package groupChat import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - e2eImport "gitlab.com/elixxir/client/e2e" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + e2eImport "gitlab.com/elixxir/client/v4/e2e" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" diff --git a/groupChat/messenger_test.go b/groupChat/messenger_test.go index 1ebf8d4d696cf05881c317ffafa3a5f4fd03cc5d..f65e7aba27c744427a5ae21b474fb064a22e98fd 100644 --- a/groupChat/messenger_test.go +++ b/groupChat/messenger_test.go @@ -8,12 +8,12 @@ package groupChat import ( - "gitlab.com/elixxir/client/cmix" - clientE2E "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + clientE2E "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" diff --git a/groupChat/networkManager_test.go b/groupChat/networkManager_test.go index 108ae47a5c55a05292a547fd3f5b4a9d1e69053b..2f1f254d8f1e1702d8bbd4c0a7df7db028928023 100644 --- a/groupChat/networkManager_test.go +++ b/groupChat/networkManager_test.go @@ -9,12 +9,12 @@ package groupChat import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/format" diff --git a/groupChat/processor.go b/groupChat/processor.go index f397046a924b66808b115b35f1f41221f876d175..9163ccfeeaec5f0a1aef4f0a75bca7a2bbb624f3 100644 --- a/groupChat/processor.go +++ b/groupChat/processor.go @@ -9,8 +9,8 @@ package groupChat import ( "fmt" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/primitives/format" ) diff --git a/groupChat/receive.go b/groupChat/receive.go index 004f7f370224c7df6368705f86b5f33eb4a3e2fd..6534267a26bf421d5a973983baba8a524604a717 100644 --- a/groupChat/receive.go +++ b/groupChat/receive.go @@ -14,9 +14,9 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" diff --git a/groupChat/receiveRequest.go b/groupChat/receiveRequest.go index e88aa858210d7bab639c672caf3e69cf0e2a9e2e..b96a5b91a192f4c7cda7fab6a018699e7c88962d 100644 --- a/groupChat/receiveRequest.go +++ b/groupChat/receiveRequest.go @@ -11,9 +11,9 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e/receive" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e/receive" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "time" ) diff --git a/groupChat/receiveRequest_test.go b/groupChat/receiveRequest_test.go index e3611bab8193e2b87001578d4df640101c71b2dc..7514b00f049e8b48feb7b64b9494bddeb49bb66a 100644 --- a/groupChat/receiveRequest_test.go +++ b/groupChat/receiveRequest_test.go @@ -10,11 +10,11 @@ package groupChat import ( "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/catalog" - sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/catalog" + sessionImport "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + util "gitlab.com/elixxir/client/v4/storage/utility" "math/rand" "reflect" "strings" diff --git a/groupChat/send.go b/groupChat/send.go index 9486885e4feeefc17d7d618bfe768927079642c6..0491081ff8ff09017f9646b031765d6f6f3b2909 100644 --- a/groupChat/send.go +++ b/groupChat/send.go @@ -10,10 +10,10 @@ package groupChat import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/groupChat/sendRequests.go b/groupChat/sendRequests.go index 36046527379d67151a69f588e773b03f6758f87d..89a4b65ebc27dab8f46d6e7bf29ff2f80b3fbbfe 100644 --- a/groupChat/sendRequests.go +++ b/groupChat/sendRequests.go @@ -13,9 +13,9 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/e2e" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/e2e" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" ) diff --git a/groupChat/sendRequests_test.go b/groupChat/sendRequests_test.go index 3878e52a4d81e80523c41d3bdc2baf41281ab39c..726237701c3b7b33fd2f81a5203444a5c01f2d80 100644 --- a/groupChat/sendRequests_test.go +++ b/groupChat/sendRequests_test.go @@ -11,8 +11,8 @@ import ( "fmt" "github.com/cloudflare/circl/dh/sidh" "github.com/golang/protobuf/proto" - sessionImport "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" + sessionImport "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" diff --git a/groupChat/send_test.go b/groupChat/send_test.go index c0d4f599f63e7e1ab853af0257c80cf5cb662a6e..6c652ed578e2b0bcc571b2f83aad91ff9fed1649 100644 --- a/groupChat/send_test.go +++ b/groupChat/send_test.go @@ -10,9 +10,9 @@ package groupChat import ( "bytes" "encoding/base64" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" diff --git a/groupChat/service.go b/groupChat/service.go index eb57bc38f39c010fd1525a48e69720bd9b82b033..7c2f12a7566adbb4b525430064e804b9b499d1a7 100644 --- a/groupChat/service.go +++ b/groupChat/service.go @@ -9,9 +9,9 @@ package groupChat import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix/message" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix/message" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/xx_network/primitives/id" ) diff --git a/groupChat/session_test.go b/groupChat/session_test.go index a61cf8b510ed05b1d7fee252e31dd314f03097d0..c5be891017f24d9fb3557b1cb2bb48129e182cd7 100644 --- a/groupChat/session_test.go +++ b/groupChat/session_test.go @@ -8,9 +8,9 @@ package groupChat import ( - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/version" diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go index 98e63bcf98fa3a658a95b28c16b626c3411ccbcc..3fcfc3d1caf5bfee792127609d80dce965216128 100644 --- a/groupChat/utils_test.go +++ b/groupChat/utils_test.go @@ -9,10 +9,10 @@ package groupChat import ( "encoding/base64" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/event" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/event" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/group" diff --git a/groupChat/wrapper.go b/groupChat/wrapper.go index 462811c8d20f606353c419f61bd079e2a8480875..abfa2e7bc2bb64df9782b1ad4b8de8933de80578 100644 --- a/groupChat/wrapper.go +++ b/groupChat/wrapper.go @@ -8,8 +8,8 @@ package groupChat import ( - "gitlab.com/elixxir/client/cmix/rounds" - gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/client/v4/cmix/rounds" + gs "gitlab.com/elixxir/client/v4/groupChat/groupStore" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" "time" diff --git a/main.go b/main.go index ac80eb9a1fc5411c091bd1f3bad27b89e90114d7..a15efab98a1bd520761ec94f655d021eef3d78e0 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,7 @@ package main -import "gitlab.com/elixxir/client/cmd" +import "gitlab.com/elixxir/client/v4/cmd" // main needs no introduction. func main() { diff --git a/restlike/connect/receiver.go b/restlike/connect/receiver.go index 20ad79df76dd9003ac6d7e43cbae18185faa8217..a6aa395afa90153f752cd4327760e321c7816e2f 100644 --- a/restlike/connect/receiver.go +++ b/restlike/connect/receiver.go @@ -10,11 +10,11 @@ package connect import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/restlike" "google.golang.org/protobuf/proto" ) diff --git a/restlike/connect/receiver_test.go b/restlike/connect/receiver_test.go index 409dcd9e3814892c229b097677f849bd038ad36d..1742619ac563bf9271aa84e80576e0004ed5a761 100644 --- a/restlike/connect/receiver_test.go +++ b/restlike/connect/receiver_test.go @@ -8,8 +8,8 @@ package connect import ( - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/restlike" "testing" ) diff --git a/restlike/connect/request.go b/restlike/connect/request.go index bd2ac8d978b1dcc89cd301f8a058c44c72ae76f9..e1e0fac24e1675864d4e7fde3fe4f76e68c31435 100644 --- a/restlike/connect/request.go +++ b/restlike/connect/request.go @@ -9,10 +9,10 @@ package connect import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/restlike" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/csprng" "google.golang.org/protobuf/proto" diff --git a/restlike/connect/response.go b/restlike/connect/response.go index 83d55ddea39ed9e051953dd2c1b4a3f8910ef39b..87ae89206f791ccd12c02a1ee3cd39c5614f3456 100644 --- a/restlike/connect/response.go +++ b/restlike/connect/response.go @@ -8,8 +8,8 @@ package connect import ( - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/restlike" "google.golang.org/protobuf/proto" ) diff --git a/restlike/connect/response_test.go b/restlike/connect/response_test.go index d82947861901dcf3039dbd1628b948d5c44baea5..8a826bd888f9584c6ab955b2ff39395651bda753 100644 --- a/restlike/connect/response_test.go +++ b/restlike/connect/response_test.go @@ -9,8 +9,8 @@ package connect import ( "bytes" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/restlike" "google.golang.org/protobuf/proto" "testing" "time" diff --git a/restlike/connect/server.go b/restlike/connect/server.go index 47d3955b4d0d33763ae63c2f9a733f7678dce8c6..4b37a39c42dcc7dd70886d8bc7579b08a43c24ba 100644 --- a/restlike/connect/server.go +++ b/restlike/connect/server.go @@ -8,10 +8,10 @@ package connect import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/connect" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/id" ) diff --git a/restlike/restLikeMessages.pb.go b/restlike/restLikeMessages.pb.go index 674580e375c72f057883a4e6f27a7a5466d3749e..eb79d72bed4f7e166c07e654895637c21cd7a6de 100644 --- a/restlike/restLikeMessages.pb.go +++ b/restlike/restLikeMessages.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: restLikeMessages.proto package restlike diff --git a/restlike/single/receiver.go b/restlike/single/receiver.go index 381bd923ebb120d7c1eb7c98c07de2ed18461a9f..fbb62417dcdf7ec8f0dbd8be65e4938b0b873e9e 100644 --- a/restlike/single/receiver.go +++ b/restlike/single/receiver.go @@ -10,11 +10,11 @@ package single import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/single" "google.golang.org/protobuf/proto" "time" ) diff --git a/restlike/single/request.go b/restlike/single/request.go index 53dfcbce8a69a4811cc0f4cd6d91c49ae93f2451..a0b309fcce2ed42963abb7f60946a02e75ffa623 100644 --- a/restlike/single/request.go +++ b/restlike/single/request.go @@ -9,9 +9,9 @@ package single import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/csprng" diff --git a/restlike/single/response.go b/restlike/single/response.go index a0e0314677890b017c093738e1597624fc303b25..d250c8498a62b6427b1a4a8c225f178f80b011e3 100644 --- a/restlike/single/response.go +++ b/restlike/single/response.go @@ -8,9 +8,9 @@ package single import ( - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/restlike" "google.golang.org/protobuf/proto" ) diff --git a/restlike/single/response_test.go b/restlike/single/response_test.go index da2aedcea8035c8a2189dc0f63fa1a3ed8004256..40cd62132d1c6c4296d02ffb97bc1732bf5e47d0 100644 --- a/restlike/single/response_test.go +++ b/restlike/single/response_test.go @@ -10,8 +10,8 @@ package single import ( "bytes" "github.com/pkg/errors" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/restlike" "google.golang.org/protobuf/proto" "testing" "time" diff --git a/restlike/single/server.go b/restlike/single/server.go index 607de3e1193f3d99d864cd44b5a675650b1b2ab5..4ee314580bb529da2e30dbeacc3a025cc6adfc64 100644 --- a/restlike/single/server.go +++ b/restlike/single/server.go @@ -8,9 +8,9 @@ package single import ( - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/restlike" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/id" ) diff --git a/single/interfaces.go b/single/interfaces.go index 8a6f965e8728b05b26a09c9f99fe8c248c19cc52..617c20dec5e95d631d8a0b7f13c0fffe9b116d45 100644 --- a/single/interfaces.go +++ b/single/interfaces.go @@ -8,11 +8,11 @@ package single import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - cMixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + cMixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" diff --git a/single/listener.go b/single/listener.go index c13ca7a2a9a92bd0bb4af7e570bd66f3b9f94b1b..f818e2c722727e7d3aa0cb66cf2dbf9dd9c0d787 100644 --- a/single/listener.go +++ b/single/listener.go @@ -11,10 +11,10 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - cMixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + cMixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/crypto/cyclic" cAuth "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/crypto/e2e/singleUse" diff --git a/single/listener_test.go b/single/listener_test.go index 43006ae979f8a9801921566ebff95ac27ca73fec..2fc52436cb3a9f6953e198866f16788136bf1074 100644 --- a/single/listener_test.go +++ b/single/listener_test.go @@ -8,11 +8,11 @@ package single import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - cMixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + cMixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" diff --git a/single/params.go b/single/params.go index 928938384bc5a24c09d35b9c8a7911a62a65fd21..08bf8d4973040fc415f1d0fc415a89c42ed6095f 100644 --- a/single/params.go +++ b/single/params.go @@ -9,7 +9,7 @@ package single import ( "encoding/json" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "time" ) diff --git a/single/params_test.go b/single/params_test.go index e9c4c49dcd22a2baf482263f97bdf09a2611820f..f0c71c48dab1d035dac7d407e3832d9d5d5ef61b 100644 --- a/single/params_test.go +++ b/single/params_test.go @@ -10,7 +10,7 @@ package single import ( "bytes" "encoding/json" - "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/v4/cmix" "reflect" "testing" ) diff --git a/single/receivedRequest.go b/single/receivedRequest.go index cc05610088cca70c26539b5df5a0a090616b67cc..aea1240f1a634def54585c7b0736192f4ea8d78d 100644 --- a/single/receivedRequest.go +++ b/single/receivedRequest.go @@ -12,9 +12,9 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - cmixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix" + cmixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/single/message" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/e2e/singleUse" diff --git a/single/receivedRequest_test.go b/single/receivedRequest_test.go index 4d5762828038be1ba058cc7e59a4bc1dd8490fca..a3a11e41f6c2e60e7f60d94fb55abea3e1769a9d 100644 --- a/single/receivedRequest_test.go +++ b/single/receivedRequest_test.go @@ -9,10 +9,10 @@ package single import ( "bytes" - "gitlab.com/elixxir/client/cmix" - cmixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix" + cmixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/e2e/singleUse" diff --git a/single/request.go b/single/request.go index 16429e835021a6eb5b570ba7d60362ae5ba0dca6..d942852ef1153b4ead83d9551c78a9e5e52cf59e 100644 --- a/single/request.go +++ b/single/request.go @@ -11,11 +11,11 @@ import ( "bytes" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - cmixMsg "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + cmixMsg "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" diff --git a/single/requestPartProcessor.go b/single/requestPartProcessor.go index 34293282ed87f4ab323336ea364db3b169275b90..036672a0b005cf5f33de790f37dde4cb0f8d4a60 100644 --- a/single/requestPartProcessor.go +++ b/single/requestPartProcessor.go @@ -9,9 +9,9 @@ package single import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" ) diff --git a/single/request_test.go b/single/request_test.go index 4da6d4833e17eb15f2bfa428549739b6cb675bb8..889cc421865494ea607cf9436deb48caa4173ab1 100644 --- a/single/request_test.go +++ b/single/request_test.go @@ -11,10 +11,10 @@ import ( "bytes" "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/crypto/contact" dh "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/single/responseProcessor.go b/single/responseProcessor.go index 4351900dc228ef09b3deb58e381ab4b920436aa3..9c6cd6407ef77cf0b1c51c111bbddb8ffea7d4ab 100644 --- a/single/responseProcessor.go +++ b/single/responseProcessor.go @@ -11,9 +11,9 @@ import ( "fmt" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single/message" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single/message" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/format" ) diff --git a/single/roundCollector.go b/single/roundCollector.go index d1f7c5d84f59100ebeb4492e5b51421140690a19..4af424752de2126df39892bdb32eb89aec933aeb 100644 --- a/single/roundCollector.go +++ b/single/roundCollector.go @@ -8,7 +8,7 @@ package single import ( - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/xx_network/primitives/id" "sync" ) diff --git a/single/utils_test.go b/single/utils_test.go index 003d68e54cf6ca822918d07ca77985323ea8e70a..4dbae4461839516423cb9df9f923c595a5f0f33a 100644 --- a/single/utils_test.go +++ b/single/utils_test.go @@ -8,10 +8,10 @@ package single import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" diff --git a/storage/clientVersion/store.go b/storage/clientVersion/store.go index f1ae712d873b3d73004826c231aec0b5fa9fc341..8363ee303a2ed88cd7f4d4b5a62f26fe298aa506 100644 --- a/storage/clientVersion/store.go +++ b/storage/clientVersion/store.go @@ -10,7 +10,7 @@ package clientVersion import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/version" "gitlab.com/xx_network/primitives/netTime" "sync" diff --git a/storage/clientVersion/store_test.go b/storage/clientVersion/store_test.go index 9da1b75ef38491e6405e9c86f9cdf4a77cf48755..f114e1e82763c9b00ded1d53fa159ac4bb68bd6c 100644 --- a/storage/clientVersion/store_test.go +++ b/storage/clientVersion/store_test.go @@ -8,7 +8,7 @@ package clientVersion import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/version" "gitlab.com/xx_network/primitives/netTime" diff --git a/storage/ndf.go b/storage/ndf.go index 7bac8db591a15c2a76a2428e8ed47f176dfe637f..1cf5225962402d122e44980a83133712e163e52a 100644 --- a/storage/ndf.go +++ b/storage/ndf.go @@ -9,7 +9,7 @@ package storage import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/xx_network/primitives/ndf" ) diff --git a/storage/regCode.go b/storage/regCode.go index 83647179c4237d3e09607af6e4bcc89f42181ab3..7bd67cb37cb7be8a653f0f657d237c3007026c49 100644 --- a/storage/regCode.go +++ b/storage/regCode.go @@ -10,7 +10,7 @@ package storage import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/regStatus.go b/storage/regStatus.go index 5ff8cdd4d35a1b9be90a3c07653e62cf07d63dbd..49a506c62095e721c76a86b36b8e872136a0df68 100644 --- a/storage/regStatus.go +++ b/storage/regStatus.go @@ -11,7 +11,7 @@ import ( "encoding/binary" "fmt" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/session.go b/storage/session.go index e982415a1ed6523a3ad99d6a4711c6a4a31fe514..8e98ebb4a8ed69050f6ac75a0a70eddfd8a99e24 100644 --- a/storage/session.go +++ b/storage/session.go @@ -17,14 +17,14 @@ import ( "gitlab.com/elixxir/crypto/diffieHellman" - "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/xx_network/crypto/large" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/clientVersion" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/clientVersion" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/version" diff --git a/storage/user/cryptographic.go b/storage/user/cryptographic.go index 54fc60f864c7c602c676a3de38c647777645c895..f65ca13abf18dfbddc6af24d941cb051a53b64b2 100644 --- a/storage/user/cryptographic.go +++ b/storage/user/cryptographic.go @@ -13,8 +13,8 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/utility" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" diff --git a/storage/user/cryptographic_test.go b/storage/user/cryptographic_test.go index 7fb9f6c3b9e4f3c770db0b7fc6cecc95cb25afcd..90d7df378d027c9df4b2f9a1b2bd7de238f66a12 100644 --- a/storage/user/cryptographic_test.go +++ b/storage/user/cryptographic_test.go @@ -10,7 +10,7 @@ package user import ( "bytes" "crypto/rand" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" diff --git a/storage/user/registation.go b/storage/user/registation.go index aa144ef7f957a54205a95910ff272a82f9a46a36..5900f82a188303ab9a2e162c2328f5e07761fa29 100644 --- a/storage/user/registation.go +++ b/storage/user/registation.go @@ -10,7 +10,7 @@ package user import ( "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "time" ) diff --git a/storage/user/registation_test.go b/storage/user/registation_test.go index 4ada8cf0a9ce106956f36428c416d146853b5dbb..3d9efddf514f729408bf5e9a29096ae11cfd027b 100644 --- a/storage/user/registation_test.go +++ b/storage/user/registation_test.go @@ -10,7 +10,7 @@ package user import ( "bytes" "encoding/binary" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" diff --git a/storage/user/user.go b/storage/user/user.go index b2db39a4e53f3dd15a5d457654b28327a41be613..984af7fee0cec1a0406b72d98e38b8ef06757911 100644 --- a/storage/user/user.go +++ b/storage/user/user.go @@ -9,7 +9,7 @@ package user import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" diff --git a/storage/user/user_test.go b/storage/user/user_test.go index b55de9534c4eeeaac3369fa6a25d2e3b29a12bcf..c8b97b9e30d304a323803d025645739bb76a6e7e 100644 --- a/storage/user/user_test.go +++ b/storage/user/user_test.go @@ -8,7 +8,7 @@ package user import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" diff --git a/storage/user/username.go b/storage/user/username.go index 7a0b939da475473602480d2390ecabcebaefd2c0..636f4e3d3b4c0305fc3a3c151c55e05fab2706b7 100644 --- a/storage/user/username.go +++ b/storage/user/username.go @@ -10,7 +10,7 @@ package user import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/user/username_test.go b/storage/user/username_test.go index 91f8b64a30db6862e98888e7e9dd25ecfcb69404..34d617359e8ed7e463fa454ce0ea54867983a749 100644 --- a/storage/user/username_test.go +++ b/storage/user/username_test.go @@ -8,7 +8,7 @@ package user import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" diff --git a/storage/utility/NDF.go b/storage/utility/NDF.go index 3c5f9b9d48bb2fe6fc55bb07221f12d8add79538..d53cf49118c349a5e57b5487c660f7070310d3ff 100644 --- a/storage/utility/NDF.go +++ b/storage/utility/NDF.go @@ -11,7 +11,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/ndf" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/utility/NDF_js.go b/storage/utility/NDF_js.go index f958bd350143e6773e5aaf5f35ee495c46bce04c..05d5eb885575fad7bb96f7e561d42660f7b2f494 100644 --- a/storage/utility/NDF_js.go +++ b/storage/utility/NDF_js.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/ndf" "os" "syscall/js" diff --git a/storage/utility/blockStore.go b/storage/utility/blockStore.go index d81e0fbf363d500d051638c866ade4cbbd777d2f..3683e5178bbc3ec94a2b641325a519ea2b510c26 100644 --- a/storage/utility/blockStore.go +++ b/storage/utility/blockStore.go @@ -13,7 +13,7 @@ import ( "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "strconv" ) diff --git a/storage/utility/blockStore_test.go b/storage/utility/blockStore_test.go index 217089bbd0916cf26f3de65468c0ab05dacd20fc..b519eda92517768f9e360677341cbb8b5b486e22 100644 --- a/storage/utility/blockStore_test.go +++ b/storage/utility/blockStore_test.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "math/rand" diff --git a/storage/utility/bucket.go b/storage/utility/bucket.go index fd3061e8f5f311f55a0a7e47648c46fa9114de37..f776dabfefa42440f86a146b3a2ec980920d99db 100644 --- a/storage/utility/bucket.go +++ b/storage/utility/bucket.go @@ -10,7 +10,7 @@ package utility import ( "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "gitlab.com/xx_network/primitives/rateLimiting" "time" diff --git a/storage/utility/bucketParams.go b/storage/utility/bucketParams.go index 90708af650febc99ab6f6e18f7bb58a51a995ba7..cf8fc57037f556de4d516bc6f31a6fcb173fd6b4 100644 --- a/storage/utility/bucketParams.go +++ b/storage/utility/bucketParams.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "gitlab.com/xx_network/primitives/rateLimiting" "sync" diff --git a/storage/utility/bucketParams_test.go b/storage/utility/bucketParams_test.go index dc961eb5f2ff719ad2580fef95e53f0319f1802d..1f2c4bdb5b5a7ef2e07d1f89d20d604a8fb67b0f 100644 --- a/storage/utility/bucketParams_test.go +++ b/storage/utility/bucketParams_test.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "reflect" "testing" diff --git a/storage/utility/contact.go b/storage/utility/contact.go index 98268e686b51cd30f54ad017682f542998ebc8a1..f67443f208a02494c98423b07aebeec1b65e79d8 100644 --- a/storage/utility/contact.go +++ b/storage/utility/contact.go @@ -10,7 +10,7 @@ package utility import ( "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" diff --git a/storage/utility/dh.go b/storage/utility/dh.go index de697130ae7bf68f41dc88567346992cc181d164..a3f05b2d74779d33482b10d07f68de42fb2ba051 100644 --- a/storage/utility/dh.go +++ b/storage/utility/dh.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/utility/dh_test.go b/storage/utility/dh_test.go index 4f25a4768c1dd3e1fa1ed7bc0e52f010ad0e936e..d106c6d906227c1418d48b887dd95ee3d8271874 100644 --- a/storage/utility/dh_test.go +++ b/storage/utility/dh_test.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "testing" ) diff --git a/storage/utility/encryptionSalt.go b/storage/utility/encryptionSalt.go index 18b60c15d4d9f3d39aba0d34fb7efb4877fd92e0..f8927bf03ded55916db7dd508535071f0a3f5cb9 100644 --- a/storage/utility/encryptionSalt.go +++ b/storage/utility/encryptionSalt.go @@ -2,7 +2,7 @@ package utility import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "io" ) diff --git a/storage/utility/encryptionSalt_test.go b/storage/utility/encryptionSalt_test.go index f041b9ded2673277022ae55ce3c356e9744ce712..2701362339a77609b4de2d812ddd327ae8bc69d9 100644 --- a/storage/utility/encryptionSalt_test.go +++ b/storage/utility/encryptionSalt_test.go @@ -2,7 +2,7 @@ package utility import ( "bytes" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" "testing" diff --git a/storage/utility/group.go b/storage/utility/group.go index 769e0fc0fa682e1dafac61fe24fe69c6f16bd930..19a157509007549e00e5c1a38d4ec306ecbe8631 100644 --- a/storage/utility/group.go +++ b/storage/utility/group.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/utility/group_test.go b/storage/utility/group_test.go index 09542e392ed40bb426d055da7c6af2854077fb28..ecc9f3cffa516804227ef665836e5615321d0d16 100644 --- a/storage/utility/group_test.go +++ b/storage/utility/group_test.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/large" diff --git a/storage/utility/id.go b/storage/utility/id.go index 6046627b374ebd6f9093452c72cc0cade334cfe5..5e2168c7be17bc057a4bfc7d2b9e62f4d48bd6f3 100644 --- a/storage/utility/id.go +++ b/storage/utility/id.go @@ -8,7 +8,7 @@ package utility import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/utility/messageBuffer.go b/storage/utility/messageBuffer.go index 15c3296673f17bcf7a08869e6fef305dc5219031..ce2ae8203c68ebf439724d9e4f08d828ec582abf 100644 --- a/storage/utility/messageBuffer.go +++ b/storage/utility/messageBuffer.go @@ -13,7 +13,7 @@ import ( "sync" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/storage/utility/messageBuffer_test.go b/storage/utility/messageBuffer_test.go index 065c1d6cf099996b4638a88dc7eda180a3bb625c..97fbe0c8035628c1854ee34db5e7fb70fad78054 100644 --- a/storage/utility/messageBuffer_test.go +++ b/storage/utility/messageBuffer_test.go @@ -10,7 +10,7 @@ package utility import ( "bytes" "encoding/json" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "golang.org/x/crypto/blake2b" diff --git a/storage/utility/multiStateVector.go b/storage/utility/multiStateVector.go index e12b6caff9fbbc262ee679df1399960495fdbffa..8653625c236623cc3c3d0bb21914acc8d7dd682f 100644 --- a/storage/utility/multiStateVector.go +++ b/storage/utility/multiStateVector.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/binary" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "math" "sync" diff --git a/storage/utility/multiStateVector_test.go b/storage/utility/multiStateVector_test.go index e198da67087e19b070dcc235a407d5b97345a607..b8d69f3a8ed691cc8175c8454353b78dc21560f1 100644 --- a/storage/utility/multiStateVector_test.go +++ b/storage/utility/multiStateVector_test.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/base64" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "math" diff --git a/storage/utility/sidh.go b/storage/utility/sidh.go index 03599f79dd58d1daef38f3a062c7541b932b8477..e82157e14e71e25e8335da5159c055326e757cc3 100644 --- a/storage/utility/sidh.go +++ b/storage/utility/sidh.go @@ -12,8 +12,8 @@ import ( "fmt" "github.com/cloudflare/circl/dh/sidh" jww "github.com/spf13/jwalterweatherman" - sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" - "gitlab.com/elixxir/client/storage/versioned" + sidhinterface "gitlab.com/elixxir/client/v4/interfaces/sidh" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "io" diff --git a/storage/utility/sidh_test.go b/storage/utility/sidh_test.go index b20b1310aeea6fe3c3b3eeb16d3259bb748a43cc..14bc958367def52672dd72e9d0a22c9ccc3e9c30 100644 --- a/storage/utility/sidh_test.go +++ b/storage/utility/sidh_test.go @@ -9,7 +9,7 @@ package utility import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/csprng" diff --git a/storage/utility/stateVector.go b/storage/utility/stateVector.go index f3ed4da6d4612365ea5b564ef5742976a1368626..e23c776bb931d31d9321772ff0536209e0da19e6 100644 --- a/storage/utility/stateVector.go +++ b/storage/utility/stateVector.go @@ -12,7 +12,7 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" "sync" "testing" diff --git a/storage/utility/stateVector_test.go b/storage/utility/stateVector_test.go index 586f31dc3492f06a56198c683c4a624140e6d220..355bbac04716c55eadb523f8435e25d4ede8c5fe 100644 --- a/storage/utility/stateVector_test.go +++ b/storage/utility/stateVector_test.go @@ -11,7 +11,7 @@ import ( "bytes" "encoding/base64" "fmt" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" "math/rand" diff --git a/ud/channelIDTracking.go b/ud/channelIDTracking.go index e40f4a1e33cbfb5519f7f0bc4964df04c9cd01b8..9dc19646ee85ecd23323e29cec4257b9b8446de6 100644 --- a/ud/channelIDTracking.go +++ b/ud/channelIDTracking.go @@ -10,10 +10,10 @@ import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/channels" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/channels" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/ud/channelIDTracking_test.go b/ud/channelIDTracking_test.go index 52c4c9826949856a363f04c315a2fd5dc7449637..7a3c6c1cb564b6c59e1544a49efd61605a129479 100644 --- a/ud/channelIDTracking_test.go +++ b/ud/channelIDTracking_test.go @@ -13,9 +13,9 @@ import ( "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" - store "gitlab.com/elixxir/client/ud/store" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/storage/versioned" + store "gitlab.com/elixxir/client/v4/ud/store" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" ) diff --git a/ud/confirmFact.go b/ud/confirmFact.go index 8fdafc24af9a52ac4b664e56dfe99aec3e95996e..ec8d542a142b9d60937e2b6e8f8cdf409881790b 100644 --- a/ud/confirmFact.go +++ b/ud/confirmFact.go @@ -41,6 +41,7 @@ func (m *Manager) confirmFact(confirmationID, code string, comm confirmFactComm) "Failed to confirm fact in storage with confirmation ID: %q", confirmationID) } + m.user.GetBackupContainer().TriggerBackup("Fact confirmed") return nil } diff --git a/ud/interfaces.go b/ud/interfaces.go index 9439d365c56441356477ee34c76fb5371c032c63..35005143e0a58c2d7c0e65d344e9bddbe7bc273b 100644 --- a/ud/interfaces.go +++ b/ud/interfaces.go @@ -8,12 +8,12 @@ package ud import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/fastRNG" ) @@ -39,6 +39,7 @@ type udE2e interface { GetRng() *fastRNG.StreamGenerator GetStorage() storage.Session GetTransmissionIdentity() xxdk.TransmissionIdentity + GetBackupContainer() *xxdk.Container } // udNetworkStatus is an interface for the xxdk.Cmix's diff --git a/ud/lookup.go b/ud/lookup.go index 867c2900cbf598be9e041f1de1244a9379e0c919..9faf9bf6d02509d6696d9ac3f5037cb3fb42f462 100644 --- a/ud/lookup.go +++ b/ud/lookup.go @@ -11,9 +11,9 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/fact" diff --git a/ud/lookup_test.go b/ud/lookup_test.go index 4b4d61d65e4154cb94b831fe5c4bee44d1a01d11..cc26ac81a711580443c81aadac64669f7594e6d9 100644 --- a/ud/lookup_test.go +++ b/ud/lookup_test.go @@ -8,8 +8,8 @@ package ud import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" diff --git a/ud/manager.go b/ud/manager.go index 9ea87cf84bef02982f8830ba8afa68b8149938dc..eed144156e47eb6aab3f84dce58ba651e0189cdd 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -10,10 +10,10 @@ package ud import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" - store "gitlab.com/elixxir/client/ud/store" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/storage/versioned" + store "gitlab.com/elixxir/client/v4/ud/store" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/fact" diff --git a/ud/mockE2e_test.go b/ud/mockE2e_test.go index e903d7eb59819ddb0445a7167cd4ebfd45c2361a..99b03bf625fe3e0b968d68ebf704efd52abda502 100644 --- a/ud/mockE2e_test.go +++ b/ud/mockE2e_test.go @@ -9,18 +9,18 @@ package ud import ( "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/catalog" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/receive" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/elixxir/crypto/cyclic" cryptoE2e "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/crypto/fastRNG" @@ -46,6 +46,10 @@ type mockE2e struct { key *rsa.PrivateKey } +func (m mockE2e) GetBackupContainer() *xxdk.Container { + return &xxdk.Container{} +} + func (m mockE2e) GetE2E() e2e.Handler { return mockE2eHandler{} } diff --git a/ud/mockStore_test.go b/ud/mockStore_test.go index 6e1b336d9e25246f5bc76bae47c5ebddfd2db96a..c86276a77587b69729ed450050690fe0bf58ae64 100644 --- a/ud/mockStore_test.go +++ b/ud/mockStore_test.go @@ -8,9 +8,9 @@ package ud import ( - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/version" diff --git a/ud/networkManager_test.go b/ud/networkManager_test.go index 56186c12c849eef83fde6bba26c89d8dee5b6abc..71be04b3607a7852ccf4a321a2cb549f2539cd66 100644 --- a/ud/networkManager_test.go +++ b/ud/networkManager_test.go @@ -9,13 +9,13 @@ package ud import ( "bytes" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/format" diff --git a/ud/register.go b/ud/register.go index d70eaf0e2c71e80e859be942e19b3e6aa1196383..0cf1f7ba80fe6e1507873db227d9c83f054da68d 100644 --- a/ud/register.go +++ b/ud/register.go @@ -95,6 +95,7 @@ func (m *Manager) register(username string, networkSignature []byte, m.getEventReporter().Report(1, "UserDiscovery", "Registration", fmt.Sprintf("User Registered with UD: %+v", username)) + m.user.GetBackupContainer().TriggerBackup("User registered with UD") } return err diff --git a/ud/registered.go b/ud/registered.go index f19bcc03e63adebe5b3992131e61af1cc91008e1..648577c01d2616ae801502d1dc83bc8c2bea798b 100644 --- a/ud/registered.go +++ b/ud/registered.go @@ -11,7 +11,7 @@ import ( "encoding/binary" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/xx_network/primitives/netTime" ) diff --git a/ud/remove.go b/ud/remove.go index 71db207ed6c263e8024f3df6cd1e56aba3cb8a29..e2a719c70f6e0d40659dbf0b6dbbedb3b327632d 100644 --- a/ud/remove.go +++ b/ud/remove.go @@ -26,8 +26,13 @@ import ( func (m *Manager) RemoveFact(f fact.Fact) error { jww.INFO.Printf("ud.RemoveFact(%s)", f.Stringify()) m.factMux.Lock() - defer m.factMux.Unlock() - return m.removeFact(f, m.comms) + err := m.removeFact(f, m.comms) + m.factMux.Unlock() + if err != nil { + return err + } + m.user.GetBackupContainer().TriggerBackup("Removed fact") + return nil } // removeFact is a helper function which contacts the UD service diff --git a/ud/search.go b/ud/search.go index 43bf08518350929df2c652724bf8706e1ac74b38..11d9c29809d77abd628804b60b0daa077d7d1c37 100644 --- a/ud/search.go +++ b/ud/search.go @@ -12,10 +12,10 @@ import ( "github.com/golang/protobuf/proto" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/factID" diff --git a/ud/search_test.go b/ud/search_test.go index 596d7768d191a05368f50e663f4d23dd04765cf4..3e8e91ec1262e2a8825edc91f6e6c37b44fd91f2 100644 --- a/ud/search_test.go +++ b/ud/search_test.go @@ -8,8 +8,8 @@ package ud import ( - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/single" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/crypto/csprng" diff --git a/ud/store/facts_test.go b/ud/store/facts_test.go index 3155d383b36e7eb95d218f3389fa62e0ba9be0b6..fe3e2a85fbb2a1436e23352c2bc06f159f4c345a 100644 --- a/ud/store/facts_test.go +++ b/ud/store/facts_test.go @@ -8,7 +8,7 @@ package ud import ( - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/fact" "reflect" diff --git a/ud/store/store.go b/ud/store/store.go index 5e5cfaaa8af245e9467e08bd4fa8d809c4b77b10..24d44d28e7ea0534907c12f91649958287657f38 100644 --- a/ud/store/store.go +++ b/ud/store/store.go @@ -12,7 +12,7 @@ package ud import ( "encoding/json" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/netTime" "sync" diff --git a/ud/store/store_test.go b/ud/store/store_test.go index a319d81284e122e420c89efc3a3828826c95ae3a..6099e6aff99f3fa2f4670c4e61165e30d279efcd 100644 --- a/ud/store/store_test.go +++ b/ud/store/store_test.go @@ -9,7 +9,7 @@ package ud import ( "bytes" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/fact" "reflect" diff --git a/ud/udMessages.pb.go b/ud/udMessages.pb.go index 8a4745c74317c8934d10f2943af4cc79c0d8dc6d..a775d2aa17ee0e2ef419961829e43986edf56eb2 100644 --- a/ud/udMessages.pb.go +++ b/ud/udMessages.pb.go @@ -7,8 +7,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.6 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: udMessages.proto package ud diff --git a/ud/utils_test.go b/ud/utils_test.go index 23de7e4c9eaa26c167f55eeaae452f9e48850e27..1ffce2b8452bea4d086c23c7b3a2f832d91d8512 100644 --- a/ud/utils_test.go +++ b/ud/utils_test.go @@ -9,14 +9,14 @@ package ud import ( "github.com/golang/protobuf/proto" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" - store "gitlab.com/elixxir/client/ud/store" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" + store "gitlab.com/elixxir/client/v4/ud/store" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/xxdk/cmix.go b/xxdk/cmix.go index aa8fb76833fc97e2e73190294082b38a0c42d6f4..66ce1e4b946f0dd1ccb5fac6b9e1f3a15d54f1d7 100644 --- a/xxdk/cmix.go +++ b/xxdk/cmix.go @@ -15,13 +15,13 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/interfaces" - "gitlab.com/elixxir/client/registration" - "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/event" + "gitlab.com/elixxir/client/v4/interfaces" + "gitlab.com/elixxir/client/v4/registration" + "gitlab.com/elixxir/client/v4/stoppable" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" "gitlab.com/elixxir/comms/client" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" diff --git a/xxdk/e2e.go b/xxdk/e2e.go index a137abca793ecb00267571fc6a4ade03d374a1e3..fdf78fc29dd10cbf35590d26b196d0325fb5e25a 100644 --- a/xxdk/e2e.go +++ b/xxdk/e2e.go @@ -13,13 +13,13 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/auth" + "gitlab.com/elixxir/client/v4/cmix/identity/receptionID" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/rekey" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/xx" diff --git a/xxdk/event.go b/xxdk/event.go index 5eccd2d479e940a15c22437938d1e14d5be19d8c..8c530059d335cf03a8cb69154d86bdfcb729bf74 100644 --- a/xxdk/event.go +++ b/xxdk/event.go @@ -8,7 +8,7 @@ package xxdk import ( - "gitlab.com/elixxir/client/event" + "gitlab.com/elixxir/client/v4/event" ) // ReportEvent reports an event from the client to api users, providing a diff --git a/xxdk/identity.go b/xxdk/identity.go index d0dee696806b356350ce9a6a7c095e3099ace67e..867b8646986e5d4d9b95783ec341508c4ad1bdf4 100644 --- a/xxdk/identity.go +++ b/xxdk/identity.go @@ -11,8 +11,8 @@ import ( "encoding/json" "gitlab.com/elixxir/primitives/fact" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/v4/storage/user" + "gitlab.com/elixxir/client/v4/storage/versioned" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/diffieHellman" diff --git a/xxdk/params.go b/xxdk/params.go index 7fe436a2c17eea97dd773fdc0ebadc3ee146917b..86241225b79995af00993c9b1f0385299869071a 100644 --- a/xxdk/params.go +++ b/xxdk/params.go @@ -13,11 +13,11 @@ package xxdk import ( "encoding/json" - "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - "gitlab.com/elixxir/client/e2e/rekey" + "gitlab.com/elixxir/client/v4/auth" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/e2e" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/v4/e2e/rekey" ) // CMIXParams contains the parameters for Network tracking and for specific CMIX diff --git a/xxdk/permissioning.go b/xxdk/permissioning.go index 54429182de52454d36de0b93faac8f428af72e82..55a62dbabd9dc19ee391f0acd91984b7d78173ed 100644 --- a/xxdk/permissioning.go +++ b/xxdk/permissioning.go @@ -10,8 +10,8 @@ package xxdk import ( "encoding/json" "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/user" ) // registerWithPermissioning returns an error if registration fails. diff --git a/xxdk/precan.go b/xxdk/precan.go index 3e1a58256b1d1ed316ab5718d0d5248c71d64d13..f58b27b75affd5f07b1fdbba65c33d904c8550ca 100644 --- a/xxdk/precan.go +++ b/xxdk/precan.go @@ -12,12 +12,12 @@ import ( "math/rand" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" - util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/v4/e2e/ratchet/partner/session" + util "gitlab.com/elixxir/client/v4/storage/utility" "gitlab.com/elixxir/crypto/contact" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/v4/storage" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" ) diff --git a/xxdk/services.go b/xxdk/services.go index 840215dc1d3998ebc301766b6232ebef10384d39..dc719ce861b68edaf6eb52bf4d60182487db5f12 100644 --- a/xxdk/services.go +++ b/xxdk/services.go @@ -9,7 +9,7 @@ package xxdk import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "sync" "time" ) diff --git a/xxdk/services_test.go b/xxdk/services_test.go index 18846b9c0c2d5d7d3ac63b98fa5ab378b691108c..0bfec62f3cafa1db74cc7fcbfa209e29f2a450d2 100644 --- a/xxdk/services_test.go +++ b/xxdk/services_test.go @@ -9,7 +9,7 @@ package xxdk import ( "github.com/pkg/errors" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/stoppable" "reflect" "testing" "time" diff --git a/xxdk/user.go b/xxdk/user.go index b9fe69e58d529d76f2623880c0fdcef764a246e2..cac845864c7836b742a391bc2785f3d20c36d986 100644 --- a/xxdk/user.go +++ b/xxdk/user.go @@ -18,7 +18,7 @@ import ( "gitlab.com/elixxir/crypto/diffieHellman" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/v4/storage/user" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" diff --git a/xxdk/utilsInterfaces_test.go b/xxdk/utilsInterfaces_test.go index ba08622046afcee2c7268202b2ba7fd1785d1539..a0fb0ebde5edc14548b1ed76d881146cf1ac1518 100644 --- a/xxdk/utilsInterfaces_test.go +++ b/xxdk/utilsInterfaces_test.go @@ -10,12 +10,12 @@ package xxdk import ( "time" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/cmix/identity" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/v4/cmix" + "gitlab.com/elixxir/client/v4/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/identity" + "gitlab.com/elixxir/client/v4/cmix/message" + "gitlab.com/elixxir/client/v4/cmix/rounds" + "gitlab.com/elixxir/client/v4/stoppable" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/primitives/format" diff --git a/xxdk/utils_test.go b/xxdk/utils_test.go index 40098e5beb2abf5b05bc1556e232e373a032c1dd..31988d86c42cfcadedc85976fcd5fd653c94276b 100644 --- a/xxdk/utils_test.go +++ b/xxdk/utils_test.go @@ -10,7 +10,7 @@ package xxdk import ( "testing" - "gitlab.com/elixxir/client/cmix/gateway" + "gitlab.com/elixxir/client/v4/cmix/gateway" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" diff --git a/xxdk/version_vars.go b/xxdk/version_vars.go index 3b20041838279ba5b1d3f54fdec33887fa7b21b7..7645837f31c40450d14de950daed78a8050a32e0 100644 --- a/xxdk/version_vars.go +++ b/xxdk/version_vars.go @@ -1,14 +1,14 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots at -// 2022-10-28 21:50:28.385979316 +0000 UTC m=+0.011426592 +// 2022-11-10 23:17:56.656714163 +0000 UTC m=+0.008851496 package xxdk -const GITVERSION = `589e2852 update deps` -const SEMVER = "4.3.3" -const DEPENDENCIES = `module gitlab.com/elixxir/client +const GITVERSION = `d11b7550 Fix bindings` +const SEMVER = "4.3.6" +const DEPENDENCIES = `module gitlab.com/elixxir/client/v4 -go 1.17 +go 1.19 require ( github.com/cloudflare/circl v1.2.0 @@ -22,13 +22,13 @@ require ( github.com/spf13/viper v1.12.0 github.com/stretchr/testify v1.8.0 gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f - gitlab.com/elixxir/comms v0.0.4-0.20221028214815-365171b3cb36 - gitlab.com/elixxir/crypto v0.0.7-0.20221028214442-29091a3c04b1 + gitlab.com/elixxir/comms v0.0.4-0.20221110181420-84bca6216fe4 + gitlab.com/elixxir/crypto v0.0.7-0.20221110181326-dd7e5293feb0 gitlab.com/elixxir/ekv v0.2.1 - gitlab.com/elixxir/primitives v0.0.3-0.20221025020430-f5d2eb330fbc - gitlab.com/xx_network/comms v0.0.4-0.20221027213956-c8a8cf68ee4f - gitlab.com/xx_network/crypto v0.0.5-0.20221025020316-517fa8f91d2c - gitlab.com/xx_network/primitives v0.0.4-0.20221025020003-cbec15a71b8f + gitlab.com/elixxir/primitives v0.0.3-0.20221110181119-e83320a48b13 + gitlab.com/xx_network/comms v0.0.4-0.20221110181111-4f0694876936 + gitlab.com/xx_network/crypto v0.0.5-0.20221110181048-76f0c556fe95 + gitlab.com/xx_network/primitives v0.0.4-0.20221110180011-fd6ea3058225 go.uber.org/ratelimit v0.2.0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c @@ -37,7 +37,7 @@ require ( ) require ( - git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221027213839-7343cd399f14 // indirect + git.xx.network/elixxir/grpc-web-go-client v0.0.0-20221102223039-dc1f37d94e70 // indirect github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect github.com/badoux/checkmail v1.2.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect diff --git a/xxmutils/restoreContacts.go b/xxmutils/restoreContacts.go index 0ee9363130c1d302a822d1509447f52cd5ae1e56..57861126578c613972f8504d9361a872fcf49d39 100644 --- a/xxmutils/restoreContacts.go +++ b/xxmutils/restoreContacts.go @@ -11,8 +11,8 @@ import ( "encoding/json" "errors" "fmt" - "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/client/v4/single" + "gitlab.com/elixxir/client/v4/xxdk" "gitlab.com/xx_network/primitives/netTime" "math" "strings" @@ -21,10 +21,10 @@ import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/interfaces" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/elixxir/client/ud" + "gitlab.com/elixxir/client/v4/interfaces" + "gitlab.com/elixxir/client/v4/storage" + "gitlab.com/elixxir/client/v4/storage/versioned" + "gitlab.com/elixxir/client/v4/ud" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" )