A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

publish xrpc endpoint lexicons. fix backfill and jetstream to actually validate records match schema

+1549 -626
+92 -88
go.mod
··· 3 3 go 1.25.4 4 4 5 5 require ( 6 - github.com/aws/aws-sdk-go v1.55.5 7 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64 6 + github.com/aws/aws-sdk-go v1.55.8 7 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725 8 8 github.com/distribution/distribution/v3 v3.0.0 9 9 github.com/distribution/reference v0.6.0 10 10 github.com/earthboundkid/versioninfo/v2 v2.24.1 11 11 github.com/go-chi/chi/v5 v5.2.3 12 12 github.com/go-chi/render v1.0.3 13 13 github.com/goki/freetype v1.0.5 14 - github.com/golang-jwt/jwt/v5 v5.2.2 14 + github.com/golang-jwt/jwt/v5 v5.3.0 15 15 github.com/google/uuid v1.6.0 16 16 github.com/gorilla/websocket v1.5.3 17 - github.com/ipfs/go-block-format v0.2.0 18 - github.com/ipfs/go-cid v0.4.1 19 - github.com/ipfs/go-datastore v0.6.0 17 + github.com/ipfs/go-block-format v0.2.3 18 + github.com/ipfs/go-cid v0.6.0 19 + github.com/ipfs/go-datastore v0.9.0 20 20 github.com/ipfs/go-ipfs-blockstore v1.3.1 21 - github.com/ipfs/go-ipld-format v0.6.0 22 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4 23 - github.com/klauspost/compress v1.18.0 24 - github.com/mattn/go-sqlite3 v1.14.32 21 + github.com/ipfs/go-ipld-format v0.6.3 22 + github.com/ipld/go-car v0.6.3 23 + github.com/klauspost/compress v1.18.2 24 + github.com/mattn/go-sqlite3 v1.14.33 25 25 github.com/microcosm-cc/bluemonday v1.0.27 26 26 github.com/multiformats/go-multihash v0.2.3 27 27 github.com/opencontainers/go-digest v1.0.0 28 - github.com/spf13/cobra v1.8.0 28 + github.com/spf13/cobra v1.10.2 29 29 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c 30 30 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef 31 - github.com/stretchr/testify v1.10.0 31 + github.com/stretchr/testify v1.11.1 32 32 github.com/whyrusleeping/cbor-gen v0.3.1 33 - github.com/yuin/goldmark v1.7.13 34 - go.opentelemetry.io/otel v1.32.0 35 - go.yaml.in/yaml/v4 v4.0.0-rc.2 36 - golang.org/x/crypto v0.44.0 37 - golang.org/x/image v0.34.0 38 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 39 - gorm.io/gorm v1.25.9 33 + github.com/yuin/goldmark v1.7.16 34 + go.opentelemetry.io/otel v1.39.0 35 + go.yaml.in/yaml/v4 v4.0.0-rc.3 36 + golang.org/x/crypto v0.47.0 37 + golang.org/x/image v0.35.0 38 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da 39 + gorm.io/gorm v1.31.1 40 40 ) 41 41 42 42 require ( ··· 44 44 github.com/ajg/form v1.5.1 // indirect 45 45 github.com/aymerick/douceur v0.2.0 // indirect 46 46 github.com/beorn7/perks v1.0.1 // indirect 47 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect 48 - github.com/cenkalti/backoff/v4 v4.3.0 // indirect 47 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0 // indirect 48 + github.com/cenkalti/backoff/v5 v5.0.3 // indirect 49 49 github.com/cespare/xxhash/v2 v2.3.0 // indirect 50 - github.com/coreos/go-systemd/v22 v22.5.0 // indirect 50 + github.com/coreos/go-systemd/v22 v22.6.0 // indirect 51 51 github.com/davecgh/go-spew v1.1.1 // indirect 52 52 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 53 - github.com/docker/docker-credential-helpers v0.8.2 // indirect 54 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect 53 + github.com/docker/docker-credential-helpers v0.9.5 // indirect 54 + github.com/docker/go-events v0.0.0-20250808211157-605354379745 // indirect 55 55 github.com/docker/go-metrics v0.0.1 // indirect 56 56 github.com/felixge/httpsnoop v1.0.4 // indirect 57 - github.com/go-jose/go-jose/v4 v4.1.2 // indirect 58 - github.com/go-logr/logr v1.4.2 // indirect 57 + github.com/gammazero/chanqueue v1.1.1 // indirect 58 + github.com/gammazero/deque v1.2.0 // indirect 59 + github.com/go-jose/go-jose/v4 v4.1.3 // indirect 60 + github.com/go-logr/logr v1.4.3 // indirect 59 61 github.com/go-logr/stdr v1.2.2 // indirect 60 62 github.com/gocql/gocql v1.7.0 // indirect 61 63 github.com/gogo/protobuf v1.3.2 // indirect 62 - github.com/golang/snappy v0.0.4 // indirect 63 - github.com/google/go-cmp v0.7.0 // indirect 64 - github.com/google/go-querystring v1.1.0 // indirect 64 + github.com/golang/snappy v1.0.0 // indirect 65 + github.com/google/go-querystring v1.2.0 // indirect 65 66 github.com/gorilla/css v1.0.1 // indirect 66 67 github.com/gorilla/handlers v1.5.2 // indirect 67 68 github.com/gorilla/mux v1.8.1 // indirect 68 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect 69 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 // indirect 69 70 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect 70 71 github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 71 - github.com/hashicorp/go-retryablehttp v0.7.5 // indirect 72 + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect 72 73 github.com/hashicorp/golang-lru v1.0.2 // indirect 73 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6 // indirect 74 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 // indirect 74 75 github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect 75 76 github.com/inconshreveable/mousetrap v1.1.0 // indirect 76 77 github.com/ipfs/bbloom v0.0.4 // indirect 77 - github.com/ipfs/go-blockservice v0.5.2 // indirect 78 + github.com/ipfs/boxo v0.35.2 // indirect 79 + github.com/ipfs/go-cidutil v0.1.0 // indirect 80 + github.com/ipfs/go-dsqueue v0.1.1 // indirect 78 81 github.com/ipfs/go-ipfs-ds-help v1.1.1 // indirect 79 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1 // indirect 80 82 github.com/ipfs/go-ipfs-util v0.0.3 // indirect 81 - github.com/ipfs/go-ipld-cbor v0.1.0 // indirect 82 - github.com/ipfs/go-ipld-legacy v0.2.1 // indirect 83 + github.com/ipfs/go-ipld-cbor v0.2.1 // indirect 84 + github.com/ipfs/go-ipld-legacy v0.2.2 // indirect 83 85 github.com/ipfs/go-libipfs v0.7.0 // indirect 84 86 github.com/ipfs/go-log v1.0.5 // indirect 85 - github.com/ipfs/go-log/v2 v2.5.1 // indirect 86 - github.com/ipfs/go-merkledag v0.11.0 // indirect 87 - github.com/ipfs/go-metrics-interface v0.0.1 // indirect 88 - github.com/ipfs/go-verifcid v0.0.3 // indirect 89 - github.com/ipld/go-codec-dagpb v1.6.0 // indirect 87 + github.com/ipfs/go-log/v2 v2.9.0 // indirect 88 + github.com/ipfs/go-metrics-interface v0.3.0 // indirect 89 + github.com/ipld/go-codec-dagpb v1.7.0 // indirect 90 90 github.com/ipld/go-ipld-prime v0.21.0 // indirect 91 91 github.com/jackc/pgpassfile v1.0.0 // indirect 92 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect 93 - github.com/jackc/pgx/v5 v5.5.0 // indirect 94 - github.com/jackc/puddle/v2 v2.2.1 // indirect 95 - github.com/jbenet/goprocess v0.1.4 // indirect 92 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect 93 + github.com/jackc/pgx/v5 v5.8.0 // indirect 94 + github.com/jackc/puddle/v2 v2.2.2 // indirect 96 95 github.com/jinzhu/inflection v1.0.0 // indirect 97 96 github.com/jinzhu/now v1.1.5 // indirect 98 97 github.com/jmespath/go-jmespath v0.4.0 // indirect 99 - github.com/klauspost/cpuid/v2 v2.2.7 // indirect 98 + github.com/klauspost/cpuid/v2 v2.3.0 // indirect 100 99 github.com/mattn/go-isatty v0.0.20 // indirect 101 100 github.com/minio/sha256-simd v1.0.1 // indirect 102 101 github.com/mr-tron/base58 v1.2.0 // indirect 103 102 github.com/multiformats/go-base32 v0.1.0 // indirect 104 103 github.com/multiformats/go-base36 v0.2.0 // indirect 105 104 github.com/multiformats/go-multibase v0.2.0 // indirect 106 - github.com/multiformats/go-varint v0.0.7 // indirect 105 + github.com/multiformats/go-multicodec v0.10.0 // indirect 106 + github.com/multiformats/go-varint v0.1.0 // indirect 107 107 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect 108 - github.com/opencontainers/image-spec v1.1.0 // indirect 108 + github.com/opencontainers/image-spec v1.1.1 // indirect 109 109 github.com/opentracing/opentracing-go v1.2.0 // indirect 110 110 github.com/pmezard/go-difflib v1.0.0 // indirect 111 111 github.com/polydawn/refmt v0.89.1-0.20221221234430-40501e09de1f // indirect 112 - github.com/prometheus/client_golang v1.20.5 // indirect 113 - github.com/prometheus/client_model v0.6.1 // indirect 114 - github.com/prometheus/common v0.60.1 // indirect 115 - github.com/prometheus/procfs v0.15.1 // indirect 116 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect 117 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 // indirect 118 - github.com/redis/go-redis/v9 v9.7.3 // indirect 112 + github.com/prometheus/client_golang v1.23.2 // indirect 113 + github.com/prometheus/client_model v0.6.2 // indirect 114 + github.com/prometheus/common v0.67.5 // indirect 115 + github.com/prometheus/otlptranslator v1.0.0 // indirect 116 + github.com/prometheus/procfs v0.19.2 // indirect 117 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2 // indirect 118 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2 // indirect 119 + github.com/redis/go-redis/v9 v9.17.2 // indirect 120 + github.com/rivo/uniseg v0.4.7 // indirect 119 121 github.com/sirupsen/logrus v1.9.3 // indirect 120 122 github.com/spaolacci/murmur3 v1.1.0 // indirect 121 - github.com/spf13/pflag v1.0.5 // indirect 123 + github.com/spf13/pflag v1.0.10 // indirect 122 124 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b // indirect 123 125 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect 124 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 // indirect 125 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 // indirect 126 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect 127 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 // indirect 128 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 // indirect 129 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 // indirect 130 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 // indirect 131 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect 132 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect 133 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect 134 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0 // indirect 135 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 // indirect 136 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 // indirect 137 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 // indirect 138 - go.opentelemetry.io/otel/log v0.8.0 // indirect 139 - go.opentelemetry.io/otel/metric v1.32.0 // indirect 140 - go.opentelemetry.io/otel/sdk v1.32.0 // indirect 141 - go.opentelemetry.io/otel/sdk/log v0.8.0 // indirect 142 - go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect 143 - go.opentelemetry.io/otel/trace v1.32.0 // indirect 144 - go.opentelemetry.io/proto/otlp v1.3.1 // indirect 126 + go.opentelemetry.io/auto/sdk v1.2.1 // indirect 127 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0 // indirect 128 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0 // indirect 129 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect 130 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0 // indirect 131 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0 // indirect 132 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0 // indirect 133 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0 // indirect 134 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect 135 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 // indirect 136 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect 137 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0 // indirect 138 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0 // indirect 139 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 // indirect 140 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 // indirect 141 + go.opentelemetry.io/otel/log v0.15.0 // indirect 142 + go.opentelemetry.io/otel/metric v1.39.0 // indirect 143 + go.opentelemetry.io/otel/sdk v1.39.0 // indirect 144 + go.opentelemetry.io/otel/sdk/log v0.15.0 // indirect 145 + go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect 146 + go.opentelemetry.io/otel/trace v1.39.0 // indirect 147 + go.opentelemetry.io/proto/otlp v1.9.0 // indirect 145 148 go.uber.org/atomic v1.11.0 // indirect 146 149 go.uber.org/multierr v1.11.0 // indirect 147 - go.uber.org/zap v1.26.0 // indirect 148 - golang.org/x/net v0.47.0 // indirect 150 + go.uber.org/zap v1.27.1 // indirect 151 + go.yaml.in/yaml/v2 v2.4.3 // indirect 152 + golang.org/x/net v0.49.0 // indirect 149 153 golang.org/x/sync v0.19.0 // indirect 150 - golang.org/x/sys v0.38.0 // indirect 151 - golang.org/x/text v0.32.0 // indirect 152 - golang.org/x/time v0.6.0 // indirect 153 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect 154 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect 155 - google.golang.org/grpc v1.68.0 // indirect 156 - google.golang.org/protobuf v1.35.1 // indirect 154 + golang.org/x/sys v0.40.0 // indirect 155 + golang.org/x/text v0.33.0 // indirect 156 + golang.org/x/time v0.14.0 // indirect 157 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 // indirect 158 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 // indirect 159 + google.golang.org/grpc v1.78.0 // indirect 160 + google.golang.org/protobuf v1.36.11 // indirect 157 161 gopkg.in/inf.v0 v0.9.1 // indirect 158 162 gopkg.in/yaml.v2 v2.4.0 // indirect 159 163 gopkg.in/yaml.v3 v3.0.1 // indirect 160 - gorm.io/driver/postgres v1.5.7 // indirect 161 - lukechampine.com/blake3 v1.2.1 // indirect 164 + gorm.io/driver/postgres v1.6.0 // indirect 165 + lukechampine.com/blake3 v1.4.1 // indirect 162 166 )
+254 -253
go.sum
··· 9 9 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 10 10 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM= 11 11 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= 12 - github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= 13 - github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= 12 + github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= 13 + github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= 14 14 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= 15 15 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= 16 - github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 17 - github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= 18 - github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 16 + github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= 17 + github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 19 18 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 20 19 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 21 20 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 22 21 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 23 22 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= 24 23 github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= 25 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64 h1:84EWie083DZT0eMo76kcZ0mBDcLUmWQu5UFE8/3ZW4k= 26 - github.com/bluesky-social/indigo v0.0.0-20251218205144-034a2c019e64/go.mod h1:KIy0FgNQacp4uv2Z7xhNkV3qZiUSGuRky97s7Pa4v+o= 24 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725 h1:gfrLAhE6PHun4MDypO/5hpnaHPd9Dbe9+JxZL0gC4ic= 25 + github.com/bluesky-social/indigo v0.0.0-20260106221649-6fcd9317e725/go.mod h1:KIy0FgNQacp4uv2Z7xhNkV3qZiUSGuRky97s7Pa4v+o= 27 26 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= 28 27 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= 29 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= 30 - github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= 31 - github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w= 28 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0 h1:o2FzZifLg+z/DN1OFmzTWzZZx/roaqt8IPZCIVco8r4= 29 + github.com/bshuster-repo/logrus-logstash-hook v1.1.0/go.mod h1:Q2aXOe7rNuPgbBtPCOzYyWDvKX7+FpxE5sRdvcPoui0= 32 30 github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= 33 31 github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= 34 - github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 35 32 github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= 36 33 github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 37 - github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= 38 - github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 39 - github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 34 + github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= 35 + github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= 40 36 github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= 41 37 github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 42 - github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= 43 - github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 38 + github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= 39 + github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= 44 40 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 45 - github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 41 + github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 46 42 github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0= 47 43 github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis= 48 44 github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= ··· 50 46 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 51 47 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 52 48 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 53 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= 54 - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 49 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= 50 + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= 55 51 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= 56 52 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= 57 53 github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= 58 54 github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= 59 55 github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= 60 56 github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= 61 - github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= 62 - github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= 63 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= 64 - github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= 57 + github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= 58 + github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= 59 + github.com/docker/go-events v0.0.0-20250808211157-605354379745 h1:yOn6Ze6IbYI/KAw2lw/83ELYvZh6hvsygTVkD0dzMC4= 60 + github.com/docker/go-events v0.0.0-20250808211157-605354379745/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= 65 61 github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= 66 62 github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= 67 63 github.com/earthboundkid/versioninfo/v2 v2.24.1 h1:SJTMHaoUx3GzjjnUO1QzP3ZXK6Ee/nbWyCm58eY3oUg= 68 64 github.com/earthboundkid/versioninfo/v2 v2.24.1/go.mod h1:VcWEooDEuyUJnMfbdTh0uFN4cfEIg+kHMuWB2CDCLjw= 65 + github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= 66 + github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= 69 67 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= 70 68 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 69 + github.com/filecoin-project/go-clock v0.1.0 h1:SFbYIM75M8NnFm1yMHhN9Ahy3W5bEZV9gd6MPfXbKVU= 70 + github.com/filecoin-project/go-clock v0.1.0/go.mod h1:4uB/O4PvOjlx1VCMdZ9MyDZXRm//gkj1ELEbxfI1AZs= 71 71 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 72 72 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 73 + github.com/gammazero/chanqueue v1.1.1 h1:n9Y+zbBxw2f7uUE9wpgs0rOSkP/I/yhDLiNuhyVjojQ= 74 + github.com/gammazero/chanqueue v1.1.1/go.mod h1:fMwpwEiuUgpab0sH4VHiVcEoji1pSi+EIzeG4TPeKPc= 75 + github.com/gammazero/deque v1.2.0 h1:scEFO8Uidhw6KDU5qg1HA5fYwM0+us2qdeJqm43bitU= 76 + github.com/gammazero/deque v1.2.0/go.mod h1:JVrR+Bj1NMQbPnYclvDlvSX0nVGReLrQZ0aUMuWLctg= 73 77 github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= 74 78 github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= 75 79 github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= 76 80 github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= 77 - github.com/go-jose/go-jose/v4 v4.1.2 h1:TK/7NqRQZfgAh+Td8AlsrvtPoUyiHh0LqVvokh+1vHI= 78 - github.com/go-jose/go-jose/v4 v4.1.2/go.mod h1:22cg9HWM1pOlnRiY+9cQYJ9XHmya1bYW8OeDM6Ku6Oo= 81 + github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= 82 + github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= 79 83 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 80 84 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 81 85 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 82 86 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 83 - github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= 84 - github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 87 + github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= 88 + github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 85 89 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 86 90 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 87 91 github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= ··· 90 94 github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= 91 95 github.com/gocql/gocql v1.7.0 h1:O+7U7/1gSN7QTEAaMEsJc1Oq2QHXvCWoF3DFK9HDHus= 92 96 github.com/gocql/gocql v1.7.0/go.mod h1:vnlvXyFZeLBF0Wy+RS8hrOdbn0UWsWtdg07XJnFxZ+4= 93 - github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 94 97 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 95 98 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 96 99 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 97 100 github.com/goki/freetype v1.0.5 h1:yi2lQeUhXnBgSMqYd0vVmPw6RnnfIeTP3N4uvaJXd7A= 98 101 github.com/goki/freetype v1.0.5/go.mod h1:wKmKxddbzKmeci9K96Wknn5kjTWLyfC8tKOqAFbEX8E= 99 - github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= 100 - github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= 102 + github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= 103 + github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= 101 104 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 102 105 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 103 106 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 104 107 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 105 108 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 106 109 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 107 - github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= 108 - github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 110 + github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 111 + github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 109 112 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 110 - github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 113 + github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 111 114 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 112 115 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 113 - github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 114 - github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 116 + github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= 117 + github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= 115 118 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 116 - github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= 117 - github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= 118 119 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 119 120 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 120 121 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 121 - github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 122 122 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 123 + github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= 124 + github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 123 125 github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= 124 126 github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= 125 127 github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= ··· 128 130 github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= 129 131 github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= 130 132 github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 131 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= 132 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= 133 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 h1:kEISI/Gx67NzH3nJxAmY/dGac80kKZgZt134u7Y/k1s= 134 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4/go.mod h1:6Nz966r3vQYCqIzWsuEl9d7cf7mRhtDmm++sOxlnfxI= 133 135 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= 134 136 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= 135 137 github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 136 138 github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 137 - github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= 138 - github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 139 - github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= 140 - github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= 139 + github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= 140 + github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= 141 + github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= 142 + github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= 141 143 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= 142 144 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 143 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= 144 - github.com/hashicorp/golang-lru/arc/v2 v2.0.6/go.mod h1:cfdDIX05DWvYV6/shsxDfa/OVcRieOt+q4FnM8x+Xno= 145 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7 h1:QxkVTxwColcduO+LP7eJO56r2hFiG8zEbfAAzRv52KQ= 146 + github.com/hashicorp/golang-lru/arc/v2 v2.0.7/go.mod h1:Pe7gBlGdc8clY5LJ0LpJXMt5AmgmWNH1g+oFFVUHOEc= 145 147 github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= 146 148 github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= 147 - github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= 148 - github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= 149 + github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= 150 + github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= 149 151 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 150 152 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 151 153 github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= 152 154 github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= 153 - github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= 154 - github.com/ipfs/go-bitswap v0.11.0/go.mod h1:05aE8H3XOU+LXpTedeAS0OZpcO1WFsj5niYQH9a1Tmk= 155 - github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= 156 - github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= 157 - github.com/ipfs/go-blockservice v0.5.2 h1:in9Bc+QcXwd1apOVM7Un9t8tixPKdaHQFdLSUM1Xgk8= 158 - github.com/ipfs/go-blockservice v0.5.2/go.mod h1:VpMblFEqG67A/H2sHKAemeH9vlURVavlysbdUI632yk= 159 - github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= 160 - github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= 161 - github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= 162 - github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= 155 + github.com/ipfs/boxo v0.35.2 h1:0QZJJh6qrak28abENOi5OA8NjBnZM4p52SxeuIDqNf8= 156 + github.com/ipfs/boxo v0.35.2/go.mod h1:bZn02OFWwJtY8dDW9XLHaki59EC5o+TGDECXEbe1w8U= 157 + github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= 158 + github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= 159 + github.com/ipfs/go-block-format v0.2.3 h1:mpCuDaNXJ4wrBJLrtEaGFGXkferrw5eqVvzaHhtFKQk= 160 + github.com/ipfs/go-block-format v0.2.3/go.mod h1:WJaQmPAKhD3LspLixqlqNFxiZ3BZ3xgqxxoSR/76pnA= 161 + github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30= 162 + github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ= 163 + github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= 164 + github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= 165 + github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w= 166 + github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg= 163 167 github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= 164 168 github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= 165 169 github.com/ipfs/go-ds-flatfs v0.5.1 h1:ZCIO/kQOS/PSh3vcF1H6a8fkRGS7pOfwfPdx4n/KJH4= 166 170 github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= 171 + github.com/ipfs/go-ds-leveldb v0.5.2 h1:6nmxlQ2zbp4LCNdJVsmHfs9GP0eylfBNxpmY1csp0x0= 172 + github.com/ipfs/go-ds-leveldb v0.5.2/go.mod h1:2fAwmcvD3WoRT72PzEekHBkQmBDhc39DJGoREiuGmYo= 173 + github.com/ipfs/go-dsqueue v0.1.1 h1:6PQlHDyf9PSTN69NmwUir5+0is3tU0vRJj8zLlgK8Mc= 174 + github.com/ipfs/go-dsqueue v0.1.1/go.mod h1:Xxg353WSwwzYn3FGSzZ+taSQII3pIZ+EJC8/oWRDM10= 167 175 github.com/ipfs/go-ipfs-blockstore v1.3.1 h1:cEI9ci7V0sRNivqaOr0elDsamxXFxJMMMy7PTTDQNsQ= 168 176 github.com/ipfs/go-ipfs-blockstore v1.3.1/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= 169 - github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= 170 - github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtLb449gwKqXjIsnRk= 171 177 github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= 172 178 github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= 173 179 github.com/ipfs/go-ipfs-ds-help v1.1.1 h1:B5UJOH52IbcfS56+Ul+sv8jnIV10lbjLF5eOO0C66Nw= 174 180 github.com/ipfs/go-ipfs-ds-help v1.1.1/go.mod h1:75vrVCkSdSFidJscs8n4W+77AtTpCIAdDGAwjitJMIo= 175 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1 h1:jMzo2VhLKSHbVe+mHNzYgs95n0+t0Q69GQ5WhRDZV/s= 176 - github.com/ipfs/go-ipfs-exchange-interface v0.2.1/go.mod h1:MUsYn6rKbG6CTtsDp+lKJPmVt3ZrCViNyH3rfPGsZ2E= 177 - github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= 178 - github.com/ipfs/go-ipfs-exchange-offline v0.3.0/go.mod h1:MOdJ9DChbb5u37M1IcbrRB02e++Z7521fMxqCNRrz9s= 179 181 github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= 180 182 github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= 181 - github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= 182 - github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= 183 183 github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= 184 184 github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= 185 - github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs= 186 - github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk= 187 - github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U= 188 - github.com/ipfs/go-ipld-format v0.6.0/go.mod h1:g4QVMTn3marU3qXchwjpKPKgJv+zF+OlaKMyhJ4LHPg= 189 - github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= 190 - github.com/ipfs/go-ipld-legacy v0.2.1/go.mod h1:782MOUghNzMO2DER0FlBR94mllfdCJCkTtDtPM51otM= 185 + github.com/ipfs/go-ipld-cbor v0.2.1 h1:H05yEJbK/hxg0uf2AJhyerBDbjOuHX4yi+1U/ogRa7E= 186 + github.com/ipfs/go-ipld-cbor v0.2.1/go.mod h1:x9Zbeq8CoE5R2WicYgBMcr/9mnkQ0lHddYWJP2sMV3A= 187 + github.com/ipfs/go-ipld-format v0.6.3 h1:9/lurLDTotJpZSuL++gh3sTdmcFhVkCwsgx2+rAh4j8= 188 + github.com/ipfs/go-ipld-format v0.6.3/go.mod h1:74ilVN12NXVMIV+SrBAyC05UJRk0jVvGqdmrcYZvCBk= 189 + github.com/ipfs/go-ipld-legacy v0.2.2 h1:DThbqCPVLpWBcGtU23KDLiY2YRZZnTkXQyfz8aOfBkQ= 190 + github.com/ipfs/go-ipld-legacy v0.2.2/go.mod h1:hhkj+b3kG9b2BcUNw8IFYAsfeNo8E3U7eYlWeAOPyDU= 191 191 github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= 192 192 github.com/ipfs/go-libipfs v0.7.0/go.mod h1:KsIf/03CqhICzyRGyGo68tooiBE2iFbI/rXW7FhAYr0= 193 193 github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= 194 194 github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= 195 195 github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= 196 - github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= 197 - github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= 198 - github.com/ipfs/go-merkledag v0.11.0 h1:DgzwK5hprESOzS4O1t/wi6JDpyVQdvm9Bs59N/jqfBY= 199 - github.com/ipfs/go-merkledag v0.11.0/go.mod h1:Q4f/1ezvBiJV0YCIXvt51W/9/kqJGH4I1LsA7+djsM4= 200 - github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= 201 - github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= 202 - github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= 203 - github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= 204 - github.com/ipfs/go-verifcid v0.0.3 h1:gmRKccqhWDocCRkC+a59g5QW7uJw5bpX9HWBevXa0zs= 205 - github.com/ipfs/go-verifcid v0.0.3/go.mod h1:gcCtGniVzelKrbk9ooUSX/pM3xlH73fZZJDzQJRvOUw= 206 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4 h1:oFo19cBmcP0Cmg3XXbrr0V/c+xU9U1huEZp8+OgBzdI= 207 - github.com/ipld/go-car v0.6.1-0.20230509095817-92d28eb23ba4/go.mod h1:6nkFF8OmR5wLKBzRKi7/YFJpyYR7+oEn1DX+mMWnlLA= 208 - github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4= 209 - github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo= 210 - github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc= 211 - github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s= 196 + github.com/ipfs/go-log/v2 v2.9.0 h1:l4b06AwVXwldIzbVPZy5z7sKp9lHFTX0KWfTBCtHaOk= 197 + github.com/ipfs/go-log/v2 v2.9.0/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c= 198 + github.com/ipfs/go-metrics-interface v0.3.0 h1:YwG7/Cy4R94mYDUuwsBfeziJCVm9pBMJ6q/JR9V40TU= 199 + github.com/ipfs/go-metrics-interface v0.3.0/go.mod h1:OxxQjZDGocXVdyTPocns6cOLwHieqej/jos7H4POwoY= 200 + github.com/ipfs/go-peertaskqueue v0.8.2 h1:PaHFRaVFdxQk1Qo3OKiHPYjmmusQy7gKQUaL8JDszAU= 201 + github.com/ipfs/go-peertaskqueue v0.8.2/go.mod h1:L6QPvou0346c2qPJNiJa6BvOibxDfaiPlqHInmzg0FA= 202 + github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc= 203 + github.com/ipfs/go-test v0.2.3/go.mod h1:QW8vSKkwYvWFwIZQLGQXdkt9Ud76eQXRQ9Ao2H+cA1o= 204 + github.com/ipfs/go-unixfsnode v1.10.2 h1:TREegX1J4X+k1w4AhoDuxxFvVcS9SegMRvrmxF6Tca8= 205 + github.com/ipfs/go-unixfsnode v1.10.2/go.mod h1:ImDPTSiKZ+2h4UVdkSDITJHk87bUAp7kX/lgifjRicg= 206 + github.com/ipld/go-car v0.6.3 h1:v9pWoNHu24aoC06CStvbH4mpNPdiOhc8rqFFw/C1/ss= 207 + github.com/ipld/go-car v0.6.3/go.mod h1:jtFKq9ysYVpXiyssjvkQEQQT5fP1RrSUJ9UwHrpmfJo= 208 + github.com/ipld/go-car/v2 v2.16.0 h1:LWe0vmN/QcQmUU4tr34W5Nv5mNraW+G6jfN2s+ndBco= 209 + github.com/ipld/go-car/v2 v2.16.0/go.mod h1:RqFGWN9ifcXVmCrTAVnfnxiWZk1+jIx67SYhenlmL34= 210 + github.com/ipld/go-codec-dagpb v1.7.0 h1:hpuvQjCSVSLnTnHXn+QAMR0mLmb1gA6wl10LExo2Ts0= 211 + github.com/ipld/go-codec-dagpb v1.7.0/go.mod h1:rD3Zg+zub9ZnxcLwfol/OTQRVjaLzXypgy4UqHQvilM= 212 212 github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E= 213 213 github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ= 214 214 github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= 215 215 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= 216 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= 217 - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 218 - github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= 219 - github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= 220 - github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= 221 - github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 216 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= 217 + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 218 + github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo= 219 + github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw= 220 + github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= 221 + github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 222 222 github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= 223 223 github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= 224 - github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= 225 224 github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= 226 225 github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= 227 226 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= ··· 239 238 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 240 239 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 241 240 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 242 - github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= 243 - github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 244 - github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 245 - github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 241 + github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= 242 + github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= 243 + github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= 244 + github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= 246 245 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 247 - github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= 248 - github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= 246 + github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= 247 + github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= 249 248 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 250 249 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 251 250 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= ··· 258 257 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 259 258 github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= 260 259 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= 261 - github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= 262 - github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= 263 - github.com/libp2p/go-libp2p v0.25.1 h1:YK+YDCHpYyTvitKWVxa5PfElgIpOONU01X5UcLEwJGA= 264 - github.com/libp2p/go-libp2p v0.25.1/go.mod h1:xnK9/1d9+jeQCVvi/f1g12KqtVi/jP/SijtKV1hML3g= 265 - github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= 266 - github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= 267 - github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= 268 - github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= 260 + github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784= 261 + github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo= 262 + github.com/libp2p/go-libp2p v0.45.0 h1:Pdhr2HsFXaYjtfiNcBP4CcRUONvbMFdH3puM9vV4Tiw= 263 + github.com/libp2p/go-libp2p v0.45.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= 264 + github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= 265 + github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= 266 + github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= 267 + github.com/libp2p/go-libp2p-record v0.3.1/go.mod h1:T8itUkLcWQLCYMqtX7Th6r7SexyUJpIyPgks757td/E= 269 268 github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= 270 269 github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= 271 270 github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= 272 271 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= 273 - github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= 274 - github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= 275 - github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= 276 - github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= 277 - github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 272 + github.com/libp2p/go-netroute v0.3.0 h1:nqPCXHmeNmgTJnktosJ/sIef9hvwYCrsLxXmfNks/oc= 273 + github.com/libp2p/go-netroute v0.3.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= 274 + github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 275 + github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 278 276 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 279 277 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 280 - github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= 281 - github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 278 + github.com/mattn/go-sqlite3 v1.14.33 h1:A5blZ5ulQo2AtayQ9/limgHEkFreKj1Dv226a1K73s0= 279 + github.com/mattn/go-sqlite3 v1.14.33/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 282 280 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 283 281 github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= 284 282 github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= 285 - github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= 286 - github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= 283 + github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= 284 + github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= 287 285 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= 288 286 github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= 289 287 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= ··· 296 294 github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= 297 295 github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= 298 296 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= 299 - github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= 300 - github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= 301 - github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= 302 - github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= 297 + github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= 298 + github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= 299 + github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= 300 + github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= 303 301 github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= 304 302 github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= 305 303 github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= 306 304 github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= 307 - github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= 308 - github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= 305 + github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc= 306 + github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI= 309 307 github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= 310 308 github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= 311 - github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= 312 - github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= 313 - github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= 314 - github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= 309 + github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= 310 + github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= 311 + github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= 312 + github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= 315 313 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= 316 314 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 317 315 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 318 316 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= 319 317 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= 320 - github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= 321 - github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= 318 + github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= 319 + github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= 322 320 github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 323 321 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 324 322 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= ··· 332 330 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 333 331 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 334 332 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= 335 - github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= 336 - github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= 333 + github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= 334 + github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= 337 335 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 338 336 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 339 - github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= 340 - github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= 337 + github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= 338 + github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= 341 339 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 342 340 github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= 343 - github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= 344 - github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= 341 + github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= 342 + github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= 343 + github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= 344 + github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= 345 345 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 346 346 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 347 347 github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 348 - github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= 349 - github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 350 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= 351 - github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= 352 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= 353 - github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= 354 - github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= 355 - github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= 356 - github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= 348 + github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= 349 + github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= 350 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2 h1:KYWnHK9pwzOUo3sNJlNmzRwZ5mw7opugn8njtGThKNg= 351 + github.com/redis/go-redis/extra/rediscmd/v9 v9.17.2/go.mod h1:wsfMQVl/GFYD9Gx/tlxurlTtvHkZRAt8j1qi27eIlTk= 352 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2 h1:wthFPRW3Y50CknMrjjJoYwXUFR4U7hMVJCMeLzDI8s4= 353 + github.com/redis/go-redis/extra/redisotel/v9 v9.17.2/go.mod h1:iqfQX7U2o8MWSl8W+Ah8KqbQyi/UoR/MQNgvaUyA1wc= 354 + github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI= 355 + github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= 356 + github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 357 + github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 357 358 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 358 - github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= 359 - github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 359 + github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= 360 + github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= 360 361 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 361 362 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 362 363 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 363 364 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 365 + github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 364 366 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 365 367 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 366 368 github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= ··· 369 371 github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= 370 372 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 371 373 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 372 - github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= 373 - github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 374 - github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 375 - github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 374 + github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= 375 + github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= 376 + github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 377 + github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= 378 + github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 376 379 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= 377 380 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= 378 381 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= ··· 383 386 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 384 387 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 385 388 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 386 - github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 387 - github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 389 + github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= 390 + github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= 391 + github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= 392 + github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 388 393 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 389 394 github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= 390 395 github.com/warpfork/go-testmark v0.12.1/go.mod h1:kHwy7wfvGSPh1rQJYKayD4AbtNaeyZdcGi9tNJTaa5Y= ··· 396 401 github.com/whyrusleeping/cbor-gen v0.3.1/go.mod h1:pM99HXyEbSQHcosHc0iW7YFmwnscr+t9Te4ibko05so= 397 402 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 398 403 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 399 - github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 400 - github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= 401 - github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= 404 + github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= 405 + github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= 402 406 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b h1:CzigHMRySiX3drau9C6Q5CAbNIApmLdat5jPMqChvDA= 403 407 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= 404 408 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= 405 409 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= 406 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= 407 - go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= 408 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= 409 - go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= 410 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= 411 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= 412 - go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= 413 - go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= 414 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= 415 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= 416 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= 417 - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= 418 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= 419 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= 420 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= 421 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= 422 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= 423 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= 424 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= 425 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= 426 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= 427 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= 428 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= 429 - go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= 430 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 h1:CHXNXwfKWfzS65yrlB2PVds1IBZcdsX8Vepy9of0iRU= 431 - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0/go.mod h1:zKU4zUgKiaRxrdovSS2amdM5gOc59slmo/zJwGX+YBg= 432 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= 433 - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= 434 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= 435 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= 436 - go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= 437 - go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= 438 - go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= 439 - go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= 440 - go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= 441 - go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= 442 - go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= 443 - go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= 444 - go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= 445 - go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= 446 - go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= 447 - go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= 448 - go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= 449 - go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 410 + go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= 411 + go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= 412 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0 h1:7TYhBCu6Xz6vDJGNtEslWZLuuX2IJ/aH50hBY4MVeUg= 413 + go.opentelemetry.io/contrib/bridges/prometheus v0.64.0/go.mod h1:tHQctZfAe7e4PBPGyt3kae6mQFXNpj+iiDJa3ithM50= 414 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0 h1:9pzPj3RFyKOxBAMkM2w84LpT+rdHam1XoFA+QhARiRw= 415 + go.opentelemetry.io/contrib/exporters/autoexport v0.64.0/go.mod h1:hlVZx1btWH0XTfXpuGX9dsquB50s+tc3fYFOO5elo2M= 416 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y= 417 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= 418 + go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= 419 + go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= 420 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0 h1:W+m0g+/6v3pa5PgVf2xoFMi5YtNR06WtS7ve5pcvLtM= 421 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.15.0/go.mod h1:JM31r0GGZ/GU94mX8hN4D8v6e40aFlUECSQ48HaLgHM= 422 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0 h1:EKpiGphOYq3CYnIe2eX9ftUkyU+Y8Dtte8OaWyHJ4+I= 423 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.15.0/go.mod h1:nWFP7C+T8TygkTjJ7mAyEaFaE7wNfms3nV/vexZ6qt0= 424 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0 h1:cEf8jF6WbuGQWUVcqgyWtTR0kOOAWY1DYZ+UhvdmQPw= 425 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0/go.mod h1:k1lzV5n5U3HkGvTCJHraTAGJ7MqsgL1wrGwTj1Isfiw= 426 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0 h1:nKP4Z2ejtHn3yShBb+2KawiXgpn8In5cT7aO2wXuOTE= 427 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0/go.mod h1:NwjeBbNigsO4Aj9WgM0C+cKIrxsZUaRmZUO7A8I7u8o= 428 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= 429 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= 430 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8ESIOlwJAEGTkkf34DesGRAc/Pn8qJ7k3r/42LM= 431 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c= 432 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= 433 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= 434 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0 h1:cCyZS4dr67d30uDyh8etKM2QyDsQ4zC9ds3bdbrVoD0= 435 + go.opentelemetry.io/otel/exporters/prometheus v0.61.0/go.mod h1:iivMuj3xpR2DkUrUya3TPS/Z9h3dz7h01GxU+fQBRNg= 436 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0 h1:0BSddrtQqLEylcErkeFrJBmwFzcqfQq9+/uxfTZq+HE= 437 + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.15.0/go.mod h1:87sjYuAPzaRCtdd09GU5gM1U9wQLrrcYrm77mh5EBoc= 438 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0 h1:5gn2urDL/FBnK8OkCfD1j3/ER79rUuTYmCvlXBKeYL8= 439 + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.39.0/go.mod h1:0fBG6ZJxhqByfFZDwSwpZGzJU671HkwpWaNe2t4VUPI= 440 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0 h1:8UPA4IbVZxpsD76ihGOQiFml99GPAEZLohDXvqHdi6U= 441 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.39.0/go.mod h1:MZ1T/+51uIVKlRzGw1Fo46KEWThjlCBZKl2LzY5nv4g= 442 + go.opentelemetry.io/otel/log v0.15.0 h1:0VqVnc3MgyYd7QqNVIldC3dsLFKgazR6P3P3+ypkyDY= 443 + go.opentelemetry.io/otel/log v0.15.0/go.mod h1:9c/G1zbyZfgu1HmQD7Qj84QMmwTp2QCQsZH1aeoWDE4= 444 + go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= 445 + go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= 446 + go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= 447 + go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= 448 + go.opentelemetry.io/otel/sdk/log v0.15.0 h1:WgMEHOUt5gjJE93yqfqJOkRflApNif84kxoHWS9VVHE= 449 + go.opentelemetry.io/otel/sdk/log v0.15.0/go.mod h1:qDC/FlKQCXfH5hokGsNg9aUBGMJQsrUyeOiW5u+dKBQ= 450 + go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= 451 + go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= 452 + go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= 453 + go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= 454 + go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= 455 + go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= 456 + go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= 457 + go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= 450 458 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 451 459 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 452 460 go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= 453 461 go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= 454 - go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 455 462 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 456 463 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 457 464 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= ··· 460 467 go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 461 468 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 462 469 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= 463 - go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 464 - go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= 465 - go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= 466 - go.yaml.in/yaml/v4 v4.0.0-rc.2 h1:/FrI8D64VSr4HtGIlUtlFMGsm7H7pWTbj6vOLVZcA6s= 467 - go.yaml.in/yaml/v4 v4.0.0-rc.2/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= 470 + go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= 471 + go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 472 + go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= 473 + go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= 474 + go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= 475 + go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= 476 + go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= 468 477 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 469 478 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 470 479 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 471 480 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 472 481 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 473 - golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= 474 - golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= 475 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 476 - golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 477 - golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8= 478 - golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU= 482 + golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= 483 + golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= 484 + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= 485 + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= 486 + golang.org/x/image v0.35.0 h1:LKjiHdgMtO8z7Fh18nGY6KDcoEtVfsgLDPeLyguqb7I= 487 + golang.org/x/image v0.35.0/go.mod h1:MwPLTVgvxSASsxdLzKrl8BRFuyqMyGhLwmC+TO1Sybk= 479 488 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 480 489 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 481 490 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 482 491 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 483 - golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 484 - golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= 485 - golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= 492 + golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= 493 + golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= 486 494 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 487 495 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 488 496 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= ··· 490 498 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 491 499 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 492 500 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 493 - golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 494 - golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= 495 - golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 501 + golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= 502 + golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= 496 503 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 497 504 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 498 505 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 499 506 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 500 507 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 501 - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 502 508 golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= 503 509 golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= 504 510 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= ··· 506 512 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 507 513 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 508 514 golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 515 + golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 509 516 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 510 - golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 511 - golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 512 - golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 513 - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 514 517 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 515 - golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 516 518 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 517 - golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= 518 - golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 519 - golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 519 + golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= 520 + golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 520 521 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 521 522 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 522 - golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= 523 - golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= 524 - golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= 525 - golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 523 + golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= 524 + golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= 525 + golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= 526 + golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= 526 527 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 527 528 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 528 529 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= ··· 532 533 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 533 534 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 534 535 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 535 - golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 536 - golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= 537 - golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= 536 + golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= 537 + golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= 538 538 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 539 539 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 540 540 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 541 541 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 542 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= 543 - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 544 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= 545 - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= 546 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= 547 - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= 548 - google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= 549 - google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= 550 - google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= 551 - google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 542 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= 543 + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 544 + gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= 545 + gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= 546 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9 h1:4DKBrmaqeptdEzp21EfrOEh8LE7PJ5ywH6wydSbOfGY= 547 + google.golang.org/genproto/googleapis/api v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:dd646eSK+Dk9kxVBl1nChEOhJPtMXriCcVb4x3o6J+E= 548 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9 h1:IY6/YYRrFUk0JPp0xOVctvFIVuRnjccihY5kxf5g0TE= 549 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260112192933-99fd39fd28a9/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= 550 + google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= 551 + google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= 552 + google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= 553 + google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= 552 554 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 553 555 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 554 556 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= ··· 563 565 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 564 566 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 565 567 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 566 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 567 568 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 568 569 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 569 - gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM= 570 - gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA= 571 - gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= 572 - gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= 573 - gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= 574 - gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= 570 + gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= 571 + gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= 572 + gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= 573 + gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= 574 + gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= 575 + gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= 575 576 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 576 - lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= 577 - lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= 577 + lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= 578 + lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo=
+43
lexicons/io/atcr/hold/abortUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.abortUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Cancel a multipart upload and cleanup any temporary data.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + } 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["status"], 27 + "properties": { 28 + "status": { 29 + "type": "string", 30 + "maxLength": 16, 31 + "const": "aborted", 32 + "description": "Always 'aborted' on success" 33 + } 34 + } 35 + } 36 + }, 37 + "errors": [ 38 + { "name": "InvalidUploadId" }, 39 + { "name": "AbortFailed" } 40 + ] 41 + } 42 + } 43 + }
+80
lexicons/io/atcr/hold/completeUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.completeUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Finalize a multipart upload and move the assembled blob to its final location.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId", "digest", "parts"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + }, 19 + "digest": { 20 + "type": "string", 21 + "maxLength": 128, 22 + "description": "Final blob digest (e.g., sha256:abc123...)" 23 + }, 24 + "parts": { 25 + "type": "array", 26 + "description": "List of uploaded parts with their ETags", 27 + "items": { 28 + "type": "ref", 29 + "ref": "#partInfo" 30 + } 31 + } 32 + } 33 + } 34 + }, 35 + "output": { 36 + "encoding": "application/json", 37 + "schema": { 38 + "type": "object", 39 + "required": ["status", "digest"], 40 + "properties": { 41 + "status": { 42 + "type": "string", 43 + "maxLength": 16, 44 + "const": "completed", 45 + "description": "Always 'completed' on success" 46 + }, 47 + "digest": { 48 + "type": "string", 49 + "maxLength": 128, 50 + "description": "The digest of the completed blob" 51 + } 52 + } 53 + } 54 + }, 55 + "errors": [ 56 + { "name": "InvalidUploadId" }, 57 + { "name": "InvalidDigest" }, 58 + { "name": "MissingParts" }, 59 + { "name": "CompletionFailed" } 60 + ] 61 + }, 62 + "partInfo": { 63 + "type": "object", 64 + "description": "Information about a completed upload part", 65 + "required": ["partNumber", "etag"], 66 + "properties": { 67 + "partNumber": { 68 + "type": "integer", 69 + "minimum": 1, 70 + "description": "Part sequence number (1-indexed)" 71 + }, 72 + "etag": { 73 + "type": "string", 74 + "maxLength": 256, 75 + "description": "ETag returned when the part was uploaded" 76 + } 77 + } 78 + } 79 + } 80 + }
+46
lexicons/io/atcr/hold/deleteUserData.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.deleteUserData", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Delete all user data from this hold (GDPR compliance). Deletes crew record (if not captain), layer records, and stats records. Does NOT delete actual blob data from S3 - only PDS records.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": {} 13 + } 14 + }, 15 + "output": { 16 + "encoding": "application/json", 17 + "schema": { 18 + "type": "object", 19 + "required": ["success", "crewDeleted", "layersDeleted", "statsDeleted"], 20 + "properties": { 21 + "success": { 22 + "type": "boolean", 23 + "description": "Whether the deletion completed successfully" 24 + }, 25 + "crewDeleted": { 26 + "type": "boolean", 27 + "description": "Whether the user's crew record was deleted (false if user is captain)" 28 + }, 29 + "layersDeleted": { 30 + "type": "integer", 31 + "description": "Number of layer records deleted" 32 + }, 33 + "statsDeleted": { 34 + "type": "integer", 35 + "description": "Number of stats records deleted" 36 + } 37 + } 38 + } 39 + }, 40 + "errors": [ 41 + { "name": "AuthRequired" }, 42 + { "name": "DeletionFailed" } 43 + ] 44 + } 45 + } 46 + }
+167
lexicons/io/atcr/hold/exportUserData.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.exportUserData", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Export all user data from this hold (GDPR compliance). Returns all records stored on this hold's PDS that reference the authenticated user's DID.", 8 + "parameters": { 9 + "type": "params", 10 + "properties": {} 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": ["exportedAt", "holdDid", "userDid", "isCaptain", "layerRecords", "statsRecords", "blueskyPosts"], 17 + "properties": { 18 + "exportedAt": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "RFC3339 timestamp of when the export was generated" 22 + }, 23 + "holdDid": { 24 + "type": "string", 25 + "format": "did", 26 + "description": "DID of this hold service" 27 + }, 28 + "userDid": { 29 + "type": "string", 30 + "format": "did", 31 + "description": "DID of the user whose data was exported" 32 + }, 33 + "isCaptain": { 34 + "type": "boolean", 35 + "description": "Whether the user is the captain (owner) of this hold" 36 + }, 37 + "crewRecord": { 38 + "type": "ref", 39 + "ref": "#crewExport", 40 + "description": "User's crew record (if they are a crew member)" 41 + }, 42 + "layerRecords": { 43 + "type": "array", 44 + "description": "Layer records uploaded by the user", 45 + "items": { 46 + "type": "ref", 47 + "ref": "#layerExport" 48 + } 49 + }, 50 + "statsRecords": { 51 + "type": "array", 52 + "description": "Repository stats records owned by the user", 53 + "items": { 54 + "type": "ref", 55 + "ref": "#statsExport" 56 + } 57 + }, 58 + "blueskyPosts": { 59 + "type": "array", 60 + "description": "Bluesky posts that mention the user", 61 + "items": { 62 + "type": "ref", 63 + "ref": "#postExport" 64 + } 65 + } 66 + } 67 + } 68 + }, 69 + "errors": [ 70 + { "name": "AuthRequired" } 71 + ] 72 + }, 73 + "crewExport": { 74 + "type": "object", 75 + "properties": { 76 + "role": { 77 + "type": "string", 78 + "maxLength": 32 79 + }, 80 + "permissions": { 81 + "type": "array", 82 + "items": { 83 + "type": "string", 84 + "maxLength": 64 85 + } 86 + }, 87 + "tier": { 88 + "type": "string", 89 + "maxLength": 32 90 + }, 91 + "addedAt": { 92 + "type": "string", 93 + "format": "datetime" 94 + } 95 + } 96 + }, 97 + "layerExport": { 98 + "type": "object", 99 + "properties": { 100 + "digest": { 101 + "type": "string", 102 + "maxLength": 128 103 + }, 104 + "size": { 105 + "type": "integer" 106 + }, 107 + "mediaType": { 108 + "type": "string", 109 + "maxLength": 256 110 + }, 111 + "manifest": { 112 + "type": "string", 113 + "format": "at-uri" 114 + }, 115 + "createdAt": { 116 + "type": "string", 117 + "format": "datetime" 118 + } 119 + } 120 + }, 121 + "statsExport": { 122 + "type": "object", 123 + "properties": { 124 + "repository": { 125 + "type": "string", 126 + "maxLength": 256 127 + }, 128 + "pullCount": { 129 + "type": "integer" 130 + }, 131 + "pushCount": { 132 + "type": "integer" 133 + }, 134 + "lastPull": { 135 + "type": "string", 136 + "format": "datetime" 137 + }, 138 + "lastPush": { 139 + "type": "string", 140 + "format": "datetime" 141 + }, 142 + "updatedAt": { 143 + "type": "string", 144 + "format": "datetime" 145 + } 146 + } 147 + }, 148 + "postExport": { 149 + "type": "object", 150 + "properties": { 151 + "uri": { 152 + "type": "string", 153 + "format": "at-uri" 154 + }, 155 + "text": { 156 + "type": "string", 157 + "maxGraphemes": 3000, 158 + "maxLength": 30000 159 + }, 160 + "createdAt": { 161 + "type": "string", 162 + "format": "datetime" 163 + } 164 + } 165 + } 166 + } 167 + }
+57
lexicons/io/atcr/hold/getPartUploadUrl.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.getPartUploadUrl", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Get a presigned URL or endpoint info for uploading a specific part of a multipart upload.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["uploadId", "partNumber"], 13 + "properties": { 14 + "uploadId": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Upload session ID from initiateUpload" 18 + }, 19 + "partNumber": { 20 + "type": "integer", 21 + "minimum": 1, 22 + "description": "Part sequence number (1-indexed)" 23 + } 24 + } 25 + } 26 + }, 27 + "output": { 28 + "encoding": "application/json", 29 + "schema": { 30 + "type": "object", 31 + "required": ["url"], 32 + "properties": { 33 + "url": { 34 + "type": "string", 35 + "format": "uri", 36 + "description": "URL to PUT the part data to" 37 + }, 38 + "method": { 39 + "type": "string", 40 + "maxLength": 16, 41 + "default": "PUT", 42 + "description": "HTTP method to use (usually PUT)" 43 + }, 44 + "headers": { 45 + "type": "unknown", 46 + "description": "Additional headers required for the request (e.g., content-type)" 47 + } 48 + } 49 + } 50 + }, 51 + "errors": [ 52 + { "name": "InvalidUploadId" }, 53 + { "name": "InvalidPartNumber" } 54 + ] 55 + } 56 + } 57 + }
+55
lexicons/io/atcr/hold/getQuota.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.getQuota", 4 + "defs": { 5 + "main": { 6 + "type": "query", 7 + "description": "Get storage quota information for a user. Calculates total unique blob storage by iterating layer records and deduplicating by digest.", 8 + "parameters": { 9 + "type": "params", 10 + "required": ["userDid"], 11 + "properties": { 12 + "userDid": { 13 + "type": "string", 14 + "format": "did", 15 + "description": "DID of the user to get quota for" 16 + } 17 + } 18 + }, 19 + "output": { 20 + "encoding": "application/json", 21 + "schema": { 22 + "type": "object", 23 + "required": ["userDid", "uniqueBlobs", "totalSize"], 24 + "properties": { 25 + "userDid": { 26 + "type": "string", 27 + "format": "did", 28 + "description": "DID of the user" 29 + }, 30 + "uniqueBlobs": { 31 + "type": "integer", 32 + "description": "Number of unique blob digests" 33 + }, 34 + "totalSize": { 35 + "type": "integer", 36 + "description": "Total size in bytes of unique blobs" 37 + }, 38 + "limit": { 39 + "type": "integer", 40 + "description": "Storage limit in bytes (absent if unlimited)" 41 + }, 42 + "tier": { 43 + "type": "string", 44 + "maxLength": 32, 45 + "description": "Quota tier name (e.g., 'deckhand', 'bosun', 'quartermaster')" 46 + } 47 + } 48 + } 49 + }, 50 + "errors": [ 51 + { "name": "InvalidUserDid" } 52 + ] 53 + } 54 + } 55 + }
+41
lexicons/io/atcr/hold/initiateUpload.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.initiateUpload", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Start a new multipart upload session for an OCI blob. Returns an uploadId to be used with subsequent part upload and completion endpoints.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["digest"], 13 + "properties": { 14 + "digest": { 15 + "type": "string", 16 + "maxLength": 128, 17 + "description": "The blob digest (e.g., sha256:abc123...)" 18 + } 19 + } 20 + } 21 + }, 22 + "output": { 23 + "encoding": "application/json", 24 + "schema": { 25 + "type": "object", 26 + "required": ["uploadId"], 27 + "properties": { 28 + "uploadId": { 29 + "type": "string", 30 + "maxLength": 256, 31 + "description": "Unique identifier for this upload session" 32 + } 33 + } 34 + } 35 + }, 36 + "errors": [ 37 + { "name": "InvalidDigest" } 38 + ] 39 + } 40 + } 41 + }
+181
lexicons/io/atcr/hold/notifyManifest.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.notifyManifest", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Notify hold about a manifest push or pull operation. For pushes: creates layer records and optionally posts to Bluesky. For pulls: just increments stats. Always increments pull/push counts.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["repository", "userDid", "manifestDigest", "manifest"], 13 + "properties": { 14 + "repository": { 15 + "type": "string", 16 + "maxLength": 256, 17 + "description": "Image repository name" 18 + }, 19 + "tag": { 20 + "type": "string", 21 + "maxLength": 128, 22 + "description": "Image tag (optional, required for Bluesky posts)" 23 + }, 24 + "userDid": { 25 + "type": "string", 26 + "format": "did", 27 + "description": "DID of the image owner" 28 + }, 29 + "manifestDigest": { 30 + "type": "string", 31 + "maxLength": 128, 32 + "description": "Manifest digest for building layer record AT-URIs" 33 + }, 34 + "operation": { 35 + "type": "string", 36 + "maxLength": 16, 37 + "knownValues": ["push", "pull"], 38 + "default": "push", 39 + "description": "Operation type (defaults to 'push' for backward compatibility)" 40 + }, 41 + "manifest": { 42 + "type": "ref", 43 + "ref": "#manifestInfo" 44 + } 45 + } 46 + } 47 + }, 48 + "output": { 49 + "encoding": "application/json", 50 + "schema": { 51 + "type": "object", 52 + "required": ["success", "operation", "statsUpdated"], 53 + "properties": { 54 + "success": { 55 + "type": "boolean", 56 + "description": "Whether the operation completed successfully" 57 + }, 58 + "operation": { 59 + "type": "string", 60 + "maxLength": 16, 61 + "description": "The operation that was performed ('push' or 'pull')" 62 + }, 63 + "statsUpdated": { 64 + "type": "boolean", 65 + "description": "Whether stats were successfully updated" 66 + }, 67 + "layersCreated": { 68 + "type": "integer", 69 + "description": "Number of layer records created (push only)" 70 + }, 71 + "postCreated": { 72 + "type": "boolean", 73 + "description": "Whether a Bluesky post was created (push only)" 74 + }, 75 + "postUri": { 76 + "type": "string", 77 + "format": "at-uri", 78 + "description": "AT-URI of the created Bluesky post (if postCreated is true)" 79 + } 80 + } 81 + } 82 + }, 83 + "errors": [ 84 + { "name": "InvalidOperation" }, 85 + { "name": "UserMismatch" }, 86 + { "name": "QuotaExceeded" } 87 + ] 88 + }, 89 + "manifestInfo": { 90 + "type": "object", 91 + "description": "OCI manifest information", 92 + "properties": { 93 + "mediaType": { 94 + "type": "string", 95 + "maxLength": 256, 96 + "description": "OCI media type" 97 + }, 98 + "config": { 99 + "type": "ref", 100 + "ref": "#blobInfo" 101 + }, 102 + "layers": { 103 + "type": "array", 104 + "items": { 105 + "type": "ref", 106 + "ref": "#layerInfo" 107 + } 108 + }, 109 + "manifests": { 110 + "type": "array", 111 + "description": "Child manifests for multi-arch images", 112 + "items": { 113 + "type": "ref", 114 + "ref": "#childManifestInfo" 115 + } 116 + } 117 + } 118 + }, 119 + "blobInfo": { 120 + "type": "object", 121 + "properties": { 122 + "digest": { 123 + "type": "string", 124 + "maxLength": 128 125 + }, 126 + "size": { 127 + "type": "integer" 128 + } 129 + } 130 + }, 131 + "layerInfo": { 132 + "type": "object", 133 + "properties": { 134 + "digest": { 135 + "type": "string", 136 + "maxLength": 128 137 + }, 138 + "size": { 139 + "type": "integer" 140 + }, 141 + "mediaType": { 142 + "type": "string", 143 + "maxLength": 256 144 + } 145 + } 146 + }, 147 + "childManifestInfo": { 148 + "type": "object", 149 + "properties": { 150 + "digest": { 151 + "type": "string", 152 + "maxLength": 128 153 + }, 154 + "size": { 155 + "type": "integer" 156 + }, 157 + "mediaType": { 158 + "type": "string", 159 + "maxLength": 256 160 + }, 161 + "platform": { 162 + "type": "ref", 163 + "ref": "#platformInfo" 164 + } 165 + } 166 + }, 167 + "platformInfo": { 168 + "type": "object", 169 + "properties": { 170 + "os": { 171 + "type": "string", 172 + "maxLength": 64 173 + }, 174 + "architecture": { 175 + "type": "string", 176 + "maxLength": 64 177 + } 178 + } 179 + } 180 + } 181 + }
+66
lexicons/io/atcr/hold/requestCrew.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.requestCrew", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Request crew membership for the hold. Authorization depends on the captain record: if allowAllCrew is true, any authenticated user can join; otherwise, only the owner can join.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "properties": { 13 + "role": { 14 + "type": "string", 15 + "default": "member", 16 + "maxLength": 32, 17 + "description": "Requested role (default: 'member')" 18 + }, 19 + "permissions": { 20 + "type": "array", 21 + "description": "Requested permissions (default: ['blob:read', 'blob:write'])", 22 + "items": { 23 + "type": "string", 24 + "maxLength": 64 25 + } 26 + } 27 + } 28 + } 29 + }, 30 + "output": { 31 + "encoding": "application/json", 32 + "schema": { 33 + "type": "object", 34 + "required": ["status"], 35 + "properties": { 36 + "uri": { 37 + "type": "string", 38 + "format": "at-uri", 39 + "description": "AT-URI of the crew record (if created or already exists)" 40 + }, 41 + "cid": { 42 + "type": "string", 43 + "format": "cid", 44 + "description": "CID of the crew record" 45 + }, 46 + "status": { 47 + "type": "string", 48 + "maxLength": 32, 49 + "knownValues": ["created", "already_member"], 50 + "description": "Result status" 51 + }, 52 + "message": { 53 + "type": "string", 54 + "maxLength": 256, 55 + "description": "Human-readable status message" 56 + } 57 + } 58 + } 59 + }, 60 + "errors": [ 61 + { "name": "AuthRequired" }, 62 + { "name": "RegistrationDisabled" } 63 + ] 64 + } 65 + } 66 + }
+66
lexicons/io/atcr/hold/setStats.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.setStats", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Set absolute stats values for a repository. Used for migration/admin purposes to set specific pull/push counts.", 8 + "input": { 9 + "encoding": "application/json", 10 + "schema": { 11 + "type": "object", 12 + "required": ["ownerDid", "repository"], 13 + "properties": { 14 + "ownerDid": { 15 + "type": "string", 16 + "format": "did", 17 + "description": "DID of the repository owner" 18 + }, 19 + "repository": { 20 + "type": "string", 21 + "maxLength": 256, 22 + "description": "Repository name" 23 + }, 24 + "pullCount": { 25 + "type": "integer", 26 + "minimum": 0, 27 + "description": "Absolute pull count to set" 28 + }, 29 + "pushCount": { 30 + "type": "integer", 31 + "minimum": 0, 32 + "description": "Absolute push count to set" 33 + }, 34 + "lastPull": { 35 + "type": "string", 36 + "format": "datetime", 37 + "description": "RFC3339 timestamp of last pull" 38 + }, 39 + "lastPush": { 40 + "type": "string", 41 + "format": "datetime", 42 + "description": "RFC3339 timestamp of last push" 43 + } 44 + } 45 + } 46 + }, 47 + "output": { 48 + "encoding": "application/json", 49 + "schema": { 50 + "type": "object", 51 + "required": ["success"], 52 + "properties": { 53 + "success": { 54 + "type": "boolean", 55 + "description": "Whether the stats were successfully updated" 56 + } 57 + } 58 + } 59 + }, 60 + "errors": [ 61 + { "name": "InvalidOwner" }, 62 + { "name": "InvalidRepository" } 63 + ] 64 + } 65 + } 66 + }
+33
lexicons/io/atcr/hold/uploadPart.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "io.atcr.hold.uploadPart", 4 + "defs": { 5 + "main": { 6 + "type": "procedure", 7 + "description": "Direct buffered part upload. Alternative to using presigned URLs from getPartUploadUrl. Requires X-Upload-Id and X-Part-Number headers.", 8 + "input": { 9 + "encoding": "*/*", 10 + "description": "Raw binary part data" 11 + }, 12 + "output": { 13 + "encoding": "application/json", 14 + "schema": { 15 + "type": "object", 16 + "required": ["etag"], 17 + "properties": { 18 + "etag": { 19 + "type": "string", 20 + "maxLength": 256, 21 + "description": "ETag of the uploaded part, required for completeUpload" 22 + } 23 + } 24 + } 25 + }, 26 + "errors": [ 27 + { "name": "InvalidUploadId" }, 28 + { "name": "InvalidPartNumber" }, 29 + { "name": "UploadFailed" } 30 + ] 31 + } 32 + } 33 + }
+17 -38
pkg/appview/jetstream/backfill.go
··· 120 120 for _, repo := range result.Repos { 121 121 recordCount, err := b.backfillRepo(ctx, repo.DID, collection) 122 122 if err != nil { 123 - // RepoNotFound means account was deleted/deactivated 124 - // Clean up our cached data since the source is gone 125 - if strings.Contains(err.Error(), "RepoNotFound") { 123 + // Account may be deleted/deactivated/migrated - clean up our cached data 124 + errStr := err.Error() 125 + if strings.Contains(errStr, "RepoNotFound") || 126 + strings.Contains(errStr, "Could not find repo") || 127 + strings.Contains(errStr, "status 400") || 128 + strings.Contains(errStr, "status 404") { 126 129 if delErr := db.DeleteUserData(b.db, repo.DID); delErr != nil { 127 130 slog.Warn("Backfill failed to delete data for removed repo", "did", repo.DID, "error", delErr) 128 131 } else { ··· 156 159 157 160 // backfillRepo backfills all records for a single repo/DID 158 161 func (b *BackfillWorker) backfillRepo(ctx context.Context, did, collection string) (int, error) { 159 - // Ensure user exists in database and get their PDS endpoint 160 - if err := b.processor.EnsureUser(ctx, did); err != nil { 161 - return 0, fmt.Errorf("failed to ensure user: %w", err) 162 - } 163 - 164 162 // Resolve DID to get user's PDS endpoint 165 163 pdsEndpoint, err := atproto.ResolveDIDToPDS(ctx, did) 166 164 if err != nil { ··· 304 302 return nil 305 303 } 306 304 307 - // processRecord processes a single record and stores it in the database 305 + // processRecord processes a single record using the unified ProcessRecord method. 306 + // This ensures consistent handling (validation, user creation) between Worker and Backfill. 308 307 func (b *BackfillWorker) processRecord(ctx context.Context, did, collection string, record *atproto.Record) error { 309 - switch collection { 310 - case atproto.ManifestCollection: 311 - _, err := b.processor.ProcessManifest(context.Background(), did, record.Value) 312 - return err 313 - case atproto.TagCollection: 314 - return b.processor.ProcessTag(context.Background(), did, record.Value) 315 - case atproto.StarCollection: 316 - return b.processor.ProcessStar(context.Background(), did, record.Value) 317 - case atproto.SailorProfileCollection: 318 - return b.processor.ProcessSailorProfile(ctx, did, record.Value, b.queryCaptainRecordWrapper) 319 - case atproto.RepoPageCollection: 320 - // rkey is extracted from the record URI, but for repo pages we use Repository field 321 - return b.processor.ProcessRepoPage(ctx, did, record.URI, record.Value, false) 322 - case atproto.StatsCollection: 323 - // Stats are stored in hold PDSes, not user PDSes 324 - // 'did' here is the hold's DID (e.g., did:web:hold01.atcr.io) 325 - return b.processor.ProcessStats(ctx, did, record.Value, false) 326 - case atproto.CaptainCollection: 327 - // Captain records are stored in hold PDSes 328 - // 'did' here is the hold's DID (e.g., did:web:hold01.atcr.io) 329 - return b.processor.ProcessCaptain(ctx, did, record.Value) 330 - case atproto.CrewCollection: 331 - // Crew records are stored in hold PDSes 332 - // 'did' here is the hold's DID, rkey is derived from member DID 333 - // Extract rkey from record URI (at://did/collection/rkey) 334 - rkey := extractRkeyFromURI(record.URI) 335 - return b.processor.ProcessCrew(ctx, did, rkey, record.Value) 336 - default: 337 - return fmt.Errorf("unsupported collection: %s", collection) 308 + rkey := extractRkeyFromURI(record.URI) 309 + 310 + // For sailor profile collection, we need to pass the queryCaptainFn 311 + // Other collections pass nil 312 + var queryCaptainFn func(context.Context, string) error 313 + if collection == atproto.SailorProfileCollection { 314 + queryCaptainFn = b.queryCaptainRecordWrapper 338 315 } 316 + 317 + return b.processor.ProcessRecord(ctx, did, collection, rkey, record.Value, false, queryCaptainFn) 339 318 } 340 319 341 320 // queryCaptainRecordWrapper wraps queryCaptainRecord with backfill-specific logic
+138
pkg/appview/jetstream/processor.go
··· 11 11 12 12 "atcr.io/pkg/appview/db" 13 13 "atcr.io/pkg/atproto" 14 + "github.com/bluesky-social/indigo/atproto/identity" 15 + "github.com/bluesky-social/indigo/atproto/lexicon" 14 16 ) 15 17 16 18 // Processor handles shared database operations for both Worker (live) and Backfill (sync) ··· 20 22 userCache *UserCache // Optional - enabled for Worker, disabled for Backfill 21 23 statsCache *StatsCache // In-memory cache for per-hold stats aggregation 22 24 useCache bool 25 + catalog *lexicon.ResolvingCatalog // For debug logging of validation failures 23 26 } 24 27 25 28 // NewProcessor creates a new shared processor 26 29 // useCache: true for Worker (live streaming), false for Backfill (batch processing) 27 30 // statsCache: shared stats cache for aggregating across holds (nil to skip stats processing) 28 31 func NewProcessor(database *sql.DB, useCache bool, statsCache *StatsCache) *Processor { 32 + // Create lexicon catalog for debug validation logging 33 + dir := identity.DefaultDirectory() 34 + catalog := lexicon.NewResolvingCatalog() 35 + catalog.Directory = dir 36 + 29 37 p := &Processor{ 30 38 db: database, 31 39 useCache: useCache, 32 40 statsCache: statsCache, 41 + catalog: &catalog, 33 42 } 34 43 35 44 if useCache { ··· 97 106 return db.UpsertUser(p.db, user) 98 107 } 99 108 return db.UpsertUserIgnoreAvatar(p.db, user) 109 + } 110 + 111 + // ValidateRecord performs validation on records. 112 + // - Full lexicon validation is logged for debugging but does NOT block ingestion 113 + // - Targeted validation (captain/crew DID checks) DOES block bogus records 114 + func (p *Processor) ValidateRecord(ctx context.Context, collection string, data []byte) error { 115 + var recordData map[string]any 116 + if err := json.Unmarshal(data, &recordData); err != nil { 117 + return fmt.Errorf("invalid JSON: %w", err) 118 + } 119 + 120 + // Debug: Full lexicon validation (log only, don't block) 121 + if p.catalog != nil { 122 + if err := lexicon.ValidateRecord(p.catalog, recordData, collection, 0); err != nil { 123 + slog.Debug("Record failed full lexicon validation (ingesting anyway)", 124 + "component", "processor", 125 + "collection", collection, 126 + "error", err) 127 + } 128 + } 129 + 130 + // Targeted validation for collections that had bogus data issues 131 + // These DO block ingestion 132 + switch collection { 133 + case atproto.CaptainCollection: 134 + // Captain must have non-empty owner DID 135 + owner, _ := recordData["owner"].(string) 136 + if owner == "" || !strings.HasPrefix(owner, "did:") { 137 + return fmt.Errorf("captain record missing or invalid owner DID") 138 + } 139 + 140 + case atproto.CrewCollection: 141 + // Crew must have non-empty member DID 142 + member, _ := recordData["member"].(string) 143 + if member == "" || !strings.HasPrefix(member, "did:") { 144 + return fmt.Errorf("crew record missing or invalid member DID") 145 + } 146 + } 147 + 148 + return nil 149 + } 150 + 151 + // ProcessRecord is the unified entry point for processing any ATCR record. 152 + // It handles: 153 + // 1. Schema validation against published lexicons 154 + // 2. User creation for user-activity collections 155 + // 3. Dispatch to the appropriate Process* method 156 + // 157 + // queryCaptainFn is optional - used by backfill for sailor profile processing 158 + func (p *Processor) ProcessRecord(ctx context.Context, did, collection, rkey string, data []byte, isDelete bool, queryCaptainFn func(context.Context, string) error) error { 159 + // Skip validation for deletes (no record data) 160 + if !isDelete && data != nil { 161 + if err := p.ValidateRecord(ctx, collection, data); err != nil { 162 + slog.Warn("Record failed schema validation, skipping", 163 + "component", "processor", 164 + "collection", collection, 165 + "did", did, 166 + "error", err) 167 + return nil // Skip invalid records silently 168 + } 169 + } 170 + 171 + // User-activity collections create/update user entries 172 + // Skip for deletes - user should already exist, and we don't need to resolve identity 173 + if !isDelete { 174 + switch collection { 175 + case atproto.ManifestCollection, 176 + atproto.TagCollection, 177 + atproto.StarCollection, 178 + atproto.RepoPageCollection, 179 + atproto.SailorProfileCollection: 180 + if err := p.EnsureUser(ctx, did); err != nil { 181 + return fmt.Errorf("failed to ensure user: %w", err) 182 + } 183 + // Hold collections (captain, crew, stats) - don't create user entries 184 + // These are records FROM holds, not user activity 185 + } 186 + } 187 + 188 + // Dispatch to specific handler 189 + switch collection { 190 + case atproto.ManifestCollection: 191 + if isDelete { 192 + return db.DeleteManifest(p.db, did, "", rkey) 193 + } 194 + _, err := p.ProcessManifest(ctx, did, data) 195 + return err 196 + 197 + case atproto.TagCollection: 198 + if isDelete { 199 + repo, tag := atproto.RKeyToRepositoryTag(rkey) 200 + return db.DeleteTag(p.db, did, repo, tag) 201 + } 202 + return p.ProcessTag(ctx, did, data) 203 + 204 + case atproto.StarCollection: 205 + if isDelete { 206 + ownerDID, repository, err := atproto.ParseStarRecordKey(rkey) 207 + if err != nil { 208 + return err 209 + } 210 + return db.DeleteStar(p.db, did, ownerDID, repository) 211 + } 212 + return p.ProcessStar(ctx, did, data) 213 + 214 + case atproto.RepoPageCollection: 215 + return p.ProcessRepoPage(ctx, did, rkey, data, isDelete) 216 + 217 + case atproto.SailorProfileCollection: 218 + return p.ProcessSailorProfile(ctx, did, data, queryCaptainFn) 219 + 220 + case atproto.StatsCollection: 221 + return p.ProcessStats(ctx, did, data, isDelete) 222 + 223 + case atproto.CaptainCollection: 224 + if isDelete { 225 + return db.DeleteCaptainRecord(p.db, did) 226 + } 227 + return p.ProcessCaptain(ctx, did, data) 228 + 229 + case atproto.CrewCollection: 230 + if isDelete { 231 + return db.DeleteCrewMemberByRkey(p.db, did, rkey) 232 + } 233 + return p.ProcessCrew(ctx, did, rkey, data) 234 + 235 + default: 236 + return nil // Unknown collection, ignore 237 + } 100 238 } 101 239 102 240 // ProcessManifest processes a manifest record and stores it in the database
+174
pkg/appview/jetstream/processor_test.go
··· 618 618 } 619 619 } 620 620 621 + func TestProcessRecord_RoutesCorrectly(t *testing.T) { 622 + db := setupTestDB(t) 623 + defer db.Close() 624 + 625 + // Add missing tables for this test 626 + _, err := db.Exec(` 627 + CREATE TABLE repo_pages ( 628 + did TEXT NOT NULL, 629 + repository TEXT NOT NULL, 630 + description TEXT, 631 + avatar_cid TEXT, 632 + created_at TIMESTAMP NOT NULL, 633 + updated_at TIMESTAMP NOT NULL, 634 + PRIMARY KEY(did, repository) 635 + ); 636 + CREATE TABLE hold_captain_records ( 637 + hold_did TEXT PRIMARY KEY, 638 + owner_did TEXT NOT NULL, 639 + public BOOLEAN NOT NULL, 640 + allow_all_crew BOOLEAN NOT NULL, 641 + deployed_at TEXT, 642 + region TEXT, 643 + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 644 + ); 645 + CREATE TABLE hold_crew_members ( 646 + hold_did TEXT NOT NULL, 647 + member_did TEXT NOT NULL, 648 + rkey TEXT NOT NULL, 649 + role TEXT, 650 + permissions TEXT, 651 + tier TEXT, 652 + added_at TEXT, 653 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 654 + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 655 + PRIMARY KEY (hold_did, member_did) 656 + ); 657 + `) 658 + if err != nil { 659 + t.Fatalf("Failed to add tables: %v", err) 660 + } 661 + 662 + processor := NewProcessor(db, false, nil) 663 + ctx := context.Background() 664 + 665 + // Test 1: ProcessRecord routes manifest correctly 666 + // Note: Schema validation may fail for io.atcr.manifest since we can't resolve the schema, 667 + // but this tests the routing logic 668 + manifestRecord := map[string]any{ 669 + "$type": "io.atcr.manifest", 670 + "repository": "test-app", 671 + "digest": "sha256:route123", 672 + "mediaType": "application/vnd.oci.image.manifest.v1+json", 673 + "schemaVersion": 2, 674 + "holdDid": "did:web:hold01.atcr.io", 675 + "createdAt": time.Now().Format(time.RFC3339), 676 + } 677 + recordBytes, _ := json.Marshal(manifestRecord) 678 + 679 + // Note: ProcessRecord will skip validation if lexicon can't be resolved (expected in tests) 680 + // and will skip EnsureUser since we don't have a real PDS to resolve 681 + // Just verify the record is processed without panic 682 + err = processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "route123", recordBytes, false, nil) 683 + // Error expected since we can't resolve identity - that's fine for this test 684 + if err != nil { 685 + t.Logf("Expected error (can't resolve identity): %v", err) 686 + } 687 + 688 + // Test 2: ProcessRecord handles captain record without creating user 689 + captainRecord := map[string]any{ 690 + "$type": "io.atcr.hold.captain", 691 + "owner": "did:plc:owner123", 692 + "public": true, 693 + "allowAllCrew": false, 694 + "enableBlueskyPosts": false, 695 + "deployedAt": time.Now().Format(time.RFC3339), 696 + } 697 + captainBytes, _ := json.Marshal(captainRecord) 698 + 699 + // This should NOT call EnsureUser (captain is a hold collection) 700 + err = processor.ProcessRecord(ctx, "did:web:hold.example.com", atproto.CaptainCollection, "self", captainBytes, false, nil) 701 + if err != nil { 702 + t.Logf("Error processing captain (validation may fail in test): %v", err) 703 + } 704 + 705 + // Verify no user was created for the hold DID 706 + var userCount int 707 + err = db.QueryRow(`SELECT COUNT(*) FROM users WHERE did = ?`, "did:web:hold.example.com").Scan(&userCount) 708 + if err != nil { 709 + t.Fatalf("Failed to query users: %v", err) 710 + } 711 + if userCount != 0 { 712 + t.Error("Captain record processing should NOT create a user entry for holds") 713 + } 714 + 715 + // Test 3: ProcessRecord handles delete operations 716 + err = processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "sha256:todelete", nil, true, nil) 717 + if err != nil { 718 + t.Errorf("Delete should not error: %v", err) 719 + } 720 + } 721 + 722 + func TestProcessRecord_SkipsInvalidRecords(t *testing.T) { 723 + db := setupTestDB(t) 724 + defer db.Close() 725 + 726 + processor := NewProcessor(db, false, nil) 727 + ctx := context.Background() 728 + 729 + // Test: Invalid JSON should be skipped silently (no error returned) 730 + invalidJSON := []byte(`{invalid json}`) 731 + err := processor.ProcessRecord(ctx, "did:plc:test123", atproto.ManifestCollection, "test", invalidJSON, false, nil) 732 + // Should return nil (skipped silently) not an error 733 + if err != nil { 734 + t.Errorf("Invalid record should be skipped silently, got error: %v", err) 735 + } 736 + } 737 + 738 + func TestValidateRecord(t *testing.T) { 739 + db := setupTestDB(t) 740 + defer db.Close() 741 + 742 + processor := NewProcessor(db, false, nil) 743 + ctx := context.Background() 744 + 745 + // Test 1: Manifest passes (no strict validation) 746 + manifestJSON := []byte(`{"$type": "io.atcr.manifest", "repository": "test"}`) 747 + err := processor.ValidateRecord(ctx, atproto.ManifestCollection, manifestJSON) 748 + if err != nil { 749 + t.Errorf("Manifest should pass validation: %v", err) 750 + } 751 + 752 + // Test 2: Invalid JSON returns error 753 + invalidJSON := []byte(`{invalid}`) 754 + err = processor.ValidateRecord(ctx, atproto.ManifestCollection, invalidJSON) 755 + if err == nil { 756 + t.Error("Invalid JSON should return error") 757 + } 758 + 759 + // Test 3: Captain with valid owner passes 760 + captainValid := []byte(`{"owner": "did:plc:owner123", "public": true}`) 761 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainValid) 762 + if err != nil { 763 + t.Errorf("Valid captain should pass: %v", err) 764 + } 765 + 766 + // Test 4: Captain with empty owner is rejected 767 + captainEmpty := []byte(`{"owner": "", "public": true}`) 768 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainEmpty) 769 + if err == nil { 770 + t.Error("Captain with empty owner should be rejected") 771 + } 772 + 773 + // Test 5: Captain with invalid owner (not a DID) is rejected 774 + captainInvalid := []byte(`{"owner": "notadid", "public": true}`) 775 + err = processor.ValidateRecord(ctx, atproto.CaptainCollection, captainInvalid) 776 + if err == nil { 777 + t.Error("Captain with invalid owner should be rejected") 778 + } 779 + 780 + // Test 6: Crew with valid member passes 781 + crewValid := []byte(`{"member": "did:plc:member123", "role": "write"}`) 782 + err = processor.ValidateRecord(ctx, atproto.CrewCollection, crewValid) 783 + if err != nil { 784 + t.Errorf("Valid crew should pass: %v", err) 785 + } 786 + 787 + // Test 7: Crew with empty member is rejected 788 + crewEmpty := []byte(`{"member": "", "role": "write"}`) 789 + err = processor.ValidateRecord(ctx, atproto.CrewCollection, crewEmpty) 790 + if err == nil { 791 + t.Error("Crew with empty member should be rejected") 792 + } 793 + } 794 + 621 795 func TestProcessAccount(t *testing.T) { 622 796 db := setupTestDB(t) 623 797 defer db.Close()
+39 -247
pkg/appview/jetstream/worker.go
··· 309 309 w.debugCollectionCount++ 310 310 } 311 311 312 - // Process based on collection 313 - switch commit.Collection { 314 - case atproto.ManifestCollection: 315 - slog.Info("Jetstream processing manifest event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 316 - return w.processManifest(commit) 317 - case atproto.TagCollection: 318 - slog.Info("Jetstream processing tag event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 319 - return w.processTag(commit) 320 - case atproto.StarCollection: 321 - slog.Info("Jetstream processing star event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 322 - return w.processStar(commit) 323 - case atproto.RepoPageCollection: 324 - slog.Info("Jetstream processing repo page event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 325 - return w.processRepoPage(commit) 326 - case atproto.StatsCollection: 327 - slog.Info("Jetstream processing stats event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 328 - return w.processStats(commit) 329 - case atproto.CaptainCollection: 330 - slog.Info("Jetstream processing captain event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 331 - return w.processCaptain(commit) 332 - case atproto.CrewCollection: 333 - slog.Info("Jetstream processing crew event", "did", commit.DID, "operation", commit.Operation, "rkey", commit.RKey) 334 - return w.processCrew(commit) 335 - default: 336 - // Ignore other collections 337 - return nil 312 + // Check if this is an ATCR collection we care about 313 + if !isATCRCollection(commit.Collection) { 314 + return nil // Ignore non-ATCR collections 338 315 } 339 316 317 + slog.Info("Jetstream processing event", 318 + "collection", commit.Collection, 319 + "did", commit.DID, 320 + "operation", commit.Operation, 321 + "rkey", commit.RKey) 322 + 323 + // Marshal record to bytes for unified processing 324 + var recordBytes []byte 325 + if commit.Record != nil { 326 + var err error 327 + recordBytes, err = json.Marshal(commit.Record) 328 + if err != nil { 329 + return fmt.Errorf("failed to marshal record: %w", err) 330 + } 331 + } 332 + 333 + isDelete := commit.Operation == "delete" 334 + return w.processor.ProcessRecord(context.Background(), commit.DID, commit.Collection, commit.RKey, recordBytes, isDelete, nil) 335 + 340 336 case "identity": 341 337 if event.Identity == nil { 342 338 return nil ··· 355 351 } 356 352 } 357 353 358 - // processManifest processes a manifest commit event 359 - func (w *Worker) processManifest(commit *CommitEvent) error { 360 - // Resolve and upsert user with handle/PDS endpoint 361 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 362 - return fmt.Errorf("failed to ensure user: %w", err) 363 - } 364 - 365 - if commit.Operation == "delete" { 366 - // Delete manifest - rkey is just the digest, repository is not encoded 367 - digest := commit.RKey 368 - if err := db.DeleteManifest(w.db, commit.DID, "", digest); err != nil { 369 - return err 370 - } 371 - // Clean up any orphaned tags pointing to this manifest 372 - return db.CleanupOrphanedTags(w.db, commit.DID) 373 - } 374 - 375 - // Parse manifest record 376 - if commit.Record == nil { 377 - return nil // No record data, can't process 378 - } 379 - 380 - // Marshal map to bytes for processing 381 - recordBytes, err := json.Marshal(commit.Record) 382 - if err != nil { 383 - return fmt.Errorf("failed to marshal record: %w", err) 384 - } 385 - 386 - // Use shared processor for DB operations 387 - _, err = w.processor.ProcessManifest(context.Background(), commit.DID, recordBytes) 388 - return err 389 - } 390 - 391 - // processTag processes a tag commit event 392 - func (w *Worker) processTag(commit *CommitEvent) error { 393 - // Resolve and upsert user with handle/PDS endpoint 394 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 395 - return fmt.Errorf("failed to ensure user: %w", err) 396 - } 397 - 398 - if commit.Operation == "delete" { 399 - // Delete tag - decode rkey back to repository and tag 400 - repo, tag := atproto.RKeyToRepositoryTag(commit.RKey) 401 - slog.Info("Jetstream deleting tag", "did", commit.DID, "repository", repo, "tag", tag, "rkey", commit.RKey) 402 - if err := db.DeleteTag(w.db, commit.DID, repo, tag); err != nil { 403 - slog.Error("Jetstream ERROR deleting tag", "error", err) 404 - return err 405 - } 406 - slog.Info("Jetstream successfully deleted tag", "did", commit.DID, "repository", repo, "tag", tag) 407 - return nil 408 - } 409 - 410 - // Parse tag record 411 - if commit.Record == nil { 412 - return nil 413 - } 414 - 415 - // Marshal map to bytes for processing 416 - recordBytes, err := json.Marshal(commit.Record) 417 - if err != nil { 418 - return fmt.Errorf("failed to marshal record: %w", err) 419 - } 420 - 421 - // Use shared processor for DB operations 422 - return w.processor.ProcessTag(context.Background(), commit.DID, recordBytes) 423 - } 424 - 425 - // processStar processes a star commit event 426 - func (w *Worker) processStar(commit *CommitEvent) error { 427 - // Resolve and upsert the user who starred (starrer) 428 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 429 - return fmt.Errorf("failed to ensure user: %w", err) 430 - } 431 - 432 - if commit.Operation == "delete" { 433 - // Unstar - parse the rkey to get the subject (owner DID and repository) 434 - // Delete events don't include the full record, but the rkey contains the info we need 435 - ownerDID, repository, err := atproto.ParseStarRecordKey(commit.RKey) 436 - if err != nil { 437 - return fmt.Errorf("failed to parse star rkey: %w", err) 438 - } 439 - 440 - // Delete the star record 441 - return db.DeleteStar(w.db, commit.DID, ownerDID, repository) 442 - } 443 - 444 - // Parse star record 445 - if commit.Record == nil { 446 - return nil 447 - } 448 - 449 - // Marshal map to bytes for processing 450 - recordBytes, err := json.Marshal(commit.Record) 451 - if err != nil { 452 - return fmt.Errorf("failed to marshal record: %w", err) 453 - } 454 - 455 - // Use shared processor for DB operations 456 - return w.processor.ProcessStar(context.Background(), commit.DID, recordBytes) 457 - } 458 - 459 - // processRepoPage processes a repo page commit event 460 - func (w *Worker) processRepoPage(commit *CommitEvent) error { 461 - // Resolve and upsert user with handle/PDS endpoint 462 - if err := w.processor.EnsureUser(context.Background(), commit.DID); err != nil { 463 - return fmt.Errorf("failed to ensure user: %w", err) 464 - } 465 - 466 - isDelete := commit.Operation == "delete" 467 - 468 - if isDelete { 469 - // Delete - rkey is the repository name 470 - slog.Info("Jetstream deleting repo page", "did", commit.DID, "repository", commit.RKey) 471 - if err := w.processor.ProcessRepoPage(context.Background(), commit.DID, commit.RKey, nil, true); err != nil { 472 - slog.Error("Jetstream ERROR deleting repo page", "error", err) 473 - return err 474 - } 475 - slog.Info("Jetstream successfully deleted repo page", "did", commit.DID, "repository", commit.RKey) 476 - return nil 477 - } 478 - 479 - // Parse repo page record 480 - if commit.Record == nil { 481 - return nil 482 - } 483 - 484 - // Marshal map to bytes for processing 485 - recordBytes, err := json.Marshal(commit.Record) 486 - if err != nil { 487 - return fmt.Errorf("failed to marshal record: %w", err) 488 - } 489 - 490 - // Use shared processor for DB operations 491 - return w.processor.ProcessRepoPage(context.Background(), commit.DID, commit.RKey, recordBytes, false) 492 - } 493 - 494 - // processStats processes a stats commit event from a hold PDS 495 - func (w *Worker) processStats(commit *CommitEvent) error { 496 - isDelete := commit.Operation == "delete" 497 - 498 - if isDelete { 499 - // For delete events, we need to parse the rkey to get ownerDID + repository 500 - // The rkey is deterministic: base32(sha256(ownerDID + "/" + repository)[:16]) 501 - // Unfortunately, we can't reverse this - we need the record data 502 - // Delete events don't include record data, so we can't delete from cache 503 - // This is acceptable - stats will be refreshed on next update from hold 504 - slog.Debug("Jetstream ignoring stats delete event (cannot reverse rkey)", "did", commit.DID, "rkey", commit.RKey) 505 - return nil 506 - } 507 - 508 - // Parse stats record 509 - if commit.Record == nil { 510 - return nil 511 - } 512 - 513 - // Marshal map to bytes for processing 514 - recordBytes, err := json.Marshal(commit.Record) 515 - if err != nil { 516 - return fmt.Errorf("failed to marshal record: %w", err) 517 - } 518 - 519 - // Use shared processor - commit.DID is the hold's DID 520 - return w.processor.ProcessStats(context.Background(), commit.DID, recordBytes, false) 521 - } 522 - 523 - // processCaptain processes a captain record event from a hold's PDS 524 - func (w *Worker) processCaptain(commit *CommitEvent) error { 525 - holdDID := commit.DID // The repo DID IS the hold DID 526 - 527 - if commit.Operation == "delete" { 528 - // Delete captain record - this cascades to crew members 529 - if err := db.DeleteCaptainRecord(w.db, holdDID); err != nil { 530 - return fmt.Errorf("failed to delete captain record: %w", err) 531 - } 532 - slog.Info("Deleted captain record for hold", "hold_did", holdDID) 533 - return nil 534 - } 535 - 536 - // Parse captain record 537 - if commit.Record == nil { 538 - return nil 539 - } 540 - 541 - // Marshal map to bytes for processing 542 - recordBytes, err := json.Marshal(commit.Record) 543 - if err != nil { 544 - return fmt.Errorf("failed to marshal captain record: %w", err) 545 - } 546 - 547 - // Use shared processor 548 - return w.processor.ProcessCaptain(context.Background(), holdDID, recordBytes) 549 - } 550 - 551 - // processCrew processes a crew record event from a hold's PDS 552 - func (w *Worker) processCrew(commit *CommitEvent) error { 553 - holdDID := commit.DID // The repo DID IS the hold DID 554 - 555 - if commit.Operation == "delete" { 556 - // Delete crew member by rkey 557 - if err := db.DeleteCrewMemberByRkey(w.db, holdDID, commit.RKey); err != nil { 558 - return fmt.Errorf("failed to delete crew member: %w", err) 559 - } 560 - slog.Info("Deleted crew member from hold", "hold_did", holdDID, "rkey", commit.RKey) 561 - return nil 562 - } 563 - 564 - // Parse crew record 565 - if commit.Record == nil { 566 - return nil 567 - } 568 - 569 - // Marshal map to bytes for processing 570 - recordBytes, err := json.Marshal(commit.Record) 571 - if err != nil { 572 - return fmt.Errorf("failed to marshal crew record: %w", err) 573 - } 574 - 575 - // Use shared processor - pass rkey for storage 576 - return w.processor.ProcessCrew(context.Background(), holdDID, commit.RKey, recordBytes) 577 - } 578 - 579 354 // processIdentity processes an identity event (handle change) 580 355 func (w *Worker) processIdentity(event *JetstreamEvent) error { 581 356 if event.Identity == nil { ··· 596 371 account := event.Account 597 372 // Process via shared processor (only ATCR users will be logged at Info level) 598 373 return w.processor.ProcessAccount(context.Background(), account.DID, account.Active, account.Status) 374 + } 375 + 376 + // isATCRCollection returns true if the collection is one we process 377 + func isATCRCollection(collection string) bool { 378 + switch collection { 379 + case atproto.ManifestCollection, 380 + atproto.TagCollection, 381 + atproto.StarCollection, 382 + atproto.RepoPageCollection, 383 + atproto.SailorProfileCollection, 384 + atproto.StatsCollection, 385 + atproto.CaptainCollection, 386 + atproto.CrewCollection: 387 + return true 388 + default: 389 + return false 390 + } 599 391 } 600 392 601 393 // JetstreamEvent represents a Jetstream event