ai cooking
0
fork

Configure Feed

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

Kage (#461)

* kage secret applier

* closer

* seems to work

* okay give up

* gofumpt

* fumpt

---------

Co-authored-by: paul miller <paul.miller>

authored by

Paul Miller
paul miller
and committed by
GitHub
6f5dbb42 0a17c548

+644
+247
cmd/kage/main.go
··· 1 + package main 2 + 3 + import ( 4 + "bufio" 5 + "bytes" 6 + "context" 7 + "errors" 8 + "flag" 9 + "fmt" 10 + "io" 11 + "log" 12 + "os" 13 + "path/filepath" 14 + "strconv" 15 + "strings" 16 + 17 + "filippo.io/age" 18 + "filippo.io/age/agessh" 19 + 20 + corev1 "k8s.io/api/core/v1" 21 + apierrors "k8s.io/apimachinery/pkg/api/errors" 22 + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 23 + "k8s.io/client-go/kubernetes" 24 + "k8s.io/client-go/tools/clientcmd" 25 + ) 26 + 27 + const ( 28 + managedByAnnotationKey = "managed-by" 29 + managedByAnnotationValue = "github.com/paulgmiller/kage" 30 + secretCommentPrefix = "secret:" 31 + ) 32 + 33 + func main() { 34 + path := flag.String("secret-file", "secrets/envtest", "encrypted file to apply to k8s namespace") 35 + namespace := flag.String("ns", "", "k8s namespace") 36 + flag.Parse() 37 + ctx := context.Background() 38 + 39 + identities, err := loadSSHIdentities() 40 + if err != nil { 41 + log.Fatalf("need an identity %s", err) 42 + } 43 + ciphertext, err := os.Open(*path) 44 + if err != nil { 45 + log.Fatalf("can't open file %q, %s", *path, err) 46 + } 47 + defer func() { 48 + _ = ciphertext.Close() 49 + }() 50 + 51 + reader, err := age.Decrypt(ciphertext, identities...) 52 + if err != nil { 53 + log.Fatalf("decrypt file %q: %s", *path, err) 54 + } 55 + secrets, err := secrets(reader) 56 + if err != nil { 57 + panic(err) 58 + } 59 + 60 + cfg, err := clientcmd.BuildConfigFromFlags( 61 + "", 62 + filepath.Join(os.Getenv("HOME"), ".kube", "config"), 63 + ) 64 + if err != nil { 65 + panic(err) 66 + } 67 + 68 + clientset, err := kubernetes.NewForConfig(cfg) 69 + if err != nil { 70 + panic(err) 71 + } 72 + secretapi := clientset.CoreV1().Secrets(*namespace) 73 + for _, secret := range secrets { 74 + current, err := secretapi.Get(ctx, secret.Name, metav1.GetOptions{}) 75 + if apierrors.IsNotFound(err) { 76 + _, err = secretapi.Create(ctx, secret, metav1.CreateOptions{}) 77 + if err != nil { 78 + log.Fatalf("failed to update %s: %s", secret.Name, err) 79 + } 80 + log.Printf("Created %s/%s", *namespace, secret.Name) 81 + continue 82 + } 83 + if !secretNeedsUpdate(current, secret) { 84 + continue 85 + } 86 + secret.ResourceVersion = current.ResourceVersion 87 + _, err = secretapi.Update(ctx, secret, metav1.UpdateOptions{}) 88 + if err != nil { 89 + log.Fatalf("failed to update %s: %s", secret.Name, err) 90 + } 91 + log.Printf("Updated %s/%s", *namespace, secret.Name) 92 + 93 + } 94 + } 95 + 96 + func secretNeedsUpdate(current, desired *corev1.Secret) bool { 97 + if current.Annotations[managedByAnnotationKey] != desired.Annotations[managedByAnnotationKey] { 98 + return true 99 + } 100 + if len(current.Data) != len(desired.StringData) { 101 + return true 102 + } 103 + for key, value := range desired.StringData { 104 + if !bytes.Equal(current.Data[key], []byte(value)) { 105 + return true 106 + } 107 + } 108 + return false 109 + } 110 + 111 + func secrets(r io.Reader) ([]*corev1.Secret, error) { 112 + sc := bufio.NewScanner(r) 113 + var currentSecret string 114 + secretVals := map[string]map[string]string{} 115 + for sc.Scan() { 116 + line := strings.TrimSpace(sc.Text()) 117 + if comment, found := strings.CutPrefix(line, "#"); found { 118 + if secretName, found := strings.CutPrefix(comment, secretCommentPrefix); found { 119 + currentSecret = secretName 120 + if _, found := secretVals[currentSecret]; found { 121 + return nil, fmt.Errorf("duplicate secret comment %s", currentSecret) 122 + } 123 + secretVals[currentSecret] = map[string]string{} 124 + } 125 + continue 126 + } 127 + if len(currentSecret) == 0 { 128 + continue 129 + } 130 + key, value, err := parseSecretLine(line) 131 + if err != nil { 132 + return nil, err 133 + } 134 + if key == "" { 135 + continue 136 + } 137 + secret := secretVals[currentSecret] 138 + if _, found := secret[key]; found { 139 + return nil, fmt.Errorf("duplicate secret key %s", key) 140 + } 141 + secret[key] = value 142 + } 143 + if err := sc.Err(); err != nil { 144 + return nil, err 145 + } 146 + 147 + var secrets []*corev1.Secret 148 + for name, vals := range secretVals { 149 + secret := &corev1.Secret{ 150 + ObjectMeta: metav1.ObjectMeta{ 151 + Name: name, 152 + Annotations: map[string]string{ 153 + managedByAnnotationKey: managedByAnnotationValue, 154 + }, 155 + }, 156 + Type: corev1.SecretTypeOpaque, 157 + StringData: vals, 158 + } 159 + secrets = append(secrets, secret) 160 + } 161 + return secrets, nil 162 + } 163 + 164 + func parseSecretLine(line string) (string, string, error) { 165 + trimmed := strings.TrimSpace(line) 166 + if trimmed == "" { 167 + return "", "", nil 168 + } 169 + 170 + key, rawValue, found := strings.Cut(trimmed, "=") 171 + if !found { 172 + return "", "", fmt.Errorf("invalid secret entry %q", line) 173 + } 174 + 175 + key = strings.TrimSpace(key) 176 + if key == "" { 177 + return "", "", fmt.Errorf("invalid secret entry %q", line) 178 + } 179 + 180 + value := stripInlineComment(rawValue) 181 + value = strings.TrimSpace(value) 182 + if len(value) >= 2 && value[0] == '"' && value[len(value)-1] == '"' { 183 + unquoted, err := strconv.Unquote(value) 184 + if err != nil { 185 + return "", "", err 186 + } 187 + value = unquoted 188 + } else if len(value) >= 2 && value[0] == '\'' && value[len(value)-1] == '\'' { 189 + value = value[1 : len(value)-1] 190 + } 191 + 192 + return key, value, nil 193 + } 194 + 195 + func stripInlineComment(value string) string { 196 + var quote byte 197 + escaped := false 198 + for i := 0; i < len(value); i++ { 199 + ch := value[i] 200 + if escaped { 201 + escaped = false 202 + continue 203 + } 204 + if quote == '"' && ch == '\\' { 205 + escaped = true 206 + continue 207 + } 208 + if quote != 0 { 209 + if ch == quote { 210 + quote = 0 211 + } 212 + continue 213 + } 214 + if ch == '"' || ch == '\'' { 215 + quote = ch 216 + continue 217 + } 218 + if ch == '#' && (i == 0 || value[i-1] == ' ' || value[i-1] == '\t') { 219 + return value[:i] 220 + } 221 + } 222 + return value 223 + } 224 + 225 + // share with internal/config? 226 + func loadSSHIdentities() ([]age.Identity, error) { 227 + home, err := os.UserHomeDir() 228 + if err != nil || home == "" { 229 + return []age.Identity{}, nil 230 + } 231 + path := filepath.Join(home, ".ssh", "id_ed25519") 232 + 233 + key, err := os.ReadFile(path) 234 + if err != nil { 235 + if errors.Is(err, os.ErrNotExist) { 236 + return []age.Identity{}, nil 237 + } 238 + return nil, err 239 + } 240 + 241 + identity, err := agessh.ParseIdentity(key) 242 + if err != nil { 243 + return nil, fmt.Errorf("parse ssh identity %q: %w", path, err) 244 + } 245 + 246 + return []age.Identity{identity}, nil 247 + }
+296
cmd/kage/main_test.go
··· 1 + package main 2 + 3 + import ( 4 + "strings" 5 + "testing" 6 + 7 + corev1 "k8s.io/api/core/v1" 8 + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 9 + ) 10 + 11 + func TestSecretNeedsUpdate(t *testing.T) { 12 + t.Parallel() 13 + 14 + tests := []struct { 15 + name string 16 + current *corev1.Secret 17 + desired *corev1.Secret 18 + want bool 19 + }{ 20 + { 21 + name: "unchanged", 22 + current: &corev1.Secret{ 23 + ObjectMeta: metav1.ObjectMeta{ 24 + Name: "example", 25 + Annotations: map[string]string{ 26 + managedByAnnotationKey: managedByAnnotationValue, 27 + }, 28 + }, 29 + Type: corev1.SecretTypeOpaque, 30 + Data: map[string][]byte{ 31 + "API_KEY": []byte("same"), 32 + }, 33 + }, 34 + desired: &corev1.Secret{ 35 + ObjectMeta: metav1.ObjectMeta{ 36 + Name: "example", 37 + Annotations: map[string]string{ 38 + managedByAnnotationKey: managedByAnnotationValue, 39 + }, 40 + }, 41 + Type: corev1.SecretTypeOpaque, 42 + StringData: map[string]string{ 43 + "API_KEY": "same", 44 + }, 45 + }, 46 + want: false, 47 + }, 48 + { 49 + name: "changed value", 50 + current: &corev1.Secret{ 51 + ObjectMeta: metav1.ObjectMeta{ 52 + Name: "example", 53 + Annotations: map[string]string{ 54 + managedByAnnotationKey: managedByAnnotationValue, 55 + }, 56 + }, 57 + Type: corev1.SecretTypeOpaque, 58 + Data: map[string][]byte{ 59 + "API_KEY": []byte("before"), 60 + }, 61 + }, 62 + desired: &corev1.Secret{ 63 + ObjectMeta: metav1.ObjectMeta{ 64 + Name: "example", 65 + Annotations: map[string]string{ 66 + managedByAnnotationKey: managedByAnnotationValue, 67 + }, 68 + }, 69 + Type: corev1.SecretTypeOpaque, 70 + StringData: map[string]string{ 71 + "API_KEY": "after", 72 + }, 73 + }, 74 + want: true, 75 + }, 76 + { 77 + name: "removed key", 78 + current: &corev1.Secret{ 79 + ObjectMeta: metav1.ObjectMeta{ 80 + Name: "example", 81 + Annotations: map[string]string{ 82 + managedByAnnotationKey: managedByAnnotationValue, 83 + }, 84 + }, 85 + Type: corev1.SecretTypeOpaque, 86 + Data: map[string][]byte{ 87 + "API_KEY": []byte("same"), 88 + "EXTRA": []byte("remove"), 89 + }, 90 + }, 91 + desired: &corev1.Secret{ 92 + ObjectMeta: metav1.ObjectMeta{ 93 + Name: "example", 94 + Annotations: map[string]string{ 95 + managedByAnnotationKey: managedByAnnotationValue, 96 + }, 97 + }, 98 + Type: corev1.SecretTypeOpaque, 99 + StringData: map[string]string{ 100 + "API_KEY": "same", 101 + }, 102 + }, 103 + want: true, 104 + }, 105 + { 106 + name: "added key", 107 + current: &corev1.Secret{ 108 + ObjectMeta: metav1.ObjectMeta{ 109 + Name: "example", 110 + Annotations: map[string]string{ 111 + managedByAnnotationKey: managedByAnnotationValue, 112 + }, 113 + }, 114 + Type: corev1.SecretTypeOpaque, 115 + Data: map[string][]byte{ 116 + "API_KEY": []byte("same"), 117 + }, 118 + }, 119 + desired: &corev1.Secret{ 120 + ObjectMeta: metav1.ObjectMeta{ 121 + Name: "example", 122 + Annotations: map[string]string{ 123 + managedByAnnotationKey: managedByAnnotationValue, 124 + }, 125 + }, 126 + Type: corev1.SecretTypeOpaque, 127 + StringData: map[string]string{ 128 + "API_KEY": "same", 129 + "EXTRA": "add", 130 + }, 131 + }, 132 + want: true, 133 + }, 134 + { 135 + name: "annotation changed", 136 + current: &corev1.Secret{ 137 + ObjectMeta: metav1.ObjectMeta{ 138 + Name: "example", 139 + Annotations: map[string]string{ 140 + managedByAnnotationKey: "someone-else", 141 + }, 142 + }, 143 + Type: corev1.SecretTypeOpaque, 144 + Data: map[string][]byte{ 145 + "API_KEY": []byte("same"), 146 + }, 147 + }, 148 + desired: &corev1.Secret{ 149 + ObjectMeta: metav1.ObjectMeta{ 150 + Name: "example", 151 + Annotations: map[string]string{ 152 + managedByAnnotationKey: managedByAnnotationValue, 153 + }, 154 + }, 155 + Type: corev1.SecretTypeOpaque, 156 + StringData: map[string]string{ 157 + "API_KEY": "same", 158 + }, 159 + }, 160 + want: true, 161 + }, 162 + } 163 + 164 + for _, tt := range tests { 165 + tt := tt 166 + t.Run(tt.name, func(t *testing.T) { 167 + t.Parallel() 168 + got := secretNeedsUpdate(tt.current, tt.desired) 169 + if got != tt.want { 170 + t.Fatalf("secretNeedsUpdate() = %v, want %v", got, tt.want) 171 + } 172 + }) 173 + } 174 + } 175 + 176 + func TestSecrets(t *testing.T) { 177 + t.Parallel() 178 + 179 + t.Run("parses multiple secret blocks", func(t *testing.T) { 180 + t.Parallel() 181 + 182 + input := strings.NewReader(` 183 + #secret:first 184 + API_KEY=alpha 185 + TOKEN=beta 186 + 187 + #secret:second 188 + ZIP=98101 189 + `) 190 + 191 + got, err := secrets(input) 192 + if err != nil { 193 + t.Fatalf("secrets() error = %v", err) 194 + } 195 + if len(got) != 2 { 196 + t.Fatalf("len(secrets()) = %d, want 2", len(got)) 197 + } 198 + 199 + byName := map[string]*corev1.Secret{} 200 + for _, secret := range got { 201 + byName[secret.Name] = secret 202 + } 203 + 204 + first := byName["first"] 205 + if first == nil { 206 + t.Fatalf("missing secret %q", "first") 207 + } 208 + if first.Type != corev1.SecretTypeOpaque { 209 + t.Fatalf("first.Type = %q, want %q", first.Type, corev1.SecretTypeOpaque) 210 + } 211 + if first.Annotations[managedByAnnotationKey] != managedByAnnotationValue { 212 + t.Fatalf("first managed-by = %q", first.Annotations[managedByAnnotationKey]) 213 + } 214 + if first.StringData["API_KEY"] != "alpha" { 215 + t.Fatalf("first API_KEY = %q, want %q", first.StringData["API_KEY"], "alpha") 216 + } 217 + if first.StringData["TOKEN"] != "beta" { 218 + t.Fatalf("first TOKEN = %q, want %q", first.StringData["TOKEN"], "beta") 219 + } 220 + 221 + second := byName["second"] 222 + if second == nil { 223 + t.Fatalf("missing secret %q", "second") 224 + } 225 + if second.StringData["ZIP"] != "98101" { 226 + t.Fatalf("second ZIP = %q, want %q", second.StringData["ZIP"], "98101") 227 + } 228 + }) 229 + 230 + t.Run("handles end of line comments", func(t *testing.T) { 231 + t.Parallel() 232 + 233 + got, err := secrets(strings.NewReader(` 234 + #secret:first 235 + API_KEY=alpha # primary key 236 + TOKEN="beta # still value" # comment 237 + PATH=with#hash 238 + `)) 239 + if err != nil { 240 + t.Fatalf("secrets() error = %v", err) 241 + } 242 + if len(got) != 1 { 243 + t.Fatalf("len(secrets()) = %d, want 1", len(got)) 244 + } 245 + 246 + first := got[0] 247 + if first.StringData["API_KEY"] != "alpha" { 248 + t.Fatalf("API_KEY = %q, want %q", first.StringData["API_KEY"], "alpha") 249 + } 250 + if first.StringData["TOKEN"] != "beta # still value" { 251 + t.Fatalf("TOKEN = %q, want %q", first.StringData["TOKEN"], "beta # still value") 252 + } 253 + if first.StringData["PATH"] != "with#hash" { 254 + t.Fatalf("PATH = %q, want %q", first.StringData["PATH"], "with#hash") 255 + } 256 + }) 257 + 258 + t.Run("duplicate secret comment returns error", func(t *testing.T) { 259 + t.Parallel() 260 + 261 + _, err := secrets(strings.NewReader(` 262 + #secret:first 263 + API_KEY=alpha 264 + #secret:first 265 + TOKEN=beta 266 + `)) 267 + if err == nil { 268 + t.Fatal("secrets() error = nil, want duplicate secret comment error") 269 + } 270 + }) 271 + 272 + t.Run("duplicate key returns error", func(t *testing.T) { 273 + t.Parallel() 274 + 275 + _, err := secrets(strings.NewReader(` 276 + #secret:first 277 + API_KEY=alpha 278 + API_KEY=beta 279 + `)) 280 + if err == nil { 281 + t.Fatal("secrets() error = nil, want duplicate secret key error") 282 + } 283 + }) 284 + 285 + t.Run("invalid entry returns error", func(t *testing.T) { 286 + t.Parallel() 287 + 288 + _, err := secrets(strings.NewReader(` 289 + #secret:first 290 + not-an-env-line 291 + `)) 292 + if err == nil { 293 + t.Fatal("secrets() error = nil, want invalid secret entry error") 294 + } 295 + }) 296 + }
+30
go.mod
··· 23 23 golang.org/x/crypto v0.49.0 24 24 golang.org/x/net v0.52.0 25 25 golang.org/x/sync v0.20.0 26 + k8s.io/api v0.35.3 27 + k8s.io/apimachinery v0.35.3 28 + k8s.io/client-go v0.35.3 26 29 ) 27 30 28 31 require ( ··· 31 34 github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect 32 35 github.com/bahlo/generic-list-go v0.2.0 // indirect 33 36 github.com/buger/jsonparser v1.1.1 // indirect 37 + github.com/davecgh/go-spew v1.1.1 // indirect 38 + github.com/emicklei/go-restful/v3 v3.12.2 // indirect 39 + github.com/fxamacker/cbor/v2 v2.9.0 // indirect 34 40 github.com/go-jose/go-jose/v3 v3.0.4 // indirect 41 + github.com/go-logr/logr v1.4.3 // indirect 42 + github.com/go-openapi/jsonreference v0.20.2 // indirect 35 43 github.com/gobwas/httphead v0.1.0 // indirect 36 44 github.com/gobwas/pool v0.2.1 // indirect 37 45 github.com/gofrs/uuid v3.3.0+incompatible // indirect 46 + github.com/google/gnostic-models v0.7.0 // indirect 38 47 github.com/hashicorp/go-cleanhttp v0.5.2 // indirect 48 + github.com/json-iterator/go v1.1.12 // indirect 49 + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 50 + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect 51 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect 52 + github.com/spf13/pflag v1.0.9 // indirect 39 53 github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect 40 54 github.com/woodsbury/decimal128 v1.3.0 // indirect 55 + github.com/x448/float16 v0.8.4 // indirect 56 + go.yaml.in/yaml/v2 v2.4.3 // indirect 57 + go.yaml.in/yaml/v3 v3.0.4 // indirect 58 + golang.org/x/oauth2 v0.30.0 // indirect 41 59 golang.org/x/sys v0.42.0 // indirect 60 + golang.org/x/term v0.41.0 // indirect 61 + golang.org/x/time v0.9.0 // indirect 62 + google.golang.org/protobuf v1.36.8 // indirect 63 + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect 64 + gopkg.in/inf.v0 v0.9.1 // indirect 65 + k8s.io/klog/v2 v2.130.1 // indirect 66 + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect 67 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect 68 + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect 69 + sigs.k8s.io/randfill v1.0.0 // indirect 70 + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect 71 + sigs.k8s.io/yaml v1.6.0 // indirect 42 72 ) 43 73 44 74 require (
+71
go.sum
··· 29 29 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 30 30 github.com/clerk/clerk-sdk-go/v2 v2.5.1 h1:RsakGNW6ie83b9KIRtKzqDXBJ//cURy9SJUbGhrsIKg= 31 31 github.com/clerk/clerk-sdk-go/v2 v2.5.1/go.mod h1:ncFmsPwmD5WpGCNW5bJve862j/HQfpkzsshXYV/quJ8= 32 + github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 32 33 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 33 34 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 34 35 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 35 36 github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= 36 37 github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= 37 38 github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= 39 + github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= 40 + github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 38 41 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 39 42 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= 40 43 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 44 + github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= 45 + github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= 41 46 github.com/getkin/kin-openapi v0.133.0 h1:pJdmNohVIJ97r4AUFtEXRXwESr8b0bD721u/Tz6k8PQ= 42 47 github.com/getkin/kin-openapi v0.133.0/go.mod h1:boAciF6cXk5FhPqe/NQeBTeenbjqU4LhWBf09ILVvWE= 43 48 github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY= 44 49 github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= 50 + github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= 51 + github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 52 + github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= 45 53 github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= 46 54 github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= 55 + github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= 56 + github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= 57 + github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= 47 58 github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= 48 59 github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= 49 60 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= ··· 68 79 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 69 80 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 70 81 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 82 + github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= 83 + github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= 71 84 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 72 85 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 73 86 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= ··· 75 88 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 76 89 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 77 90 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 91 + github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= 92 + github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 78 93 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 79 94 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 80 95 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= ··· 90 105 github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= 91 106 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 92 107 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 108 + github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 109 + github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 93 110 github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= 94 111 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 112 + github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 95 113 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 96 114 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 97 115 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= ··· 104 122 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 105 123 github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= 106 124 github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= 125 + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 126 + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 127 + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 128 + github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 129 + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= 130 + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 107 131 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= 108 132 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= 133 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= 134 + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 109 135 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 110 136 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= 111 137 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= ··· 131 157 github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= 132 158 github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= 133 159 github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= 160 + github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= 134 161 github.com/openai/openai-go/v3 v3.29.0 h1:dZNJ0w7DxwpgppzKQjSKfLebW27KrtGqgSy4ipJS0U8= 135 162 github.com/openai/openai-go/v3 v3.29.0/go.mod h1:cdufnVK14cWcT9qA1rRtrXx4FTRsgbDPW7Ia7SS5cZo= 136 163 github.com/openclosed-dev/slogan v0.2.0 h1:Nh1z0IJ366ADFqu5pZY7SdMcYeONaeCx2J5Od9xHSfs= ··· 143 170 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 144 171 github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= 145 172 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= 173 + github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= 146 174 github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM= 147 175 github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= 148 176 github.com/sendgrid/rest v2.6.9+incompatible h1:1EyIcsNdn9KIisLW50MKwmSRSK+ekueiEMJ7NEoxJo0= ··· 155 183 github.com/speakeasy-api/jsonpath v0.6.0/go.mod h1:ymb2iSkyOycmzKwbEAYPJV/yi2rSmvBCLZJcyD+VVWw= 156 184 github.com/speakeasy-api/openapi-overlay v0.10.2 h1:VOdQ03eGKeiHnpb1boZCGm7x8Haj6gST0P3SGTX95GU= 157 185 github.com/speakeasy-api/openapi-overlay v0.10.2/go.mod h1:n0iOU7AqKpNFfEt6tq7qYITC4f0yzVVdFw0S7hukemg= 186 + github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= 187 + github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 158 188 github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= 159 189 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 190 + github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 191 + github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 160 192 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 161 193 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 162 194 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 163 195 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 196 + github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 197 + github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 198 + github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 164 199 github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= 165 200 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= 166 201 github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= ··· 182 217 github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= 183 218 github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0= 184 219 github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds= 220 + github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= 221 + github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= 185 222 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 186 223 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 224 + go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= 225 + go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= 226 + go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= 227 + go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= 187 228 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 188 229 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 189 230 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= ··· 209 250 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 210 251 golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= 211 252 golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= 253 + golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= 254 + golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= 212 255 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 213 256 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 214 257 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= ··· 254 297 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 255 298 golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= 256 299 golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= 300 + golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= 301 + golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 257 302 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 258 303 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 259 304 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= ··· 273 318 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 274 319 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 275 320 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 321 + google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= 322 + google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= 276 323 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 277 324 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 278 325 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 279 326 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 280 327 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 328 + gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= 329 + gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= 281 330 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 331 + gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 332 + gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 282 333 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= 283 334 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 284 335 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= ··· 291 342 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 292 343 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 293 344 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 345 + k8s.io/api v0.35.3 h1:pA2fiBc6+N9PDf7SAiluKGEBuScsTzd2uYBkA5RzNWQ= 346 + k8s.io/api v0.35.3/go.mod h1:9Y9tkBcFwKNq2sxwZTQh1Njh9qHl81D0As56tu42GA4= 347 + k8s.io/apimachinery v0.35.3 h1:MeaUwQCV3tjKP4bcwWGgZ/cp/vpsRnQzqO6J6tJyoF8= 348 + k8s.io/apimachinery v0.35.3/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= 349 + k8s.io/client-go v0.35.3 h1:s1lZbpN4uI6IxeTM2cpdtrwHcSOBML1ODNTCCfsP1pg= 350 + k8s.io/client-go v0.35.3/go.mod h1:RzoXkc0mzpWIDvBrRnD+VlfXP+lRzqQjCmKtiwZ8Q9c= 351 + k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= 352 + k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= 353 + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= 354 + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= 355 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= 356 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= 357 + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= 358 + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= 359 + sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= 360 + sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= 361 + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= 362 + sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= 363 + sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= 364 + sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=