Skip to content

Commit 1a5e215

Browse files
morambrocopybara-github
authored andcommittedNov 11, 2024
Make primitiveset.PrimitiveSet an internal type
Also make `handle.Primitives` and `handle.PrimitivesWithKeyManager` internal by requiring a `internalapi.Token` argument. This API was never really intended to be used outside Tink; this change fixes this. This is a breaking change for users that rely on these APIs. If affected, please file an issue. PiperOrigin-RevId: 695450308 Change-Id: I048fd5245551393d9e55ec1c06eda415cb90d5a1
1 parent 3aae21b commit 1a5e215

22 files changed

+75
-55
lines changed
 

‎aead/aead_factory.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@ import (
1818
"fmt"
1919

2020
"github.com/tink-crypto/tink-go/v2/core/cryptofmt"
21-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
21+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2222
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2323
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
24+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2425
"github.com/tink-crypto/tink-go/v2/keyset"
2526
"github.com/tink-crypto/tink-go/v2/monitoring"
2627
"github.com/tink-crypto/tink-go/v2/tink"
2728
)
2829

2930
// New returns an AEAD primitive from the given keyset handle.
3031
func New(handle *keyset.Handle) (tink.AEAD, error) {
31-
ps, err := handle.Primitives()
32+
ps, err := handle.Primitives(internalapi.Token{})
3233
if err != nil {
3334
return nil, fmt.Errorf("aead_factory: cannot obtain primitive set: %s", err)
3435
}
@@ -38,7 +39,7 @@ func New(handle *keyset.Handle) (tink.AEAD, error) {
3839
// NewWithConfig creates an AEAD primitive from the given [keyset.Handle] using
3940
// the provided [Config].
4041
func NewWithConfig(handle *keyset.Handle, config keyset.Config) (tink.AEAD, error) {
41-
ps, err := handle.Primitives(keyset.WithConfig(config))
42+
ps, err := handle.Primitives(internalapi.Token{}, keyset.WithConfig(config))
4243
if err != nil {
4344
return nil, fmt.Errorf("aead_factory: cannot obtain primitive set with config: %s", err)
4445
}

‎daead/daead_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@ import (
1818
"fmt"
1919

2020
"github.com/tink-crypto/tink-go/v2/core/cryptofmt"
21-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
21+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2222
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2323
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
24+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2425
"github.com/tink-crypto/tink-go/v2/keyset"
2526
"github.com/tink-crypto/tink-go/v2/monitoring"
2627
"github.com/tink-crypto/tink-go/v2/tink"
2728
)
2829

2930
// New returns a DeterministicAEAD primitive from the given keyset handle.
3031
func New(handle *keyset.Handle) (tink.DeterministicAEAD, error) {
31-
ps, err := handle.Primitives()
32+
ps, err := handle.Primitives(internalapi.Token{})
3233
if err != nil {
3334
return nil, fmt.Errorf("daead_factory: cannot obtain primitive set: %s", err)
3435
}

‎hybrid/hybrid_decrypt_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@ import (
1818
"fmt"
1919

2020
"github.com/tink-crypto/tink-go/v2/core/cryptofmt"
21-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
21+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2222
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2323
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
24+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2425
"github.com/tink-crypto/tink-go/v2/keyset"
2526
"github.com/tink-crypto/tink-go/v2/monitoring"
2627
"github.com/tink-crypto/tink-go/v2/tink"
2728
)
2829

2930
// NewHybridDecrypt returns an HybridDecrypt primitive from the given keyset handle.
3031
func NewHybridDecrypt(handle *keyset.Handle) (tink.HybridDecrypt, error) {
31-
ps, err := handle.Primitives()
32+
ps, err := handle.Primitives(internalapi.Token{})
3233
if err != nil {
3334
return nil, fmt.Errorf("hybrid_factory: cannot obtain primitive set: %s", err)
3435
}

‎hybrid/hybrid_encrypt_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@ package hybrid
1717
import (
1818
"fmt"
1919

20-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
20+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2121
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2222
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
23+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
"github.com/tink-crypto/tink-go/v2/monitoring"
2526
"github.com/tink-crypto/tink-go/v2/tink"
2627
)
2728

2829
// NewHybridEncrypt returns an HybridEncrypt primitive from the given keyset handle.
2930
func NewHybridEncrypt(handle *keyset.Handle) (tink.HybridEncrypt, error) {
30-
ps, err := handle.Primitives()
31+
ps, err := handle.Primitives(internalapi.Token{})
3132
if err != nil {
3233
return nil, fmt.Errorf("hybrid_factory: cannot obtain primitive set: %s", err)
3334
}

‎internal/monitoringutil/monitoring_util.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"fmt"
2020
"strings"
2121

22-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
22+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2323
"github.com/tink-crypto/tink-go/v2/monitoring"
2424
tpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
2525
)

‎internal/monitoringutil/monitoring_util_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
"testing"
1919

2020
"github.com/google/go-cmp/cmp"
21-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
21+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2222
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
2323
"github.com/tink-crypto/tink-go/v2/monitoring"
2424
tpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
File renamed without changes.

‎core/primitiveset/primitiveset_test.go ‎internal/primitiveset/primitiveset_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"testing"
2020

2121
"github.com/google/go-cmp/cmp"
22-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
22+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2323
"github.com/tink-crypto/tink-go/v2/testutil"
2424
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
2525
)

‎jwt/jwt_mac_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ package jwt
1717
import (
1818
"fmt"
1919

20-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
20+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2121
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2222
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
23+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
"github.com/tink-crypto/tink-go/v2/monitoring"
2526
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
@@ -30,7 +31,7 @@ func NewMAC(handle *keyset.Handle) (MAC, error) {
3031
if handle == nil {
3132
return nil, fmt.Errorf("keyset handle can't be nil")
3233
}
33-
ps, err := handle.Primitives()
34+
ps, err := handle.Primitives(internalapi.Token{})
3435
if err != nil {
3536
return nil, fmt.Errorf("jwt_mac_factory: cannot obtain primitive set: %v", err)
3637
}

‎jwt/jwt_signer_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ package jwt
1717
import (
1818
"fmt"
1919

20-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
20+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2121
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2222
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
23+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
"github.com/tink-crypto/tink-go/v2/monitoring"
2526
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
@@ -30,7 +31,7 @@ func NewSigner(handle *keyset.Handle) (Signer, error) {
3031
if handle == nil {
3132
return nil, fmt.Errorf("keyset handle can't be nil")
3233
}
33-
ps, err := handle.Primitives()
34+
ps, err := handle.Primitives(internalapi.Token{})
3435
if err != nil {
3536
return nil, fmt.Errorf("jwt_signer_factory: cannot obtain primitive set: %v", err)
3637
}

‎jwt/jwt_verifier_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ package jwt
1717
import (
1818
"fmt"
1919

20-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
20+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2121
"github.com/tink-crypto/tink-go/v2/internal/internalregistry"
2222
"github.com/tink-crypto/tink-go/v2/internal/monitoringutil"
23+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
"github.com/tink-crypto/tink-go/v2/monitoring"
2526
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
@@ -30,7 +31,7 @@ func NewVerifier(handle *keyset.Handle) (Verifier, error) {
3031
if handle == nil {
3132
return nil, fmt.Errorf("keyset handle can't be nil")
3233
}
33-
ps, err := handle.Primitives()
34+
ps, err := handle.Primitives(internalapi.Token{})
3435
if err != nil {
3536
return nil, fmt.Errorf("jwt_verifier_factory: cannot obtain primitive set: %v", err)
3637
}

‎keyderivation/internal/streamingprf/streaming_prf_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ import (
1919
"fmt"
2020
"io"
2121

22-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
22+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
23+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
2526
)
@@ -29,7 +30,7 @@ func New(h *keyset.Handle) (StreamingPRF, error) {
2930
if h == nil {
3031
return nil, errors.New("keyset handle can't be nil")
3132
}
32-
ps, err := h.PrimitivesWithKeyManager(new(HKDFStreamingPRFKeyManager))
33+
ps, err := h.PrimitivesWithKeyManager(new(HKDFStreamingPRFKeyManager), internalapi.Token{})
3334
if err != nil {
3435
return nil, fmt.Errorf("streaming_prf_factory: cannot obtain primitive set: %v", err)
3536
}

‎keyderivation/keyset_deriver_factory.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import (
1818
"errors"
1919
"fmt"
2020

21-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
21+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
22+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2223
"github.com/tink-crypto/tink-go/v2/internal/protoserialization"
2324
"github.com/tink-crypto/tink-go/v2/keyset"
2425
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
@@ -31,7 +32,7 @@ func New(handle *keyset.Handle) (KeysetDeriver, error) {
3132
if handle == nil {
3233
return nil, errors.New("keyset_deriver_factory: keyset handle can't be nil")
3334
}
34-
ps, err := handle.Primitives()
35+
ps, err := handle.Primitives(internalapi.Token{})
3536
if err != nil {
3637
return nil, fmt.Errorf("keyset_deriver_factory: cannot obtain primitive set: %v", err)
3738
}

‎keyderivation/keyset_deriver_factory_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import (
2020

2121
"github.com/tink-crypto/tink-go/v2/aead"
2222
"github.com/tink-crypto/tink-go/v2/core/cryptofmt"
23-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
23+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
24+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2425
"github.com/tink-crypto/tink-go/v2/keyset"
2526
tinkpb "github.com/tink-crypto/tink-go/v2/proto/tink_go_proto"
2627
)
@@ -76,9 +77,9 @@ func TestNewWrappedKeysetDeriverWrongPrimitiveFails(t *testing.T) {
7677
if err != nil {
7778
t.Fatalf("keyset.NewHandle() err = %v, want nil", err)
7879
}
79-
ps, err := handle.Primitives()
80+
ps, err := handle.Primitives(internalapi.Token{})
8081
if err != nil {
81-
t.Fatalf("handle.Primitives() err = %v, want nil", err)
82+
t.Fatalf("handle.Primitives(internalapi.Token{}, ) err = %v, want nil", err)
8283
}
8384
if _, err := newWrappedKeysetDeriver(ps); err == nil {
8485
t.Errorf("newWrappedKeysetDeriver() err = nil, want non-nil")

‎keyset/handle.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"google.golang.org/protobuf/encoding/prototext"
2323
"google.golang.org/protobuf/proto"
2424

25-
"github.com/tink-crypto/tink-go/v2/core/primitiveset"
2625
"github.com/tink-crypto/tink-go/v2/core/registry"
2726
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
27+
"github.com/tink-crypto/tink-go/v2/internal/primitiveset"
2828
"github.com/tink-crypto/tink-go/v2/internal/protoserialization"
2929
"github.com/tink-crypto/tink-go/v2/internal/registryconfig"
3030
"github.com/tink-crypto/tink-go/v2/key"
@@ -467,7 +467,9 @@ func WithConfig(c Config) PrimitivesOption {
467467
//
468468
// The returned set is usually later "wrapped" into a class that implements
469469
// the corresponding Primitive-interface.
470-
func (h *Handle) Primitives(opts ...PrimitivesOption) (*primitiveset.PrimitiveSet, error) {
470+
//
471+
// NOTE: This is an internal API.
472+
func (h *Handle) Primitives(_ internalapi.Token, opts ...PrimitivesOption) (*primitiveset.PrimitiveSet, error) {
471473
p, err := h.primitives(nil, opts...)
472474
if err != nil {
473475
return nil, fmt.Errorf("keyset.Handle: %v", err)
@@ -487,7 +489,9 @@ func (h *Handle) Primitives(opts ...PrimitivesOption) (*primitiveset.PrimitiveSe
487489
//
488490
// The returned set is usually later "wrapped" into a class that implements
489491
// the corresponding Primitive-interface.
490-
func (h *Handle) PrimitivesWithKeyManager(km registry.KeyManager) (*primitiveset.PrimitiveSet, error) {
492+
//
493+
// NOTE: This is an internal API.
494+
func (h *Handle) PrimitivesWithKeyManager(km registry.KeyManager, _ internalapi.Token) (*primitiveset.PrimitiveSet, error) {
491495
p, err := h.primitives(km)
492496
if err != nil {
493497
return nil, fmt.Errorf("keyset.Handle: %v", err)

‎keyset/handle_test.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -499,9 +499,9 @@ func TestPrimitivesReturnsError(t *testing.T) {
499499
}
500500
for _, tc := range testCases {
501501
t.Run(tc.name, func(t *testing.T) {
502-
_, err := tc.handle.Primitives()
502+
_, err := tc.handle.Primitives(internalapi.Token{})
503503
if err == nil {
504-
t.Errorf("handle.Primitives() err = nil, want err")
504+
t.Errorf("handle.Primitives(internalapi.Token{}, ) err = nil, want err")
505505
}
506506
})
507507
}
@@ -523,9 +523,9 @@ func TestPrimitivesWithKeyManagerReturnsError(t *testing.T) {
523523
}
524524
for _, tc := range testCases {
525525
t.Run(tc.name, func(t *testing.T) {
526-
_, err := tc.handle.PrimitivesWithKeyManager(&testKeyManager{})
526+
_, err := tc.handle.PrimitivesWithKeyManager(&testKeyManager{}, internalapi.Token{})
527527
if err == nil {
528-
t.Errorf("handle.PrimitivesWithKeyManager(&testKeyManager{}) err = nil, want err")
528+
t.Errorf("handle.PrimitivesWithKeyManager() err = nil, want err")
529529
}
530530
})
531531
}
@@ -884,15 +884,15 @@ func TestPrimitivesWithConfig(t *testing.T) {
884884
if err != nil {
885885
t.Fatalf("keyset.NewHandle(%v) = %v, want nil", template, err)
886886
}
887-
primitives, err := handle.Primitives(keyset.WithConfig(&testConfig{}))
887+
primitives, err := handle.Primitives(internalapi.Token{}, keyset.WithConfig(&testConfig{}))
888888
if err != nil {
889-
t.Fatalf("handle.Primitives(keyset.WithConfig(&testConfig{})) err = %v, want nil", err)
889+
t.Fatalf("handle.Primitives(internalapi.Token{}, keyset.WithConfig(&testConfig{})) err = %v, want nil", err)
890890
}
891891
if len(primitives.EntriesInKeysetOrder) != 1 {
892-
t.Fatalf("len(handle.Primitives()) = %d, want 1", len(primitives.EntriesInKeysetOrder))
892+
t.Fatalf("len(handle.Primitives(internalapi.Token{}, )) = %d, want 1", len(primitives.EntriesInKeysetOrder))
893893
}
894894
if _, ok := (primitives.Primary.Primitive).(testPrimitive); !ok {
895-
t.Errorf("handle.Primitives().Primary = %v, want instance of `testPrimitive`", primitives.Primary.Primitive)
895+
t.Errorf("handle.Primitives(internalapi.Token{}, ).Primary = %v, want instance of `testPrimitive`", primitives.Primary.Primitive)
896896
}
897897
}
898898

@@ -903,9 +903,9 @@ func TestPrimitivesWithMultipleConfigs(t *testing.T) {
903903
if err != nil {
904904
t.Fatalf("keyset.NewHandle(%v) = %v, want nil", template, err)
905905
}
906-
_, err = handle.Primitives(keyset.WithConfig(&testConfig{}), keyset.WithConfig(&testConfig{}))
906+
_, err = handle.Primitives(internalapi.Token{}, keyset.WithConfig(&testConfig{}), keyset.WithConfig(&testConfig{}))
907907
if err == nil { // if NO error
908-
t.Error("handle.Primitives(keyset.WithConfig(&testConfig{}), keyset.WithConfig(&testConfig{})) err = nil, want error")
908+
t.Error("handle.Primitives(internalapi.Token{}, keyset.WithConfig(&testConfig{}), keyset.WithConfig(&testConfig{})) err = nil, want error")
909909
}
910910
}
911911

@@ -934,9 +934,9 @@ func TestPrimitivesWithKeyManager(t *testing.T) {
934934
}
935935

936936
// Verify that with the custom key manager provided we get the custom primitive.
937-
primitives, err := handle.PrimitivesWithKeyManager(&testKeyManager{})
937+
primitives, err := handle.PrimitivesWithKeyManager(&testKeyManager{}, internalapi.Token{})
938938
if err != nil {
939-
t.Fatalf("handle.PrimitivesWithKeyManager(testKeyManager) err = %v, want nil", err)
939+
t.Fatalf("handle.PrimitivesWithKeyManager() err = %v, want nil", err)
940940
}
941941
if len(primitives.EntriesInKeysetOrder) != 1 {
942942
t.Fatalf("len(handle.PrimitivesWithKeyManager()) = %d, want 1", len(primitives.EntriesInKeysetOrder))
@@ -1188,9 +1188,9 @@ func TestPrimitivesIsThreadSafe(t *testing.T) {
11881188
for i := 0; i < 50; i++ {
11891189
t.Run(fmt.Sprintf("entry %d", i), func(t *testing.T) {
11901190
t.Parallel()
1191-
_, err := handle.Primitives()
1191+
_, err := handle.Primitives(internalapi.Token{})
11921192
if err != nil {
1193-
t.Fatalf("handle.Primitives() err = %v, want nil", err)
1193+
t.Fatalf("handle.Primitives(internalapi.Token{}, ) err = %v, want nil", err)
11941194
}
11951195
})
11961196
}
@@ -1217,9 +1217,9 @@ func TestPrimitivesWithKeyManagerIsThreadSafe(t *testing.T) {
12171217
for i := 0; i < 50; i++ {
12181218
t.Run(fmt.Sprintf("entry %d", i), func(t *testing.T) {
12191219
t.Parallel()
1220-
_, err := handle.PrimitivesWithKeyManager(keysetManager)
1220+
_, err := handle.PrimitivesWithKeyManager(keysetManager, internalapi.Token{})
12211221
if err != nil {
1222-
t.Fatalf("handle.PrimitivesWithKeyManager(keysetManager) err = %v, want nil", err)
1222+
t.Fatalf("handle.PrimitivesWithKeyManager() err = %v, want nil", err)
12231223
}
12241224
})
12251225
}

‎keyset/keyset_benchmark_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"testing"
2222

2323
"github.com/tink-crypto/tink-go/v2/aead"
24+
"github.com/tink-crypto/tink-go/v2/internal/internalapi"
2425
"github.com/tink-crypto/tink-go/v2/keyset"
2526
"github.com/tink-crypto/tink-go/v2/signature"
2627
"github.com/tink-crypto/tink-go/v2/testkeyset"
@@ -92,7 +93,7 @@ func BenchmarkHandlePrimitives(b *testing.B) {
9293
b.ResetTimer()
9394
b.ReportAllocs()
9495
for i := 0; i < b.N; i++ {
95-
if _, err := h.Primitives(); err != nil {
96+
if _, err := h.Primitives(internalapi.Token{}); err != nil {
9697
b.Fatalf("%v", err)
9798
}
9899
}

0 commit comments

Comments
 (0)
Please sign in to comment.