this repo has no description
0
fork

Configure Feed

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

Clickhouse backend for linear

Jaz 682eba08 e5e4f4d7

+289 -123
+1 -1
backfill/next/util.go
··· 26 26 r.counter.Add(float64(n)) 27 27 } 28 28 closeerr := r.source.Close() 29 - if err != nil && err != io.EOF { 29 + if err != io.EOF { 30 30 return err 31 31 } 32 32 return closeerr
+202 -60
cmd/linear/main.go
··· 18 18 19 19 "github.com/goccy/go-json" 20 20 21 + "github.com/ClickHouse/ch-go" 22 + "github.com/ClickHouse/ch-go/proto" 21 23 comatproto "github.com/bluesky-social/indigo/api/atproto" 22 24 "github.com/bluesky-social/indigo/atproto/data" 25 + "github.com/bluesky-social/indigo/atproto/syntax" 23 26 backfill "github.com/bluesky-social/indigo/backfill/next" 24 27 "github.com/bluesky-social/indigo/xrpc" 25 28 "github.com/ipfs/go-cid" ··· 38 41 bf *backfill.Backfiller 39 42 teardown chan struct{} 40 43 41 - out *os.File 42 - outChan chan []byte 43 - fileClosed chan struct{} 44 + chClient *ch.Client 45 + chAddress string 46 + chUser string 47 + chPassword string 48 + chDatabase string 49 + 50 + outChan chan *chRow 51 + writingDone chan struct{} 44 52 } 45 53 46 54 type Line struct { ··· 80 88 Value: cli.NewStringSlice("blusher.us-east.host.bsky.network", "yellowfoot.us-west.host.bsky.network", "psathyrella.us-west.host.bsky.network", "hollowfoot.us-west.host.bsky.network", "fuzzyfoot.us-west.host.bsky.network", "panus.us-west.host.bsky.network", "mazegill.us-west.host.bsky.network", "pioppino.us-west.host.bsky.network", "waxcap.us-west.host.bsky.network", "elfcup.us-east.host.bsky.network"), 81 89 EnvVars: []string{"LINEAR_PDS_LIST"}, 82 90 }, 83 - &cli.StringFlag{ 84 - Name: "output-file", 85 - EnvVars: []string{"LINEAR_OUTPUT_FILE"}, 86 - Value: "data/linear.jsonl", 87 - }, 88 91 &cli.BoolFlag{ 89 92 Name: "discover-pds", 90 93 Usage: "discover PDSs from the listHosts endpoint on the Relay", ··· 97 100 Value: "https://relay.pop1.bsky.network", 98 101 EnvVars: []string{"LINEAR_RELAY_HOST"}, 99 102 }, 103 + &cli.StringFlag{ 104 + Name: "clickhouse-address", 105 + Usage: "address of the ClickHouse server", 106 + Value: "localhost:9000", 107 + EnvVars: []string{"LINEAR_CLICKHOUSE_ADDRESS"}, 108 + }, 109 + &cli.StringFlag{ 110 + Name: "clickhouse-user", 111 + Usage: "username for ClickHouse", 112 + Value: "linear_user", 113 + EnvVars: []string{"LINEAR_CLICKHOUSE_USER"}, 114 + }, 115 + &cli.StringFlag{ 116 + Name: "clickhouse-password", 117 + Usage: "password for ClickHouse", 118 + Value: "localdev", 119 + EnvVars: []string{"LINEAR_CLICKHOUSE_PASSWORD"}, 120 + }, 121 + &cli.StringFlag{ 122 + Name: "clickhouse-database", 123 + Usage: "database name in ClickHouse", 124 + Value: "linear", 125 + EnvVars: []string{"LINEAR_CLICKHOUSE_DATABASE"}, 126 + }, 100 127 }, 101 128 }, 102 129 } ··· 138 165 return fmt.Errorf("failed to setup backfill store: %w", err) 139 166 } 140 167 141 - backfillOutFile, err := os.OpenFile(cctx.String("output-file"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 168 + chClient, err := setupClickhouseClient(ctx, 169 + cctx.String("clickhouse-address"), 170 + cctx.String("clickhouse-user"), 171 + cctx.String("clickhouse-password"), 172 + cctx.String("clickhouse-database"), 173 + ) 142 174 if err != nil { 143 - return fmt.Errorf("failed to open output file: %w", err) 175 + return fmt.Errorf("failed to setup ClickHouse client: %w", err) 144 176 } 145 177 146 178 linear := &Linear{ 147 - db: db, 148 - logger: logger, 179 + db: db, 180 + logger: logger, 181 + chClient: chClient, 182 + 183 + chAddress: cctx.String("clickhouse-address"), 184 + chUser: cctx.String("clickhouse-user"), 185 + chPassword: cctx.String("clickhouse-password"), 186 + chDatabase: cctx.String("clickhouse-database"), 149 187 150 - out: backfillOutFile, 151 - outChan: make(chan []byte, 1_000_000), 152 - fileClosed: make(chan struct{}), 188 + outChan: make(chan *chRow, 1_000_000), // Buffered channel to handle backpressure 189 + writingDone: make(chan struct{}), 153 190 154 191 teardown: make(chan struct{}), 155 192 } 156 193 157 - linear.startWriters() 194 + linear.startClickhouseWriter() 158 195 159 196 opts := backfill.DefaultBackfillerOptions() 160 - opts.GlobalRecordCreateConcurrency = 300_000 197 + opts.GlobalRecordCreateConcurrency = 200_000 161 198 opts.PerPDSSyncsPerSecond = 9.5 162 - opts.PerPDSBackfillConcurrency = 20 199 + opts.PerPDSBackfillConcurrency = 15 163 200 164 201 bf := backfill.NewBackfiller("linear-backfiller-v2", store, linear.handleCreate, opts) 165 202 ··· 286 323 // first, close down all 'sources' of work 287 324 lin.bf.Shutdown(ctx) 288 325 close(lin.teardown) 289 - <-lin.fileClosed 326 + <-lin.writingDone 290 327 return nil 291 328 } 292 329 ··· 306 343 return fmt.Errorf("failed to marshal record to json: %w", err) 307 344 } 308 345 309 - line := Line{ 310 - Repo: repo, 346 + createdAt := time.Now().UTC() 347 + tid, err := syntax.ParseTID(rkey) 348 + if err == nil { 349 + createdAt = tid.Time() 350 + } 351 + 352 + l.outChan <- &chRow{ 353 + DID: repo, 311 354 Collection: col, 312 355 RKey: rkey, 313 - Cid: cid.String(), 356 + CID: cid.String(), 314 357 Record: recJSON, 315 - } 316 - 317 - lineB, err := json.Marshal(line) 318 - if err != nil { 319 - return fmt.Errorf("failed to marshal line to json: %w", err) 358 + CreatedAt: createdAt, 320 359 } 321 - 322 - // Append a newline to the JSON line 323 - lineB = append(lineB, '\n') 324 - 325 - l.outChan <- lineB 326 360 327 361 return nil 328 362 } ··· 362 396 return store, bfdb, nil 363 397 } 364 398 399 + func setupClickhouseClient(ctx context.Context, address, user, pass, db string) (*ch.Client, error) { 400 + conn, err := ch.Dial(ctx, ch.Options{ 401 + Address: address, 402 + Database: db, 403 + User: user, 404 + Password: pass, 405 + }) 406 + if err != nil { 407 + return nil, fmt.Errorf("failed to connect to ClickHouse: %w", err) 408 + } 409 + 410 + if err := conn.Do(ctx, ch.Query{ 411 + Body: "SET enable_json_type = 1;", 412 + }); err != nil { 413 + return nil, fmt.Errorf("failed to set ClickHouse options: %w", err) 414 + } 415 + 416 + // Create the table if it doesn't exist 417 + createTableQuery := ch.Query{ 418 + Body: ` 419 + CREATE TABLE IF NOT EXISTS repo_records ( 420 + did String, 421 + collection String, 422 + rkey String, 423 + cid String, 424 + record JSON, 425 + created_at DateTime64(3, 'UTC') 426 + ) ENGINE = MergeTree 427 + ORDER BY (collection, did, rkey); 428 + `, 429 + } 430 + if err := conn.Do(ctx, createTableQuery); err != nil { 431 + return nil, fmt.Errorf("failed to create ClickHouse table: %w", err) 432 + } 433 + 434 + return conn, nil 435 + } 436 + 365 437 func splitPath(p string) (string, string, error) { 366 438 parts := strings.Split(p, "/") 367 439 if len(parts) != 2 { ··· 371 443 return parts[0], parts[1], nil 372 444 } 373 445 374 - func (lin *Linear) startWriters() { 375 - log := lin.logger.With("source", "writer") 376 - log.Info("starting writers") 446 + // SET enable_json_type = 1; 447 + // CREATE TABLE repo_records ( 448 + // `did` String, 449 + // `collection` String, 450 + // `rkey` String, 451 + // `cid` String, 452 + // `record` JSON, 453 + // `created_at` DateTime64(3, 'UTC'), 454 + // ) 455 + // ENGINE = MergeTree 456 + // ORDER BY (collection, did, rkey) 457 + 458 + type chRow struct { 459 + DID string 460 + Collection string 461 + RKey string 462 + CID string 463 + Record json.RawMessage 464 + CreatedAt time.Time 465 + } 466 + 467 + func (lin *Linear) startClickhouseWriter() { 468 + log := lin.logger.With("source", "clickhouse-writer") 469 + log.Info("starting ClickHouse writer") 470 + 471 + ctx := context.Background() 377 472 378 473 // Start some writers to handle output 379 474 wg := sync.WaitGroup{} 475 + recordsProcessed := atomic.Int64{} 380 476 381 - recordsProcessed := atomic.Int64{} 477 + insertQueryStr := `INSERT INTO repo_records (did, collection, rkey, cid, record, created_at) VALUES` 478 + 479 + for range 3 { 480 + wg.Add(1) 481 + go func() { 482 + defer wg.Done() 483 + recs := 0 484 + 485 + // Define the columns of the table 486 + var ( 487 + didCol proto.ColStr 488 + collectionCol proto.ColStr 489 + rkeyCol proto.ColStr 490 + cidCol proto.ColStr 491 + recordCol proto.ColJSONBytes 492 + createdAtCol = new(proto.ColDateTime64).WithPrecision(3) 493 + ) 382 494 383 - wg.Add(1) 384 - go func() { 385 - defer wg.Done() 386 - recs := 0 387 - for { 388 - select { 389 - case <-lin.teardown: 390 - log.Info("received shutdown signal, closing writer") 495 + input := proto.Input{ 496 + {Name: "did", Data: &didCol}, 497 + {Name: "collection", Data: &collectionCol}, 498 + {Name: "rkey", Data: &rkeyCol}, 499 + {Name: "cid", Data: &cidCol}, 500 + {Name: "record", Data: &recordCol}, 501 + {Name: "created_at", Data: createdAtCol}, 502 + } 503 + 504 + // Initialize a client 505 + chClient, err := ch.Dial(ctx, ch.Options{ 506 + Address: lin.chAddress, 507 + Database: lin.chDatabase, 508 + User: lin.chUser, 509 + Password: lin.chPassword, 510 + }) 511 + if err != nil { 512 + log.Error("failed to connect to ClickHouse", "err", err) 391 513 return 392 - case line := <-lin.outChan: 393 - if _, err := lin.out.Write(line); err != nil { 394 - log.Error("failed to write line to output file", "err", err) 395 - } 396 - recs++ 397 - if recs%1000 == 0 { 398 - recordsProcessed.Add(int64(recs)) 399 - recs = 0 514 + } 515 + defer chClient.Close() 516 + 517 + for { 518 + select { 519 + case <-lin.teardown: 520 + log.Info("received shutdown signal, closing writer") 521 + return 522 + case row := <-lin.outChan: 523 + recs++ 524 + 525 + didCol.Append(row.DID) 526 + collectionCol.Append(row.Collection) 527 + rkeyCol.Append(row.RKey) 528 + cidCol.Append(row.CID) 529 + recordCol.Append(row.Record) 530 + createdAtCol.Append(row.CreatedAt) 531 + 532 + if recs%100_000 == 0 { 533 + if err := chClient.Do(ctx, ch.Query{ 534 + Body: insertQueryStr, 535 + Input: input, 536 + }); err != nil { 537 + log.Error("failed to insert records into ClickHouse", "err", err) 538 + } else { 539 + recordsProcessed.Add(int64(recs)) 540 + log.Info("inserted records into ClickHouse", "count", recs) 541 + } 542 + recs = 0 543 + input.Reset() 544 + } 400 545 } 401 546 } 402 - } 403 - }() 547 + }() 548 + } 404 549 405 550 go func() { 406 551 ticker := time.NewTicker(10 * time.Second) ··· 419 564 420 565 go func() { 421 566 wg.Wait() 422 - if err := lin.out.Sync(); err != nil { 423 - log.Error("failed to sync output file", "err", err) 424 - } 425 - if err := lin.out.Close(); err != nil { 426 - log.Error("failed to close output file", "err", err) 567 + if err := lin.chClient.Close(); err != nil { 568 + log.Error("failed to close ClickHouse client", "err", err) 427 569 } 428 570 log.Info("all writers have finished") 429 - close(lin.fileClosed) 571 + close(lin.writingDone) 430 572 close(lin.outChan) 431 573 }() 432 574 }
+28 -20
go.mod
··· 1 1 module github.com/bluesky-social/indigo 2 2 3 - go 1.23 3 + go 1.23.0 4 4 5 5 toolchain go1.23.8 6 6 7 7 require ( 8 + github.com/ClickHouse/ch-go v0.66.1 8 9 github.com/PuerkitoBio/purell v1.2.1 9 10 github.com/RussellLuo/slidingwindow v0.0.0-20200528002341-535bb99d338b 10 11 github.com/adrg/xdg v0.5.0 ··· 55 56 github.com/redis/go-redis/v9 v9.3.0 56 57 github.com/rivo/uniseg v0.1.0 57 58 github.com/samber/slog-echo v1.8.0 58 - github.com/stretchr/testify v1.9.0 59 + github.com/stretchr/testify v1.10.0 59 60 github.com/urfave/cli/v2 v2.25.7 60 61 github.com/whyrusleeping/cbor-gen v0.2.1-0.20241030202151-b7a6831be65e 61 62 github.com/whyrusleeping/go-did v0.0.0-20230824162731-404d1707d5d6 62 63 github.com/xlab/treeprint v1.2.0 63 64 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b 64 65 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 65 - go.opentelemetry.io/otel v1.21.0 66 + go.opentelemetry.io/otel v1.36.0 66 67 go.opentelemetry.io/otel/exporters/jaeger v1.14.0 67 68 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 68 69 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 69 - go.opentelemetry.io/otel/sdk v1.21.0 70 - go.opentelemetry.io/otel/trace v1.21.0 70 + go.opentelemetry.io/otel/sdk v1.36.0 71 + go.opentelemetry.io/otel/trace v1.36.0 71 72 go.uber.org/automaxprocs v1.5.3 72 - go.uber.org/zap v1.26.0 73 - golang.org/x/crypto v0.21.0 74 - golang.org/x/sync v0.7.0 75 - golang.org/x/text v0.14.0 73 + go.uber.org/zap v1.27.0 74 + golang.org/x/crypto v0.33.0 75 + golang.org/x/sync v0.15.0 76 + golang.org/x/text v0.22.0 76 77 golang.org/x/time v0.3.0 77 - golang.org/x/tools v0.15.0 78 + golang.org/x/tools v0.30.0 78 79 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 79 80 gorm.io/driver/postgres v1.5.7 80 81 gorm.io/driver/sqlite v1.5.5 ··· 90 91 github.com/cockroachdb/redact v1.1.5 // indirect 91 92 github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect 92 93 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 94 + github.com/dmarkham/enumer v1.5.11 // indirect 93 95 github.com/getsentry/sentry-go v0.27.0 // indirect 96 + github.com/go-faster/city v1.0.1 // indirect 97 + github.com/go-faster/errors v0.7.1 // indirect 94 98 github.com/go-redis/redis v6.15.9+incompatible // indirect 95 99 github.com/golang/snappy v0.0.4 // indirect 96 100 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect 101 + github.com/hashicorp/go-version v1.7.0 // indirect 97 102 github.com/hashicorp/golang-lru v1.0.2 // indirect 98 103 github.com/ipfs/go-log v1.0.5 // indirect 99 - github.com/jackc/puddle/v2 v2.2.1 // indirect 100 - github.com/klauspost/compress v1.17.3 // indirect 104 + github.com/jackc/puddle/v2 v2.2.2 // indirect 105 + github.com/klauspost/compress v1.18.0 // indirect 101 106 github.com/kr/pretty v0.3.1 // indirect 102 107 github.com/kr/text v0.2.0 // indirect 103 108 github.com/labstack/gommon v0.4.1 // indirect 104 109 github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect 110 + github.com/pascaldekloe/name v1.0.1 // indirect 105 111 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 // indirect 112 + github.com/pierrec/lz4/v4 v4.1.22 // indirect 106 113 github.com/pkg/errors v0.9.1 // indirect 107 - github.com/rogpeppe/go-internal v1.10.0 // indirect 114 + github.com/rogpeppe/go-internal v1.13.1 // indirect 108 115 github.com/vmihailenco/go-tinylfu v0.2.2 // indirect 109 116 github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect 110 117 github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect 111 118 github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect 119 + go.opentelemetry.io/auto/sdk v1.1.0 // indirect 112 120 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect 113 121 gopkg.in/inf.v0 v0.9.1 // indirect 114 122 ) ··· 116 124 require ( 117 125 github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect 118 126 github.com/beorn7/perks v1.0.1 // indirect 119 - github.com/cenkalti/backoff/v4 v4.2.1 // indirect 127 + github.com/cenkalti/backoff/v4 v4.3.0 // indirect 120 128 github.com/cespare/xxhash/v2 v2.2.0 // indirect 121 129 github.com/corpix/uarand v0.2.0 // indirect 122 130 github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect 123 131 github.com/davecgh/go-spew v1.1.1 // indirect 124 132 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect 125 133 github.com/felixge/httpsnoop v1.0.4 // indirect 126 - github.com/go-logr/logr v1.4.1 // indirect 134 + github.com/go-logr/logr v1.4.2 // indirect 127 135 github.com/go-logr/stdr v1.2.2 // indirect 128 136 github.com/gogo/protobuf v1.3.2 // indirect 129 137 github.com/golang/protobuf v1.5.3 // indirect 130 - github.com/google/uuid v1.4.0 // indirect 138 + github.com/google/uuid v1.6.0 // indirect 131 139 github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect 132 140 github.com/hashicorp/go-cleanhttp v0.5.2 133 141 github.com/ipfs/bbloom v0.0.4 // indirect ··· 173 181 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect 174 182 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 // indirect 175 183 go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.45.0 176 - go.opentelemetry.io/otel/metric v1.21.0 // indirect 184 + go.opentelemetry.io/otel/metric v1.36.0 // indirect 177 185 go.opentelemetry.io/proto/otlp v1.0.0 // indirect 178 186 go.uber.org/atomic v1.11.0 // indirect 179 187 go.uber.org/multierr v1.11.0 // indirect 180 - golang.org/x/mod v0.14.0 // indirect 181 - golang.org/x/net v0.23.0 // indirect 182 - golang.org/x/sys v0.22.0 // indirect 188 + golang.org/x/mod v0.23.0 // indirect 189 + golang.org/x/net v0.35.0 // indirect 190 + golang.org/x/sys v0.33.0 // indirect 183 191 google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect 184 192 google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect 185 193 google.golang.org/grpc v1.59.0 // indirect
+58 -42
go.sum
··· 1 1 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 2 + github.com/ClickHouse/ch-go v0.66.1 h1:LQHFslfVYZsISOY0dnOYOXGkOUvpv376CCm8g7W74A4= 3 + github.com/ClickHouse/ch-go v0.66.1/go.mod h1:NEYcg3aOFv2EmTJfo4m2WF7sHB/YFbLUuIWv9iq76xY= 2 4 github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= 3 5 github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 4 6 github.com/PuerkitoBio/purell v1.2.1 h1:QsZ4TjvwiMpat6gBCBxEQI0rcS9ehtkKtSpiUnd9N28= ··· 43 45 github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 44 46 github.com/carlmjohnson/versioninfo v0.22.5 h1:O00sjOLUAFxYQjlN/bzYTuZiS0y6fWDQjMRvwtKgwwc= 45 47 github.com/carlmjohnson/versioninfo v0.22.5/go.mod h1:QT9mph3wcVfISUKd0i9sZfVrPviHuSF+cUtLjm2WSf8= 46 - github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= 47 - github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 48 + github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= 49 + github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 48 50 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 49 51 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= 50 52 github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= ··· 81 83 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 82 84 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= 83 85 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= 86 + github.com/dmarkham/enumer v1.5.11 h1:quorLCaEfzjJ23Pf7PB9lyyaHseh91YfTM/sAD/4Mbo= 87 + github.com/dmarkham/enumer v1.5.11/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8= 84 88 github.com/dustinkirkland/golang-petname v0.0.0-20231002161417-6a283f1aaaf2 h1:S6Dco8FtAhEI/qkg/00H6RdEGC+MCy5GPiQ+xweNRFE= 85 89 github.com/dustinkirkland/golang-petname v0.0.0-20231002161417-6a283f1aaaf2/go.mod h1:8AuBTZBRSFqEYBPYULd+NN474/zZBLP+6WeT5S9xlAc= 86 90 github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= ··· 96 100 github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= 97 101 github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= 98 102 github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= 103 + github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= 104 + github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= 105 + github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= 106 + github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= 99 107 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 100 108 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 101 - github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= 102 - github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 109 + github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= 110 + github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 103 111 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 104 112 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 105 113 github.com/go-redis/cache/v9 v9.0.0 h1:0thdtFo0xJi0/WXbRVu8B066z8OvVymXTJGaXrVWnN0= ··· 139 147 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 140 148 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 141 149 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 142 - github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 143 - github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 150 + github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 151 + github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 144 152 github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= 145 153 github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= 146 154 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 147 155 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 148 156 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 149 - github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= 150 - github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 157 + github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 158 + github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 151 159 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 152 160 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 153 161 github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= ··· 162 170 github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= 163 171 github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= 164 172 github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= 173 + github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= 174 + github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 165 175 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= 166 176 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 167 177 github.com/hashicorp/golang-lru/arc/v2 v2.0.6 h1:4NU7uP5vSoK6TbaMj3NtY478TTAWLso/vL1gpNrInHg= ··· 257 267 github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= 258 268 github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= 259 269 github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= 260 - github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= 261 - github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 270 + github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= 271 + github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= 262 272 github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= 263 273 github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= 264 274 github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= ··· 278 288 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 279 289 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 280 290 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 281 - github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= 282 - github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= 291 + github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= 292 + github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= 283 293 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= 284 294 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 285 295 github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= ··· 402 412 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 403 413 github.com/orandin/slog-gorm v1.3.2 h1:C0lKDQPAx/pF+8K2HL7bdShPwOEJpPM0Bn80zTzxU1g= 404 414 github.com/orandin/slog-gorm v1.3.2/go.mod h1:MoZ51+b7xE9lwGNPYEhxcUtRNrYzjdcKvA8QXQQGEPA= 415 + github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0= 416 + github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= 405 417 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+Tv1WTxkukpXeMlviSxvL7SRgk= 406 418 github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= 419 + github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= 420 + github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 407 421 github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= 408 422 github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= 409 423 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= ··· 434 448 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 435 449 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 436 450 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 437 - github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= 438 - github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= 451 + github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= 452 + github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 439 453 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 440 454 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 441 455 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= ··· 469 483 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 470 484 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 471 485 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 472 - github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 473 - github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 486 + github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 487 + github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 474 488 github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= 475 489 github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= 476 490 github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= ··· 510 524 gitlab.com/yawning/secp256k1-voi v0.0.0-20230925100816-f2616030848b/go.mod h1:/y/V339mxv2sZmYYR64O07VuCpdNZqCTwO8ZcouTMI8= 511 525 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02 h1:qwDnMxjkyLmAFgcfgTnfJrmYKWhHnci3GjDqcZp1M3Q= 512 526 gitlab.com/yawning/tuplehash v0.0.0-20230713102510-df83abbf9a02/go.mod h1:JTnUj0mpYiAsuZLmKjTx/ex3AtMowcCgnE7YNyCEP0I= 527 + go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= 528 + go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= 513 529 go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.45.0 h1:JJCIHAxGCB5HM3NxeIwFjHc087Xwk96TG9kaZU6TAec= 514 530 go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho v0.45.0/go.mod h1:Px9kH7SJ+NhsgWRtD/eMcs15Tyt4uL3rM7X54qv6pfA= 515 531 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= 516 532 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= 517 533 go.opentelemetry.io/contrib/propagators/b3 v1.20.0 h1:Yty9Vs4F3D6/liF1o6FNt0PvN85h/BJJ6DQKJ3nrcM0= 518 534 go.opentelemetry.io/contrib/propagators/b3 v1.20.0/go.mod h1:On4VgbkqYL18kbJlWsa18+cMNe6rYpBnPi1ARI/BrsU= 519 - go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= 520 - go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= 535 + go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= 536 + go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= 521 537 go.opentelemetry.io/otel/exporters/jaeger v1.14.0 h1:CjbUNd4iN2hHmWekmOqZ+zSCU+dzZppG8XsV+A3oc8Q= 522 538 go.opentelemetry.io/otel/exporters/jaeger v1.14.0/go.mod h1:4Ay9kk5vELRrbg5z4cpP9EtmQRFap2Wb0woPG4lujZA= 523 539 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= 524 540 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= 525 541 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= 526 542 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= 527 - go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= 528 - go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= 529 - go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= 530 - go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= 531 - go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= 532 - go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= 543 + go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= 544 + go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= 545 + go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= 546 + go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= 547 + go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= 548 + go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= 533 549 go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= 534 550 go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= 535 551 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= ··· 540 556 go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= 541 557 go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= 542 558 go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 543 - go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= 544 - go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= 559 + go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 560 + go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 545 561 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 546 562 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= 547 563 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= ··· 551 567 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 552 568 go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= 553 569 go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= 554 - go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= 555 - go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= 570 + go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= 571 + go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 556 572 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 557 573 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 558 574 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= ··· 560 576 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 561 577 golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= 562 578 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 563 - golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= 564 - golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= 579 + golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= 580 + golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= 565 581 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 566 582 golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 567 583 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= ··· 574 590 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= 575 591 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 576 592 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 577 - golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= 578 - golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 593 + golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= 594 + golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 579 595 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 580 596 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 581 597 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= ··· 597 613 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 598 614 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 599 615 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 600 - golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= 601 - golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 616 + golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= 617 + golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= 602 618 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 603 619 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 604 620 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= ··· 606 622 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 607 623 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 608 624 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 609 - golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= 610 - golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 625 + golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= 626 + golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 611 627 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 612 628 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 613 629 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= ··· 640 656 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 641 657 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 642 658 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 643 - golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= 644 - golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 659 + golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= 660 + golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 645 661 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 646 662 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 647 663 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= ··· 661 677 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 662 678 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 663 679 golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 664 - golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= 665 - golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 680 + golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= 681 + golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= 666 682 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= 667 683 golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 668 684 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= ··· 682 698 golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= 683 699 golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= 684 700 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 685 - golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= 686 - golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= 701 + golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= 702 + golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= 687 703 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 688 704 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 689 705 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=