Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add networked-signer tests #3613

Open
wants to merge 39 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
321dd52
Move local-signer to its own package
richardpringle Dec 13, 2024
b731e7e
Prepare bls-tests for multiple signer-types
richardpringle Dec 18, 2024
435d116
Add test for networked signer
richardpringle Dec 19, 2024
a2ab5d4
Expose secret-key-length from the bls package
richardpringle Jan 6, 2025
7f49c85
Rename signers/local to signers/localsigner
richardpringle Jan 6, 2025
9ad13b2
Remove redundant comment
richardpringle Jan 6, 2025
9fd0c12
Rename local.go to localsigner.go
richardpringle Jan 6, 2025
67885b3
Rename bls_test to blstest
richardpringle Jan 6, 2025
65d61a0
Rename bls/test dir to blstest
richardpringle Jan 6, 2025
77367f2
Revert "Rename bls/test dir to blstest"
richardpringle Jan 6, 2025
eeb846a
Revert "Rename bls_test to blstest"
richardpringle Jan 6, 2025
7027a47
Fix bls tests
richardpringle Jan 6, 2025
18d1f7c
Follow test package pattern from the rest of the repo
richardpringle Jan 6, 2025
c4170e7
Revert "Follow test package pattern from the rest of the repo"
richardpringle Jan 6, 2025
1532698
Use blstest convention
richardpringle Jan 6, 2025
db266c6
Merge remote-tracking branch 'origin/master' into encapsulate-signer
richardpringle Jan 6, 2025
988920f
Fix accidental search-and-replace
richardpringle Jan 6, 2025
8885a5c
Fix remaining references to old bls methods
richardpringle Jan 6, 2025
1ca1be1
Add updated coreth
richardpringle Jan 6, 2025
41830aa
Update tests to use localsigner
richardpringle Jan 7, 2025
6844aeb
Merge remote-tracking branch 'origin/master' into encapsulate-signer
richardpringle Jan 7, 2025
d92c69c
Fix SecretKeyFromBytes
richardpringle Jan 7, 2025
a679b44
Fix linter errors
richardpringle Jan 7, 2025
67bc45b
More lint fixes
richardpringle Jan 7, 2025
44814bd
Reset tree.go file
richardpringle Jan 7, 2025
695329f
Add missing license header
richardpringle Jan 7, 2025
885230d
More lint-fixes
richardpringle Jan 8, 2025
9fdfe99
Merge remote-tracking branch 'origin/master' into encapsulate-signer
richardpringle Jan 8, 2025
9d25f68
Merge remote-tracking branch 'origin/master' into encapsulate-signer
richardpringle Jan 8, 2025
494864f
Fix bls-tests
richardpringle Jan 8, 2025
3b7858b
Make sure there are signers for the test
richardpringle Jan 8, 2025
75c98c5
More bls-test fixes
richardpringle Jan 8, 2025
5835988
Reset config/config.md
richardpringle Jan 9, 2025
1bca3ef
Split bls tests
richardpringle Jan 10, 2025
a723269
Merge remote-tracking branch 'origin/master' into encapsulate-signer
richardpringle Jan 14, 2025
3c1ce6c
Move bls public_test.go back into the bls package
richardpringle Jan 14, 2025
ad10cb2
Move bls-tests back to bls package
richardpringle Jan 14, 2025
0533b15
Fix linting
richardpringle Jan 14, 2025
a429a32
Add missing license headers
richardpringle Jan 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import (
"github.com/ava-labs/avalanchego/utils/compression"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/ips"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/perms"
Expand Down Expand Up @@ -647,7 +648,7 @@ func getStakingTLSCert(v *viper.Viper) (tls.Certificate, error) {

func getStakingSigner(v *viper.Viper) (bls.Signer, error) {
if v.GetBool(StakingEphemeralSignerEnabledKey) {
key, err := bls.NewSigner()
key, err := localsigner.NewSigner()
if err != nil {
return nil, fmt.Errorf("couldn't generate ephemeral signing key: %w", err)
}
Expand All @@ -660,7 +661,7 @@ func getStakingSigner(v *viper.Viper) (bls.Signer, error) {
if err != nil {
return nil, fmt.Errorf("unable to decode base64 content: %w", err)
}
key, err := bls.SecretKeyFromBytes(signerKeyContent)
key, err := localsigner.SecretKeyFromBytes(signerKeyContent)
if err != nil {
return nil, fmt.Errorf("couldn't parse signing key: %w", err)
}
Expand All @@ -674,7 +675,7 @@ func getStakingSigner(v *viper.Viper) (bls.Signer, error) {
if err != nil {
return nil, err
}
key, err := bls.SecretKeyFromBytes(signingKeyBytes)
key, err := localsigner.SecretKeyFromBytes(signingKeyBytes)
if err != nil {
return nil, fmt.Errorf("couldn't parse signing key: %w", err)
}
Expand All @@ -685,7 +686,7 @@ func getStakingSigner(v *viper.Viper) (bls.Signer, error) {
return nil, errMissingStakingSigningKeyFile
}

key, err := bls.NewSigner()
key, err := localsigner.NewSigner()
if err != nil {
return nil, fmt.Errorf("couldn't generate new signing key: %w", err)
}
Expand Down
1 change: 0 additions & 1 deletion config/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,6 @@ specified. If not given, uses default genesis data.

See the documentation for the genesis JSON format [here](https://github.com/ava-labs/avalanchego/blob/master/genesis/README.md) and an example used for the local network genesis [here](https://github.com/ava-labs/avalanchego/blob/master/genesis/).


Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: undo diff in this line since it's unrelated

#### `--genesis-file-content` (string)

As an alternative to `--genesis-file`, it allows specifying base64 encoded genesis data to use.
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/DataDog/zstd v1.5.2
github.com/NYTimes/gziphandler v1.1.1
github.com/antithesishq/antithesis-sdk-go v0.3.8
github.com/ava-labs/coreth v0.14.1-0.20241230191223-351149733d35
github.com/ava-labs/coreth v0.14.1-0.20250106222550-c575b84e58f7
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60
github.com/btcsuite/btcd/btcutil v1.1.3
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ github.com/antithesishq/antithesis-sdk-go v0.3.8/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/ava-labs/coreth v0.14.1-0.20241230191223-351149733d35 h1:qBNnMleaJ7yWjNiDdV7wIf/e/PxubB+Ww7Mfx4QN4p8=
github.com/ava-labs/coreth v0.14.1-0.20241230191223-351149733d35/go.mod h1:nvQqJem4MuE0pU93aqBPsaEZx9NnXT0lI8d6rrQS5uY=
github.com/ava-labs/coreth v0.14.1-0.20250106222550-c575b84e58f7 h1:aAgV8u1Qnv3kev4cnV1PdwSL8rv1ic53sw6nmm0/ngs=
github.com/ava-labs/coreth v0.14.1-0.20250106222550-c575b84e58f7/go.mod h1:mzAii2r+iq2zCYTxk7obnOQ004BahdX26O8Lp0Ftpgc=
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60 h1:EL66gtXOAwR/4KYBjOV03LTWgkEXvLePribLlJNu4g0=
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60/go.mod h1:/7qKobTfbzBu7eSTVaXMTr56yTYk4j2Px6/8G+idxHo=
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
Expand Down
4 changes: 2 additions & 2 deletions network/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import (
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/bloom"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/ips"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/math/meter"
Expand Down Expand Up @@ -175,7 +175,7 @@ func newTestNetwork(t *testing.T, count int) (*testDialer, []*testListener, []id
require.NoError(t, err)
nodeID := ids.NodeIDFromCert(cert)

blsKey, err := bls.NewSigner()
blsKey, err := localsigner.NewSigner()
require.NoError(t, err)

config := defaultConfig
Expand Down
3 changes: 2 additions & 1 deletion network/p2p/acp118/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/ava-labs/avalanchego/proto/pb/sdk"
"github.com/ava-labs/avalanchego/snow/engine/common"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/set"
"github.com/ava-labs/avalanchego/vms/platformvm/warp"
)
Expand Down Expand Up @@ -72,7 +73,7 @@ func TestHandler(t *testing.T) {
require := require.New(t)

ctx := context.Background()
sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)
pk := sk.PublicKey()
networkID := uint32(123)
Expand Down
4 changes: 2 additions & 2 deletions network/peer/ip_signer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

"github.com/ava-labs/avalanchego/staking"
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
)

func TestIPSigner(t *testing.T) {
Expand All @@ -28,7 +28,7 @@ func TestIPSigner(t *testing.T) {
require.NoError(err)

tlsKey := tlsCert.PrivateKey.(crypto.Signer)
blsKey, err := bls.NewSigner()
blsKey, err := localsigner.NewSigner()
require.NoError(err)

s := NewIPSigner(dynIP, tlsKey, blsKey)
Expand Down
3 changes: 2 additions & 1 deletion network/peer/ip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

"github.com/ava-labs/avalanchego/staking"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
)

func TestSignedIpVerify(t *testing.T) {
Expand All @@ -21,7 +22,7 @@ func TestSignedIpVerify(t *testing.T) {
cert1, err := staking.ParseCertificate(tlsCert1.Leaf.Raw)
require.NoError(t, err)
tlsKey1 := tlsCert1.PrivateKey.(crypto.Signer)
blsKey1, err := bls.NewSigner()
blsKey1, err := localsigner.NewSigner()
require.NoError(t, err)

tlsCert2, err := staking.NewTLSCert()
Expand Down
8 changes: 4 additions & 4 deletions network/peer/peer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
"github.com/ava-labs/avalanchego/upgrade"
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/math/meter"
"github.com/ava-labs/avalanchego/utils/resource"
Expand Down Expand Up @@ -111,7 +111,7 @@ func newRawTestPeer(t *testing.T, config Config) *rawTestPeer {
1,
))
tls := tlsCert.PrivateKey.(crypto.Signer)
bls, err := bls.NewSigner()
bls, err := localsigner.NewSigner()
require.NoError(err)

config.IPSigner = NewIPSigner(ip, tls, bls)
Expand Down Expand Up @@ -327,7 +327,7 @@ func TestInvalidBLSKeyDisconnects(t *testing.T) {
1,
))

bogusBLSKey, err := bls.NewSigner()
bogusBLSKey, err := localsigner.NewSigner()
require.NoError(err)
require.NoError(rawPeer1.config.Validators.AddStaker(
constants.PrimaryNetworkID,
Expand All @@ -348,7 +348,7 @@ func TestInvalidBLSKeyDisconnects(t *testing.T) {
func TestShouldDisconnect(t *testing.T) {
peerID := ids.GenerateTestNodeID()
txID := ids.GenerateTestID()
blsKey, err := bls.NewSigner()
blsKey, err := localsigner.NewSigner()
require.NoError(t, err)

tests := []struct {
Expand Down
4 changes: 2 additions & 2 deletions network/peer/test_peer.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
"github.com/ava-labs/avalanchego/upgrade"
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/math/meter"
"github.com/ava-labs/avalanchego/utils/resource"
Expand Down Expand Up @@ -101,7 +101,7 @@ func StartTestPeer(
}

tlsKey := tlsCert.PrivateKey.(crypto.Signer)
blsKey, err := bls.NewSigner()
blsKey, err := localsigner.NewSigner()
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions network/test_network.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import (
"github.com/ava-labs/avalanchego/upgrade"
"github.com/ava-labs/avalanchego/utils"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/logging"
"github.com/ava-labs/avalanchego/utils/math/meter"
"github.com/ava-labs/avalanchego/utils/resource"
Expand Down Expand Up @@ -84,7 +84,7 @@ func NewTestNetworkConfig(
return nil, err
}

blsKey, err := bls.NewSigner()
blsKey, err := localsigner.NewSigner()
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions snow/snowtest/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
"github.com/ava-labs/avalanchego/snow/validators/validatorstest"
"github.com/ava-labs/avalanchego/upgrade/upgradetest"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/logging"
)

Expand Down Expand Up @@ -52,7 +52,7 @@ func ConsensusContext(ctx *snow.Context) *snow.ConsensusContext {
func Context(tb testing.TB, chainID ids.ID) *snow.Context {
require := require.New(tb)

secretKey, err := bls.NewSigner()
secretKey, err := localsigner.NewSigner()
require.NoError(err)
publicKey := secretKey.PublicKey()

Expand Down
9 changes: 5 additions & 4 deletions snow/validators/gvalidators/validator_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/ava-labs/avalanchego/snow/validators"
"github.com/ava-labs/avalanchego/snow/validators/validatorsmock"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/vms/rpcchainvm/grpcutils"

pb "github.com/ava-labs/avalanchego/proto/pb/validatorstate"
Expand Down Expand Up @@ -135,15 +136,15 @@ func TestGetValidatorSet(t *testing.T) {
state := setupState(t, ctrl)

// Happy path
sk0, err := bls.NewSigner()
sk0, err := localsigner.NewSigner()
require.NoError(err)
vdr0 := &validators.GetValidatorOutput{
NodeID: ids.GenerateTestNodeID(),
PublicKey: sk0.PublicKey(),
Weight: 1,
}

sk1, err := bls.NewSigner()
sk1, err := localsigner.NewSigner()
require.NoError(err)
vdr1 := &validators.GetValidatorOutput{
NodeID: ids.GenerateTestNodeID(),
Expand Down Expand Up @@ -181,7 +182,7 @@ func TestGetValidatorSet(t *testing.T) {
func TestPublicKeyDeserialize(t *testing.T) {
require := require.New(t)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)
pk := sk.PublicKey()

Expand Down Expand Up @@ -222,7 +223,7 @@ func setupValidatorSet(b *testing.B, size int) map[ids.NodeID]*validators.GetVal
b.Helper()

set := make(map[ids.NodeID]*validators.GetValidatorOutput, size)
sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(b, err)
pk := sk.PublicKey()
for i := 0; i < size; i++ {
Expand Down
15 changes: 8 additions & 7 deletions snow/validators/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/set"

safemath "github.com/ava-labs/avalanchego/utils/math"
Expand Down Expand Up @@ -214,7 +215,7 @@ func TestGet(t *testing.T) {
_, ok := m.GetValidator(subnetID, nodeID)
require.False(ok)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

pk := sk.PublicKey()
Expand Down Expand Up @@ -304,7 +305,7 @@ func TestGetMap(t *testing.T) {
mp := m.GetMap(subnetID)
require.Empty(mp)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

pk := sk.PublicKey()
Expand Down Expand Up @@ -404,7 +405,7 @@ func TestSample(t *testing.T) {
require.NoError(err)
require.Empty(sampled)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

nodeID0 := ids.GenerateTestNodeID()
Expand Down Expand Up @@ -464,7 +465,7 @@ func TestString(t *testing.T) {
func TestAddCallback(t *testing.T) {
require := require.New(t)

expectedSK, err := bls.NewSigner()
expectedSK, err := localsigner.NewSigner()
require.NoError(err)

var (
Expand Down Expand Up @@ -512,7 +513,7 @@ func TestAddCallback(t *testing.T) {
func TestAddWeightCallback(t *testing.T) {
require := require.New(t)

expectedSK, err := bls.NewSigner()
expectedSK, err := localsigner.NewSigner()
require.NoError(err)

var (
Expand Down Expand Up @@ -595,7 +596,7 @@ func TestAddWeightCallback(t *testing.T) {
func TestRemoveWeightCallback(t *testing.T) {
require := require.New(t)

expectedSK, err := bls.NewSigner()
expectedSK, err := localsigner.NewSigner()
require.NoError(err)

var (
Expand Down Expand Up @@ -678,7 +679,7 @@ func TestRemoveWeightCallback(t *testing.T) {
func TestRemoveCallback(t *testing.T) {
require := require.New(t)

expectedSK, err := bls.NewSigner()
expectedSK, err := localsigner.NewSigner()
require.NoError(err)

var (
Expand Down
9 changes: 5 additions & 4 deletions snow/validators/set_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/crypto/bls"
"github.com/ava-labs/avalanchego/utils/crypto/bls/signers/localsigner"
"github.com/ava-labs/avalanchego/utils/set"

safemath "github.com/ava-labs/avalanchego/utils/math"
Expand Down Expand Up @@ -165,7 +166,7 @@ func TestSetGet(t *testing.T) {
_, ok := s.Get(nodeID)
require.False(ok)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

pk := sk.PublicKey()
Expand Down Expand Up @@ -232,7 +233,7 @@ func TestSetMap(t *testing.T) {
m := s.Map()
require.Empty(m)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

pk := sk.PublicKey()
Expand Down Expand Up @@ -330,7 +331,7 @@ func TestSetSample(t *testing.T) {
require.NoError(err)
require.Empty(sampled)

sk, err := bls.NewSigner()
sk, err := localsigner.NewSigner()
require.NoError(err)

nodeID0 := ids.GenerateTestNodeID()
Expand Down Expand Up @@ -385,7 +386,7 @@ func TestSetAddCallback(t *testing.T) {
require := require.New(t)

nodeID0 := ids.BuildTestNodeID([]byte{1})
sk0, err := bls.NewSigner()
sk0, err := localsigner.NewSigner()
require.NoError(err)
pk0 := sk0.PublicKey()
txID0 := ids.GenerateTestID()
Expand Down
Loading
Loading