├── cardinal ├── component │ ├── health.go │ └── player.go ├── msg │ ├── create_player.go │ └── attack_player.go ├── .run │ └── Cardinal - Debug.run.xml ├── system │ ├── default_spawner.go │ ├── regen.go │ ├── player_spawner.go │ ├── attack.go │ └── utils.go ├── Makefile ├── query │ └── player_health.go ├── init_test.go ├── main.go ├── system_test.go ├── go.mod └── go.sum ├── .github └── workflows │ ├── build.yml │ ├── lint-go.yml │ └── test.yml ├── .markdownlint.yaml ├── Dockerfile ├── README.md ├── .gitignore ├── world.toml ├── docker-compose.yml └── .golangci.yaml /cardinal/component/health.go: -------------------------------------------------------------------------------- 1 | package component 2 | 3 | type Health struct { 4 | HP int 5 | } 6 | 7 | func (Health) Name() string { 8 | return "Health" 9 | } 10 | -------------------------------------------------------------------------------- /cardinal/component/player.go: -------------------------------------------------------------------------------- 1 | package component 2 | 3 | type Player struct { 4 | Nickname string `json:"nickname"` 5 | } 6 | 7 | func (Player) Name() string { 8 | return "Player" 9 | } 10 | -------------------------------------------------------------------------------- /cardinal/msg/create_player.go: -------------------------------------------------------------------------------- 1 | package msg 2 | 3 | type CreatePlayerMsg struct { 4 | Nickname string `json:"nickname"` 5 | } 6 | 7 | type CreatePlayerResult struct { 8 | Success bool `json:"success"` 9 | } 10 | -------------------------------------------------------------------------------- /cardinal/msg/attack_player.go: -------------------------------------------------------------------------------- 1 | package msg 2 | 3 | type AttackPlayerMsg struct { 4 | TargetNickname string `json:"target"` 5 | } 6 | 7 | type AttackPlayerMsgReply struct { 8 | Damage int `json:"damage"` 9 | } 10 | -------------------------------------------------------------------------------- /cardinal/.run/Cardinal - Debug.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | build-cardinal: 11 | name: Cardinal 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v4 16 | - name: Setup Docker Build 17 | uses: docker/setup-buildx-action@v2 18 | - name: Build Cardinal Docker Image 19 | run: docker build . 20 | -------------------------------------------------------------------------------- /.markdownlint.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Default state for all rules 3 | default: true 4 | 5 | # MD013/line-length : Line length : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md013.md 6 | MD013: 7 | ## Increase line length from default '80' 8 | line_length: 250 9 | ## exluce code_blocks from line linter 10 | code_blocks: false 11 | 12 | # MD033/no-inline-html : Inline HTML : https://github.com/DavidAnson/markdownlint/blob/v0.34.0/doc/md033.md 13 | MD033: 14 | allowed_elements: 15 | - img 16 | - div 17 | - br 18 | - a 19 | - pre 20 | - h1 21 | - p 22 | -------------------------------------------------------------------------------- /cardinal/system/default_spawner.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "fmt" 5 | 6 | "pkg.world.dev/world-engine/cardinal" 7 | 8 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 9 | ) 10 | 11 | // SpawnDefaultPlayersSystem creates 10 players with nicknames "default-[0-9]". This System is registered as an 12 | // Init system, meaning it will be executed exactly one time on tick 0. 13 | func SpawnDefaultPlayersSystem(world cardinal.WorldContext) error { 14 | for i := 0; i < 10; i++ { 15 | name := fmt.Sprintf("default-%d", i) 16 | _, err := cardinal.Create(world, 17 | comp.Player{Nickname: name}, 18 | comp.Health{HP: InitialHP}, 19 | ) 20 | if err != nil { 21 | return err 22 | } 23 | } 24 | return nil 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/lint-go.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, reopened, ready_for_review] 6 | push: 7 | branches: 8 | - main 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | lint-go: 15 | name: Go 16 | runs-on: macos-14 17 | env: 18 | GO_VERSION: 1.22.1 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v4 22 | - name: Setup Golang 23 | uses: actions/setup-go@v5 24 | with: 25 | go-version: ${{ env.GO_VERSION }} 26 | - name: golangci-lint 27 | uses: golangci/golangci-lint-action@v4 28 | with: 29 | version: v1.56.2 30 | args: --timeout=10m 31 | working-directory: ./cardinal -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | env: 10 | GO_VERSION: 1.22.1 11 | 12 | jobs: 13 | unit-test: 14 | name: Unit Tests 15 | runs-on: namespace-profile-linux-4vcpu-8gb-cached 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | - name: Setup Golang 20 | uses: actions/setup-go@v5 21 | with: 22 | go-version: ${{ env.GO_VERSION }} 23 | ## skip cache, use Namespace volume cache 24 | cache: false 25 | - name: Setup Namespace cache 26 | uses: namespacelabs/nscloud-cache-action@v1 27 | with: 28 | cache: go 29 | - name: Run Unit Test 30 | run: | 31 | cd cardinal 32 | make test 33 | -------------------------------------------------------------------------------- /cardinal/Makefile: -------------------------------------------------------------------------------- 1 | ################# 2 | # golangci-lint # 3 | ################# 4 | golangci_version=v1.56.2 5 | 6 | .PHONY: lint-install lint lint-fix 7 | 8 | # Install golangci-lint if not present 9 | lint-install: 10 | @if ! command -v golangci-lint &> /dev/null; then \ 11 | echo "--> golangci-lint is not installed. Installing..."; \ 12 | @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version); \ 13 | fi 14 | 15 | # Run golangci-lint on the project 16 | lint: 17 | @$(MAKE) lint-install 18 | @echo "--> Running golangci-lint" 19 | @golangci-lint run --timeout=10m 20 | 21 | 22 | # Run golangci-lint on the project and fix any issues 23 | lint-fix: 24 | @$(MAKE) lint-install 25 | @echo "--> Running golangci-lint" 26 | @golangci-lint run --timeout=10m --fix 27 | 28 | test: 29 | @go test ./... 30 | -------------------------------------------------------------------------------- /cardinal/system/regen.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "pkg.world.dev/world-engine/cardinal" 5 | "pkg.world.dev/world-engine/cardinal/filter" 6 | "pkg.world.dev/world-engine/cardinal/types" 7 | 8 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 9 | ) 10 | 11 | // RegenSystem replenishes the player's HP at every tick. 12 | // This provides an example of a system that doesn't rely on a transaction to update a component. 13 | func RegenSystem(world cardinal.WorldContext) error { 14 | return cardinal.NewSearch().Entity( 15 | filter.Exact(filter.Component[comp.Player](), filter.Component[comp.Health]())). 16 | Each(world, func(id types.EntityID) bool { 17 | health, err := cardinal.GetComponent[comp.Health](world, id) 18 | if err != nil { 19 | return true 20 | } 21 | health.HP++ 22 | if err := cardinal.SetComponent[comp.Health](world, id, health); err != nil { 23 | return true 24 | } 25 | return true 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /cardinal/system/player_spawner.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "fmt" 5 | 6 | "pkg.world.dev/world-engine/cardinal" 7 | 8 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 9 | "github.com/argus-labs/starter-game-template/cardinal/msg" 10 | ) 11 | 12 | const ( 13 | InitialHP = 100 14 | ) 15 | 16 | // PlayerSpawnerSystem spawns players based on `CreatePlayer` transactions. 17 | // This provides an example of a system that creates a new entity. 18 | func PlayerSpawnerSystem(world cardinal.WorldContext) error { 19 | return cardinal.EachMessage[msg.CreatePlayerMsg, msg.CreatePlayerResult]( 20 | world, 21 | func(create cardinal.TxData[msg.CreatePlayerMsg]) (msg.CreatePlayerResult, error) { 22 | id, err := cardinal.Create(world, 23 | comp.Player{Nickname: create.Msg.Nickname}, 24 | comp.Health{HP: InitialHP}, 25 | ) 26 | if err != nil { 27 | return msg.CreatePlayerResult{}, fmt.Errorf("error creating player: %w", err) 28 | } 29 | 30 | err = world.EmitEvent(map[string]any{ 31 | "event": "new_player", 32 | "id": id, 33 | }) 34 | if err != nil { 35 | return msg.CreatePlayerResult{}, err 36 | } 37 | return msg.CreatePlayerResult{Success: true}, nil 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /cardinal/system/attack.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "fmt" 5 | 6 | "pkg.world.dev/world-engine/cardinal" 7 | 8 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 9 | "github.com/argus-labs/starter-game-template/cardinal/msg" 10 | ) 11 | 12 | const AttackDamage = 10 13 | 14 | // AttackSystem inflict damage to player's HP based on `AttackPlayer` transactions. 15 | // This provides an example of a system that modifies the component of an entity. 16 | func AttackSystem(world cardinal.WorldContext) error { 17 | return cardinal.EachMessage[msg.AttackPlayerMsg, msg.AttackPlayerMsgReply]( 18 | world, 19 | func(attack cardinal.TxData[msg.AttackPlayerMsg]) (msg.AttackPlayerMsgReply, error) { 20 | playerID, playerHealth, err := queryTargetPlayer(world, attack.Msg.TargetNickname) 21 | if err != nil { 22 | return msg.AttackPlayerMsgReply{}, fmt.Errorf("failed to inflict damage: %w", err) 23 | } 24 | 25 | playerHealth.HP -= AttackDamage 26 | if err := cardinal.SetComponent[comp.Health](world, playerID, playerHealth); err != nil { 27 | return msg.AttackPlayerMsgReply{}, fmt.Errorf("failed to inflict damage: %w", err) 28 | } 29 | 30 | return msg.AttackPlayerMsgReply{Damage: AttackDamage}, nil 31 | }) 32 | } 33 | -------------------------------------------------------------------------------- /cardinal/system/utils.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "fmt" 5 | 6 | "pkg.world.dev/world-engine/cardinal" 7 | "pkg.world.dev/world-engine/cardinal/filter" 8 | "pkg.world.dev/world-engine/cardinal/types" 9 | 10 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 11 | ) 12 | 13 | // queryTargetPlayer queries for the target player's entity ID and health component. 14 | func queryTargetPlayer(world cardinal.WorldContext, targetNickname string) (types.EntityID, *comp.Health, error) { 15 | var playerID types.EntityID 16 | var playerHealth *comp.Health 17 | var err error 18 | searchErr := cardinal.NewSearch().Entity( 19 | filter.Exact(filter.Component[comp.Player](), filter.Component[comp.Health]())).Each(world, 20 | func(id types.EntityID) bool { 21 | var player *comp.Player 22 | player, err = cardinal.GetComponent[comp.Player](world, id) 23 | if err != nil { 24 | return false 25 | } 26 | 27 | // Terminates the search if the player is found 28 | if player.Nickname == targetNickname { 29 | playerID = id 30 | playerHealth, err = cardinal.GetComponent[comp.Health](world, id) 31 | if err != nil { 32 | return false 33 | } 34 | return false 35 | } 36 | 37 | // Continue searching if the player is not the target player 38 | return true 39 | }) 40 | if searchErr != nil { 41 | return 0, nil, err 42 | } 43 | if err != nil { 44 | return 0, nil, err 45 | } 46 | if playerHealth == nil { 47 | return 0, nil, fmt.Errorf("player %q does not exist", targetNickname) 48 | } 49 | 50 | return playerID, playerHealth, err 51 | } 52 | -------------------------------------------------------------------------------- /cardinal/query/player_health.go: -------------------------------------------------------------------------------- 1 | package query 2 | 3 | import ( 4 | "fmt" 5 | 6 | "pkg.world.dev/world-engine/cardinal/filter" 7 | "pkg.world.dev/world-engine/cardinal/types" 8 | 9 | comp "github.com/argus-labs/starter-game-template/cardinal/component" 10 | 11 | "pkg.world.dev/world-engine/cardinal" 12 | ) 13 | 14 | type PlayerHealthRequest struct { 15 | Nickname string 16 | } 17 | 18 | type PlayerHealthResponse struct { 19 | HP int 20 | } 21 | 22 | func PlayerHealth(world cardinal.WorldContext, req *PlayerHealthRequest) (*PlayerHealthResponse, error) { 23 | var playerHealth *comp.Health 24 | var err error 25 | searchErr := cardinal.NewSearch().Entity( 26 | filter.Exact(filter.Component[comp.Player](), filter.Component[comp.Health]())). 27 | Each(world, func(id types.EntityID) bool { 28 | var player *comp.Player 29 | player, err = cardinal.GetComponent[comp.Player](world, id) 30 | if err != nil { 31 | return false 32 | } 33 | 34 | // Terminates the search if the player is found 35 | if player.Nickname == req.Nickname { 36 | playerHealth, err = cardinal.GetComponent[comp.Health](world, id) 37 | if err != nil { 38 | return false 39 | } 40 | return false 41 | } 42 | 43 | // Continue searching if the player is not the target player 44 | return true 45 | }) 46 | if searchErr != nil { 47 | return nil, searchErr 48 | } 49 | if err != nil { 50 | return nil, err 51 | } 52 | 53 | if playerHealth == nil { 54 | return nil, fmt.Errorf("player %s does not exist", req.Nickname) 55 | } 56 | 57 | return &PlayerHealthResponse{HP: playerHealth.HP}, nil 58 | } 59 | -------------------------------------------------------------------------------- /cardinal/init_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "pkg.world.dev/world-engine/cardinal" 8 | "pkg.world.dev/world-engine/cardinal/filter" 9 | "pkg.world.dev/world-engine/cardinal/types" 10 | 11 | "github.com/argus-labs/starter-game-template/cardinal/component" 12 | ) 13 | 14 | // TestInitSystem_SpawnDefaultPlayersSystem_DefaultPlayersAreSpawned ensures a set of default players are created in the 15 | // SpawnDefaultPlayersSystem. These players should only be created on tick 0. 16 | func TestInitSystem_SpawnDefaultPlayersSystem_DefaultPlayersAreSpawned(t *testing.T) { 17 | tf := cardinal.NewTestFixture(t, nil) 18 | MustInitWorld(tf.World) 19 | 20 | tf.DoTick() 21 | // Do an extra tick to make sure the default players are only created once. 22 | tf.DoTick() 23 | 24 | wCtx := cardinal.NewReadOnlyWorldContext(tf.World) 25 | 26 | foundPlayers := map[string]bool{} 27 | searchErr := cardinal.NewSearch().Entity(filter.Contains(filter.Component[component.Health]())). 28 | Each(wCtx, func(id types.EntityID) bool { 29 | player, err := cardinal.GetComponent[component.Player](wCtx, id) 30 | if err != nil { 31 | t.Fatalf("failed to get player: %v", err) 32 | } 33 | health, err := cardinal.GetComponent[component.Health](wCtx, id) 34 | if err != nil { 35 | t.Fatalf("failed to get health: %v", err) 36 | } 37 | if health.HP < 100 { 38 | t.Fatalf("new player should have at least 100 health; got %v", health.HP) 39 | } 40 | foundPlayers[player.Nickname] = true 41 | return true 42 | }) 43 | if searchErr != nil { 44 | t.Fatalf("failed to perform search: %v", searchErr) 45 | } 46 | if len(foundPlayers) != 10 { 47 | t.Fatalf("there should be 10 default players; got %v", foundPlayers) 48 | } 49 | for i := 0; i < 10; i++ { 50 | wantName := fmt.Sprintf("default-%d", i) 51 | if !foundPlayers[wantName] { 52 | t.Fatalf("could not find player %q in %v", wantName, foundPlayers) 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ################################ 2 | # Build Image - Normal 3 | ################################ 4 | FROM golang:1.22-bookworm AS build 5 | 6 | WORKDIR /go/src/app 7 | 8 | # Copy the go module files and download the dependencies 9 | # We do this before copying the rest of the source code to avoid 10 | # having to re-download the dependencies every time we build the image 11 | COPY /cardinal/go.mod /cardinal/go.sum ./ 12 | RUN go mod download 13 | 14 | # Set the GOCACHE environment variable to /root/.cache/go-build to speed up build 15 | ENV GOCACHE=/root/.cache/go-build 16 | 17 | # Copy the rest of the source code and build the binary 18 | COPY /cardinal ./ 19 | RUN --mount=type=cache,target="/root/.cache/go-build" go build -v -o /go/bin/app 20 | 21 | ################################ 22 | # Runtime Image - Normal 23 | ################################ 24 | FROM gcr.io/distroless/base-debian12 AS runtime 25 | 26 | # Copy world.toml to the image 27 | COPY world.toml world.toml 28 | 29 | # Copy the binary from the build image 30 | COPY --from=build /go/bin/app /usr/bin 31 | 32 | # Run the binary 33 | CMD ["app"] 34 | 35 | ################################ 36 | # Runtime Image - Debug 37 | ################################ 38 | FROM golang:1.22-bookworm AS runtime-debug 39 | 40 | WORKDIR /go/src/app 41 | 42 | # Install delve 43 | RUN go install github.com/go-delve/delve/cmd/dlv@latest 44 | 45 | # Copy the go module files and download the dependencies 46 | # We do this before copying the rest of the source code to avoid 47 | # having to re-download the dependencies every time we build the image 48 | COPY /cardinal/go.mod /cardinal/go.sum ./ 49 | RUN go mod download 50 | 51 | # Set the GOCACHE environment variable to /root/.cache/go-build to speed up build 52 | ENV GOCACHE=/root/.cache/go-build 53 | 54 | # Copy the rest of the source code and build the binary with debugging symbols 55 | COPY /cardinal ./ 56 | RUN --mount=type=cache,target="/root/.cache/go-build" go build -gcflags="all=-N -l" -v -o /usr/bin/app 57 | 58 | # Copy world.toml to the image 59 | COPY world.toml world.toml 60 | 61 | CMD ["dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/usr/bin/app"] -------------------------------------------------------------------------------- /cardinal/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/rs/zerolog/log" 7 | "pkg.world.dev/world-engine/cardinal" 8 | 9 | "github.com/argus-labs/starter-game-template/cardinal/component" 10 | "github.com/argus-labs/starter-game-template/cardinal/msg" 11 | "github.com/argus-labs/starter-game-template/cardinal/query" 12 | "github.com/argus-labs/starter-game-template/cardinal/system" 13 | ) 14 | 15 | func main() { 16 | w, err := cardinal.NewWorld(cardinal.WithDisableSignatureVerification()) 17 | if err != nil { 18 | log.Fatal().Err(err).Msg("") 19 | } 20 | 21 | MustInitWorld(w) 22 | 23 | Must(w.StartGame()) 24 | } 25 | 26 | // MustInitWorld registers all components, messages, queries, and systems. This initialization happens in a helper 27 | // function so that this can be used directly in tests. 28 | func MustInitWorld(w *cardinal.World) { 29 | // Register components 30 | // NOTE: You must register your components here for it to be accessible. 31 | Must( 32 | cardinal.RegisterComponent[component.Player](w), 33 | cardinal.RegisterComponent[component.Health](w), 34 | ) 35 | 36 | // Register messages (user action) 37 | // NOTE: You must register your transactions here for it to be executed. 38 | Must( 39 | cardinal.RegisterMessage[msg.CreatePlayerMsg, msg.CreatePlayerResult](w, "create-player"), 40 | cardinal.RegisterMessage[msg.AttackPlayerMsg, msg.AttackPlayerMsgReply](w, "attack-player"), 41 | ) 42 | 43 | // Register queries 44 | // NOTE: You must register your queries here for it to be accessible. 45 | Must( 46 | cardinal.RegisterQuery[query.PlayerHealthRequest, query.PlayerHealthResponse](w, "player-health", query.PlayerHealth), 47 | ) 48 | 49 | // Each system executes deterministically in the order they are added. 50 | // This is a neat feature that can be strategically used for systems that depends on the order of execution. 51 | // For example, you may want to run the attack system before the regen system 52 | // so that the player's HP is subtracted (and player killed if it reaches 0) before HP is regenerated. 53 | Must(cardinal.RegisterSystems(w, 54 | system.AttackSystem, 55 | system.RegenSystem, 56 | system.PlayerSpawnerSystem, 57 | )) 58 | 59 | Must(cardinal.RegisterInitSystems(w, 60 | system.SpawnDefaultPlayersSystem, 61 | )) 62 | } 63 | 64 | func Must(err ...error) { 65 | e := errors.Join(err...) 66 | if e != nil { 67 | log.Fatal().Err(e).Msg("") 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Starter Game Template 2 | 3 | This repository contains a starter World Engine project that you can use as a scaffold for your project. 4 | 5 | ## Installing World CLI 6 | 7 | To begin your development journey with World Engine, you install 8 | [World CLI](https://github.com/Argus-Labs/world-cli) a tool for creating, managing, and deploying World 9 | Engine projects. 10 | 11 | Install the latest world-cli release by running (requires a working GoLang installation): 12 | 13 | ```bash 14 | go install pkg.world.dev/world-cli/cmd/world@latest 15 | ``` 16 | 17 | ### Docker 18 | 19 | Docker is used to make it easy to run the World Engine stack and its dependencies. If you don't already have Docker 20 | installed, you can find instructions for your platform here: 21 | 22 | [Installation instructions for Docker Desktop](https://docs.docker.com/compose/install/#scenario-one-install-docker-desktop) 23 | 24 | ## Getting Started 25 | 26 | To use this template to start your own project, navigate to the directory where you want your project to live 27 | and run: 28 | 29 | ```bash 30 | world create 31 | ``` 32 | 33 | You will be prompted for a game name. A copy of the starter-game-template will be created in the current directory. 34 | 35 | ### Running Development Mode 36 | 37 | World Engine dev mode provides a fast and easy way to run and iterate on your game shard. 38 | 39 | To use it, navigate to your project directory and run 40 | 41 | ```bash 42 | world cardinal dev 43 | ``` 44 | 45 | ### Running World Engine E2E 46 | 47 | To run the World Engine stack end-to-end (i.e. in production and game engine integration), run: 48 | 49 | ```bash 50 | world cardinal start 51 | ``` 52 | 53 | This command will use the `world.toml` config specified in your root project directory to run both World Engine's 54 | Cardinal game shard and Nakama relayer (for game engine integration). 55 | 56 | Make sure to set `CARDINAL_MODE="production"` in world.toml to run the stack in production mode and obtain the best performance. 57 | 58 | ### Cardinal Editor 59 | 60 | The Cardinal Editor is a web-based companion app that makes game development of Cardinal easier. It allows you to inspect the state of Cardinal in real-time without any additional code. 61 | 62 | To access it, run `world cardinal start` or `world cardinal dev` 63 | 64 | Then, open the [Cardinal Editor](https://editor.world.dev) in a web browser. 65 | 66 | After you create some entities in your game, it will show up on the Cardinal Editor. 67 | 68 | ## Developing Your Game 69 | 70 | For more details on how to create the game of your dream, visit the [World Engine documentation](https://world.dev) 71 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Go ### 2 | # If you prefer the allow list template instead of the deny list, see community template: 3 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore 4 | # 5 | # Binaries for programs and plugins 6 | *.exe 7 | *.exe~ 8 | *.dll 9 | *.so 10 | *.dylib 11 | .idea/ 12 | 13 | # Test binary, built with `go test -c` 14 | *.test 15 | 16 | # Output of the go coverage tool, specifically when used with LiteIDE 17 | *.out 18 | 19 | # Dependency directories (remove the comment below to include it) 20 | /cardinal/vendor 21 | /nakama/vendor 22 | /testsuite/vendor 23 | 24 | ### Linux ### 25 | *~ 26 | 27 | # temporary files which can be created if a process still has a handle open of a deleted file 28 | .fuse_hidden* 29 | 30 | # KDE directory preferences 31 | .directory 32 | 33 | # Linux trash folder which might appear on any partition or disk 34 | .Trash-* 35 | 36 | # .nfs files are created when an open file is removed but is still being accessed 37 | .nfs* 38 | 39 | ### macOS ### 40 | # General 41 | .DS_Store 42 | .AppleDouble 43 | .LSOverride 44 | 45 | # Icon must end with two \r 46 | Icon 47 | 48 | 49 | # Thumbnails 50 | ._* 51 | 52 | # Files that might appear in the root of a volume 53 | .DocumentRevisions-V100 54 | .fseventsd 55 | .Spotlight-V100 56 | .TemporaryItems 57 | .Trashes 58 | .VolumeIcon.icns 59 | .com.apple.timemachine.donotpresent 60 | 61 | # Directories potentially created on remote AFP share 62 | .AppleDB 63 | .AppleDesktop 64 | Network Trash Folder 65 | Temporary Items 66 | .apdisk 67 | 68 | ### macOS Patch ### 69 | # iCloud generated files 70 | *.icloud 71 | 72 | ### VisualStudioCode ### 73 | .vscode/* 74 | !.vscode/settings.json 75 | !.vscode/tasks.json 76 | !.vscode/launch.json 77 | !.vscode/extensions.json 78 | !.vscode/*.code-snippets 79 | 80 | # Local History for Visual Studio Code 81 | .history/ 82 | 83 | # Built Visual Studio Code Extensions 84 | *.vsix 85 | 86 | ### VisualStudioCode Patch ### 87 | # Ignore all local history of files 88 | .history 89 | .ionide 90 | 91 | ### Windows ### 92 | # Windows thumbnail cache files 93 | Thumbs.db 94 | Thumbs.db:encryptable 95 | ehthumbs.db 96 | ehthumbs_vista.db 97 | 98 | # Dump file 99 | *.stackdump 100 | 101 | # Folder config file 102 | [Dd]esktop.ini 103 | 104 | # Recycle Bin used on file shares 105 | $RECYCLE.BIN/ 106 | 107 | # Windows Installer files 108 | *.cab 109 | *.msi 110 | *.msix 111 | *.msm 112 | *.msp 113 | 114 | # Windows shortcuts 115 | *.lnk 116 | 117 | # Node 118 | /.jsclient/node_modules 119 | yarn-error.log 120 | 121 | # cardinal editor dir 122 | .editor 123 | # tmp dir from world cardinal dev --watch 124 | cardinal/tmp 125 | -------------------------------------------------------------------------------- /world.toml: -------------------------------------------------------------------------------- 1 | [cardinal] 2 | CARDINAL_NAMESPACE = "defaultnamespace" # A namespace must be a unique alphanumeric string 3 | CARDINAL_ROLLUP_ENABLED = "false" # Enables rollup mode 4 | CARDINAL_LOG_LEVEL = "info" # Must be one of (debug, info, warn, error, fatal, panic, disabled, trace) 5 | CARDINAL_LOG_PRETTY= "true" 6 | REDIS_ADDRESS = "localhost:6379" # UNIX Domain Socket or TCP Address 7 | REDIS_PASSWORD = "very_unsafe_password_replace_me" # If TCP address is used, setting a password is encouraged in production 8 | TELEMETRY_TRACE_ENABLED = false # Enables OpenTelemetry tracing 9 | TELEMETRY_PROFILER_ENABLED = false # Enables Datadog profiler 10 | BASE_SHARD_SEQUENCER_ADDRESS = "localhost:9601" # Required if rollup mode is enabled 11 | BASE_SHARD_ROUTER_KEY = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ01" # Secure auth token for game shard 12 | 13 | [evm] 14 | # DA_AUTH_TOKEN is obtained from celestia client and passed in from world.toml. 15 | # See https://docs.celestia.org/developers/node-tutorial#auth-token 16 | DA_BASE_URL="http://celestia-devnet" 17 | DA_AUTH_TOKEN="" 18 | DA_NAMESPACE_ID="67480c4a88c4d12935d4" 19 | CHAIN_ID="world-420" 20 | # CHAIN_KEY_MNEMONIC is a test mnemonic and should not be used in production. 21 | CHAIN_KEY_MNEMONIC="enact adjust liberty squirrel bulk ticket invest tissue antique window thank slam unknown fury script among bread social switch glide wool clog flag enroll" 22 | FAUCET_ENABLED = false 23 | FAUCET_ADDRESS = "aa9288F88233Eb887d194fF2215Cf1776a6FEE41" # ETH address without leading 0x (Default: account 0 of CHAIN_KEY_MNEMONIC) 24 | FAUCET_AMOUNT = "0x56BC75E2D6310000" # ETH in wei unit, encoded as hexadecimal (Default: 100 ETH) 25 | 26 | [nakama] 27 | ENABLE_ALLOWLIST="false" # enable nakama's beta key feature. you can generate and claim beta keys by setting this to true 28 | # The number of undelivered notifications Nakama will allow before shutting down a connection to a client. 29 | # See https://heroiclabs.com/docs/nakama/getting-started/configuration/#socket.outgoing_queue_size 30 | OUTGOING_QUEUE_SIZE=64 31 | # Enables tracing within Nakama, which integrates with external tracing tools such as Jaeger for visualizing system performance. 32 | NAKAMA_TRACE_ENABLED = true 33 | # Enables metrics collection within Nakama, integrating with Prometheus for system metrics tracking. 34 | NAKAMA_METRICS_ENABLED = true 35 | # Trace sample rate. valid values are between 0.0 to 1.0 inclusive. This is a float value. 36 | NAKAMA_TRACE_SAMPLE_RATE = 0.6 37 | # Prometheus scraping interval in seconds. 38 | NAKAMA_METRICS_INTERVAL = 30 39 | 40 | [common] 41 | # A key used by both Cardinal and EVM to coordinate activities 42 | ROUTER_KEY = "router_key" 43 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | cardinal: 3 | container_name: cardinal 4 | environment: 5 | - REDIS_ADDRESS=redis:6379 6 | - REDIS_PASSWORD=${REDIS_PASSWORD:-very_unsafe_password_replace_me} 7 | - BASE_SHARD_SEQUENCER_ADDRESS=evm:9601 8 | build: 9 | target: runtime 10 | depends_on: 11 | - redis 12 | expose: 13 | - "4040" 14 | ports: 15 | - "4040:4040" 16 | restart: unless-stopped 17 | networks: 18 | - world-engine 19 | 20 | cardinal-debug: 21 | container_name: cardinal-debug 22 | environment: 23 | - REDIS_ADDRESS=redis:6379 24 | - REDIS_PASSWORD=${REDIS_PASSWORD:-very_unsafe_password_replace_me} 25 | - BASE_SHARD_SEQUENCER_ADDRESS=evm:9601 26 | build: 27 | target: runtime-debug 28 | cap_add: 29 | - SYS_PTRACE 30 | security_opt: 31 | - "seccomp:unconfined" 32 | depends_on: 33 | - redis 34 | expose: 35 | - "4040" 36 | ports: 37 | - "4040:4040" 38 | - "40000:40000" 39 | restart: unless-stopped 40 | networks: 41 | - world-engine 42 | 43 | evm: 44 | container_name: evm 45 | image: ghcr.io/argus-labs/world-engine-evm:1.5.1 46 | environment: 47 | ## Env vars reference: https://github.com/Argus-Labs/world-engine/blob/main/evm/README.md 48 | ## Get AUTH_TOKEN from celestia_devnet container: `$(docker exec $(docker ps -q) celestia bridge auth admin --node.store /home/celestia/bridge` 49 | - DA_BASE_URL=${DA_BASE_URL:-http://celestia-devnet} 50 | - DA_AUTH_TOKEN=${DA_AUTH_TOKEN:-} 51 | - FAUCET_ENABLED=${FAUCET_ENABLED:-false} 52 | - FAUCET_ADDRESS=${FAUCET_ADDRESS:-aa9288F88233Eb887d194fF2215Cf1776a6FEE41} # ETH address without leading 0x (Default: account 0 of CHAIN_KEY_MNEMONIC) 53 | - FAUCET_AMOUNT=${FAUCET_AMOUNT:-0x56BC75E2D63100000} # ETH in wei unit, encoded as hexadecimal. (Default: 100 ETH) 54 | - BASE_SHARD_ROUTER_KEY=${BASE_SHARD_ROUTER_KEY:-abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ01} # Secure auth token for game shard 55 | restart: unless-stopped 56 | expose: 57 | - "1317" 58 | - "26657" 59 | - "9090" 60 | - "9601" 61 | ports: 62 | - "1317:1317" 63 | - "26657:26657" 64 | - "9090:9090" 65 | - "9601:9601" 66 | - "8545:8545" 67 | networks: 68 | - world-engine 69 | depends_on: 70 | - celestia-devnet 71 | 72 | nakama: 73 | container_name: nakama 74 | image: ghcr.io/argus-labs/world-engine-nakama:1.4.0 75 | depends_on: 76 | - "nakama-db" 77 | - "${CARDINAL_CONTAINER:-cardinal}" 78 | environment: 79 | - CARDINAL_CONTAINER=${CARDINAL_CONTAINER:-cardinal} 80 | - CARDINAL_ADDR=${CARDINAL_CONTAINER:-cardinal:4040} 81 | - CARDINAL_NAMESPACE=${CARDINAL_NAMESPACE:-defaultnamespace} 82 | - DB_PASSWORD=${DB_PASSWORD:-very_unsafe_password_replace_me} 83 | - ENABLE_ALLOWLIST=${ENABLE_ALLOWLIST:-false} 84 | - OUTGOING_QUEUE_SIZE=${OUTGOING_QUEUE_SIZE:-64} 85 | entrypoint: 86 | - "/bin/sh" 87 | - "-ec" 88 | - > 89 | /nakama/nakama migrate up --database.address root:${DB_PASSWORD:-very_unsafe_password_replace_me}@nakama-db:26257/nakama && 90 | /nakama/nakama --config /nakama/data/local.yml 91 | --database.address root:${DB_PASSWORD:-very_unsafe_password_replace_me}@nakama-db:26257/nakama 92 | --socket.outgoing_queue_size=${OUTGOING_QUEUE_SIZE:-64} 93 | --logger.level INFO 94 | expose: 95 | - "7349" 96 | - "7350" 97 | - "7351" 98 | healthcheck: 99 | test: [ "CMD", "/nakama/nakama", "healthcheck" ] 100 | interval: 1s 101 | timeout: 1s 102 | retries: 20 103 | ports: 104 | - "7349:7349" 105 | - "7350:7350" 106 | - "7351:7351" 107 | networks: 108 | - world-engine 109 | restart: unless-stopped 110 | 111 | nakama-db: 112 | container_name: nakama-db 113 | image: cockroachdb/cockroach:latest-v23.1 114 | command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/,size=20% 115 | restart: unless-stopped 116 | environment: 117 | - COCKROACH_DATABASE=nakama 118 | - COCKROACH_USER=root 119 | - COCKROACH_PASSWORD=${DB_PASSWORD:-very_unsafe_password_replace_me} 120 | volumes: 121 | - data:/var/lib/cockroach 122 | expose: 123 | - "26257" 124 | healthcheck: 125 | test: [ "CMD", "curl", "-f", "http://localhost:8080/health?ready=1" ] 126 | interval: 3s 127 | timeout: 3s 128 | retries: 5 129 | attach: false 130 | networks: 131 | - world-engine 132 | 133 | redis: 134 | container_name: redis 135 | image: redis:latest 136 | command: ["redis-server", "--requirepass", "${REDIS_PASSWORD:-very_unsafe_password_replace_me}"] 137 | expose: 138 | - "6379" 139 | attach: false 140 | restart: unless-stopped 141 | volumes: 142 | - data:/redis 143 | networks: 144 | - world-engine 145 | 146 | celestia-devnet: 147 | container_name: celestia-devnet 148 | image: ghcr.io/rollkit/local-celestia-devnet:latest 149 | networks: 150 | - world-engine 151 | restart: on-failure 152 | healthcheck: 153 | test: [ "CMD", "curl", "-f", "http://127.0.0.1:26659/head" ] 154 | interval: 1s 155 | timeout: 1s 156 | retries: 20 157 | ports: 158 | - "26657" 159 | - "26658" 160 | - "26659" 161 | - "9090" 162 | 163 | volumes: 164 | data: 165 | 166 | networks: 167 | world-engine: 168 | driver: bridge 169 | -------------------------------------------------------------------------------- /cardinal/system_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "testing" 5 | 6 | "gotest.tools/v3/assert" 7 | 8 | "pkg.world.dev/world-engine/cardinal" 9 | "pkg.world.dev/world-engine/cardinal/filter" 10 | "pkg.world.dev/world-engine/cardinal/receipt" 11 | "pkg.world.dev/world-engine/cardinal/types" 12 | 13 | "github.com/argus-labs/starter-game-template/cardinal/component" 14 | "github.com/argus-labs/starter-game-template/cardinal/msg" 15 | ) 16 | 17 | const ( 18 | attackMsgName = "game.attack-player" 19 | createMsgName = "game.create-player" 20 | ) 21 | 22 | // TestSystem_AttackSystem_ErrorWhenTargetDoesNotExist ensures the attack message results in an error when the given 23 | // target does not exist. Note, message errors are stored in receipts; they are NOT returned from the relevant system. 24 | func TestSystem_AttackSystem_ErrorWhenTargetDoesNotExist(t *testing.T) { 25 | tf := cardinal.NewTestFixture(t, nil) 26 | MustInitWorld(tf.World) 27 | 28 | txHash := tf.AddTransaction(getAttackMsgID(t, tf.World), msg.AttackPlayerMsg{ 29 | TargetNickname: "does-not-exist", 30 | }) 31 | 32 | tf.DoTick() 33 | 34 | gotReceipt := getReceiptFromPastTick(t, tf.World, txHash) 35 | if len(gotReceipt.Errs) == 0 { 36 | t.Fatal("expected error when target does not exist") 37 | } 38 | } 39 | 40 | // TestSystem_PlayerSpawnerSystem_CanCreatePlayer ensures the CreatePlayer message can be used to create a new player 41 | // with the default amount of health. cardinal.NewSearch is used to find the newly created player. 42 | func TestSystem_PlayerSpawnerSystem_CanCreatePlayer(t *testing.T) { 43 | tf := cardinal.NewTestFixture(t, nil) 44 | MustInitWorld(tf.World) 45 | 46 | const nickname = "jeff" 47 | createTxHash := tf.AddTransaction(getCreateMsgID(t, tf.World), msg.CreatePlayerMsg{ 48 | Nickname: nickname, 49 | }) 50 | tf.DoTick() 51 | 52 | // Make sure the player creation was successful 53 | createReceipt := getReceiptFromPastTick(t, tf.World, createTxHash) 54 | if errs := createReceipt.Errs; len(errs) > 0 { 55 | t.Fatalf("expected 0 errors when creating a player, got %v", errs) 56 | } 57 | 58 | // Make sure the newly created player has 100 health 59 | wCtx := cardinal.NewReadOnlyWorldContext(tf.World) 60 | // This search demonstrates the use of a "Where" clause, which limits the search results to only the entity IDs 61 | // that end up returning true from the anonymous function. In this case, we're looking for a specific nickname. 62 | acc := make([]types.EntityID, 0) 63 | err := cardinal.NewSearch().Entity(filter.All()).Each(wCtx, func(id types.EntityID) bool { 64 | player, err := cardinal.GetComponent[component.Player](wCtx, id) 65 | if err != nil { 66 | t.Fatalf("failed to get player component: %v", err) 67 | } 68 | if player.Nickname == nickname { 69 | acc = append(acc, id) 70 | return false 71 | } 72 | return true 73 | }) 74 | assert.NilError(t, err) 75 | assert.Equal(t, len(acc), 1) 76 | id := acc[0] 77 | 78 | health, err := cardinal.GetComponent[component.Health](wCtx, id) 79 | if err != nil { 80 | t.Fatalf("failed to find entity ID: %v", err) 81 | } 82 | if health.HP != 100 { 83 | t.Fatalf("a newly created player should have 100 health; got %v", health.HP) 84 | } 85 | } 86 | 87 | // TestSystem_AttackSystem_AttackingTargetReducesTheirHealth ensures an attack message can find an existing target the 88 | // reduce the target's health. 89 | func TestSystem_AttackSystem_AttackingTargetReducesTheirHealth(t *testing.T) { 90 | tf := cardinal.NewTestFixture(t, nil) 91 | MustInitWorld(tf.World) 92 | 93 | const target = "jeff" 94 | 95 | // Create an initial player 96 | _ = tf.AddTransaction(getCreateMsgID(t, tf.World), msg.CreatePlayerMsg{ 97 | Nickname: target, 98 | }) 99 | tf.DoTick() 100 | 101 | // Attack the player 102 | attackTxHash := tf.AddTransaction(getAttackMsgID(t, tf.World), msg.AttackPlayerMsg{ 103 | TargetNickname: target, 104 | }) 105 | tf.DoTick() 106 | 107 | // Make sure attack was successful 108 | attackReceipt := getReceiptFromPastTick(t, tf.World, attackTxHash) 109 | if errs := attackReceipt.Errs; len(errs) > 0 { 110 | t.Fatalf("expected no errors when attacking a player; got %v", errs) 111 | } 112 | 113 | // Find the attacked player and check their health. 114 | wCtx := cardinal.NewReadOnlyWorldContext(tf.World) 115 | var found bool 116 | // This search demonstrates the "Each" pattern. Every entity ID is considered, and as long as the anonymous 117 | // function return true, the search will continue. 118 | searchErr := cardinal.NewSearch().Entity(filter.All()).Each(wCtx, func(id types.EntityID) bool { 119 | player, err := cardinal.GetComponent[component.Player](wCtx, id) 120 | if err != nil { 121 | t.Fatalf("failed to get player component for %v", id) 122 | } 123 | if player.Nickname != target { 124 | return true 125 | } 126 | // The player's nickname matches the target. This is the player we care about. 127 | found = true 128 | health, err := cardinal.GetComponent[component.Health](wCtx, id) 129 | if err != nil { 130 | t.Fatalf("failed to get health component for %v", id) 131 | } 132 | // The target started with 100 HP, -10 for the attack, +1 for regen 133 | if health.HP != 91 { 134 | t.Fatalf("attack target should end up with 91 hp, got %v", health.HP) 135 | } 136 | 137 | return false 138 | }) 139 | if searchErr != nil { 140 | t.Fatalf("error when performing search: %v", searchErr) 141 | } 142 | if !found { 143 | t.Fatalf("failed to find target %q", target) 144 | } 145 | } 146 | 147 | func getCreateMsgID(t *testing.T, world *cardinal.World) types.MessageID { 148 | return getMsgID(t, world, createMsgName) 149 | } 150 | 151 | func getAttackMsgID(t *testing.T, world *cardinal.World) types.MessageID { 152 | return getMsgID(t, world, attackMsgName) 153 | } 154 | 155 | func getMsgID(t *testing.T, world *cardinal.World, fullName string) types.MessageID { 156 | msg, ok := world.GetMessageByFullName(fullName) 157 | if !ok { 158 | t.Fatalf("failed to get %q message", fullName) 159 | } 160 | return msg.ID() 161 | } 162 | 163 | // getReceiptFromPastTick search past ticks for a txHash that matches the given txHash. An error will be returned if 164 | // the txHash cannot be found in Cardinal's history. 165 | func getReceiptFromPastTick(t *testing.T, world *cardinal.World, txHash types.TxHash) receipt.Receipt { 166 | tick := world.CurrentTick() 167 | for { 168 | tick-- 169 | receipts, err := world.GetTransactionReceiptsForTick(tick) 170 | if err != nil { 171 | t.Fatal(err) 172 | } 173 | for _, r := range receipts { 174 | if r.TxHash == txHash { 175 | return r 176 | } 177 | } 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /cardinal/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/argus-labs/starter-game-template/cardinal 2 | 3 | go 1.22.1 4 | 5 | require ( 6 | github.com/rs/zerolog v1.33.0 7 | gotest.tools/v3 v3.5.1 8 | pkg.world.dev/world-engine/cardinal v1.7.1 9 | ) 10 | 11 | require ( 12 | github.com/DataDog/appsec-internal-go v1.5.0 // indirect 13 | github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 // indirect 14 | github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 // indirect 15 | github.com/DataDog/datadog-go/v5 v5.4.0 // indirect 16 | github.com/DataDog/go-libddwaf/v2 v2.4.2 // indirect 17 | github.com/DataDog/go-tuf v1.0.2-0.5.2 // indirect 18 | github.com/DataDog/gostackparse v0.7.0 // indirect 19 | github.com/DataDog/sketches-go v1.4.2 // indirect 20 | github.com/KyleBanks/depth v1.2.1 // indirect 21 | github.com/Microsoft/go-winio v0.6.1 // indirect 22 | github.com/alecthomas/participle/v2 v2.1.0 // indirect 23 | github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect 24 | github.com/alicebob/miniredis/v2 v2.30.5 // indirect 25 | github.com/andybalholm/brotli v1.1.0 // indirect 26 | github.com/argus-labs/go-jobqueue v0.1.6 // indirect 27 | github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect 28 | github.com/cespare/xxhash/v2 v2.2.0 // indirect 29 | github.com/coocood/freecache v1.2.4 // indirect 30 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect 31 | github.com/dgraph-io/badger/v4 v4.2.0 // indirect 32 | github.com/dgraph-io/ristretto v0.1.1 // indirect 33 | github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect 34 | github.com/dustin/go-humanize v1.0.1 // indirect 35 | github.com/ebitengine/purego v0.6.0-alpha.5 // indirect 36 | github.com/ethereum/go-ethereum v1.13.10 // indirect 37 | github.com/fasthttp/websocket v1.5.8 // indirect 38 | github.com/fsnotify/fsnotify v1.7.0 // indirect 39 | github.com/go-logr/logr v1.4.1 // indirect 40 | github.com/go-logr/stdr v1.2.2 // indirect 41 | github.com/go-openapi/jsonpointer v0.20.0 // indirect 42 | github.com/go-openapi/jsonreference v0.20.0 // indirect 43 | github.com/go-openapi/spec v0.20.8 // indirect 44 | github.com/go-openapi/swag v0.22.4 // indirect 45 | github.com/goccy/go-json v0.10.3 // indirect 46 | github.com/gofiber/contrib/socketio v1.0.0 // indirect 47 | github.com/gofiber/contrib/websocket v1.3.0 // indirect 48 | github.com/gofiber/fiber/v2 v2.52.2 // indirect 49 | github.com/gofiber/swagger v0.1.14 // indirect 50 | github.com/gogo/protobuf v1.3.2 // indirect 51 | github.com/golang/glog v1.2.0 // indirect 52 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect 53 | github.com/golang/protobuf v1.5.4 // indirect 54 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect 55 | github.com/google/flatbuffers v1.12.1 // indirect 56 | github.com/google/go-cmp v0.6.0 // indirect 57 | github.com/google/pprof v0.0.0-20230901174712-0191c66da455 // indirect 58 | github.com/google/uuid v1.6.0 // indirect 59 | github.com/hashicorp/errwrap v1.1.0 // indirect 60 | github.com/hashicorp/go-multierror v1.1.1 // indirect 61 | github.com/hashicorp/hcl v1.0.1-vault-5 // indirect 62 | github.com/holiman/uint256 v1.2.4 // indirect 63 | github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect 64 | github.com/invopop/jsonschema v0.7.0 // indirect 65 | github.com/josharian/intern v1.0.0 // indirect 66 | github.com/klauspost/compress v1.17.7 // indirect 67 | github.com/magiconair/properties v1.8.7 // indirect 68 | github.com/mailru/easyjson v0.7.7 // indirect 69 | github.com/mattn/go-colorable v0.1.13 // indirect 70 | github.com/mattn/go-isatty v0.0.20 // indirect 71 | github.com/mattn/go-runewidth v0.0.15 // indirect 72 | github.com/mitchellh/mapstructure v1.5.0 // indirect 73 | github.com/outcaste-io/ristretto v0.2.3 // indirect 74 | github.com/pelletier/go-toml/v2 v2.1.0 // indirect 75 | github.com/philhofer/fwd v1.1.2 // indirect 76 | github.com/pkg/errors v0.9.1 // indirect 77 | github.com/puzpuzpuz/xsync/v3 v3.2.0 // indirect 78 | github.com/redis/go-redis/v9 v9.1.0 // indirect 79 | github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052 // indirect 80 | github.com/rivo/uniseg v0.4.7 // indirect 81 | github.com/rotisserie/eris v0.5.4 // indirect 82 | github.com/sagikazarmark/locafero v0.4.0 // indirect 83 | github.com/sagikazarmark/slog-shim v0.1.0 // indirect 84 | github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 // indirect 85 | github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect 86 | github.com/sourcegraph/conc v0.3.0 // indirect 87 | github.com/spaolacci/murmur3 v1.1.0 // indirect 88 | github.com/spf13/afero v1.11.0 // indirect 89 | github.com/spf13/cast v1.6.0 // indirect 90 | github.com/spf13/pflag v1.0.5 // indirect 91 | github.com/spf13/viper v1.18.2 // indirect 92 | github.com/stretchr/objx v0.5.2 // indirect 93 | github.com/subosito/gotenv v1.6.0 // indirect 94 | github.com/swaggo/files/v2 v2.0.0 // indirect 95 | github.com/swaggo/swag v1.16.3 // indirect 96 | github.com/tidwall/gjson v1.17.0 // indirect 97 | github.com/tidwall/match v1.1.1 // indirect 98 | github.com/tidwall/pretty v1.2.1 // indirect 99 | github.com/tidwall/sjson v1.2.5 // indirect 100 | github.com/tinylib/msgp v1.1.8 // indirect 101 | github.com/valyala/bytebufferpool v1.0.0 // indirect 102 | github.com/valyala/fasthttp v1.52.0 // indirect 103 | github.com/valyala/tcplisten v1.0.0 // indirect 104 | github.com/wI2L/jsondiff v0.5.0 // indirect 105 | github.com/yuin/gopher-lua v1.1.0 // indirect 106 | go.opencensus.io v0.24.0 // indirect 107 | go.opentelemetry.io/otel v1.26.0 // indirect 108 | go.opentelemetry.io/otel/metric v1.26.0 // indirect 109 | go.opentelemetry.io/otel/trace v1.26.0 // indirect 110 | go.uber.org/atomic v1.11.0 // indirect 111 | go.uber.org/multierr v1.9.0 // indirect 112 | golang.org/x/crypto v0.22.0 // indirect 113 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect 114 | golang.org/x/mod v0.14.0 // indirect 115 | golang.org/x/net v0.23.0 // indirect 116 | golang.org/x/sync v0.6.0 // indirect 117 | golang.org/x/sys v0.21.0 // indirect 118 | golang.org/x/text v0.14.0 // indirect 119 | golang.org/x/time v0.5.0 // indirect 120 | golang.org/x/tools v0.16.1 // indirect 121 | golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect 122 | google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect 123 | google.golang.org/grpc v1.63.2 // indirect 124 | google.golang.org/protobuf v1.35.1 // indirect 125 | gopkg.in/DataDog/dd-trace-go.v1 v1.63.1 // indirect 126 | gopkg.in/ini.v1 v1.67.0 // indirect 127 | gopkg.in/yaml.v3 v3.0.1 // indirect 128 | pkg.world.dev/world-engine/rift v1.2.0 // indirect 129 | pkg.world.dev/world-engine/sign v1.1.0 // indirect 130 | ) 131 | -------------------------------------------------------------------------------- /.golangci.yaml: -------------------------------------------------------------------------------- 1 | run: 2 | # Timeout for analysis, e.g. 30s, 5m. 3 | # Default: 1m 4 | timeout: 3m 5 | 6 | # This file contains only configs which differ from defaults. 7 | # All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml 8 | linters-settings: 9 | gosec: 10 | excludes: 11 | # disable G402, which complains if we don't pass a specific version to tls.Config. 12 | # we do not need this check as tls.Config will just use a default version if no version is specified. 13 | - G402 14 | cyclop: 15 | # The maximal code complexity to report. 16 | # Default: 10 17 | max-complexity: 30 18 | # The maximal average package complexity. 19 | # If it's higher than 0.0 (float) the check is enabled 20 | # Default: 0.0 21 | package-average: 10.0 22 | 23 | errcheck: 24 | # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. 25 | # Such cases aren't reported by default. 26 | # Default: false 27 | check-type-assertions: true 28 | 29 | exhaustive: 30 | # Program elements to check for exhaustiveness. 31 | # Default: [ switch ] 32 | check: 33 | - switch 34 | - map 35 | 36 | exhaustruct: 37 | # List of regular expressions to exclude struct packages and names from check. 38 | # Default: [] 39 | exclude: 40 | # std libs 41 | - "^net/http.Client$" 42 | - "^net/http.Cookie$" 43 | - "^net/http.Request$" 44 | - "^net/http.Response$" 45 | - "^net/http.Server$" 46 | - "^net/http.Transport$" 47 | - "^net/url.URL$" 48 | - "^os/exec.Cmd$" 49 | - "^reflect.StructField$" 50 | # public libs 51 | - "^github.com/Shopify/sarama.Config$" 52 | - "^github.com/Shopify/sarama.ProducerMessage$" 53 | - "^github.com/mitchellh/mapstructure.DecoderConfig$" 54 | - "^github.com/prometheus/client_golang/.+Opts$" 55 | - "^github.com/spf13/cobra.Command$" 56 | - "^github.com/spf13/cobra.CompletionOptions$" 57 | - "^github.com/stretchr/testify/mock.Mock$" 58 | - "^github.com/testcontainers/testcontainers-go.+Request$" 59 | - "^github.com/testcontainers/testcontainers-go.FromDockerfile$" 60 | - "^golang.org/x/tools/go/analysis.Analyzer$" 61 | - "^google.golang.org/protobuf/.+Options$" 62 | - "^gopkg.in/yaml.v3.Node$" 63 | 64 | funlen: 65 | # Checks the number of lines in a function. 66 | # If lower than 0, disable the check. 67 | # Default: 60 68 | lines: 100 69 | # Checks the number of statements in a function. 70 | # If lower than 0, disable the check. 71 | # Default: 40 72 | statements: 50 73 | 74 | gocognit: 75 | # Minimal code complexity to report 76 | # Default: 30 (but we recommend 10-20) 77 | min-complexity: 20 78 | 79 | gocritic: 80 | # Settings passed to gocritic. 81 | # The settings key is the name of a supported gocritic checker. 82 | # The list of supported checkers can be find in https://go-critic.github.io/overview. 83 | settings: 84 | captLocal: 85 | # Whether to restrict checker to params only. 86 | # Default: true 87 | paramsOnly: false 88 | underef: 89 | # Whether to skip (*x).method() calls where x is a pointer receiver. 90 | # Default: true 91 | skipRecvDeref: false 92 | 93 | gomnd: 94 | # List of function patterns to exclude from analysis. 95 | # Values always ignored: `time.Date`, 96 | # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`, 97 | # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`. 98 | # Default: [] 99 | ignored-functions: 100 | - os.Chmod 101 | - os.Mkdir 102 | - os.MkdirAll 103 | - os.OpenFile 104 | - os.WriteFile 105 | - prometheus.ExponentialBuckets 106 | - prometheus.ExponentialBucketsRange 107 | - prometheus.LinearBuckets 108 | 109 | gomodguard: 110 | blocked: 111 | # List of blocked modules. 112 | # Default: [] 113 | modules: 114 | - github.com/golang/protobuf: 115 | recommendations: 116 | - google.golang.org/protobuf 117 | reason: "see https://developers.google.com/protocol-buffers/docs/reference/go/faq#modules" 118 | - github.com/satori/go.uuid: 119 | recommendations: 120 | - github.com/google/uuid 121 | reason: "satori's package is not maintained" 122 | - github.com/gofrs/uuid: 123 | recommendations: 124 | - github.com/google/uuid 125 | reason: "gofrs' package is not go module" 126 | 127 | govet: 128 | # Enable all analyzers. 129 | # Default: false 130 | enable-all: true 131 | # Disable analyzers by name. 132 | # Run `go tool vet help` to see all analyzers. 133 | # Default: [] 134 | disable: 135 | - fieldalignment # too strict 136 | - composites 137 | # Settings per analyzer. 138 | settings: 139 | shadow: 140 | # Whether to be strict about shadowing; can be noisy. 141 | # Default: false 142 | strict: false 143 | 144 | # max line length, lines longer will be reported. Default is 120. 145 | # '\t' is counted as 1 character by default, and can be changed with the tab-width option 146 | line-length: 120 147 | # tab width in spaces. Default to 1. 148 | tab-width: 1 149 | 150 | nakedret: 151 | # Make an issue if func has more lines of code than this setting, and it has naked returns. 152 | # Default: 30 153 | max-func-lines: 0 154 | 155 | nolintlint: 156 | # Exclude following linters from requiring an explanation. 157 | # Default: [] 158 | allow-no-explanation: [ funlen, gocognit, lll ] 159 | # Enable to require an explanation of nonzero length after each nolint directive. 160 | # Default: false 161 | require-explanation: true 162 | # Enable to require nolint directives to mention the specific linter being suppressed. 163 | # Default: false 164 | require-specific: true 165 | 166 | rowserrcheck: 167 | # database/sql is always checked 168 | # Default: [] 169 | packages: 170 | - github.com/jmoiron/sqlx 171 | 172 | tenv: 173 | # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures. 174 | # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked. 175 | # Default: false 176 | all: true 177 | 178 | linters: 179 | disable-all: true 180 | enable: 181 | ## enabled by default 182 | - errcheck # checking for unchecked errors, these unchecked errors can be critical bugs in some cases 183 | - gosimple # specializes in simplifying a code 184 | - govet # reports suspicious constructs, such as Printf calls whose arguments do not align with the format string 185 | - ineffassign # detects when assignments to existing variables are not used 186 | - staticcheck # is a go vet on steroids, applying a ton of static analysis checks 187 | - typecheck # like the front-end of a Go compiler, parses and type-checks Go code 188 | - unused # checks for unused constants, variables, functions and types 189 | ## disabled by default 190 | - asasalint # checks for pass []any as any in variadic func(...any) 191 | - asciicheck # checks that your code does not contain non-ASCII identifiers 192 | - bidichk # checks for dangerous unicode character sequences 193 | - bodyclose # checks whether HTTP response body is 'closed successfully 194 | - cyclop # checks function and package cyclomatic complexity 195 | - decorder # checks declaration order and count of types, constants, variables and functions 196 | - dupl # tool for code clone detection 197 | - durationcheck # checks for two durations multiplied together 198 | - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error 199 | - errorlint # finds code that will cause problems with the error wrapping scheme introduced in Go 1.13 200 | - execinquery # checks query string in Query function which reads your Go src files and warning it finds 201 | - exhaustive # checks exhaustiveness of enum switch statements 202 | - exportloopref # checks for pointers to enclosing loop variables 203 | - forbidigo # forbids identifiers 204 | - funlen # tool for detection of long functions 205 | - ginkgolinter # [if you use ginkgo/gomega] enforces standards of using ginkgo and gomega 206 | - gochecknoinits # checks that no init functions are present in Go code 207 | - gocognit # computes and checks the cognitive complexity of functions 208 | - goconst # finds repeated strings that could be replaced by a constant 209 | - gocritic # provides diagnostics that check for bugs, performance and style issues 210 | - gocyclo # computes and checks the cyclomatic complexity of functions 211 | - goheader # checks is file header matches to pattern 212 | # - goimports # in addition to fixing imports, goimports also formats your code in the same style as gofmt 213 | - gomnd # detects magic numbers 214 | # - gomoddirectives # manages the use of 'replace', 'retract', and 'excludes' directives in go.mod 215 | - gomodguard # allow and block lists linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations 216 | - goprintffuncname # checks that printf-like functions are named with f at the end 217 | - gosec # inspects source code for security problems 218 | - importas # enforces consistent import aliases 219 | - lll # reports long lines 220 | - loggercheck # checks key value pairs for common logger libraries (kitlog,klog,logr,zap) 221 | - makezero # finds slice declarations with non-zero initial length 222 | - misspell # finds commonly misspelled English words in comments 223 | - nakedret # finds naked returns in functions greater than a specified function length 224 | - nestif # reports deeply nested if statements 225 | - nilerr # finds the code that returns nil even if it checks that the error is not nil 226 | - nilnil # checks that there is no simultaneous return of nil error and an invalid value 227 | - noctx # finds sending http request without context.Context 228 | - nolintlint # reports ill-formed or insufficient nolint directives 229 | - nosprintfhostport # checks for misuse of Sprintf to construct a host with port in a URL 230 | - predeclared # finds code that shadows one of Go's predeclared identifiers 231 | - prealloc # [premature optimization, but can be used in some cases] finds slice declarations that could potentially be preallocated 232 | - promlinter # checks Prometheus metrics naming via promlint 233 | - reassign # checks that package variables are not reassigned 234 | - revive # fast, configurable, extensible, flexible, and beautiful linter for Go, drop-in replacement of golint 235 | - rowserrcheck # checks whether Err of rows is checked successfully 236 | - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed 237 | - stylecheck # is a replacement for golint 238 | - tenv # detects using os.Setenv instead of t.Setenv since Go1.17 239 | - testableexamples # checks if examples are testable (have an expected output) 240 | - tparallel # detects inappropriate usage of t.Parallel() method in your Go test codes 241 | - unconvert # removes unnecessary type conversions 242 | - unparam # reports unused function parameters 243 | - usestdlibvars # detects the possibility to use variables/constants from the Go standard library 244 | - wastedassign # finds wasted assignment statements 245 | - whitespace # detects leading and trailing whitespace 246 | 247 | ## you may want to enable 248 | #- decorder # checks declaration order and count of types, constants, variables and functions 249 | #- exhaustruct # checks if all structure fields are initialized 250 | #- godox # detects FIXME, TODO and other comment keywords 251 | #- goheader # checks is file header matches to pattern 252 | #- interfacebloat # checks the number of methods inside an interface 253 | #- ireturn # accept interfaces, return concrete types 254 | #- prealloc # [premature optimization, but can be used in some cases] finds slice declarations that could potentially be preallocated 255 | #- varnamelen # [great idea, but too many false positives] checks that the length of a variable's name matches its scope 256 | #- wrapcheck # checks that errors returned from external packages are wrapped 257 | 258 | ## disabled 259 | #- testpackage # makes you use a separate _test package 260 | #- containedctx # detects struct contained context.Context field 261 | #- contextcheck # [too many false positives] checks the function whether use a non-inherited context 262 | #- depguard # [replaced by gomodguard] checks if package imports are in a list of acceptable packages 263 | #- dogsled # checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) 264 | #- dupword # [useless without config] checks for duplicate words in the source code 265 | #- errchkjson # [don't see profit + I'm against of omitting errors like in the first example https://github.com/breml/errchkjson] checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted 266 | #- forcetypeassert # [replaced by errcheck] finds forced type assertions 267 | #- goerr113 # [too strict] checks the errors handling expressions 268 | #- gofmt # [replaced by goimports] checks whether code was gofmt-ed 269 | #- gofumpt # [replaced by goimports, gofumports is not available yet] checks whether code was gofumpt-ed 270 | #- grouper # analyzes expression groups 271 | #- importas # enforces consistent import aliases 272 | #- maintidx # measures the maintainability index of each function 273 | #- nlreturn # [too strict and mostly code is not more readable] checks for a new line before return and branch statements to increase code clarity 274 | #- paralleltest # [too many false positives] detects missing usage of t.Parallel() method in your Go test 275 | #- tagliatelle # checks the struct tags 276 | #- thelper # detects golang test helpers without t.Helper() call and checks the consistency of test helpers 277 | #- wsl # [too strict and mostly code is not more readable] whitespace linter forces you to use empty lines 278 | 279 | ## deprecated 280 | #- deadcode # [deprecated, replaced by unused] finds unused code 281 | #- exhaustivestruct # [deprecated, replaced by exhaustruct] checks if all struct's fields are initialized 282 | #- golint # [deprecated, replaced by revive] golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes 283 | #- ifshort # [deprecated] checks that your code uses short syntax for if-statements whenever possible 284 | #- interfacer # [deprecated] suggests narrower interface types 285 | #- maligned # [deprecated, replaced by govet fieldalignment] detects Go structs that would take less memory if their fields were sorted 286 | #- nosnakecase # [deprecated, replaced by revive var-naming] detects snake case of variable naming and function name 287 | #- scopelint # [deprecated, replaced by exportloopref] checks for unpinned variables in go programs 288 | #- structcheck # [deprecated, replaced by unused] finds unused struct fields 289 | #- varcheck # [deprecated, replaced by unused] finds unused global variables and constants 290 | 291 | issues: 292 | # Maximum count of issues with the same text. 293 | # Set to 0 to disable. 294 | # Default: 3 295 | max-same-issues: 50 296 | 297 | exclude-rules: 298 | - path: cardinal/cql/ 299 | text: "not compatible with reflect.StructTag.Get" 300 | linters: 301 | - govet 302 | - path: "mock/.*\\.go" 303 | linters: [ funlen ] 304 | - path: "build" 305 | linters: [ wrapcheck ] 306 | - source: "^//\\s*go:generate\\s" 307 | linters: [ lll ] 308 | - source: "(noinspection|TODO)" 309 | linters: [ godot ] 310 | - source: "//noinspection" 311 | linters: [ gocritic ] 312 | - source: "^\\s+if _, ok := err\\.\\([^.]+\\.InternalError\\); ok {" 313 | linters: [ errorlint ] 314 | - path: "_test\\.go" 315 | linters: 316 | - bodyclose 317 | - dupl 318 | - funlen 319 | - goconst 320 | - gosec 321 | - noctx 322 | - wrapcheck 323 | - text: 'shadow: declaration of "(err|ctx)" shadows declaration at' 324 | linters: [ govet ] -------------------------------------------------------------------------------- /cardinal/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 3 | github.com/DataDog/appsec-internal-go v1.5.0 h1:8kS5zSx5T49uZ8dZTdT19QVAvC/B8ByyZdhQKYQWHno= 4 | github.com/DataDog/appsec-internal-go v1.5.0/go.mod h1:pEp8gjfNLtEOmz+iZqC8bXhu0h4k7NUsW/qiQb34k1U= 5 | github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= 6 | github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= 7 | github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 h1:5nE6N3JSs2IG3xzMthNFhXfOaXlrsdgqmJ73lndFf8c= 8 | github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1/go.mod h1:Vc+snp0Bey4MrrJyiV2tVxxJb6BmLomPvN1RgAvjGaQ= 9 | github.com/DataDog/datadog-go/v5 v5.4.0 h1:Ea3eXUVwrVV28F/fo3Dr3aa+TL/Z7Xi6SUPKW8L99aI= 10 | github.com/DataDog/datadog-go/v5 v5.4.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= 11 | github.com/DataDog/go-libddwaf/v2 v2.4.2 h1:ilquGKUmN9/Ty0sIxiEyznVRxP3hKfmH15Y1SMq5gjA= 12 | github.com/DataDog/go-libddwaf/v2 v2.4.2/go.mod h1:gsCdoijYQfj8ce/T2bEDNPZFIYnmHluAgVDpuQOWMZE= 13 | github.com/DataDog/go-tuf v1.0.2-0.5.2 h1:EeZr937eKAWPxJ26IykAdWA4A0jQXJgkhUjqEI/w7+I= 14 | github.com/DataDog/go-tuf v1.0.2-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= 15 | github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= 16 | github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= 17 | github.com/DataDog/sketches-go v1.4.2 h1:gppNudE9d19cQ98RYABOetxIhpTCl4m7CnbRZjvVA/o= 18 | github.com/DataDog/sketches-go v1.4.2/go.mod h1:xJIXldczJyyjnbDop7ZZcLxJdV3+7Kra7H1KMgpgkLk= 19 | github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= 20 | github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= 21 | github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= 22 | github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= 23 | github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= 24 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 25 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 26 | github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= 27 | github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= 28 | github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= 29 | github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= 30 | github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= 31 | github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= 32 | github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= 33 | github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= 34 | github.com/alicebob/miniredis/v2 v2.30.5 h1:3r6kTHdKnuP4fkS8k2IrvSfxpxUTcW1SOL0wN7b7Dt0= 35 | github.com/alicebob/miniredis/v2 v2.30.5/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= 36 | github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 37 | github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= 38 | github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= 39 | github.com/argus-labs/go-jobqueue v0.1.6 h1:LHbahdw6DPSX/1gjZYGep7XF7mJ4B/8LM9sPRxRWGrM= 40 | github.com/argus-labs/go-jobqueue v0.1.6/go.mod h1:pAM3jCOfI3+A7AM+SXE25eRkPdxko48qQe7zWACoOis= 41 | github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= 42 | github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= 43 | github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= 44 | github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= 45 | github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= 46 | github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= 47 | github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= 48 | github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 49 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 50 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 51 | github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 52 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= 53 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 54 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 55 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 56 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 57 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 58 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 59 | github.com/coocood/freecache v1.2.4 h1:UdR6Yz/X1HW4fZOuH0Z94KwG851GWOSknua5VUbb/5M= 60 | github.com/coocood/freecache v1.2.4/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= 61 | github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 62 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 63 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 64 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 65 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 66 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= 67 | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 68 | github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= 69 | github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= 70 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= 71 | github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= 72 | github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= 73 | github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= 74 | github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= 75 | github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= 76 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= 77 | github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 78 | github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= 79 | github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= 80 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 81 | github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= 82 | github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 83 | github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= 84 | github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= 85 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 86 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 87 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 88 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 89 | github.com/ethereum/go-ethereum v1.13.10 h1:Ppdil79nN+Vc+mXfge0AuUgmKWuVv4eMqzoIVSdqZek= 90 | github.com/ethereum/go-ethereum v1.13.10/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= 91 | github.com/fasthttp/websocket v1.5.8 h1:k5DpirKkftIF/w1R8ZzjSgARJrs54Je9YJK37DL/Ah8= 92 | github.com/fasthttp/websocket v1.5.8/go.mod h1:d08g8WaT6nnyvg9uMm8K9zMYyDjfKyj3170AtPRuVU0= 93 | github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= 94 | github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 95 | github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 96 | github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 97 | github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= 98 | github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= 99 | github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 100 | github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= 101 | github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 102 | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= 103 | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= 104 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 105 | github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 106 | github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= 107 | github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= 108 | github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= 109 | github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= 110 | github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= 111 | github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= 112 | github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU= 113 | github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= 114 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 115 | github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 116 | github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= 117 | github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= 118 | github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= 119 | github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 120 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 121 | github.com/gofiber/contrib/socketio v1.0.0 h1:Wanb9hsiuBg69IIDkes0mmKv23TsW+PxZQ/gBBqFwko= 122 | github.com/gofiber/contrib/socketio v1.0.0/go.mod h1:I8TtbDgnvysM+VJckHbuMAZGFO8qDokuHysXgcx/JzI= 123 | github.com/gofiber/contrib/websocket v1.3.0 h1:XADFAGorer1VJ1bqC4UkCjqS37kwRTV0415+050NrMk= 124 | github.com/gofiber/contrib/websocket v1.3.0/go.mod h1:xguaOzn2ZZ759LavtosEP+rcxIgBEE/rdumPINhR+Xo= 125 | github.com/gofiber/fiber/v2 v2.50.0/go.mod h1:21eytvay9Is7S6z+OgPi7c7n4++tnClWmhpimVHMimw= 126 | github.com/gofiber/fiber/v2 v2.52.2 h1:b0rYH6b06Df+4NyrbdptQL8ifuxw/Tf2DgfkZkDaxEo= 127 | github.com/gofiber/fiber/v2 v2.52.2/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= 128 | github.com/gofiber/swagger v0.1.14 h1:o524wh4QaS4eKhUCpj7M0Qhn8hvtzcyxDsfZLXuQcRI= 129 | github.com/gofiber/swagger v0.1.14/go.mod h1:DCk1fUPsj+P07CKaZttBbV1WzTZSQcSxfub8y9/BFr8= 130 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 131 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 132 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 133 | github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= 134 | github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 135 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 136 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 137 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 138 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 139 | github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= 140 | github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 141 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 142 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 143 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 144 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 145 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 146 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 147 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 148 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 149 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 150 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 151 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 152 | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 153 | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 154 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= 155 | github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 156 | github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= 157 | github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 158 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 159 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 160 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 161 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 162 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 163 | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 164 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 165 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 166 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 167 | github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 168 | github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= 169 | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 170 | github.com/google/pprof v0.0.0-20230901174712-0191c66da455 h1:YhRUmI1ttDC4sxKY2V62BTI8hCXnyZBV9h38eAanInE= 171 | github.com/google/pprof v0.0.0-20230901174712-0191c66da455/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= 172 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 173 | github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 174 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 175 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 176 | github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= 177 | github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= 178 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 179 | github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= 180 | github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 181 | github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= 182 | github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= 183 | github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= 184 | github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= 185 | github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= 186 | github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= 187 | github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= 188 | github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= 189 | github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= 190 | github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= 191 | github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= 192 | github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= 193 | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 194 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 195 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 196 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 197 | github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 198 | github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= 199 | github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= 200 | github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= 201 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 202 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 203 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 204 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 205 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 206 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 207 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 208 | github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= 209 | github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= 210 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 211 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 212 | github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 213 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= 214 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 215 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 216 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 217 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 218 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 219 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 220 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 221 | github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= 222 | github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 223 | github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= 224 | github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 225 | github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= 226 | github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= 227 | github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= 228 | github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= 229 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 230 | github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= 231 | github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 232 | github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= 233 | github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= 234 | github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= 235 | github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= 236 | github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= 237 | github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= 238 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 239 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 240 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 241 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= 242 | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 243 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 244 | github.com/puzpuzpuz/xsync/v3 v3.2.0 h1:9AzuUeF88YC5bK8u2vEG1Fpvu4wgpM1wfPIExfaaDxQ= 245 | github.com/puzpuzpuz/xsync/v3 v3.2.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= 246 | github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= 247 | github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= 248 | github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052 h1:Qp27Idfgi6ACvFQat5+VJvlYToylpM/hcyLBI3WaKPA= 249 | github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052/go.mod h1:uvX/8buq8uVeiZiFht+0lqSLBHF+uGV8BrTv8W/SIwk= 250 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 251 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 252 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 253 | github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= 254 | github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= 255 | github.com/rotisserie/eris v0.5.4 h1:Il6IvLdAapsMhvuOahHWiBnl1G++Q0/L5UIkI5mARSk= 256 | github.com/rotisserie/eris v0.5.4/go.mod h1:Z/kgYTJiJtocxCbFfvRmO+QejApzG6zpyky9G1A4g9s= 257 | github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= 258 | github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= 259 | github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= 260 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 261 | github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= 262 | github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= 263 | github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= 264 | github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= 265 | github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511 h1:KanIMPX0QdEdB4R3CiimCAbxFrhB3j7h0/OvpYGVQa8= 266 | github.com/savsgio/gotils v0.0.0-20240303185622-093b76447511/go.mod h1:sM7Mt7uEoCeFSCBM+qBrqvEo+/9vdmj19wzp3yzUhmg= 267 | github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= 268 | github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= 269 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 270 | github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 271 | github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= 272 | github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= 273 | github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 274 | github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 275 | github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= 276 | github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= 277 | github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= 278 | github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= 279 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 280 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 281 | github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= 282 | github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 283 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 284 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 285 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 286 | github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= 287 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 288 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 289 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 290 | github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 291 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 292 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 293 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 294 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 295 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 296 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 297 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 298 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 299 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 300 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 301 | github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= 302 | github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= 303 | github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= 304 | github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= 305 | github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= 306 | github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= 307 | github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= 308 | github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= 309 | github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= 310 | github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= 311 | github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= 312 | github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= 313 | github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= 314 | github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= 315 | github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= 316 | github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= 317 | github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= 318 | github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= 319 | github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= 320 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 321 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 322 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 323 | github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= 324 | github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= 325 | github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= 326 | github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= 327 | github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= 328 | github.com/wI2L/jsondiff v0.5.0 h1:RRMTi/mH+R2aXcPe1VYyvGINJqQfC3R+KSEakuU1Ikw= 329 | github.com/wI2L/jsondiff v0.5.0/go.mod h1:qqG6hnK0Lsrz2BpIVCxWiK9ItsBCpIZQiv0izJjOZ9s= 330 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 331 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 332 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 333 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 334 | github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= 335 | github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= 336 | go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= 337 | go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 338 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= 339 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= 340 | go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= 341 | go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= 342 | go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= 343 | go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= 344 | go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= 345 | go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= 346 | go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 347 | go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= 348 | go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= 349 | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= 350 | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 351 | go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= 352 | go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= 353 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 354 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 355 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 356 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 357 | golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= 358 | golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= 359 | golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= 360 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 361 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= 362 | golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 363 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 364 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 365 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 366 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 367 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 368 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 369 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 370 | golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 371 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 372 | golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 373 | golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= 374 | golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 375 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 376 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 377 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 378 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 379 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 380 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 381 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 382 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 383 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 384 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 385 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 386 | golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= 387 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 388 | golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= 389 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 390 | golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= 391 | golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= 392 | golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 393 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 394 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 395 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 396 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 397 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 398 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 399 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 400 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 401 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 402 | golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= 403 | golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 404 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 405 | golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 406 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 407 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 408 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 409 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 410 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 411 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 412 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 413 | golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 414 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 415 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 416 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 417 | golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 418 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 419 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 420 | golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 421 | golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 422 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 423 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 424 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 425 | golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 426 | golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= 427 | golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 428 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 429 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 430 | golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= 431 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 432 | golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= 433 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 434 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 435 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 436 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 437 | golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 438 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 439 | golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 440 | golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= 441 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 442 | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= 443 | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 444 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 445 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 446 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 447 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 448 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 449 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 450 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 451 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 452 | golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 453 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 454 | golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= 455 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 456 | golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= 457 | golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= 458 | golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= 459 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 460 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 461 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 462 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 463 | golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= 464 | golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 465 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 466 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 467 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 468 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 469 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 470 | google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= 471 | google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= 472 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 473 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 474 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 475 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 476 | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= 477 | google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= 478 | google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= 479 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 480 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 481 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 482 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 483 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 484 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 485 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 486 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 487 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 488 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 489 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 490 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 491 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 492 | google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= 493 | google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 494 | gopkg.in/DataDog/dd-trace-go.v1 v1.63.1 h1:POnTNQLAJHnuywfk48N+l/EiwQJ6Kdaa7nwV5dbfdUY= 495 | gopkg.in/DataDog/dd-trace-go.v1 v1.63.1/go.mod h1:pv2V0h4+skvObjdi3pWV4k6JHsdQk+flbjdC25mmTfU= 496 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 497 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 498 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 499 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 500 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 501 | gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= 502 | gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 503 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 504 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 505 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 506 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 507 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 508 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 509 | gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 510 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 511 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 512 | gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 513 | gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= 514 | gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= 515 | honnef.co/go/gotraceui v0.2.0 h1:dmNsfQ9Vl3GwbiVD7Z8d/osC6WtGGrasyrC2suc4ZIQ= 516 | honnef.co/go/gotraceui v0.2.0/go.mod h1:qHo4/W75cA3bX0QQoSvDjbJa4R8mAyyFjbWAj63XElc= 517 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 518 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 519 | pkg.world.dev/world-engine/assert v1.0.0 h1:vD6+QLT1pvQa86FPFi+wGcVA7PEwTGndXr+PkTY/Fpw= 520 | pkg.world.dev/world-engine/assert v1.0.0/go.mod h1:bwA9YZ40+Tte6GUKibfqByxBLLt+54zjjFako8cpSuU= 521 | pkg.world.dev/world-engine/cardinal v1.7.0-beta h1:GDOmU1UBS7YYEqyhxxsu+eqOzU6L5BmOKpVIqX0KAKE= 522 | pkg.world.dev/world-engine/cardinal v1.7.0-beta/go.mod h1:ARh6bq2/wy7zdZCpGi/2iZPh9DoTlTS6eVua3yRw2+c= 523 | pkg.world.dev/world-engine/cardinal v1.7.0 h1:/u1lgb4dfztHDt/oVOWjnb/lxD/6DqukZSG1UlHntpM= 524 | pkg.world.dev/world-engine/cardinal v1.7.0/go.mod h1:owY8EkpGeYKg/sz9hD8iSgJxv9WmUmVdnUUPCtaLzN0= 525 | pkg.world.dev/world-engine/cardinal v1.7.1 h1:G9pEfMOS10JC5ELEHhE02Eg5GcD1PaCG5UpQe51HiK8= 526 | pkg.world.dev/world-engine/cardinal v1.7.1/go.mod h1:ARh6bq2/wy7zdZCpGi/2iZPh9DoTlTS6eVua3yRw2+c= 527 | pkg.world.dev/world-engine/rift v1.2.0 h1:789ymNG9HdLubkXB9NLZ93kRu5gTAvlXcxY9vjuQxuM= 528 | pkg.world.dev/world-engine/rift v1.2.0/go.mod h1:vimnFo4VCFYHzixIv5ZtqnaRQM5+8a0J+V4AAOKrKk0= 529 | pkg.world.dev/world-engine/sign v1.1.0 h1:hotNGChaT+HCOfB3NMlqjISi1jX/UWjOPGlvuq9ws5s= 530 | pkg.world.dev/world-engine/sign v1.1.0/go.mod h1:pHHRuZ7P3HkZQbch0++xgy66iq0MwBuIeKymLdw0IMg= 531 | sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= 532 | --------------------------------------------------------------------------------