From d2753e5306b6d632b01291a05356cfa912b5b034 Mon Sep 17 00:00:00 2001 From: cupofcat Date: Tue, 2 Dec 2025 17:28:14 +0100 Subject: [PATCH 01/97] chore(ADR): Create fractional-non-string-rand-units.md (#1783) ## This PR - Proposes `Support Non-String Inputs for Fractional Bucketing` ADR ### Related Issues https://github.com/open-feature/flagd/issues/1737 --------- Signed-off-by: cupofcat Signed-off-by: Maks Osowski --- .../fractional-non-string-rand-units.md | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 docs/architecture-decisions/fractional-non-string-rand-units.md diff --git a/docs/architecture-decisions/fractional-non-string-rand-units.md b/docs/architecture-decisions/fractional-non-string-rand-units.md new file mode 100644 index 000000000..17690dfa7 --- /dev/null +++ b/docs/architecture-decisions/fractional-non-string-rand-units.md @@ -0,0 +1,169 @@ +--- +# Valid statuses: draft | proposed | rejected | accepted | superseded +status: draft +author: Maks Osowski (@cupofcat) +created: 2025-08-21 +updated: 2025-09-02 +--- + +# Harden Hashing Consistency And Add Support For Non-string Attributes in Fractional Evaluation + +This proposal aims to enhance the `fractional` operator to: + +1. Explicitly ensure hashes are consistent across all providers and platforms. +2. Support non-string values as the hashing input (i.e., the randomization unit). + +Currently, all inputs are coerced to strings before hashing, which, in some rare cases, can lead to inconsistent bucketing across different provider implementations (e.g. Java provider running on a non UTF-8 platform). With this change, the targeting attributes of various types will be supported and will always be explicitly encoded in a consistent, language- and platform-independent manner in every provider + +This change will be backward-compatible in terms of flags schema but will be a breaking behavioral change for 100% of the users due to rebucketing. + +```json +"fractional": [ + { + // This will now work for non-string types + "var": "my-non-string-var" + }, + ["a", 50], + ["b", 50] +] +``` + +## Background + +The `fractional` operator in flagd determines bucket allocation (e.g., for percentage rollouts) by hashing an input value. Currently, there are two primary methods for providing this input: + +1. **Implicitly:** Providing a string-type `targetingKey` in the evaluation context, which is used if the `fractional` block only contains the variant distribution. +2. **Explicitly:** Providing an expression as the first element of the `fractional` array. Today, this expression *must* evaluate to a string (standard recommendation is to use the `"cat"` operator with `$flagd.flagKey` and `"var"`); that string will be used as hashing input, usually via murmur's `StringSum32` method. + +The requirement that the input evaluates to a string has two main drawbacks: + +* **Inconsistent Hashing:** Different providers (Go, PHP, Java) may encode the same string into bytes differently (e.g., UTF-8 vs UTF-16). Since hashing functions like MurmurHash3 operate on bytes, this leads to different hash results and thus different bucket assignments for the same logical input across platforms. +* **Unnecessary Coercion:** If a user wishes to bucket based on a numeric ID (e.g., `userId: 12345`), they must first explicitly cast it to a string (`"12345"`) within the flag definition using an operator like `"cat"`. + +This proposal seeks to resolve these issues by allowing `fractional` to operate directly on the byte representation of non-string inputs and to explicitly encode values to bytes with deterministic encoders. + +## Requirements + +### 1. Users must be able to use both string and non-string variables (e.g., integers, booleans) as the primary input for `fractional` evaluation + +### 2. Same "value" (e.g. 57.2, "some text", true, etc) should result in the same bucket assignment no matter the language of the provider and platform used + +Please note: + +* some languages (e.g. Python) don't necessarily have standard types by default (e.g. int32 vs int64). +* [OpenFeature spec 312](https://openfeature.dev/specification/sections/evaluation-context/#requirement-312) dictates that evaluation context needs to support `boolean` | `string` | `number` | `structure` | `datetime` types. +* JSON supports 6 fundamental types: `boolean` | `string` | `number` | `object` | `array` | `null` + +As such, the encodings for the following types as first argument (either as literals or results of evaluation) will be standardized: + +1. boolean +2. string +3. integer (any integer number, Python style) +4. float (any floating point number, Python style) +5. object (structure / map) +6. datetime +7. null + +**array / sequence** will be explicitly not supported as the first argument in fractional so it's possible to distinguish between hashing input and variant bucket. Nevertheless, it can be a part of object type and its encoding needs to be standardized as well. + +## Non-requirements + +* This change does not need to be backward-compatible. +* Support advanced features like salting non-string types in JSON directly (that will be a separate ADR). +* Bucketing improvements (that will be a separate ADR). + +## Considered Options + +1. **Proposed:** *Type-Aware Hashing:* Extend the current behavior to support non-string types as first arguments to `fractional`. +2. *New Operator:* Introduce a new operator, such as `"bytesVar"`, to explicitly signal that the variable's raw bytes should be hashed. +3. *Operator Overloading:* Reuse an existing operator (e.g., `"merge"`) or structure (e.g., providing a list) to imply byte-based hashing. + +Option 1 was chosen for its ergonomics and zero-impact on existing schemas. Option 2 adds unnecessary complexity to the flag definition language, and Option 3 creates confusing and non-obvious semantics. + +## Proposal + +We will modify the evaluation logic for the `fractional` operator. + +When inspecting the first element of the `fractional` array: + +1. If the first element in `fractional` evaluates to a non-array type then deterministically encode it to a well defined byte array and hash the bytes. +2. Otherwise, if `targetingKey` is a string, build a 2-elements array of `flagKey` and `targetingKey`, deterministically encode that and hash (**NOTE:** This is different than string concatenation used today). +3. Otherwise, if `targetingKey` is non-string, report an error and return nil (as this breaks the [OpenFeature spec](https://openfeature.dev/specification/glossary/#targeting-key)). +4. Otherwise, if `targetingKey` is missing, report an error and return nil + +```json +// Will use the new logic +"fractional": [ + { + "var": "my-non-string-var" + }, + ["a", 50], ... +] + +// Will use new logic +"fractional": [ + { + "cat": [{"var" : "$flagd.flagKey"}, {"var" : "some-var"}] + }, + ["a", 50], ... +] + +// Will use targetingKey +"fractional": [ + ["a", 50], ... +] + +// Will use targetingKey +"fractional": [ + { + "merge": [{"var" : "evaluates-to-some-variant-name"}, {"var" : "evaluates-to-some-int"}] + }, + ["a", 50], ... +] +``` + +### Deterministic and consistent byte encodings + +To meet requirement (2) [RFC 8949 Concise Binary Object Representation (CBOR)](https://www.rfc-editor.org/rfc/rfc8949.html) will be used to decide on byte encodings. + +* `boolean` is major type 7 +* `null` is major type 7 +* `string` is major type 3 +* `integer`: + * `unsigned integer` is major type 0 + * `negative integer` is major type 1 +* `float` is major type 7 +* `map` (object, structure, dict) is major type 5 +* `array` (list, sequence) is major type 4 +* `datetime` is converted to POSIX epoch time (including fractional seconds for sub-second precision) and CBOR Tag 1 is used + +**ATTENTION: When encoding strings, CBOR appends the size of the encoding in first bytes. As such, even though the actual encoding of the string is still UTF-8, the resulting byte array will differ from raw UTF-8 encoding. As such, after this change, all hashes will change, which will result in rebucketing.** + +Additionally, it is required to use [4.2.1. Core Deterministic Encoding Requirements](https://www.rfc-editor.org/rfc/rfc8949.html#section-4.2.1) (which includes Preferred Serizalization), to ensure: + +1. **Map Key Ordering**: Implementations must strictly adhere to the requirement that keys in maps (objects/structures) must be sorted using bytewise lexicographic order of their deterministic encodings. +2. **Preferred Serialization (Numbers)**: CBOR mandates using the shortest possible encoding. Providers must ensure consistency, especially between integer and float representations, and across different precisions. For example, if a value fits within a 32-bit float, it must be used instead of a 64-bit float, regardless of the native type in the provider's language. + +### API changes + +There are **no** changes to the flagd JSON schema. The change is purely semantic, affecting the evaluation logic within providers. + +### Consequences + +* Good, because any variable can be used for hashing. +* Good, because it avoids unnecessary casting. +* Bad, because all of the users will experience rebucketing. + +### Timeline + +Prior to flagd 1.0 launch. + +## More Information + +Today, flagd recommends salting the variable with flagKey directly in the `fractional` logic, using the `"cat"` operator. This will not be possible for non-string types. Advanced features like that will be considered in a separate ADR. + +Salting of the string types will continue to be possible using the `"cat"` operator as it is built directly into JSON Logic. + +### Testing considerations + +As part of implementation of this ADR, the current Gherkin suite will need to be updated to ensure more in-depth testing of consistency (e.g. by looking at the distribution of buckets for many samples), as well as support for many new types. From c2e3fc62e06faf870db74e1a26b141075e6fbaa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <2493377+askpt@users.noreply.github.com> Date: Mon, 8 Dec 2025 22:45:31 +0000 Subject: [PATCH 02/97] feat: Add OTEL default variables (#1812) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: André Silva <2493377+askpt@users.noreply.github.com> --- core/go.mod | 68 +++++++----- core/go.sum | 128 ++++++++++++--------- core/pkg/telemetry/builder.go | 171 ++++++++--------------------- core/pkg/telemetry/builder_test.go | 23 +--- 4 files changed, 170 insertions(+), 220 deletions(-) diff --git a/core/go.mod b/core/go.mod index 353135e4c..72e5fb039 100644 --- a/core/go.mod +++ b/core/go.mod @@ -16,37 +16,37 @@ require ( github.com/hashicorp/go-memdb v1.3.5 github.com/open-feature/flagd-schemas v0.2.13 github.com/open-feature/open-feature-operator/apis v0.2.45 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.0 github.com/robfig/cron v1.2.0 github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/twmb/murmur3 v1.1.8 - go.opentelemetry.io/otel v1.37.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 - go.opentelemetry.io/otel/exporters/prometheus v0.59.0 - go.opentelemetry.io/otel/metric v1.37.0 - go.opentelemetry.io/otel/sdk v1.37.0 - go.opentelemetry.io/otel/sdk/metric v1.37.0 - go.opentelemetry.io/otel/trace v1.37.0 + go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 + go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel/exporters/prometheus v0.60.0 + go.opentelemetry.io/otel/metric v1.38.0 + go.opentelemetry.io/otel/sdk v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.opentelemetry.io/otel/trace v1.38.0 go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 gocloud.dev v0.42.0 + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.8 golang.org/x/crypto v0.45.0 golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac golang.org/x/mod v0.29.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.73.0 - google.golang.org/protobuf v1.36.6 + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.8 gopkg.in/yaml.v3 v3.0.1 k8s.io/apimachinery v0.33.2 k8s.io/client-go v0.33.2 ) require ( - cel.dev/expr v0.23.0 // indirect + cel.dev/expr v0.24.0 // indirect cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -61,7 +61,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -86,9 +86,9 @@ require ( github.com/aws/smithy-go v1.22.3 // indirect github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v5 v5.0.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect @@ -96,7 +96,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -110,7 +110,8 @@ require ( github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect @@ -128,7 +129,8 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/otlptranslator v0.0.2 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -138,22 +140,34 @@ require ( github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/proto/otlp v1.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/api v0.33.2 // indirect diff --git a/core/go.sum b/core/go.sum index 432563c9b..bc52d9876 100644 --- a/core/go.sum +++ b/core/go.sum @@ -2,8 +2,8 @@ buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= -cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= -cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= @@ -50,8 +50,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mo github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -102,15 +102,15 @@ github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLo github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= -github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -145,8 +145,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -216,8 +216,10 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= @@ -274,15 +276,17 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= +github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= @@ -304,8 +308,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -326,34 +330,56 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= +go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= +go.opentelemetry.io/contrib/exporters/autoexport v0.63.0/go.mod h1:OvRg7gm5WRSCtxzGSsrFHbDLToYlStHNZQ+iPNIyD6g= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= -go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= +go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= +go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= +go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= +go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= +go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -477,8 +503,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -487,6 +513,8 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.235.0 h1:C3MkpQSRxS1Jy6AkzTGKKrpSCOd2WOGrezZ+icKSkKo= google.golang.org/api v0.235.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -496,17 +524,17 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -516,8 +544,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/core/pkg/telemetry/builder.go b/core/pkg/telemetry/builder.go index 55baf5a51..7be2736af 100644 --- a/core/pkg/telemetry/builder.go +++ b/core/pkg/telemetry/builder.go @@ -2,20 +2,15 @@ package telemetry import ( "context" - "crypto/tls" - "crypto/x509" "fmt" "os" "time" "connectrpc.com/connect" "connectrpc.com/otelconnect" - "github.com/open-feature/flagd/core/pkg/certreloader" "github.com/open-feature/flagd/core/pkg/logger" + "go.opentelemetry.io/contrib/exporters/autoexport" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/metric" @@ -23,9 +18,6 @@ import ( "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.34.0" "go.uber.org/zap" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" ) const ( @@ -72,24 +64,33 @@ func BuildMetricsRecorder( } // BuildTraceProvider build and register the trace provider and propagator for the caller runtime. This method -// attempt to register a global TracerProvider backed by batch SpanProcessor.Config. CollectorTarget can be used to -// provide the grpc collector target. Providing empty target results in skipping provider & propagator registration. -// This results in tracers having NoopTracerProvider and propagator having No-Op TextMapPropagator performing no action +// uses autoexport to automatically handle OTEL environment variables for trace exporters. +// Providing empty collector target results in using environment variables or falling back to noop. func BuildTraceProvider(ctx context.Context, logger *logger.Logger, svc string, svcVersion string, cfg Config) error { - if cfg.CollectorConfig.Target == "" { - logger.Debug("skipping trace provider setup as collector target is not set." + - " Traces will use NoopTracerProvider provider and propagator will use no-Op TextMapPropagator") - return nil + // For backwards compatibility: set environment variables from flagd configuration + // before calling autoexport if they are provided via flags + if cfg.CollectorConfig.Target != "" { + setEnvIfNotSet("OTEL_TRACES_EXPORTER", "otlp") + setEnvIfNotSet("OTEL_EXPORTER_OTLP_ENDPOINT", cfg.CollectorConfig.Target) + setEnvIfNotSet("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc") } - exporter, err := buildOtlpExporter(ctx, cfg.CollectorConfig) + // Use autoexport to handle OTEL environment variables + exporter, err := autoexport.NewSpanExporter(ctx) if err != nil { - return err + return fmt.Errorf("failed to create span exporter: %w", err) + } + + // Skip if noop exporter (when no configuration is provided) + if autoexport.IsNoneSpanExporter(exporter) { + logger.Debug("skipping trace provider setup as no exporter is configured." + + " Traces will use NoopTracerProvider provider and propagator will use no-Op TextMapPropagator") + return nil } res, err := buildResourceFor(ctx, svc, svcVersion) if err != nil { - return err + return fmt.Errorf("failed to build resource: %w", err) } provider := trace.NewTracerProvider( @@ -103,124 +104,41 @@ func BuildTraceProvider(ctx context.Context, logger *logger.Logger, svc string, } // BuildConnectOptions is a helper to build connect options based on telemetry configurations -func BuildConnectOptions(cfg Config) ([]connect.HandlerOption, error) { +func BuildConnectOptions(_ Config) ([]connect.HandlerOption, error) { options := []connect.HandlerOption{} - // add interceptor if configuration is available for collector - if cfg.CollectorConfig.Target != "" { - interceptor, err := otelconnect.NewInterceptor(otelconnect.WithTrustRemote()) - if err != nil { - return nil, fmt.Errorf("error creating interceptor, %w", err) - } - - options = append(options, connect.WithInterceptors(interceptor)) + // Always add interceptor - autoexport will handle whether traces are enabled + interceptor, err := otelconnect.NewInterceptor(otelconnect.WithTrustRemote()) + if err != nil { + return nil, fmt.Errorf("error creating interceptor, %w", err) } - return options, nil -} + options = append(options, connect.WithInterceptors(interceptor)) -func buildTransportCredentials(_ context.Context, cfg CollectorConfig) (credentials.TransportCredentials, error) { - creds := insecure.NewCredentials() - if cfg.KeyPath != "" || cfg.CertPath != "" || cfg.CAPath != "" { - capool := x509.NewCertPool() - if cfg.CAPath != "" { - ca, err := os.ReadFile(cfg.CAPath) - if err != nil { - return nil, fmt.Errorf("can't read ca file from %s", cfg.CAPath) - } - if !capool.AppendCertsFromPEM(ca) { - return nil, fmt.Errorf("can't add CA '%s' to pool", cfg.CAPath) - } - } - - reloader, err := certreloader.NewCertReloader(certreloader.Config{ - KeyPath: cfg.KeyPath, - CertPath: cfg.CertPath, - ReloadInterval: cfg.ReloadInterval, - }) - if err != nil { - return nil, fmt.Errorf("failed to create certreloader: %w", err) - } - - tlsConfig := &tls.Config{ - RootCAs: capool, - MinVersion: tls.VersionTLS12, - GetCertificate: func(chi *tls.ClientHelloInfo) (*tls.Certificate, error) { - certs, err := reloader.GetCertificate() - if err != nil { - return nil, fmt.Errorf("failed to reload certs: %w", err) - } - return certs, nil - }, - } - - creds = credentials.NewTLS(tlsConfig) - } - - return creds, nil + return options, nil } // buildMetricReader builds a metric reader based on provided configurations +// Uses autoexport to automatically handle OTEL environment variables func buildMetricReader(ctx context.Context, cfg Config) (metric.Reader, error) { - if cfg.MetricsExporter == "" { - return buildDefaultMetricReader() - } - - // Handle metric reader override - if cfg.MetricsExporter != metricsExporterOtel { - return nil, fmt.Errorf("provided metrics operator %s is not supported. currently only support %s", - cfg.MetricsExporter, metricsExporterOtel) - } - - // Otel override require target configuration - if cfg.CollectorConfig.Target == "" { - return nil, fmt.Errorf("metric exporter is set(%s) without providing otel collector target."+ - " collector target is required for this option", cfg.MetricsExporter) - } - - transportCredentials, err := buildTransportCredentials(ctx, cfg.CollectorConfig) - if err != nil { - return nil, fmt.Errorf("metric export would not build transport credentials: %w", err) - } - - // Non-blocking, insecure grpc connection - conn, err := grpc.NewClient(cfg.CollectorConfig.Target, grpc.WithTransportCredentials(transportCredentials)) - if err != nil { - return nil, fmt.Errorf("error creating client connection: %w", err) - } - - // Otel metric exporter - otelExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn)) - if err != nil { - return nil, fmt.Errorf("error creating otel metric exporter: %w", err) + // For backwards compatibility: set environment variables from flagd configuration + // before calling autoexport if they are provided via flags + if cfg.MetricsExporter == metricsExporterOtel && cfg.CollectorConfig.Target != "" { + // Set OTEL environment variables from configuration if not already set + setEnvIfNotSet("OTEL_METRICS_EXPORTER", "otlp") + setEnvIfNotSet("OTEL_EXPORTER_OTLP_ENDPOINT", cfg.CollectorConfig.Target) + setEnvIfNotSet("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc") } - return metric.NewPeriodicReader(otelExporter), nil -} - -// buildOtlpExporter is a helper to build grpc backed otlp trace exporter -func buildOtlpExporter(ctx context.Context, cfg CollectorConfig) (*otlptrace.Exporter, error) { - transportCredentials, err := buildTransportCredentials(ctx, cfg) - if err != nil { - return nil, fmt.Errorf("metric export would not build transport credentials: %w", err) - } - - // Non-blocking, grpc connection - conn, err := grpc.NewClient(cfg.Target, grpc.WithTransportCredentials(transportCredentials)) - if err != nil { - return nil, fmt.Errorf("error creating client connection: %w", err) - } - - traceClient := otlptracegrpc.NewClient(otlptracegrpc.WithGRPCConn(conn)) - exporter, err := otlptrace.New(ctx, traceClient) - if err != nil { - return nil, fmt.Errorf("error starting otel exporter: %w", err) - } - return exporter, nil + // Use autoexport with Prometheus as fallback for backwards compatibility + return autoexport.NewMetricReader( + ctx, + autoexport.WithFallbackMetricReader(buildDefaultMetricReader), + ) } // buildDefaultMetricReader provides the default metric reader -func buildDefaultMetricReader() (metric.Reader, error) { +func buildDefaultMetricReader(_ context.Context) (metric.Reader, error) { p, err := prometheus.New() if err != nil { return nil, fmt.Errorf("unable to create default metric reader: %w", err) @@ -246,6 +164,13 @@ func buildResourceFor(ctx context.Context, serviceName string, serviceVersion st return r, nil } +// setEnvIfNotSet sets an environment variable only if it's not already set +func setEnvIfNotSet(key, value string) { + if os.Getenv(key) == "" { + os.Setenv(key, value) + } +} + // OTelErrorsHandler is a custom error interceptor for OpenTelemetry type otelErrorsHandler struct { logger *logger.Logger diff --git a/core/pkg/telemetry/builder_test.go b/core/pkg/telemetry/builder_test.go index c6253012b..59d1314b2 100644 --- a/core/pkg/telemetry/builder_test.go +++ b/core/pkg/telemetry/builder_test.go @@ -44,24 +44,7 @@ func TestBuildMetricReader(t *testing.T) { error: false, }, { - name: "Metric exporter overriding require valid overriding parameter", - cfg: Config{ - MetricsExporter: "unsupported", - }, - error: true, - }, - { - name: "Metric exporter overriding require valid configuration combination", - cfg: Config{ - MetricsExporter: metricsExporterOtel, - CollectorConfig: CollectorConfig{ - Target: "", // collector target is unset - }, - }, - error: true, - }, - { - name: "Metric exporter overriding with valid configurations", + name: "Autoexport handles all configurations", cfg: Config{ MetricsExporter: metricsExporterOtel, CollectorConfig: CollectorConfig{ @@ -128,9 +111,9 @@ func TestBuildConnectOptions(t *testing.T) { optionCount int }{ { - name: "No options for empty/default configurations", + name: "Interceptor always added with autoexport", cfg: Config{}, - optionCount: 0, + optionCount: 1, }, { name: "Connect option is set when telemetry target is set", From 8a938649d7be752f7b39a3070aa51fc413513e08 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Thu, 11 Dec 2025 12:28:19 -0500 Subject: [PATCH 03/97] chore: disable MD060 Signed-off-by: Todd Baert --- .markdownlint-cli2.yaml | 1 + docs/reference/specifications/providers.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index c89a936b4..d60ee8408 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -16,6 +16,7 @@ config: descriptive-link-text: false MD007: indent: 4 + MD060: false # unfortunately, this is broken with emojis for now ignores: - "**/CHANGELOG.md" diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index 101570ea7..18ce9a14a 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -106,7 +106,7 @@ We always rely on the [integrated functionality of GRPC for reconnection](https: We are configuring the underlying reconnection mechanism whenever we can, based on our configuration. (not all GRPC implementations support this) | language/property | min connect timeout | max backoff | initial backoff | jitter | multiplier | -|-------------------|-----------------------------------|--------------------------|--------------------------|--------|------------| +| ----------------- | --------------------------------- | ------------------------ | ------------------------ | ------ | ---------- | | GRPC property | grpc.initial_reconnect_backoff_ms | max_reconnect_backoff_ms | min_reconnect_backoff_ms | 0.2 | 1.6 | | Flagd property | deadlineMs | retryBackoffMaxMs | retryBackoffMs | 0.2 | 1.6 | | --- | --- | --- | --- | --- | --- | From 87aa1fea24f8b277b8ec252f62b00fb4c6f6d8e7 Mon Sep 17 00:00:00 2001 From: Sean Killeen Date: Thu, 11 Dec 2025 12:30:11 -0500 Subject: [PATCH 04/97] docs: add additional Kubernetes deployment path (#1836) ## This PR - Updates installation document to note additional Kubernetes deployment option per discussion on #1835 ### Related Issues Fixes #1835 ### Notes N/A ### Follow-up Tasks N/A ### How to test Build & look at the docs page. --------- Signed-off-by: Sean Killeen Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- docs/installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index a0f5ca4df..e6a8a77c1 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -26,6 +26,8 @@ If you're interested in a full-featured solution for using flagd in Kubernetes, For more information, see [OpenFeature Operator](./reference/openfeature-operator/overview.md). +You can also choose to run a Kubernetes service in front of a deployment with multiple flagd pods connecting to the same data source. However, if doing so, be aware that synchronization is not instant. The service may return different values after a change until all pods have synchronized with the data source. This synchronization delay is typically brief. + --- ## Binary From 570693d9e7b3200c0865e7ebb3b467ccfc38bb88 Mon Sep 17 00:00:00 2001 From: Simon Schrottner Date: Mon, 15 Dec 2025 19:02:59 +0100 Subject: [PATCH 05/97] fix: fixing sync return format missing flag layer, adding full e2e suite (#1827) with https://github.com/open-feature/flagd/pull/1797 we introduced this bug, that the format of the response is not correct. current state: ```javacript { flagConfiguration: {/* flag object */} } ``` should be: ```javacript { flagConfiguration: { flags: {/* flag object */} } } ``` Clarification from @toddbaert - this is an UNRELEASED bug so far. --------- Signed-off-by: Simon Schrottner Signed-off-by: Todd Baert Co-authored-by: Todd Baert Co-authored-by: alexandraoberaigner <82218944+alexandraoberaigner@users.noreply.github.com> --- .github/workflows/build.yaml | 29 +- flagd/pkg/service/flag-sync/handler.go | 15 +- test-harness | 2 +- test/integration/config/envoy.yaml | 49 -- test/integration/evaluation_test.go | 76 --- test/integration/go.mod | 219 +++++++- test/integration/go.sum | 657 ++++++++++++++++++++++-- test/integration/integration_test.go | 185 ++++++- test/integration/json_evaluator_test.go | 71 --- 9 files changed, 989 insertions(+), 314 deletions(-) delete mode 100644 test/integration/config/envoy.yaml delete mode 100644 test/integration/evaluation_test.go delete mode 100644 test/integration/json_evaluator_test.go diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b9743b014..462278411 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -124,32 +124,5 @@ jobs: with: go-version-file: 'flagd/go.mod' - - name: Install envoy - run: | - wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg - echo "deb [signed-by=/etc/apt/keyrings/envoy-keyring.gpg] https://apt.envoyproxy.io jammy main" | sudo tee /etc/apt/sources.list.d/envoy.list - sudo apt-get update - sudo apt-get install envoy - envoy --version - - - name: Workspace init - run: make workspace-init - - - name: Build flagd binary - run: make build - - - name: Run flagd binary in background - run: | - ./bin/flagd start \ - -f file:${{ github.workspace }}/test-harness/flags/testing-flags.json \ - -f file:${{ github.workspace }}/test-harness/flags/custom-ops.json \ - -f file:${{ github.workspace }}/test-harness/flags/evaluator-refs.json \ - -f file:${{ github.workspace }}/test-harness/flags/zero-flags.json \ - -f file:${{ github.workspace }}/test-harness/flags/edge-case-flags.json & - - - name: Run envoy proxy in background - run: | - envoy -c ./test/integration/config/envoy.yaml & - - - name: Run evaluation test suite + - name: Run test suite run: make workspace-clean && cd test/integration && go clean -testcache && go test -cover diff --git a/flagd/pkg/service/flag-sync/handler.go b/flagd/pkg/service/flag-sync/handler.go index 51aecc94f..4de4a3463 100644 --- a/flagd/pkg/service/flag-sync/handler.go +++ b/flagd/pkg/service/flag-sync/handler.go @@ -63,9 +63,7 @@ func (s syncHandler) SyncFlags(req *syncv1.SyncFlagsRequest, server syncv1grpc.F return fmt.Errorf("error constructing metadata response") } - flagMap := s.convertMap(payload.Flags) - - flags, err := json.Marshal(flagMap) + flags, err := s.generateResponse(payload.Flags) if err != nil { s.log.Error(fmt.Sprintf("error retrieving flags from store: %v", err)) return status.Error(codes.DataLoss, "error marshalling flags") @@ -87,6 +85,15 @@ func (s syncHandler) SyncFlags(req *syncv1.SyncFlagsRequest, server syncv1grpc.F } } +func (s syncHandler) generateResponse(payload []model.Flag) ([]byte, error) { + flagConfig := map[string]interface{}{ + "flags": s.convertMap(payload), + } + + flags, err := json.Marshal(flagConfig) + return flags, err +} + // getSelectorExpression extracts the selector expression from the request. // It first checks the Flagd-Selector header (metadata), then falls back to the request body selector. // @@ -139,7 +146,7 @@ func (s syncHandler) FetchAllFlags(ctx context.Context, req *syncv1.FetchAllFlag return nil, status.Error(codes.Internal, "error retrieving flags from store") } - flagsString, err := json.Marshal(s.convertMap(flags)) + flagsString, err := s.generateResponse(flags) if err != nil { return nil, err diff --git a/test-harness b/test-harness index 6197b3d95..7d7d51848 160000 --- a/test-harness +++ b/test-harness @@ -1 +1 @@ -Subproject commit 6197b3d956d358bf662e5b8e0aebdc4800480f6b +Subproject commit 7d7d51848a31805b4248b1d8e8a9f295554b1aee diff --git a/test/integration/config/envoy.yaml b/test/integration/config/envoy.yaml deleted file mode 100644 index a3d512eda..000000000 --- a/test/integration/config/envoy.yaml +++ /dev/null @@ -1,49 +0,0 @@ -static_resources: - listeners: - - name: local-envoy - address: - socket_address: - address: 0.0.0.0 - port_value: 9211 - filter_chains: - - filters: - - name: envoy.filters.network.http_connection_manager - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager - stat_prefix: ingress_http - access_log: - - name: envoy.access_loggers.stdout - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog - http_filters: - - name: envoy.filters.http.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router - route_config: - name: local_route - virtual_hosts: - - name: local_service - domains: - - "flagd-sync.service" - routes: - - match: - prefix: "/" - grpc: {} - route: - cluster: local-sync-service - - clusters: - - name: local-sync-service - type: LOGICAL_DNS - # Comment out the following line to test on v6 networks - dns_lookup_family: V4_ONLY - http2_protocol_options: {} - load_assignment: - cluster_name: local-sync-service - endpoints: - - lb_endpoints: - - endpoint: - address: - socket_address: - address: sync-service - port_value: 8015 \ No newline at end of file diff --git a/test/integration/evaluation_test.go b/test/integration/evaluation_test.go deleted file mode 100644 index edd417d85..000000000 --- a/test/integration/evaluation_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package integration_test - -import ( - "flag" - "testing" - - "github.com/cucumber/godog" - flagd "github.com/open-feature/go-sdk-contrib/providers/flagd/pkg" - "github.com/open-feature/go-sdk-contrib/tests/flagd/pkg/integration" - "github.com/open-feature/go-sdk/openfeature" -) - -func TestEvaluation(t *testing.T) { - if testing.Short() { - t.Skip() - } - - flag.Parse() - - var providerOptions []flagd.ProviderOption - name := "evaluation.feature" - - if tls == "true" { - name = "evaluation_tls.feature" - providerOptions = []flagd.ProviderOption{flagd.WithTLS(certPath)} - } - - testSuite := godog.TestSuite{ - Name: name, - TestSuiteInitializer: integration.InitializeTestSuite(func() openfeature.FeatureProvider { - return flagd.NewProvider(providerOptions...) - }), - ScenarioInitializer: integration.InitializeEvaluationScenario, - Options: &godog.Options{ - Format: "pretty", - Paths: []string{"../../spec/specification/assets/gherkin/evaluation.feature"}, - TestingT: t, // Testing instance that will run subtests. - Strict: true, - }, - } - - if testSuite.Run() != 0 { - t.Fatal("non-zero status returned, failed to run evaluation tests") - } -} - -func TestEvaluationUsingEnvoy(t *testing.T) { - if testing.Short() { - t.Skip() - } - - flag.Parse() - - name := "evaluation_envoy.feature" - providerOptions := []flagd.ProviderOption{ - flagd.WithTargetUri("envoy://localhost:9211/flagd-sync.service"), - } - - testSuite := godog.TestSuite{ - Name: name, - TestSuiteInitializer: integration.InitializeTestSuite(func() openfeature.FeatureProvider { - return flagd.NewProvider(providerOptions...) - }), - ScenarioInitializer: integration.InitializeEvaluationScenario, - Options: &godog.Options{ - Format: "pretty", - Paths: []string{"../../spec/specification/assets/gherkin/evaluation.feature"}, - TestingT: t, // Testing instance that will run subtests. - Strict: true, - }, - } - - if testSuite.Run() != 0 { - t.Fatal("non-zero status returned, failed to run evaluation tests") - } -} diff --git a/test/integration/go.mod b/test/integration/go.mod index 61a09902b..cbbc3a6d6 100644 --- a/test/integration/go.mod +++ b/test/integration/go.mod @@ -1,14 +1,13 @@ -module tests.integration +module integration_test -go 1.24.0 +go 1.24.9 -toolchain go1.24.1 +toolchain go1.24.10 require ( - github.com/cucumber/godog v0.14.1 - github.com/open-feature/go-sdk v1.11.0 - github.com/open-feature/go-sdk-contrib/providers/flagd v0.2.3 - github.com/open-feature/go-sdk-contrib/tests/flagd v1.4.1 + github.com/go-git/go-git/v5 v5.16.2 + github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0 + github.com/testcontainers/testcontainers-go v0.40.0 ) require ( @@ -17,62 +16,236 @@ require ( buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 // indirect connectrpc.com/connect v1.18.1 // indirect connectrpc.com/otelconnect v0.7.2 // indirect + dario.cat/mergo v1.0.2 // indirect + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect + github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect + github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.65 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect + github.com/aws/smithy-go v1.22.3 // indirect github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/buger/goterm v1.0.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/compose-spec/compose-go/v2 v2.9.0 // indirect + github.com/containerd/console v1.0.5 // indirect + github.com/containerd/containerd/api v1.9.0 // indirect + github.com/containerd/containerd/v2 v2.1.5 // indirect + github.com/containerd/continuity v0.4.5 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v1.0.0-rc.1 // indirect + github.com/containerd/ttrpc v1.2.7 // indirect + github.com/containerd/typeurl/v2 v2.2.3 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/cucumber/gherkin/go/v26 v26.2.0 // indirect + github.com/cucumber/godog v0.15.1 // indirect github.com/cucumber/messages/go/v21 v21.0.1 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/diegoholiveira/jsonlogic/v3 v3.8.4 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/buildx v0.29.1 // indirect + github.com/docker/cli v28.5.1+incompatible // indirect + github.com/docker/cli-docs-tool v0.10.0 // indirect + github.com/docker/compose/v2 v2.40.2 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v28.5.1+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.3 // indirect + github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect + github.com/docker/go-connections v0.6.0 // indirect + github.com/docker/go-metrics v0.0.1 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 // indirect + github.com/emicklei/go-restful/v3 v3.12.0 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsevents v0.2.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gofrs/flock v0.12.1 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/mock v1.7.0-rc.1 // indirect - github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.9 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.5 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/in-toto/in-toto-golang v0.9.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jonboulle/clockwork v0.5.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-shellwords v1.0.12 // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect + github.com/moby/buildkit v0.25.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/go-archive v0.1.0 // indirect + github.com/moby/locker v1.0.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect + github.com/moby/sys/atomicwriter v0.1.0 // indirect + github.com/moby/sys/capability v0.4.0 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/signal v0.7.1 // indirect + github.com/moby/sys/symlink v0.3.0 // indirect + github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/open-feature/flagd-schemas v0.2.9-0.20240708163558-2aa89b314322 // indirect - github.com/open-feature/flagd/core v0.10.4 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 // indirect + github.com/open-feature/flagd/core v0.12.1 // indirect + github.com/open-feature/go-sdk v1.17.0 // indirect + github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.6.0 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b // indirect + github.com/shibumi/go-pathspec v1.3.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect + github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect + github.com/spf13/cobra v1.10.1 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 // indirect + github.com/theupdateframework/notary v0.7.0 // indirect + github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 // indirect + github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f // indirect + github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect + github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect + github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab // indirect github.com/twmb/murmur3 v1.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + github.com/zclconf/go-cty v1.17.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect go.opentelemetry.io/otel/metric v1.37.0 // indirect go.opentelemetry.io/otel/sdk v1.37.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect go.opentelemetry.io/otel/trace v1.37.0 // indirect - go.uber.org/mock v0.5.2 // indirect + go.opentelemetry.io/proto/otlp v1.7.0 // indirect + go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/time v0.11.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/grpc v1.73.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/grpc v1.74.2 // indirect + google.golang.org/protobuf v1.36.9 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.33.2 // indirect k8s.io/apimachinery v0.33.2 // indirect + k8s.io/client-go v0.33.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/controller-runtime v0.19.3 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect sigs.k8s.io/yaml v1.4.0 // indirect + tags.cncf.io/container-device-interface v1.0.1 // indirect ) diff --git a/test/integration/go.sum b/test/integration/go.sum index 36acb640a..3e719ca05 100644 --- a/test/integration/go.sum +++ b/test/integration/go.sum @@ -8,74 +8,345 @@ connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI= connectrpc.com/otelconnect v0.7.2/go.mod h1:JS7XUKfuJs2adhCnXhNHPHLz6oAaZniCJdSF00OZSew= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e h1:rd4bOvKmDIx0WeTv9Qz+hghsgyjikFiPrseXHlKepO0= +github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e/go.mod h1:blbwPQh4DTlCZEfk1BLU4oMIhLda2U+A840Uag9DsZw= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= +github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= +github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= +github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= +github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= +github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= +github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= +github.com/compose-spec/compose-go/v2 v2.9.0 h1:UHSv/QHlo6QJtrT4igF1rdORgIUhDo1gWuyJUoiNNIM= +github.com/compose-spec/compose-go/v2 v2.9.0/go.mod h1:Oky9AZGTRB4E+0VbTPZTUu4Kp+oEMMuwZXZtPPVT1iE= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= +github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= +github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= +github.com/containerd/containerd/v2 v2.1.5 h1:pWSmPxUszaLZKQPvOx27iD4iH+aM6o0BoN9+hg77cro= +github.com/containerd/containerd/v2 v2.1.5/go.mod h1:8C5QV9djwsYDNhxfTCFjWtTBZrqjditQ4/ghHSYjnHM= +github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= +github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/nydus-snapshotter v0.15.2 h1:qsHI4M+Wwrf6Jr4eBqhNx8qh+YU0dSiJ+WPmcLFWNcg= +github.com/containerd/nydus-snapshotter v0.15.2/go.mod h1:FfwH2KBkNYoisK/e+KsmNr7xTU53DmnavQHMFOcXwfM= +github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= +github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= +github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= +github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8= +github.com/containerd/stargz-snapshotter v0.16.3 h1:zbQMm8dRuPHEOD4OqAYGajJJUwCeUzt4j7w9Iaw58u4= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= +github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= +github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= -github.com/cucumber/godog v0.14.1 h1:HGZhcOyyfaKclHjJ+r/q93iaTJZLKYW6Tv3HkmUE6+M= -github.com/cucumber/godog v0.14.1/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/godog v0.15.1 h1:rb/6oHDdvVZKS66hrhpjFQFHjthFSrQBCOI1LwshNTI= +github.com/cucumber/godog v0.15.1/go.mod h1:qju+SQDewOljHuq9NSM66s0xEhogx0q30flfxL4WUk8= github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/cucumber/messages/go/v22 v22.0.0/go.mod h1:aZipXTKc0JnjCsXrJnuZpWhtay93k7Rn3Dee7iyPJjs= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1vfDaOVsaipH4= github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/buildx v0.29.1 h1:58hxM5Z4mnNje3G5NKfULT9xCr8ooM8XFtlfUK9bKaA= +github.com/docker/buildx v0.29.1/go.mod h1:J4EFv6oxlPiV1MjO0VyJx2u5tLM7ImDEl9zyB8d4wPI= +github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= +github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli-docs-tool v0.10.0 h1:bOD6mKynPQgojQi3s2jgcUWGp/Ebqy1SeCr9VfKQLLU= +github.com/docker/cli-docs-tool v0.10.0/go.mod h1:5EM5zPnT2E7yCLERZmrDA234Vwn09fzRHP4aX1qwp1U= +github.com/docker/compose/v2 v2.40.2 h1:h2bDBJkOuqmj93XvT2oI0ArPQonE0lGtWiILXdiXvbA= +github.com/docker/compose/v2 v2.40.2/go.mod h1:CbSJpKGw20LInVsPjglZ8z7Squ3OBQOD7Ux5nkjGfIU= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= +github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= +github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= -github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= +github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= -github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= +github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= +github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -83,49 +354,236 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.25.2 h1:mReLKDPv05cqk6o/u3ixq2/iTsWGHoUO5Zg3lojrQTk= +github.com/moby/buildkit v0.25.2/go.mod h1:phM8sdqnvgK2y1dPDnbwI6veUCXHOZ6KFSl6E164tkc= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= +github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= +github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= +github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= +github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/signal v0.7.1 h1:PrQxdvxcGijdo6UXXo/lU/TvHUWyPhj7UOpSo8tuvk0= +github.com/moby/sys/signal v0.7.1/go.mod h1:Se1VGehYokAkrSQwL4tDzHvETwUZlnY7S5XtQ50mQp8= +github.com/moby/sys/symlink v0.3.0 h1:GZX89mEZ9u53f97npBy4Rc3vJKj7JBDj/PN2I22GrNU= +github.com/moby/sys/symlink v0.3.0/go.mod h1:3eNdhduHmYPcgsJtZXW1W4XUJdZGBIkttZ8xKqPUJq0= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/open-feature/flagd-schemas v0.2.9-0.20240708163558-2aa89b314322 h1:5zbNHqcZAc9jlhSrC0onuVL2RPpvYcDaNvW2wOZBfUY= -github.com/open-feature/flagd-schemas v0.2.9-0.20240708163558-2aa89b314322/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= -github.com/open-feature/flagd/core v0.10.4 h1:3MVpDG7KigvKG9HzrK2yYKwAY2VeUbaghPWmh1MNmKg= -github.com/open-feature/flagd/core v0.10.4/go.mod h1:adkYaazGgCUg6z023rKBzSN8cN3Yamuh8h+3qxK7Yk8= -github.com/open-feature/go-sdk v1.11.0 h1:4cp9rXl16ZvlMCef7O+I3vQSXae8DzAF0SfV9mvYInw= -github.com/open-feature/go-sdk v1.11.0/go.mod h1:+rkJhLBtYsJ5PZNddAgFILhRAAxwrJ32aU7UEUm4zQI= -github.com/open-feature/go-sdk-contrib/providers/flagd v0.2.3 h1:Kzt0WkUtrLeFgJn2wkGhBVJZTOBVFGwXGuGs27uM9KQ= -github.com/open-feature/go-sdk-contrib/providers/flagd v0.2.3/go.mod h1:lZnG8SjETq2kyHvOInmdqTuofg53GNbY6YupgwP4LTA= -github.com/open-feature/go-sdk-contrib/tests/flagd v1.4.1 h1:kFAeX4qLSdcm//s9fvyBQ9CvfBZMtTkwEN46rjuxx+E= -github.com/open-feature/go-sdk-contrib/tests/flagd v1.4.1/go.mod h1:bCwijcl/OeUiixMkrKqRi2qMN9sSwSOoJHz33c84BVw= +github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= +github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= +github.com/open-feature/flagd/core v0.12.1 h1:fCBenpE0/m/l1KiU6gjM59FUQPnqeuxnO9D4v3UDqu4= +github.com/open-feature/flagd/core v0.12.1/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/go-sdk v1.17.0 h1:/OUBBw5d9D61JaNZZxb2Nnr5/EJrEpjtKCTY3rspJQk= +github.com/open-feature/go-sdk v1.17.0/go.mod h1:lPxPSu1UnZ4E3dCxZi5gV3et2ACi8O8P+zsTGVsDZUw= +github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1 h1:24PKDHPdh+2KBuVNTzqycHGi8thvPIUVWl4jsr5NNGg= +github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1/go.mod h1:az4enQx0mOryt0rOgAiBPqFbgOySryuyBe76kUHc7GU= +github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0 h1:WaSMl6wZZVHx0IvRGstY3iqyHGHe3olCj038i4qF6NE= +github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0/go.mod h1:gLzJfQ4BKlrn8syRyMMas3ArOMqNaaUDRgj3bi4aWSs= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= +github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= +github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/secure-systems-lab/go-securesystemslib v0.6.0 h1:T65atpAVCJQK14UA57LMdZGpHi4QYSH/9FZyNGqMYIA= +github.com/secure-systems-lab/go-securesystemslib v0.6.0/go.mod h1:8Mtpo9JKks/qhPG4HGZ2LGMvrPbzuxwfz/f/zLfEWkk= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= +github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= +github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c h1:2EejZtjFjKJGk71ANb+wtFK5EjUzUkEM3R0xnp559xg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= +github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= +github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 h1:Bj8W7GieY56sRbVJx1yLh0JVEtOQ8SQMhX+jRtzenLA= +github.com/testcontainers/testcontainers-go/modules/compose v0.40.0/go.mod h1:fEEGqtsoH1KS+sUi1WG4+vH3fqdCyip1U9Hd8P3SRMA= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 h1:r0p7fK56l8WPequOaR3i9LBqfPtEdXIQbUTzT55iqT4= +github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323/go.mod h1:3Iuxbr0P7D3zUzBMAZB+ois3h/et0shEz0qApgHYGpY= +github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f h1:MoxeMfHAe5Qj/ySSBfL8A7l1V+hxuluj8owsIEEZipI= +github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f/go.mod h1:BKdcez7BiVtBvIcef90ZPc6ebqIWr4JWD7+EvLm6J98= +github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE= +github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= +github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= +github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -133,17 +591,40 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= +github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0 h1:0NIXxOCFx+SKbhCVxwl3ETG8ClLPAa0KuKV6p3yhxP8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0/go.mod h1:ChZSJbbfbl/DcRZNc9Gqh6DYGlfjw4PvO1pEOZH1ZsE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= @@ -152,88 +633,154 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= +go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= +google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= +gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY= k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs= k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY= k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E= +k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= +k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= -sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= @@ -243,3 +790,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= +tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= diff --git a/test/integration/integration_test.go b/test/integration/integration_test.go index 22b89c5eb..c8b3f7c11 100644 --- a/test/integration/integration_test.go +++ b/test/integration/integration_test.go @@ -1,13 +1,182 @@ package integration_test -import "flag" - -var ( - tls string - certPath string +import ( + "context" + "flag" + "fmt" + "github.com/go-git/go-git/v5" + "github.com/open-feature/go-sdk-contrib/tests/flagd/testframework" + "github.com/testcontainers/testcontainers-go" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" ) -func init() { - flag.StringVar(&tls, "tls", "false", "tls enabled for testing") - flag.StringVar(&certPath, "cert-path", "", "path to cert to use in tls tests") +func getGitCommitNative() string { + repo, err := git.PlainOpen(".") + if err != nil { + return "no-git-repo" + } + + ref, err := repo.Head() + if err != nil { + return "no-head" + } + + hash := ref.Hash().String() + if len(hash) > 7 { + return hash[:7] + } + return hash +} + +func getPlatform() string { + switch runtime.GOARCH { + case "amd64": + return "linux/amd64" + case "arm64": + return "linux/arm64" + default: + return "linux/amd64" // Always return a valid platform + } +} + +func TestMain(m *testing.M) { + flag.Parse() + + // Setup: Build and start flagd-testbed container + ctx := context.Background() + var err error + + err = setupFlagdTestbed(ctx) + if err != nil { + panic(fmt.Sprintf("Failed to setup flagd testbed: %v", err)) + } + + // Run tests + code := m.Run() + + os.Exit(code) +} + +func setupFlagdTestbed(ctx context.Context) error { + // Build the testbed image with local flagd + buildContext, err := filepath.Abs("../../") // Adjust path to your project root + if err != nil { + return fmt.Errorf("failed to get absolute path: %w", err) + } + + // Build flagd first + flagdImage, err := buildFlagdImage(ctx, buildContext) + if err != nil { + return fmt.Errorf("failed to build flagd image: %w", err) + } + + // Build testbed image using the local flagd + err = buildTestbedImage(ctx, buildContext, flagdImage) + if err != nil { + return fmt.Errorf("failed to build testbed image: %w", err) + } + + return nil +} + +func buildFlagdImage(ctx context.Context, buildContext string) (string, error) { + imageName := "flagd:test-local" + + // Execute the docker buildx command + cmd := exec.Command("docker", "buildx", "build", + "--platform="+getPlatform(), + "-t", imageName, + "-f", "flagd/build.Dockerfile", + ".") + + cmd.Dir = buildContext + + // Print the exact command being run + fmt.Printf("Running command: %s\n", strings.Join(cmd.Args, " ")) + + output, err := cmd.CombinedOutput() + if err != nil { + return imageName, fmt.Errorf("docker buildx failed: %v\nOutput: %s", err, output) + } + + return imageName, nil +} + +func buildTestbedImage(ctx context.Context, buildContext, flagdImage string) error { + req := testcontainers.ContainerRequest{ + FromDockerfile: testcontainers.FromDockerfile{ + Context: filepath.Join(buildContext, "./test-harness"), // Path to testbed directory + Dockerfile: "./flagd/Dockerfile", + BuildArgs: map[string]*string{ + "FLAGD_BASE_IMAGE": &flagdImage, + }, + Tag: getGitCommitNative(), + Repo: "local-testbed-image", + }, + } + + // Build the image + _, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: false, // We just want to build, not start + }) + if err != nil { + return fmt.Errorf("failed to build testbed image: %w", err) + } + + return nil +} + +func TestRPC(t *testing.T) { + + // Setup testbed runner for RPC provider + runner := testframework.NewTestbedRunner(testframework.TestbedConfig{ + ResolverType: testframework.RPC, + TestbedConfig: "default", // Use default testbed configuration + TestbedDir: "../../test-harness", + Image: "local-testbed-image", + Tag: getGitCommitNative(), + }) + defer runner.Cleanup() + + // Define feature paths - using flagd-testbed gherkin files + featurePaths := []string{ + "./", + } + + // Run tests with RPC-specific tags - exclude connection/event issues we won't tackle + tags := "@rpc && ~@unixsocket && ~@targetURI && ~@sync && ~@metadata && ~@grace && ~@events && ~@customCert && ~@reconnect && ~@caching && ~@forbidden" + + if err := runner.RunGherkinTestsWithSubtests(t, featurePaths, tags); err != nil { + t.Fatalf("Gherkin tests failed: %v", err) + } +} + +func TestInProcess(t *testing.T) { + // Setup testbed runner for RPC provider + runner := testframework.NewTestbedRunner(testframework.TestbedConfig{ + ResolverType: testframework.InProcess, + TestbedConfig: "default", // Use default testbed configuration + TestbedDir: "../../test-harness", + Image: "local-testbed-image", + Tag: getGitCommitNative(), + }) + defer runner.Cleanup() + + // Define feature paths - using flagd-testbed gherkin files + featurePaths := []string{ + "./", + } + + // Run tests with InProcess-specific tags + tags := "@in-process && ~@unixsocket&& ~@metadata && ~@contextEnrichment && ~@customCert && ~@forbidden && ~@sync-port && ~@sync-payload" + + if err := runner.RunGherkinTestsWithSubtests(t, featurePaths, tags); err != nil { + t.Fatalf("Gherkin tests failed: %v", err) + } } diff --git a/test/integration/json_evaluator_test.go b/test/integration/json_evaluator_test.go deleted file mode 100644 index ccb9fdcf4..000000000 --- a/test/integration/json_evaluator_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package integration_test - -import ( - "flag" - "testing" - - "github.com/cucumber/godog" - flagd "github.com/open-feature/go-sdk-contrib/providers/flagd/pkg" - "github.com/open-feature/go-sdk-contrib/tests/flagd/pkg/integration" - "github.com/open-feature/go-sdk/openfeature" -) - -func TestJsonEvaluator(t *testing.T) { - if testing.Short() { - t.Skip() - } - - flag.Parse() - - var providerOptions []flagd.ProviderOption - name := "flagd-json-evaluator.feature" - - testSuite := godog.TestSuite{ - Name: name, - TestSuiteInitializer: integration.InitializeFlagdJsonTestSuite(func() openfeature.FeatureProvider { - return flagd.NewProvider(providerOptions...) - }), - ScenarioInitializer: integration.InitializeFlagdJsonScenario, - Options: &godog.Options{ - Format: "pretty", - Paths: []string{"../../test-harness/gherkin/flagd-json-evaluator.feature"}, - TestingT: t, // Testing instance that will run subtests. - Strict: true, - }, - } - - if testSuite.Run() != 0 { - t.Fatal("non-zero status returned, failed to run evaluation tests") - } -} - -func TestJsonEvaluatorUsingEnvoy(t *testing.T) { - if testing.Short() { - t.Skip() - } - - flag.Parse() - - name := "flagd-json-evaluator-envoy.feature" - providerOptions := []flagd.ProviderOption{ - flagd.WithTargetUri("envoy://localhost:9211/flagd-sync.service"), - } - - testSuite := godog.TestSuite{ - Name: name, - TestSuiteInitializer: integration.InitializeFlagdJsonTestSuite(func() openfeature.FeatureProvider { - return flagd.NewProvider(providerOptions...) - }), - ScenarioInitializer: integration.InitializeFlagdJsonScenario, - Options: &godog.Options{ - Format: "pretty", - Paths: []string{"../../test-harness/gherkin/flagd-json-evaluator.feature"}, - TestingT: t, // Testing instance that will run subtests. - Strict: true, - }, - } - - if testSuite.Run() != 0 { - t.Fatal("non-zero status returned, failed to run evaluation tests") - } -} From ffab28555cf8d60c32b1d31924f787acd927bf86 Mon Sep 17 00:00:00 2001 From: Guido Breitenhuber Date: Mon, 22 Dec 2025 21:28:27 +0100 Subject: [PATCH 06/97] chore: Fix oauth docs issue (#1838) ## This PR fixes an issue in documentation about using OAuth with HTTP Syncs Signed-off-by: Todd Baert --- docs/reference/sync-configuration.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/docs/reference/sync-configuration.md b/docs/reference/sync-configuration.md index 8cf679efd..a14c09fa9 100644 --- a/docs/reference/sync-configuration.md +++ b/docs/reference/sync-configuration.md @@ -146,13 +146,7 @@ that requires OAuth-based authentication. #### CLI-based OAuth Configuration -To enable OAuth, you need to update your Flagd configuration setting the `oauth` object which contains parameters to configure - -.... - -#### File-based OAuth Configuration - -the `clientID`, `clientSecret`, and the `tokenURL` for the OAuth Server. +To enable OAuth, you need to update your Flagd configuration by setting the `oauth` object. This object contains parameters to configure the `clientID`, `clientSecret`, and the `tokenURL` for the OAuth Server. ```sh ./bin/flagd start @@ -168,10 +162,11 @@ the `clientID`, `clientSecret`, and the `tokenURL` for the OAuth Server. }}]' ``` -Secrets can also be managed from the file system. This can be handy when, for example, deploying Flagd in Kubernetes. In this case, the client id and secret -will be read from the files `client-id` and `client-secret`, respectively. If the `folder` attribute is set, client id and secret on top level will be ignored. -To support rotating the secrets without restarting flagd, the additional parameter `ReloadDelayS` can be used to force -the reload of the secrets from the filesystem every `ReloadDelayS` seconds. +#### File-based OAuth Configuration + +Secrets can also be managed from the file system. This can be handy when, for example, deploying Flagd in Kubernetes. If the `folder` attribute is set, any `clientID` and `clientSecret` values provided directly within the `oauth` object are ignored. +In this case, the client id and secret will be read from the files `client-id` and `client-secret`, respectively. +To support rotating the secrets without restarting flagd, the additional parameter `ReloadDelayS` can be used to force the reload of the secrets from the filesystem every `ReloadDelayS` seconds. ```sh ./bin/flagd start From 264b808ea49727cc4347c6bb322bc542257979a6 Mon Sep 17 00:00:00 2001 From: Brandon Duffany Date: Mon, 22 Dec 2025 16:53:05 -0500 Subject: [PATCH 07/97] docs: support YAML in playground (#1837) Signed-off-by: Brandon Duffany --- docs/playground/playground.js | 85 ++++++++++++++++++++++---------- playground-app/package-lock.json | 20 +++++--- playground-app/package.json | 2 + playground-app/src/App.tsx | 20 +++----- playground-app/src/utils.ts | 14 +++++- 5 files changed, 94 insertions(+), 47 deletions(-) diff --git a/docs/playground/playground.js b/docs/playground/playground.js index c4193495c..8266f2718 100644 --- a/docs/playground/playground.js +++ b/docs/playground/playground.js @@ -1,4 +1,4 @@ -(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))l(c);new MutationObserver(c=>{for(const o of c)if(o.type==="childList")for(const d of o.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&l(d)}).observe(document,{childList:!0,subtree:!0});function u(c){const o={};return c.integrity&&(o.integrity=c.integrity),c.referrerPolicy&&(o.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?o.credentials="include":c.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function l(c){if(c.ep)return;c.ep=!0;const o=u(c);fetch(c.href,o)}})();function Xl(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var df={exports:{}},wi={};/** +(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))l(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const c of o.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&l(c)}).observe(document,{childList:!0,subtree:!0});function u(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function l(s){if(s.ep)return;s.ep=!0;const o=u(s);fetch(s.href,o)}})();function _s(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Bf={exports:{}},Ba={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Op;function tb(){if(Op)return wi;Op=1;var r=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function u(l,c,o){var d=null;if(o!==void 0&&(d=""+o),c.key!==void 0&&(d=""+c.key),"key"in c){o={};for(var h in c)h!=="key"&&(o[h]=c[h])}else o=c;return c=o.ref,{$$typeof:r,type:l,key:d,ref:c!==void 0?c:null,props:o}}return wi.Fragment=i,wi.jsx=u,wi.jsxs=u,wi}var Ap;function nb(){return Ap||(Ap=1,df.exports=tb()),df.exports}var we=nb(),hf={exports:{}},Oe={};/** + */var pg;function KE(){if(pg)return Ba;pg=1;var n=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function u(l,s,o){var c=null;if(o!==void 0&&(c=""+o),s.key!==void 0&&(c=""+s.key),"key"in s){o={};for(var d in s)d!=="key"&&(o[d]=s[d])}else o=s;return s=o.ref,{$$typeof:n,type:l,key:c,ref:s!==void 0?s:null,props:o}}return Ba.Fragment=i,Ba.jsx=u,Ba.jsxs=u,Ba}var mg;function FE(){return mg||(mg=1,Bf.exports=KE()),Bf.exports}var Ae=FE(),Hf={exports:{}},Oe={};/** * @license React * react.production.js * @@ -14,7 +14,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Rp;function rb(){if(Rp)return Oe;Rp=1;var r=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),o=Symbol.for("react.consumer"),d=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),N=Symbol.iterator;function x(R){return R===null||typeof R!="object"?null:(R=N&&R[N]||R["@@iterator"],typeof R=="function"?R:null)}var V={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},L=Object.assign,C={};function g(R,z,K){this.props=R,this.context=z,this.refs=C,this.updater=K||V}g.prototype.isReactComponent={},g.prototype.setState=function(R,z){if(typeof R!="object"&&typeof R!="function"&&R!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,R,z,"setState")},g.prototype.forceUpdate=function(R){this.updater.enqueueForceUpdate(this,R,"forceUpdate")};function w(){}w.prototype=g.prototype;function p(R,z,K){this.props=R,this.context=z,this.refs=C,this.updater=K||V}var b=p.prototype=new w;b.constructor=p,L(b,g.prototype),b.isPureReactComponent=!0;var E=Array.isArray,O={H:null,A:null,T:null,S:null},v=Object.prototype.hasOwnProperty;function A(R,z,K,k,T,H){return K=H.ref,{$$typeof:r,type:R,key:z,ref:K!==void 0?K:null,props:H}}function $(R,z){return A(R.type,z,void 0,void 0,void 0,R.props)}function D(R){return typeof R=="object"&&R!==null&&R.$$typeof===r}function j(R){var z={"=":"=0",":":"=2"};return"$"+R.replace(/[=:]/g,function(K){return z[K]})}var Y=/\/+/g;function Q(R,z){return typeof R=="object"&&R!==null&&R.key!=null?j(""+R.key):z.toString(36)}function W(){}function F(R){switch(R.status){case"fulfilled":return R.value;case"rejected":throw R.reason;default:switch(typeof R.status=="string"?R.then(W,W):(R.status="pending",R.then(function(z){R.status==="pending"&&(R.status="fulfilled",R.value=z)},function(z){R.status==="pending"&&(R.status="rejected",R.reason=z)})),R.status){case"fulfilled":return R.value;case"rejected":throw R.reason}}throw R}function ne(R,z,K,k,T){var H=typeof R;(H==="undefined"||H==="boolean")&&(R=null);var te=!1;if(R===null)te=!0;else switch(H){case"bigint":case"string":case"number":te=!0;break;case"object":switch(R.$$typeof){case r:case i:te=!0;break;case S:return te=R._init,ne(te(R._payload),z,K,k,T)}}if(te)return T=T(R),te=k===""?"."+Q(R,0):k,E(T)?(K="",te!=null&&(K=te.replace(Y,"$&/")+"/"),ne(T,z,K,"",function(M){return M})):T!=null&&(D(T)&&(T=$(T,K+(T.key==null||R&&R.key===T.key?"":(""+T.key).replace(Y,"$&/")+"/")+te)),z.push(T)),1;te=0;var pe=k===""?".":k+":";if(E(R))for(var ae=0;ae>>1,R=P[de];if(0>>1;dec(k,re))Tc(H,k)?(P[de]=H,P[T]=re,de=T):(P[de]=k,P[K]=re,de=K);else if(Tc(H,re))P[de]=H,P[T]=re,de=T;else break e}}return ue}function c(P,ue){var re=P.sortIndex-ue.sortIndex;return re!==0?re:P.id-ue.id}if(r.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var o=performance;r.unstable_now=function(){return o.now()}}else{var d=Date,h=d.now();r.unstable_now=function(){return d.now()-h}}var m=[],y=[],S=1,N=null,x=3,V=!1,L=!1,C=!1,g=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,p=typeof setImmediate<"u"?setImmediate:null;function b(P){for(var ue=u(y);ue!==null;){if(ue.callback===null)l(y);else if(ue.startTime<=P)l(y),ue.sortIndex=ue.expirationTime,i(m,ue);else break;ue=u(y)}}function E(P){if(C=!1,b(P),!L)if(u(m)!==null)L=!0,F();else{var ue=u(y);ue!==null&&ne(E,ue.startTime-P)}}var O=!1,v=-1,A=5,$=-1;function D(){return!(r.unstable_now()-$P&&D());){var de=N.callback;if(typeof de=="function"){N.callback=null,x=N.priorityLevel;var R=de(N.expirationTime<=P);if(P=r.unstable_now(),typeof R=="function"){N.callback=R,b(P),ue=!0;break t}N===u(m)&&l(m),b(P)}else l(m);N=u(m)}if(N!==null)ue=!0;else{var z=u(y);z!==null&&ne(E,z.startTime-P),ue=!1}}break e}finally{N=null,x=re,V=!1}ue=void 0}}finally{ue?Y():O=!1}}}var Y;if(typeof p=="function")Y=function(){p(j)};else if(typeof MessageChannel<"u"){var Q=new MessageChannel,W=Q.port2;Q.port1.onmessage=j,Y=function(){W.postMessage(null)}}else Y=function(){g(j,0)};function F(){O||(O=!0,Y())}function ne(P,ue){v=g(function(){P(r.unstable_now())},ue)}r.unstable_IdlePriority=5,r.unstable_ImmediatePriority=1,r.unstable_LowPriority=4,r.unstable_NormalPriority=3,r.unstable_Profiling=null,r.unstable_UserBlockingPriority=2,r.unstable_cancelCallback=function(P){P.callback=null},r.unstable_continueExecution=function(){L||V||(L=!0,F())},r.unstable_forceFrameRate=function(P){0>P||125de?(P.sortIndex=re,i(y,P),u(m)===null&&P===u(y)&&(C?(w(v),v=-1):C=!0,ne(E,re-de))):(P.sortIndex=R,i(m,P),L||V||(L=!0,F())),P},r.unstable_shouldYield=D,r.unstable_wrapCallback=function(P){var ue=x;return function(){var re=x;x=ue;try{return P.apply(this,arguments)}finally{x=re}}}}(yf)),yf}var jp;function ib(){return jp||(jp=1,pf.exports=ab()),pf.exports}var gf={exports:{}},bt={};/** + */var vg;function QE(){return vg||(vg=1,function(n){function i(P,se){var re=P.length;P.push(se);e:for(;0>>1,R=P[de];if(0>>1;des(Y,re))Ns(H,Y)?(P[de]=H,P[N]=re,de=N):(P[de]=Y,P[K]=re,de=K);else if(Ns(H,re))P[de]=H,P[N]=re,de=N;else break e}}return se}function s(P,se){var re=P.sortIndex-se.sortIndex;return re!==0?re:P.id-se.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var o=performance;n.unstable_now=function(){return o.now()}}else{var c=Date,d=c.now();n.unstable_now=function(){return c.now()-d}}var p=[],m=[],v=1,S=null,q=3,C=!1,U=!1,D=!1,y=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,g=typeof setImmediate<"u"?setImmediate:null;function E(P){for(var se=u(m);se!==null;){if(se.callback===null)l(m);else if(se.startTime<=P)l(m),se.sortIndex=se.expirationTime,i(p,se);else break;se=u(m)}}function _(P){if(D=!1,E(P),!U)if(u(p)!==null)U=!0,J();else{var se=u(m);se!==null&&ne(_,se.startTime-P)}}var O=!1,b=-1,T=5,$=-1;function M(){return!(n.unstable_now()-$P&&M());){var de=S.callback;if(typeof de=="function"){S.callback=null,q=S.priorityLevel;var R=de(S.expirationTime<=P);if(P=n.unstable_now(),typeof R=="function"){S.callback=R,E(P),se=!0;break t}S===u(p)&&l(p),E(P)}else l(p);S=u(p)}if(S!==null)se=!0;else{var z=u(m);z!==null&&ne(_,z.startTime-P),se=!1}}break e}finally{S=null,q=re,C=!1}se=void 0}}finally{se?G():O=!1}}}var G;if(typeof g=="function")G=function(){g(j)};else if(typeof MessageChannel<"u"){var X=new MessageChannel,W=X.port2;X.port1.onmessage=j,G=function(){W.postMessage(null)}}else G=function(){y(j,0)};function J(){O||(O=!0,G())}function ne(P,se){b=y(function(){P(n.unstable_now())},se)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(P){P.callback=null},n.unstable_continueExecution=function(){U||C||(U=!0,J())},n.unstable_forceFrameRate=function(P){0>P||125de?(P.sortIndex=re,i(m,P),u(p)===null&&P===u(m)&&(D?(A(b),b=-1):D=!0,ne(_,re-de))):(P.sortIndex=R,i(p,P),U||C||(U=!0,J())),P},n.unstable_shouldYield=M,n.unstable_wrapCallback=function(P){var se=q;return function(){var re=q;q=se;try{return P.apply(this,arguments)}finally{q=re}}}}(Gf)),Gf}var bg;function ZE(){return bg||(bg=1,kf.exports=QE()),kf.exports}var Yf={exports:{}},wt={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Dp;function sb(){if(Dp)return bt;Dp=1;var r=jc();function i(m){var y="https://react.dev/errors/"+m;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),gf.exports=sb(),gf.exports}/** + */var Eg;function JE(){if(Eg)return wt;Eg=1;var n=hd();function i(p){var m="https://react.dev/errors/"+p;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),Yf.exports=JE(),Yf.exports}/** * @license React * react-dom-client.production.js * @@ -38,27 +38,27 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var qp;function ub(){if(qp)return $i;qp=1;var r=ib(),i=jc(),u=lb();function l(e){var t="https://react.dev/errors/"+e;if(1)":-1s||I[a]!==J[s]){var fe=` -`+I[a].replace(" at new "," at ");return e.displayName&&fe.includes("")&&(fe=fe.replace("",e.displayName)),fe}while(1<=a&&0<=s);break}}}finally{F=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?W(n):""}function P(e){switch(e.tag){case 26:case 27:case 5:return W(e.type);case 16:return W("Lazy");case 13:return W("Suspense");case 19:return W("SuspenseList");case 0:case 15:return e=ne(e.type,!1),e;case 11:return e=ne(e.type.render,!1),e;case 1:return e=ne(e.type,!0),e;default:return""}}function ue(e){try{var t="";do t+=P(e),e=e.return;while(e);return t}catch(n){return` -Error generating stack: `+n.message+` -`+n.stack}}function re(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function de(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function R(e){if(re(e)!==e)throw Error(l(188))}function z(e){var t=e.alternate;if(!t){if(t=re(e),t===null)throw Error(l(188));return t!==e?null:e}for(var n=e,a=t;;){var s=n.return;if(s===null)break;var f=s.alternate;if(f===null){if(a=s.return,a!==null){n=a;continue}break}if(s.child===f.child){for(f=s.child;f;){if(f===n)return R(s),e;if(f===a)return R(s),t;f=f.sibling}throw Error(l(188))}if(n.return!==a.return)n=s,a=f;else{for(var _=!1,U=s.child;U;){if(U===n){_=!0,n=s,a=f;break}if(U===a){_=!0,a=s,n=f;break}U=U.sibling}if(!_){for(U=f.child;U;){if(U===n){_=!0,n=f,a=s;break}if(U===a){_=!0,a=f,n=s;break}U=U.sibling}if(!_)throw Error(l(189))}}if(n.alternate!==a)throw Error(l(190))}if(n.tag!==3)throw Error(l(188));return n.stateNode.current===n?e:t}function K(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=K(e),t!==null)return t;e=e.sibling}return null}var k=Array.isArray,T=u.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,H={pending:!1,data:null,method:null,action:null},te=[],pe=-1;function ae(e){return{current:e}}function M(e){0>pe||(e.current=te[pe],te[pe]=null,pe--)}function B(e,t){pe++,te[pe]=e.current,e.current=t}var q=ae(null),G=ae(null),X=ae(null),se=ae(null);function me(e,t){switch(B(X,t),B(G,e),B(q,null),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)&&(t=t.namespaceURI)?ep(t):0;break;default:if(e=e===8?t.parentNode:t,t=e.tagName,e=e.namespaceURI)e=ep(e),t=tp(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}M(q),B(q,t)}function ye(){M(q),M(G),M(X)}function Ae(e){e.memoizedState!==null&&B(se,e);var t=q.current,n=tp(t,e.type);t!==n&&(B(G,e),B(q,n))}function Ie(e){G.current===e&&(M(q),M(G)),se.current===e&&(M(se),vi._currentValue=H)}var Ue=Object.prototype.hasOwnProperty,Le=r.unstable_scheduleCallback,Re=r.unstable_cancelCallback,He=r.unstable_shouldYield,tt=r.unstable_requestPaint,dt=r.unstable_now,Aa=r.unstable_getCurrentPriorityLevel,Un=r.unstable_ImmediatePriority,xr=r.unstable_UserBlockingPriority,cr=r.unstable_NormalPriority,Li=r.unstable_LowPriority,Vi=r.unstable_IdlePriority,Lv=r.log,Vv=r.unstable_setDisableYieldValue,Ra=null,Nt=null;function xv(e){if(Nt&&typeof Nt.onCommitFiberRoot=="function")try{Nt.onCommitFiberRoot(Ra,e,void 0,(e.current.flags&128)===128)}catch{}}function Ln(e){if(typeof Lv=="function"&&Vv(e),Nt&&typeof Nt.setStrictMode=="function")try{Nt.setStrictMode(Ra,e)}catch{}}var jt=Math.clz32?Math.clz32:Gv,Bv=Math.log,Hv=Math.LN2;function Gv(e){return e>>>=0,e===0?32:31-(Bv(e)/Hv|0)|0}var xi=128,Bi=4194304;function dr(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194176;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Hi(e,t){var n=e.pendingLanes;if(n===0)return 0;var a=0,s=e.suspendedLanes,f=e.pingedLanes,_=e.warmLanes;e=e.finishedLanes!==0;var U=n&134217727;return U!==0?(n=U&~s,n!==0?a=dr(n):(f&=U,f!==0?a=dr(f):e||(_=U&~_,_!==0&&(a=dr(_))))):(U=n&~s,U!==0?a=dr(U):f!==0?a=dr(f):e||(_=n&~_,_!==0&&(a=dr(_)))),a===0?0:t!==0&&t!==a&&!(t&s)&&(s=a&-a,_=t&-t,s>=_||s===32&&(_&4194176)!==0)?t:a}function Ta(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Iv(e,t){switch(e){case 1:case 2:case 4:case 8:return t+250;case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Pc(){var e=xi;return xi<<=1,!(xi&4194176)&&(xi=128),e}function Kc(){var e=Bi;return Bi<<=1,!(Bi&62914560)&&(Bi=4194304),e}function iu(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Na(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Yv(e,t,n,a,s,f){var _=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var U=e.entanglements,I=e.expirationTimes,J=e.hiddenUpdates;for(n=_&~n;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Xv=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),td={},nd={};function Qv(e){return Ue.call(nd,e)?!0:Ue.call(td,e)?!1:Xv.test(e)?nd[e]=!0:(td[e]=!0,!1)}function Gi(e,t,n){if(Qv(t))if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var a=t.toLowerCase().slice(0,5);if(a!=="data-"&&a!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+n)}}function Ii(e,t,n){if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+n)}}function pn(e,t,n,a){if(a===null)e.removeAttribute(n);else{switch(typeof a){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(n);return}e.setAttributeNS(t,n,""+a)}}function Vt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function rd(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Zv(e){var t=rd(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var s=n.get,f=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(_){a=""+_,f.call(this,_)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(_){a=""+_},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Yi(e){e._valueTracker||(e._valueTracker=Zv(e))}function ad(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),a="";return e&&(a=rd(e)?e.checked?"true":"false":e.value),e=a,e!==n?(t.setValue(e),!0):!1}function ki(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Jv=/[\n"\\]/g;function xt(e){return e.replace(Jv,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function uu(e,t,n,a,s,f,_,U){e.name="",_!=null&&typeof _!="function"&&typeof _!="symbol"&&typeof _!="boolean"?e.type=_:e.removeAttribute("type"),t!=null?_==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Vt(t)):e.value!==""+Vt(t)&&(e.value=""+Vt(t)):_!=="submit"&&_!=="reset"||e.removeAttribute("value"),t!=null?ou(e,_,Vt(t)):n!=null?ou(e,_,Vt(n)):a!=null&&e.removeAttribute("value"),s==null&&f!=null&&(e.defaultChecked=!!f),s!=null&&(e.checked=s&&typeof s!="function"&&typeof s!="symbol"),U!=null&&typeof U!="function"&&typeof U!="symbol"&&typeof U!="boolean"?e.name=""+Vt(U):e.removeAttribute("name")}function id(e,t,n,a,s,f,_,U){if(f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"&&(e.type=f),t!=null||n!=null){if(!(f!=="submit"&&f!=="reset"||t!=null))return;n=n!=null?""+Vt(n):"",t=t!=null?""+Vt(t):n,U||t===e.value||(e.value=t),e.defaultValue=t}a=a??s,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=U?e.checked:!!a,e.defaultChecked=!!a,_!=null&&typeof _!="function"&&typeof _!="symbol"&&typeof _!="boolean"&&(e.name=_)}function ou(e,t,n){t==="number"&&ki(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Yr(e,t,n,a){if(e=e.options,t){t={};for(var s=0;s=Ua),vd=" ",bd=!1;function Ed(e,t){switch(e){case"keyup":return O0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function _d(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Xr=!1;function R0(e,t){switch(e){case"compositionend":return _d(t);case"keypress":return t.which!==32?null:(bd=!0,vd);case"textInput":return e=t.data,e===vd&&bd?null:e;default:return null}}function T0(e,t){if(Xr)return e==="compositionend"||!Eu&&Ed(e,t)?(e=dd(),Ki=pu=xn=null,Xr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=a}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Nd(n)}}function Dd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Dd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Md(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ki(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ki(e.document)}return t}function wu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function U0(e,t){var n=Md(t);t=e.focusedElem;var a=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Dd(t.ownerDocument.documentElement,t)){if(a!==null&&wu(t)){if(e=a.start,n=a.end,n===void 0&&(n=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(n,t.value.length);else if(n=(e=t.ownerDocument||document)&&e.defaultView||window,n.getSelection){n=n.getSelection();var s=t.textContent.length,f=Math.min(a.start,s);a=a.end===void 0?f:Math.min(a.end,s),!n.extend&&f>a&&(s=a,a=f,f=s),s=jd(t,f);var _=jd(t,a);s&&_&&(n.rangeCount!==1||n.anchorNode!==s.node||n.anchorOffset!==s.offset||n.focusNode!==_.node||n.focusOffset!==_.offset)&&(e=e.createRange(),e.setStart(s.node,s.offset),n.removeAllRanges(),f>a?(n.addRange(e),n.extend(_.node,_.offset)):(e.setEnd(_.node,_.offset),n.addRange(e)))}}for(e=[],n=t;n=n.parentNode;)n.nodeType===1&&e.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,Qr=null,$u=null,Ba=null,Ou=!1;function qd(e,t,n){var a=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ou||Qr==null||Qr!==ki(a)||(a=Qr,"selectionStart"in a&&wu(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Ba&&xa(Ba,a)||(Ba=a,a=Cs($u,"onSelect"),0>=_,s-=_,yn=1<<32-jt(t)+s|n<_e?(ct=Ee,Ee=null):ct=Ee.sibling;var xe=le(ee,Ee,ie[_e],ce);if(xe===null){Ee===null&&(Ee=ct);break}e&&Ee&&xe.alternate===null&&t(ee,Ee),Z=f(xe,Z,_e),je===null?ge=xe:je.sibling=xe,je=xe,Ee=ct}if(_e===ie.length)return n(ee,Ee),Ve&&br(ee,_e),ge;if(Ee===null){for(;_e_e?(ct=Ee,Ee=null):ct=Ee.sibling;var ir=le(ee,Ee,xe.value,ce);if(ir===null){Ee===null&&(Ee=ct);break}e&&Ee&&ir.alternate===null&&t(ee,Ee),Z=f(ir,Z,_e),je===null?ge=ir:je.sibling=ir,je=ir,Ee=ct}if(xe.done)return n(ee,Ee),Ve&&br(ee,_e),ge;if(Ee===null){for(;!xe.done;_e++,xe=ie.next())xe=he(ee,xe.value,ce),xe!==null&&(Z=f(xe,Z,_e),je===null?ge=xe:je.sibling=xe,je=xe);return Ve&&br(ee,_e),ge}for(Ee=a(Ee);!xe.done;_e++,xe=ie.next())xe=oe(Ee,ee,_e,xe.value,ce),xe!==null&&(e&&xe.alternate!==null&&Ee.delete(xe.key===null?_e:xe.key),Z=f(xe,Z,_e),je===null?ge=xe:je.sibling=xe,je=xe);return e&&Ee.forEach(function(eb){return t(ee,eb)}),Ve&&br(ee,_e),ge}function We(ee,Z,ie,ce){if(typeof ie=="object"&&ie!==null&&ie.type===m&&ie.key===null&&(ie=ie.props.children),typeof ie=="object"&&ie!==null){switch(ie.$$typeof){case d:e:{for(var ge=ie.key;Z!==null;){if(Z.key===ge){if(ge=ie.type,ge===m){if(Z.tag===7){n(ee,Z.sibling),ce=s(Z,ie.props.children),ce.return=ee,ee=ce;break e}}else if(Z.elementType===ge||typeof ge=="object"&&ge!==null&&ge.$$typeof===p&&Zd(ge)===Z.type){n(ee,Z.sibling),ce=s(Z,ie.props),Ka(ce,ie),ce.return=ee,ee=ce;break e}n(ee,Z);break}else t(ee,Z);Z=Z.sibling}ie.type===m?(ce=jr(ie.props.children,ee.mode,ce,ie.key),ce.return=ee,ee=ce):(ce=$s(ie.type,ie.key,ie.props,null,ee.mode,ce),Ka(ce,ie),ce.return=ee,ee=ce)}return _(ee);case h:e:{for(ge=ie.key;Z!==null;){if(Z.key===ge)if(Z.tag===4&&Z.stateNode.containerInfo===ie.containerInfo&&Z.stateNode.implementation===ie.implementation){n(ee,Z.sibling),ce=s(Z,ie.children||[]),ce.return=ee,ee=ce;break e}else{n(ee,Z);break}else t(ee,Z);Z=Z.sibling}ce=To(ie,ee.mode,ce),ce.return=ee,ee=ce}return _(ee);case p:return ge=ie._init,ie=ge(ie._payload),We(ee,Z,ie,ce)}if(k(ie))return be(ee,Z,ie,ce);if(v(ie)){if(ge=v(ie),typeof ge!="function")throw Error(l(150));return ie=ge.call(ie),$e(ee,Z,ie,ce)}if(typeof ie.then=="function")return We(ee,Z,is(ie),ce);if(ie.$$typeof===V)return We(ee,Z,_s(ee,ie),ce);ss(ee,ie)}return typeof ie=="string"&&ie!==""||typeof ie=="number"||typeof ie=="bigint"?(ie=""+ie,Z!==null&&Z.tag===6?(n(ee,Z.sibling),ce=s(Z,ie),ce.return=ee,ee=ce):(n(ee,Z),ce=Ro(ie,ee.mode,ce),ce.return=ee,ee=ce),_(ee)):n(ee,Z)}return function(ee,Z,ie,ce){try{Pa=0;var ge=We(ee,Z,ie,ce);return ta=null,ge}catch(Ee){if(Ee===Ya)throw Ee;var je=Kt(29,Ee,null,ee.mode);return je.lanes=ce,je.return=ee,je}finally{}}}var _r=Jd(!0),Fd=Jd(!1),na=ae(null),ls=ae(0);function Wd(e,t){e=Tn,B(ls,e),B(na,t),Tn=e|t.baseLanes}function qu(){B(ls,Tn),B(na,na.current)}function Cu(){Tn=ls.current,M(na),M(ls)}var Yt=ae(null),on=null;function Hn(e){var t=e.alternate;B(st,st.current&1),B(Yt,e),on===null&&(t===null||na.current!==null||t.memoizedState!==null)&&(on=e)}function eh(e){if(e.tag===22){if(B(st,st.current),B(Yt,e),on===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(on=e)}}else Gn()}function Gn(){B(st,st.current),B(Yt,Yt.current)}function vn(e){M(Yt),on===e&&(on=null),M(st)}var st=ae(0);function us(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var H0=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(n,a){e.push(a)}};this.abort=function(){t.aborted=!0,e.forEach(function(n){return n()})}},G0=r.unstable_scheduleCallback,I0=r.unstable_NormalPriority,lt={$$typeof:V,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function zu(){return{controller:new H0,data:new Map,refCount:0}}function Xa(e){e.refCount--,e.refCount===0&&G0(I0,function(){e.controller.abort()})}var Qa=null,Uu=0,ra=0,aa=null;function Y0(e,t){if(Qa===null){var n=Qa=[];Uu=0,ra=Io(),aa={status:"pending",value:void 0,then:function(a){n.push(a)}}}return Uu++,t.then(th,th),t}function th(){if(--Uu===0&&Qa!==null){aa!==null&&(aa.status="fulfilled");var e=Qa;Qa=null,ra=0,aa=null;for(var t=0;tf?f:8;var _=D.T,U={};D.T=U,Wu(e,!1,t,n);try{var I=s(),J=D.S;if(J!==null&&J(U,I),I!==null&&typeof I=="object"&&typeof I.then=="function"){var fe=k0(I,a);Fa(e,t,fe,zt(e))}else Fa(e,t,a,zt(e))}catch(he){Fa(e,t,{then:function(){},status:"rejected",reason:he},zt())}finally{T.p=f,D.T=_}}function Z0(){}function Ju(e,t,n,a){if(e.tag!==5)throw Error(l(476));var s=Mh(e).queue;Dh(e,s,t,H,n===null?Z0:function(){return qh(e),n(a)})}function Mh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:H,baseState:H,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bn,lastRenderedState:H},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function qh(e){var t=Mh(e).next.queue;Fa(e,t,{},zt())}function Fu(){return vt(vi)}function Ch(){return at().memoizedState}function zh(){return at().memoizedState}function J0(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=zt();e=Kn(n);var a=Xn(t,e,n);a!==null&&(_t(a,t,n),ti(a,t,n)),t={cache:zu()},e.payload=t;return}t=t.return}}function F0(e,t,n){var a=zt();n={lane:a,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},gs(e)?Lh(t,n):(n=Tu(e,t,n,a),n!==null&&(_t(n,e,a),Vh(n,t,a)))}function Uh(e,t,n){var a=zt();Fa(e,t,n,a)}function Fa(e,t,n,a){var s={lane:a,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(gs(e))Lh(t,s);else{var f=e.alternate;if(e.lanes===0&&(f===null||f.lanes===0)&&(f=t.lastRenderedReducer,f!==null))try{var _=t.lastRenderedState,U=f(_,n);if(s.hasEagerState=!0,s.eagerState=U,Dt(U,_))return es(e,t,s,0),Ke===null&&Wi(),!1}catch{}finally{}if(n=Tu(e,t,s,a),n!==null)return _t(n,e,a),Vh(n,t,a),!0}return!1}function Wu(e,t,n,a){if(a={lane:2,revertLane:Io(),action:a,hasEagerState:!1,eagerState:null,next:null},gs(e)){if(t)throw Error(l(479))}else t=Tu(e,n,a,2),t!==null&&_t(t,e,2)}function gs(e){var t=e.alternate;return e===Te||t!==null&&t===Te}function Lh(e,t){ia=fs=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Vh(e,t,n){if(n&4194176){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,Qc(e,n)}}var fn={readContext:vt,use:hs,useCallback:nt,useContext:nt,useEffect:nt,useImperativeHandle:nt,useLayoutEffect:nt,useInsertionEffect:nt,useMemo:nt,useReducer:nt,useRef:nt,useState:nt,useDebugValue:nt,useDeferredValue:nt,useTransition:nt,useSyncExternalStore:nt,useId:nt};fn.useCacheRefresh=nt,fn.useMemoCache=nt,fn.useHostTransitionStatus=nt,fn.useFormState=nt,fn.useActionState=nt,fn.useOptimistic=nt;var $r={readContext:vt,use:hs,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:wh,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,ps(4194308,4,Ah.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ps(4194308,4,e,t)},useInsertionEffect:function(e,t){ps(4,2,e,t)},useMemo:function(e,t){var n=Tt();t=t===void 0?null:t;var a=e();if(wr){Ln(!0);try{e()}finally{Ln(!1)}}return n.memoizedState=[a,t],a},useReducer:function(e,t,n){var a=Tt();if(n!==void 0){var s=n(t);if(wr){Ln(!0);try{n(t)}finally{Ln(!1)}}}else s=t;return a.memoizedState=a.baseState=s,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:s},a.queue=e,e=e.dispatch=F0.bind(null,Te,e),[a.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:function(e){e=Pu(e);var t=e.queue,n=Uh.bind(null,Te,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Qu,useDeferredValue:function(e,t){var n=Tt();return Zu(n,e,t)},useTransition:function(){var e=Pu(!1);return e=Dh.bind(null,Te,e.queue,!0,!1),Tt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var a=Te,s=Tt();if(Ve){if(n===void 0)throw Error(l(407));n=n()}else{if(n=t(),Ke===null)throw Error(l(349));Ce&60||lh(a,t,n)}s.memoizedState=n;var f={value:n,getSnapshot:t};return s.queue=f,wh(oh.bind(null,a,f,e),[e]),a.flags|=2048,la(9,uh.bind(null,a,f,n,t),{destroy:void 0},null),n},useId:function(){var e=Tt(),t=Ke.identifierPrefix;if(Ve){var n=gn,a=yn;n=(a&~(1<<32-jt(a)-1)).toString(32)+n,t=":"+t+"R"+n,n=cs++,0 title"))),pt(f,a,n),f[gt]=e,ut(f),a=f;break e;case"link":var _=cp("link","href",s).get(a+(n.href||""));if(_){for(var U=0;U<_.length;U++)if(f=_[U],f.getAttribute("href")===(n.href==null?null:n.href)&&f.getAttribute("rel")===(n.rel==null?null:n.rel)&&f.getAttribute("title")===(n.title==null?null:n.title)&&f.getAttribute("crossorigin")===(n.crossOrigin==null?null:n.crossOrigin)){_.splice(U,1);break t}}f=s.createElement(a),pt(f,a,n),s.head.appendChild(f);break;case"meta":if(_=cp("meta","content",s).get(a+(n.content||""))){for(U=0;U<_.length;U++)if(f=_[U],f.getAttribute("content")===(n.content==null?null:""+n.content)&&f.getAttribute("name")===(n.name==null?null:n.name)&&f.getAttribute("property")===(n.property==null?null:n.property)&&f.getAttribute("http-equiv")===(n.httpEquiv==null?null:n.httpEquiv)&&f.getAttribute("charset")===(n.charSet==null?null:n.charSet)){_.splice(U,1);break t}}f=s.createElement(a),pt(f,a,n),s.head.appendChild(f);break;default:throw Error(l(468,a))}f[gt]=e,ut(f),a=f}e.stateNode=a}else dp(s,e.type,e.stateNode);else e.stateNode=fp(s,a,e.memoizedProps);else f!==a?(f===null?n.stateNode!==null&&(n=n.stateNode,n.parentNode.removeChild(n)):f.count--,a===null?dp(s,e.type,e.stateNode):fp(s,a,e.memoizedProps)):a===null&&e.stateNode!==null&&dm(e,e.memoizedProps,n.memoizedProps)}break;case 27:if(a&4&&e.alternate===null){s=e.stateNode,f=e.memoizedProps;try{for(var I=s.firstChild;I;){var J=I.nextSibling,fe=I.nodeName;I[ja]||fe==="HEAD"||fe==="BODY"||fe==="SCRIPT"||fe==="STYLE"||fe==="LINK"&&I.rel.toLowerCase()==="stylesheet"||s.removeChild(I),I=J}for(var he=e.type,le=s.attributes;le.length;)s.removeAttributeNode(le[0]);pt(s,he,f),s[gt]=e,s[At]=f}catch(be){Pe(e,e.return,be)}}case 5:if(kt(t,e),Pt(e),a&512&&(Je||n===null||Mt(n,n.return)),e.flags&32){s=e.stateNode;try{kr(s,"")}catch(be){Pe(e,e.return,be)}}a&4&&e.stateNode!=null&&(s=e.memoizedProps,dm(e,s,n!==null?n.memoizedProps:s)),a&1024&&(So=!0);break;case 6:if(kt(t,e),Pt(e),a&4){if(e.stateNode===null)throw Error(l(162));a=e.memoizedProps,n=e.stateNode;try{n.nodeValue=a}catch(be){Pe(e,e.return,be)}}break;case 3:if(xs=null,s=Wt,Wt=Ls(t.containerInfo),kt(t,e),Wt=s,Pt(e),a&4&&n!==null&&n.memoizedState.isDehydrated)try{Si(t.containerInfo)}catch(be){Pe(e,e.return,be)}So&&(So=!1,_m(e));break;case 4:a=Wt,Wt=Ls(e.stateNode.containerInfo),kt(t,e),Pt(e),Wt=a;break;case 12:kt(t,e),Pt(e);break;case 13:kt(t,e),Pt(e),e.child.flags&8192&&e.memoizedState!==null!=(n!==null&&n.memoizedState!==null)&&(Mo=dt()),a&4&&(a=e.updateQueue,a!==null&&(e.updateQueue=null,wo(e,a)));break;case 22:if(a&512&&(Je||n===null||Mt(n,n.return)),I=e.memoizedState!==null,J=n!==null&&n.memoizedState!==null,fe=wn,he=Je,wn=fe||I,Je=he||J,kt(t,e),Je=he,wn=fe,Pt(e),t=e.stateNode,t._current=e,t._visibility&=-3,t._visibility|=t._pendingVisibility&2,a&8192&&(t._visibility=I?t._visibility&-2:t._visibility|1,I&&(t=wn||Je,n===null||J||t||ua(e)),e.memoizedProps===null||e.memoizedProps.mode!=="manual"))e:for(n=null,t=e;;){if(t.tag===5||t.tag===26||t.tag===27){if(n===null){J=n=t;try{if(s=J.stateNode,I)f=s.style,typeof f.setProperty=="function"?f.setProperty("display","none","important"):f.display="none";else{_=J.stateNode,U=J.memoizedProps.style;var oe=U!=null&&U.hasOwnProperty("display")?U.display:null;_.style.display=oe==null||typeof oe=="boolean"?"":(""+oe).trim()}}catch(be){Pe(J,J.return,be)}}}else if(t.tag===6){if(n===null){J=t;try{J.stateNode.nodeValue=I?"":J.memoizedProps}catch(be){Pe(J,J.return,be)}}}else if((t.tag!==22&&t.tag!==23||t.memoizedState===null||t===e)&&t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;t.sibling===null;){if(t.return===null||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}a&4&&(a=e.updateQueue,a!==null&&(n=a.retryQueue,n!==null&&(a.retryQueue=null,wo(e,n))));break;case 19:kt(t,e),Pt(e),a&4&&(a=e.updateQueue,a!==null&&(e.updateQueue=null,wo(e,a)));break;case 21:break;default:kt(t,e),Pt(e)}}function Pt(e){var t=e.flags;if(t&2){try{if(e.tag!==27){e:{for(var n=e.return;n!==null;){if(hm(n)){var a=n;break e}n=n.return}throw Error(l(160))}switch(a.tag){case 27:var s=a.stateNode,f=Eo(e);Ss(e,f,s);break;case 5:var _=a.stateNode;a.flags&32&&(kr(_,""),a.flags&=-33);var U=Eo(e);Ss(e,U,_);break;case 3:case 4:var I=a.stateNode.containerInfo,J=Eo(e);_o(e,J,I);break;default:throw Error(l(161))}}}catch(fe){Pe(e,e.return,fe)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function _m(e){if(e.subtreeFlags&1024)for(e=e.child;e!==null;){var t=e;_m(t),t.tag===5&&t.flags&1024&&t.stateNode.reset(),e=e.sibling}}function On(e,t){if(t.subtreeFlags&8772)for(t=t.child;t!==null;)ym(e,t.alternate,t),t=t.sibling}function ua(e){for(e=e.child;e!==null;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:Qn(4,t,t.return),ua(t);break;case 1:Mt(t,t.return);var n=t.stateNode;typeof n.componentWillUnmount=="function"&&fm(t,t.return,n),ua(t);break;case 26:case 27:case 5:Mt(t,t.return),ua(t);break;case 22:Mt(t,t.return),t.memoizedState===null&&ua(t);break;default:ua(t)}e=e.sibling}}function Zn(e,t,n){for(n=n&&(t.subtreeFlags&8772)!==0,t=t.child;t!==null;){var a=t.alternate,s=e,f=t,_=f.flags;switch(f.tag){case 0:case 11:case 15:Zn(s,f,n),ai(4,f);break;case 1:if(Zn(s,f,n),a=f,s=a.stateNode,typeof s.componentDidMount=="function")try{s.componentDidMount()}catch(J){Pe(a,a.return,J)}if(a=f,s=a.updateQueue,s!==null){var U=a.stateNode;try{var I=s.shared.hiddenCallbacks;if(I!==null)for(s.shared.hiddenCallbacks=null,s=0;s<\/script>",e=e.removeChild(e.firstChild);break;case"select":e=typeof a.is=="string"?s.createElement("select",{is:a.is}):s.createElement("select"),a.multiple?e.multiple=!0:a.size&&(e.size=a.size);break;default:e=typeof a.is=="string"?s.createElement(n,{is:a.is}):s.createElement(n)}}e[gt]=t,e[At]=a;e:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)e.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break e;for(;s.sibling===null;){if(s.return===null||s.return===t)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=e;e:switch(pt(e,n,a),n){case"button":case"input":case"select":case"textarea":e=!!a.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&An(t)}}return Qe(t),t.flags&=-16777217,null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&An(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(l(166));if(e=X.current,Ha(t)){if(e=t.stateNode,n=t.memoizedProps,a=null,s=Et,s!==null)switch(s.tag){case 27:case 5:a=s.memoizedProps}e[gt]=t,e=!!(e.nodeValue===n||a!==null&&a.suppressHydrationWarning===!0||Wm(e.nodeValue,n)),e||Er(t)}else e=Us(e).createTextNode(a),e[gt]=t,t.stateNode=e}return Qe(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(s=Ha(t),a!==null&&a.dehydrated!==null){if(e===null){if(!s)throw Error(l(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(l(317));s[gt]=t}else Ga(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Qe(t),s=!1}else Ft!==null&&(Uo(Ft),Ft=null),s=!0;if(!s)return t.flags&256?(vn(t),t):(vn(t),null)}if(vn(t),t.flags&128)return t.lanes=n,t;if(n=a!==null,e=e!==null&&e.memoizedState!==null,n){a=t.child,s=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(s=a.alternate.memoizedState.cachePool.pool);var f=null;a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(f=a.memoizedState.cachePool.pool),f!==s&&(a.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),Os(t,t.updateQueue),Qe(t),null;case 4:return ye(),e===null&&Ko(t.stateNode.containerInfo),Qe(t),null;case 10:return Sn(t.type),Qe(t),null;case 19:if(M(st),s=t.memoizedState,s===null)return Qe(t),null;if(a=(t.flags&128)!==0,f=s.rendering,f===null)if(a)ui(s,!1);else{if(Fe!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(f=us(e),f!==null){for(t.flags|=128,ui(s,!1),e=f.updateQueue,t.updateQueue=e,Os(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Rm(n,e),n=n.sibling;return B(st,st.current&1|2),t.child}e=e.sibling}s.tail!==null&&dt()>As&&(t.flags|=128,a=!0,ui(s,!1),t.lanes=4194304)}else{if(!a)if(e=us(f),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Os(t,e),ui(s,!0),s.tail===null&&s.tailMode==="hidden"&&!f.alternate&&!Ve)return Qe(t),null}else 2*dt()-s.renderingStartTime>As&&n!==536870912&&(t.flags|=128,a=!0,ui(s,!1),t.lanes=4194304);s.isBackwards?(f.sibling=t.child,t.child=f):(e=s.last,e!==null?e.sibling=f:t.child=f,s.last=f)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=dt(),t.sibling=null,e=st.current,B(st,a?e&1|2:e&1),t):(Qe(t),null);case 22:case 23:return vn(t),Cu(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?n&536870912&&!(t.flags&128)&&(Qe(t),t.subtreeFlags&6&&(t.flags|=8192)):Qe(t),n=t.updateQueue,n!==null&&Os(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==n&&(t.flags|=2048),e!==null&&M(Sr),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Sn(lt),Qe(t),null;case 25:return null}throw Error(l(156,t.tag))}function i1(e,t){switch(ju(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Sn(lt),ye(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ie(t),null;case 13:if(vn(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(l(340));Ga()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return M(st),null;case 4:return ye(),null;case 10:return Sn(t.type),null;case 22:case 23:return vn(t),Cu(),e!==null&&M(Sr),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Sn(lt),null;case 25:return null;default:return null}}function jm(e,t){switch(ju(t),t.tag){case 3:Sn(lt),ye();break;case 26:case 27:case 5:Ie(t);break;case 4:ye();break;case 13:vn(t);break;case 19:M(st);break;case 10:Sn(t.type);break;case 22:case 23:vn(t),Cu(),e!==null&&M(Sr);break;case 24:Sn(lt)}}var s1={getCacheForType:function(e){var t=vt(lt),n=t.data.get(e);return n===void 0&&(n=e(),t.data.set(e,n)),n}},l1=typeof WeakMap=="function"?WeakMap:Map,Ze=0,Ke=null,De=null,Ce=0,Xe=0,Ct=null,Rn=!1,ca=!1,No=!1,Tn=0,Fe=0,Wn=0,Dr=0,jo=0,Xt=0,da=0,oi=null,cn=null,Do=!1,Mo=0,As=1/0,Rs=null,er=null,Ts=!1,Mr=null,fi=0,qo=0,Co=null,ci=0,zo=null;function zt(){if(Ze&2&&Ce!==0)return Ce&-Ce;if(D.T!==null){var e=ra;return e!==0?e:Io()}return Jc()}function Dm(){Xt===0&&(Xt=!(Ce&536870912)||Ve?Pc():536870912);var e=Yt.current;return e!==null&&(e.flags|=32),Xt}function _t(e,t,n){(e===Ke&&Xe===2||e.cancelPendingCommit!==null)&&(ha(e,0),Nn(e,Ce,Xt,!1)),Na(e,n),(!(Ze&2)||e!==Ke)&&(e===Ke&&(!(Ze&2)&&(Dr|=n),Fe===4&&Nn(e,Ce,Xt,!1)),dn(e))}function Mm(e,t,n){if(Ze&6)throw Error(l(327));var a=!n&&(t&60)===0&&(t&e.expiredLanes)===0||Ta(e,t),s=a?f1(e,t):xo(e,t,!0),f=a;do{if(s===0){ca&&!a&&Nn(e,t,0,!1);break}else if(s===6)Nn(e,t,0,!Rn);else{if(n=e.current.alternate,f&&!u1(n)){s=xo(e,t,!1),f=!1;continue}if(s===2){if(f=t,e.errorRecoveryDisabledLanes&f)var _=0;else _=e.pendingLanes&-536870913,_=_!==0?_:_&536870912?536870912:0;if(_!==0){t=_;e:{var U=e;s=oi;var I=U.current.memoizedState.isDehydrated;if(I&&(ha(U,_).flags|=256),_=xo(U,_,!1),_!==2){if(No&&!I){U.errorRecoveryDisabledLanes|=f,Dr|=f,s=4;break e}f=cn,cn=s,f!==null&&Uo(f)}s=_}if(f=!1,s!==2)continue}}if(s===1){ha(e,0),Nn(e,t,0,!0);break}e:{switch(a=e,s){case 0:case 1:throw Error(l(345));case 4:if((t&4194176)===t){Nn(a,t,Xt,!Rn);break e}break;case 2:cn=null;break;case 3:case 5:break;default:throw Error(l(329))}if(a.finishedWork=n,a.finishedLanes=t,(t&62914560)===t&&(f=Mo+300-dt(),10n?32:n,D.T=null,Mr===null)var f=!1;else{n=Co,Co=null;var _=Mr,U=fi;if(Mr=null,fi=0,Ze&6)throw Error(l(331));var I=Ze;if(Ze|=4,Om(_.current),Sm(_,_.current,U,n),Ze=I,di(0,!1),Nt&&typeof Nt.onPostCommitFiberRoot=="function")try{Nt.onPostCommitFiberRoot(Ra,_)}catch{}f=!0}return f}finally{T.p=s,D.T=a,Hm(e,t)}}return!1}function Gm(e,t,n){t=Ht(n,t),t=no(e.stateNode,t,2),e=Xn(e,t,2),e!==null&&(Na(e,2),dn(e))}function Pe(e,t,n){if(e.tag===3)Gm(e,e,n);else for(;t!==null;){if(t.tag===3){Gm(t,e,n);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(er===null||!er.has(a))){e=Ht(n,e),n=kh(2),a=Xn(t,n,2),a!==null&&(Ph(n,a,t,e),Na(a,2),dn(a));break}}t=t.return}}function Bo(e,t,n){var a=e.pingCache;if(a===null){a=e.pingCache=new l1;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(n)||(No=!0,s.add(n),e=h1.bind(null,e,t,n),t.then(e,e))}function h1(e,t,n){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Ke===e&&(Ce&n)===n&&(Fe===4||Fe===3&&(Ce&62914560)===Ce&&300>dt()-Mo?!(Ze&2)&&ha(e,0):jo|=n,da===Ce&&(da=0)),dn(e)}function Im(e,t){t===0&&(t=Kc()),e=Bn(e,t),e!==null&&(Na(e,t),dn(e))}function m1(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Im(e,n)}function p1(e,t){var n=0;switch(e.tag){case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(n=s.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(l(314))}a!==null&&a.delete(t),Im(e,n)}function y1(e,t){return Le(e,t)}var Ds=null,ya=null,Ho=!1,Ms=!1,Go=!1,qr=0;function dn(e){e!==ya&&e.next===null&&(ya===null?Ds=ya=e:ya=ya.next=e),Ms=!0,Ho||(Ho=!0,v1(g1))}function di(e,t){if(!Go&&Ms){Go=!0;do for(var n=!1,a=Ds;a!==null;){if(e!==0){var s=a.pendingLanes;if(s===0)var f=0;else{var _=a.suspendedLanes,U=a.pingedLanes;f=(1<<31-jt(42|e)+1)-1,f&=s&~(_&~U),f=f&201326677?f&201326677|1:f?f|2:0}f!==0&&(n=!0,Pm(a,f))}else f=Ce,f=Hi(a,a===Ke?f:0),!(f&3)||Ta(a,f)||(n=!0,Pm(a,f));a=a.next}while(n);Go=!1}}function g1(){Ms=Ho=!1;var e=0;qr!==0&&(A1()&&(e=qr),qr=0);for(var t=dt(),n=null,a=Ds;a!==null;){var s=a.next,f=Ym(a,t);f===0?(a.next=null,n===null?Ds=s:n.next=s,s===null&&(ya=n)):(n=a,(e!==0||f&3)&&(Ms=!0)),a=s}di(e)}function Ym(e,t){for(var n=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,f=e.pendingLanes&-62914561;0"u"?null:document;function lp(e,t,n){var a=va;if(a&&typeof t=="string"&&t){var s=xt(t);s='link[rel="'+e+'"][href="'+s+'"]',typeof n=="string"&&(s+='[crossorigin="'+n+'"]'),sp.has(s)||(sp.add(s),e={rel:e,crossOrigin:n,href:t},a.querySelector(s)===null&&(t=a.createElement("link"),pt(t,"link",e),ut(t),a.head.appendChild(t)))}}function C1(e){jn.D(e),lp("dns-prefetch",e,null)}function z1(e,t){jn.C(e,t),lp("preconnect",e,t)}function U1(e,t,n){jn.L(e,t,n);var a=va;if(a&&e&&t){var s='link[rel="preload"][as="'+xt(t)+'"]';t==="image"&&n&&n.imageSrcSet?(s+='[imagesrcset="'+xt(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(s+='[imagesizes="'+xt(n.imageSizes)+'"]')):s+='[href="'+xt(e)+'"]';var f=s;switch(t){case"style":f=ba(e);break;case"script":f=Ea(e)}Qt.has(f)||(e=j({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),Qt.set(f,e),a.querySelector(s)!==null||t==="style"&&a.querySelector(pi(f))||t==="script"&&a.querySelector(yi(f))||(t=a.createElement("link"),pt(t,"link",e),ut(t),a.head.appendChild(t)))}}function L1(e,t){jn.m(e,t);var n=va;if(n&&e){var a=t&&typeof t.as=="string"?t.as:"script",s='link[rel="modulepreload"][as="'+xt(a)+'"][href="'+xt(e)+'"]',f=s;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":f=Ea(e)}if(!Qt.has(f)&&(e=j({rel:"modulepreload",href:e},t),Qt.set(f,e),n.querySelector(s)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(yi(f)))return}a=n.createElement("link"),pt(a,"link",e),ut(a),n.head.appendChild(a)}}}function V1(e,t,n){jn.S(e,t,n);var a=va;if(a&&e){var s=Gr(a).hoistableStyles,f=ba(e);t=t||"default";var _=s.get(f);if(!_){var U={loading:0,preload:null};if(_=a.querySelector(pi(f)))U.loading=5;else{e=j({rel:"stylesheet",href:e,"data-precedence":t},n),(n=Qt.get(f))&&nf(e,n);var I=_=a.createElement("link");ut(I),pt(I,"link",e),I._p=new Promise(function(J,fe){I.onload=J,I.onerror=fe}),I.addEventListener("load",function(){U.loading|=1}),I.addEventListener("error",function(){U.loading|=2}),U.loading|=4,Vs(_,t,a)}_={type:"stylesheet",instance:_,count:1,state:U},s.set(f,_)}}}function x1(e,t){jn.X(e,t);var n=va;if(n&&e){var a=Gr(n).hoistableScripts,s=Ea(e),f=a.get(s);f||(f=n.querySelector(yi(s)),f||(e=j({src:e,async:!0},t),(t=Qt.get(s))&&rf(e,t),f=n.createElement("script"),ut(f),pt(f,"link",e),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},a.set(s,f))}}function B1(e,t){jn.M(e,t);var n=va;if(n&&e){var a=Gr(n).hoistableScripts,s=Ea(e),f=a.get(s);f||(f=n.querySelector(yi(s)),f||(e=j({src:e,async:!0,type:"module"},t),(t=Qt.get(s))&&rf(e,t),f=n.createElement("script"),ut(f),pt(f,"link",e),n.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},a.set(s,f))}}function up(e,t,n,a){var s=(s=X.current)?Ls(s):null;if(!s)throw Error(l(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=ba(n.href),n=Gr(s).hoistableStyles,a=n.get(t),a||(a={type:"style",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=ba(n.href);var f=Gr(s).hoistableStyles,_=f.get(e);if(_||(s=s.ownerDocument||s,_={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},f.set(e,_),(f=s.querySelector(pi(e)))&&!f._p&&(_.instance=f,_.state.loading=5),Qt.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Qt.set(e,n),f||H1(s,e,n,_.state))),t&&a===null)throw Error(l(528,""));return _}if(t&&a!==null)throw Error(l(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ea(n),n=Gr(s).hoistableScripts,a=n.get(t),a||(a={type:"script",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,e))}}function ba(e){return'href="'+xt(e)+'"'}function pi(e){return'link[rel="stylesheet"]['+e+"]"}function op(e){return j({},e,{"data-precedence":e.precedence,precedence:null})}function H1(e,t,n,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),pt(t,"link",n),ut(t),e.head.appendChild(t))}function Ea(e){return'[src="'+xt(e)+'"]'}function yi(e){return"script[async]"+e}function fp(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+xt(n.href)+'"]');if(a)return t.instance=a,ut(a),a;var s=j({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),ut(a),pt(a,"style",s),Vs(a,n.precedence,e),t.instance=a;case"stylesheet":s=ba(n.href);var f=e.querySelector(pi(s));if(f)return t.state.loading|=4,t.instance=f,ut(f),f;a=op(n),(s=Qt.get(s))&&nf(a,s),f=(e.ownerDocument||e).createElement("link"),ut(f);var _=f;return _._p=new Promise(function(U,I){_.onload=U,_.onerror=I}),pt(f,"link",a),t.state.loading|=4,Vs(f,n.precedence,e),t.instance=f;case"script":return f=Ea(n.src),(s=e.querySelector(yi(f)))?(t.instance=s,ut(s),s):(a=n,(s=Qt.get(f))&&(a=j({},n),rf(a,s)),e=e.ownerDocument||e,s=e.createElement("script"),ut(s),pt(s,"link",a),e.head.appendChild(s),t.instance=s);case"void":return null;default:throw Error(l(443,t.type))}else t.type==="stylesheet"&&!(t.state.loading&4)&&(a=t.instance,t.state.loading|=4,Vs(a,n.precedence,e));return t.instance}function Vs(e,t,n){for(var a=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),s=a.length?a[a.length-1]:null,f=s,_=0;_ title"):null)}function G1(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function hp(e){return!(e.type==="stylesheet"&&!(e.state.loading&3))}var gi=null;function I1(){}function Y1(e,t,n){if(gi===null)throw Error(l(475));var a=gi;if(t.type==="stylesheet"&&(typeof n.media!="string"||matchMedia(n.media).matches!==!1)&&!(t.state.loading&4)){if(t.instance===null){var s=ba(n.href),f=e.querySelector(pi(s));if(f){e=f._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(a.count++,a=Bs.bind(a),e.then(a,a)),t.state.loading|=4,t.instance=f,ut(f);return}f=e.ownerDocument||e,n=op(n),(s=Qt.get(s))&&nf(n,s),f=f.createElement("link"),ut(f);var _=f;_._p=new Promise(function(U,I){_.onload=U,_.onerror=I}),pt(f,"link",n),t.instance=f}a.stylesheets===null&&(a.stylesheets=new Map),a.stylesheets.set(t,e),(e=t.state.preload)&&!(t.state.loading&3)&&(a.count++,t=Bs.bind(a),e.addEventListener("load",t),e.addEventListener("error",t))}}function k1(){if(gi===null)throw Error(l(475));var e=gi;return e.stylesheets&&e.count===0&&af(e,e.stylesheets),0"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),mf.exports=ub(),mf.exports}var fb=ob();const cb=Xl(fb);var db=typeof window<"u",hb=function(r,i){return db?window.matchMedia(r).matches:!1},mb=function(r,i){var u=ve.useState(hb(r)),l=u[0],c=u[1];return ve.useEffect(function(){var o=!0,d=window.matchMedia(r),h=function(){o&&c(!!d.matches)};return d.addEventListener("change",h),c(d.matches),function(){o=!1,d.removeEventListener("change",h)}},[r]),l},Cn={STATIC:"STATIC",DEFAULT:"DEFAULT",TARGETING_MATCH:"TARGETING_MATCH",SPLIT:"SPLIT",CACHED:"CACHED",DISABLED:"DISABLED",UNKNOWN:"UNKNOWN",STALE:"STALE",ERROR:"ERROR"},Vr=(r=>(r.PROVIDER_NOT_READY="PROVIDER_NOT_READY",r.PROVIDER_FATAL="PROVIDER_FATAL",r.FLAG_NOT_FOUND="FLAG_NOT_FOUND",r.PARSE_ERROR="PARSE_ERROR",r.TYPE_MISMATCH="TYPE_MISMATCH",r.TARGETING_KEY_MISSING="TARGETING_KEY_MISSING",r.INVALID_CONTEXT="INVALID_CONTEXT",r.GENERAL="GENERAL",r))(Vr||{}),pb=class sv extends Error{constructor(i,u){super(i),Object.setPrototypeOf(this,sv.prototype),this.name="OpenFeatureError",this.cause=u==null?void 0:u.cause}},$a=class lv extends pb{constructor(i,u){super(i,u),Object.setPrototypeOf(this,lv.prototype),this.name="ParseError",this.code="PARSE_ERROR"}},uv=class{error(...r){console.error(...r)}warn(...r){console.warn(...r)}info(){}debug(){}},yb=["error","warn","info","debug"],gb=class{constructor(r){this.fallbackLogger=new uv;try{for(const i of yb)if(!r[i]||typeof r[i]!="function")throw new Error(`The provided logger is missing the ${i} method.`);this.logger=r}catch(i){console.error(i),console.error("Falling back to the default logger."),this.logger=this.fallbackLogger}}error(...r){this.log("error",...r)}warn(...r){this.log("warn",...r)}info(...r){this.log("info",...r)}debug(...r){this.log("debug",...r)}log(r,...i){try{this.logger[r](...i)}catch{this.fallbackLogger[r](...i)}}},Qs={exports:{}},vf={},Dn={},Cr={},bf={},Ef={},_f={},zp;function Bl(){return zp||(zp=1,function(r){Object.defineProperty(r,"__esModule",{value:!0}),r.regexpCode=r.getEsmExportName=r.getProperty=r.safeStringify=r.stringify=r.strConcat=r.addCodeArg=r.str=r._=r.nil=r._Code=r.Name=r.IDENTIFIER=r._CodeOrName=void 0;class i{}r._CodeOrName=i,r.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class u extends i{constructor(p){if(super(),!r.IDENTIFIER.test(p))throw new Error("CodeGen: name must be a valid identifier");this.str=p}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}r.Name=u;class l extends i{constructor(p){super(),this._items=typeof p=="string"?[p]:p}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;const p=this._items[0];return p===""||p==='""'}get str(){var p;return(p=this._str)!==null&&p!==void 0?p:this._str=this._items.reduce((b,E)=>`${b}${E}`,"")}get names(){var p;return(p=this._names)!==null&&p!==void 0?p:this._names=this._items.reduce((b,E)=>(E instanceof u&&(b[E.str]=(b[E.str]||0)+1),b),{})}}r._Code=l,r.nil=new l("");function c(w,...p){const b=[w[0]];let E=0;for(;E{if(N.scopePath===void 0)throw new Error(`CodeGen: name "${N}" has no value`);return(0,i._)`${y}${N.scopePath}`})}scopeCode(y=this._values,S,N){return this._reduceValues(y,x=>{if(x.value===void 0)throw new Error(`CodeGen: name "${x}" has no value`);return x.value.code},S,N)}_reduceValues(y,S,N={},x){let V=i.nil;for(const L in y){const C=y[L];if(!C)continue;const g=N[L]=N[L]||new Map;C.forEach(w=>{if(g.has(w))return;g.set(w,l.Started);let p=S(w);if(p){const b=this.opts.es5?r.varKinds.var:r.varKinds.const;V=(0,i._)`${V}${b} ${w} = ${p};${this.opts._n}`}else if(p=x==null?void 0:x(w))V=(0,i._)`${V}${p}${this.opts._n}`;else throw new u(w);g.set(w,l.Completed)})}return V}}r.ValueScope=h}(Sf)),Sf}var Vp;function Me(){return Vp||(Vp=1,function(r){Object.defineProperty(r,"__esModule",{value:!0}),r.or=r.and=r.not=r.CodeGen=r.operators=r.varKinds=r.ValueScopeName=r.ValueScope=r.Scope=r.Name=r.regexpCode=r.stringify=r.getProperty=r.nil=r.strConcat=r.str=r._=void 0;const i=Bl(),u=Lp();var l=Bl();Object.defineProperty(r,"_",{enumerable:!0,get:function(){return l._}}),Object.defineProperty(r,"str",{enumerable:!0,get:function(){return l.str}}),Object.defineProperty(r,"strConcat",{enumerable:!0,get:function(){return l.strConcat}}),Object.defineProperty(r,"nil",{enumerable:!0,get:function(){return l.nil}}),Object.defineProperty(r,"getProperty",{enumerable:!0,get:function(){return l.getProperty}}),Object.defineProperty(r,"stringify",{enumerable:!0,get:function(){return l.stringify}}),Object.defineProperty(r,"regexpCode",{enumerable:!0,get:function(){return l.regexpCode}}),Object.defineProperty(r,"Name",{enumerable:!0,get:function(){return l.Name}});var c=Lp();Object.defineProperty(r,"Scope",{enumerable:!0,get:function(){return c.Scope}}),Object.defineProperty(r,"ValueScope",{enumerable:!0,get:function(){return c.ValueScope}}),Object.defineProperty(r,"ValueScopeName",{enumerable:!0,get:function(){return c.ValueScopeName}}),Object.defineProperty(r,"varKinds",{enumerable:!0,get:function(){return c.varKinds}}),r.operators={GT:new i._Code(">"),GTE:new i._Code(">="),LT:new i._Code("<"),LTE:new i._Code("<="),EQ:new i._Code("==="),NEQ:new i._Code("!=="),NOT:new i._Code("!"),OR:new i._Code("||"),AND:new i._Code("&&"),ADD:new i._Code("+")};class o{optimizeNodes(){return this}optimizeNames(T,H){return this}}class d extends o{constructor(T,H,te){super(),this.varKind=T,this.name=H,this.rhs=te}render({es5:T,_n:H}){const te=T?u.varKinds.var:this.varKind,pe=this.rhs===void 0?"":` = ${this.rhs}`;return`${te} ${this.name}${pe};`+H}optimizeNames(T,H){if(T[this.name.str])return this.rhs&&(this.rhs=F(this.rhs,T,H)),this}get names(){return this.rhs instanceof i._CodeOrName?this.rhs.names:{}}}class h extends o{constructor(T,H,te){super(),this.lhs=T,this.rhs=H,this.sideEffects=te}render({_n:T}){return`${this.lhs} = ${this.rhs};`+T}optimizeNames(T,H){if(!(this.lhs instanceof i.Name&&!T[this.lhs.str]&&!this.sideEffects))return this.rhs=F(this.rhs,T,H),this}get names(){const T=this.lhs instanceof i.Name?{}:{...this.lhs.names};return W(T,this.rhs)}}class m extends h{constructor(T,H,te,pe){super(T,te,pe),this.op=H}render({_n:T}){return`${this.lhs} ${this.op}= ${this.rhs};`+T}}class y extends o{constructor(T){super(),this.label=T,this.names={}}render({_n:T}){return`${this.label}:`+T}}class S extends o{constructor(T){super(),this.label=T,this.names={}}render({_n:T}){return`break${this.label?` ${this.label}`:""};`+T}}class N extends o{constructor(T){super(),this.error=T}render({_n:T}){return`throw ${this.error};`+T}get names(){return this.error.names}}class x extends o{constructor(T){super(),this.code=T}render({_n:T}){return`${this.code};`+T}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(T,H){return this.code=F(this.code,T,H),this}get names(){return this.code instanceof i._CodeOrName?this.code.names:{}}}class V extends o{constructor(T=[]){super(),this.nodes=T}render(T){return this.nodes.reduce((H,te)=>H+te.render(T),"")}optimizeNodes(){const{nodes:T}=this;let H=T.length;for(;H--;){const te=T[H].optimizeNodes();Array.isArray(te)?T.splice(H,1,...te):te?T[H]=te:T.splice(H,1)}return T.length>0?this:void 0}optimizeNames(T,H){const{nodes:te}=this;let pe=te.length;for(;pe--;){const ae=te[pe];ae.optimizeNames(T,H)||(ne(T,ae.names),te.splice(pe,1))}return te.length>0?this:void 0}get names(){return this.nodes.reduce((T,H)=>Q(T,H.names),{})}}class L extends V{render(T){return"{"+T._n+super.render(T)+"}"+T._n}}class C extends V{}class g extends L{}g.kind="else";class w extends L{constructor(T,H){super(H),this.condition=T}render(T){let H=`if(${this.condition})`+super.render(T);return this.else&&(H+="else "+this.else.render(T)),H}optimizeNodes(){super.optimizeNodes();const T=this.condition;if(T===!0)return this.nodes;let H=this.else;if(H){const te=H.optimizeNodes();H=this.else=Array.isArray(te)?new g(te):te}if(H)return T===!1?H instanceof w?H:H.nodes:this.nodes.length?this:new w(P(T),H instanceof w?[H]:H.nodes);if(!(T===!1||!this.nodes.length))return this}optimizeNames(T,H){var te;if(this.else=(te=this.else)===null||te===void 0?void 0:te.optimizeNames(T,H),!!(super.optimizeNames(T,H)||this.else))return this.condition=F(this.condition,T,H),this}get names(){const T=super.names;return W(T,this.condition),this.else&&Q(T,this.else.names),T}}w.kind="if";class p extends L{}p.kind="for";class b extends p{constructor(T){super(),this.iteration=T}render(T){return`for(${this.iteration})`+super.render(T)}optimizeNames(T,H){if(super.optimizeNames(T,H))return this.iteration=F(this.iteration,T,H),this}get names(){return Q(super.names,this.iteration.names)}}class E extends p{constructor(T,H,te,pe){super(),this.varKind=T,this.name=H,this.from=te,this.to=pe}render(T){const H=T.es5?u.varKinds.var:this.varKind,{name:te,from:pe,to:ae}=this;return`for(${H} ${te}=${pe}; ${te}<${ae}; ${te}++)`+super.render(T)}get names(){const T=W(super.names,this.from);return W(T,this.to)}}class O extends p{constructor(T,H,te,pe){super(),this.loop=T,this.varKind=H,this.name=te,this.iterable=pe}render(T){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(T)}optimizeNames(T,H){if(super.optimizeNames(T,H))return this.iterable=F(this.iterable,T,H),this}get names(){return Q(super.names,this.iterable.names)}}class v extends L{constructor(T,H,te){super(),this.name=T,this.args=H,this.async=te}render(T){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(T)}}v.kind="func";class A extends V{render(T){return"return "+super.render(T)}}A.kind="return";class $ extends L{render(T){let H="try"+super.render(T);return this.catch&&(H+=this.catch.render(T)),this.finally&&(H+=this.finally.render(T)),H}optimizeNodes(){var T,H;return super.optimizeNodes(),(T=this.catch)===null||T===void 0||T.optimizeNodes(),(H=this.finally)===null||H===void 0||H.optimizeNodes(),this}optimizeNames(T,H){var te,pe;return super.optimizeNames(T,H),(te=this.catch)===null||te===void 0||te.optimizeNames(T,H),(pe=this.finally)===null||pe===void 0||pe.optimizeNames(T,H),this}get names(){const T=super.names;return this.catch&&Q(T,this.catch.names),this.finally&&Q(T,this.finally.names),T}}class D extends L{constructor(T){super(),this.error=T}render(T){return`catch(${this.error})`+super.render(T)}}D.kind="catch";class j extends L{render(T){return"finally"+super.render(T)}}j.kind="finally";class Y{constructor(T,H={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...H,_n:H.lines?` -`:""},this._extScope=T,this._scope=new u.Scope({parent:T}),this._nodes=[new C]}toString(){return this._root.render(this.opts)}name(T){return this._scope.name(T)}scopeName(T){return this._extScope.name(T)}scopeValue(T,H){const te=this._extScope.value(T,H);return(this._values[te.prefix]||(this._values[te.prefix]=new Set)).add(te),te}getScopeValue(T,H){return this._extScope.getValue(T,H)}scopeRefs(T){return this._extScope.scopeRefs(T,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(T,H,te,pe){const ae=this._scope.toName(H);return te!==void 0&&pe&&(this._constants[ae.str]=te),this._leafNode(new d(T,ae,te)),ae}const(T,H,te){return this._def(u.varKinds.const,T,H,te)}let(T,H,te){return this._def(u.varKinds.let,T,H,te)}var(T,H,te){return this._def(u.varKinds.var,T,H,te)}assign(T,H,te){return this._leafNode(new h(T,H,te))}add(T,H){return this._leafNode(new m(T,r.operators.ADD,H))}code(T){return typeof T=="function"?T():T!==i.nil&&this._leafNode(new x(T)),this}object(...T){const H=["{"];for(const[te,pe]of T)H.length>1&&H.push(","),H.push(te),(te!==pe||this.opts.es5)&&(H.push(":"),(0,i.addCodeArg)(H,pe));return H.push("}"),new i._Code(H)}if(T,H,te){if(this._blockNode(new w(T)),H&&te)this.code(H).else().code(te).endIf();else if(H)this.code(H).endIf();else if(te)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(T){return this._elseNode(new w(T))}else(){return this._elseNode(new g)}endIf(){return this._endBlockNode(w,g)}_for(T,H){return this._blockNode(T),H&&this.code(H).endFor(),this}for(T,H){return this._for(new b(T),H)}forRange(T,H,te,pe,ae=this.opts.es5?u.varKinds.var:u.varKinds.let){const M=this._scope.toName(T);return this._for(new E(ae,M,H,te),()=>pe(M))}forOf(T,H,te,pe=u.varKinds.const){const ae=this._scope.toName(T);if(this.opts.es5){const M=H instanceof i.Name?H:this.var("_arr",H);return this.forRange("_i",0,(0,i._)`${M}.length`,B=>{this.var(ae,(0,i._)`${M}[${B}]`),te(ae)})}return this._for(new O("of",pe,ae,H),()=>te(ae))}forIn(T,H,te,pe=this.opts.es5?u.varKinds.var:u.varKinds.const){if(this.opts.ownProperties)return this.forOf(T,(0,i._)`Object.keys(${H})`,te);const ae=this._scope.toName(T);return this._for(new O("in",pe,ae,H),()=>te(ae))}endFor(){return this._endBlockNode(p)}label(T){return this._leafNode(new y(T))}break(T){return this._leafNode(new S(T))}return(T){const H=new A;if(this._blockNode(H),this.code(T),H.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(A)}try(T,H,te){if(!H&&!te)throw new Error('CodeGen: "try" without "catch" and "finally"');const pe=new $;if(this._blockNode(pe),this.code(T),H){const ae=this.name("e");this._currNode=pe.catch=new D(ae),H(ae)}return te&&(this._currNode=pe.finally=new j,this.code(te)),this._endBlockNode(D,j)}throw(T){return this._leafNode(new N(T))}block(T,H){return this._blockStarts.push(this._nodes.length),T&&this.code(T).endBlock(H),this}endBlock(T){const H=this._blockStarts.pop();if(H===void 0)throw new Error("CodeGen: not in self-balancing block");const te=this._nodes.length-H;if(te<0||T!==void 0&&te!==T)throw new Error(`CodeGen: wrong number of nodes: ${te} vs ${T} expected`);return this._nodes.length=H,this}func(T,H=i.nil,te,pe){return this._blockNode(new v(T,H,te)),pe&&this.code(pe).endFunc(),this}endFunc(){return this._endBlockNode(v)}optimize(T=1){for(;T-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(T){return this._currNode.nodes.push(T),this}_blockNode(T){this._currNode.nodes.push(T),this._nodes.push(T)}_endBlockNode(T,H){const te=this._currNode;if(te instanceof T||H&&te instanceof H)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${H?`${T.kind}/${H.kind}`:T.kind}"`)}_elseNode(T){const H=this._currNode;if(!(H instanceof w))throw new Error('CodeGen: "else" without "if"');return this._currNode=H.else=T,this}get _root(){return this._nodes[0]}get _currNode(){const T=this._nodes;return T[T.length-1]}set _currNode(T){const H=this._nodes;H[H.length-1]=T}}r.CodeGen=Y;function Q(k,T){for(const H in T)k[H]=(k[H]||0)+(T[H]||0);return k}function W(k,T){return T instanceof i._CodeOrName?Q(k,T.names):k}function F(k,T,H){if(k instanceof i.Name)return te(k);if(!pe(k))return k;return new i._Code(k._items.reduce((ae,M)=>(M instanceof i.Name&&(M=te(M)),M instanceof i._Code?ae.push(...M._items):ae.push(M),ae),[]));function te(ae){const M=H[ae.str];return M===void 0||T[ae.str]!==1?ae:(delete T[ae.str],M)}function pe(ae){return ae instanceof i._Code&&ae._items.some(M=>M instanceof i.Name&&T[M.str]===1&&H[M.str]!==void 0)}}function ne(k,T){for(const H in T)k[H]=(k[H]||0)-(T[H]||0)}function P(k){return typeof k=="boolean"||typeof k=="number"||k===null?!k:(0,i._)`!${K(k)}`}r.not=P;const ue=z(r.operators.AND);function re(...k){return k.reduce(ue)}r.and=re;const de=z(r.operators.OR);function R(...k){return k.reduce(de)}r.or=R;function z(k){return(T,H)=>T===i.nil?H:H===i.nil?T:(0,i._)`${K(T)} ${k} ${K(H)}`}function K(k){return k instanceof i.Name?k:(0,i._)`(${k})`}}(Ef)),Ef}var Ne={},xp;function Be(){if(xp)return Ne;xp=1,Object.defineProperty(Ne,"__esModule",{value:!0}),Ne.checkStrictMode=Ne.getErrorPath=Ne.Type=Ne.useFunc=Ne.setEvaluated=Ne.evaluatedPropsToName=Ne.mergeEvaluated=Ne.eachItem=Ne.unescapeJsonPointer=Ne.escapeJsonPointer=Ne.escapeFragment=Ne.unescapeFragment=Ne.schemaRefOrVal=Ne.schemaHasRulesButRef=Ne.schemaHasRules=Ne.checkUnknownRules=Ne.alwaysValidSchema=Ne.toHash=void 0;const r=Me(),i=Bl();function u(O){const v={};for(const A of O)v[A]=!0;return v}Ne.toHash=u;function l(O,v){return typeof v=="boolean"?v:Object.keys(v).length===0?!0:(c(O,v),!o(v,O.self.RULES.all))}Ne.alwaysValidSchema=l;function c(O,v=O.schema){const{opts:A,self:$}=O;if(!A.strictSchema||typeof v=="boolean")return;const D=$.RULES.keywords;for(const j in v)D[j]||E(O,`unknown keyword: "${j}"`)}Ne.checkUnknownRules=c;function o(O,v){if(typeof O=="boolean")return!O;for(const A in O)if(v[A])return!0;return!1}Ne.schemaHasRules=o;function d(O,v){if(typeof O=="boolean")return!O;for(const A in O)if(A!=="$ref"&&v.all[A])return!0;return!1}Ne.schemaHasRulesButRef=d;function h({topSchemaRef:O,schemaPath:v},A,$,D){if(!D){if(typeof A=="number"||typeof A=="boolean")return A;if(typeof A=="string")return(0,r._)`${A}`}return(0,r._)`${O}${v}${(0,r.getProperty)($)}`}Ne.schemaRefOrVal=h;function m(O){return N(decodeURIComponent(O))}Ne.unescapeFragment=m;function y(O){return encodeURIComponent(S(O))}Ne.escapeFragment=y;function S(O){return typeof O=="number"?`${O}`:O.replace(/~/g,"~0").replace(/\//g,"~1")}Ne.escapeJsonPointer=S;function N(O){return O.replace(/~1/g,"/").replace(/~0/g,"~")}Ne.unescapeJsonPointer=N;function x(O,v){if(Array.isArray(O))for(const A of O)v(A);else v(O)}Ne.eachItem=x;function V({mergeNames:O,mergeToName:v,mergeValues:A,resultToName:$}){return(D,j,Y,Q)=>{const W=Y===void 0?j:Y instanceof r.Name?(j instanceof r.Name?O(D,j,Y):v(D,j,Y),Y):j instanceof r.Name?(v(D,Y,j),j):A(j,Y);return Q===r.Name&&!(W instanceof r.Name)?$(D,W):W}}Ne.mergeEvaluated={props:V({mergeNames:(O,v,A)=>O.if((0,r._)`${A} !== true && ${v} !== undefined`,()=>{O.if((0,r._)`${v} === true`,()=>O.assign(A,!0),()=>O.assign(A,(0,r._)`${A} || {}`).code((0,r._)`Object.assign(${A}, ${v})`))}),mergeToName:(O,v,A)=>O.if((0,r._)`${A} !== true`,()=>{v===!0?O.assign(A,!0):(O.assign(A,(0,r._)`${A} || {}`),C(O,A,v))}),mergeValues:(O,v)=>O===!0?!0:{...O,...v},resultToName:L}),items:V({mergeNames:(O,v,A)=>O.if((0,r._)`${A} !== true && ${v} !== undefined`,()=>O.assign(A,(0,r._)`${v} === true ? true : ${A} > ${v} ? ${A} : ${v}`)),mergeToName:(O,v,A)=>O.if((0,r._)`${A} !== true`,()=>O.assign(A,v===!0?!0:(0,r._)`${A} > ${v} ? ${A} : ${v}`)),mergeValues:(O,v)=>O===!0?!0:Math.max(O,v),resultToName:(O,v)=>O.var("items",v)})};function L(O,v){if(v===!0)return O.var("props",!0);const A=O.var("props",(0,r._)`{}`);return v!==void 0&&C(O,A,v),A}Ne.evaluatedPropsToName=L;function C(O,v,A){Object.keys(A).forEach($=>O.assign((0,r._)`${v}${(0,r.getProperty)($)}`,!0))}Ne.setEvaluated=C;const g={};function w(O,v){return O.scopeValue("func",{ref:v,code:g[v.code]||(g[v.code]=new i._Code(v.code))})}Ne.useFunc=w;var p;(function(O){O[O.Num=0]="Num",O[O.Str=1]="Str"})(p||(Ne.Type=p={}));function b(O,v,A){if(O instanceof r.Name){const $=v===p.Num;return A?$?(0,r._)`"[" + ${O} + "]"`:(0,r._)`"['" + ${O} + "']"`:$?(0,r._)`"/" + ${O}`:(0,r._)`"/" + ${O}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return A?(0,r.getProperty)(O).toString():"/"+S(O)}Ne.getErrorPath=b;function E(O,v,A=O.opts.strictSchema){if(A){if(v=`strict mode: ${v}`,A===!0)throw new Error(v);O.self.logger.warn(v)}}return Ne.checkStrictMode=E,Ne}var Zs={},Bp;function fr(){if(Bp)return Zs;Bp=1,Object.defineProperty(Zs,"__esModule",{value:!0});const r=Me(),i={data:new r.Name("data"),valCxt:new r.Name("valCxt"),instancePath:new r.Name("instancePath"),parentData:new r.Name("parentData"),parentDataProperty:new r.Name("parentDataProperty"),rootData:new r.Name("rootData"),dynamicAnchors:new r.Name("dynamicAnchors"),vErrors:new r.Name("vErrors"),errors:new r.Name("errors"),this:new r.Name("this"),self:new r.Name("self"),scope:new r.Name("scope"),json:new r.Name("json"),jsonPos:new r.Name("jsonPos"),jsonLen:new r.Name("jsonLen"),jsonPart:new r.Name("jsonPart")};return Zs.default=i,Zs}var Hp;function Ql(){return Hp||(Hp=1,function(r){Object.defineProperty(r,"__esModule",{value:!0}),r.extendErrors=r.resetErrorsCount=r.reportExtraError=r.reportError=r.keyword$DataError=r.keywordError=void 0;const i=Me(),u=Be(),l=fr();r.keywordError={message:({keyword:g})=>(0,i.str)`must pass "${g}" keyword validation`},r.keyword$DataError={message:({keyword:g,schemaType:w})=>w?(0,i.str)`"${g}" keyword must be ${w} ($data)`:(0,i.str)`"${g}" keyword is invalid ($data)`};function c(g,w=r.keywordError,p,b){const{it:E}=g,{gen:O,compositeRule:v,allErrors:A}=E,$=N(g,w,p);b??(v||A)?m(O,$):y(E,(0,i._)`[${$}]`)}r.reportError=c;function o(g,w=r.keywordError,p){const{it:b}=g,{gen:E,compositeRule:O,allErrors:v}=b,A=N(g,w,p);m(E,A),O||v||y(b,l.default.vErrors)}r.reportExtraError=o;function d(g,w){g.assign(l.default.errors,w),g.if((0,i._)`${l.default.vErrors} !== null`,()=>g.if(w,()=>g.assign((0,i._)`${l.default.vErrors}.length`,w),()=>g.assign(l.default.vErrors,null)))}r.resetErrorsCount=d;function h({gen:g,keyword:w,schemaValue:p,data:b,errsCount:E,it:O}){if(E===void 0)throw new Error("ajv implementation error");const v=g.name("err");g.forRange("i",E,l.default.errors,A=>{g.const(v,(0,i._)`${l.default.vErrors}[${A}]`),g.if((0,i._)`${v}.instancePath === undefined`,()=>g.assign((0,i._)`${v}.instancePath`,(0,i.strConcat)(l.default.instancePath,O.errorPath))),g.assign((0,i._)`${v}.schemaPath`,(0,i.str)`${O.errSchemaPath}/${w}`),O.opts.verbose&&(g.assign((0,i._)`${v}.schema`,p),g.assign((0,i._)`${v}.data`,b))})}r.extendErrors=h;function m(g,w){const p=g.const("err",w);g.if((0,i._)`${l.default.vErrors} === null`,()=>g.assign(l.default.vErrors,(0,i._)`[${p}]`),(0,i._)`${l.default.vErrors}.push(${p})`),g.code((0,i._)`${l.default.errors}++`)}function y(g,w){const{gen:p,validateName:b,schemaEnv:E}=g;E.$async?p.throw((0,i._)`new ${g.ValidationError}(${w})`):(p.assign((0,i._)`${b}.errors`,w),p.return(!1))}const S={keyword:new i.Name("keyword"),schemaPath:new i.Name("schemaPath"),params:new i.Name("params"),propertyName:new i.Name("propertyName"),message:new i.Name("message"),schema:new i.Name("schema"),parentSchema:new i.Name("parentSchema")};function N(g,w,p){const{createErrors:b}=g.it;return b===!1?(0,i._)`{}`:x(g,w,p)}function x(g,w,p={}){const{gen:b,it:E}=g,O=[V(E,p),L(g,p)];return C(g,w,O),b.object(...O)}function V({errorPath:g},{instancePath:w}){const p=w?(0,i.str)`${g}${(0,u.getErrorPath)(w,u.Type.Str)}`:g;return[l.default.instancePath,(0,i.strConcat)(l.default.instancePath,p)]}function L({keyword:g,it:{errSchemaPath:w}},{schemaPath:p,parentSchema:b}){let E=b?w:(0,i.str)`${w}/${g}`;return p&&(E=(0,i.str)`${E}${(0,u.getErrorPath)(p,u.Type.Str)}`),[S.schemaPath,E]}function C(g,{params:w,message:p},b){const{keyword:E,data:O,schemaValue:v,it:A}=g,{opts:$,propertyName:D,topSchemaRef:j,schemaPath:Y}=A;b.push([S.keyword,E],[S.params,typeof w=="function"?w(g):w||(0,i._)`{}`]),$.messages&&b.push([S.message,typeof p=="function"?p(g):p]),$.verbose&&b.push([S.schema,v],[S.parentSchema,(0,i._)`${j}${Y}`],[l.default.data,O]),D&&b.push([S.propertyName,D])}}(bf)),bf}var Gp;function vb(){if(Gp)return Cr;Gp=1,Object.defineProperty(Cr,"__esModule",{value:!0}),Cr.boolOrEmptySchema=Cr.topBoolOrEmptySchema=void 0;const r=Ql(),i=Me(),u=fr(),l={message:"boolean schema is false"};function c(h){const{gen:m,schema:y,validateName:S}=h;y===!1?d(h,!1):typeof y=="object"&&y.$async===!0?m.return(u.default.data):(m.assign((0,i._)`${S}.errors`,null),m.return(!0))}Cr.topBoolOrEmptySchema=c;function o(h,m){const{gen:y,schema:S}=h;S===!1?(y.var(m,!1),d(h)):y.var(m,!0)}Cr.boolOrEmptySchema=o;function d(h,m){const{gen:y,data:S}=h,N={gen:y,keyword:"false schema",data:S,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:h};(0,r.reportError)(N,l,void 0,m)}return Cr}var yt={},zr={},Ip;function ov(){if(Ip)return zr;Ip=1,Object.defineProperty(zr,"__esModule",{value:!0}),zr.getRules=zr.isJSONType=void 0;const r=["string","number","integer","boolean","null","object","array"],i=new Set(r);function u(c){return typeof c=="string"&&i.has(c)}zr.isJSONType=u;function l(){const c={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...c,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},c.number,c.string,c.array,c.object],post:{rules:[]},all:{},keywords:{}}}return zr.getRules=l,zr}var Mn={},Yp;function fv(){if(Yp)return Mn;Yp=1,Object.defineProperty(Mn,"__esModule",{value:!0}),Mn.shouldUseRule=Mn.shouldUseGroup=Mn.schemaHasRulesForType=void 0;function r({schema:l,self:c},o){const d=c.RULES.types[o];return d&&d!==!0&&i(l,d)}Mn.schemaHasRulesForType=r;function i(l,c){return c.rules.some(o=>u(l,o))}Mn.shouldUseGroup=i;function u(l,c){var o;return l[c.keyword]!==void 0||((o=c.definition.implements)===null||o===void 0?void 0:o.some(d=>l[d]!==void 0))}return Mn.shouldUseRule=u,Mn}var kp;function Hl(){if(kp)return yt;kp=1,Object.defineProperty(yt,"__esModule",{value:!0}),yt.reportTypeError=yt.checkDataTypes=yt.checkDataType=yt.coerceAndCheckDataType=yt.getJSONTypes=yt.getSchemaTypes=yt.DataType=void 0;const r=ov(),i=fv(),u=Ql(),l=Me(),c=Be();var o;(function(p){p[p.Correct=0]="Correct",p[p.Wrong=1]="Wrong"})(o||(yt.DataType=o={}));function d(p){const b=h(p.type);if(b.includes("null")){if(p.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!b.length&&p.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');p.nullable===!0&&b.push("null")}return b}yt.getSchemaTypes=d;function h(p){const b=Array.isArray(p)?p:p?[p]:[];if(b.every(r.isJSONType))return b;throw new Error("type must be JSONType or JSONType[]: "+b.join(","))}yt.getJSONTypes=h;function m(p,b){const{gen:E,data:O,opts:v}=p,A=S(b,v.coerceTypes),$=b.length>0&&!(A.length===0&&b.length===1&&(0,i.schemaHasRulesForType)(p,b[0]));if($){const D=L(b,O,v.strictNumbers,o.Wrong);E.if(D,()=>{A.length?N(p,b,A):g(p)})}return $}yt.coerceAndCheckDataType=m;const y=new Set(["string","number","integer","boolean","null"]);function S(p,b){return b?p.filter(E=>y.has(E)||b==="array"&&E==="array"):[]}function N(p,b,E){const{gen:O,data:v,opts:A}=p,$=O.let("dataType",(0,l._)`typeof ${v}`),D=O.let("coerced",(0,l._)`undefined`);A.coerceTypes==="array"&&O.if((0,l._)`${$} == 'object' && Array.isArray(${v}) && ${v}.length == 1`,()=>O.assign(v,(0,l._)`${v}[0]`).assign($,(0,l._)`typeof ${v}`).if(L(b,v,A.strictNumbers),()=>O.assign(D,v))),O.if((0,l._)`${D} !== undefined`);for(const Y of E)(y.has(Y)||Y==="array"&&A.coerceTypes==="array")&&j(Y);O.else(),g(p),O.endIf(),O.if((0,l._)`${D} !== undefined`,()=>{O.assign(v,D),x(p,D)});function j(Y){switch(Y){case"string":O.elseIf((0,l._)`${$} == "number" || ${$} == "boolean"`).assign(D,(0,l._)`"" + ${v}`).elseIf((0,l._)`${v} === null`).assign(D,(0,l._)`""`);return;case"number":O.elseIf((0,l._)`${$} == "boolean" || ${v} === null - || (${$} == "string" && ${v} && ${v} == +${v})`).assign(D,(0,l._)`+${v}`);return;case"integer":O.elseIf((0,l._)`${$} === "boolean" || ${v} === null - || (${$} === "string" && ${v} && ${v} == +${v} && !(${v} % 1))`).assign(D,(0,l._)`+${v}`);return;case"boolean":O.elseIf((0,l._)`${v} === "false" || ${v} === 0 || ${v} === null`).assign(D,!1).elseIf((0,l._)`${v} === "true" || ${v} === 1`).assign(D,!0);return;case"null":O.elseIf((0,l._)`${v} === "" || ${v} === 0 || ${v} === false`),O.assign(D,null);return;case"array":O.elseIf((0,l._)`${$} === "string" || ${$} === "number" - || ${$} === "boolean" || ${v} === null`).assign(D,(0,l._)`[${v}]`)}}}function x({gen:p,parentData:b,parentDataProperty:E},O){p.if((0,l._)`${b} !== undefined`,()=>p.assign((0,l._)`${b}[${E}]`,O))}function V(p,b,E,O=o.Correct){const v=O===o.Correct?l.operators.EQ:l.operators.NEQ;let A;switch(p){case"null":return(0,l._)`${b} ${v} null`;case"array":A=(0,l._)`Array.isArray(${b})`;break;case"object":A=(0,l._)`${b} && typeof ${b} == "object" && !Array.isArray(${b})`;break;case"integer":A=$((0,l._)`!(${b} % 1) && !isNaN(${b})`);break;case"number":A=$();break;default:return(0,l._)`typeof ${b} ${v} ${p}`}return O===o.Correct?A:(0,l.not)(A);function $(D=l.nil){return(0,l.and)((0,l._)`typeof ${b} == "number"`,D,E?(0,l._)`isFinite(${b})`:l.nil)}}yt.checkDataType=V;function L(p,b,E,O){if(p.length===1)return V(p[0],b,E,O);let v;const A=(0,c.toHash)(p);if(A.array&&A.object){const $=(0,l._)`typeof ${b} != "object"`;v=A.null?$:(0,l._)`!${b} || ${$}`,delete A.null,delete A.array,delete A.object}else v=l.nil;A.number&&delete A.integer;for(const $ in A)v=(0,l.and)(v,V($,b,E,O));return v}yt.checkDataTypes=L;const C={message:({schema:p})=>`must be ${p}`,params:({schema:p,schemaValue:b})=>typeof p=="string"?(0,l._)`{type: ${p}}`:(0,l._)`{type: ${b}}`};function g(p){const b=w(p);(0,u.reportError)(b,C)}yt.reportTypeError=g;function w(p){const{gen:b,data:E,schema:O}=p,v=(0,c.schemaRefOrVal)(p,O,"type");return{gen:b,keyword:"type",data:E,schema:O.type,schemaCode:v,schemaValue:v,parentSchema:O,params:{},it:p}}return yt}var Oi={},Pp;function bb(){if(Pp)return Oi;Pp=1,Object.defineProperty(Oi,"__esModule",{value:!0}),Oi.assignDefaults=void 0;const r=Me(),i=Be();function u(c,o){const{properties:d,items:h}=c.schema;if(o==="object"&&d)for(const m in d)l(c,m,d[m].default);else o==="array"&&Array.isArray(h)&&h.forEach((m,y)=>l(c,y,m.default))}Oi.assignDefaults=u;function l(c,o,d){const{gen:h,compositeRule:m,data:y,opts:S}=c;if(d===void 0)return;const N=(0,r._)`${y}${(0,r.getProperty)(o)}`;if(m){(0,i.checkStrictMode)(c,`default is ignored for: ${N}`);return}let x=(0,r._)`${N} === undefined`;S.useDefaults==="empty"&&(x=(0,r._)`${x} || ${N} === null || ${N} === ""`),h.if(x,(0,r._)`${N} = ${(0,r.stringify)(d)}`)}return Oi}var tn={},Ge={},Kp;function an(){if(Kp)return Ge;Kp=1,Object.defineProperty(Ge,"__esModule",{value:!0}),Ge.validateUnion=Ge.validateArray=Ge.usePattern=Ge.callValidateCode=Ge.schemaProperties=Ge.allSchemaProperties=Ge.noPropertyInData=Ge.propertyInData=Ge.isOwnProperty=Ge.hasPropFunc=Ge.reportMissingProp=Ge.checkMissingProp=Ge.checkReportMissingProp=void 0;const r=Me(),i=Be(),u=fr(),l=Be();function c(p,b){const{gen:E,data:O,it:v}=p;E.if(S(E,O,b,v.opts.ownProperties),()=>{p.setParams({missingProperty:(0,r._)`${b}`},!0),p.error()})}Ge.checkReportMissingProp=c;function o({gen:p,data:b,it:{opts:E}},O,v){return(0,r.or)(...O.map(A=>(0,r.and)(S(p,b,A,E.ownProperties),(0,r._)`${v} = ${A}`)))}Ge.checkMissingProp=o;function d(p,b){p.setParams({missingProperty:b},!0),p.error()}Ge.reportMissingProp=d;function h(p){return p.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,r._)`Object.prototype.hasOwnProperty`})}Ge.hasPropFunc=h;function m(p,b,E){return(0,r._)`${h(p)}.call(${b}, ${E})`}Ge.isOwnProperty=m;function y(p,b,E,O){const v=(0,r._)`${b}${(0,r.getProperty)(E)} !== undefined`;return O?(0,r._)`${v} && ${m(p,b,E)}`:v}Ge.propertyInData=y;function S(p,b,E,O){const v=(0,r._)`${b}${(0,r.getProperty)(E)} === undefined`;return O?(0,r.or)(v,(0,r.not)(m(p,b,E))):v}Ge.noPropertyInData=S;function N(p){return p?Object.keys(p).filter(b=>b!=="__proto__"):[]}Ge.allSchemaProperties=N;function x(p,b){return N(b).filter(E=>!(0,i.alwaysValidSchema)(p,b[E]))}Ge.schemaProperties=x;function V({schemaCode:p,data:b,it:{gen:E,topSchemaRef:O,schemaPath:v,errorPath:A},it:$},D,j,Y){const Q=Y?(0,r._)`${p}, ${b}, ${O}${v}`:b,W=[[u.default.instancePath,(0,r.strConcat)(u.default.instancePath,A)],[u.default.parentData,$.parentData],[u.default.parentDataProperty,$.parentDataProperty],[u.default.rootData,u.default.rootData]];$.opts.dynamicRef&&W.push([u.default.dynamicAnchors,u.default.dynamicAnchors]);const F=(0,r._)`${Q}, ${E.object(...W)}`;return j!==r.nil?(0,r._)`${D}.call(${j}, ${F})`:(0,r._)`${D}(${F})`}Ge.callValidateCode=V;const L=(0,r._)`new RegExp`;function C({gen:p,it:{opts:b}},E){const O=b.unicodeRegExp?"u":"",{regExp:v}=b.code,A=v(E,O);return p.scopeValue("pattern",{key:A.toString(),ref:A,code:(0,r._)`${v.code==="new RegExp"?L:(0,l.useFunc)(p,v)}(${E}, ${O})`})}Ge.usePattern=C;function g(p){const{gen:b,data:E,keyword:O,it:v}=p,A=b.name("valid");if(v.allErrors){const D=b.let("valid",!0);return $(()=>b.assign(D,!1)),D}return b.var(A,!0),$(()=>b.break()),A;function $(D){const j=b.const("len",(0,r._)`${E}.length`);b.forRange("i",0,j,Y=>{p.subschema({keyword:O,dataProp:Y,dataPropType:i.Type.Num},A),b.if((0,r.not)(A),D)})}}Ge.validateArray=g;function w(p){const{gen:b,schema:E,keyword:O,it:v}=p;if(!Array.isArray(E))throw new Error("ajv implementation error");if(E.some(j=>(0,i.alwaysValidSchema)(v,j))&&!v.opts.unevaluated)return;const $=b.let("valid",!1),D=b.name("_valid");b.block(()=>E.forEach((j,Y)=>{const Q=p.subschema({keyword:O,schemaProp:Y,compositeRule:!0},D);b.assign($,(0,r._)`${$} || ${D}`),p.mergeValidEvaluated(Q,D)||b.if((0,r.not)($))})),p.result($,()=>p.reset(),()=>p.error(!0))}return Ge.validateUnion=w,Ge}var Xp;function Eb(){if(Xp)return tn;Xp=1,Object.defineProperty(tn,"__esModule",{value:!0}),tn.validateKeywordUsage=tn.validSchemaType=tn.funcKeywordCode=tn.macroKeywordCode=void 0;const r=Me(),i=fr(),u=an(),l=Ql();function c(x,V){const{gen:L,keyword:C,schema:g,parentSchema:w,it:p}=x,b=V.macro.call(p.self,g,w,p),E=y(L,C,b);p.opts.validateSchema!==!1&&p.self.validateSchema(b,!0);const O=L.name("valid");x.subschema({schema:b,schemaPath:r.nil,errSchemaPath:`${p.errSchemaPath}/${C}`,topSchemaRef:E,compositeRule:!0},O),x.pass(O,()=>x.error(!0))}tn.macroKeywordCode=c;function o(x,V){var L;const{gen:C,keyword:g,schema:w,parentSchema:p,$data:b,it:E}=x;m(E,V);const O=!b&&V.compile?V.compile.call(E.self,w,p,E):V.validate,v=y(C,g,O),A=C.let("valid");x.block$data(A,$),x.ok((L=V.valid)!==null&&L!==void 0?L:A);function $(){if(V.errors===!1)Y(),V.modifying&&d(x),Q(()=>x.error());else{const W=V.async?D():j();V.modifying&&d(x),Q(()=>h(x,W))}}function D(){const W=C.let("ruleErrs",null);return C.try(()=>Y((0,r._)`await `),F=>C.assign(A,!1).if((0,r._)`${F} instanceof ${E.ValidationError}`,()=>C.assign(W,(0,r._)`${F}.errors`),()=>C.throw(F))),W}function j(){const W=(0,r._)`${v}.errors`;return C.assign(W,null),Y(r.nil),W}function Y(W=V.async?(0,r._)`await `:r.nil){const F=E.opts.passContext?i.default.this:i.default.self,ne=!("compile"in V&&!b||V.schema===!1);C.assign(A,(0,r._)`${W}${(0,u.callValidateCode)(x,v,F,ne)}`,V.modifying)}function Q(W){var F;C.if((0,r.not)((F=V.valid)!==null&&F!==void 0?F:A),W)}}tn.funcKeywordCode=o;function d(x){const{gen:V,data:L,it:C}=x;V.if(C.parentData,()=>V.assign(L,(0,r._)`${C.parentData}[${C.parentDataProperty}]`))}function h(x,V){const{gen:L}=x;L.if((0,r._)`Array.isArray(${V})`,()=>{L.assign(i.default.vErrors,(0,r._)`${i.default.vErrors} === null ? ${V} : ${i.default.vErrors}.concat(${V})`).assign(i.default.errors,(0,r._)`${i.default.vErrors}.length`),(0,l.extendErrors)(x)},()=>x.error())}function m({schemaEnv:x},V){if(V.async&&!x.$async)throw new Error("async keyword in sync schema")}function y(x,V,L){if(L===void 0)throw new Error(`keyword "${V}" failed to compile`);return x.scopeValue("keyword",typeof L=="function"?{ref:L}:{ref:L,code:(0,r.stringify)(L)})}function S(x,V,L=!1){return!V.length||V.some(C=>C==="array"?Array.isArray(x):C==="object"?x&&typeof x=="object"&&!Array.isArray(x):typeof x==C||L&&typeof x>"u")}tn.validSchemaType=S;function N({schema:x,opts:V,self:L,errSchemaPath:C},g,w){if(Array.isArray(g.keyword)?!g.keyword.includes(w):g.keyword!==w)throw new Error("ajv implementation error");const p=g.dependencies;if(p!=null&&p.some(b=>!Object.prototype.hasOwnProperty.call(x,b)))throw new Error(`parent schema must have dependencies of ${w}: ${p.join(",")}`);if(g.validateSchema&&!g.validateSchema(x[w])){const E=`keyword "${w}" value is invalid at path "${C}": `+L.errorsText(g.validateSchema.errors);if(V.validateSchema==="log")L.logger.error(E);else throw new Error(E)}}return tn.validateKeywordUsage=N,tn}var qn={},Qp;function _b(){if(Qp)return qn;Qp=1,Object.defineProperty(qn,"__esModule",{value:!0}),qn.extendSubschemaMode=qn.extendSubschemaData=qn.getSubschema=void 0;const r=Me(),i=Be();function u(o,{keyword:d,schemaProp:h,schema:m,schemaPath:y,errSchemaPath:S,topSchemaRef:N}){if(d!==void 0&&m!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(d!==void 0){const x=o.schema[d];return h===void 0?{schema:x,schemaPath:(0,r._)`${o.schemaPath}${(0,r.getProperty)(d)}`,errSchemaPath:`${o.errSchemaPath}/${d}`}:{schema:x[h],schemaPath:(0,r._)`${o.schemaPath}${(0,r.getProperty)(d)}${(0,r.getProperty)(h)}`,errSchemaPath:`${o.errSchemaPath}/${d}/${(0,i.escapeFragment)(h)}`}}if(m!==void 0){if(y===void 0||S===void 0||N===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:m,schemaPath:y,topSchemaRef:N,errSchemaPath:S}}throw new Error('either "keyword" or "schema" must be passed')}qn.getSubschema=u;function l(o,d,{dataProp:h,dataPropType:m,data:y,dataTypes:S,propertyName:N}){if(y!==void 0&&h!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');const{gen:x}=d;if(h!==void 0){const{errorPath:L,dataPathArr:C,opts:g}=d,w=x.let("data",(0,r._)`${d.data}${(0,r.getProperty)(h)}`,!0);V(w),o.errorPath=(0,r.str)`${L}${(0,i.getErrorPath)(h,m,g.jsPropertySyntax)}`,o.parentDataProperty=(0,r._)`${h}`,o.dataPathArr=[...C,o.parentDataProperty]}if(y!==void 0){const L=y instanceof r.Name?y:x.let("data",y,!0);V(L),N!==void 0&&(o.propertyName=N)}S&&(o.dataTypes=S);function V(L){o.data=L,o.dataLevel=d.dataLevel+1,o.dataTypes=[],d.definedProperties=new Set,o.parentData=d.data,o.dataNames=[...d.dataNames,L]}}qn.extendSubschemaData=l;function c(o,{jtdDiscriminator:d,jtdMetadata:h,compositeRule:m,createErrors:y,allErrors:S}){m!==void 0&&(o.compositeRule=m),y!==void 0&&(o.createErrors=y),S!==void 0&&(o.allErrors=S),o.jtdDiscriminator=d,o.jtdMetadata=h}return qn.extendSubschemaMode=c,qn}var St={},wf,Zp;function cv(){return Zp||(Zp=1,wf=function r(i,u){if(i===u)return!0;if(i&&u&&typeof i=="object"&&typeof u=="object"){if(i.constructor!==u.constructor)return!1;var l,c,o;if(Array.isArray(i)){if(l=i.length,l!=u.length)return!1;for(c=l;c--!==0;)if(!r(i[c],u[c]))return!1;return!0}if(i.constructor===RegExp)return i.source===u.source&&i.flags===u.flags;if(i.valueOf!==Object.prototype.valueOf)return i.valueOf()===u.valueOf();if(i.toString!==Object.prototype.toString)return i.toString()===u.toString();if(o=Object.keys(i),l=o.length,l!==Object.keys(u).length)return!1;for(c=l;c--!==0;)if(!Object.prototype.hasOwnProperty.call(u,o[c]))return!1;for(c=l;c--!==0;){var d=o[c];if(!r(i[d],u[d]))return!1}return!0}return i!==i&&u!==u}),wf}var $f={exports:{}},Jp;function Sb(){if(Jp)return $f.exports;Jp=1;var r=$f.exports=function(l,c,o){typeof c=="function"&&(o=c,c={}),o=c.cb||o;var d=typeof o=="function"?o:o.pre||function(){},h=o.post||function(){};i(c,d,h,l,"",l)};r.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0},r.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},r.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},r.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function i(l,c,o,d,h,m,y,S,N,x){if(d&&typeof d=="object"&&!Array.isArray(d)){c(d,h,m,y,S,N,x);for(var V in d){var L=d[V];if(Array.isArray(L)){if(V in r.arrayKeywords)for(var C=0;Cg+=h(p)),g===1/0))return 1/0}return g}function m(C,g="",w){w!==!1&&(g=N(g));const p=C.parse(g);return y(C,p)}St.getFullPath=m;function y(C,g){return C.serialize(g).split("#")[0]+"#"}St._getFullPath=y;const S=/#\/?$/;function N(C){return C?C.replace(S,""):""}St.normalizeId=N;function x(C,g,w){return w=N(w),C.resolve(g,w)}St.resolveUrl=x;const V=/^[a-z_][-a-z0-9._]*$/i;function L(C,g){if(typeof C=="boolean")return{};const{schemaId:w,uriResolver:p}=this.opts,b=N(C[w]||g),E={"":b},O=m(p,b,!1),v={},A=new Set;return u(C,{allKeys:!0},(j,Y,Q,W)=>{if(W===void 0)return;const F=O+Y;let ne=E[W];typeof j[w]=="string"&&(ne=P.call(this,j[w])),ue.call(this,j.$anchor),ue.call(this,j.$dynamicAnchor),E[Y]=ne;function P(re){const de=this.opts.uriResolver.resolve;if(re=N(ne?de(ne,re):re),A.has(re))throw D(re);A.add(re);let R=this.refs[re];return typeof R=="string"&&(R=this.refs[R]),typeof R=="object"?$(j,R.schema,re):re!==N(F)&&(re[0]==="#"?($(j,v[re],re),v[re]=j):this.refs[re]=F),re}function ue(re){if(typeof re=="string"){if(!V.test(re))throw new Error(`invalid anchor "${re}"`);P.call(this,`#${re}`)}}}),v;function $(j,Y,Q){if(Y!==void 0&&!i(j,Y))throw D(Q)}function D(j){return new Error(`reference "${j}" resolves to more than one schema`)}}return St.getSchemaRefs=L,St}var Wp;function Jl(){if(Wp)return Dn;Wp=1,Object.defineProperty(Dn,"__esModule",{value:!0}),Dn.getData=Dn.KeywordCxt=Dn.validateFunctionCode=void 0;const r=vb(),i=Hl(),u=fv(),l=Hl(),c=bb(),o=Eb(),d=_b(),h=Me(),m=fr(),y=Zl(),S=Be(),N=Ql();function x(q){if(O(q)&&(A(q),E(q))){g(q);return}V(q,()=>(0,r.topBoolOrEmptySchema)(q))}Dn.validateFunctionCode=x;function V({gen:q,validateName:G,schema:X,schemaEnv:se,opts:me},ye){me.code.es5?q.func(G,(0,h._)`${m.default.data}, ${m.default.valCxt}`,se.$async,()=>{q.code((0,h._)`"use strict"; ${p(X,me)}`),C(q,me),q.code(ye)}):q.func(G,(0,h._)`${m.default.data}, ${L(me)}`,se.$async,()=>q.code(p(X,me)).code(ye))}function L(q){return(0,h._)`{${m.default.instancePath}="", ${m.default.parentData}, ${m.default.parentDataProperty}, ${m.default.rootData}=${m.default.data}${q.dynamicRef?(0,h._)`, ${m.default.dynamicAnchors}={}`:h.nil}}={}`}function C(q,G){q.if(m.default.valCxt,()=>{q.var(m.default.instancePath,(0,h._)`${m.default.valCxt}.${m.default.instancePath}`),q.var(m.default.parentData,(0,h._)`${m.default.valCxt}.${m.default.parentData}`),q.var(m.default.parentDataProperty,(0,h._)`${m.default.valCxt}.${m.default.parentDataProperty}`),q.var(m.default.rootData,(0,h._)`${m.default.valCxt}.${m.default.rootData}`),G.dynamicRef&&q.var(m.default.dynamicAnchors,(0,h._)`${m.default.valCxt}.${m.default.dynamicAnchors}`)},()=>{q.var(m.default.instancePath,(0,h._)`""`),q.var(m.default.parentData,(0,h._)`undefined`),q.var(m.default.parentDataProperty,(0,h._)`undefined`),q.var(m.default.rootData,m.default.data),G.dynamicRef&&q.var(m.default.dynamicAnchors,(0,h._)`{}`)})}function g(q){const{schema:G,opts:X,gen:se}=q;V(q,()=>{X.$comment&&G.$comment&&W(q),j(q),se.let(m.default.vErrors,null),se.let(m.default.errors,0),X.unevaluated&&w(q),$(q),F(q)})}function w(q){const{gen:G,validateName:X}=q;q.evaluated=G.const("evaluated",(0,h._)`${X}.evaluated`),G.if((0,h._)`${q.evaluated}.dynamicProps`,()=>G.assign((0,h._)`${q.evaluated}.props`,(0,h._)`undefined`)),G.if((0,h._)`${q.evaluated}.dynamicItems`,()=>G.assign((0,h._)`${q.evaluated}.items`,(0,h._)`undefined`))}function p(q,G){const X=typeof q=="object"&&q[G.schemaId];return X&&(G.code.source||G.code.process)?(0,h._)`/*# sourceURL=${X} */`:h.nil}function b(q,G){if(O(q)&&(A(q),E(q))){v(q,G);return}(0,r.boolOrEmptySchema)(q,G)}function E({schema:q,self:G}){if(typeof q=="boolean")return!q;for(const X in q)if(G.RULES.all[X])return!0;return!1}function O(q){return typeof q.schema!="boolean"}function v(q,G){const{schema:X,gen:se,opts:me}=q;me.$comment&&X.$comment&&W(q),Y(q),Q(q);const ye=se.const("_errs",m.default.errors);$(q,ye),se.var(G,(0,h._)`${ye} === ${m.default.errors}`)}function A(q){(0,S.checkUnknownRules)(q),D(q)}function $(q,G){if(q.opts.jtd)return P(q,[],!1,G);const X=(0,i.getSchemaTypes)(q.schema),se=(0,i.coerceAndCheckDataType)(q,X);P(q,X,!se,G)}function D(q){const{schema:G,errSchemaPath:X,opts:se,self:me}=q;G.$ref&&se.ignoreKeywordsWithRef&&(0,S.schemaHasRulesButRef)(G,me.RULES)&&me.logger.warn(`$ref: keywords ignored in schema at path "${X}"`)}function j(q){const{schema:G,opts:X}=q;G.default!==void 0&&X.useDefaults&&X.strictSchema&&(0,S.checkStrictMode)(q,"default is ignored in the schema root")}function Y(q){const G=q.schema[q.opts.schemaId];G&&(q.baseId=(0,y.resolveUrl)(q.opts.uriResolver,q.baseId,G))}function Q(q){if(q.schema.$async&&!q.schemaEnv.$async)throw new Error("async schema in sync schema")}function W({gen:q,schemaEnv:G,schema:X,errSchemaPath:se,opts:me}){const ye=X.$comment;if(me.$comment===!0)q.code((0,h._)`${m.default.self}.logger.log(${ye})`);else if(typeof me.$comment=="function"){const Ae=(0,h.str)`${se}/$comment`,Ie=q.scopeValue("root",{ref:G.root});q.code((0,h._)`${m.default.self}.opts.$comment(${ye}, ${Ae}, ${Ie}.schema)`)}}function F(q){const{gen:G,schemaEnv:X,validateName:se,ValidationError:me,opts:ye}=q;X.$async?G.if((0,h._)`${m.default.errors} === 0`,()=>G.return(m.default.data),()=>G.throw((0,h._)`new ${me}(${m.default.vErrors})`)):(G.assign((0,h._)`${se}.errors`,m.default.vErrors),ye.unevaluated&&ne(q),G.return((0,h._)`${m.default.errors} === 0`))}function ne({gen:q,evaluated:G,props:X,items:se}){X instanceof h.Name&&q.assign((0,h._)`${G}.props`,X),se instanceof h.Name&&q.assign((0,h._)`${G}.items`,se)}function P(q,G,X,se){const{gen:me,schema:ye,data:Ae,allErrors:Ie,opts:Ue,self:Le}=q,{RULES:Re}=Le;if(ye.$ref&&(Ue.ignoreKeywordsWithRef||!(0,S.schemaHasRulesButRef)(ye,Re))){me.block(()=>pe(q,"$ref",Re.all.$ref.definition));return}Ue.jtd||re(q,G),me.block(()=>{for(const tt of Re.rules)He(tt);He(Re.post)});function He(tt){(0,u.shouldUseGroup)(ye,tt)&&(tt.type?(me.if((0,l.checkDataType)(tt.type,Ae,Ue.strictNumbers)),ue(q,tt),G.length===1&&G[0]===tt.type&&X&&(me.else(),(0,l.reportTypeError)(q)),me.endIf()):ue(q,tt),Ie||me.if((0,h._)`${m.default.errors} === ${se||0}`))}}function ue(q,G){const{gen:X,schema:se,opts:{useDefaults:me}}=q;me&&(0,c.assignDefaults)(q,G.type),X.block(()=>{for(const ye of G.rules)(0,u.shouldUseRule)(se,ye)&&pe(q,ye.keyword,ye.definition,G.type)})}function re(q,G){q.schemaEnv.meta||!q.opts.strictTypes||(de(q,G),q.opts.allowUnionTypes||R(q,G),z(q,q.dataTypes))}function de(q,G){if(G.length){if(!q.dataTypes.length){q.dataTypes=G;return}G.forEach(X=>{k(q.dataTypes,X)||H(q,`type "${X}" not allowed by context "${q.dataTypes.join(",")}"`)}),T(q,G)}}function R(q,G){G.length>1&&!(G.length===2&&G.includes("null"))&&H(q,"use allowUnionTypes to allow union type keyword")}function z(q,G){const X=q.self.RULES.all;for(const se in X){const me=X[se];if(typeof me=="object"&&(0,u.shouldUseRule)(q.schema,me)){const{type:ye}=me.definition;ye.length&&!ye.some(Ae=>K(G,Ae))&&H(q,`missing type "${ye.join(",")}" for keyword "${se}"`)}}}function K(q,G){return q.includes(G)||G==="number"&&q.includes("integer")}function k(q,G){return q.includes(G)||G==="integer"&&q.includes("number")}function T(q,G){const X=[];for(const se of q.dataTypes)k(G,se)?X.push(se):G.includes("integer")&&se==="number"&&X.push("integer");q.dataTypes=X}function H(q,G){const X=q.schemaEnv.baseId+q.errSchemaPath;G+=` at "${X}" (strictTypes)`,(0,S.checkStrictMode)(q,G,q.opts.strictTypes)}class te{constructor(G,X,se){if((0,o.validateKeywordUsage)(G,X,se),this.gen=G.gen,this.allErrors=G.allErrors,this.keyword=se,this.data=G.data,this.schema=G.schema[se],this.$data=X.$data&&G.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,S.schemaRefOrVal)(G,this.schema,se,this.$data),this.schemaType=X.schemaType,this.parentSchema=G.schema,this.params={},this.it=G,this.def=X,this.$data)this.schemaCode=G.gen.const("vSchema",B(this.$data,G));else if(this.schemaCode=this.schemaValue,!(0,o.validSchemaType)(this.schema,X.schemaType,X.allowUndefined))throw new Error(`${se} value must be ${JSON.stringify(X.schemaType)}`);("code"in X?X.trackErrors:X.errors!==!1)&&(this.errsCount=G.gen.const("_errs",m.default.errors))}result(G,X,se){this.failResult((0,h.not)(G),X,se)}failResult(G,X,se){this.gen.if(G),se?se():this.error(),X?(this.gen.else(),X(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(G,X){this.failResult((0,h.not)(G),void 0,X)}fail(G){if(G===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(G),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(G){if(!this.$data)return this.fail(G);const{schemaCode:X}=this;this.fail((0,h._)`${X} !== undefined && (${(0,h.or)(this.invalid$data(),G)})`)}error(G,X,se){if(X){this.setParams(X),this._error(G,se),this.setParams({});return}this._error(G,se)}_error(G,X){(G?N.reportExtraError:N.reportError)(this,this.def.error,X)}$dataError(){(0,N.reportError)(this,this.def.$dataError||N.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,N.resetErrorsCount)(this.gen,this.errsCount)}ok(G){this.allErrors||this.gen.if(G)}setParams(G,X){X?Object.assign(this.params,G):this.params=G}block$data(G,X,se=h.nil){this.gen.block(()=>{this.check$data(G,se),X()})}check$data(G=h.nil,X=h.nil){if(!this.$data)return;const{gen:se,schemaCode:me,schemaType:ye,def:Ae}=this;se.if((0,h.or)((0,h._)`${me} === undefined`,X)),G!==h.nil&&se.assign(G,!0),(ye.length||Ae.validateSchema)&&(se.elseIf(this.invalid$data()),this.$dataError(),G!==h.nil&&se.assign(G,!1)),se.else()}invalid$data(){const{gen:G,schemaCode:X,schemaType:se,def:me,it:ye}=this;return(0,h.or)(Ae(),Ie());function Ae(){if(se.length){if(!(X instanceof h.Name))throw new Error("ajv implementation error");const Ue=Array.isArray(se)?se:[se];return(0,h._)`${(0,l.checkDataTypes)(Ue,X,ye.opts.strictNumbers,l.DataType.Wrong)}`}return h.nil}function Ie(){if(me.validateSchema){const Ue=G.scopeValue("validate$data",{ref:me.validateSchema});return(0,h._)`!${Ue}(${X})`}return h.nil}}subschema(G,X){const se=(0,d.getSubschema)(this.it,G);(0,d.extendSubschemaData)(se,this.it,G),(0,d.extendSubschemaMode)(se,G);const me={...this.it,...se,items:void 0,props:void 0};return b(me,X),me}mergeEvaluated(G,X){const{it:se,gen:me}=this;se.opts.unevaluated&&(se.props!==!0&&G.props!==void 0&&(se.props=S.mergeEvaluated.props(me,G.props,se.props,X)),se.items!==!0&&G.items!==void 0&&(se.items=S.mergeEvaluated.items(me,G.items,se.items,X)))}mergeValidEvaluated(G,X){const{it:se,gen:me}=this;if(se.opts.unevaluated&&(se.props!==!0||se.items!==!0))return me.if(X,()=>this.mergeEvaluated(G,h.Name)),!0}}Dn.KeywordCxt=te;function pe(q,G,X,se){const me=new te(q,X,G);"code"in X?X.code(me,se):me.$data&&X.validate?(0,o.funcKeywordCode)(me,X):"macro"in X?(0,o.macroKeywordCode)(me,X):(X.compile||X.validate)&&(0,o.funcKeywordCode)(me,X)}const ae=/^\/(?:[^~]|~0|~1)*$/,M=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function B(q,{dataLevel:G,dataNames:X,dataPathArr:se}){let me,ye;if(q==="")return m.default.rootData;if(q[0]==="/"){if(!ae.test(q))throw new Error(`Invalid JSON-pointer: ${q}`);me=q,ye=m.default.rootData}else{const Le=M.exec(q);if(!Le)throw new Error(`Invalid JSON-pointer: ${q}`);const Re=+Le[1];if(me=Le[2],me==="#"){if(Re>=G)throw new Error(Ue("property/index",Re));return se[G-Re]}if(Re>G)throw new Error(Ue("data",Re));if(ye=X[G-Re],!me)return ye}let Ae=ye;const Ie=me.split("/");for(const Le of Ie)Le&&(ye=(0,h._)`${ye}${(0,h.getProperty)((0,S.unescapeJsonPointer)(Le))}`,Ae=(0,h._)`${Ae} && ${ye}`);return Ae;function Ue(Le,Re){return`Cannot access ${Le} ${Re} levels up, current level is ${G}`}}return Dn.getData=B,Dn}var Js={},ey;function Dc(){if(ey)return Js;ey=1,Object.defineProperty(Js,"__esModule",{value:!0});class r extends Error{constructor(u){super("validation failed"),this.errors=u,this.ajv=this.validation=!0}}return Js.default=r,Js}var Fs={},ty;function Fl(){if(ty)return Fs;ty=1,Object.defineProperty(Fs,"__esModule",{value:!0});const r=Zl();class i extends Error{constructor(l,c,o,d){super(d||`can't resolve reference ${o} from id ${c}`),this.missingRef=(0,r.resolveUrl)(l,c,o),this.missingSchema=(0,r.normalizeId)((0,r.getFullPath)(l,this.missingRef))}}return Fs.default=i,Fs}var Ut={},ny;function Mc(){if(ny)return Ut;ny=1,Object.defineProperty(Ut,"__esModule",{value:!0}),Ut.resolveSchema=Ut.getCompilingSchema=Ut.resolveRef=Ut.compileSchema=Ut.SchemaEnv=void 0;const r=Me(),i=Dc(),u=fr(),l=Zl(),c=Be(),o=Jl();class d{constructor(w){var p;this.refs={},this.dynamicAnchors={};let b;typeof w.schema=="object"&&(b=w.schema),this.schema=w.schema,this.schemaId=w.schemaId,this.root=w.root||this,this.baseId=(p=w.baseId)!==null&&p!==void 0?p:(0,l.normalizeId)(b==null?void 0:b[w.schemaId||"$id"]),this.schemaPath=w.schemaPath,this.localRefs=w.localRefs,this.meta=w.meta,this.$async=b==null?void 0:b.$async,this.refs={}}}Ut.SchemaEnv=d;function h(g){const w=S.call(this,g);if(w)return w;const p=(0,l.getFullPath)(this.opts.uriResolver,g.root.baseId),{es5:b,lines:E}=this.opts.code,{ownProperties:O}=this.opts,v=new r.CodeGen(this.scope,{es5:b,lines:E,ownProperties:O});let A;g.$async&&(A=v.scopeValue("Error",{ref:i.default,code:(0,r._)`require("ajv/dist/runtime/validation_error").default`}));const $=v.scopeName("validate");g.validateName=$;const D={gen:v,allErrors:this.opts.allErrors,data:u.default.data,parentData:u.default.parentData,parentDataProperty:u.default.parentDataProperty,dataNames:[u.default.data],dataPathArr:[r.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:v.scopeValue("schema",this.opts.code.source===!0?{ref:g.schema,code:(0,r.stringify)(g.schema)}:{ref:g.schema}),validateName:$,ValidationError:A,schema:g.schema,schemaEnv:g,rootId:p,baseId:g.baseId||p,schemaPath:r.nil,errSchemaPath:g.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,r._)`""`,opts:this.opts,self:this};let j;try{this._compilations.add(g),(0,o.validateFunctionCode)(D),v.optimize(this.opts.code.optimize);const Y=v.toString();j=`${v.scopeRefs(u.default.scope)}return ${Y}`,this.opts.code.process&&(j=this.opts.code.process(j,g));const W=new Function(`${u.default.self}`,`${u.default.scope}`,j)(this,this.scope.get());if(this.scope.value($,{ref:W}),W.errors=null,W.schema=g.schema,W.schemaEnv=g,g.$async&&(W.$async=!0),this.opts.code.source===!0&&(W.source={validateName:$,validateCode:Y,scopeValues:v._values}),this.opts.unevaluated){const{props:F,items:ne}=D;W.evaluated={props:F instanceof r.Name?void 0:F,items:ne instanceof r.Name?void 0:ne,dynamicProps:F instanceof r.Name,dynamicItems:ne instanceof r.Name},W.source&&(W.source.evaluated=(0,r.stringify)(W.evaluated))}return g.validate=W,g}catch(Y){throw delete g.validate,delete g.validateName,j&&this.logger.error("Error compiling schema, function code:",j),Y}finally{this._compilations.delete(g)}}Ut.compileSchema=h;function m(g,w,p){var b;p=(0,l.resolveUrl)(this.opts.uriResolver,w,p);const E=g.refs[p];if(E)return E;let O=x.call(this,g,p);if(O===void 0){const v=(b=g.localRefs)===null||b===void 0?void 0:b[p],{schemaId:A}=this.opts;v&&(O=new d({schema:v,schemaId:A,root:g,baseId:w}))}if(O!==void 0)return g.refs[p]=y.call(this,O)}Ut.resolveRef=m;function y(g){return(0,l.inlineRef)(g.schema,this.opts.inlineRefs)?g.schema:g.validate?g:h.call(this,g)}function S(g){for(const w of this._compilations)if(N(w,g))return w}Ut.getCompilingSchema=S;function N(g,w){return g.schema===w.schema&&g.root===w.root&&g.baseId===w.baseId}function x(g,w){let p;for(;typeof(p=this.refs[w])=="string";)w=p;return p||this.schemas[w]||V.call(this,g,w)}function V(g,w){const p=this.opts.uriResolver.parse(w),b=(0,l._getFullPath)(this.opts.uriResolver,p);let E=(0,l.getFullPath)(this.opts.uriResolver,g.baseId,void 0);if(Object.keys(g.schema).length>0&&b===E)return C.call(this,p,g);const O=(0,l.normalizeId)(b),v=this.refs[O]||this.schemas[O];if(typeof v=="string"){const A=V.call(this,g,v);return typeof(A==null?void 0:A.schema)!="object"?void 0:C.call(this,p,A)}if(typeof(v==null?void 0:v.schema)=="object"){if(v.validate||h.call(this,v),O===(0,l.normalizeId)(w)){const{schema:A}=v,{schemaId:$}=this.opts,D=A[$];return D&&(E=(0,l.resolveUrl)(this.opts.uriResolver,E,D)),new d({schema:A,schemaId:$,root:g,baseId:E})}return C.call(this,p,v)}}Ut.resolveSchema=V;const L=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function C(g,{baseId:w,schema:p,root:b}){var E;if(((E=g.fragment)===null||E===void 0?void 0:E[0])!=="/")return;for(const A of g.fragment.slice(1).split("/")){if(typeof p=="boolean")return;const $=p[(0,c.unescapeFragment)(A)];if($===void 0)return;p=$;const D=typeof p=="object"&&p[this.opts.schemaId];!L.has(A)&&D&&(w=(0,l.resolveUrl)(this.opts.uriResolver,w,D))}let O;if(typeof p!="boolean"&&p.$ref&&!(0,c.schemaHasRulesButRef)(p,this.RULES)){const A=(0,l.resolveUrl)(this.opts.uriResolver,w,p.$ref);O=V.call(this,b,A)}const{schemaId:v}=this.opts;if(O=O||new d({schema:p,schemaId:v,root:b,baseId:w}),O.schema!==O.root.schema)return O}return Ut}const wb="https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",$b="Meta-schema for $data reference (JSON AnySchema extension proposal)",Ob="object",Ab=["$data"],Rb={$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},Tb=!1,Nb={$id:wb,description:$b,type:Ob,required:Ab,properties:Rb,additionalProperties:Tb};var Ws={},Ai={exports:{}},Of,ry;function jb(){return ry||(ry=1,Of={HEX:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15}}),Of}var Af,ay;function Db(){if(ay)return Af;ay=1;const{HEX:r}=jb(),i=/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u;function u(C){if(h(C,".")<3)return{host:C,isIPV4:!1};const g=C.match(i)||[],[w]=g;return w?{host:d(w,"."),isIPV4:!0}:{host:C,isIPV4:!1}}function l(C,g=!1){let w="",p=!0;for(const b of C){if(r[b]===void 0)return;b!=="0"&&p===!0&&(p=!1),p||(w+=b)}return g&&w.length===0&&(w="0"),w}function c(C){let g=0;const w={error:!1,address:"",zone:""},p=[],b=[];let E=!1,O=!1,v=!1;function A(){if(b.length){if(E===!1){const $=l(b);if($!==void 0)p.push($);else return w.error=!0,!1}b.length=0}return!0}for(let $=0;$7){w.error=!0;break}$-1>=0&&C[$-1]===":"&&(O=!0);continue}else if(D==="%"){if(!A())break;E=!0}else{b.push(D);continue}}return b.length&&(E?w.zone=b.join(""):v?p.push(b.join("")):p.push(l(b))),w.address=p.join(""),w}function o(C){if(h(C,":")<2)return{host:C,isIPV6:!1};const g=c(C);if(g.error)return{host:C,isIPV6:!1};{let w=g.address,p=g.address;return g.zone&&(w+="%"+g.zone,p+="%25"+g.zone),{host:w,escapedHost:p,isIPV6:!0}}}function d(C,g){let w="",p=!0;const b=C.length;for(let E=0;E/[^!"$&'()*+,\-.;=_`a-z{}~]/u.test(String.fromCharCode(w)));function x(g){let w=0;for(let p=0,b=g.length;p126||N[w])return!0;return!1}const V=/^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;function L(g,w){const p=Object.assign({},w),b={scheme:void 0,userinfo:void 0,host:"",port:void 0,path:"",query:void 0,fragment:void 0},E=g.indexOf("%")!==-1;let O=!1;p.reference==="suffix"&&(g=(p.scheme?p.scheme+":":"")+"//"+g);const v=g.match(V);if(v){if(b.scheme=v[1],b.userinfo=v[3],b.host=v[4],b.port=parseInt(v[5],10),b.path=v[6]||"",b.query=v[7],b.fragment=v[8],isNaN(b.port)&&(b.port=v[5]),b.host){const $=i(b.host);if($.isIPV4===!1){const D=r($.host);b.host=D.host.toLowerCase(),O=D.isIPV6}else b.host=$.host,O=!0}b.scheme===void 0&&b.userinfo===void 0&&b.host===void 0&&b.port===void 0&&!b.path&&b.query===void 0?b.reference="same-document":b.scheme===void 0?b.reference="relative":b.fragment===void 0?b.reference="absolute":b.reference="uri",p.reference&&p.reference!=="suffix"&&p.reference!==b.reference&&(b.error=b.error||"URI is not a "+p.reference+" reference.");const A=o[(p.scheme||b.scheme||"").toLowerCase()];if(!p.unicodeSupport&&(!A||!A.unicodeSupport)&&b.host&&(p.domainHost||A&&A.domainHost)&&O===!1&&x(b.host))try{b.host=URL.domainToASCII(b.host.toLowerCase())}catch($){b.error=b.error||"Host's domain name can not be converted to ASCII: "+$}(!A||A&&!A.skipNormalize)&&(E&&b.scheme!==void 0&&(b.scheme=unescape(b.scheme)),E&&b.host!==void 0&&(b.host=unescape(b.host)),b.path&&b.path.length&&(b.path=escape(unescape(b.path))),b.fragment&&b.fragment.length&&(b.fragment=encodeURI(decodeURIComponent(b.fragment)))),A&&A.parse&&A.parse(b,p)}else b.error=b.error||"URI can not be parsed.";return b}const C={SCHEMES:o,normalize:d,resolve:h,resolveComponents:m,equal:y,serialize:S,parse:L};return Ai.exports=C,Ai.exports.default=C,Ai.exports.fastUri=C,Ai.exports}var ly;function Cb(){if(ly)return Ws;ly=1,Object.defineProperty(Ws,"__esModule",{value:!0});const r=qb();return r.code='require("ajv/dist/runtime/uri").default',Ws.default=r,Ws}var uy;function zb(){return uy||(uy=1,function(r){Object.defineProperty(r,"__esModule",{value:!0}),r.CodeGen=r.Name=r.nil=r.stringify=r.str=r._=r.KeywordCxt=void 0;var i=Jl();Object.defineProperty(r,"KeywordCxt",{enumerable:!0,get:function(){return i.KeywordCxt}});var u=Me();Object.defineProperty(r,"_",{enumerable:!0,get:function(){return u._}}),Object.defineProperty(r,"str",{enumerable:!0,get:function(){return u.str}}),Object.defineProperty(r,"stringify",{enumerable:!0,get:function(){return u.stringify}}),Object.defineProperty(r,"nil",{enumerable:!0,get:function(){return u.nil}}),Object.defineProperty(r,"Name",{enumerable:!0,get:function(){return u.Name}}),Object.defineProperty(r,"CodeGen",{enumerable:!0,get:function(){return u.CodeGen}});const l=Dc(),c=Fl(),o=ov(),d=Mc(),h=Me(),m=Zl(),y=Hl(),S=Be(),N=Nb,x=Cb(),V=(R,z)=>new RegExp(R,z);V.code="new RegExp";const L=["removeAdditional","useDefaults","coerceTypes"],C=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),g={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},w={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},p=200;function b(R){var z,K,k,T,H,te,pe,ae,M,B,q,G,X,se,me,ye,Ae,Ie,Ue,Le,Re,He,tt,dt,Aa;const Un=R.strict,xr=(z=R.code)===null||z===void 0?void 0:z.optimize,cr=xr===!0||xr===void 0?1:xr||0,Li=(k=(K=R.code)===null||K===void 0?void 0:K.regExp)!==null&&k!==void 0?k:V,Vi=(T=R.uriResolver)!==null&&T!==void 0?T:x.default;return{strictSchema:(te=(H=R.strictSchema)!==null&&H!==void 0?H:Un)!==null&&te!==void 0?te:!0,strictNumbers:(ae=(pe=R.strictNumbers)!==null&&pe!==void 0?pe:Un)!==null&&ae!==void 0?ae:!0,strictTypes:(B=(M=R.strictTypes)!==null&&M!==void 0?M:Un)!==null&&B!==void 0?B:"log",strictTuples:(G=(q=R.strictTuples)!==null&&q!==void 0?q:Un)!==null&&G!==void 0?G:"log",strictRequired:(se=(X=R.strictRequired)!==null&&X!==void 0?X:Un)!==null&&se!==void 0?se:!1,code:R.code?{...R.code,optimize:cr,regExp:Li}:{optimize:cr,regExp:Li},loopRequired:(me=R.loopRequired)!==null&&me!==void 0?me:p,loopEnum:(ye=R.loopEnum)!==null&&ye!==void 0?ye:p,meta:(Ae=R.meta)!==null&&Ae!==void 0?Ae:!0,messages:(Ie=R.messages)!==null&&Ie!==void 0?Ie:!0,inlineRefs:(Ue=R.inlineRefs)!==null&&Ue!==void 0?Ue:!0,schemaId:(Le=R.schemaId)!==null&&Le!==void 0?Le:"$id",addUsedSchema:(Re=R.addUsedSchema)!==null&&Re!==void 0?Re:!0,validateSchema:(He=R.validateSchema)!==null&&He!==void 0?He:!0,validateFormats:(tt=R.validateFormats)!==null&&tt!==void 0?tt:!0,unicodeRegExp:(dt=R.unicodeRegExp)!==null&&dt!==void 0?dt:!0,int32range:(Aa=R.int32range)!==null&&Aa!==void 0?Aa:!0,uriResolver:Vi}}class E{constructor(z={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,z=this.opts={...z,...b(z)};const{es5:K,lines:k}=this.opts.code;this.scope=new h.ValueScope({scope:{},prefixes:C,es5:K,lines:k}),this.logger=Q(z.logger);const T=z.validateFormats;z.validateFormats=!1,this.RULES=(0,o.getRules)(),O.call(this,g,z,"NOT SUPPORTED"),O.call(this,w,z,"DEPRECATED","warn"),this._metaOpts=j.call(this),z.formats&&$.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),z.keywords&&D.call(this,z.keywords),typeof z.meta=="object"&&this.addMetaSchema(z.meta),A.call(this),z.validateFormats=T}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){const{$data:z,meta:K,schemaId:k}=this.opts;let T=N;k==="id"&&(T={...N},T.id=T.$id,delete T.$id),K&&z&&this.addMetaSchema(T,T[k],!1)}defaultMeta(){const{meta:z,schemaId:K}=this.opts;return this.opts.defaultMeta=typeof z=="object"?z[K]||z:void 0}validate(z,K){let k;if(typeof z=="string"){if(k=this.getSchema(z),!k)throw new Error(`no schema with key or ref "${z}"`)}else k=this.compile(z);const T=k(K);return"$async"in k||(this.errors=k.errors),T}compile(z,K){const k=this._addSchema(z,K);return k.validate||this._compileSchemaEnv(k)}compileAsync(z,K){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");const{loadSchema:k}=this.opts;return T.call(this,z,K);async function T(B,q){await H.call(this,B.$schema);const G=this._addSchema(B,q);return G.validate||te.call(this,G)}async function H(B){B&&!this.getSchema(B)&&await T.call(this,{$ref:B},!0)}async function te(B){try{return this._compileSchemaEnv(B)}catch(q){if(!(q instanceof c.default))throw q;return pe.call(this,q),await ae.call(this,q.missingSchema),te.call(this,B)}}function pe({missingSchema:B,missingRef:q}){if(this.refs[B])throw new Error(`AnySchema ${B} is loaded but ${q} cannot be resolved`)}async function ae(B){const q=await M.call(this,B);this.refs[B]||await H.call(this,q.$schema),this.refs[B]||this.addSchema(q,B,K)}async function M(B){const q=this._loading[B];if(q)return q;try{return await(this._loading[B]=k(B))}finally{delete this._loading[B]}}}addSchema(z,K,k,T=this.opts.validateSchema){if(Array.isArray(z)){for(const te of z)this.addSchema(te,void 0,k,T);return this}let H;if(typeof z=="object"){const{schemaId:te}=this.opts;if(H=z[te],H!==void 0&&typeof H!="string")throw new Error(`schema ${te} must be string`)}return K=(0,m.normalizeId)(K||H),this._checkUnique(K),this.schemas[K]=this._addSchema(z,k,K,T,!0),this}addMetaSchema(z,K,k=this.opts.validateSchema){return this.addSchema(z,K,!0,k),this}validateSchema(z,K){if(typeof z=="boolean")return!0;let k;if(k=z.$schema,k!==void 0&&typeof k!="string")throw new Error("$schema must be a string");if(k=k||this.opts.defaultMeta||this.defaultMeta(),!k)return this.logger.warn("meta-schema not available"),this.errors=null,!0;const T=this.validate(k,z);if(!T&&K){const H="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(H);else throw new Error(H)}return T}getSchema(z){let K;for(;typeof(K=v.call(this,z))=="string";)z=K;if(K===void 0){const{schemaId:k}=this.opts,T=new d.SchemaEnv({schema:{},schemaId:k});if(K=d.resolveSchema.call(this,T,z),!K)return;this.refs[z]=K}return K.validate||this._compileSchemaEnv(K)}removeSchema(z){if(z instanceof RegExp)return this._removeAllSchemas(this.schemas,z),this._removeAllSchemas(this.refs,z),this;switch(typeof z){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{const K=v.call(this,z);return typeof K=="object"&&this._cache.delete(K.schema),delete this.schemas[z],delete this.refs[z],this}case"object":{const K=z;this._cache.delete(K);let k=z[this.opts.schemaId];return k&&(k=(0,m.normalizeId)(k),delete this.schemas[k],delete this.refs[k]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(z){for(const K of z)this.addKeyword(K);return this}addKeyword(z,K){let k;if(typeof z=="string")k=z,typeof K=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),K.keyword=k);else if(typeof z=="object"&&K===void 0){if(K=z,k=K.keyword,Array.isArray(k)&&!k.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(F.call(this,k,K),!K)return(0,S.eachItem)(k,H=>ne.call(this,H)),this;ue.call(this,K);const T={...K,type:(0,y.getJSONTypes)(K.type),schemaType:(0,y.getJSONTypes)(K.schemaType)};return(0,S.eachItem)(k,T.type.length===0?H=>ne.call(this,H,T):H=>T.type.forEach(te=>ne.call(this,H,T,te))),this}getKeyword(z){const K=this.RULES.all[z];return typeof K=="object"?K.definition:!!K}removeKeyword(z){const{RULES:K}=this;delete K.keywords[z],delete K.all[z];for(const k of K.rules){const T=k.rules.findIndex(H=>H.keyword===z);T>=0&&k.rules.splice(T,1)}return this}addFormat(z,K){return typeof K=="string"&&(K=new RegExp(K)),this.formats[z]=K,this}errorsText(z=this.errors,{separator:K=", ",dataVar:k="data"}={}){return!z||z.length===0?"No errors":z.map(T=>`${k}${T.instancePath} ${T.message}`).reduce((T,H)=>T+K+H)}$dataMetaSchema(z,K){const k=this.RULES.all;z=JSON.parse(JSON.stringify(z));for(const T of K){const H=T.split("/").slice(1);let te=z;for(const pe of H)te=te[pe];for(const pe in k){const ae=k[pe];if(typeof ae!="object")continue;const{$data:M}=ae.definition,B=te[pe];M&&B&&(te[pe]=de(B))}}return z}_removeAllSchemas(z,K){for(const k in z){const T=z[k];(!K||K.test(k))&&(typeof T=="string"?delete z[k]:T&&!T.meta&&(this._cache.delete(T.schema),delete z[k]))}}_addSchema(z,K,k,T=this.opts.validateSchema,H=this.opts.addUsedSchema){let te;const{schemaId:pe}=this.opts;if(typeof z=="object")te=z[pe];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof z!="boolean")throw new Error("schema must be object or boolean")}let ae=this._cache.get(z);if(ae!==void 0)return ae;k=(0,m.normalizeId)(te||k);const M=m.getSchemaRefs.call(this,z,k);return ae=new d.SchemaEnv({schema:z,schemaId:pe,meta:K,baseId:k,localRefs:M}),this._cache.set(ae.schema,ae),H&&!k.startsWith("#")&&(k&&this._checkUnique(k),this.refs[k]=ae),T&&this.validateSchema(z,!0),ae}_checkUnique(z){if(this.schemas[z]||this.refs[z])throw new Error(`schema with key or id "${z}" already exists`)}_compileSchemaEnv(z){if(z.meta?this._compileMetaSchema(z):d.compileSchema.call(this,z),!z.validate)throw new Error("ajv implementation error");return z.validate}_compileMetaSchema(z){const K=this.opts;this.opts=this._metaOpts;try{d.compileSchema.call(this,z)}finally{this.opts=K}}}E.ValidationError=l.default,E.MissingRefError=c.default,r.default=E;function O(R,z,K,k="error"){for(const T in R){const H=T;H in z&&this.logger[k](`${K}: option ${T}. ${R[H]}`)}}function v(R){return R=(0,m.normalizeId)(R),this.schemas[R]||this.refs[R]}function A(){const R=this.opts.schemas;if(R)if(Array.isArray(R))this.addSchema(R);else for(const z in R)this.addSchema(R[z],z)}function $(){for(const R in this.opts.formats){const z=this.opts.formats[R];z&&this.addFormat(R,z)}}function D(R){if(Array.isArray(R)){this.addVocabulary(R);return}this.logger.warn("keywords option as map is deprecated, pass array");for(const z in R){const K=R[z];K.keyword||(K.keyword=z),this.addKeyword(K)}}function j(){const R={...this.opts};for(const z of L)delete R[z];return R}const Y={log(){},warn(){},error(){}};function Q(R){if(R===!1)return Y;if(R===void 0)return console;if(R.log&&R.warn&&R.error)return R;throw new Error("logger must implement log, warn and error methods")}const W=/^[a-z_$][a-z0-9_$:-]*$/i;function F(R,z){const{RULES:K}=this;if((0,S.eachItem)(R,k=>{if(K.keywords[k])throw new Error(`Keyword ${k} is already defined`);if(!W.test(k))throw new Error(`Keyword ${k} has invalid name`)}),!!z&&z.$data&&!("code"in z||"validate"in z))throw new Error('$data keyword must have "code" or "validate" function')}function ne(R,z,K){var k;const T=z==null?void 0:z.post;if(K&&T)throw new Error('keyword with "post" flag cannot have "type"');const{RULES:H}=this;let te=T?H.post:H.rules.find(({type:ae})=>ae===K);if(te||(te={type:K,rules:[]},H.rules.push(te)),H.keywords[R]=!0,!z)return;const pe={keyword:R,definition:{...z,type:(0,y.getJSONTypes)(z.type),schemaType:(0,y.getJSONTypes)(z.schemaType)}};z.before?P.call(this,te,pe,z.before):te.rules.push(pe),H.all[R]=pe,(k=z.implements)===null||k===void 0||k.forEach(ae=>this.addKeyword(ae))}function P(R,z,K){const k=R.rules.findIndex(T=>T.keyword===K);k>=0?R.rules.splice(k,0,z):(R.rules.push(z),this.logger.warn(`rule ${K} is not defined`))}function ue(R){let{metaSchema:z}=R;z!==void 0&&(R.$data&&this.opts.$data&&(z=de(z)),R.validateSchema=this.compile(z,!0))}const re={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function de(R){return{anyOf:[R,re]}}}(vf)),vf}var el={},tl={},nl={},oy;function Ub(){if(oy)return nl;oy=1,Object.defineProperty(nl,"__esModule",{value:!0});const r={keyword:"id",code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID')}};return nl.default=r,nl}var sr={},fy;function Lb(){if(fy)return sr;fy=1,Object.defineProperty(sr,"__esModule",{value:!0}),sr.callRef=sr.getValidate=void 0;const r=Fl(),i=an(),u=Me(),l=fr(),c=Mc(),o=Be(),d={keyword:"$ref",schemaType:"string",code(y){const{gen:S,schema:N,it:x}=y,{baseId:V,schemaEnv:L,validateName:C,opts:g,self:w}=x,{root:p}=L;if((N==="#"||N==="#/")&&V===p.baseId)return E();const b=c.resolveRef.call(w,p,V,N);if(b===void 0)throw new r.default(x.opts.uriResolver,V,N);if(b instanceof c.SchemaEnv)return O(b);return v(b);function E(){if(L===p)return m(y,C,L,L.$async);const A=S.scopeValue("root",{ref:p});return m(y,(0,u._)`${A}.validate`,p,p.$async)}function O(A){const $=h(y,A);m(y,$,A,A.$async)}function v(A){const $=S.scopeValue("schema",g.code.source===!0?{ref:A,code:(0,u.stringify)(A)}:{ref:A}),D=S.name("valid"),j=y.subschema({schema:A,dataTypes:[],schemaPath:u.nil,topSchemaRef:$,errSchemaPath:N},D);y.mergeEvaluated(j),y.ok(D)}}};function h(y,S){const{gen:N}=y;return S.validate?N.scopeValue("validate",{ref:S.validate}):(0,u._)`${N.scopeValue("wrapper",{ref:S})}.validate`}sr.getValidate=h;function m(y,S,N,x){const{gen:V,it:L}=y,{allErrors:C,schemaEnv:g,opts:w}=L,p=w.passContext?l.default.this:u.nil;x?b():E();function b(){if(!g.$async)throw new Error("async schema referenced by sync schema");const A=V.let("valid");V.try(()=>{V.code((0,u._)`await ${(0,i.callValidateCode)(y,S,p)}`),v(S),C||V.assign(A,!0)},$=>{V.if((0,u._)`!(${$} instanceof ${L.ValidationError})`,()=>V.throw($)),O($),C||V.assign(A,!1)}),y.ok(A)}function E(){y.result((0,i.callValidateCode)(y,S,p),()=>v(S),()=>O(S))}function O(A){const $=(0,u._)`${A}.errors`;V.assign(l.default.vErrors,(0,u._)`${l.default.vErrors} === null ? ${$} : ${l.default.vErrors}.concat(${$})`),V.assign(l.default.errors,(0,u._)`${l.default.vErrors}.length`)}function v(A){var $;if(!L.opts.unevaluated)return;const D=($=N==null?void 0:N.validate)===null||$===void 0?void 0:$.evaluated;if(L.props!==!0)if(D&&!D.dynamicProps)D.props!==void 0&&(L.props=o.mergeEvaluated.props(V,D.props,L.props));else{const j=V.var("props",(0,u._)`${A}.evaluated.props`);L.props=o.mergeEvaluated.props(V,j,L.props,u.Name)}if(L.items!==!0)if(D&&!D.dynamicItems)D.items!==void 0&&(L.items=o.mergeEvaluated.items(V,D.items,L.items));else{const j=V.var("items",(0,u._)`${A}.evaluated.items`);L.items=o.mergeEvaluated.items(V,j,L.items,u.Name)}}}return sr.callRef=m,sr.default=d,sr}var cy;function Vb(){if(cy)return tl;cy=1,Object.defineProperty(tl,"__esModule",{value:!0});const r=Ub(),i=Lb(),u=["$schema","$id","$defs","$vocabulary",{keyword:"$comment"},"definitions",r.default,i.default];return tl.default=u,tl}var rl={},al={},dy;function xb(){if(dy)return al;dy=1,Object.defineProperty(al,"__esModule",{value:!0});const r=Me(),i=r.operators,u={maximum:{okStr:"<=",ok:i.LTE,fail:i.GT},minimum:{okStr:">=",ok:i.GTE,fail:i.LT},exclusiveMaximum:{okStr:"<",ok:i.LT,fail:i.GTE},exclusiveMinimum:{okStr:">",ok:i.GT,fail:i.LTE}},l={message:({keyword:o,schemaCode:d})=>(0,r.str)`must be ${u[o].okStr} ${d}`,params:({keyword:o,schemaCode:d})=>(0,r._)`{comparison: ${u[o].okStr}, limit: ${d}}`},c={keyword:Object.keys(u),type:"number",schemaType:"number",$data:!0,error:l,code(o){const{keyword:d,data:h,schemaCode:m}=o;o.fail$data((0,r._)`${h} ${u[d].fail} ${m} || isNaN(${h})`)}};return al.default=c,al}var il={},hy;function Bb(){if(hy)return il;hy=1,Object.defineProperty(il,"__esModule",{value:!0});const r=Me(),u={keyword:"multipleOf",type:"number",schemaType:"number",$data:!0,error:{message:({schemaCode:l})=>(0,r.str)`must be multiple of ${l}`,params:({schemaCode:l})=>(0,r._)`{multipleOf: ${l}}`},code(l){const{gen:c,data:o,schemaCode:d,it:h}=l,m=h.opts.multipleOfPrecision,y=c.let("res"),S=m?(0,r._)`Math.abs(Math.round(${y}) - ${y}) > 1e-${m}`:(0,r._)`${y} !== parseInt(${y})`;l.fail$data((0,r._)`(${d} === 0 || (${y} = ${o}/${d}, ${S}))`)}};return il.default=u,il}var sl={},ll={},my;function Hb(){if(my)return ll;my=1,Object.defineProperty(ll,"__esModule",{value:!0});function r(i){const u=i.length;let l=0,c=0,o;for(;c=55296&&o<=56319&&c(0,r._)`{limit: ${o}}`},code(o){const{keyword:d,data:h,schemaCode:m,it:y}=o,S=d==="maxLength"?r.operators.GT:r.operators.LT,N=y.opts.unicode===!1?(0,r._)`${h}.length`:(0,r._)`${(0,i.useFunc)(o.gen,u.default)}(${h})`;o.fail$data((0,r._)`${N} ${S} ${m}`)}};return sl.default=c,sl}var ul={},yy;function Ib(){if(yy)return ul;yy=1,Object.defineProperty(ul,"__esModule",{value:!0});const r=an(),i=Me(),l={keyword:"pattern",type:"string",schemaType:"string",$data:!0,error:{message:({schemaCode:c})=>(0,i.str)`must match pattern "${c}"`,params:({schemaCode:c})=>(0,i._)`{pattern: ${c}}`},code(c){const{data:o,$data:d,schema:h,schemaCode:m,it:y}=c,S=y.opts.unicodeRegExp?"u":"",N=d?(0,i._)`(new RegExp(${m}, ${S}))`:(0,r.usePattern)(c,h);c.fail$data((0,i._)`!${N}.test(${o})`)}};return ul.default=l,ul}var ol={},gy;function Yb(){if(gy)return ol;gy=1,Object.defineProperty(ol,"__esModule",{value:!0});const r=Me(),u={keyword:["maxProperties","minProperties"],type:"object",schemaType:"number",$data:!0,error:{message({keyword:l,schemaCode:c}){const o=l==="maxProperties"?"more":"fewer";return(0,r.str)`must NOT have ${o} than ${c} properties`},params:({schemaCode:l})=>(0,r._)`{limit: ${l}}`},code(l){const{keyword:c,data:o,schemaCode:d}=l,h=c==="maxProperties"?r.operators.GT:r.operators.LT;l.fail$data((0,r._)`Object.keys(${o}).length ${h} ${d}`)}};return ol.default=u,ol}var fl={},vy;function kb(){if(vy)return fl;vy=1,Object.defineProperty(fl,"__esModule",{value:!0});const r=an(),i=Me(),u=Be(),c={keyword:"required",type:"object",schemaType:"array",$data:!0,error:{message:({params:{missingProperty:o}})=>(0,i.str)`must have required property '${o}'`,params:({params:{missingProperty:o}})=>(0,i._)`{missingProperty: ${o}}`},code(o){const{gen:d,schema:h,schemaCode:m,data:y,$data:S,it:N}=o,{opts:x}=N;if(!S&&h.length===0)return;const V=h.length>=x.loopRequired;if(N.allErrors?L():C(),x.strictRequired){const p=o.parentSchema.properties,{definedProperties:b}=o.it;for(const E of h)if((p==null?void 0:p[E])===void 0&&!b.has(E)){const O=N.schemaEnv.baseId+N.errSchemaPath,v=`required property "${E}" is not defined at "${O}" (strictRequired)`;(0,u.checkStrictMode)(N,v,N.opts.strictRequired)}}function L(){if(V||S)o.block$data(i.nil,g);else for(const p of h)(0,r.checkReportMissingProp)(o,p)}function C(){const p=d.let("missing");if(V||S){const b=d.let("valid",!0);o.block$data(b,()=>w(p,b)),o.ok(b)}else d.if((0,r.checkMissingProp)(o,h,p)),(0,r.reportMissingProp)(o,p),d.else()}function g(){d.forOf("prop",m,p=>{o.setParams({missingProperty:p}),d.if((0,r.noPropertyInData)(d,y,p,x.ownProperties),()=>o.error())})}function w(p,b){o.setParams({missingProperty:p}),d.forOf(p,m,()=>{d.assign(b,(0,r.propertyInData)(d,y,p,x.ownProperties)),d.if((0,i.not)(b),()=>{o.error(),d.break()})},i.nil)}}};return fl.default=c,fl}var cl={},by;function Pb(){if(by)return cl;by=1,Object.defineProperty(cl,"__esModule",{value:!0});const r=Me(),u={keyword:["maxItems","minItems"],type:"array",schemaType:"number",$data:!0,error:{message({keyword:l,schemaCode:c}){const o=l==="maxItems"?"more":"fewer";return(0,r.str)`must NOT have ${o} than ${c} items`},params:({schemaCode:l})=>(0,r._)`{limit: ${l}}`},code(l){const{keyword:c,data:o,schemaCode:d}=l,h=c==="maxItems"?r.operators.GT:r.operators.LT;l.fail$data((0,r._)`${o}.length ${h} ${d}`)}};return cl.default=u,cl}var dl={},hl={},Ey;function qc(){if(Ey)return hl;Ey=1,Object.defineProperty(hl,"__esModule",{value:!0});const r=cv();return r.code='require("ajv/dist/runtime/equal").default',hl.default=r,hl}var _y;function Kb(){if(_y)return dl;_y=1,Object.defineProperty(dl,"__esModule",{value:!0});const r=Hl(),i=Me(),u=Be(),l=qc(),o={keyword:"uniqueItems",type:"array",schemaType:"boolean",$data:!0,error:{message:({params:{i:d,j:h}})=>(0,i.str)`must NOT have duplicate items (items ## ${h} and ${d} are identical)`,params:({params:{i:d,j:h}})=>(0,i._)`{i: ${d}, j: ${h}}`},code(d){const{gen:h,data:m,$data:y,schema:S,parentSchema:N,schemaCode:x,it:V}=d;if(!y&&!S)return;const L=h.let("valid"),C=N.items?(0,r.getSchemaTypes)(N.items):[];d.block$data(L,g,(0,i._)`${x} === false`),d.ok(L);function g(){const E=h.let("i",(0,i._)`${m}.length`),O=h.let("j");d.setParams({i:E,j:O}),h.assign(L,!0),h.if((0,i._)`${E} > 1`,()=>(w()?p:b)(E,O))}function w(){return C.length>0&&!C.some(E=>E==="object"||E==="array")}function p(E,O){const v=h.name("item"),A=(0,r.checkDataTypes)(C,v,V.opts.strictNumbers,r.DataType.Wrong),$=h.const("indices",(0,i._)`{}`);h.for((0,i._)`;${E}--;`,()=>{h.let(v,(0,i._)`${m}[${E}]`),h.if(A,(0,i._)`continue`),C.length>1&&h.if((0,i._)`typeof ${v} == "string"`,(0,i._)`${v} += "_"`),h.if((0,i._)`typeof ${$}[${v}] == "number"`,()=>{h.assign(O,(0,i._)`${$}[${v}]`),d.error(),h.assign(L,!1).break()}).code((0,i._)`${$}[${v}] = ${E}`)})}function b(E,O){const v=(0,u.useFunc)(h,l.default),A=h.name("outer");h.label(A).for((0,i._)`;${E}--;`,()=>h.for((0,i._)`${O} = ${E}; ${O}--;`,()=>h.if((0,i._)`${v}(${m}[${E}], ${m}[${O}])`,()=>{d.error(),h.assign(L,!1).break(A)})))}}};return dl.default=o,dl}var ml={},Sy;function Xb(){if(Sy)return ml;Sy=1,Object.defineProperty(ml,"__esModule",{value:!0});const r=Me(),i=Be(),u=qc(),c={keyword:"const",$data:!0,error:{message:"must be equal to constant",params:({schemaCode:o})=>(0,r._)`{allowedValue: ${o}}`},code(o){const{gen:d,data:h,$data:m,schemaCode:y,schema:S}=o;m||S&&typeof S=="object"?o.fail$data((0,r._)`!${(0,i.useFunc)(d,u.default)}(${h}, ${y})`):o.fail((0,r._)`${S} !== ${h}`)}};return ml.default=c,ml}var pl={},wy;function Qb(){if(wy)return pl;wy=1,Object.defineProperty(pl,"__esModule",{value:!0});const r=Me(),i=Be(),u=qc(),c={keyword:"enum",schemaType:"array",$data:!0,error:{message:"must be equal to one of the allowed values",params:({schemaCode:o})=>(0,r._)`{allowedValues: ${o}}`},code(o){const{gen:d,data:h,$data:m,schema:y,schemaCode:S,it:N}=o;if(!m&&y.length===0)throw new Error("enum must have non-empty array");const x=y.length>=N.opts.loopEnum;let V;const L=()=>V??(V=(0,i.useFunc)(d,u.default));let C;if(x||m)C=d.let("valid"),o.block$data(C,g);else{if(!Array.isArray(y))throw new Error("ajv implementation error");const p=d.const("vSchema",S);C=(0,r.or)(...y.map((b,E)=>w(p,E)))}o.pass(C);function g(){d.assign(C,!1),d.forOf("v",S,p=>d.if((0,r._)`${L()}(${h}, ${p})`,()=>d.assign(C,!0).break()))}function w(p,b){const E=y[b];return typeof E=="object"&&E!==null?(0,r._)`${L()}(${h}, ${p}[${b}])`:(0,r._)`${h} === ${E}`}}};return pl.default=c,pl}var $y;function Zb(){if($y)return rl;$y=1,Object.defineProperty(rl,"__esModule",{value:!0});const r=xb(),i=Bb(),u=Gb(),l=Ib(),c=Yb(),o=kb(),d=Pb(),h=Kb(),m=Xb(),y=Qb(),S=[r.default,i.default,u.default,l.default,c.default,o.default,d.default,h.default,{keyword:"type",schemaType:["string","array"]},{keyword:"nullable",schemaType:"boolean"},m.default,y.default];return rl.default=S,rl}var yl={},_a={},Oy;function dv(){if(Oy)return _a;Oy=1,Object.defineProperty(_a,"__esModule",{value:!0}),_a.validateAdditionalItems=void 0;const r=Me(),i=Be(),l={keyword:"additionalItems",type:"array",schemaType:["boolean","object"],before:"uniqueItems",error:{message:({params:{len:o}})=>(0,r.str)`must NOT have more than ${o} items`,params:({params:{len:o}})=>(0,r._)`{limit: ${o}}`},code(o){const{parentSchema:d,it:h}=o,{items:m}=d;if(!Array.isArray(m)){(0,i.checkStrictMode)(h,'"additionalItems" is ignored when "items" is not an array of schemas');return}c(o,m)}};function c(o,d){const{gen:h,schema:m,data:y,keyword:S,it:N}=o;N.items=!0;const x=h.const("len",(0,r._)`${y}.length`);if(m===!1)o.setParams({len:d.length}),o.pass((0,r._)`${x} <= ${d.length}`);else if(typeof m=="object"&&!(0,i.alwaysValidSchema)(N,m)){const L=h.var("valid",(0,r._)`${x} <= ${d.length}`);h.if((0,r.not)(L),()=>V(L)),o.ok(L)}function V(L){h.forRange("i",d.length,x,C=>{o.subschema({keyword:S,dataProp:C,dataPropType:i.Type.Num},L),N.allErrors||h.if((0,r.not)(L),()=>h.break())})}}return _a.validateAdditionalItems=c,_a.default=l,_a}var gl={},Sa={},Ay;function hv(){if(Ay)return Sa;Ay=1,Object.defineProperty(Sa,"__esModule",{value:!0}),Sa.validateTuple=void 0;const r=Me(),i=Be(),u=an(),l={keyword:"items",type:"array",schemaType:["object","array","boolean"],before:"uniqueItems",code(o){const{schema:d,it:h}=o;if(Array.isArray(d))return c(o,"additionalItems",d);h.items=!0,!(0,i.alwaysValidSchema)(h,d)&&o.ok((0,u.validateArray)(o))}};function c(o,d,h=o.schema){const{gen:m,parentSchema:y,data:S,keyword:N,it:x}=o;C(y),x.opts.unevaluated&&h.length&&x.items!==!0&&(x.items=i.mergeEvaluated.items(m,h.length,x.items));const V=m.name("valid"),L=m.const("len",(0,r._)`${S}.length`);h.forEach((g,w)=>{(0,i.alwaysValidSchema)(x,g)||(m.if((0,r._)`${L} > ${w}`,()=>o.subschema({keyword:N,schemaProp:w,dataProp:w},V)),o.ok(V))});function C(g){const{opts:w,errSchemaPath:p}=x,b=h.length,E=b===g.minItems&&(b===g.maxItems||g[d]===!1);if(w.strictTuples&&!E){const O=`"${N}" is ${b}-tuple, but minItems or maxItems/${d} are not specified or different at path "${p}"`;(0,i.checkStrictMode)(x,O,w.strictTuples)}}}return Sa.validateTuple=c,Sa.default=l,Sa}var Ry;function Jb(){if(Ry)return gl;Ry=1,Object.defineProperty(gl,"__esModule",{value:!0});const r=hv(),i={keyword:"prefixItems",type:"array",schemaType:["array"],before:"uniqueItems",code:u=>(0,r.validateTuple)(u,"items")};return gl.default=i,gl}var vl={},Ty;function Fb(){if(Ty)return vl;Ty=1,Object.defineProperty(vl,"__esModule",{value:!0});const r=Me(),i=Be(),u=an(),l=dv(),o={keyword:"items",type:"array",schemaType:["object","boolean"],before:"uniqueItems",error:{message:({params:{len:d}})=>(0,r.str)`must NOT have more than ${d} items`,params:({params:{len:d}})=>(0,r._)`{limit: ${d}}`},code(d){const{schema:h,parentSchema:m,it:y}=d,{prefixItems:S}=m;y.items=!0,!(0,i.alwaysValidSchema)(y,h)&&(S?(0,l.validateAdditionalItems)(d,S):d.ok((0,u.validateArray)(d)))}};return vl.default=o,vl}var bl={},Ny;function Wb(){if(Ny)return bl;Ny=1,Object.defineProperty(bl,"__esModule",{value:!0});const r=Me(),i=Be(),l={keyword:"contains",type:"array",schemaType:["object","boolean"],before:"uniqueItems",trackErrors:!0,error:{message:({params:{min:c,max:o}})=>o===void 0?(0,r.str)`must contain at least ${c} valid item(s)`:(0,r.str)`must contain at least ${c} and no more than ${o} valid item(s)`,params:({params:{min:c,max:o}})=>o===void 0?(0,r._)`{minContains: ${c}}`:(0,r._)`{minContains: ${c}, maxContains: ${o}}`},code(c){const{gen:o,schema:d,parentSchema:h,data:m,it:y}=c;let S,N;const{minContains:x,maxContains:V}=h;y.opts.next?(S=x===void 0?1:x,N=V):S=1;const L=o.const("len",(0,r._)`${m}.length`);if(c.setParams({min:S,max:N}),N===void 0&&S===0){(0,i.checkStrictMode)(y,'"minContains" == 0 without "maxContains": "contains" keyword ignored');return}if(N!==void 0&&S>N){(0,i.checkStrictMode)(y,'"minContains" > "maxContains" is always invalid'),c.fail();return}if((0,i.alwaysValidSchema)(y,d)){let b=(0,r._)`${L} >= ${S}`;N!==void 0&&(b=(0,r._)`${b} && ${L} <= ${N}`),c.pass(b);return}y.items=!0;const C=o.name("valid");N===void 0&&S===1?w(C,()=>o.if(C,()=>o.break())):S===0?(o.let(C,!0),N!==void 0&&o.if((0,r._)`${m}.length > 0`,g)):(o.let(C,!1),g()),c.result(C,()=>c.reset());function g(){const b=o.name("_valid"),E=o.let("count",0);w(b,()=>o.if(b,()=>p(E)))}function w(b,E){o.forRange("i",0,L,O=>{c.subschema({keyword:"contains",dataProp:O,dataPropType:i.Type.Num,compositeRule:!0},b),E()})}function p(b){o.code((0,r._)`${b}++`),N===void 0?o.if((0,r._)`${b} >= ${S}`,()=>o.assign(C,!0).break()):(o.if((0,r._)`${b} > ${N}`,()=>o.assign(C,!1).break()),S===1?o.assign(C,!0):o.if((0,r._)`${b} >= ${S}`,()=>o.assign(C,!0)))}}};return bl.default=l,bl}var Tf={},jy;function eE(){return jy||(jy=1,function(r){Object.defineProperty(r,"__esModule",{value:!0}),r.validateSchemaDeps=r.validatePropertyDeps=r.error=void 0;const i=Me(),u=Be(),l=an();r.error={message:({params:{property:m,depsCount:y,deps:S}})=>{const N=y===1?"property":"properties";return(0,i.str)`must have ${N} ${S} when property ${m} is present`},params:({params:{property:m,depsCount:y,deps:S,missingProperty:N}})=>(0,i._)`{property: ${m}, - missingProperty: ${N}, - depsCount: ${y}, - deps: ${S}}`};const c={keyword:"dependencies",type:"object",schemaType:"object",error:r.error,code(m){const[y,S]=o(m);d(m,y),h(m,S)}};function o({schema:m}){const y={},S={};for(const N in m){if(N==="__proto__")continue;const x=Array.isArray(m[N])?y:S;x[N]=m[N]}return[y,S]}function d(m,y=m.schema){const{gen:S,data:N,it:x}=m;if(Object.keys(y).length===0)return;const V=S.let("missing");for(const L in y){const C=y[L];if(C.length===0)continue;const g=(0,l.propertyInData)(S,N,L,x.opts.ownProperties);m.setParams({property:L,depsCount:C.length,deps:C.join(", ")}),x.allErrors?S.if(g,()=>{for(const w of C)(0,l.checkReportMissingProp)(m,w)}):(S.if((0,i._)`${g} && (${(0,l.checkMissingProp)(m,C,V)})`),(0,l.reportMissingProp)(m,V),S.else())}}r.validatePropertyDeps=d;function h(m,y=m.schema){const{gen:S,data:N,keyword:x,it:V}=m,L=S.name("valid");for(const C in y)(0,u.alwaysValidSchema)(V,y[C])||(S.if((0,l.propertyInData)(S,N,C,V.opts.ownProperties),()=>{const g=m.subschema({keyword:x,schemaProp:C},L);m.mergeValidEvaluated(g,L)},()=>S.var(L,!0)),m.ok(L))}r.validateSchemaDeps=h,r.default=c}(Tf)),Tf}var El={},Dy;function tE(){if(Dy)return El;Dy=1,Object.defineProperty(El,"__esModule",{value:!0});const r=Me(),i=Be(),l={keyword:"propertyNames",type:"object",schemaType:["object","boolean"],error:{message:"property name must be valid",params:({params:c})=>(0,r._)`{propertyName: ${c.propertyName}}`},code(c){const{gen:o,schema:d,data:h,it:m}=c;if((0,i.alwaysValidSchema)(m,d))return;const y=o.name("valid");o.forIn("key",h,S=>{c.setParams({propertyName:S}),c.subschema({keyword:"propertyNames",data:S,dataTypes:["string"],propertyName:S,compositeRule:!0},y),o.if((0,r.not)(y),()=>{c.error(!0),m.allErrors||o.break()})}),c.ok(y)}};return El.default=l,El}var _l={},My;function mv(){if(My)return _l;My=1,Object.defineProperty(_l,"__esModule",{value:!0});const r=an(),i=Me(),u=fr(),l=Be(),o={keyword:"additionalProperties",type:["object"],schemaType:["boolean","object"],allowUndefined:!0,trackErrors:!0,error:{message:"must NOT have additional properties",params:({params:d})=>(0,i._)`{additionalProperty: ${d.additionalProperty}}`},code(d){const{gen:h,schema:m,parentSchema:y,data:S,errsCount:N,it:x}=d;if(!N)throw new Error("ajv implementation error");const{allErrors:V,opts:L}=x;if(x.props=!0,L.removeAdditional!=="all"&&(0,l.alwaysValidSchema)(x,m))return;const C=(0,r.allSchemaProperties)(y.properties),g=(0,r.allSchemaProperties)(y.patternProperties);w(),d.ok((0,i._)`${N} === ${u.default.errors}`);function w(){h.forIn("key",S,v=>{!C.length&&!g.length?E(v):h.if(p(v),()=>E(v))})}function p(v){let A;if(C.length>8){const $=(0,l.schemaRefOrVal)(x,y.properties,"properties");A=(0,r.isOwnProperty)(h,$,v)}else C.length?A=(0,i.or)(...C.map($=>(0,i._)`${v} === ${$}`)):A=i.nil;return g.length&&(A=(0,i.or)(A,...g.map($=>(0,i._)`${(0,r.usePattern)(d,$)}.test(${v})`))),(0,i.not)(A)}function b(v){h.code((0,i._)`delete ${S}[${v}]`)}function E(v){if(L.removeAdditional==="all"||L.removeAdditional&&m===!1){b(v);return}if(m===!1){d.setParams({additionalProperty:v}),d.error(),V||h.break();return}if(typeof m=="object"&&!(0,l.alwaysValidSchema)(x,m)){const A=h.name("valid");L.removeAdditional==="failing"?(O(v,A,!1),h.if((0,i.not)(A),()=>{d.reset(),b(v)})):(O(v,A),V||h.if((0,i.not)(A),()=>h.break()))}}function O(v,A,$){const D={keyword:"additionalProperties",dataProp:v,dataPropType:l.Type.Str};$===!1&&Object.assign(D,{compositeRule:!0,createErrors:!1,allErrors:!1}),d.subschema(D,A)}}};return _l.default=o,_l}var Sl={},qy;function nE(){if(qy)return Sl;qy=1,Object.defineProperty(Sl,"__esModule",{value:!0});const r=Jl(),i=an(),u=Be(),l=mv(),c={keyword:"properties",type:"object",schemaType:"object",code(o){const{gen:d,schema:h,parentSchema:m,data:y,it:S}=o;S.opts.removeAdditional==="all"&&m.additionalProperties===void 0&&l.default.code(new r.KeywordCxt(S,l.default,"additionalProperties"));const N=(0,i.allSchemaProperties)(h);for(const g of N)S.definedProperties.add(g);S.opts.unevaluated&&N.length&&S.props!==!0&&(S.props=u.mergeEvaluated.props(d,(0,u.toHash)(N),S.props));const x=N.filter(g=>!(0,u.alwaysValidSchema)(S,h[g]));if(x.length===0)return;const V=d.name("valid");for(const g of x)L(g)?C(g):(d.if((0,i.propertyInData)(d,y,g,S.opts.ownProperties)),C(g),S.allErrors||d.else().var(V,!0),d.endIf()),o.it.definedProperties.add(g),o.ok(V);function L(g){return S.opts.useDefaults&&!S.compositeRule&&h[g].default!==void 0}function C(g){o.subschema({keyword:"properties",schemaProp:g,dataProp:g},V)}}};return Sl.default=c,Sl}var wl={},Cy;function rE(){if(Cy)return wl;Cy=1,Object.defineProperty(wl,"__esModule",{value:!0});const r=an(),i=Me(),u=Be(),l=Be(),c={keyword:"patternProperties",type:"object",schemaType:"object",code(o){const{gen:d,schema:h,data:m,parentSchema:y,it:S}=o,{opts:N}=S,x=(0,r.allSchemaProperties)(h),V=x.filter(E=>(0,u.alwaysValidSchema)(S,h[E]));if(x.length===0||V.length===x.length&&(!S.opts.unevaluated||S.props===!0))return;const L=N.strictSchema&&!N.allowMatchingProperties&&y.properties,C=d.name("valid");S.props!==!0&&!(S.props instanceof i.Name)&&(S.props=(0,l.evaluatedPropsToName)(d,S.props));const{props:g}=S;w();function w(){for(const E of x)L&&p(E),S.allErrors?b(E):(d.var(C,!0),b(E),d.if(C))}function p(E){for(const O in L)new RegExp(E).test(O)&&(0,u.checkStrictMode)(S,`property ${O} matches pattern ${E} (use allowMatchingProperties)`)}function b(E){d.forIn("key",m,O=>{d.if((0,i._)`${(0,r.usePattern)(o,E)}.test(${O})`,()=>{const v=V.includes(E);v||o.subschema({keyword:"patternProperties",schemaProp:E,dataProp:O,dataPropType:l.Type.Str},C),S.opts.unevaluated&&g!==!0?d.assign((0,i._)`${g}[${O}]`,!0):!v&&!S.allErrors&&d.if((0,i.not)(C),()=>d.break())})})}}};return wl.default=c,wl}var $l={},zy;function aE(){if(zy)return $l;zy=1,Object.defineProperty($l,"__esModule",{value:!0});const r=Be(),i={keyword:"not",schemaType:["object","boolean"],trackErrors:!0,code(u){const{gen:l,schema:c,it:o}=u;if((0,r.alwaysValidSchema)(o,c)){u.fail();return}const d=l.name("valid");u.subschema({keyword:"not",compositeRule:!0,createErrors:!1,allErrors:!1},d),u.failResult(d,()=>u.reset(),()=>u.error())},error:{message:"must NOT be valid"}};return $l.default=i,$l}var Ol={},Uy;function iE(){if(Uy)return Ol;Uy=1,Object.defineProperty(Ol,"__esModule",{value:!0});const i={keyword:"anyOf",schemaType:"array",trackErrors:!0,code:an().validateUnion,error:{message:"must match a schema in anyOf"}};return Ol.default=i,Ol}var Al={},Ly;function sE(){if(Ly)return Al;Ly=1,Object.defineProperty(Al,"__esModule",{value:!0});const r=Me(),i=Be(),l={keyword:"oneOf",schemaType:"array",trackErrors:!0,error:{message:"must match exactly one schema in oneOf",params:({params:c})=>(0,r._)`{passingSchemas: ${c.passing}}`},code(c){const{gen:o,schema:d,parentSchema:h,it:m}=c;if(!Array.isArray(d))throw new Error("ajv implementation error");if(m.opts.discriminator&&h.discriminator)return;const y=d,S=o.let("valid",!1),N=o.let("passing",null),x=o.name("_valid");c.setParams({passing:N}),o.block(V),c.result(S,()=>c.reset(),()=>c.error(!0));function V(){y.forEach((L,C)=>{let g;(0,i.alwaysValidSchema)(m,L)?o.var(x,!0):g=c.subschema({keyword:"oneOf",schemaProp:C,compositeRule:!0},x),C>0&&o.if((0,r._)`${x} && ${S}`).assign(S,!1).assign(N,(0,r._)`[${N}, ${C}]`).else(),o.if(x,()=>{o.assign(S,!0),o.assign(N,C),g&&c.mergeEvaluated(g,r.Name)})})}}};return Al.default=l,Al}var Rl={},Vy;function lE(){if(Vy)return Rl;Vy=1,Object.defineProperty(Rl,"__esModule",{value:!0});const r=Be(),i={keyword:"allOf",schemaType:"array",code(u){const{gen:l,schema:c,it:o}=u;if(!Array.isArray(c))throw new Error("ajv implementation error");const d=l.name("valid");c.forEach((h,m)=>{if((0,r.alwaysValidSchema)(o,h))return;const y=u.subschema({keyword:"allOf",schemaProp:m},d);u.ok(d),u.mergeEvaluated(y)})}};return Rl.default=i,Rl}var Tl={},xy;function uE(){if(xy)return Tl;xy=1,Object.defineProperty(Tl,"__esModule",{value:!0});const r=Me(),i=Be(),l={keyword:"if",schemaType:["object","boolean"],trackErrors:!0,error:{message:({params:o})=>(0,r.str)`must match "${o.ifClause}" schema`,params:({params:o})=>(0,r._)`{failingKeyword: ${o.ifClause}}`},code(o){const{gen:d,parentSchema:h,it:m}=o;h.then===void 0&&h.else===void 0&&(0,i.checkStrictMode)(m,'"if" without "then" and "else" is ignored');const y=c(m,"then"),S=c(m,"else");if(!y&&!S)return;const N=d.let("valid",!0),x=d.name("_valid");if(V(),o.reset(),y&&S){const C=d.let("ifClause");o.setParams({ifClause:C}),d.if(x,L("then",C),L("else",C))}else y?d.if(x,L("then")):d.if((0,r.not)(x),L("else"));o.pass(N,()=>o.error(!0));function V(){const C=o.subschema({keyword:"if",compositeRule:!0,createErrors:!1,allErrors:!1},x);o.mergeEvaluated(C)}function L(C,g){return()=>{const w=o.subschema({keyword:C},x);d.assign(N,x),o.mergeValidEvaluated(w,N),g?d.assign(g,(0,r._)`${C}`):o.setParams({ifClause:C})}}}};function c(o,d){const h=o.schema[d];return h!==void 0&&!(0,i.alwaysValidSchema)(o,h)}return Tl.default=l,Tl}var Nl={},By;function oE(){if(By)return Nl;By=1,Object.defineProperty(Nl,"__esModule",{value:!0});const r=Be(),i={keyword:["then","else"],schemaType:["object","boolean"],code({keyword:u,parentSchema:l,it:c}){l.if===void 0&&(0,r.checkStrictMode)(c,`"${u}" without "if" is ignored`)}};return Nl.default=i,Nl}var Hy;function fE(){if(Hy)return yl;Hy=1,Object.defineProperty(yl,"__esModule",{value:!0});const r=dv(),i=Jb(),u=hv(),l=Fb(),c=Wb(),o=eE(),d=tE(),h=mv(),m=nE(),y=rE(),S=aE(),N=iE(),x=sE(),V=lE(),L=uE(),C=oE();function g(w=!1){const p=[S.default,N.default,x.default,V.default,L.default,C.default,d.default,h.default,o.default,m.default,y.default];return w?p.push(i.default,l.default):p.push(r.default,u.default),p.push(c.default),p}return yl.default=g,yl}var jl={},Dl={},Gy;function cE(){if(Gy)return Dl;Gy=1,Object.defineProperty(Dl,"__esModule",{value:!0});const r=Me(),u={keyword:"format",type:["number","string"],schemaType:"string",$data:!0,error:{message:({schemaCode:l})=>(0,r.str)`must match format "${l}"`,params:({schemaCode:l})=>(0,r._)`{format: ${l}}`},code(l,c){const{gen:o,data:d,$data:h,schema:m,schemaCode:y,it:S}=l,{opts:N,errSchemaPath:x,schemaEnv:V,self:L}=S;if(!N.validateFormats)return;h?C():g();function C(){const w=o.scopeValue("formats",{ref:L.formats,code:N.code.formats}),p=o.const("fDef",(0,r._)`${w}[${y}]`),b=o.let("fType"),E=o.let("format");o.if((0,r._)`typeof ${p} == "object" && !(${p} instanceof RegExp)`,()=>o.assign(b,(0,r._)`${p}.type || "string"`).assign(E,(0,r._)`${p}.validate`),()=>o.assign(b,(0,r._)`"string"`).assign(E,p)),l.fail$data((0,r.or)(O(),v()));function O(){return N.strictSchema===!1?r.nil:(0,r._)`${y} && !${E}`}function v(){const A=V.$async?(0,r._)`(${p}.async ? await ${E}(${d}) : ${E}(${d}))`:(0,r._)`${E}(${d})`,$=(0,r._)`(typeof ${E} == "function" ? ${A} : ${E}.test(${d}))`;return(0,r._)`${E} && ${E} !== true && ${b} === ${c} && !${$}`}}function g(){const w=L.formats[m];if(!w){O();return}if(w===!0)return;const[p,b,E]=v(w);p===c&&l.pass(A());function O(){if(N.strictSchema===!1){L.logger.warn($());return}throw new Error($());function $(){return`unknown format "${m}" ignored in schema at path "${x}"`}}function v($){const D=$ instanceof RegExp?(0,r.regexpCode)($):N.code.formats?(0,r._)`${N.code.formats}${(0,r.getProperty)(m)}`:void 0,j=o.scopeValue("formats",{key:m,ref:$,code:D});return typeof $=="object"&&!($ instanceof RegExp)?[$.type||"string",$.validate,(0,r._)`${j}.validate`]:["string",$,j]}function A(){if(typeof w=="object"&&!(w instanceof RegExp)&&w.async){if(!V.$async)throw new Error("async format in sync schema");return(0,r._)`await ${E}(${d})`}return typeof b=="function"?(0,r._)`${E}(${d})`:(0,r._)`${E}.test(${d})`}}}};return Dl.default=u,Dl}var Iy;function dE(){if(Iy)return jl;Iy=1,Object.defineProperty(jl,"__esModule",{value:!0});const i=[cE().default];return jl.default=i,jl}var Ur={},Yy;function hE(){return Yy||(Yy=1,Object.defineProperty(Ur,"__esModule",{value:!0}),Ur.contentVocabulary=Ur.metadataVocabulary=void 0,Ur.metadataVocabulary=["title","description","default","deprecated","readOnly","writeOnly","examples"],Ur.contentVocabulary=["contentMediaType","contentEncoding","contentSchema"]),Ur}var ky;function mE(){if(ky)return el;ky=1,Object.defineProperty(el,"__esModule",{value:!0});const r=Vb(),i=Zb(),u=fE(),l=dE(),c=hE(),o=[r.default,i.default,(0,u.default)(),l.default,c.metadataVocabulary,c.contentVocabulary];return el.default=o,el}var Ml={},Ri={},Py;function pE(){if(Py)return Ri;Py=1,Object.defineProperty(Ri,"__esModule",{value:!0}),Ri.DiscrError=void 0;var r;return function(i){i.Tag="tag",i.Mapping="mapping"}(r||(Ri.DiscrError=r={})),Ri}var Ky;function yE(){if(Ky)return Ml;Ky=1,Object.defineProperty(Ml,"__esModule",{value:!0});const r=Me(),i=pE(),u=Mc(),l=Fl(),c=Be(),d={keyword:"discriminator",type:"object",schemaType:"object",error:{message:({params:{discrError:h,tagName:m}})=>h===i.DiscrError.Tag?`tag "${m}" must be string`:`value of tag "${m}" must be in oneOf`,params:({params:{discrError:h,tag:m,tagName:y}})=>(0,r._)`{error: ${h}, tag: ${y}, tagValue: ${m}}`},code(h){const{gen:m,data:y,schema:S,parentSchema:N,it:x}=h,{oneOf:V}=N;if(!x.opts.discriminator)throw new Error("discriminator: requires discriminator option");const L=S.propertyName;if(typeof L!="string")throw new Error("discriminator: requires propertyName");if(S.mapping)throw new Error("discriminator: mapping is not supported");if(!V)throw new Error("discriminator: requires oneOf keyword");const C=m.let("valid",!1),g=m.const("tag",(0,r._)`${y}${(0,r.getProperty)(L)}`);m.if((0,r._)`typeof ${g} == "string"`,()=>w(),()=>h.error(!1,{discrError:i.DiscrError.Tag,tag:g,tagName:L})),h.ok(C);function w(){const E=b();m.if(!1);for(const O in E)m.elseIf((0,r._)`${g} === ${O}`),m.assign(C,p(E[O]));m.else(),h.error(!1,{discrError:i.DiscrError.Mapping,tag:g,tagName:L}),m.endIf()}function p(E){const O=m.name("valid"),v=h.subschema({keyword:"oneOf",schemaProp:E},O);return h.mergeEvaluated(v,r.Name),O}function b(){var E;const O={},v=$(N);let A=!0;for(let Y=0;Ythis.addVocabulary(L)),this.opts.discriminator&&this.addKeyword(c.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;const L=this.opts.$data?this.$dataMetaSchema(o,d):o;this.addMetaSchema(L,h,!1),this.refs["http://json-schema.org/schema"]=h}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(h)?h:void 0)}}i.Ajv=m,r.exports=i=m,r.exports.Ajv=m,Object.defineProperty(i,"__esModule",{value:!0}),i.default=m;var y=Jl();Object.defineProperty(i,"KeywordCxt",{enumerable:!0,get:function(){return y.KeywordCxt}});var S=Me();Object.defineProperty(i,"_",{enumerable:!0,get:function(){return S._}}),Object.defineProperty(i,"str",{enumerable:!0,get:function(){return S.str}}),Object.defineProperty(i,"stringify",{enumerable:!0,get:function(){return S.stringify}}),Object.defineProperty(i,"nil",{enumerable:!0,get:function(){return S.nil}}),Object.defineProperty(i,"Name",{enumerable:!0,get:function(){return S.Name}}),Object.defineProperty(i,"CodeGen",{enumerable:!0,get:function(){return S.CodeGen}});var N=Dc();Object.defineProperty(i,"ValidationError",{enumerable:!0,get:function(){return N.default}});var x=Fl();Object.defineProperty(i,"MissingRefError",{enumerable:!0,get:function(){return x.default}})}(Qs,Qs.exports)),Qs.exports}var OE=$E();const AE=Xl(OE);function ql(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Nf={exports:{}},Qy;function RE(){return Qy||(Qy=1,function(r,i){(function(u){r.exports=u()})(function(){return function u(l,c,o){function d(y,S){if(!c[y]){if(!l[y]){var N=typeof ql=="function"&&ql;if(!S&&N)return N(y,!0);if(h)return h(y,!0);throw new Error("Cannot find module '"+y+"'")}S=c[y]={exports:{}},l[y][0].call(S.exports,function(x){var V=l[y][1][x];return d(V||x)},S,S.exports,u,l,c,o)}return c[y].exports}for(var h=typeof ql=="function"&&ql,m=0;m)":-1f||k[a]!==Z[f]){var fe=` +`+k[a].replace(" at new "," at ");return e.displayName&&fe.includes("")&&(fe=fe.replace("",e.displayName)),fe}while(1<=a&&0<=f);break}}}finally{J=!1,Error.prepareStackTrace=r}return(r=e?e.displayName||e.name:"")?W(r):""}function P(e){switch(e.tag){case 26:case 27:case 5:return W(e.type);case 16:return W("Lazy");case 13:return W("Suspense");case 19:return W("SuspenseList");case 0:case 15:return e=ne(e.type,!1),e;case 11:return e=ne(e.type.render,!1),e;case 1:return e=ne(e.type,!0),e;default:return""}}function se(e){try{var t="";do t+=P(e),e=e.return;while(e);return t}catch(r){return` +Error generating stack: `+r.message+` +`+r.stack}}function re(e){var t=e,r=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(r=t.return),e=t.return;while(e)}return t.tag===3?r:null}function de(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function R(e){if(re(e)!==e)throw Error(l(188))}function z(e){var t=e.alternate;if(!t){if(t=re(e),t===null)throw Error(l(188));return t!==e?null:e}for(var r=e,a=t;;){var f=r.return;if(f===null)break;var h=f.alternate;if(h===null){if(a=f.return,a!==null){r=a;continue}break}if(f.child===h.child){for(h=f.child;h;){if(h===r)return R(f),e;if(h===a)return R(f),t;h=h.sibling}throw Error(l(188))}if(r.return!==a.return)r=f,a=h;else{for(var w=!1,I=f.child;I;){if(I===r){w=!0,r=f,a=h;break}if(I===a){w=!0,a=f,r=h;break}I=I.sibling}if(!w){for(I=h.child;I;){if(I===r){w=!0,r=h,a=f;break}if(I===a){w=!0,a=h,r=f;break}I=I.sibling}if(!w)throw Error(l(189))}}if(r.alternate!==a)throw Error(l(190))}if(r.tag!==3)throw Error(l(188));return r.stateNode.current===r?e:t}function K(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=K(e),t!==null)return t;e=e.sibling}return null}var Y=Array.isArray,N=u.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,H={pending:!1,data:null,method:null,action:null},te=[],me=-1;function ie(e){return{current:e}}function x(e){0>me||(e.current=te[me],te[me]=null,me--)}function B(e,t){me++,te[me]=e.current,e.current=t}var L=ie(null),V=ie(null),F=ie(null),le=ie(null);function pe(e,t){switch(B(F,t),B(V,e),B(L,null),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)&&(t=t.namespaceURI)?km(t):0;break;default:if(e=e===8?t.parentNode:t,t=e.tagName,e=e.namespaceURI)e=km(e),t=Gm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}x(L),B(L,t)}function ge(){x(L),x(V),x(F)}function Te(e){e.memoizedState!==null&&B(le,e);var t=L.current,r=Gm(t,e.type);t!==r&&(B(V,e),B(L,r))}function Ge(e){V.current===e&&(x(L),x(V)),le.current===e&&(x(le),La._currentValue=H)}var Ue=Object.prototype.hasOwnProperty,ze=n.unstable_scheduleCallback,Re=n.unstable_cancelCallback,Ve=n.unstable_shouldYield,nt=n.unstable_requestPaint,mt=n.unstable_now,ki=n.unstable_getCurrentPriorityLevel,Yn=n.unstable_ImmediatePriority,Zr=n.unstable_UserBlockingPriority,Sr=n.unstable_NormalPriority,al=n.unstable_LowPriority,ll=n.unstable_IdlePriority,N1=n.log,j1=n.unstable_setDisableYieldValue,Gi=null,qt=null;function D1(e){if(qt&&typeof qt.onCommitFiberRoot=="function")try{qt.onCommitFiberRoot(Gi,e,void 0,(e.current.flags&128)===128)}catch{}}function Pn(e){if(typeof N1=="function"&&j1(e),qt&&typeof qt.setStrictMode=="function")try{qt.setStrictMode(Gi,e)}catch{}}var Ut=Math.clz32?Math.clz32:x1,M1=Math.log,C1=Math.LN2;function x1(e){return e>>>=0,e===0?32:31-(M1(e)/C1|0)|0}var ul=128,sl=4194304;function wr(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194176;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ol(e,t){var r=e.pendingLanes;if(r===0)return 0;var a=0,f=e.suspendedLanes,h=e.pingedLanes,w=e.warmLanes;e=e.finishedLanes!==0;var I=r&134217727;return I!==0?(r=I&~f,r!==0?a=wr(r):(h&=I,h!==0?a=wr(h):e||(w=I&~w,w!==0&&(a=wr(w))))):(I=r&~f,I!==0?a=wr(I):h!==0?a=wr(h):e||(w=r&~w,w!==0&&(a=wr(w)))),a===0?0:t!==0&&t!==a&&!(t&f)&&(f=a&-a,w=t&-t,f>=w||f===32&&(w&4194176)!==0)?t:a}function Yi(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function L1(e,t){switch(e){case 1:case 2:case 4:case 8:return t+250;case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ld(){var e=ul;return ul<<=1,!(ul&4194176)&&(ul=128),e}function qd(){var e=sl;return sl<<=1,!(sl&62914560)&&(sl=4194304),e}function Cs(e){for(var t=[],r=0;31>r;r++)t.push(e);return t}function Pi(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function q1(e,t,r,a,f,h){var w=e.pendingLanes;e.pendingLanes=r,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=r,e.entangledLanes&=r,e.errorRecoveryDisabledLanes&=r,e.shellSuspendCounter=0;var I=e.entanglements,k=e.expirationTimes,Z=e.hiddenUpdates;for(r=w&~r;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),B1=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),Gd={},Yd={};function H1(e){return Ue.call(Yd,e)?!0:Ue.call(Gd,e)?!1:B1.test(e)?Yd[e]=!0:(Gd[e]=!0,!1)}function fl(e,t,r){if(H1(t))if(r===null)e.removeAttribute(t);else{switch(typeof r){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var a=t.toLowerCase().slice(0,5);if(a!=="data-"&&a!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+r)}}function cl(e,t,r){if(r===null)e.removeAttribute(t);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+r)}}function wn(e,t,r,a){if(a===null)e.removeAttribute(r);else{switch(typeof a){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(r);return}e.setAttributeNS(t,r,""+a)}}function Yt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Pd(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function V1(e){var t=Pd(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var f=r.get,h=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return f.call(this)},set:function(w){a=""+w,h.call(this,w)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return a},setValue:function(w){a=""+w},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function dl(e){e._valueTracker||(e._valueTracker=V1(e))}function Kd(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),a="";return e&&(a=Pd(e)?e.checked?"true":"false":e.value),e=a,e!==r?(t.setValue(e),!0):!1}function hl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var k1=/[\n"\\]/g;function Pt(e){return e.replace(k1,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function qs(e,t,r,a,f,h,w,I){e.name="",w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"?e.type=w:e.removeAttribute("type"),t!=null?w==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Yt(t)):e.value!==""+Yt(t)&&(e.value=""+Yt(t)):w!=="submit"&&w!=="reset"||e.removeAttribute("value"),t!=null?Us(e,w,Yt(t)):r!=null?Us(e,w,Yt(r)):a!=null&&e.removeAttribute("value"),f==null&&h!=null&&(e.defaultChecked=!!h),f!=null&&(e.checked=f&&typeof f!="function"&&typeof f!="symbol"),I!=null&&typeof I!="function"&&typeof I!="symbol"&&typeof I!="boolean"?e.name=""+Yt(I):e.removeAttribute("name")}function Fd(e,t,r,a,f,h,w,I){if(h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.type=h),t!=null||r!=null){if(!(h!=="submit"&&h!=="reset"||t!=null))return;r=r!=null?""+Yt(r):"",t=t!=null?""+Yt(t):r,I||t===e.value||(e.value=t),e.defaultValue=t}a=a??f,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=I?e.checked:!!a,e.defaultChecked=!!a,w!=null&&typeof w!="function"&&typeof w!="symbol"&&typeof w!="boolean"&&(e.name=w)}function Us(e,t,r){t==="number"&&hl(e.ownerDocument)===e||e.defaultValue===""+r||(e.defaultValue=""+r)}function ni(e,t,r,a){if(e=e.options,t){t={};for(var f=0;f=Wi),uh=" ",sh=!1;function oh(e,t){switch(e){case"keyup":return yb.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function fh(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var li=!1;function bb(e,t){switch(e){case"compositionend":return fh(t);case"keypress":return t.which!==32?null:(sh=!0,uh);case"textInput":return e=t.data,e===uh&&sh?null:e;default:return null}}function Eb(e,t){if(li)return e==="compositionend"||!Fs&&oh(e,t)?(e=th(),ml=ks=Fn=null,li=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=a}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=vh(r)}}function Eh(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Eh(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function _h(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=hl(e.document);t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=hl(e.document)}return t}function Zs(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Rb(e,t){var r=_h(t);t=e.focusedElem;var a=e.selectionRange;if(r!==t&&t&&t.ownerDocument&&Eh(t.ownerDocument.documentElement,t)){if(a!==null&&Zs(t)){if(e=a.start,r=a.end,r===void 0&&(r=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(r,t.value.length);else if(r=(e=t.ownerDocument||document)&&e.defaultView||window,r.getSelection){r=r.getSelection();var f=t.textContent.length,h=Math.min(a.start,f);a=a.end===void 0?h:Math.min(a.end,f),!r.extend&&h>a&&(f=a,a=h,h=f),f=bh(t,h);var w=bh(t,a);f&&w&&(r.rangeCount!==1||r.anchorNode!==f.node||r.anchorOffset!==f.offset||r.focusNode!==w.node||r.focusOffset!==w.offset)&&(e=e.createRange(),e.setStart(f.node,f.offset),r.removeAllRanges(),h>a?(r.addRange(e),r.extend(w.node,w.offset)):(e.setEnd(w.node,w.offset),r.addRange(e)))}}for(e=[],r=t;r=r.parentNode;)r.nodeType===1&&e.push({element:r,left:r.scrollLeft,top:r.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,ui=null,Js=null,ra=null,Ws=!1;function Sh(e,t,r){var a=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Ws||ui==null||ui!==hl(a)||(a=ui,"selectionStart"in a&&Zs(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),ra&&na(ra,a)||(ra=a,a=nu(Js,"onSelect"),0>=w,f-=w,An=1<<32-Ut(t)+f|r<Se?(pt=Ee,Ee=null):pt=Ee.sibling;var Be=ue(ee,Ee,ae[Se],ce);if(Be===null){Ee===null&&(Ee=pt);break}e&&Ee&&Be.alternate===null&&t(ee,Ee),Q=h(Be,Q,Se),De===null?ye=Be:De.sibling=Be,De=Be,Ee=pt}if(Se===ae.length)return r(ee,Ee),Ie&&jr(ee,Se),ye;if(Ee===null){for(;SeSe?(pt=Ee,Ee=null):pt=Ee.sibling;var pr=ue(ee,Ee,Be.value,ce);if(pr===null){Ee===null&&(Ee=pt);break}e&&Ee&&pr.alternate===null&&t(ee,Ee),Q=h(pr,Q,Se),De===null?ye=pr:De.sibling=pr,De=pr,Ee=pt}if(Be.done)return r(ee,Ee),Ie&&jr(ee,Se),ye;if(Ee===null){for(;!Be.done;Se++,Be=ae.next())Be=he(ee,Be.value,ce),Be!==null&&(Q=h(Be,Q,Se),De===null?ye=Be:De.sibling=Be,De=Be);return Ie&&jr(ee,Se),ye}for(Ee=a(Ee);!Be.done;Se++,Be=ae.next())Be=oe(Ee,ee,Se,Be.value,ce),Be!==null&&(e&&Be.alternate!==null&&Ee.delete(Be.key===null?Se:Be.key),Q=h(Be,Q,Se),De===null?ye=Be:De.sibling=Be,De=Be);return e&&Ee.forEach(function(PE){return t(ee,PE)}),Ie&&jr(ee,Se),ye}function et(ee,Q,ae,ce){if(typeof ae=="object"&&ae!==null&&ae.type===p&&ae.key===null&&(ae=ae.props.children),typeof ae=="object"&&ae!==null){switch(ae.$$typeof){case c:e:{for(var ye=ae.key;Q!==null;){if(Q.key===ye){if(ye=ae.type,ye===p){if(Q.tag===7){r(ee,Q.sibling),ce=f(Q,ae.props.children),ce.return=ee,ee=ce;break e}}else if(Q.elementType===ye||typeof ye=="object"&&ye!==null&&ye.$$typeof===g&&Ih(ye)===Q.type){r(ee,Q.sibling),ce=f(Q,ae.props),fa(ce,ae),ce.return=ee,ee=ce;break e}r(ee,Q);break}else t(ee,Q);Q=Q.sibling}ae.type===p?(ce=Hr(ae.props.children,ee.mode,ce,ae.key),ce.return=ee,ee=ce):(ce=Pl(ae.type,ae.key,ae.props,null,ee.mode,ce),fa(ce,ae),ce.return=ee,ee=ce)}return w(ee);case d:e:{for(ye=ae.key;Q!==null;){if(Q.key===ye)if(Q.tag===4&&Q.stateNode.containerInfo===ae.containerInfo&&Q.stateNode.implementation===ae.implementation){r(ee,Q.sibling),ce=f(Q,ae.children||[]),ce.return=ee,ee=ce;break e}else{r(ee,Q);break}else t(ee,Q);Q=Q.sibling}ce=nf(ae,ee.mode,ce),ce.return=ee,ee=ce}return w(ee);case g:return ye=ae._init,ae=ye(ae._payload),et(ee,Q,ae,ce)}if(Y(ae))return be(ee,Q,ae,ce);if(b(ae)){if(ye=b(ae),typeof ye!="function")throw Error(l(150));return ae=ye.call(ae),$e(ee,Q,ae,ce)}if(typeof ae.then=="function")return et(ee,Q,Tl(ae),ce);if(ae.$$typeof===C)return et(ee,Q,kl(ee,ae),ce);Rl(ee,ae)}return typeof ae=="string"&&ae!==""||typeof ae=="number"||typeof ae=="bigint"?(ae=""+ae,Q!==null&&Q.tag===6?(r(ee,Q.sibling),ce=f(Q,ae),ce.return=ee,ee=ce):(r(ee,Q),ce=tf(ae,ee.mode,ce),ce.return=ee,ee=ce),w(ee)):r(ee,Q)}return function(ee,Q,ae,ce){try{oa=0;var ye=et(ee,Q,ae,ce);return hi=null,ye}catch(Ee){if(Ee===ua)throw Ee;var De=en(29,Ee,null,ee.mode);return De.lanes=ce,De.return=ee,De}finally{}}}var Mr=Bh(!0),Hh=Bh(!1),pi=ie(null),Nl=ie(0);function Vh(e,t){e=qn,B(Nl,e),B(pi,t),qn=e|t.baseLanes}function uo(){B(Nl,qn),B(pi,pi.current)}function so(){qn=Nl.current,x(pi),x(Nl)}var Zt=ie(null),gn=null;function Qn(e){var t=e.alternate;B(st,st.current&1),B(Zt,e),gn===null&&(t===null||pi.current!==null||t.memoizedState!==null)&&(gn=e)}function kh(e){if(e.tag===22){if(B(st,st.current),B(Zt,e),gn===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(gn=e)}}else Zn()}function Zn(){B(st,st.current),B(Zt,Zt.current)}function On(e){x(Zt),gn===e&&(gn=null),x(st)}var st=ie(0);function jl(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Cb=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(r,a){e.push(a)}};this.abort=function(){t.aborted=!0,e.forEach(function(r){return r()})}},xb=n.unstable_scheduleCallback,Lb=n.unstable_NormalPriority,ot={$$typeof:C,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function oo(){return{controller:new Cb,data:new Map,refCount:0}}function ca(e){e.refCount--,e.refCount===0&&xb(Lb,function(){e.controller.abort()})}var da=null,fo=0,mi=0,gi=null;function qb(e,t){if(da===null){var r=da=[];fo=0,mi=vf(),gi={status:"pending",value:void 0,then:function(a){r.push(a)}}}return fo++,t.then(Gh,Gh),t}function Gh(){if(--fo===0&&da!==null){gi!==null&&(gi.status="fulfilled");var e=da;da=null,mi=0,gi=null;for(var t=0;th?h:8;var w=M.T,I={};M.T=I,Ro(e,!1,t,r);try{var k=f(),Z=M.S;if(Z!==null&&Z(I,k),k!==null&&typeof k=="object"&&typeof k.then=="function"){var fe=Ub(k,a);ma(e,t,fe,Vt(e))}else ma(e,t,a,Vt(e))}catch(he){ma(e,t,{then:function(){},status:"rejected",reason:he},Vt())}finally{N.p=h,M.T=w}}function Vb(){}function Oo(e,t,r,a){if(e.tag!==5)throw Error(l(476));var f=_p(e).queue;Ep(e,f,t,H,r===null?Vb:function(){return Sp(e),r(a)})}function _p(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:H,baseState:H,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Tn,lastRenderedState:H},next:null};var r={};return t.next={memoizedState:r,baseState:r,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Tn,lastRenderedState:r},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Sp(e){var t=_p(e).next.queue;ma(e,t,{},Vt())}function To(){return St(La)}function wp(){return at().memoizedState}function Ap(){return at().memoizedState}function kb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var r=Vt();e=nr(r);var a=rr(t,e,r);a!==null&&(Ot(a,t,r),va(a,t,r)),t={cache:oo()},e.payload=t;return}t=t.return}}function Gb(e,t,r){var a=Vt();r={lane:a,revertLane:0,action:r,hasEagerState:!1,eagerState:null,next:null},Il(e)?Op(t,r):(r=no(e,t,r,a),r!==null&&(Ot(r,e,a),Tp(r,t,a)))}function $p(e,t,r){var a=Vt();ma(e,t,r,a)}function ma(e,t,r,a){var f={lane:a,revertLane:0,action:r,hasEagerState:!1,eagerState:null,next:null};if(Il(e))Op(t,f);else{var h=e.alternate;if(e.lanes===0&&(h===null||h.lanes===0)&&(h=t.lastRenderedReducer,h!==null))try{var w=t.lastRenderedState,I=h(w,r);if(f.hasEagerState=!0,f.eagerState=I,zt(I,w))return Sl(e,t,f,0),Fe===null&&_l(),!1}catch{}finally{}if(r=no(e,t,f,a),r!==null)return Ot(r,e,a),Tp(r,t,a),!0}return!1}function Ro(e,t,r,a){if(a={lane:2,revertLane:vf(),action:a,hasEagerState:!1,eagerState:null,next:null},Il(e)){if(t)throw Error(l(479))}else t=no(e,r,a,2),t!==null&&Ot(t,e,2)}function Il(e){var t=e.alternate;return e===Ne||t!==null&&t===Ne}function Op(e,t){yi=Ml=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function Tp(e,t,r){if(r&4194176){var a=t.lanes;a&=e.pendingLanes,r|=a,t.lanes=r,zd(e,r)}}var yn={readContext:St,use:Ll,useCallback:rt,useContext:rt,useEffect:rt,useImperativeHandle:rt,useLayoutEffect:rt,useInsertionEffect:rt,useMemo:rt,useReducer:rt,useRef:rt,useState:rt,useDebugValue:rt,useDeferredValue:rt,useTransition:rt,useSyncExternalStore:rt,useId:rt};yn.useCacheRefresh=rt,yn.useMemoCache=rt,yn.useHostTransitionStatus=rt,yn.useFormState=rt,yn.useActionState=rt,yn.useOptimistic=rt;var Lr={readContext:St,use:Ll,useCallback:function(e,t){return xt().memoizedState=[e,t===void 0?null:t],e},useContext:St,useEffect:dp,useImperativeHandle:function(e,t,r){r=r!=null?r.concat([e]):null,Ul(4194308,4,mp.bind(null,t,e),r)},useLayoutEffect:function(e,t){return Ul(4194308,4,e,t)},useInsertionEffect:function(e,t){Ul(4,2,e,t)},useMemo:function(e,t){var r=xt();t=t===void 0?null:t;var a=e();if(xr){Pn(!0);try{e()}finally{Pn(!1)}}return r.memoizedState=[a,t],a},useReducer:function(e,t,r){var a=xt();if(r!==void 0){var f=r(t);if(xr){Pn(!0);try{r(t)}finally{Pn(!1)}}}else f=t;return a.memoizedState=a.baseState=f,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:f},a.queue=e,e=e.dispatch=Gb.bind(null,Ne,e),[a.memoizedState,e]},useRef:function(e){var t=xt();return e={current:e},t.memoizedState=e},useState:function(e){e=_o(e);var t=e.queue,r=$p.bind(null,Ne,t);return t.dispatch=r,[e.memoizedState,r]},useDebugValue:Ao,useDeferredValue:function(e,t){var r=xt();return $o(r,e,t)},useTransition:function(){var e=_o(!1);return e=Ep.bind(null,Ne,e.queue,!0,!1),xt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,r){var a=Ne,f=xt();if(Ie){if(r===void 0)throw Error(l(407));r=r()}else{if(r=t(),Fe===null)throw Error(l(349));Le&60||Qh(a,t,r)}f.memoizedState=r;var h={value:r,getSnapshot:t};return f.queue=h,dp(Jh.bind(null,a,h,e),[e]),a.flags|=2048,bi(9,Zh.bind(null,a,h,r,t),{destroy:void 0},null),r},useId:function(){var e=xt(),t=Fe.identifierPrefix;if(Ie){var r=$n,a=An;r=(a&~(1<<32-Ut(a)-1)).toString(32)+r,t=":"+t+"R"+r,r=Cl++,0 title"))),vt(h,a,r),h[_t]=e,ct(h),a=h;break e;case"link":var w=eg("link","href",f).get(a+(r.href||""));if(w){for(var I=0;I<\/script>",e=e.removeChild(e.firstChild);break;case"select":e=typeof a.is=="string"?f.createElement("select",{is:a.is}):f.createElement("select"),a.multiple?e.multiple=!0:a.size&&(e.size=a.size);break;default:e=typeof a.is=="string"?f.createElement(r,{is:a.is}):f.createElement(r)}}e[_t]=t,e[Mt]=a;e:for(f=t.child;f!==null;){if(f.tag===5||f.tag===6)e.appendChild(f.stateNode);else if(f.tag!==4&&f.tag!==27&&f.child!==null){f.child.return=f,f=f.child;continue}if(f===t)break e;for(;f.sibling===null;){if(f.return===null||f.return===t)break e;f=f.return}f.sibling.return=f.return,f=f.sibling}t.stateNode=e;e:switch(vt(e,r,a),r){case"button":case"input":case"select":case"textarea":e=!!a.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&xn(t)}}return Qe(t),t.flags&=-16777217,null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&xn(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(l(166));if(e=F.current,ia(t)){if(e=t.stateNode,r=t.memoizedProps,a=null,f=$t,f!==null)switch(f.tag){case 27:case 5:a=f.memoizedProps}e[_t]=t,e=!!(e.nodeValue===r||a!==null&&a.suppressHydrationWarning===!0||Vm(e.nodeValue,r)),e||Dr(t)}else e=iu(e).createTextNode(a),e[_t]=t,t.stateNode=e}return Qe(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(f=ia(t),a!==null&&a.dehydrated!==null){if(e===null){if(!f)throw Error(l(318));if(f=t.memoizedState,f=f!==null?f.dehydrated:null,!f)throw Error(l(317));f[_t]=t}else aa(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Qe(t),f=!1}else ln!==null&&(cf(ln),ln=null),f=!0;if(!f)return t.flags&256?(On(t),t):(On(t),null)}if(On(t),t.flags&128)return t.lanes=r,t;if(r=a!==null,e=e!==null&&e.memoizedState!==null,r){a=t.child,f=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(f=a.alternate.memoizedState.cachePool.pool);var h=null;a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(h=a.memoizedState.cachePool.pool),h!==f&&(a.flags|=2048)}return r!==e&&r&&(t.child.flags|=8192),Kl(t,t.updateQueue),Qe(t),null;case 4:return ge(),e===null&&Sf(t.stateNode.containerInfo),Qe(t),null;case 10:return jn(t.type),Qe(t),null;case 19:if(x(st),f=t.memoizedState,f===null)return Qe(t),null;if(a=(t.flags&128)!==0,h=f.rendering,h===null)if(a)$a(f,!1);else{if(We!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(h=jl(e),h!==null){for(t.flags|=128,$a(f,!1),e=h.updateQueue,t.updateQueue=e,Kl(t,e),t.subtreeFlags=0,e=r,r=t.child;r!==null;)gm(r,e),r=r.sibling;return B(st,st.current&1|2),t.child}e=e.sibling}f.tail!==null&&mt()>Fl&&(t.flags|=128,a=!0,$a(f,!1),t.lanes=4194304)}else{if(!a)if(e=jl(h),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Kl(t,e),$a(f,!0),f.tail===null&&f.tailMode==="hidden"&&!h.alternate&&!Ie)return Qe(t),null}else 2*mt()-f.renderingStartTime>Fl&&r!==536870912&&(t.flags|=128,a=!0,$a(f,!1),t.lanes=4194304);f.isBackwards?(h.sibling=t.child,t.child=h):(e=f.last,e!==null?e.sibling=h:t.child=h,f.last=h)}return f.tail!==null?(t=f.tail,f.rendering=t,f.tail=t.sibling,f.renderingStartTime=mt(),t.sibling=null,e=st.current,B(st,a?e&1|2:e&1),t):(Qe(t),null);case 22:case 23:return On(t),so(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?r&536870912&&!(t.flags&128)&&(Qe(t),t.subtreeFlags&6&&(t.flags|=8192)):Qe(t),r=t.updateQueue,r!==null&&Kl(t,r.retryQueue),r=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(r=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==r&&(t.flags|=2048),e!==null&&x(Cr),null;case 24:return r=null,e!==null&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),jn(ot),Qe(t),null;case 25:return null}throw Error(l(156,t.tag))}function Zb(e,t){switch(io(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return jn(ot),ge(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ge(t),null;case 13:if(On(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(l(340));aa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return x(st),null;case 4:return ge(),null;case 10:return jn(t.type),null;case 22:case 23:return On(t),so(),e!==null&&x(Cr),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return jn(ot),null;case 25:return null;default:return null}}function bm(e,t){switch(io(t),t.tag){case 3:jn(ot),ge();break;case 26:case 27:case 5:Ge(t);break;case 4:ge();break;case 13:On(t);break;case 19:x(st);break;case 10:jn(t.type);break;case 22:case 23:On(t),so(),e!==null&&x(Cr);break;case 24:jn(ot)}}var Jb={getCacheForType:function(e){var t=St(ot),r=t.data.get(e);return r===void 0&&(r=e(),t.data.set(e,r)),r}},Wb=typeof WeakMap=="function"?WeakMap:Map,Ze=0,Fe=null,Me=null,Le=0,Xe=0,Ht=null,Ln=!1,wi=!1,rf=!1,qn=0,We=0,sr=0,Vr=0,af=0,tn=0,Ai=0,Oa=null,vn=null,lf=!1,uf=0,Fl=1/0,Xl=null,or=null,Ql=!1,kr=null,Ta=0,sf=0,of=null,Ra=0,ff=null;function Vt(){if(Ze&2&&Le!==0)return Le&-Le;if(M.T!==null){var e=mi;return e!==0?e:vf()}return Bd()}function Em(){tn===0&&(tn=!(Le&536870912)||Ie?Ld():536870912);var e=Zt.current;return e!==null&&(e.flags|=32),tn}function Ot(e,t,r){(e===Fe&&Xe===2||e.cancelPendingCommit!==null)&&($i(e,0),Un(e,Le,tn,!1)),Pi(e,r),(!(Ze&2)||e!==Fe)&&(e===Fe&&(!(Ze&2)&&(Vr|=r),We===4&&Un(e,Le,tn,!1)),bn(e))}function _m(e,t,r){if(Ze&6)throw Error(l(327));var a=!r&&(t&60)===0&&(t&e.expiredLanes)===0||Yi(e,t),f=a?nE(e,t):pf(e,t,!0),h=a;do{if(f===0){wi&&!a&&Un(e,t,0,!1);break}else if(f===6)Un(e,t,0,!Ln);else{if(r=e.current.alternate,h&&!eE(r)){f=pf(e,t,!1),h=!1;continue}if(f===2){if(h=t,e.errorRecoveryDisabledLanes&h)var w=0;else w=e.pendingLanes&-536870913,w=w!==0?w:w&536870912?536870912:0;if(w!==0){t=w;e:{var I=e;f=Oa;var k=I.current.memoizedState.isDehydrated;if(k&&($i(I,w).flags|=256),w=pf(I,w,!1),w!==2){if(rf&&!k){I.errorRecoveryDisabledLanes|=h,Vr|=h,f=4;break e}h=vn,vn=f,h!==null&&cf(h)}f=w}if(h=!1,f!==2)continue}}if(f===1){$i(e,0),Un(e,t,0,!0);break}e:{switch(a=e,f){case 0:case 1:throw Error(l(345));case 4:if((t&4194176)===t){Un(a,t,tn,!Ln);break e}break;case 2:vn=null;break;case 3:case 5:break;default:throw Error(l(329))}if(a.finishedWork=r,a.finishedLanes=t,(t&62914560)===t&&(h=uf+300-mt(),10r?32:r,M.T=null,kr===null)var h=!1;else{r=of,of=null;var w=kr,I=Ta;if(kr=null,Ta=0,Ze&6)throw Error(l(331));var k=Ze;if(Ze|=4,pm(w.current),cm(w,w.current,I,r),Ze=k,Na(0,!1),qt&&typeof qt.onPostCommitFiberRoot=="function")try{qt.onPostCommitFiberRoot(Gi,w)}catch{}h=!0}return h}finally{N.p=f,M.T=a,jm(e,t)}}return!1}function Dm(e,t,r){t=Ft(r,t),t=Do(e.stateNode,t,2),e=rr(e,t,2),e!==null&&(Pi(e,2),bn(e))}function Ke(e,t,r){if(e.tag===3)Dm(e,e,r);else for(;t!==null;){if(t.tag===3){Dm(t,e,r);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(or===null||!or.has(a))){e=Ft(r,e),r=xp(2),a=rr(t,r,2),a!==null&&(Lp(r,a,t,e),Pi(a,2),bn(a));break}}t=t.return}}function mf(e,t,r){var a=e.pingCache;if(a===null){a=e.pingCache=new Wb;var f=new Set;a.set(t,f)}else f=a.get(t),f===void 0&&(f=new Set,a.set(t,f));f.has(r)||(rf=!0,f.add(r),e=aE.bind(null,e,t,r),t.then(e,e))}function aE(e,t,r){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&r,e.warmLanes&=~r,Fe===e&&(Le&r)===r&&(We===4||We===3&&(Le&62914560)===Le&&300>mt()-uf?!(Ze&2)&&$i(e,0):af|=r,Ai===Le&&(Ai=0)),bn(e)}function Mm(e,t){t===0&&(t=qd()),e=Xn(e,t),e!==null&&(Pi(e,t),bn(e))}function lE(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),Mm(e,r)}function uE(e,t){var r=0;switch(e.tag){case 13:var a=e.stateNode,f=e.memoizedState;f!==null&&(r=f.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(l(314))}a!==null&&a.delete(t),Mm(e,r)}function sE(e,t){return ze(e,t)}var Wl=null,Ri=null,gf=!1,eu=!1,yf=!1,Gr=0;function bn(e){e!==Ri&&e.next===null&&(Ri===null?Wl=Ri=e:Ri=Ri.next=e),eu=!0,gf||(gf=!0,fE(oE))}function Na(e,t){if(!yf&&eu){yf=!0;do for(var r=!1,a=Wl;a!==null;){if(e!==0){var f=a.pendingLanes;if(f===0)var h=0;else{var w=a.suspendedLanes,I=a.pingedLanes;h=(1<<31-Ut(42|e)+1)-1,h&=f&~(w&~I),h=h&201326677?h&201326677|1:h?h|2:0}h!==0&&(r=!0,Lm(a,h))}else h=Le,h=ol(a,a===Fe?h:0),!(h&3)||Yi(a,h)||(r=!0,Lm(a,h));a=a.next}while(r);yf=!1}}function oE(){eu=gf=!1;var e=0;Gr!==0&&(vE()&&(e=Gr),Gr=0);for(var t=mt(),r=null,a=Wl;a!==null;){var f=a.next,h=Cm(a,t);h===0?(a.next=null,r===null?Wl=f:r.next=f,f===null&&(Ri=r)):(r=a,(e!==0||h&3)&&(eu=!0)),a=f}Na(e)}function Cm(e,t){for(var r=e.suspendedLanes,a=e.pingedLanes,f=e.expirationTimes,h=e.pendingLanes&-62914561;0"u"?null:document;function Qm(e,t,r){var a=ji;if(a&&typeof t=="string"&&t){var f=Pt(t);f='link[rel="'+e+'"][href="'+f+'"]',typeof r=="string"&&(f+='[crossorigin="'+r+'"]'),Xm.has(f)||(Xm.add(f),e={rel:e,crossOrigin:r,href:t},a.querySelector(f)===null&&(t=a.createElement("link"),vt(t,"link",e),ct(t),a.head.appendChild(t)))}}function OE(e){zn.D(e),Qm("dns-prefetch",e,null)}function TE(e,t){zn.C(e,t),Qm("preconnect",e,t)}function RE(e,t,r){zn.L(e,t,r);var a=ji;if(a&&e&&t){var f='link[rel="preload"][as="'+Pt(t)+'"]';t==="image"&&r&&r.imageSrcSet?(f+='[imagesrcset="'+Pt(r.imageSrcSet)+'"]',typeof r.imageSizes=="string"&&(f+='[imagesizes="'+Pt(r.imageSizes)+'"]')):f+='[href="'+Pt(e)+'"]';var h=f;switch(t){case"style":h=Di(e);break;case"script":h=Mi(e)}nn.has(h)||(e=j({rel:"preload",href:t==="image"&&r&&r.imageSrcSet?void 0:e,as:t},r),nn.set(h,e),a.querySelector(f)!==null||t==="style"&&a.querySelector(Ma(h))||t==="script"&&a.querySelector(Ca(h))||(t=a.createElement("link"),vt(t,"link",e),ct(t),a.head.appendChild(t)))}}function NE(e,t){zn.m(e,t);var r=ji;if(r&&e){var a=t&&typeof t.as=="string"?t.as:"script",f='link[rel="modulepreload"][as="'+Pt(a)+'"][href="'+Pt(e)+'"]',h=f;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":h=Mi(e)}if(!nn.has(h)&&(e=j({rel:"modulepreload",href:e},t),nn.set(h,e),r.querySelector(f)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(r.querySelector(Ca(h)))return}a=r.createElement("link"),vt(a,"link",e),ct(a),r.head.appendChild(a)}}}function jE(e,t,r){zn.S(e,t,r);var a=ji;if(a&&e){var f=ei(a).hoistableStyles,h=Di(e);t=t||"default";var w=f.get(h);if(!w){var I={loading:0,preload:null};if(w=a.querySelector(Ma(h)))I.loading=5;else{e=j({rel:"stylesheet",href:e,"data-precedence":t},r),(r=nn.get(h))&&Df(e,r);var k=w=a.createElement("link");ct(k),vt(k,"link",e),k._p=new Promise(function(Z,fe){k.onload=Z,k.onerror=fe}),k.addEventListener("load",function(){I.loading|=1}),k.addEventListener("error",function(){I.loading|=2}),I.loading|=4,lu(w,t,a)}w={type:"stylesheet",instance:w,count:1,state:I},f.set(h,w)}}}function DE(e,t){zn.X(e,t);var r=ji;if(r&&e){var a=ei(r).hoistableScripts,f=Mi(e),h=a.get(f);h||(h=r.querySelector(Ca(f)),h||(e=j({src:e,async:!0},t),(t=nn.get(f))&&Mf(e,t),h=r.createElement("script"),ct(h),vt(h,"link",e),r.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},a.set(f,h))}}function ME(e,t){zn.M(e,t);var r=ji;if(r&&e){var a=ei(r).hoistableScripts,f=Mi(e),h=a.get(f);h||(h=r.querySelector(Ca(f)),h||(e=j({src:e,async:!0,type:"module"},t),(t=nn.get(f))&&Mf(e,t),h=r.createElement("script"),ct(h),vt(h,"link",e),r.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},a.set(f,h))}}function Zm(e,t,r,a){var f=(f=F.current)?au(f):null;if(!f)throw Error(l(446));switch(e){case"meta":case"title":return null;case"style":return typeof r.precedence=="string"&&typeof r.href=="string"?(t=Di(r.href),r=ei(f).hoistableStyles,a=r.get(t),a||(a={type:"style",instance:null,count:0,state:null},r.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(r.rel==="stylesheet"&&typeof r.href=="string"&&typeof r.precedence=="string"){e=Di(r.href);var h=ei(f).hoistableStyles,w=h.get(e);if(w||(f=f.ownerDocument||f,w={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},h.set(e,w),(h=f.querySelector(Ma(e)))&&!h._p&&(w.instance=h,w.state.loading=5),nn.has(e)||(r={rel:"preload",as:"style",href:r.href,crossOrigin:r.crossOrigin,integrity:r.integrity,media:r.media,hrefLang:r.hrefLang,referrerPolicy:r.referrerPolicy},nn.set(e,r),h||CE(f,e,r,w.state))),t&&a===null)throw Error(l(528,""));return w}if(t&&a!==null)throw Error(l(529,""));return null;case"script":return t=r.async,r=r.src,typeof r=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Mi(r),r=ei(f).hoistableScripts,a=r.get(t),a||(a={type:"script",instance:null,count:0,state:null},r.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,e))}}function Di(e){return'href="'+Pt(e)+'"'}function Ma(e){return'link[rel="stylesheet"]['+e+"]"}function Jm(e){return j({},e,{"data-precedence":e.precedence,precedence:null})}function CE(e,t,r,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),vt(t,"link",r),ct(t),e.head.appendChild(t))}function Mi(e){return'[src="'+Pt(e)+'"]'}function Ca(e){return"script[async]"+e}function Wm(e,t,r){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+Pt(r.href)+'"]');if(a)return t.instance=a,ct(a),a;var f=j({},r,{"data-href":r.href,"data-precedence":r.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),ct(a),vt(a,"style",f),lu(a,r.precedence,e),t.instance=a;case"stylesheet":f=Di(r.href);var h=e.querySelector(Ma(f));if(h)return t.state.loading|=4,t.instance=h,ct(h),h;a=Jm(r),(f=nn.get(f))&&Df(a,f),h=(e.ownerDocument||e).createElement("link"),ct(h);var w=h;return w._p=new Promise(function(I,k){w.onload=I,w.onerror=k}),vt(h,"link",a),t.state.loading|=4,lu(h,r.precedence,e),t.instance=h;case"script":return h=Mi(r.src),(f=e.querySelector(Ca(h)))?(t.instance=f,ct(f),f):(a=r,(f=nn.get(h))&&(a=j({},r),Mf(a,f)),e=e.ownerDocument||e,f=e.createElement("script"),ct(f),vt(f,"link",a),e.head.appendChild(f),t.instance=f);case"void":return null;default:throw Error(l(443,t.type))}else t.type==="stylesheet"&&!(t.state.loading&4)&&(a=t.instance,t.state.loading|=4,lu(a,r.precedence,e));return t.instance}function lu(e,t,r){for(var a=r.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),f=a.length?a[a.length-1]:null,h=f,w=0;w title"):null)}function xE(e,t,r){if(r===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function ng(e){return!(e.type==="stylesheet"&&!(e.state.loading&3))}var xa=null;function LE(){}function qE(e,t,r){if(xa===null)throw Error(l(475));var a=xa;if(t.type==="stylesheet"&&(typeof r.media!="string"||matchMedia(r.media).matches!==!1)&&!(t.state.loading&4)){if(t.instance===null){var f=Di(r.href),h=e.querySelector(Ma(f));if(h){e=h._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(a.count++,a=su.bind(a),e.then(a,a)),t.state.loading|=4,t.instance=h,ct(h);return}h=e.ownerDocument||e,r=Jm(r),(f=nn.get(f))&&Df(r,f),h=h.createElement("link"),ct(h);var w=h;w._p=new Promise(function(I,k){w.onload=I,w.onerror=k}),vt(h,"link",r),t.instance=h}a.stylesheets===null&&(a.stylesheets=new Map),a.stylesheets.set(t,e),(e=t.state.preload)&&!(t.state.loading&3)&&(a.count++,t=su.bind(a),e.addEventListener("load",t),e.addEventListener("error",t))}}function UE(){if(xa===null)throw Error(l(475));var e=xa;return e.stylesheets&&e.count===0&&Cf(e,e.stylesheets),0"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),Vf.exports=e_(),Vf.exports}var n_=t_();const r_=_s(n_);var i_=typeof window<"u",a_=function(n,i){return i_?window.matchMedia(n).matches:!1},l_=function(n,i){var u=ve.useState(a_(n)),l=u[0],s=u[1];return ve.useEffect(function(){var o=!0,c=window.matchMedia(n),d=function(){o&&s(!!c.matches)};return c.addEventListener("change",d),s(c.matches),function(){o=!1,c.removeEventListener("change",d)}},[n]),l},Vn={STATIC:"STATIC",DEFAULT:"DEFAULT",TARGETING_MATCH:"TARGETING_MATCH",SPLIT:"SPLIT",CACHED:"CACHED",DISABLED:"DISABLED",UNKNOWN:"UNKNOWN",STALE:"STALE",ERROR:"ERROR"},Xr=(n=>(n.PROVIDER_NOT_READY="PROVIDER_NOT_READY",n.PROVIDER_FATAL="PROVIDER_FATAL",n.FLAG_NOT_FOUND="FLAG_NOT_FOUND",n.PARSE_ERROR="PARSE_ERROR",n.TYPE_MISMATCH="TYPE_MISMATCH",n.TARGETING_KEY_MISSING="TARGETING_KEY_MISSING",n.INVALID_CONTEXT="INVALID_CONTEXT",n.GENERAL="GENERAL",n))(Xr||{}),u_=class ov extends Error{constructor(i,u){super(i),Object.setPrototypeOf(this,ov.prototype),this.name="OpenFeatureError",this.cause=u==null?void 0:u.cause}},Bi=class fv extends u_{constructor(i,u){super(i,u),Object.setPrototypeOf(this,fv.prototype),this.name="ParseError",this.code="PARSE_ERROR"}},cv=class{error(...n){console.error(...n)}warn(...n){console.warn(...n)}info(){}debug(){}},s_=["error","warn","info","debug"],o_=class{constructor(n){this.fallbackLogger=new cv;try{for(const i of s_)if(!n[i]||typeof n[i]!="function")throw new Error(`The provided logger is missing the ${i} method.`);this.logger=n}catch(i){console.error(i),console.error("Falling back to the default logger."),this.logger=this.fallbackLogger}}error(...n){this.log("error",...n)}warn(...n){this.log("warn",...n)}info(...n){this.log("info",...n)}debug(...n){this.log("debug",...n)}log(n,...i){try{this.logger[n](...i)}catch{this.fallbackLogger[n](...i)}}},yu={exports:{}},Pf={},In={},Yr={},Kf={},Ff={},Xf={},Ag;function ss(){return Ag||(Ag=1,function(n){Object.defineProperty(n,"__esModule",{value:!0}),n.regexpCode=n.getEsmExportName=n.getProperty=n.safeStringify=n.stringify=n.strConcat=n.addCodeArg=n.str=n._=n.nil=n._Code=n.Name=n.IDENTIFIER=n._CodeOrName=void 0;class i{}n._CodeOrName=i,n.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class u extends i{constructor(g){if(super(),!n.IDENTIFIER.test(g))throw new Error("CodeGen: name must be a valid identifier");this.str=g}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}n.Name=u;class l extends i{constructor(g){super(),this._items=typeof g=="string"?[g]:g}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;const g=this._items[0];return g===""||g==='""'}get str(){var g;return(g=this._str)!==null&&g!==void 0?g:this._str=this._items.reduce((E,_)=>`${E}${_}`,"")}get names(){var g;return(g=this._names)!==null&&g!==void 0?g:this._names=this._items.reduce((E,_)=>(_ instanceof u&&(E[_.str]=(E[_.str]||0)+1),E),{})}}n._Code=l,n.nil=new l("");function s(A,...g){const E=[A[0]];let _=0;for(;_{if(S.scopePath===void 0)throw new Error(`CodeGen: name "${S}" has no value`);return(0,i._)`${m}${S.scopePath}`})}scopeCode(m=this._values,v,S){return this._reduceValues(m,q=>{if(q.value===void 0)throw new Error(`CodeGen: name "${q}" has no value`);return q.value.code},v,S)}_reduceValues(m,v,S={},q){let C=i.nil;for(const U in m){const D=m[U];if(!D)continue;const y=S[U]=S[U]||new Map;D.forEach(A=>{if(y.has(A))return;y.set(A,l.Started);let g=v(A);if(g){const E=this.opts.es5?n.varKinds.var:n.varKinds.const;C=(0,i._)`${C}${E} ${A} = ${g};${this.opts._n}`}else if(g=q==null?void 0:q(A))C=(0,i._)`${C}${g}${this.opts._n}`;else throw new u(A);y.set(A,l.Completed)})}return C}}n.ValueScope=d}(Qf)),Qf}var Tg;function Ce(){return Tg||(Tg=1,function(n){Object.defineProperty(n,"__esModule",{value:!0}),n.or=n.and=n.not=n.CodeGen=n.operators=n.varKinds=n.ValueScopeName=n.ValueScope=n.Scope=n.Name=n.regexpCode=n.stringify=n.getProperty=n.nil=n.strConcat=n.str=n._=void 0;const i=ss(),u=Og();var l=ss();Object.defineProperty(n,"_",{enumerable:!0,get:function(){return l._}}),Object.defineProperty(n,"str",{enumerable:!0,get:function(){return l.str}}),Object.defineProperty(n,"strConcat",{enumerable:!0,get:function(){return l.strConcat}}),Object.defineProperty(n,"nil",{enumerable:!0,get:function(){return l.nil}}),Object.defineProperty(n,"getProperty",{enumerable:!0,get:function(){return l.getProperty}}),Object.defineProperty(n,"stringify",{enumerable:!0,get:function(){return l.stringify}}),Object.defineProperty(n,"regexpCode",{enumerable:!0,get:function(){return l.regexpCode}}),Object.defineProperty(n,"Name",{enumerable:!0,get:function(){return l.Name}});var s=Og();Object.defineProperty(n,"Scope",{enumerable:!0,get:function(){return s.Scope}}),Object.defineProperty(n,"ValueScope",{enumerable:!0,get:function(){return s.ValueScope}}),Object.defineProperty(n,"ValueScopeName",{enumerable:!0,get:function(){return s.ValueScopeName}}),Object.defineProperty(n,"varKinds",{enumerable:!0,get:function(){return s.varKinds}}),n.operators={GT:new i._Code(">"),GTE:new i._Code(">="),LT:new i._Code("<"),LTE:new i._Code("<="),EQ:new i._Code("==="),NEQ:new i._Code("!=="),NOT:new i._Code("!"),OR:new i._Code("||"),AND:new i._Code("&&"),ADD:new i._Code("+")};class o{optimizeNodes(){return this}optimizeNames(N,H){return this}}class c extends o{constructor(N,H,te){super(),this.varKind=N,this.name=H,this.rhs=te}render({es5:N,_n:H}){const te=N?u.varKinds.var:this.varKind,me=this.rhs===void 0?"":` = ${this.rhs}`;return`${te} ${this.name}${me};`+H}optimizeNames(N,H){if(N[this.name.str])return this.rhs&&(this.rhs=J(this.rhs,N,H)),this}get names(){return this.rhs instanceof i._CodeOrName?this.rhs.names:{}}}class d extends o{constructor(N,H,te){super(),this.lhs=N,this.rhs=H,this.sideEffects=te}render({_n:N}){return`${this.lhs} = ${this.rhs};`+N}optimizeNames(N,H){if(!(this.lhs instanceof i.Name&&!N[this.lhs.str]&&!this.sideEffects))return this.rhs=J(this.rhs,N,H),this}get names(){const N=this.lhs instanceof i.Name?{}:{...this.lhs.names};return W(N,this.rhs)}}class p extends d{constructor(N,H,te,me){super(N,te,me),this.op=H}render({_n:N}){return`${this.lhs} ${this.op}= ${this.rhs};`+N}}class m extends o{constructor(N){super(),this.label=N,this.names={}}render({_n:N}){return`${this.label}:`+N}}class v extends o{constructor(N){super(),this.label=N,this.names={}}render({_n:N}){return`break${this.label?` ${this.label}`:""};`+N}}class S extends o{constructor(N){super(),this.error=N}render({_n:N}){return`throw ${this.error};`+N}get names(){return this.error.names}}class q extends o{constructor(N){super(),this.code=N}render({_n:N}){return`${this.code};`+N}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(N,H){return this.code=J(this.code,N,H),this}get names(){return this.code instanceof i._CodeOrName?this.code.names:{}}}class C extends o{constructor(N=[]){super(),this.nodes=N}render(N){return this.nodes.reduce((H,te)=>H+te.render(N),"")}optimizeNodes(){const{nodes:N}=this;let H=N.length;for(;H--;){const te=N[H].optimizeNodes();Array.isArray(te)?N.splice(H,1,...te):te?N[H]=te:N.splice(H,1)}return N.length>0?this:void 0}optimizeNames(N,H){const{nodes:te}=this;let me=te.length;for(;me--;){const ie=te[me];ie.optimizeNames(N,H)||(ne(N,ie.names),te.splice(me,1))}return te.length>0?this:void 0}get names(){return this.nodes.reduce((N,H)=>X(N,H.names),{})}}class U extends C{render(N){return"{"+N._n+super.render(N)+"}"+N._n}}class D extends C{}class y extends U{}y.kind="else";class A extends U{constructor(N,H){super(H),this.condition=N}render(N){let H=`if(${this.condition})`+super.render(N);return this.else&&(H+="else "+this.else.render(N)),H}optimizeNodes(){super.optimizeNodes();const N=this.condition;if(N===!0)return this.nodes;let H=this.else;if(H){const te=H.optimizeNodes();H=this.else=Array.isArray(te)?new y(te):te}if(H)return N===!1?H instanceof A?H:H.nodes:this.nodes.length?this:new A(P(N),H instanceof A?[H]:H.nodes);if(!(N===!1||!this.nodes.length))return this}optimizeNames(N,H){var te;if(this.else=(te=this.else)===null||te===void 0?void 0:te.optimizeNames(N,H),!!(super.optimizeNames(N,H)||this.else))return this.condition=J(this.condition,N,H),this}get names(){const N=super.names;return W(N,this.condition),this.else&&X(N,this.else.names),N}}A.kind="if";class g extends U{}g.kind="for";class E extends g{constructor(N){super(),this.iteration=N}render(N){return`for(${this.iteration})`+super.render(N)}optimizeNames(N,H){if(super.optimizeNames(N,H))return this.iteration=J(this.iteration,N,H),this}get names(){return X(super.names,this.iteration.names)}}class _ extends g{constructor(N,H,te,me){super(),this.varKind=N,this.name=H,this.from=te,this.to=me}render(N){const H=N.es5?u.varKinds.var:this.varKind,{name:te,from:me,to:ie}=this;return`for(${H} ${te}=${me}; ${te}<${ie}; ${te}++)`+super.render(N)}get names(){const N=W(super.names,this.from);return W(N,this.to)}}class O extends g{constructor(N,H,te,me){super(),this.loop=N,this.varKind=H,this.name=te,this.iterable=me}render(N){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(N)}optimizeNames(N,H){if(super.optimizeNames(N,H))return this.iterable=J(this.iterable,N,H),this}get names(){return X(super.names,this.iterable.names)}}class b extends U{constructor(N,H,te){super(),this.name=N,this.args=H,this.async=te}render(N){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(N)}}b.kind="func";class T extends C{render(N){return"return "+super.render(N)}}T.kind="return";class $ extends U{render(N){let H="try"+super.render(N);return this.catch&&(H+=this.catch.render(N)),this.finally&&(H+=this.finally.render(N)),H}optimizeNodes(){var N,H;return super.optimizeNodes(),(N=this.catch)===null||N===void 0||N.optimizeNodes(),(H=this.finally)===null||H===void 0||H.optimizeNodes(),this}optimizeNames(N,H){var te,me;return super.optimizeNames(N,H),(te=this.catch)===null||te===void 0||te.optimizeNames(N,H),(me=this.finally)===null||me===void 0||me.optimizeNames(N,H),this}get names(){const N=super.names;return this.catch&&X(N,this.catch.names),this.finally&&X(N,this.finally.names),N}}class M extends U{constructor(N){super(),this.error=N}render(N){return`catch(${this.error})`+super.render(N)}}M.kind="catch";class j extends U{render(N){return"finally"+super.render(N)}}j.kind="finally";class G{constructor(N,H={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...H,_n:H.lines?` +`:""},this._extScope=N,this._scope=new u.Scope({parent:N}),this._nodes=[new D]}toString(){return this._root.render(this.opts)}name(N){return this._scope.name(N)}scopeName(N){return this._extScope.name(N)}scopeValue(N,H){const te=this._extScope.value(N,H);return(this._values[te.prefix]||(this._values[te.prefix]=new Set)).add(te),te}getScopeValue(N,H){return this._extScope.getValue(N,H)}scopeRefs(N){return this._extScope.scopeRefs(N,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(N,H,te,me){const ie=this._scope.toName(H);return te!==void 0&&me&&(this._constants[ie.str]=te),this._leafNode(new c(N,ie,te)),ie}const(N,H,te){return this._def(u.varKinds.const,N,H,te)}let(N,H,te){return this._def(u.varKinds.let,N,H,te)}var(N,H,te){return this._def(u.varKinds.var,N,H,te)}assign(N,H,te){return this._leafNode(new d(N,H,te))}add(N,H){return this._leafNode(new p(N,n.operators.ADD,H))}code(N){return typeof N=="function"?N():N!==i.nil&&this._leafNode(new q(N)),this}object(...N){const H=["{"];for(const[te,me]of N)H.length>1&&H.push(","),H.push(te),(te!==me||this.opts.es5)&&(H.push(":"),(0,i.addCodeArg)(H,me));return H.push("}"),new i._Code(H)}if(N,H,te){if(this._blockNode(new A(N)),H&&te)this.code(H).else().code(te).endIf();else if(H)this.code(H).endIf();else if(te)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(N){return this._elseNode(new A(N))}else(){return this._elseNode(new y)}endIf(){return this._endBlockNode(A,y)}_for(N,H){return this._blockNode(N),H&&this.code(H).endFor(),this}for(N,H){return this._for(new E(N),H)}forRange(N,H,te,me,ie=this.opts.es5?u.varKinds.var:u.varKinds.let){const x=this._scope.toName(N);return this._for(new _(ie,x,H,te),()=>me(x))}forOf(N,H,te,me=u.varKinds.const){const ie=this._scope.toName(N);if(this.opts.es5){const x=H instanceof i.Name?H:this.var("_arr",H);return this.forRange("_i",0,(0,i._)`${x}.length`,B=>{this.var(ie,(0,i._)`${x}[${B}]`),te(ie)})}return this._for(new O("of",me,ie,H),()=>te(ie))}forIn(N,H,te,me=this.opts.es5?u.varKinds.var:u.varKinds.const){if(this.opts.ownProperties)return this.forOf(N,(0,i._)`Object.keys(${H})`,te);const ie=this._scope.toName(N);return this._for(new O("in",me,ie,H),()=>te(ie))}endFor(){return this._endBlockNode(g)}label(N){return this._leafNode(new m(N))}break(N){return this._leafNode(new v(N))}return(N){const H=new T;if(this._blockNode(H),this.code(N),H.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(T)}try(N,H,te){if(!H&&!te)throw new Error('CodeGen: "try" without "catch" and "finally"');const me=new $;if(this._blockNode(me),this.code(N),H){const ie=this.name("e");this._currNode=me.catch=new M(ie),H(ie)}return te&&(this._currNode=me.finally=new j,this.code(te)),this._endBlockNode(M,j)}throw(N){return this._leafNode(new S(N))}block(N,H){return this._blockStarts.push(this._nodes.length),N&&this.code(N).endBlock(H),this}endBlock(N){const H=this._blockStarts.pop();if(H===void 0)throw new Error("CodeGen: not in self-balancing block");const te=this._nodes.length-H;if(te<0||N!==void 0&&te!==N)throw new Error(`CodeGen: wrong number of nodes: ${te} vs ${N} expected`);return this._nodes.length=H,this}func(N,H=i.nil,te,me){return this._blockNode(new b(N,H,te)),me&&this.code(me).endFunc(),this}endFunc(){return this._endBlockNode(b)}optimize(N=1){for(;N-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(N){return this._currNode.nodes.push(N),this}_blockNode(N){this._currNode.nodes.push(N),this._nodes.push(N)}_endBlockNode(N,H){const te=this._currNode;if(te instanceof N||H&&te instanceof H)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${H?`${N.kind}/${H.kind}`:N.kind}"`)}_elseNode(N){const H=this._currNode;if(!(H instanceof A))throw new Error('CodeGen: "else" without "if"');return this._currNode=H.else=N,this}get _root(){return this._nodes[0]}get _currNode(){const N=this._nodes;return N[N.length-1]}set _currNode(N){const H=this._nodes;H[H.length-1]=N}}n.CodeGen=G;function X(Y,N){for(const H in N)Y[H]=(Y[H]||0)+(N[H]||0);return Y}function W(Y,N){return N instanceof i._CodeOrName?X(Y,N.names):Y}function J(Y,N,H){if(Y instanceof i.Name)return te(Y);if(!me(Y))return Y;return new i._Code(Y._items.reduce((ie,x)=>(x instanceof i.Name&&(x=te(x)),x instanceof i._Code?ie.push(...x._items):ie.push(x),ie),[]));function te(ie){const x=H[ie.str];return x===void 0||N[ie.str]!==1?ie:(delete N[ie.str],x)}function me(ie){return ie instanceof i._Code&&ie._items.some(x=>x instanceof i.Name&&N[x.str]===1&&H[x.str]!==void 0)}}function ne(Y,N){for(const H in N)Y[H]=(Y[H]||0)-(N[H]||0)}function P(Y){return typeof Y=="boolean"||typeof Y=="number"||Y===null?!Y:(0,i._)`!${K(Y)}`}n.not=P;const se=z(n.operators.AND);function re(...Y){return Y.reduce(se)}n.and=re;const de=z(n.operators.OR);function R(...Y){return Y.reduce(de)}n.or=R;function z(Y){return(N,H)=>N===i.nil?H:H===i.nil?N:(0,i._)`${K(N)} ${Y} ${K(H)}`}function K(Y){return Y instanceof i.Name?Y:(0,i._)`(${Y})`}}(Ff)),Ff}var je={},Rg;function He(){if(Rg)return je;Rg=1,Object.defineProperty(je,"__esModule",{value:!0}),je.checkStrictMode=je.getErrorPath=je.Type=je.useFunc=je.setEvaluated=je.evaluatedPropsToName=je.mergeEvaluated=je.eachItem=je.unescapeJsonPointer=je.escapeJsonPointer=je.escapeFragment=je.unescapeFragment=je.schemaRefOrVal=je.schemaHasRulesButRef=je.schemaHasRules=je.checkUnknownRules=je.alwaysValidSchema=je.toHash=void 0;const n=Ce(),i=ss();function u(O){const b={};for(const T of O)b[T]=!0;return b}je.toHash=u;function l(O,b){return typeof b=="boolean"?b:Object.keys(b).length===0?!0:(s(O,b),!o(b,O.self.RULES.all))}je.alwaysValidSchema=l;function s(O,b=O.schema){const{opts:T,self:$}=O;if(!T.strictSchema||typeof b=="boolean")return;const M=$.RULES.keywords;for(const j in b)M[j]||_(O,`unknown keyword: "${j}"`)}je.checkUnknownRules=s;function o(O,b){if(typeof O=="boolean")return!O;for(const T in O)if(b[T])return!0;return!1}je.schemaHasRules=o;function c(O,b){if(typeof O=="boolean")return!O;for(const T in O)if(T!=="$ref"&&b.all[T])return!0;return!1}je.schemaHasRulesButRef=c;function d({topSchemaRef:O,schemaPath:b},T,$,M){if(!M){if(typeof T=="number"||typeof T=="boolean")return T;if(typeof T=="string")return(0,n._)`${T}`}return(0,n._)`${O}${b}${(0,n.getProperty)($)}`}je.schemaRefOrVal=d;function p(O){return S(decodeURIComponent(O))}je.unescapeFragment=p;function m(O){return encodeURIComponent(v(O))}je.escapeFragment=m;function v(O){return typeof O=="number"?`${O}`:O.replace(/~/g,"~0").replace(/\//g,"~1")}je.escapeJsonPointer=v;function S(O){return O.replace(/~1/g,"/").replace(/~0/g,"~")}je.unescapeJsonPointer=S;function q(O,b){if(Array.isArray(O))for(const T of O)b(T);else b(O)}je.eachItem=q;function C({mergeNames:O,mergeToName:b,mergeValues:T,resultToName:$}){return(M,j,G,X)=>{const W=G===void 0?j:G instanceof n.Name?(j instanceof n.Name?O(M,j,G):b(M,j,G),G):j instanceof n.Name?(b(M,G,j),j):T(j,G);return X===n.Name&&!(W instanceof n.Name)?$(M,W):W}}je.mergeEvaluated={props:C({mergeNames:(O,b,T)=>O.if((0,n._)`${T} !== true && ${b} !== undefined`,()=>{O.if((0,n._)`${b} === true`,()=>O.assign(T,!0),()=>O.assign(T,(0,n._)`${T} || {}`).code((0,n._)`Object.assign(${T}, ${b})`))}),mergeToName:(O,b,T)=>O.if((0,n._)`${T} !== true`,()=>{b===!0?O.assign(T,!0):(O.assign(T,(0,n._)`${T} || {}`),D(O,T,b))}),mergeValues:(O,b)=>O===!0?!0:{...O,...b},resultToName:U}),items:C({mergeNames:(O,b,T)=>O.if((0,n._)`${T} !== true && ${b} !== undefined`,()=>O.assign(T,(0,n._)`${b} === true ? true : ${T} > ${b} ? ${T} : ${b}`)),mergeToName:(O,b,T)=>O.if((0,n._)`${T} !== true`,()=>O.assign(T,b===!0?!0:(0,n._)`${T} > ${b} ? ${T} : ${b}`)),mergeValues:(O,b)=>O===!0?!0:Math.max(O,b),resultToName:(O,b)=>O.var("items",b)})};function U(O,b){if(b===!0)return O.var("props",!0);const T=O.var("props",(0,n._)`{}`);return b!==void 0&&D(O,T,b),T}je.evaluatedPropsToName=U;function D(O,b,T){Object.keys(T).forEach($=>O.assign((0,n._)`${b}${(0,n.getProperty)($)}`,!0))}je.setEvaluated=D;const y={};function A(O,b){return O.scopeValue("func",{ref:b,code:y[b.code]||(y[b.code]=new i._Code(b.code))})}je.useFunc=A;var g;(function(O){O[O.Num=0]="Num",O[O.Str=1]="Str"})(g||(je.Type=g={}));function E(O,b,T){if(O instanceof n.Name){const $=b===g.Num;return T?$?(0,n._)`"[" + ${O} + "]"`:(0,n._)`"['" + ${O} + "']"`:$?(0,n._)`"/" + ${O}`:(0,n._)`"/" + ${O}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return T?(0,n.getProperty)(O).toString():"/"+v(O)}je.getErrorPath=E;function _(O,b,T=O.opts.strictSchema){if(T){if(b=`strict mode: ${b}`,T===!0)throw new Error(b);O.self.logger.warn(b)}}return je.checkStrictMode=_,je}var vu={},Ng;function _r(){if(Ng)return vu;Ng=1,Object.defineProperty(vu,"__esModule",{value:!0});const n=Ce(),i={data:new n.Name("data"),valCxt:new n.Name("valCxt"),instancePath:new n.Name("instancePath"),parentData:new n.Name("parentData"),parentDataProperty:new n.Name("parentDataProperty"),rootData:new n.Name("rootData"),dynamicAnchors:new n.Name("dynamicAnchors"),vErrors:new n.Name("vErrors"),errors:new n.Name("errors"),this:new n.Name("this"),self:new n.Name("self"),scope:new n.Name("scope"),json:new n.Name("json"),jsonPos:new n.Name("jsonPos"),jsonLen:new n.Name("jsonLen"),jsonPart:new n.Name("jsonPart")};return vu.default=i,vu}var jg;function Ss(){return jg||(jg=1,function(n){Object.defineProperty(n,"__esModule",{value:!0}),n.extendErrors=n.resetErrorsCount=n.reportExtraError=n.reportError=n.keyword$DataError=n.keywordError=void 0;const i=Ce(),u=He(),l=_r();n.keywordError={message:({keyword:y})=>(0,i.str)`must pass "${y}" keyword validation`},n.keyword$DataError={message:({keyword:y,schemaType:A})=>A?(0,i.str)`"${y}" keyword must be ${A} ($data)`:(0,i.str)`"${y}" keyword is invalid ($data)`};function s(y,A=n.keywordError,g,E){const{it:_}=y,{gen:O,compositeRule:b,allErrors:T}=_,$=S(y,A,g);E??(b||T)?p(O,$):m(_,(0,i._)`[${$}]`)}n.reportError=s;function o(y,A=n.keywordError,g){const{it:E}=y,{gen:_,compositeRule:O,allErrors:b}=E,T=S(y,A,g);p(_,T),O||b||m(E,l.default.vErrors)}n.reportExtraError=o;function c(y,A){y.assign(l.default.errors,A),y.if((0,i._)`${l.default.vErrors} !== null`,()=>y.if(A,()=>y.assign((0,i._)`${l.default.vErrors}.length`,A),()=>y.assign(l.default.vErrors,null)))}n.resetErrorsCount=c;function d({gen:y,keyword:A,schemaValue:g,data:E,errsCount:_,it:O}){if(_===void 0)throw new Error("ajv implementation error");const b=y.name("err");y.forRange("i",_,l.default.errors,T=>{y.const(b,(0,i._)`${l.default.vErrors}[${T}]`),y.if((0,i._)`${b}.instancePath === undefined`,()=>y.assign((0,i._)`${b}.instancePath`,(0,i.strConcat)(l.default.instancePath,O.errorPath))),y.assign((0,i._)`${b}.schemaPath`,(0,i.str)`${O.errSchemaPath}/${A}`),O.opts.verbose&&(y.assign((0,i._)`${b}.schema`,g),y.assign((0,i._)`${b}.data`,E))})}n.extendErrors=d;function p(y,A){const g=y.const("err",A);y.if((0,i._)`${l.default.vErrors} === null`,()=>y.assign(l.default.vErrors,(0,i._)`[${g}]`),(0,i._)`${l.default.vErrors}.push(${g})`),y.code((0,i._)`${l.default.errors}++`)}function m(y,A){const{gen:g,validateName:E,schemaEnv:_}=y;_.$async?g.throw((0,i._)`new ${y.ValidationError}(${A})`):(g.assign((0,i._)`${E}.errors`,A),g.return(!1))}const v={keyword:new i.Name("keyword"),schemaPath:new i.Name("schemaPath"),params:new i.Name("params"),propertyName:new i.Name("propertyName"),message:new i.Name("message"),schema:new i.Name("schema"),parentSchema:new i.Name("parentSchema")};function S(y,A,g){const{createErrors:E}=y.it;return E===!1?(0,i._)`{}`:q(y,A,g)}function q(y,A,g={}){const{gen:E,it:_}=y,O=[C(_,g),U(y,g)];return D(y,A,O),E.object(...O)}function C({errorPath:y},{instancePath:A}){const g=A?(0,i.str)`${y}${(0,u.getErrorPath)(A,u.Type.Str)}`:y;return[l.default.instancePath,(0,i.strConcat)(l.default.instancePath,g)]}function U({keyword:y,it:{errSchemaPath:A}},{schemaPath:g,parentSchema:E}){let _=E?A:(0,i.str)`${A}/${y}`;return g&&(_=(0,i.str)`${_}${(0,u.getErrorPath)(g,u.Type.Str)}`),[v.schemaPath,_]}function D(y,{params:A,message:g},E){const{keyword:_,data:O,schemaValue:b,it:T}=y,{opts:$,propertyName:M,topSchemaRef:j,schemaPath:G}=T;E.push([v.keyword,_],[v.params,typeof A=="function"?A(y):A||(0,i._)`{}`]),$.messages&&E.push([v.message,typeof g=="function"?g(y):g]),$.verbose&&E.push([v.schema,b],[v.parentSchema,(0,i._)`${j}${G}`],[l.default.data,O]),M&&E.push([v.propertyName,M])}}(Kf)),Kf}var Dg;function f_(){if(Dg)return Yr;Dg=1,Object.defineProperty(Yr,"__esModule",{value:!0}),Yr.boolOrEmptySchema=Yr.topBoolOrEmptySchema=void 0;const n=Ss(),i=Ce(),u=_r(),l={message:"boolean schema is false"};function s(d){const{gen:p,schema:m,validateName:v}=d;m===!1?c(d,!1):typeof m=="object"&&m.$async===!0?p.return(u.default.data):(p.assign((0,i._)`${v}.errors`,null),p.return(!0))}Yr.topBoolOrEmptySchema=s;function o(d,p){const{gen:m,schema:v}=d;v===!1?(m.var(p,!1),c(d)):m.var(p,!0)}Yr.boolOrEmptySchema=o;function c(d,p){const{gen:m,data:v}=d,S={gen:m,keyword:"false schema",data:v,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:d};(0,n.reportError)(S,l,void 0,p)}return Yr}var bt={},Pr={},Mg;function dv(){if(Mg)return Pr;Mg=1,Object.defineProperty(Pr,"__esModule",{value:!0}),Pr.getRules=Pr.isJSONType=void 0;const n=["string","number","integer","boolean","null","object","array"],i=new Set(n);function u(s){return typeof s=="string"&&i.has(s)}Pr.isJSONType=u;function l(){const s={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...s,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},s.number,s.string,s.array,s.object],post:{rules:[]},all:{},keywords:{}}}return Pr.getRules=l,Pr}var Bn={},Cg;function hv(){if(Cg)return Bn;Cg=1,Object.defineProperty(Bn,"__esModule",{value:!0}),Bn.shouldUseRule=Bn.shouldUseGroup=Bn.schemaHasRulesForType=void 0;function n({schema:l,self:s},o){const c=s.RULES.types[o];return c&&c!==!0&&i(l,c)}Bn.schemaHasRulesForType=n;function i(l,s){return s.rules.some(o=>u(l,o))}Bn.shouldUseGroup=i;function u(l,s){var o;return l[s.keyword]!==void 0||((o=s.definition.implements)===null||o===void 0?void 0:o.some(c=>l[c]!==void 0))}return Bn.shouldUseRule=u,Bn}var xg;function os(){if(xg)return bt;xg=1,Object.defineProperty(bt,"__esModule",{value:!0}),bt.reportTypeError=bt.checkDataTypes=bt.checkDataType=bt.coerceAndCheckDataType=bt.getJSONTypes=bt.getSchemaTypes=bt.DataType=void 0;const n=dv(),i=hv(),u=Ss(),l=Ce(),s=He();var o;(function(g){g[g.Correct=0]="Correct",g[g.Wrong=1]="Wrong"})(o||(bt.DataType=o={}));function c(g){const E=d(g.type);if(E.includes("null")){if(g.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!E.length&&g.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');g.nullable===!0&&E.push("null")}return E}bt.getSchemaTypes=c;function d(g){const E=Array.isArray(g)?g:g?[g]:[];if(E.every(n.isJSONType))return E;throw new Error("type must be JSONType or JSONType[]: "+E.join(","))}bt.getJSONTypes=d;function p(g,E){const{gen:_,data:O,opts:b}=g,T=v(E,b.coerceTypes),$=E.length>0&&!(T.length===0&&E.length===1&&(0,i.schemaHasRulesForType)(g,E[0]));if($){const M=U(E,O,b.strictNumbers,o.Wrong);_.if(M,()=>{T.length?S(g,E,T):y(g)})}return $}bt.coerceAndCheckDataType=p;const m=new Set(["string","number","integer","boolean","null"]);function v(g,E){return E?g.filter(_=>m.has(_)||E==="array"&&_==="array"):[]}function S(g,E,_){const{gen:O,data:b,opts:T}=g,$=O.let("dataType",(0,l._)`typeof ${b}`),M=O.let("coerced",(0,l._)`undefined`);T.coerceTypes==="array"&&O.if((0,l._)`${$} == 'object' && Array.isArray(${b}) && ${b}.length == 1`,()=>O.assign(b,(0,l._)`${b}[0]`).assign($,(0,l._)`typeof ${b}`).if(U(E,b,T.strictNumbers),()=>O.assign(M,b))),O.if((0,l._)`${M} !== undefined`);for(const G of _)(m.has(G)||G==="array"&&T.coerceTypes==="array")&&j(G);O.else(),y(g),O.endIf(),O.if((0,l._)`${M} !== undefined`,()=>{O.assign(b,M),q(g,M)});function j(G){switch(G){case"string":O.elseIf((0,l._)`${$} == "number" || ${$} == "boolean"`).assign(M,(0,l._)`"" + ${b}`).elseIf((0,l._)`${b} === null`).assign(M,(0,l._)`""`);return;case"number":O.elseIf((0,l._)`${$} == "boolean" || ${b} === null + || (${$} == "string" && ${b} && ${b} == +${b})`).assign(M,(0,l._)`+${b}`);return;case"integer":O.elseIf((0,l._)`${$} === "boolean" || ${b} === null + || (${$} === "string" && ${b} && ${b} == +${b} && !(${b} % 1))`).assign(M,(0,l._)`+${b}`);return;case"boolean":O.elseIf((0,l._)`${b} === "false" || ${b} === 0 || ${b} === null`).assign(M,!1).elseIf((0,l._)`${b} === "true" || ${b} === 1`).assign(M,!0);return;case"null":O.elseIf((0,l._)`${b} === "" || ${b} === 0 || ${b} === false`),O.assign(M,null);return;case"array":O.elseIf((0,l._)`${$} === "string" || ${$} === "number" + || ${$} === "boolean" || ${b} === null`).assign(M,(0,l._)`[${b}]`)}}}function q({gen:g,parentData:E,parentDataProperty:_},O){g.if((0,l._)`${E} !== undefined`,()=>g.assign((0,l._)`${E}[${_}]`,O))}function C(g,E,_,O=o.Correct){const b=O===o.Correct?l.operators.EQ:l.operators.NEQ;let T;switch(g){case"null":return(0,l._)`${E} ${b} null`;case"array":T=(0,l._)`Array.isArray(${E})`;break;case"object":T=(0,l._)`${E} && typeof ${E} == "object" && !Array.isArray(${E})`;break;case"integer":T=$((0,l._)`!(${E} % 1) && !isNaN(${E})`);break;case"number":T=$();break;default:return(0,l._)`typeof ${E} ${b} ${g}`}return O===o.Correct?T:(0,l.not)(T);function $(M=l.nil){return(0,l.and)((0,l._)`typeof ${E} == "number"`,M,_?(0,l._)`isFinite(${E})`:l.nil)}}bt.checkDataType=C;function U(g,E,_,O){if(g.length===1)return C(g[0],E,_,O);let b;const T=(0,s.toHash)(g);if(T.array&&T.object){const $=(0,l._)`typeof ${E} != "object"`;b=T.null?$:(0,l._)`!${E} || ${$}`,delete T.null,delete T.array,delete T.object}else b=l.nil;T.number&&delete T.integer;for(const $ in T)b=(0,l.and)(b,C($,E,_,O));return b}bt.checkDataTypes=U;const D={message:({schema:g})=>`must be ${g}`,params:({schema:g,schemaValue:E})=>typeof g=="string"?(0,l._)`{type: ${g}}`:(0,l._)`{type: ${E}}`};function y(g){const E=A(g);(0,u.reportError)(E,D)}bt.reportTypeError=y;function A(g){const{gen:E,data:_,schema:O}=g,b=(0,s.schemaRefOrVal)(g,O,"type");return{gen:E,keyword:"type",data:_,schema:O.type,schemaCode:b,schemaValue:b,parentSchema:O,params:{},it:g}}return bt}var Va={},Lg;function c_(){if(Lg)return Va;Lg=1,Object.defineProperty(Va,"__esModule",{value:!0}),Va.assignDefaults=void 0;const n=Ce(),i=He();function u(s,o){const{properties:c,items:d}=s.schema;if(o==="object"&&c)for(const p in c)l(s,p,c[p].default);else o==="array"&&Array.isArray(d)&&d.forEach((p,m)=>l(s,m,p.default))}Va.assignDefaults=u;function l(s,o,c){const{gen:d,compositeRule:p,data:m,opts:v}=s;if(c===void 0)return;const S=(0,n._)`${m}${(0,n.getProperty)(o)}`;if(p){(0,i.checkStrictMode)(s,`default is ignored for: ${S}`);return}let q=(0,n._)`${S} === undefined`;v.useDefaults==="empty"&&(q=(0,n._)`${q} || ${S} === null || ${S} === ""`),d.if(q,(0,n._)`${S} = ${(0,n.stringify)(c)}`)}return Va}var on={},ke={},qg;function dn(){if(qg)return ke;qg=1,Object.defineProperty(ke,"__esModule",{value:!0}),ke.validateUnion=ke.validateArray=ke.usePattern=ke.callValidateCode=ke.schemaProperties=ke.allSchemaProperties=ke.noPropertyInData=ke.propertyInData=ke.isOwnProperty=ke.hasPropFunc=ke.reportMissingProp=ke.checkMissingProp=ke.checkReportMissingProp=void 0;const n=Ce(),i=He(),u=_r(),l=He();function s(g,E){const{gen:_,data:O,it:b}=g;_.if(v(_,O,E,b.opts.ownProperties),()=>{g.setParams({missingProperty:(0,n._)`${E}`},!0),g.error()})}ke.checkReportMissingProp=s;function o({gen:g,data:E,it:{opts:_}},O,b){return(0,n.or)(...O.map(T=>(0,n.and)(v(g,E,T,_.ownProperties),(0,n._)`${b} = ${T}`)))}ke.checkMissingProp=o;function c(g,E){g.setParams({missingProperty:E},!0),g.error()}ke.reportMissingProp=c;function d(g){return g.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,n._)`Object.prototype.hasOwnProperty`})}ke.hasPropFunc=d;function p(g,E,_){return(0,n._)`${d(g)}.call(${E}, ${_})`}ke.isOwnProperty=p;function m(g,E,_,O){const b=(0,n._)`${E}${(0,n.getProperty)(_)} !== undefined`;return O?(0,n._)`${b} && ${p(g,E,_)}`:b}ke.propertyInData=m;function v(g,E,_,O){const b=(0,n._)`${E}${(0,n.getProperty)(_)} === undefined`;return O?(0,n.or)(b,(0,n.not)(p(g,E,_))):b}ke.noPropertyInData=v;function S(g){return g?Object.keys(g).filter(E=>E!=="__proto__"):[]}ke.allSchemaProperties=S;function q(g,E){return S(E).filter(_=>!(0,i.alwaysValidSchema)(g,E[_]))}ke.schemaProperties=q;function C({schemaCode:g,data:E,it:{gen:_,topSchemaRef:O,schemaPath:b,errorPath:T},it:$},M,j,G){const X=G?(0,n._)`${g}, ${E}, ${O}${b}`:E,W=[[u.default.instancePath,(0,n.strConcat)(u.default.instancePath,T)],[u.default.parentData,$.parentData],[u.default.parentDataProperty,$.parentDataProperty],[u.default.rootData,u.default.rootData]];$.opts.dynamicRef&&W.push([u.default.dynamicAnchors,u.default.dynamicAnchors]);const J=(0,n._)`${X}, ${_.object(...W)}`;return j!==n.nil?(0,n._)`${M}.call(${j}, ${J})`:(0,n._)`${M}(${J})`}ke.callValidateCode=C;const U=(0,n._)`new RegExp`;function D({gen:g,it:{opts:E}},_){const O=E.unicodeRegExp?"u":"",{regExp:b}=E.code,T=b(_,O);return g.scopeValue("pattern",{key:T.toString(),ref:T,code:(0,n._)`${b.code==="new RegExp"?U:(0,l.useFunc)(g,b)}(${_}, ${O})`})}ke.usePattern=D;function y(g){const{gen:E,data:_,keyword:O,it:b}=g,T=E.name("valid");if(b.allErrors){const M=E.let("valid",!0);return $(()=>E.assign(M,!1)),M}return E.var(T,!0),$(()=>E.break()),T;function $(M){const j=E.const("len",(0,n._)`${_}.length`);E.forRange("i",0,j,G=>{g.subschema({keyword:O,dataProp:G,dataPropType:i.Type.Num},T),E.if((0,n.not)(T),M)})}}ke.validateArray=y;function A(g){const{gen:E,schema:_,keyword:O,it:b}=g;if(!Array.isArray(_))throw new Error("ajv implementation error");if(_.some(j=>(0,i.alwaysValidSchema)(b,j))&&!b.opts.unevaluated)return;const $=E.let("valid",!1),M=E.name("_valid");E.block(()=>_.forEach((j,G)=>{const X=g.subschema({keyword:O,schemaProp:G,compositeRule:!0},M);E.assign($,(0,n._)`${$} || ${M}`),g.mergeValidEvaluated(X,M)||E.if((0,n.not)($))})),g.result($,()=>g.reset(),()=>g.error(!0))}return ke.validateUnion=A,ke}var Ug;function d_(){if(Ug)return on;Ug=1,Object.defineProperty(on,"__esModule",{value:!0}),on.validateKeywordUsage=on.validSchemaType=on.funcKeywordCode=on.macroKeywordCode=void 0;const n=Ce(),i=_r(),u=dn(),l=Ss();function s(q,C){const{gen:U,keyword:D,schema:y,parentSchema:A,it:g}=q,E=C.macro.call(g.self,y,A,g),_=m(U,D,E);g.opts.validateSchema!==!1&&g.self.validateSchema(E,!0);const O=U.name("valid");q.subschema({schema:E,schemaPath:n.nil,errSchemaPath:`${g.errSchemaPath}/${D}`,topSchemaRef:_,compositeRule:!0},O),q.pass(O,()=>q.error(!0))}on.macroKeywordCode=s;function o(q,C){var U;const{gen:D,keyword:y,schema:A,parentSchema:g,$data:E,it:_}=q;p(_,C);const O=!E&&C.compile?C.compile.call(_.self,A,g,_):C.validate,b=m(D,y,O),T=D.let("valid");q.block$data(T,$),q.ok((U=C.valid)!==null&&U!==void 0?U:T);function $(){if(C.errors===!1)G(),C.modifying&&c(q),X(()=>q.error());else{const W=C.async?M():j();C.modifying&&c(q),X(()=>d(q,W))}}function M(){const W=D.let("ruleErrs",null);return D.try(()=>G((0,n._)`await `),J=>D.assign(T,!1).if((0,n._)`${J} instanceof ${_.ValidationError}`,()=>D.assign(W,(0,n._)`${J}.errors`),()=>D.throw(J))),W}function j(){const W=(0,n._)`${b}.errors`;return D.assign(W,null),G(n.nil),W}function G(W=C.async?(0,n._)`await `:n.nil){const J=_.opts.passContext?i.default.this:i.default.self,ne=!("compile"in C&&!E||C.schema===!1);D.assign(T,(0,n._)`${W}${(0,u.callValidateCode)(q,b,J,ne)}`,C.modifying)}function X(W){var J;D.if((0,n.not)((J=C.valid)!==null&&J!==void 0?J:T),W)}}on.funcKeywordCode=o;function c(q){const{gen:C,data:U,it:D}=q;C.if(D.parentData,()=>C.assign(U,(0,n._)`${D.parentData}[${D.parentDataProperty}]`))}function d(q,C){const{gen:U}=q;U.if((0,n._)`Array.isArray(${C})`,()=>{U.assign(i.default.vErrors,(0,n._)`${i.default.vErrors} === null ? ${C} : ${i.default.vErrors}.concat(${C})`).assign(i.default.errors,(0,n._)`${i.default.vErrors}.length`),(0,l.extendErrors)(q)},()=>q.error())}function p({schemaEnv:q},C){if(C.async&&!q.$async)throw new Error("async keyword in sync schema")}function m(q,C,U){if(U===void 0)throw new Error(`keyword "${C}" failed to compile`);return q.scopeValue("keyword",typeof U=="function"?{ref:U}:{ref:U,code:(0,n.stringify)(U)})}function v(q,C,U=!1){return!C.length||C.some(D=>D==="array"?Array.isArray(q):D==="object"?q&&typeof q=="object"&&!Array.isArray(q):typeof q==D||U&&typeof q>"u")}on.validSchemaType=v;function S({schema:q,opts:C,self:U,errSchemaPath:D},y,A){if(Array.isArray(y.keyword)?!y.keyword.includes(A):y.keyword!==A)throw new Error("ajv implementation error");const g=y.dependencies;if(g!=null&&g.some(E=>!Object.prototype.hasOwnProperty.call(q,E)))throw new Error(`parent schema must have dependencies of ${A}: ${g.join(",")}`);if(y.validateSchema&&!y.validateSchema(q[A])){const _=`keyword "${A}" value is invalid at path "${D}": `+U.errorsText(y.validateSchema.errors);if(C.validateSchema==="log")U.logger.error(_);else throw new Error(_)}}return on.validateKeywordUsage=S,on}var Hn={},zg;function h_(){if(zg)return Hn;zg=1,Object.defineProperty(Hn,"__esModule",{value:!0}),Hn.extendSubschemaMode=Hn.extendSubschemaData=Hn.getSubschema=void 0;const n=Ce(),i=He();function u(o,{keyword:c,schemaProp:d,schema:p,schemaPath:m,errSchemaPath:v,topSchemaRef:S}){if(c!==void 0&&p!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(c!==void 0){const q=o.schema[c];return d===void 0?{schema:q,schemaPath:(0,n._)`${o.schemaPath}${(0,n.getProperty)(c)}`,errSchemaPath:`${o.errSchemaPath}/${c}`}:{schema:q[d],schemaPath:(0,n._)`${o.schemaPath}${(0,n.getProperty)(c)}${(0,n.getProperty)(d)}`,errSchemaPath:`${o.errSchemaPath}/${c}/${(0,i.escapeFragment)(d)}`}}if(p!==void 0){if(m===void 0||v===void 0||S===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:p,schemaPath:m,topSchemaRef:S,errSchemaPath:v}}throw new Error('either "keyword" or "schema" must be passed')}Hn.getSubschema=u;function l(o,c,{dataProp:d,dataPropType:p,data:m,dataTypes:v,propertyName:S}){if(m!==void 0&&d!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');const{gen:q}=c;if(d!==void 0){const{errorPath:U,dataPathArr:D,opts:y}=c,A=q.let("data",(0,n._)`${c.data}${(0,n.getProperty)(d)}`,!0);C(A),o.errorPath=(0,n.str)`${U}${(0,i.getErrorPath)(d,p,y.jsPropertySyntax)}`,o.parentDataProperty=(0,n._)`${d}`,o.dataPathArr=[...D,o.parentDataProperty]}if(m!==void 0){const U=m instanceof n.Name?m:q.let("data",m,!0);C(U),S!==void 0&&(o.propertyName=S)}v&&(o.dataTypes=v);function C(U){o.data=U,o.dataLevel=c.dataLevel+1,o.dataTypes=[],c.definedProperties=new Set,o.parentData=c.data,o.dataNames=[...c.dataNames,U]}}Hn.extendSubschemaData=l;function s(o,{jtdDiscriminator:c,jtdMetadata:d,compositeRule:p,createErrors:m,allErrors:v}){p!==void 0&&(o.compositeRule=p),m!==void 0&&(o.createErrors=m),v!==void 0&&(o.allErrors=v),o.jtdDiscriminator=c,o.jtdMetadata=d}return Hn.extendSubschemaMode=s,Hn}var Tt={},Zf,Ig;function pv(){return Ig||(Ig=1,Zf=function n(i,u){if(i===u)return!0;if(i&&u&&typeof i=="object"&&typeof u=="object"){if(i.constructor!==u.constructor)return!1;var l,s,o;if(Array.isArray(i)){if(l=i.length,l!=u.length)return!1;for(s=l;s--!==0;)if(!n(i[s],u[s]))return!1;return!0}if(i.constructor===RegExp)return i.source===u.source&&i.flags===u.flags;if(i.valueOf!==Object.prototype.valueOf)return i.valueOf()===u.valueOf();if(i.toString!==Object.prototype.toString)return i.toString()===u.toString();if(o=Object.keys(i),l=o.length,l!==Object.keys(u).length)return!1;for(s=l;s--!==0;)if(!Object.prototype.hasOwnProperty.call(u,o[s]))return!1;for(s=l;s--!==0;){var c=o[s];if(!n(i[c],u[c]))return!1}return!0}return i!==i&&u!==u}),Zf}var Jf={exports:{}},Bg;function p_(){if(Bg)return Jf.exports;Bg=1;var n=Jf.exports=function(l,s,o){typeof s=="function"&&(o=s,s={}),o=s.cb||o;var c=typeof o=="function"?o:o.pre||function(){},d=o.post||function(){};i(s,c,d,l,"",l)};n.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0},n.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},n.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},n.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function i(l,s,o,c,d,p,m,v,S,q){if(c&&typeof c=="object"&&!Array.isArray(c)){s(c,d,p,m,v,S,q);for(var C in c){var U=c[C];if(Array.isArray(U)){if(C in n.arrayKeywords)for(var D=0;Dy+=d(g)),y===1/0))return 1/0}return y}function p(D,y="",A){A!==!1&&(y=S(y));const g=D.parse(y);return m(D,g)}Tt.getFullPath=p;function m(D,y){return D.serialize(y).split("#")[0]+"#"}Tt._getFullPath=m;const v=/#\/?$/;function S(D){return D?D.replace(v,""):""}Tt.normalizeId=S;function q(D,y,A){return A=S(A),D.resolve(y,A)}Tt.resolveUrl=q;const C=/^[a-z_][-a-z0-9._]*$/i;function U(D,y){if(typeof D=="boolean")return{};const{schemaId:A,uriResolver:g}=this.opts,E=S(D[A]||y),_={"":E},O=p(g,E,!1),b={},T=new Set;return u(D,{allKeys:!0},(j,G,X,W)=>{if(W===void 0)return;const J=O+G;let ne=_[W];typeof j[A]=="string"&&(ne=P.call(this,j[A])),se.call(this,j.$anchor),se.call(this,j.$dynamicAnchor),_[G]=ne;function P(re){const de=this.opts.uriResolver.resolve;if(re=S(ne?de(ne,re):re),T.has(re))throw M(re);T.add(re);let R=this.refs[re];return typeof R=="string"&&(R=this.refs[R]),typeof R=="object"?$(j,R.schema,re):re!==S(J)&&(re[0]==="#"?($(j,b[re],re),b[re]=j):this.refs[re]=J),re}function se(re){if(typeof re=="string"){if(!C.test(re))throw new Error(`invalid anchor "${re}"`);P.call(this,`#${re}`)}}}),b;function $(j,G,X){if(G!==void 0&&!i(j,G))throw M(X)}function M(j){return new Error(`reference "${j}" resolves to more than one schema`)}}return Tt.getSchemaRefs=U,Tt}var Vg;function As(){if(Vg)return In;Vg=1,Object.defineProperty(In,"__esModule",{value:!0}),In.getData=In.KeywordCxt=In.validateFunctionCode=void 0;const n=f_(),i=os(),u=hv(),l=os(),s=c_(),o=d_(),c=h_(),d=Ce(),p=_r(),m=ws(),v=He(),S=Ss();function q(L){if(O(L)&&(T(L),_(L))){y(L);return}C(L,()=>(0,n.topBoolOrEmptySchema)(L))}In.validateFunctionCode=q;function C({gen:L,validateName:V,schema:F,schemaEnv:le,opts:pe},ge){pe.code.es5?L.func(V,(0,d._)`${p.default.data}, ${p.default.valCxt}`,le.$async,()=>{L.code((0,d._)`"use strict"; ${g(F,pe)}`),D(L,pe),L.code(ge)}):L.func(V,(0,d._)`${p.default.data}, ${U(pe)}`,le.$async,()=>L.code(g(F,pe)).code(ge))}function U(L){return(0,d._)`{${p.default.instancePath}="", ${p.default.parentData}, ${p.default.parentDataProperty}, ${p.default.rootData}=${p.default.data}${L.dynamicRef?(0,d._)`, ${p.default.dynamicAnchors}={}`:d.nil}}={}`}function D(L,V){L.if(p.default.valCxt,()=>{L.var(p.default.instancePath,(0,d._)`${p.default.valCxt}.${p.default.instancePath}`),L.var(p.default.parentData,(0,d._)`${p.default.valCxt}.${p.default.parentData}`),L.var(p.default.parentDataProperty,(0,d._)`${p.default.valCxt}.${p.default.parentDataProperty}`),L.var(p.default.rootData,(0,d._)`${p.default.valCxt}.${p.default.rootData}`),V.dynamicRef&&L.var(p.default.dynamicAnchors,(0,d._)`${p.default.valCxt}.${p.default.dynamicAnchors}`)},()=>{L.var(p.default.instancePath,(0,d._)`""`),L.var(p.default.parentData,(0,d._)`undefined`),L.var(p.default.parentDataProperty,(0,d._)`undefined`),L.var(p.default.rootData,p.default.data),V.dynamicRef&&L.var(p.default.dynamicAnchors,(0,d._)`{}`)})}function y(L){const{schema:V,opts:F,gen:le}=L;C(L,()=>{F.$comment&&V.$comment&&W(L),j(L),le.let(p.default.vErrors,null),le.let(p.default.errors,0),F.unevaluated&&A(L),$(L),J(L)})}function A(L){const{gen:V,validateName:F}=L;L.evaluated=V.const("evaluated",(0,d._)`${F}.evaluated`),V.if((0,d._)`${L.evaluated}.dynamicProps`,()=>V.assign((0,d._)`${L.evaluated}.props`,(0,d._)`undefined`)),V.if((0,d._)`${L.evaluated}.dynamicItems`,()=>V.assign((0,d._)`${L.evaluated}.items`,(0,d._)`undefined`))}function g(L,V){const F=typeof L=="object"&&L[V.schemaId];return F&&(V.code.source||V.code.process)?(0,d._)`/*# sourceURL=${F} */`:d.nil}function E(L,V){if(O(L)&&(T(L),_(L))){b(L,V);return}(0,n.boolOrEmptySchema)(L,V)}function _({schema:L,self:V}){if(typeof L=="boolean")return!L;for(const F in L)if(V.RULES.all[F])return!0;return!1}function O(L){return typeof L.schema!="boolean"}function b(L,V){const{schema:F,gen:le,opts:pe}=L;pe.$comment&&F.$comment&&W(L),G(L),X(L);const ge=le.const("_errs",p.default.errors);$(L,ge),le.var(V,(0,d._)`${ge} === ${p.default.errors}`)}function T(L){(0,v.checkUnknownRules)(L),M(L)}function $(L,V){if(L.opts.jtd)return P(L,[],!1,V);const F=(0,i.getSchemaTypes)(L.schema),le=(0,i.coerceAndCheckDataType)(L,F);P(L,F,!le,V)}function M(L){const{schema:V,errSchemaPath:F,opts:le,self:pe}=L;V.$ref&&le.ignoreKeywordsWithRef&&(0,v.schemaHasRulesButRef)(V,pe.RULES)&&pe.logger.warn(`$ref: keywords ignored in schema at path "${F}"`)}function j(L){const{schema:V,opts:F}=L;V.default!==void 0&&F.useDefaults&&F.strictSchema&&(0,v.checkStrictMode)(L,"default is ignored in the schema root")}function G(L){const V=L.schema[L.opts.schemaId];V&&(L.baseId=(0,m.resolveUrl)(L.opts.uriResolver,L.baseId,V))}function X(L){if(L.schema.$async&&!L.schemaEnv.$async)throw new Error("async schema in sync schema")}function W({gen:L,schemaEnv:V,schema:F,errSchemaPath:le,opts:pe}){const ge=F.$comment;if(pe.$comment===!0)L.code((0,d._)`${p.default.self}.logger.log(${ge})`);else if(typeof pe.$comment=="function"){const Te=(0,d.str)`${le}/$comment`,Ge=L.scopeValue("root",{ref:V.root});L.code((0,d._)`${p.default.self}.opts.$comment(${ge}, ${Te}, ${Ge}.schema)`)}}function J(L){const{gen:V,schemaEnv:F,validateName:le,ValidationError:pe,opts:ge}=L;F.$async?V.if((0,d._)`${p.default.errors} === 0`,()=>V.return(p.default.data),()=>V.throw((0,d._)`new ${pe}(${p.default.vErrors})`)):(V.assign((0,d._)`${le}.errors`,p.default.vErrors),ge.unevaluated&&ne(L),V.return((0,d._)`${p.default.errors} === 0`))}function ne({gen:L,evaluated:V,props:F,items:le}){F instanceof d.Name&&L.assign((0,d._)`${V}.props`,F),le instanceof d.Name&&L.assign((0,d._)`${V}.items`,le)}function P(L,V,F,le){const{gen:pe,schema:ge,data:Te,allErrors:Ge,opts:Ue,self:ze}=L,{RULES:Re}=ze;if(ge.$ref&&(Ue.ignoreKeywordsWithRef||!(0,v.schemaHasRulesButRef)(ge,Re))){pe.block(()=>me(L,"$ref",Re.all.$ref.definition));return}Ue.jtd||re(L,V),pe.block(()=>{for(const nt of Re.rules)Ve(nt);Ve(Re.post)});function Ve(nt){(0,u.shouldUseGroup)(ge,nt)&&(nt.type?(pe.if((0,l.checkDataType)(nt.type,Te,Ue.strictNumbers)),se(L,nt),V.length===1&&V[0]===nt.type&&F&&(pe.else(),(0,l.reportTypeError)(L)),pe.endIf()):se(L,nt),Ge||pe.if((0,d._)`${p.default.errors} === ${le||0}`))}}function se(L,V){const{gen:F,schema:le,opts:{useDefaults:pe}}=L;pe&&(0,s.assignDefaults)(L,V.type),F.block(()=>{for(const ge of V.rules)(0,u.shouldUseRule)(le,ge)&&me(L,ge.keyword,ge.definition,V.type)})}function re(L,V){L.schemaEnv.meta||!L.opts.strictTypes||(de(L,V),L.opts.allowUnionTypes||R(L,V),z(L,L.dataTypes))}function de(L,V){if(V.length){if(!L.dataTypes.length){L.dataTypes=V;return}V.forEach(F=>{Y(L.dataTypes,F)||H(L,`type "${F}" not allowed by context "${L.dataTypes.join(",")}"`)}),N(L,V)}}function R(L,V){V.length>1&&!(V.length===2&&V.includes("null"))&&H(L,"use allowUnionTypes to allow union type keyword")}function z(L,V){const F=L.self.RULES.all;for(const le in F){const pe=F[le];if(typeof pe=="object"&&(0,u.shouldUseRule)(L.schema,pe)){const{type:ge}=pe.definition;ge.length&&!ge.some(Te=>K(V,Te))&&H(L,`missing type "${ge.join(",")}" for keyword "${le}"`)}}}function K(L,V){return L.includes(V)||V==="number"&&L.includes("integer")}function Y(L,V){return L.includes(V)||V==="integer"&&L.includes("number")}function N(L,V){const F=[];for(const le of L.dataTypes)Y(V,le)?F.push(le):V.includes("integer")&&le==="number"&&F.push("integer");L.dataTypes=F}function H(L,V){const F=L.schemaEnv.baseId+L.errSchemaPath;V+=` at "${F}" (strictTypes)`,(0,v.checkStrictMode)(L,V,L.opts.strictTypes)}class te{constructor(V,F,le){if((0,o.validateKeywordUsage)(V,F,le),this.gen=V.gen,this.allErrors=V.allErrors,this.keyword=le,this.data=V.data,this.schema=V.schema[le],this.$data=F.$data&&V.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,v.schemaRefOrVal)(V,this.schema,le,this.$data),this.schemaType=F.schemaType,this.parentSchema=V.schema,this.params={},this.it=V,this.def=F,this.$data)this.schemaCode=V.gen.const("vSchema",B(this.$data,V));else if(this.schemaCode=this.schemaValue,!(0,o.validSchemaType)(this.schema,F.schemaType,F.allowUndefined))throw new Error(`${le} value must be ${JSON.stringify(F.schemaType)}`);("code"in F?F.trackErrors:F.errors!==!1)&&(this.errsCount=V.gen.const("_errs",p.default.errors))}result(V,F,le){this.failResult((0,d.not)(V),F,le)}failResult(V,F,le){this.gen.if(V),le?le():this.error(),F?(this.gen.else(),F(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(V,F){this.failResult((0,d.not)(V),void 0,F)}fail(V){if(V===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(V),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(V){if(!this.$data)return this.fail(V);const{schemaCode:F}=this;this.fail((0,d._)`${F} !== undefined && (${(0,d.or)(this.invalid$data(),V)})`)}error(V,F,le){if(F){this.setParams(F),this._error(V,le),this.setParams({});return}this._error(V,le)}_error(V,F){(V?S.reportExtraError:S.reportError)(this,this.def.error,F)}$dataError(){(0,S.reportError)(this,this.def.$dataError||S.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,S.resetErrorsCount)(this.gen,this.errsCount)}ok(V){this.allErrors||this.gen.if(V)}setParams(V,F){F?Object.assign(this.params,V):this.params=V}block$data(V,F,le=d.nil){this.gen.block(()=>{this.check$data(V,le),F()})}check$data(V=d.nil,F=d.nil){if(!this.$data)return;const{gen:le,schemaCode:pe,schemaType:ge,def:Te}=this;le.if((0,d.or)((0,d._)`${pe} === undefined`,F)),V!==d.nil&&le.assign(V,!0),(ge.length||Te.validateSchema)&&(le.elseIf(this.invalid$data()),this.$dataError(),V!==d.nil&&le.assign(V,!1)),le.else()}invalid$data(){const{gen:V,schemaCode:F,schemaType:le,def:pe,it:ge}=this;return(0,d.or)(Te(),Ge());function Te(){if(le.length){if(!(F instanceof d.Name))throw new Error("ajv implementation error");const Ue=Array.isArray(le)?le:[le];return(0,d._)`${(0,l.checkDataTypes)(Ue,F,ge.opts.strictNumbers,l.DataType.Wrong)}`}return d.nil}function Ge(){if(pe.validateSchema){const Ue=V.scopeValue("validate$data",{ref:pe.validateSchema});return(0,d._)`!${Ue}(${F})`}return d.nil}}subschema(V,F){const le=(0,c.getSubschema)(this.it,V);(0,c.extendSubschemaData)(le,this.it,V),(0,c.extendSubschemaMode)(le,V);const pe={...this.it,...le,items:void 0,props:void 0};return E(pe,F),pe}mergeEvaluated(V,F){const{it:le,gen:pe}=this;le.opts.unevaluated&&(le.props!==!0&&V.props!==void 0&&(le.props=v.mergeEvaluated.props(pe,V.props,le.props,F)),le.items!==!0&&V.items!==void 0&&(le.items=v.mergeEvaluated.items(pe,V.items,le.items,F)))}mergeValidEvaluated(V,F){const{it:le,gen:pe}=this;if(le.opts.unevaluated&&(le.props!==!0||le.items!==!0))return pe.if(F,()=>this.mergeEvaluated(V,d.Name)),!0}}In.KeywordCxt=te;function me(L,V,F,le){const pe=new te(L,F,V);"code"in F?F.code(pe,le):pe.$data&&F.validate?(0,o.funcKeywordCode)(pe,F):"macro"in F?(0,o.macroKeywordCode)(pe,F):(F.compile||F.validate)&&(0,o.funcKeywordCode)(pe,F)}const ie=/^\/(?:[^~]|~0|~1)*$/,x=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function B(L,{dataLevel:V,dataNames:F,dataPathArr:le}){let pe,ge;if(L==="")return p.default.rootData;if(L[0]==="/"){if(!ie.test(L))throw new Error(`Invalid JSON-pointer: ${L}`);pe=L,ge=p.default.rootData}else{const ze=x.exec(L);if(!ze)throw new Error(`Invalid JSON-pointer: ${L}`);const Re=+ze[1];if(pe=ze[2],pe==="#"){if(Re>=V)throw new Error(Ue("property/index",Re));return le[V-Re]}if(Re>V)throw new Error(Ue("data",Re));if(ge=F[V-Re],!pe)return ge}let Te=ge;const Ge=pe.split("/");for(const ze of Ge)ze&&(ge=(0,d._)`${ge}${(0,d.getProperty)((0,v.unescapeJsonPointer)(ze))}`,Te=(0,d._)`${Te} && ${ge}`);return Te;function Ue(ze,Re){return`Cannot access ${ze} ${Re} levels up, current level is ${V}`}}return In.getData=B,In}var bu={},kg;function pd(){if(kg)return bu;kg=1,Object.defineProperty(bu,"__esModule",{value:!0});class n extends Error{constructor(u){super("validation failed"),this.errors=u,this.ajv=this.validation=!0}}return bu.default=n,bu}var Eu={},Gg;function $s(){if(Gg)return Eu;Gg=1,Object.defineProperty(Eu,"__esModule",{value:!0});const n=ws();class i extends Error{constructor(l,s,o,c){super(c||`can't resolve reference ${o} from id ${s}`),this.missingRef=(0,n.resolveUrl)(l,s,o),this.missingSchema=(0,n.normalizeId)((0,n.getFullPath)(l,this.missingRef))}}return Eu.default=i,Eu}var kt={},Yg;function md(){if(Yg)return kt;Yg=1,Object.defineProperty(kt,"__esModule",{value:!0}),kt.resolveSchema=kt.getCompilingSchema=kt.resolveRef=kt.compileSchema=kt.SchemaEnv=void 0;const n=Ce(),i=pd(),u=_r(),l=ws(),s=He(),o=As();class c{constructor(A){var g;this.refs={},this.dynamicAnchors={};let E;typeof A.schema=="object"&&(E=A.schema),this.schema=A.schema,this.schemaId=A.schemaId,this.root=A.root||this,this.baseId=(g=A.baseId)!==null&&g!==void 0?g:(0,l.normalizeId)(E==null?void 0:E[A.schemaId||"$id"]),this.schemaPath=A.schemaPath,this.localRefs=A.localRefs,this.meta=A.meta,this.$async=E==null?void 0:E.$async,this.refs={}}}kt.SchemaEnv=c;function d(y){const A=v.call(this,y);if(A)return A;const g=(0,l.getFullPath)(this.opts.uriResolver,y.root.baseId),{es5:E,lines:_}=this.opts.code,{ownProperties:O}=this.opts,b=new n.CodeGen(this.scope,{es5:E,lines:_,ownProperties:O});let T;y.$async&&(T=b.scopeValue("Error",{ref:i.default,code:(0,n._)`require("ajv/dist/runtime/validation_error").default`}));const $=b.scopeName("validate");y.validateName=$;const M={gen:b,allErrors:this.opts.allErrors,data:u.default.data,parentData:u.default.parentData,parentDataProperty:u.default.parentDataProperty,dataNames:[u.default.data],dataPathArr:[n.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:b.scopeValue("schema",this.opts.code.source===!0?{ref:y.schema,code:(0,n.stringify)(y.schema)}:{ref:y.schema}),validateName:$,ValidationError:T,schema:y.schema,schemaEnv:y,rootId:g,baseId:y.baseId||g,schemaPath:n.nil,errSchemaPath:y.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,n._)`""`,opts:this.opts,self:this};let j;try{this._compilations.add(y),(0,o.validateFunctionCode)(M),b.optimize(this.opts.code.optimize);const G=b.toString();j=`${b.scopeRefs(u.default.scope)}return ${G}`,this.opts.code.process&&(j=this.opts.code.process(j,y));const W=new Function(`${u.default.self}`,`${u.default.scope}`,j)(this,this.scope.get());if(this.scope.value($,{ref:W}),W.errors=null,W.schema=y.schema,W.schemaEnv=y,y.$async&&(W.$async=!0),this.opts.code.source===!0&&(W.source={validateName:$,validateCode:G,scopeValues:b._values}),this.opts.unevaluated){const{props:J,items:ne}=M;W.evaluated={props:J instanceof n.Name?void 0:J,items:ne instanceof n.Name?void 0:ne,dynamicProps:J instanceof n.Name,dynamicItems:ne instanceof n.Name},W.source&&(W.source.evaluated=(0,n.stringify)(W.evaluated))}return y.validate=W,y}catch(G){throw delete y.validate,delete y.validateName,j&&this.logger.error("Error compiling schema, function code:",j),G}finally{this._compilations.delete(y)}}kt.compileSchema=d;function p(y,A,g){var E;g=(0,l.resolveUrl)(this.opts.uriResolver,A,g);const _=y.refs[g];if(_)return _;let O=q.call(this,y,g);if(O===void 0){const b=(E=y.localRefs)===null||E===void 0?void 0:E[g],{schemaId:T}=this.opts;b&&(O=new c({schema:b,schemaId:T,root:y,baseId:A}))}if(O!==void 0)return y.refs[g]=m.call(this,O)}kt.resolveRef=p;function m(y){return(0,l.inlineRef)(y.schema,this.opts.inlineRefs)?y.schema:y.validate?y:d.call(this,y)}function v(y){for(const A of this._compilations)if(S(A,y))return A}kt.getCompilingSchema=v;function S(y,A){return y.schema===A.schema&&y.root===A.root&&y.baseId===A.baseId}function q(y,A){let g;for(;typeof(g=this.refs[A])=="string";)A=g;return g||this.schemas[A]||C.call(this,y,A)}function C(y,A){const g=this.opts.uriResolver.parse(A),E=(0,l._getFullPath)(this.opts.uriResolver,g);let _=(0,l.getFullPath)(this.opts.uriResolver,y.baseId,void 0);if(Object.keys(y.schema).length>0&&E===_)return D.call(this,g,y);const O=(0,l.normalizeId)(E),b=this.refs[O]||this.schemas[O];if(typeof b=="string"){const T=C.call(this,y,b);return typeof(T==null?void 0:T.schema)!="object"?void 0:D.call(this,g,T)}if(typeof(b==null?void 0:b.schema)=="object"){if(b.validate||d.call(this,b),O===(0,l.normalizeId)(A)){const{schema:T}=b,{schemaId:$}=this.opts,M=T[$];return M&&(_=(0,l.resolveUrl)(this.opts.uriResolver,_,M)),new c({schema:T,schemaId:$,root:y,baseId:_})}return D.call(this,g,b)}}kt.resolveSchema=C;const U=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function D(y,{baseId:A,schema:g,root:E}){var _;if(((_=y.fragment)===null||_===void 0?void 0:_[0])!=="/")return;for(const T of y.fragment.slice(1).split("/")){if(typeof g=="boolean")return;const $=g[(0,s.unescapeFragment)(T)];if($===void 0)return;g=$;const M=typeof g=="object"&&g[this.opts.schemaId];!U.has(T)&&M&&(A=(0,l.resolveUrl)(this.opts.uriResolver,A,M))}let O;if(typeof g!="boolean"&&g.$ref&&!(0,s.schemaHasRulesButRef)(g,this.RULES)){const T=(0,l.resolveUrl)(this.opts.uriResolver,A,g.$ref);O=C.call(this,E,T)}const{schemaId:b}=this.opts;if(O=O||new c({schema:g,schemaId:b,root:E,baseId:A}),O.schema!==O.root.schema)return O}return kt}const m_="https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",g_="Meta-schema for $data reference (JSON AnySchema extension proposal)",y_="object",v_=["$data"],b_={$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},E_=!1,__={$id:m_,description:g_,type:y_,required:v_,properties:b_,additionalProperties:E_};var _u={},ka={exports:{}},Wf,Pg;function S_(){return Pg||(Pg=1,Wf={HEX:{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15}}),Wf}var ec,Kg;function w_(){if(Kg)return ec;Kg=1;const{HEX:n}=S_(),i=/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u;function u(D){if(d(D,".")<3)return{host:D,isIPV4:!1};const y=D.match(i)||[],[A]=y;return A?{host:c(A,"."),isIPV4:!0}:{host:D,isIPV4:!1}}function l(D,y=!1){let A="",g=!0;for(const E of D){if(n[E]===void 0)return;E!=="0"&&g===!0&&(g=!1),g||(A+=E)}return y&&A.length===0&&(A="0"),A}function s(D){let y=0;const A={error:!1,address:"",zone:""},g=[],E=[];let _=!1,O=!1,b=!1;function T(){if(E.length){if(_===!1){const $=l(E);if($!==void 0)g.push($);else return A.error=!0,!1}E.length=0}return!0}for(let $=0;$7){A.error=!0;break}$-1>=0&&D[$-1]===":"&&(O=!0);continue}else if(M==="%"){if(!T())break;_=!0}else{E.push(M);continue}}return E.length&&(_?A.zone=E.join(""):b?g.push(E.join("")):g.push(l(E))),A.address=g.join(""),A}function o(D){if(d(D,":")<2)return{host:D,isIPV6:!1};const y=s(D);if(y.error)return{host:D,isIPV6:!1};{let A=y.address,g=y.address;return y.zone&&(A+="%"+y.zone,g+="%25"+y.zone),{host:A,escapedHost:g,isIPV6:!0}}}function c(D,y){let A="",g=!0;const E=D.length;for(let _=0;_/[^!"$&'()*+,\-.;=_`a-z{}~]/u.test(String.fromCharCode(A)));function q(y){let A=0;for(let g=0,E=y.length;g126||S[A])return!0;return!1}const C=/^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;function U(y,A){const g=Object.assign({},A),E={scheme:void 0,userinfo:void 0,host:"",port:void 0,path:"",query:void 0,fragment:void 0},_=y.indexOf("%")!==-1;let O=!1;g.reference==="suffix"&&(y=(g.scheme?g.scheme+":":"")+"//"+y);const b=y.match(C);if(b){if(E.scheme=b[1],E.userinfo=b[3],E.host=b[4],E.port=parseInt(b[5],10),E.path=b[6]||"",E.query=b[7],E.fragment=b[8],isNaN(E.port)&&(E.port=b[5]),E.host){const $=i(E.host);if($.isIPV4===!1){const M=n($.host);E.host=M.host.toLowerCase(),O=M.isIPV6}else E.host=$.host,O=!0}E.scheme===void 0&&E.userinfo===void 0&&E.host===void 0&&E.port===void 0&&!E.path&&E.query===void 0?E.reference="same-document":E.scheme===void 0?E.reference="relative":E.fragment===void 0?E.reference="absolute":E.reference="uri",g.reference&&g.reference!=="suffix"&&g.reference!==E.reference&&(E.error=E.error||"URI is not a "+g.reference+" reference.");const T=o[(g.scheme||E.scheme||"").toLowerCase()];if(!g.unicodeSupport&&(!T||!T.unicodeSupport)&&E.host&&(g.domainHost||T&&T.domainHost)&&O===!1&&q(E.host))try{E.host=URL.domainToASCII(E.host.toLowerCase())}catch($){E.error=E.error||"Host's domain name can not be converted to ASCII: "+$}(!T||T&&!T.skipNormalize)&&(_&&E.scheme!==void 0&&(E.scheme=unescape(E.scheme)),_&&E.host!==void 0&&(E.host=unescape(E.host)),E.path&&E.path.length&&(E.path=escape(unescape(E.path))),E.fragment&&E.fragment.length&&(E.fragment=encodeURI(decodeURIComponent(E.fragment)))),T&&T.parse&&T.parse(E,g)}else E.error=E.error||"URI can not be parsed.";return E}const D={SCHEMES:o,normalize:c,resolve:d,resolveComponents:p,equal:m,serialize:v,parse:U};return ka.exports=D,ka.exports.default=D,ka.exports.fastUri=D,ka.exports}var Qg;function O_(){if(Qg)return _u;Qg=1,Object.defineProperty(_u,"__esModule",{value:!0});const n=$_();return n.code='require("ajv/dist/runtime/uri").default',_u.default=n,_u}var Zg;function T_(){return Zg||(Zg=1,function(n){Object.defineProperty(n,"__esModule",{value:!0}),n.CodeGen=n.Name=n.nil=n.stringify=n.str=n._=n.KeywordCxt=void 0;var i=As();Object.defineProperty(n,"KeywordCxt",{enumerable:!0,get:function(){return i.KeywordCxt}});var u=Ce();Object.defineProperty(n,"_",{enumerable:!0,get:function(){return u._}}),Object.defineProperty(n,"str",{enumerable:!0,get:function(){return u.str}}),Object.defineProperty(n,"stringify",{enumerable:!0,get:function(){return u.stringify}}),Object.defineProperty(n,"nil",{enumerable:!0,get:function(){return u.nil}}),Object.defineProperty(n,"Name",{enumerable:!0,get:function(){return u.Name}}),Object.defineProperty(n,"CodeGen",{enumerable:!0,get:function(){return u.CodeGen}});const l=pd(),s=$s(),o=dv(),c=md(),d=Ce(),p=ws(),m=os(),v=He(),S=__,q=O_(),C=(R,z)=>new RegExp(R,z);C.code="new RegExp";const U=["removeAdditional","useDefaults","coerceTypes"],D=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),y={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},A={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},g=200;function E(R){var z,K,Y,N,H,te,me,ie,x,B,L,V,F,le,pe,ge,Te,Ge,Ue,ze,Re,Ve,nt,mt,ki;const Yn=R.strict,Zr=(z=R.code)===null||z===void 0?void 0:z.optimize,Sr=Zr===!0||Zr===void 0?1:Zr||0,al=(Y=(K=R.code)===null||K===void 0?void 0:K.regExp)!==null&&Y!==void 0?Y:C,ll=(N=R.uriResolver)!==null&&N!==void 0?N:q.default;return{strictSchema:(te=(H=R.strictSchema)!==null&&H!==void 0?H:Yn)!==null&&te!==void 0?te:!0,strictNumbers:(ie=(me=R.strictNumbers)!==null&&me!==void 0?me:Yn)!==null&&ie!==void 0?ie:!0,strictTypes:(B=(x=R.strictTypes)!==null&&x!==void 0?x:Yn)!==null&&B!==void 0?B:"log",strictTuples:(V=(L=R.strictTuples)!==null&&L!==void 0?L:Yn)!==null&&V!==void 0?V:"log",strictRequired:(le=(F=R.strictRequired)!==null&&F!==void 0?F:Yn)!==null&&le!==void 0?le:!1,code:R.code?{...R.code,optimize:Sr,regExp:al}:{optimize:Sr,regExp:al},loopRequired:(pe=R.loopRequired)!==null&&pe!==void 0?pe:g,loopEnum:(ge=R.loopEnum)!==null&&ge!==void 0?ge:g,meta:(Te=R.meta)!==null&&Te!==void 0?Te:!0,messages:(Ge=R.messages)!==null&&Ge!==void 0?Ge:!0,inlineRefs:(Ue=R.inlineRefs)!==null&&Ue!==void 0?Ue:!0,schemaId:(ze=R.schemaId)!==null&&ze!==void 0?ze:"$id",addUsedSchema:(Re=R.addUsedSchema)!==null&&Re!==void 0?Re:!0,validateSchema:(Ve=R.validateSchema)!==null&&Ve!==void 0?Ve:!0,validateFormats:(nt=R.validateFormats)!==null&&nt!==void 0?nt:!0,unicodeRegExp:(mt=R.unicodeRegExp)!==null&&mt!==void 0?mt:!0,int32range:(ki=R.int32range)!==null&&ki!==void 0?ki:!0,uriResolver:ll}}class _{constructor(z={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,z=this.opts={...z,...E(z)};const{es5:K,lines:Y}=this.opts.code;this.scope=new d.ValueScope({scope:{},prefixes:D,es5:K,lines:Y}),this.logger=X(z.logger);const N=z.validateFormats;z.validateFormats=!1,this.RULES=(0,o.getRules)(),O.call(this,y,z,"NOT SUPPORTED"),O.call(this,A,z,"DEPRECATED","warn"),this._metaOpts=j.call(this),z.formats&&$.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),z.keywords&&M.call(this,z.keywords),typeof z.meta=="object"&&this.addMetaSchema(z.meta),T.call(this),z.validateFormats=N}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){const{$data:z,meta:K,schemaId:Y}=this.opts;let N=S;Y==="id"&&(N={...S},N.id=N.$id,delete N.$id),K&&z&&this.addMetaSchema(N,N[Y],!1)}defaultMeta(){const{meta:z,schemaId:K}=this.opts;return this.opts.defaultMeta=typeof z=="object"?z[K]||z:void 0}validate(z,K){let Y;if(typeof z=="string"){if(Y=this.getSchema(z),!Y)throw new Error(`no schema with key or ref "${z}"`)}else Y=this.compile(z);const N=Y(K);return"$async"in Y||(this.errors=Y.errors),N}compile(z,K){const Y=this._addSchema(z,K);return Y.validate||this._compileSchemaEnv(Y)}compileAsync(z,K){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");const{loadSchema:Y}=this.opts;return N.call(this,z,K);async function N(B,L){await H.call(this,B.$schema);const V=this._addSchema(B,L);return V.validate||te.call(this,V)}async function H(B){B&&!this.getSchema(B)&&await N.call(this,{$ref:B},!0)}async function te(B){try{return this._compileSchemaEnv(B)}catch(L){if(!(L instanceof s.default))throw L;return me.call(this,L),await ie.call(this,L.missingSchema),te.call(this,B)}}function me({missingSchema:B,missingRef:L}){if(this.refs[B])throw new Error(`AnySchema ${B} is loaded but ${L} cannot be resolved`)}async function ie(B){const L=await x.call(this,B);this.refs[B]||await H.call(this,L.$schema),this.refs[B]||this.addSchema(L,B,K)}async function x(B){const L=this._loading[B];if(L)return L;try{return await(this._loading[B]=Y(B))}finally{delete this._loading[B]}}}addSchema(z,K,Y,N=this.opts.validateSchema){if(Array.isArray(z)){for(const te of z)this.addSchema(te,void 0,Y,N);return this}let H;if(typeof z=="object"){const{schemaId:te}=this.opts;if(H=z[te],H!==void 0&&typeof H!="string")throw new Error(`schema ${te} must be string`)}return K=(0,p.normalizeId)(K||H),this._checkUnique(K),this.schemas[K]=this._addSchema(z,Y,K,N,!0),this}addMetaSchema(z,K,Y=this.opts.validateSchema){return this.addSchema(z,K,!0,Y),this}validateSchema(z,K){if(typeof z=="boolean")return!0;let Y;if(Y=z.$schema,Y!==void 0&&typeof Y!="string")throw new Error("$schema must be a string");if(Y=Y||this.opts.defaultMeta||this.defaultMeta(),!Y)return this.logger.warn("meta-schema not available"),this.errors=null,!0;const N=this.validate(Y,z);if(!N&&K){const H="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(H);else throw new Error(H)}return N}getSchema(z){let K;for(;typeof(K=b.call(this,z))=="string";)z=K;if(K===void 0){const{schemaId:Y}=this.opts,N=new c.SchemaEnv({schema:{},schemaId:Y});if(K=c.resolveSchema.call(this,N,z),!K)return;this.refs[z]=K}return K.validate||this._compileSchemaEnv(K)}removeSchema(z){if(z instanceof RegExp)return this._removeAllSchemas(this.schemas,z),this._removeAllSchemas(this.refs,z),this;switch(typeof z){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{const K=b.call(this,z);return typeof K=="object"&&this._cache.delete(K.schema),delete this.schemas[z],delete this.refs[z],this}case"object":{const K=z;this._cache.delete(K);let Y=z[this.opts.schemaId];return Y&&(Y=(0,p.normalizeId)(Y),delete this.schemas[Y],delete this.refs[Y]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(z){for(const K of z)this.addKeyword(K);return this}addKeyword(z,K){let Y;if(typeof z=="string")Y=z,typeof K=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),K.keyword=Y);else if(typeof z=="object"&&K===void 0){if(K=z,Y=K.keyword,Array.isArray(Y)&&!Y.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(J.call(this,Y,K),!K)return(0,v.eachItem)(Y,H=>ne.call(this,H)),this;se.call(this,K);const N={...K,type:(0,m.getJSONTypes)(K.type),schemaType:(0,m.getJSONTypes)(K.schemaType)};return(0,v.eachItem)(Y,N.type.length===0?H=>ne.call(this,H,N):H=>N.type.forEach(te=>ne.call(this,H,N,te))),this}getKeyword(z){const K=this.RULES.all[z];return typeof K=="object"?K.definition:!!K}removeKeyword(z){const{RULES:K}=this;delete K.keywords[z],delete K.all[z];for(const Y of K.rules){const N=Y.rules.findIndex(H=>H.keyword===z);N>=0&&Y.rules.splice(N,1)}return this}addFormat(z,K){return typeof K=="string"&&(K=new RegExp(K)),this.formats[z]=K,this}errorsText(z=this.errors,{separator:K=", ",dataVar:Y="data"}={}){return!z||z.length===0?"No errors":z.map(N=>`${Y}${N.instancePath} ${N.message}`).reduce((N,H)=>N+K+H)}$dataMetaSchema(z,K){const Y=this.RULES.all;z=JSON.parse(JSON.stringify(z));for(const N of K){const H=N.split("/").slice(1);let te=z;for(const me of H)te=te[me];for(const me in Y){const ie=Y[me];if(typeof ie!="object")continue;const{$data:x}=ie.definition,B=te[me];x&&B&&(te[me]=de(B))}}return z}_removeAllSchemas(z,K){for(const Y in z){const N=z[Y];(!K||K.test(Y))&&(typeof N=="string"?delete z[Y]:N&&!N.meta&&(this._cache.delete(N.schema),delete z[Y]))}}_addSchema(z,K,Y,N=this.opts.validateSchema,H=this.opts.addUsedSchema){let te;const{schemaId:me}=this.opts;if(typeof z=="object")te=z[me];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof z!="boolean")throw new Error("schema must be object or boolean")}let ie=this._cache.get(z);if(ie!==void 0)return ie;Y=(0,p.normalizeId)(te||Y);const x=p.getSchemaRefs.call(this,z,Y);return ie=new c.SchemaEnv({schema:z,schemaId:me,meta:K,baseId:Y,localRefs:x}),this._cache.set(ie.schema,ie),H&&!Y.startsWith("#")&&(Y&&this._checkUnique(Y),this.refs[Y]=ie),N&&this.validateSchema(z,!0),ie}_checkUnique(z){if(this.schemas[z]||this.refs[z])throw new Error(`schema with key or id "${z}" already exists`)}_compileSchemaEnv(z){if(z.meta?this._compileMetaSchema(z):c.compileSchema.call(this,z),!z.validate)throw new Error("ajv implementation error");return z.validate}_compileMetaSchema(z){const K=this.opts;this.opts=this._metaOpts;try{c.compileSchema.call(this,z)}finally{this.opts=K}}}_.ValidationError=l.default,_.MissingRefError=s.default,n.default=_;function O(R,z,K,Y="error"){for(const N in R){const H=N;H in z&&this.logger[Y](`${K}: option ${N}. ${R[H]}`)}}function b(R){return R=(0,p.normalizeId)(R),this.schemas[R]||this.refs[R]}function T(){const R=this.opts.schemas;if(R)if(Array.isArray(R))this.addSchema(R);else for(const z in R)this.addSchema(R[z],z)}function $(){for(const R in this.opts.formats){const z=this.opts.formats[R];z&&this.addFormat(R,z)}}function M(R){if(Array.isArray(R)){this.addVocabulary(R);return}this.logger.warn("keywords option as map is deprecated, pass array");for(const z in R){const K=R[z];K.keyword||(K.keyword=z),this.addKeyword(K)}}function j(){const R={...this.opts};for(const z of U)delete R[z];return R}const G={log(){},warn(){},error(){}};function X(R){if(R===!1)return G;if(R===void 0)return console;if(R.log&&R.warn&&R.error)return R;throw new Error("logger must implement log, warn and error methods")}const W=/^[a-z_$][a-z0-9_$:-]*$/i;function J(R,z){const{RULES:K}=this;if((0,v.eachItem)(R,Y=>{if(K.keywords[Y])throw new Error(`Keyword ${Y} is already defined`);if(!W.test(Y))throw new Error(`Keyword ${Y} has invalid name`)}),!!z&&z.$data&&!("code"in z||"validate"in z))throw new Error('$data keyword must have "code" or "validate" function')}function ne(R,z,K){var Y;const N=z==null?void 0:z.post;if(K&&N)throw new Error('keyword with "post" flag cannot have "type"');const{RULES:H}=this;let te=N?H.post:H.rules.find(({type:ie})=>ie===K);if(te||(te={type:K,rules:[]},H.rules.push(te)),H.keywords[R]=!0,!z)return;const me={keyword:R,definition:{...z,type:(0,m.getJSONTypes)(z.type),schemaType:(0,m.getJSONTypes)(z.schemaType)}};z.before?P.call(this,te,me,z.before):te.rules.push(me),H.all[R]=me,(Y=z.implements)===null||Y===void 0||Y.forEach(ie=>this.addKeyword(ie))}function P(R,z,K){const Y=R.rules.findIndex(N=>N.keyword===K);Y>=0?R.rules.splice(Y,0,z):(R.rules.push(z),this.logger.warn(`rule ${K} is not defined`))}function se(R){let{metaSchema:z}=R;z!==void 0&&(R.$data&&this.opts.$data&&(z=de(z)),R.validateSchema=this.compile(z,!0))}const re={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function de(R){return{anyOf:[R,re]}}}(Pf)),Pf}var Su={},wu={},Au={},Jg;function R_(){if(Jg)return Au;Jg=1,Object.defineProperty(Au,"__esModule",{value:!0});const n={keyword:"id",code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID')}};return Au.default=n,Au}var mr={},Wg;function N_(){if(Wg)return mr;Wg=1,Object.defineProperty(mr,"__esModule",{value:!0}),mr.callRef=mr.getValidate=void 0;const n=$s(),i=dn(),u=Ce(),l=_r(),s=md(),o=He(),c={keyword:"$ref",schemaType:"string",code(m){const{gen:v,schema:S,it:q}=m,{baseId:C,schemaEnv:U,validateName:D,opts:y,self:A}=q,{root:g}=U;if((S==="#"||S==="#/")&&C===g.baseId)return _();const E=s.resolveRef.call(A,g,C,S);if(E===void 0)throw new n.default(q.opts.uriResolver,C,S);if(E instanceof s.SchemaEnv)return O(E);return b(E);function _(){if(U===g)return p(m,D,U,U.$async);const T=v.scopeValue("root",{ref:g});return p(m,(0,u._)`${T}.validate`,g,g.$async)}function O(T){const $=d(m,T);p(m,$,T,T.$async)}function b(T){const $=v.scopeValue("schema",y.code.source===!0?{ref:T,code:(0,u.stringify)(T)}:{ref:T}),M=v.name("valid"),j=m.subschema({schema:T,dataTypes:[],schemaPath:u.nil,topSchemaRef:$,errSchemaPath:S},M);m.mergeEvaluated(j),m.ok(M)}}};function d(m,v){const{gen:S}=m;return v.validate?S.scopeValue("validate",{ref:v.validate}):(0,u._)`${S.scopeValue("wrapper",{ref:v})}.validate`}mr.getValidate=d;function p(m,v,S,q){const{gen:C,it:U}=m,{allErrors:D,schemaEnv:y,opts:A}=U,g=A.passContext?l.default.this:u.nil;q?E():_();function E(){if(!y.$async)throw new Error("async schema referenced by sync schema");const T=C.let("valid");C.try(()=>{C.code((0,u._)`await ${(0,i.callValidateCode)(m,v,g)}`),b(v),D||C.assign(T,!0)},$=>{C.if((0,u._)`!(${$} instanceof ${U.ValidationError})`,()=>C.throw($)),O($),D||C.assign(T,!1)}),m.ok(T)}function _(){m.result((0,i.callValidateCode)(m,v,g),()=>b(v),()=>O(v))}function O(T){const $=(0,u._)`${T}.errors`;C.assign(l.default.vErrors,(0,u._)`${l.default.vErrors} === null ? ${$} : ${l.default.vErrors}.concat(${$})`),C.assign(l.default.errors,(0,u._)`${l.default.vErrors}.length`)}function b(T){var $;if(!U.opts.unevaluated)return;const M=($=S==null?void 0:S.validate)===null||$===void 0?void 0:$.evaluated;if(U.props!==!0)if(M&&!M.dynamicProps)M.props!==void 0&&(U.props=o.mergeEvaluated.props(C,M.props,U.props));else{const j=C.var("props",(0,u._)`${T}.evaluated.props`);U.props=o.mergeEvaluated.props(C,j,U.props,u.Name)}if(U.items!==!0)if(M&&!M.dynamicItems)M.items!==void 0&&(U.items=o.mergeEvaluated.items(C,M.items,U.items));else{const j=C.var("items",(0,u._)`${T}.evaluated.items`);U.items=o.mergeEvaluated.items(C,j,U.items,u.Name)}}}return mr.callRef=p,mr.default=c,mr}var ey;function j_(){if(ey)return wu;ey=1,Object.defineProperty(wu,"__esModule",{value:!0});const n=R_(),i=N_(),u=["$schema","$id","$defs","$vocabulary",{keyword:"$comment"},"definitions",n.default,i.default];return wu.default=u,wu}var $u={},Ou={},ty;function D_(){if(ty)return Ou;ty=1,Object.defineProperty(Ou,"__esModule",{value:!0});const n=Ce(),i=n.operators,u={maximum:{okStr:"<=",ok:i.LTE,fail:i.GT},minimum:{okStr:">=",ok:i.GTE,fail:i.LT},exclusiveMaximum:{okStr:"<",ok:i.LT,fail:i.GTE},exclusiveMinimum:{okStr:">",ok:i.GT,fail:i.LTE}},l={message:({keyword:o,schemaCode:c})=>(0,n.str)`must be ${u[o].okStr} ${c}`,params:({keyword:o,schemaCode:c})=>(0,n._)`{comparison: ${u[o].okStr}, limit: ${c}}`},s={keyword:Object.keys(u),type:"number",schemaType:"number",$data:!0,error:l,code(o){const{keyword:c,data:d,schemaCode:p}=o;o.fail$data((0,n._)`${d} ${u[c].fail} ${p} || isNaN(${d})`)}};return Ou.default=s,Ou}var Tu={},ny;function M_(){if(ny)return Tu;ny=1,Object.defineProperty(Tu,"__esModule",{value:!0});const n=Ce(),u={keyword:"multipleOf",type:"number",schemaType:"number",$data:!0,error:{message:({schemaCode:l})=>(0,n.str)`must be multiple of ${l}`,params:({schemaCode:l})=>(0,n._)`{multipleOf: ${l}}`},code(l){const{gen:s,data:o,schemaCode:c,it:d}=l,p=d.opts.multipleOfPrecision,m=s.let("res"),v=p?(0,n._)`Math.abs(Math.round(${m}) - ${m}) > 1e-${p}`:(0,n._)`${m} !== parseInt(${m})`;l.fail$data((0,n._)`(${c} === 0 || (${m} = ${o}/${c}, ${v}))`)}};return Tu.default=u,Tu}var Ru={},Nu={},ry;function C_(){if(ry)return Nu;ry=1,Object.defineProperty(Nu,"__esModule",{value:!0});function n(i){const u=i.length;let l=0,s=0,o;for(;s=55296&&o<=56319&&s(0,n._)`{limit: ${o}}`},code(o){const{keyword:c,data:d,schemaCode:p,it:m}=o,v=c==="maxLength"?n.operators.GT:n.operators.LT,S=m.opts.unicode===!1?(0,n._)`${d}.length`:(0,n._)`${(0,i.useFunc)(o.gen,u.default)}(${d})`;o.fail$data((0,n._)`${S} ${v} ${p}`)}};return Ru.default=s,Ru}var ju={},ay;function L_(){if(ay)return ju;ay=1,Object.defineProperty(ju,"__esModule",{value:!0});const n=dn(),i=Ce(),l={keyword:"pattern",type:"string",schemaType:"string",$data:!0,error:{message:({schemaCode:s})=>(0,i.str)`must match pattern "${s}"`,params:({schemaCode:s})=>(0,i._)`{pattern: ${s}}`},code(s){const{data:o,$data:c,schema:d,schemaCode:p,it:m}=s,v=m.opts.unicodeRegExp?"u":"",S=c?(0,i._)`(new RegExp(${p}, ${v}))`:(0,n.usePattern)(s,d);s.fail$data((0,i._)`!${S}.test(${o})`)}};return ju.default=l,ju}var Du={},ly;function q_(){if(ly)return Du;ly=1,Object.defineProperty(Du,"__esModule",{value:!0});const n=Ce(),u={keyword:["maxProperties","minProperties"],type:"object",schemaType:"number",$data:!0,error:{message({keyword:l,schemaCode:s}){const o=l==="maxProperties"?"more":"fewer";return(0,n.str)`must NOT have ${o} than ${s} properties`},params:({schemaCode:l})=>(0,n._)`{limit: ${l}}`},code(l){const{keyword:s,data:o,schemaCode:c}=l,d=s==="maxProperties"?n.operators.GT:n.operators.LT;l.fail$data((0,n._)`Object.keys(${o}).length ${d} ${c}`)}};return Du.default=u,Du}var Mu={},uy;function U_(){if(uy)return Mu;uy=1,Object.defineProperty(Mu,"__esModule",{value:!0});const n=dn(),i=Ce(),u=He(),s={keyword:"required",type:"object",schemaType:"array",$data:!0,error:{message:({params:{missingProperty:o}})=>(0,i.str)`must have required property '${o}'`,params:({params:{missingProperty:o}})=>(0,i._)`{missingProperty: ${o}}`},code(o){const{gen:c,schema:d,schemaCode:p,data:m,$data:v,it:S}=o,{opts:q}=S;if(!v&&d.length===0)return;const C=d.length>=q.loopRequired;if(S.allErrors?U():D(),q.strictRequired){const g=o.parentSchema.properties,{definedProperties:E}=o.it;for(const _ of d)if((g==null?void 0:g[_])===void 0&&!E.has(_)){const O=S.schemaEnv.baseId+S.errSchemaPath,b=`required property "${_}" is not defined at "${O}" (strictRequired)`;(0,u.checkStrictMode)(S,b,S.opts.strictRequired)}}function U(){if(C||v)o.block$data(i.nil,y);else for(const g of d)(0,n.checkReportMissingProp)(o,g)}function D(){const g=c.let("missing");if(C||v){const E=c.let("valid",!0);o.block$data(E,()=>A(g,E)),o.ok(E)}else c.if((0,n.checkMissingProp)(o,d,g)),(0,n.reportMissingProp)(o,g),c.else()}function y(){c.forOf("prop",p,g=>{o.setParams({missingProperty:g}),c.if((0,n.noPropertyInData)(c,m,g,q.ownProperties),()=>o.error())})}function A(g,E){o.setParams({missingProperty:g}),c.forOf(g,p,()=>{c.assign(E,(0,n.propertyInData)(c,m,g,q.ownProperties)),c.if((0,i.not)(E),()=>{o.error(),c.break()})},i.nil)}}};return Mu.default=s,Mu}var Cu={},sy;function z_(){if(sy)return Cu;sy=1,Object.defineProperty(Cu,"__esModule",{value:!0});const n=Ce(),u={keyword:["maxItems","minItems"],type:"array",schemaType:"number",$data:!0,error:{message({keyword:l,schemaCode:s}){const o=l==="maxItems"?"more":"fewer";return(0,n.str)`must NOT have ${o} than ${s} items`},params:({schemaCode:l})=>(0,n._)`{limit: ${l}}`},code(l){const{keyword:s,data:o,schemaCode:c}=l,d=s==="maxItems"?n.operators.GT:n.operators.LT;l.fail$data((0,n._)`${o}.length ${d} ${c}`)}};return Cu.default=u,Cu}var xu={},Lu={},oy;function gd(){if(oy)return Lu;oy=1,Object.defineProperty(Lu,"__esModule",{value:!0});const n=pv();return n.code='require("ajv/dist/runtime/equal").default',Lu.default=n,Lu}var fy;function I_(){if(fy)return xu;fy=1,Object.defineProperty(xu,"__esModule",{value:!0});const n=os(),i=Ce(),u=He(),l=gd(),o={keyword:"uniqueItems",type:"array",schemaType:"boolean",$data:!0,error:{message:({params:{i:c,j:d}})=>(0,i.str)`must NOT have duplicate items (items ## ${d} and ${c} are identical)`,params:({params:{i:c,j:d}})=>(0,i._)`{i: ${c}, j: ${d}}`},code(c){const{gen:d,data:p,$data:m,schema:v,parentSchema:S,schemaCode:q,it:C}=c;if(!m&&!v)return;const U=d.let("valid"),D=S.items?(0,n.getSchemaTypes)(S.items):[];c.block$data(U,y,(0,i._)`${q} === false`),c.ok(U);function y(){const _=d.let("i",(0,i._)`${p}.length`),O=d.let("j");c.setParams({i:_,j:O}),d.assign(U,!0),d.if((0,i._)`${_} > 1`,()=>(A()?g:E)(_,O))}function A(){return D.length>0&&!D.some(_=>_==="object"||_==="array")}function g(_,O){const b=d.name("item"),T=(0,n.checkDataTypes)(D,b,C.opts.strictNumbers,n.DataType.Wrong),$=d.const("indices",(0,i._)`{}`);d.for((0,i._)`;${_}--;`,()=>{d.let(b,(0,i._)`${p}[${_}]`),d.if(T,(0,i._)`continue`),D.length>1&&d.if((0,i._)`typeof ${b} == "string"`,(0,i._)`${b} += "_"`),d.if((0,i._)`typeof ${$}[${b}] == "number"`,()=>{d.assign(O,(0,i._)`${$}[${b}]`),c.error(),d.assign(U,!1).break()}).code((0,i._)`${$}[${b}] = ${_}`)})}function E(_,O){const b=(0,u.useFunc)(d,l.default),T=d.name("outer");d.label(T).for((0,i._)`;${_}--;`,()=>d.for((0,i._)`${O} = ${_}; ${O}--;`,()=>d.if((0,i._)`${b}(${p}[${_}], ${p}[${O}])`,()=>{c.error(),d.assign(U,!1).break(T)})))}}};return xu.default=o,xu}var qu={},cy;function B_(){if(cy)return qu;cy=1,Object.defineProperty(qu,"__esModule",{value:!0});const n=Ce(),i=He(),u=gd(),s={keyword:"const",$data:!0,error:{message:"must be equal to constant",params:({schemaCode:o})=>(0,n._)`{allowedValue: ${o}}`},code(o){const{gen:c,data:d,$data:p,schemaCode:m,schema:v}=o;p||v&&typeof v=="object"?o.fail$data((0,n._)`!${(0,i.useFunc)(c,u.default)}(${d}, ${m})`):o.fail((0,n._)`${v} !== ${d}`)}};return qu.default=s,qu}var Uu={},dy;function H_(){if(dy)return Uu;dy=1,Object.defineProperty(Uu,"__esModule",{value:!0});const n=Ce(),i=He(),u=gd(),s={keyword:"enum",schemaType:"array",$data:!0,error:{message:"must be equal to one of the allowed values",params:({schemaCode:o})=>(0,n._)`{allowedValues: ${o}}`},code(o){const{gen:c,data:d,$data:p,schema:m,schemaCode:v,it:S}=o;if(!p&&m.length===0)throw new Error("enum must have non-empty array");const q=m.length>=S.opts.loopEnum;let C;const U=()=>C??(C=(0,i.useFunc)(c,u.default));let D;if(q||p)D=c.let("valid"),o.block$data(D,y);else{if(!Array.isArray(m))throw new Error("ajv implementation error");const g=c.const("vSchema",v);D=(0,n.or)(...m.map((E,_)=>A(g,_)))}o.pass(D);function y(){c.assign(D,!1),c.forOf("v",v,g=>c.if((0,n._)`${U()}(${d}, ${g})`,()=>c.assign(D,!0).break()))}function A(g,E){const _=m[E];return typeof _=="object"&&_!==null?(0,n._)`${U()}(${d}, ${g}[${E}])`:(0,n._)`${d} === ${_}`}}};return Uu.default=s,Uu}var hy;function V_(){if(hy)return $u;hy=1,Object.defineProperty($u,"__esModule",{value:!0});const n=D_(),i=M_(),u=x_(),l=L_(),s=q_(),o=U_(),c=z_(),d=I_(),p=B_(),m=H_(),v=[n.default,i.default,u.default,l.default,s.default,o.default,c.default,d.default,{keyword:"type",schemaType:["string","array"]},{keyword:"nullable",schemaType:"boolean"},p.default,m.default];return $u.default=v,$u}var zu={},Ci={},py;function mv(){if(py)return Ci;py=1,Object.defineProperty(Ci,"__esModule",{value:!0}),Ci.validateAdditionalItems=void 0;const n=Ce(),i=He(),l={keyword:"additionalItems",type:"array",schemaType:["boolean","object"],before:"uniqueItems",error:{message:({params:{len:o}})=>(0,n.str)`must NOT have more than ${o} items`,params:({params:{len:o}})=>(0,n._)`{limit: ${o}}`},code(o){const{parentSchema:c,it:d}=o,{items:p}=c;if(!Array.isArray(p)){(0,i.checkStrictMode)(d,'"additionalItems" is ignored when "items" is not an array of schemas');return}s(o,p)}};function s(o,c){const{gen:d,schema:p,data:m,keyword:v,it:S}=o;S.items=!0;const q=d.const("len",(0,n._)`${m}.length`);if(p===!1)o.setParams({len:c.length}),o.pass((0,n._)`${q} <= ${c.length}`);else if(typeof p=="object"&&!(0,i.alwaysValidSchema)(S,p)){const U=d.var("valid",(0,n._)`${q} <= ${c.length}`);d.if((0,n.not)(U),()=>C(U)),o.ok(U)}function C(U){d.forRange("i",c.length,q,D=>{o.subschema({keyword:v,dataProp:D,dataPropType:i.Type.Num},U),S.allErrors||d.if((0,n.not)(U),()=>d.break())})}}return Ci.validateAdditionalItems=s,Ci.default=l,Ci}var Iu={},xi={},my;function gv(){if(my)return xi;my=1,Object.defineProperty(xi,"__esModule",{value:!0}),xi.validateTuple=void 0;const n=Ce(),i=He(),u=dn(),l={keyword:"items",type:"array",schemaType:["object","array","boolean"],before:"uniqueItems",code(o){const{schema:c,it:d}=o;if(Array.isArray(c))return s(o,"additionalItems",c);d.items=!0,!(0,i.alwaysValidSchema)(d,c)&&o.ok((0,u.validateArray)(o))}};function s(o,c,d=o.schema){const{gen:p,parentSchema:m,data:v,keyword:S,it:q}=o;D(m),q.opts.unevaluated&&d.length&&q.items!==!0&&(q.items=i.mergeEvaluated.items(p,d.length,q.items));const C=p.name("valid"),U=p.const("len",(0,n._)`${v}.length`);d.forEach((y,A)=>{(0,i.alwaysValidSchema)(q,y)||(p.if((0,n._)`${U} > ${A}`,()=>o.subschema({keyword:S,schemaProp:A,dataProp:A},C)),o.ok(C))});function D(y){const{opts:A,errSchemaPath:g}=q,E=d.length,_=E===y.minItems&&(E===y.maxItems||y[c]===!1);if(A.strictTuples&&!_){const O=`"${S}" is ${E}-tuple, but minItems or maxItems/${c} are not specified or different at path "${g}"`;(0,i.checkStrictMode)(q,O,A.strictTuples)}}}return xi.validateTuple=s,xi.default=l,xi}var gy;function k_(){if(gy)return Iu;gy=1,Object.defineProperty(Iu,"__esModule",{value:!0});const n=gv(),i={keyword:"prefixItems",type:"array",schemaType:["array"],before:"uniqueItems",code:u=>(0,n.validateTuple)(u,"items")};return Iu.default=i,Iu}var Bu={},yy;function G_(){if(yy)return Bu;yy=1,Object.defineProperty(Bu,"__esModule",{value:!0});const n=Ce(),i=He(),u=dn(),l=mv(),o={keyword:"items",type:"array",schemaType:["object","boolean"],before:"uniqueItems",error:{message:({params:{len:c}})=>(0,n.str)`must NOT have more than ${c} items`,params:({params:{len:c}})=>(0,n._)`{limit: ${c}}`},code(c){const{schema:d,parentSchema:p,it:m}=c,{prefixItems:v}=p;m.items=!0,!(0,i.alwaysValidSchema)(m,d)&&(v?(0,l.validateAdditionalItems)(c,v):c.ok((0,u.validateArray)(c)))}};return Bu.default=o,Bu}var Hu={},vy;function Y_(){if(vy)return Hu;vy=1,Object.defineProperty(Hu,"__esModule",{value:!0});const n=Ce(),i=He(),l={keyword:"contains",type:"array",schemaType:["object","boolean"],before:"uniqueItems",trackErrors:!0,error:{message:({params:{min:s,max:o}})=>o===void 0?(0,n.str)`must contain at least ${s} valid item(s)`:(0,n.str)`must contain at least ${s} and no more than ${o} valid item(s)`,params:({params:{min:s,max:o}})=>o===void 0?(0,n._)`{minContains: ${s}}`:(0,n._)`{minContains: ${s}, maxContains: ${o}}`},code(s){const{gen:o,schema:c,parentSchema:d,data:p,it:m}=s;let v,S;const{minContains:q,maxContains:C}=d;m.opts.next?(v=q===void 0?1:q,S=C):v=1;const U=o.const("len",(0,n._)`${p}.length`);if(s.setParams({min:v,max:S}),S===void 0&&v===0){(0,i.checkStrictMode)(m,'"minContains" == 0 without "maxContains": "contains" keyword ignored');return}if(S!==void 0&&v>S){(0,i.checkStrictMode)(m,'"minContains" > "maxContains" is always invalid'),s.fail();return}if((0,i.alwaysValidSchema)(m,c)){let E=(0,n._)`${U} >= ${v}`;S!==void 0&&(E=(0,n._)`${E} && ${U} <= ${S}`),s.pass(E);return}m.items=!0;const D=o.name("valid");S===void 0&&v===1?A(D,()=>o.if(D,()=>o.break())):v===0?(o.let(D,!0),S!==void 0&&o.if((0,n._)`${p}.length > 0`,y)):(o.let(D,!1),y()),s.result(D,()=>s.reset());function y(){const E=o.name("_valid"),_=o.let("count",0);A(E,()=>o.if(E,()=>g(_)))}function A(E,_){o.forRange("i",0,U,O=>{s.subschema({keyword:"contains",dataProp:O,dataPropType:i.Type.Num,compositeRule:!0},E),_()})}function g(E){o.code((0,n._)`${E}++`),S===void 0?o.if((0,n._)`${E} >= ${v}`,()=>o.assign(D,!0).break()):(o.if((0,n._)`${E} > ${S}`,()=>o.assign(D,!1).break()),v===1?o.assign(D,!0):o.if((0,n._)`${E} >= ${v}`,()=>o.assign(D,!0)))}}};return Hu.default=l,Hu}var nc={},by;function P_(){return by||(by=1,function(n){Object.defineProperty(n,"__esModule",{value:!0}),n.validateSchemaDeps=n.validatePropertyDeps=n.error=void 0;const i=Ce(),u=He(),l=dn();n.error={message:({params:{property:p,depsCount:m,deps:v}})=>{const S=m===1?"property":"properties";return(0,i.str)`must have ${S} ${v} when property ${p} is present`},params:({params:{property:p,depsCount:m,deps:v,missingProperty:S}})=>(0,i._)`{property: ${p}, + missingProperty: ${S}, + depsCount: ${m}, + deps: ${v}}`};const s={keyword:"dependencies",type:"object",schemaType:"object",error:n.error,code(p){const[m,v]=o(p);c(p,m),d(p,v)}};function o({schema:p}){const m={},v={};for(const S in p){if(S==="__proto__")continue;const q=Array.isArray(p[S])?m:v;q[S]=p[S]}return[m,v]}function c(p,m=p.schema){const{gen:v,data:S,it:q}=p;if(Object.keys(m).length===0)return;const C=v.let("missing");for(const U in m){const D=m[U];if(D.length===0)continue;const y=(0,l.propertyInData)(v,S,U,q.opts.ownProperties);p.setParams({property:U,depsCount:D.length,deps:D.join(", ")}),q.allErrors?v.if(y,()=>{for(const A of D)(0,l.checkReportMissingProp)(p,A)}):(v.if((0,i._)`${y} && (${(0,l.checkMissingProp)(p,D,C)})`),(0,l.reportMissingProp)(p,C),v.else())}}n.validatePropertyDeps=c;function d(p,m=p.schema){const{gen:v,data:S,keyword:q,it:C}=p,U=v.name("valid");for(const D in m)(0,u.alwaysValidSchema)(C,m[D])||(v.if((0,l.propertyInData)(v,S,D,C.opts.ownProperties),()=>{const y=p.subschema({keyword:q,schemaProp:D},U);p.mergeValidEvaluated(y,U)},()=>v.var(U,!0)),p.ok(U))}n.validateSchemaDeps=d,n.default=s}(nc)),nc}var Vu={},Ey;function K_(){if(Ey)return Vu;Ey=1,Object.defineProperty(Vu,"__esModule",{value:!0});const n=Ce(),i=He(),l={keyword:"propertyNames",type:"object",schemaType:["object","boolean"],error:{message:"property name must be valid",params:({params:s})=>(0,n._)`{propertyName: ${s.propertyName}}`},code(s){const{gen:o,schema:c,data:d,it:p}=s;if((0,i.alwaysValidSchema)(p,c))return;const m=o.name("valid");o.forIn("key",d,v=>{s.setParams({propertyName:v}),s.subschema({keyword:"propertyNames",data:v,dataTypes:["string"],propertyName:v,compositeRule:!0},m),o.if((0,n.not)(m),()=>{s.error(!0),p.allErrors||o.break()})}),s.ok(m)}};return Vu.default=l,Vu}var ku={},_y;function yv(){if(_y)return ku;_y=1,Object.defineProperty(ku,"__esModule",{value:!0});const n=dn(),i=Ce(),u=_r(),l=He(),o={keyword:"additionalProperties",type:["object"],schemaType:["boolean","object"],allowUndefined:!0,trackErrors:!0,error:{message:"must NOT have additional properties",params:({params:c})=>(0,i._)`{additionalProperty: ${c.additionalProperty}}`},code(c){const{gen:d,schema:p,parentSchema:m,data:v,errsCount:S,it:q}=c;if(!S)throw new Error("ajv implementation error");const{allErrors:C,opts:U}=q;if(q.props=!0,U.removeAdditional!=="all"&&(0,l.alwaysValidSchema)(q,p))return;const D=(0,n.allSchemaProperties)(m.properties),y=(0,n.allSchemaProperties)(m.patternProperties);A(),c.ok((0,i._)`${S} === ${u.default.errors}`);function A(){d.forIn("key",v,b=>{!D.length&&!y.length?_(b):d.if(g(b),()=>_(b))})}function g(b){let T;if(D.length>8){const $=(0,l.schemaRefOrVal)(q,m.properties,"properties");T=(0,n.isOwnProperty)(d,$,b)}else D.length?T=(0,i.or)(...D.map($=>(0,i._)`${b} === ${$}`)):T=i.nil;return y.length&&(T=(0,i.or)(T,...y.map($=>(0,i._)`${(0,n.usePattern)(c,$)}.test(${b})`))),(0,i.not)(T)}function E(b){d.code((0,i._)`delete ${v}[${b}]`)}function _(b){if(U.removeAdditional==="all"||U.removeAdditional&&p===!1){E(b);return}if(p===!1){c.setParams({additionalProperty:b}),c.error(),C||d.break();return}if(typeof p=="object"&&!(0,l.alwaysValidSchema)(q,p)){const T=d.name("valid");U.removeAdditional==="failing"?(O(b,T,!1),d.if((0,i.not)(T),()=>{c.reset(),E(b)})):(O(b,T),C||d.if((0,i.not)(T),()=>d.break()))}}function O(b,T,$){const M={keyword:"additionalProperties",dataProp:b,dataPropType:l.Type.Str};$===!1&&Object.assign(M,{compositeRule:!0,createErrors:!1,allErrors:!1}),c.subschema(M,T)}}};return ku.default=o,ku}var Gu={},Sy;function F_(){if(Sy)return Gu;Sy=1,Object.defineProperty(Gu,"__esModule",{value:!0});const n=As(),i=dn(),u=He(),l=yv(),s={keyword:"properties",type:"object",schemaType:"object",code(o){const{gen:c,schema:d,parentSchema:p,data:m,it:v}=o;v.opts.removeAdditional==="all"&&p.additionalProperties===void 0&&l.default.code(new n.KeywordCxt(v,l.default,"additionalProperties"));const S=(0,i.allSchemaProperties)(d);for(const y of S)v.definedProperties.add(y);v.opts.unevaluated&&S.length&&v.props!==!0&&(v.props=u.mergeEvaluated.props(c,(0,u.toHash)(S),v.props));const q=S.filter(y=>!(0,u.alwaysValidSchema)(v,d[y]));if(q.length===0)return;const C=c.name("valid");for(const y of q)U(y)?D(y):(c.if((0,i.propertyInData)(c,m,y,v.opts.ownProperties)),D(y),v.allErrors||c.else().var(C,!0),c.endIf()),o.it.definedProperties.add(y),o.ok(C);function U(y){return v.opts.useDefaults&&!v.compositeRule&&d[y].default!==void 0}function D(y){o.subschema({keyword:"properties",schemaProp:y,dataProp:y},C)}}};return Gu.default=s,Gu}var Yu={},wy;function X_(){if(wy)return Yu;wy=1,Object.defineProperty(Yu,"__esModule",{value:!0});const n=dn(),i=Ce(),u=He(),l=He(),s={keyword:"patternProperties",type:"object",schemaType:"object",code(o){const{gen:c,schema:d,data:p,parentSchema:m,it:v}=o,{opts:S}=v,q=(0,n.allSchemaProperties)(d),C=q.filter(_=>(0,u.alwaysValidSchema)(v,d[_]));if(q.length===0||C.length===q.length&&(!v.opts.unevaluated||v.props===!0))return;const U=S.strictSchema&&!S.allowMatchingProperties&&m.properties,D=c.name("valid");v.props!==!0&&!(v.props instanceof i.Name)&&(v.props=(0,l.evaluatedPropsToName)(c,v.props));const{props:y}=v;A();function A(){for(const _ of q)U&&g(_),v.allErrors?E(_):(c.var(D,!0),E(_),c.if(D))}function g(_){for(const O in U)new RegExp(_).test(O)&&(0,u.checkStrictMode)(v,`property ${O} matches pattern ${_} (use allowMatchingProperties)`)}function E(_){c.forIn("key",p,O=>{c.if((0,i._)`${(0,n.usePattern)(o,_)}.test(${O})`,()=>{const b=C.includes(_);b||o.subschema({keyword:"patternProperties",schemaProp:_,dataProp:O,dataPropType:l.Type.Str},D),v.opts.unevaluated&&y!==!0?c.assign((0,i._)`${y}[${O}]`,!0):!b&&!v.allErrors&&c.if((0,i.not)(D),()=>c.break())})})}}};return Yu.default=s,Yu}var Pu={},Ay;function Q_(){if(Ay)return Pu;Ay=1,Object.defineProperty(Pu,"__esModule",{value:!0});const n=He(),i={keyword:"not",schemaType:["object","boolean"],trackErrors:!0,code(u){const{gen:l,schema:s,it:o}=u;if((0,n.alwaysValidSchema)(o,s)){u.fail();return}const c=l.name("valid");u.subschema({keyword:"not",compositeRule:!0,createErrors:!1,allErrors:!1},c),u.failResult(c,()=>u.reset(),()=>u.error())},error:{message:"must NOT be valid"}};return Pu.default=i,Pu}var Ku={},$y;function Z_(){if($y)return Ku;$y=1,Object.defineProperty(Ku,"__esModule",{value:!0});const i={keyword:"anyOf",schemaType:"array",trackErrors:!0,code:dn().validateUnion,error:{message:"must match a schema in anyOf"}};return Ku.default=i,Ku}var Fu={},Oy;function J_(){if(Oy)return Fu;Oy=1,Object.defineProperty(Fu,"__esModule",{value:!0});const n=Ce(),i=He(),l={keyword:"oneOf",schemaType:"array",trackErrors:!0,error:{message:"must match exactly one schema in oneOf",params:({params:s})=>(0,n._)`{passingSchemas: ${s.passing}}`},code(s){const{gen:o,schema:c,parentSchema:d,it:p}=s;if(!Array.isArray(c))throw new Error("ajv implementation error");if(p.opts.discriminator&&d.discriminator)return;const m=c,v=o.let("valid",!1),S=o.let("passing",null),q=o.name("_valid");s.setParams({passing:S}),o.block(C),s.result(v,()=>s.reset(),()=>s.error(!0));function C(){m.forEach((U,D)=>{let y;(0,i.alwaysValidSchema)(p,U)?o.var(q,!0):y=s.subschema({keyword:"oneOf",schemaProp:D,compositeRule:!0},q),D>0&&o.if((0,n._)`${q} && ${v}`).assign(v,!1).assign(S,(0,n._)`[${S}, ${D}]`).else(),o.if(q,()=>{o.assign(v,!0),o.assign(S,D),y&&s.mergeEvaluated(y,n.Name)})})}}};return Fu.default=l,Fu}var Xu={},Ty;function W_(){if(Ty)return Xu;Ty=1,Object.defineProperty(Xu,"__esModule",{value:!0});const n=He(),i={keyword:"allOf",schemaType:"array",code(u){const{gen:l,schema:s,it:o}=u;if(!Array.isArray(s))throw new Error("ajv implementation error");const c=l.name("valid");s.forEach((d,p)=>{if((0,n.alwaysValidSchema)(o,d))return;const m=u.subschema({keyword:"allOf",schemaProp:p},c);u.ok(c),u.mergeEvaluated(m)})}};return Xu.default=i,Xu}var Qu={},Ry;function eS(){if(Ry)return Qu;Ry=1,Object.defineProperty(Qu,"__esModule",{value:!0});const n=Ce(),i=He(),l={keyword:"if",schemaType:["object","boolean"],trackErrors:!0,error:{message:({params:o})=>(0,n.str)`must match "${o.ifClause}" schema`,params:({params:o})=>(0,n._)`{failingKeyword: ${o.ifClause}}`},code(o){const{gen:c,parentSchema:d,it:p}=o;d.then===void 0&&d.else===void 0&&(0,i.checkStrictMode)(p,'"if" without "then" and "else" is ignored');const m=s(p,"then"),v=s(p,"else");if(!m&&!v)return;const S=c.let("valid",!0),q=c.name("_valid");if(C(),o.reset(),m&&v){const D=c.let("ifClause");o.setParams({ifClause:D}),c.if(q,U("then",D),U("else",D))}else m?c.if(q,U("then")):c.if((0,n.not)(q),U("else"));o.pass(S,()=>o.error(!0));function C(){const D=o.subschema({keyword:"if",compositeRule:!0,createErrors:!1,allErrors:!1},q);o.mergeEvaluated(D)}function U(D,y){return()=>{const A=o.subschema({keyword:D},q);c.assign(S,q),o.mergeValidEvaluated(A,S),y?c.assign(y,(0,n._)`${D}`):o.setParams({ifClause:D})}}}};function s(o,c){const d=o.schema[c];return d!==void 0&&!(0,i.alwaysValidSchema)(o,d)}return Qu.default=l,Qu}var Zu={},Ny;function tS(){if(Ny)return Zu;Ny=1,Object.defineProperty(Zu,"__esModule",{value:!0});const n=He(),i={keyword:["then","else"],schemaType:["object","boolean"],code({keyword:u,parentSchema:l,it:s}){l.if===void 0&&(0,n.checkStrictMode)(s,`"${u}" without "if" is ignored`)}};return Zu.default=i,Zu}var jy;function nS(){if(jy)return zu;jy=1,Object.defineProperty(zu,"__esModule",{value:!0});const n=mv(),i=k_(),u=gv(),l=G_(),s=Y_(),o=P_(),c=K_(),d=yv(),p=F_(),m=X_(),v=Q_(),S=Z_(),q=J_(),C=W_(),U=eS(),D=tS();function y(A=!1){const g=[v.default,S.default,q.default,C.default,U.default,D.default,c.default,d.default,o.default,p.default,m.default];return A?g.push(i.default,l.default):g.push(n.default,u.default),g.push(s.default),g}return zu.default=y,zu}var Ju={},Wu={},Dy;function rS(){if(Dy)return Wu;Dy=1,Object.defineProperty(Wu,"__esModule",{value:!0});const n=Ce(),u={keyword:"format",type:["number","string"],schemaType:"string",$data:!0,error:{message:({schemaCode:l})=>(0,n.str)`must match format "${l}"`,params:({schemaCode:l})=>(0,n._)`{format: ${l}}`},code(l,s){const{gen:o,data:c,$data:d,schema:p,schemaCode:m,it:v}=l,{opts:S,errSchemaPath:q,schemaEnv:C,self:U}=v;if(!S.validateFormats)return;d?D():y();function D(){const A=o.scopeValue("formats",{ref:U.formats,code:S.code.formats}),g=o.const("fDef",(0,n._)`${A}[${m}]`),E=o.let("fType"),_=o.let("format");o.if((0,n._)`typeof ${g} == "object" && !(${g} instanceof RegExp)`,()=>o.assign(E,(0,n._)`${g}.type || "string"`).assign(_,(0,n._)`${g}.validate`),()=>o.assign(E,(0,n._)`"string"`).assign(_,g)),l.fail$data((0,n.or)(O(),b()));function O(){return S.strictSchema===!1?n.nil:(0,n._)`${m} && !${_}`}function b(){const T=C.$async?(0,n._)`(${g}.async ? await ${_}(${c}) : ${_}(${c}))`:(0,n._)`${_}(${c})`,$=(0,n._)`(typeof ${_} == "function" ? ${T} : ${_}.test(${c}))`;return(0,n._)`${_} && ${_} !== true && ${E} === ${s} && !${$}`}}function y(){const A=U.formats[p];if(!A){O();return}if(A===!0)return;const[g,E,_]=b(A);g===s&&l.pass(T());function O(){if(S.strictSchema===!1){U.logger.warn($());return}throw new Error($());function $(){return`unknown format "${p}" ignored in schema at path "${q}"`}}function b($){const M=$ instanceof RegExp?(0,n.regexpCode)($):S.code.formats?(0,n._)`${S.code.formats}${(0,n.getProperty)(p)}`:void 0,j=o.scopeValue("formats",{key:p,ref:$,code:M});return typeof $=="object"&&!($ instanceof RegExp)?[$.type||"string",$.validate,(0,n._)`${j}.validate`]:["string",$,j]}function T(){if(typeof A=="object"&&!(A instanceof RegExp)&&A.async){if(!C.$async)throw new Error("async format in sync schema");return(0,n._)`await ${_}(${c})`}return typeof E=="function"?(0,n._)`${_}(${c})`:(0,n._)`${_}.test(${c})`}}}};return Wu.default=u,Wu}var My;function iS(){if(My)return Ju;My=1,Object.defineProperty(Ju,"__esModule",{value:!0});const i=[rS().default];return Ju.default=i,Ju}var Kr={},Cy;function aS(){return Cy||(Cy=1,Object.defineProperty(Kr,"__esModule",{value:!0}),Kr.contentVocabulary=Kr.metadataVocabulary=void 0,Kr.metadataVocabulary=["title","description","default","deprecated","readOnly","writeOnly","examples"],Kr.contentVocabulary=["contentMediaType","contentEncoding","contentSchema"]),Kr}var xy;function lS(){if(xy)return Su;xy=1,Object.defineProperty(Su,"__esModule",{value:!0});const n=j_(),i=V_(),u=nS(),l=iS(),s=aS(),o=[n.default,i.default,(0,u.default)(),l.default,s.metadataVocabulary,s.contentVocabulary];return Su.default=o,Su}var es={},Ga={},Ly;function uS(){if(Ly)return Ga;Ly=1,Object.defineProperty(Ga,"__esModule",{value:!0}),Ga.DiscrError=void 0;var n;return function(i){i.Tag="tag",i.Mapping="mapping"}(n||(Ga.DiscrError=n={})),Ga}var qy;function sS(){if(qy)return es;qy=1,Object.defineProperty(es,"__esModule",{value:!0});const n=Ce(),i=uS(),u=md(),l=$s(),s=He(),c={keyword:"discriminator",type:"object",schemaType:"object",error:{message:({params:{discrError:d,tagName:p}})=>d===i.DiscrError.Tag?`tag "${p}" must be string`:`value of tag "${p}" must be in oneOf`,params:({params:{discrError:d,tag:p,tagName:m}})=>(0,n._)`{error: ${d}, tag: ${m}, tagValue: ${p}}`},code(d){const{gen:p,data:m,schema:v,parentSchema:S,it:q}=d,{oneOf:C}=S;if(!q.opts.discriminator)throw new Error("discriminator: requires discriminator option");const U=v.propertyName;if(typeof U!="string")throw new Error("discriminator: requires propertyName");if(v.mapping)throw new Error("discriminator: mapping is not supported");if(!C)throw new Error("discriminator: requires oneOf keyword");const D=p.let("valid",!1),y=p.const("tag",(0,n._)`${m}${(0,n.getProperty)(U)}`);p.if((0,n._)`typeof ${y} == "string"`,()=>A(),()=>d.error(!1,{discrError:i.DiscrError.Tag,tag:y,tagName:U})),d.ok(D);function A(){const _=E();p.if(!1);for(const O in _)p.elseIf((0,n._)`${y} === ${O}`),p.assign(D,g(_[O]));p.else(),d.error(!1,{discrError:i.DiscrError.Mapping,tag:y,tagName:U}),p.endIf()}function g(_){const O=p.name("valid"),b=d.subschema({keyword:"oneOf",schemaProp:_},O);return d.mergeEvaluated(b,n.Name),O}function E(){var _;const O={},b=$(S);let T=!0;for(let G=0;Gthis.addVocabulary(U)),this.opts.discriminator&&this.addKeyword(s.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;const U=this.opts.$data?this.$dataMetaSchema(o,c):o;this.addMetaSchema(U,d,!1),this.refs["http://json-schema.org/schema"]=d}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(d)?d:void 0)}}i.Ajv=p,n.exports=i=p,n.exports.Ajv=p,Object.defineProperty(i,"__esModule",{value:!0}),i.default=p;var m=As();Object.defineProperty(i,"KeywordCxt",{enumerable:!0,get:function(){return m.KeywordCxt}});var v=Ce();Object.defineProperty(i,"_",{enumerable:!0,get:function(){return v._}}),Object.defineProperty(i,"str",{enumerable:!0,get:function(){return v.str}}),Object.defineProperty(i,"stringify",{enumerable:!0,get:function(){return v.stringify}}),Object.defineProperty(i,"nil",{enumerable:!0,get:function(){return v.nil}}),Object.defineProperty(i,"Name",{enumerable:!0,get:function(){return v.Name}}),Object.defineProperty(i,"CodeGen",{enumerable:!0,get:function(){return v.CodeGen}});var S=pd();Object.defineProperty(i,"ValidationError",{enumerable:!0,get:function(){return S.default}});var q=$s();Object.defineProperty(i,"MissingRefError",{enumerable:!0,get:function(){return q.default}})}(yu,yu.exports)),yu.exports}var yS=gS();const vS=_s(yS);function ts(n){throw new Error('Could not dynamically require "'+n+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var rc={exports:{}},zy;function bS(){return zy||(zy=1,function(n,i){(function(u){n.exports=u()})(function(){return function u(l,s,o){function c(m,v){if(!s[m]){if(!l[m]){var S=typeof ts=="function"&&ts;if(!v&&S)return S(m,!0);if(d)return d(m,!0);throw new Error("Cannot find module '"+m+"'")}v=s[m]={exports:{}},l[m][0].call(v.exports,function(q){var C=l[m][1][q];return c(C||q)},v,v.exports,u,l,s,o)}return s[m].exports}for(var d=typeof ts=="function"&&ts,p=0;p>16),ne((65280&j)>>8),ne(255&j);return Y==2?ne(255&(j=A($.charAt(D))<<2|A($.charAt(D+1))>>4)):Y==1&&(ne((j=A($.charAt(D))<<10|A($.charAt(D+1))<<4|A($.charAt(D+2))>>2)>>8&255),ne(255&j)),Q},L.fromByteArray=function($){var D,j,Y,Q,W=$.length%3,F="";function ne(P){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(P)}for(D=0,Y=$.length-W;D>18&63)+ne(Q>>12&63)+ne(Q>>6&63)+ne(63&Q);switch(W){case 1:F=(F+=ne((j=$[$.length-1])>>2))+ne(j<<4&63)+"==";break;case 2:F=(F=(F+=ne((j=($[$.length-2]<<8)+$[$.length-1])>>10))+ne(j>>4&63))+ne(j<<2&63)+"="}return F}})(c===void 0?this.base64js={}:c)}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:11}],3:[function(u,l,c){(function(o,d,g,m,y,S,N,x,V){var L=u("base64-js"),C=u("ieee754");function g(M,B,q){if(!(this instanceof g))return new g(M,B,q);var G,X,se,me,ye=typeof M;if(B==="base64"&&ye=="string")for(M=(me=M).trim?me.trim():me.replace(/^\s+|\s+$/g,"");M.length%4!=0;)M+="=";if(ye=="number")G=re(M);else if(ye=="string")G=g.byteLength(M,B);else{if(ye!="object")throw new Error("First argument needs to be a number, array or string.");G=re(M.length)}if(g._useTypedArrays?X=g._augment(new Uint8Array(G)):((X=this).length=G,X._isBuffer=!0),g._useTypedArrays&&typeof M.byteLength=="number")X._set(M);else if(de(me=M)||g.isBuffer(me)||me&&typeof me=="object"&&typeof me.length=="number")for(se=0;se>8,me=me%256,ye.push(me),ye.push(se);return ye}(B),M,q,G)}function b(M,B,q){var G="";q=Math.min(M.length,q);for(var X=B;X>>0)):(B+1>>0),X}function v(M,B,q,G){if(G||(ae(typeof q=="boolean","missing or invalid endian"),ae(B!=null,"missing offset"),ae(B+1>>8*(G?se:1-se)}function Y(M,B,q,G,X){if(X||(ae(B!=null,"missing value"),ae(typeof G=="boolean","missing or invalid endian"),ae(q!=null,"missing offset"),ae(q+3>>8*(G?se:3-se)&255}function Q(M,B,q,G,X){X||(ae(B!=null,"missing value"),ae(typeof G=="boolean","missing or invalid endian"),ae(q!=null,"missing offset"),ae(q+1this.length&&(G=this.length);var X=(G=M.length-B=this.length))return this[M]},g.prototype.readUInt16LE=function(M,B){return E(this,M,!0,B)},g.prototype.readUInt16BE=function(M,B){return E(this,M,!1,B)},g.prototype.readUInt32LE=function(M,B){return O(this,M,!0,B)},g.prototype.readUInt32BE=function(M,B){return O(this,M,!1,B)},g.prototype.readInt8=function(M,B){if(B||(ae(M!=null,"missing offset"),ae(M=this.length))return 128&this[M]?-1*(255-this[M]+1):this[M]},g.prototype.readInt16LE=function(M,B){return v(this,M,!0,B)},g.prototype.readInt16BE=function(M,B){return v(this,M,!1,B)},g.prototype.readInt32LE=function(M,B){return A(this,M,!0,B)},g.prototype.readInt32BE=function(M,B){return A(this,M,!1,B)},g.prototype.readFloatLE=function(M,B){return $(this,M,!0,B)},g.prototype.readFloatBE=function(M,B){return $(this,M,!1,B)},g.prototype.readDoubleLE=function(M,B){return D(this,M,!0,B)},g.prototype.readDoubleBE=function(M,B){return D(this,M,!1,B)},g.prototype.writeUInt8=function(M,B,q){q||(ae(M!=null,"missing value"),ae(B!=null,"missing offset"),ae(B=this.length||(this[B]=M)},g.prototype.writeUInt16LE=function(M,B,q){j(this,M,B,!0,q)},g.prototype.writeUInt16BE=function(M,B,q){j(this,M,B,!1,q)},g.prototype.writeUInt32LE=function(M,B,q){Y(this,M,B,!0,q)},g.prototype.writeUInt32BE=function(M,B,q){Y(this,M,B,!1,q)},g.prototype.writeInt8=function(M,B,q){q||(ae(M!=null,"missing value"),ae(B!=null,"missing offset"),ae(B=this.length||(0<=M?this.writeUInt8(M,B,q):this.writeUInt8(255+M+1,B,q))},g.prototype.writeInt16LE=function(M,B,q){Q(this,M,B,!0,q)},g.prototype.writeInt16BE=function(M,B,q){Q(this,M,B,!1,q)},g.prototype.writeInt32LE=function(M,B,q){W(this,M,B,!0,q)},g.prototype.writeInt32BE=function(M,B,q){W(this,M,B,!1,q)},g.prototype.writeFloatLE=function(M,B,q){F(this,M,B,!0,q)},g.prototype.writeFloatBE=function(M,B,q){F(this,M,B,!1,q)},g.prototype.writeDoubleLE=function(M,B,q){ne(this,M,B,!0,q)},g.prototype.writeDoubleBE=function(M,B,q){ne(this,M,B,!1,q)},g.prototype.fill=function(M,B,q){if(B=B||0,q=q||this.length,ae(typeof(M=typeof(M=M||0)=="string"?M.charCodeAt(0):M)=="number"&&!isNaN(M),"value is not a number"),ae(B<=q,"end < start"),q!==B&&this.length!==0){ae(0<=B&&B"},g.prototype.toArrayBuffer=function(){if(typeof Uint8Array>"u")throw new Error("Buffer.toArrayBuffer not supported in this browser");if(g._useTypedArrays)return new g(this).buffer;for(var M=new Uint8Array(this.length),B=0,q=M.length;B=B.length||X>=M.length);X++)B[X+q]=M[X];return X}function T(M){try{return decodeURIComponent(M)}catch{return"�"}}function H(M,B){ae(typeof M=="number","cannot write a non-number as a number"),ae(0<=M,"specified a negative value for writing an unsigned value"),ae(M<=B,"value is larger than maximum value for type"),ae(Math.floor(M)===M,"value has a fractional component")}function te(M,B,q){ae(typeof M=="number","cannot write a non-number as a number"),ae(M<=B,"value larger than maximum allowed value"),ae(q<=M,"value smaller than minimum allowed value"),ae(Math.floor(M)===M,"value has a fractional component")}function pe(M,B,q){ae(typeof M=="number","cannot write a non-number as a number"),ae(M<=B,"value larger than maximum allowed value"),ae(q<=M,"value smaller than minimum allowed value")}function ae(M,B){if(!M)throw new Error(B||"Failed assertion")}g._augment=function(M){return M._isBuffer=!0,M._get=M.get,M._set=M.set,M.get=P.get,M.set=P.set,M.write=P.write,M.toString=P.toString,M.toLocaleString=P.toString,M.toJSON=P.toJSON,M.copy=P.copy,M.slice=P.slice,M.readUInt8=P.readUInt8,M.readUInt16LE=P.readUInt16LE,M.readUInt16BE=P.readUInt16BE,M.readUInt32LE=P.readUInt32LE,M.readUInt32BE=P.readUInt32BE,M.readInt8=P.readInt8,M.readInt16LE=P.readInt16LE,M.readInt16BE=P.readInt16BE,M.readInt32LE=P.readInt32LE,M.readInt32BE=P.readInt32BE,M.readFloatLE=P.readFloatLE,M.readFloatBE=P.readFloatBE,M.readDoubleLE=P.readDoubleLE,M.readDoubleBE=P.readDoubleBE,M.writeUInt8=P.writeUInt8,M.writeUInt16LE=P.writeUInt16LE,M.writeUInt16BE=P.writeUInt16BE,M.writeUInt32LE=P.writeUInt32LE,M.writeUInt32BE=P.writeUInt32BE,M.writeInt8=P.writeInt8,M.writeInt16LE=P.writeInt16LE,M.writeInt16BE=P.writeInt16BE,M.writeInt32LE=P.writeInt32LE,M.writeInt32BE=P.writeInt32BE,M.writeFloatLE=P.writeFloatLE,M.writeFloatBE=P.writeFloatBE,M.writeDoubleLE=P.writeDoubleLE,M.writeDoubleBE=P.writeDoubleBE,M.fill=P.fill,M.inspect=P.inspect,M.toArrayBuffer=P.toArrayBuffer,M}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(u,l,c){(function(o,d,L,m,y,S,N,x,V){var L=u("buffer").Buffer,C=4,g=new L(C);g.fill(0),l.exports={hash:function(w,p,b,E){for(var O=p(function(j,Y){j.length%C!=0&&(Q=j.length+(C-j.length%C),j=L.concat([j,g],Q));for(var Q,W=[],F=Y?j.readInt32BE:j.readInt32LE,ne=0;neb?ue=P(ue):ue.length>5]|=128<>>9<<4)]=A;for(var $=1732584193,D=-271733879,j=-1732584194,Y=271733878,Q=0;Q>>32-j,$)}function w(v,A,$,D,j,Y,Q){return g(A&$|~A&D,v,A,j,Y,Q)}function p(v,A,$,D,j,Y,Q){return g(A&D|$&~D,v,A,j,Y,Q)}function b(v,A,$,D,j,Y,Q){return g(A^$^D,v,A,j,Y,Q)}function E(v,A,$,D,j,Y,Q){return g($^(A|~D),v,A,j,Y,Q)}function O(v,A){var $=(65535&v)+(65535&A);return(v>>16)+(A>>16)+($>>16)<<16|65535&$}l.exports=function(v){return L.hash(v,C,16)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],7:[function(u,l,c){(function(o,d,h,m,y,S,N,x,V){l.exports=function(L){for(var C,g=new Array(L),w=0;w>>((3&w)<<3)&255;return g}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:11}],8:[function(u,l,c){(function(o,d,h,m,y,S,N,x,V){var L=u("./helpers");function C(p,b){p[b>>5]|=128<<24-b%32,p[15+(b+64>>9<<4)]=b;for(var E,O,v,A=Array(80),$=1732584193,D=-271733879,j=-1732584194,Y=271733878,Q=-1009589776,W=0;W>16)+(b>>16)+(E>>16)<<16|65535&E}function w(p,b){return p<>>32-b}l.exports=function(p){return L.hash(p,C,20,!0)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],9:[function(u,l,c){(function(o,d,h,m,y,S,N,x,V){function L(b,E){var O=(65535&b)+(65535&E);return(b>>16)+(E>>16)+(O>>16)<<16|65535&O}function C(b,E){var O,v=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),A=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),$=new Array(64);b[E>>5]|=128<<24-E%32,b[15+(E+64>>9<<4)]=E;for(var D,j,Y=0;Y>>E|b<<32-E},p=function(b,E){return b>>>E};l.exports=function(b){return g.hash(b,C,32,!0)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],10:[function(u,l,c){(function(o,d,h,m,y,S,N,x,V){c.read=function(L,C,g,w,Y){var b,E,O=8*Y-w-1,v=(1<>1,$=-7,D=g?Y-1:0,j=g?-1:1,Y=L[C+D];for(D+=j,b=Y&(1<<-$)-1,Y>>=-$,$+=O;0<$;b=256*b+L[C+D],D+=j,$-=8);for(E=b&(1<<-$)-1,b>>=-$,$+=w;0<$;E=256*E+L[C+D],D+=j,$-=8);if(b===0)b=1-A;else{if(b===v)return E?NaN:1/0*(Y?-1:1);E+=Math.pow(2,w),b-=A}return(Y?-1:1)*E*Math.pow(2,b-w)},c.write=function(L,C,g,w,p,Q){var E,O,v=8*Q-p-1,A=(1<>1,D=p===23?Math.pow(2,-24)-Math.pow(2,-77):0,j=w?0:Q-1,Y=w?1:-1,Q=C<0||C===0&&1/C<0?1:0;for(C=Math.abs(C),isNaN(C)||C===1/0?(O=isNaN(C)?1:0,E=A):(E=Math.floor(Math.log(C)/Math.LN2),C*(w=Math.pow(2,-E))<1&&(E--,w*=2),2<=(C+=1<=E+$?D/w:D*Math.pow(2,1-$))*w&&(E++,w/=2),A<=E+$?(O=0,E=A):1<=E+$?(O=(C*w-1)*Math.pow(2,p),E+=$):(O=C*Math.pow(2,$-1)*Math.pow(2,p),E=0));8<=p;L[g+j]=255&O,j+=Y,O/=256,p-=8);for(E=E<"u"?1:0;let c=l?r[0]:u;for(let o=l;o/g,""),/\.{3}|=/.test(i))?0:r.length}function pv(r,...i){let u="";const l=this;for(let c=0;cqi(l,i,u));if(r&&typeof r=="object"){const l=Object.keys(r)[0],c=r[l];if(i.isData(r,l)||c===void 0)return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(c,u):i.methods[l].deterministic:typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(c,u):i.methods[l].deterministic&&qi(c,i,u)}return!0}function Tc(r,i){if(!i.async)return!0;if(Array.isArray(r))return r.every(u=>Tc(u,i));if(typeof r=="object"){const u=Object.keys(r)[0],l=r[u];return rn(i.methods[u])?i.methods[u].traverse===!1?!!(typeof i.methods[u][et]=="function"&&i.methods[u][et](r,{engine:i})):Tc(l,i):!1}return!0}function ze(r,i={}){const{notTraversed:u=[],async:l,processing:c=[],values:o=[],engine:d}=i;function h(N,x=!1){return CE(N,x)?JSON.stringify(N):(o.push(N),`values[${o.length-1}]`)}if(Array.isArray(r)){let N="";for(let x=0;x0&&(N+=","),N+=ze(r[x],i);return"["+N+"]"}let m=!1;function y(N){return i.asyncDetected=i.asyncDetected||m,l&&m?`await ${N}`:N}const S=r&&Object.keys(r)[0];if(r&&typeof r=="object"){if(!S)return h(r);if(!d.methods[S]){if(d.isData(r,S))return h(r,!0);throw new Error(`Method '${S}' was not found in the Logic Engine.`)}if(!i.engine.disableInline&&d.methods[S]&&qi(r,d,i))return Tc(r,d)?h((d.fallback||d).run(r),!0):i.avoidInlineAsync?(i.asyncDetected=!0,`(await ${h(d.run(r))})`):(c.push(d.run(r).then(L=>h(L))),`__%%%${c.length-1}%%%__`);let N=r[S];if((!N||typeof N!="object")&&(N=[N]),d.methods[S]&&d.methods[S].compile){let L=d.methods[S].compile(N,i);if(L[Di]&&(L=L[Di]),(L||"").startsWith("await")&&(i.asyncDetected=!0),L!==!1)return L}let x=d.methods[S].optimizeUnary?"":"coerceArray";!x&&Array.isArray(N)&&N.length===1?N=N[0]:x&&Array.isArray(N)&&(x="");const V=[", context",", context, above",", context, above, engine"];if(typeof d.methods[S]=="function"){m=!rn(d.methods[S]);const L=V[Zy(d.methods[S])-1]||V[2];return y(`engine.methods["${S}"](${x}(`+ze(N,i)+")"+L+")")}else{m=!!(l&&d.methods[S]&&d.methods[S].asyncMethod);const L=Zy(m?d.methods[S].asyncMethod:d.methods[S].method),C=V[L-1]||V[2];return d.methods[S]&&(typeof d.methods[S].traverse>"u"||d.methods[S].traverse)?y(`engine.methods["${S}"]${m?".asyncMethod":".method"}(${x}(`+ze(N,i)+")"+C+")"):(u.push(N),y(`engine.methods["${S}"]${m?".asyncMethod":".method"}(notTraversed[${u.length-1}]`+C+")"))}}return h(r)}function Il(r,i={}){Object.assign(i,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:i.engine.async,asyncDetected:!1,values:[],compile:pv},i));const u=ze(r,i);return yv(r,u,i)}async function zE(r,i={}){Object.assign(i,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:i.engine.async,asyncDetected:!1,values:[],compile:pv},i));const u=ze(r,i);return i.processing=await Promise.all(i.processing||[]),yv(r,u,i)}function yv(r,i,u){const{engine:l,methods:c,notTraversed:o,processing:d=[],values:h}=u,m=[];d.forEach((S,N)=>{i=i.replace(`__%%%${N}%%%__`,S)});const y=`(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${u.asyncDetected?"async":""} (context ${u.extraArguments?","+u.extraArguments:""}) => { const result = ${i}; return result }`;return Object.assign((typeof globalThis<"u"?globalThis:global).eval(y)(h,c,o,Gl,l,m,or),{[et]:!u.asyncDetected,aboveDetected:typeof i=="string"&&i.includes(", above")})}const UE=()=>{try{const r={};return(typeof globalThis<"u"?globalThis:global).eval("(test) => test?.foo?.bar")(r)===void 0}catch{return!1}},gv=UE();class hn extends Error{constructor(i){super(),this.message="Built-in control structures are not allowed to receive dynamic inputs, this could allow a lesser version of remote-code execution.",this.input=i}}const Ti=new Map;function Yl(r){if(Ti.has(r))return Ti.get(r);Ti.size>2048&&Ti.clear();const i=LE(r);return Ti.set(r,i),i}function LE(r,i=".",u="\\",l="/"){const c=[];let o="";for(let d=0;dZt(l,i,u));if(r&&typeof r=="object"){const l=Object.keys(r)[0],c=r[l];if(i.isData(r,l))return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(c,u):i.methods[l].deterministic:typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(c,u):i.methods[l].deterministic&&Zt(c,i,u)}return!0}function lr(r,i,u){if(Array.isArray(r))return r.every(l=>lr(l,i,u));if(r&&typeof r=="object"){const l=Object.keys(r)[0],c=r[l];if(i.isData(r,l))return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l][et]=="function"?i.methods[l][et](c,u):i.methods[l][et]:typeof i.methods[l][et]=="function"?i.methods[l][et](c,u):i.methods[l][et]&&lr(c,i,u)}return!0}const Se={"+":r=>{if(typeof r=="string"||typeof r=="number")return+r;let i=0;for(let u=0;u{let i=1;for(let u=0;u{let i=r[0];for(let u=1;u{if(typeof r=="string"||typeof r=="number")return-r;if(r.length===1)return-r[0];let i=r[0];for(let u=1;u{let i=r[0];for(let u=1;uMath.max(...r),min:r=>Math.min(...r),in:([r,i])=>(i||[]).includes(r),">":([r,i])=>r>i,"<":([r,i,u])=>u===void 0?rr,!0),[et]:()=>!0},if:{method:(r,i,u,l)=>{if(!Array.isArray(r))throw new hn(r);if(r.length===1)return l.run(r[0],i,{above:u});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const o=r.shift(),d=r.shift(),h=l.run(o,i,{above:u});if(l.truthy(h))return l.run(d,i,{above:u})}return l.run(c,i,{above:u})},[et]:(r,i)=>lr(r,i.engine,i),deterministic:(r,i)=>Zt(r,i.engine,i),asyncMethod:async(r,i,u,l)=>{if(!Array.isArray(r))throw new hn(r);if(r.length===1)return l.run(r[0],i,{above:u});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const o=r.shift(),d=r.shift(),h=await l.run(o,i,{above:u});if(l.truthy(h))return l.run(d,i,{above:u})}return l.run(c,i,{above:u})},traverse:!1},"<=":([r,i,u])=>u===void 0?r<=i:r<=i&&i<=u,">=":([r,i])=>r>=i,"==":([r,i])=>r==i,"===":([r,i])=>r===i,"!=":([r,i])=>r!=i,"!==":([r,i])=>r!==i,xor:([r,i])=>r^i,or:{method:(r,i,u,l)=>{const c=Array.isArray(r);c||(r=l.run(r,i,{above:u}));let o;for(let d=0;d{const c=Array.isArray(r);c||(r=await l.run(r,i,{above:u}));let o;for(let d=0;dZt(r,i.engine,i),compile:(r,i)=>i.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(u=>ze(u,i)).join(" || ")})`:`(${ze(r,i)}).reduce((a,b) => a||b, false)`:!1,traverse:!1},and:{method:(r,i,u,l)=>{const c=Array.isArray(r);c||(r=l.run(r,i,{above:u}));let o;for(let d=0;d{const c=Array.isArray(r);c||(r=await l.run(r,i,{above:u}));let o;for(let d=0;dZt(r,i.engine,i),compile:(r,i)=>i.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(u=>ze(u,i)).join(" && ")})`:`(${ze(r,i)}).reduce((a,b) => a&&b, true)`:!1},substr:([r,i,u])=>{if(u<0){const l=r.substr(i);return l.substr(0,l.length+u)}return r.substr(i,u)},length:([r])=>typeof r=="string"||Array.isArray(r)?r.length:r&&typeof r=="object"?Object.keys(r).length:0,get:{method:([r,i,u],l,c,o)=>{const d=u===void 0?null:u,h=Yl(String(i));for(let m=0;m{let c;Array.isArray(r)&&(c=r[1],r=r[0]);let o=0;for(;typeof r=="string"&&r.startsWith("../")&&o"u"||r===""||r===null)return l.allowFunctions||typeof i!="function"?i:null;const h=Yl(String(r));for(let m=0;m(Array.isArray(r)?r:[r]).filter(c=>Se.var(c,i,u,l)===null),missing_some:([r,i],u,l,c)=>{const o=Se.missing(i,u,l,c);return i.length-o.length>=r?[]:o},map:Ni("map"),some:Ni("some",!0),all:Ni("every",!0),none:{traverse:!1,method:(r,i,u,l)=>!Se.some.method(r,i,u,l),asyncMethod:async(r,i,u,l)=>!await Se.some.asyncMethod(r,i,u,l),compile:(r,i)=>{const u=Se.some.compile(r,i);return u?i.compile`!(${u})`:!1}},merge:r=>Array.isArray(r)?[].concat(...r):[r],every:Ni("every"),filter:Ni("filter"),reduce:{deterministic:(r,i)=>Zt(r[0],i.engine,i)&&Zt(r[1],i.engine,{...i,insideIterator:!0}),compile:(r,i)=>{if(!Array.isArray(r))throw new hn(r);const{async:u}=i;let[l,c,o]=r;l=ze(l,i),typeof o<"u"&&(o=ze(o,i));const d={...i,extraArguments:"above",avoidInlineAsync:!0};c=Il(c,d);const h=c.aboveDetected?"[null, context, above]":"null";return i.methods.push(c),u&&(!rn(c)||l.includes("await"))?(i.detectAsync=!0,typeof o<"u"?`await asyncIterators.reduce(${l} || [], (a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${h}), ${o})`:`await asyncIterators.reduce(${l} || [], (a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${h}))`):typeof o<"u"?`(${l} || []).reduce((a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${h}), ${o})`:`(${l} || []).reduce((a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${h}))`},method:(r,i,u,l)=>{if(!Array.isArray(r))throw new hn(r);let[c,o,d]=r;d=l.run(d,i,{above:u}),c=l.run(c,i,{above:u})||[];const h=(m,y)=>l.run(o,{accumulator:m,current:y},{above:[c,i,u]});return typeof d>"u"?c.reduce(h):c.reduce(h,d)},[et]:(r,i)=>lr(r,i.engine,i),asyncMethod:async(r,i,u,l)=>{if(!Array.isArray(r))throw new hn(r);let[c,o,d]=r;return d=await l.run(d,i,{above:u}),c=await l.run(c,i,{above:u})||[],Gl.reduce(c,(h,m)=>l.run(o,{accumulator:h,current:m},{above:[c,i,u]}),d)},traverse:!1},"!":(r,i,u,l)=>Array.isArray(r)?!l.truthy(r[0]):!l.truthy(r),"!!":(r,i,u,l)=>!!(Array.isArray(r)?l.truthy(r[0]):l.truthy(r)),cat:r=>{if(typeof r=="string")return r;let i="";for(let u=0;utypeof r=="object"?Object.keys(r):[],pipe:{traverse:!1,[et]:(r,i)=>lr(r,i.engine,i),method:(r,i,u,l)=>{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=l.run(r[0],i,{above:[r,i,u]});for(let o=1;o{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=await l.run(r[0],i,{above:[r,i,u]});for(let o=1;o{let u=i.compile`${r[0]}`;for(let l=1;l{if(!Array.isArray(r))return!1;r=[...r];const u=r.shift();return Zt(u,i.engine,i)&&Zt(r,i.engine,{...i,insideIterator:!0})}},eachKey:{traverse:!1,[et]:(r,i)=>lr(Object.values(r[Object.keys(r)[0]]),i.engine,i),method:(r,i,u,l)=>Object.keys(r).reduce((o,d)=>{const h=r[d];return Object.defineProperty(o,d,{enumerable:!0,value:l.run(h,i,{above:u})}),o},{}),deterministic:(r,i)=>{if(r&&typeof r=="object")return Object.values(r).every(u=>Zt(u,i.engine,i));throw new hn(r)},compile:(r,i)=>{if(r&&typeof r=="object")return`({ ${Object.keys(r).reduce((l,c)=>(l.push(`${JSON.stringify(c)}: ${ze(r[c],i)}`),l),[]).join(",")} })`;throw new hn(r)},asyncMethod:async(r,i,u,l)=>await Gl.reduce(Object.keys(r),async(o,d)=>{const h=r[d];return Object.defineProperty(o,d,{enumerable:!0,value:await l.run(h,i,{above:u})}),o},{})}};function Ni(r,i=!1){return{deterministic:(u,l)=>Zt(u[0],l.engine,l)&&Zt(u[1],l.engine,{...l,insideIterator:!0}),[et]:(u,l)=>lr(u,l.engine,l),method:(u,l,c,o)=>{if(!Array.isArray(u))throw new hn(u);let[d,h]=u;return d=o.run(d,l,{above:c})||[],d[r]((m,y)=>{const S=o.run(h,m,{above:[{iterator:d,index:y},l,c]});return i?o.truthy(S):S})},asyncMethod:async(u,l,c,o)=>{if(!Array.isArray(u))throw new hn(u);let[d,h]=u;return d=await o.run(d,l,{above:c})||[],Gl[r](d,(m,y)=>{const S=o.run(h,m,{above:[{iterator:d,index:y},l,c]});return i?o.truthy(S):S})},compile:(u,l)=>{if(!Array.isArray(u))throw new hn(u);const{async:c}=l,[o,d]=u,h={...l,avoidInlineAsync:!0,iteratorCompile:!0,extraArguments:"index, above"},m=Il(d,h),y=m.aboveDetected?l.compile`[{ iterator: z, index: x }, context, above]`:l.compile`null`;return c&&!lr(d,l.engine,l)?(l.detectAsync=!0,l.compile`await asyncIterators[${r}](${o} || [], async (i, x, z) => ${m}(i, x, ${y}))`):l.compile`(${o} || [])[${r}]((i, x, z) => ${m}(i, x, ${y}))`},traverse:!1}}Se["?:"]=Se.if;Object.keys(Se).forEach(r=>{typeof Se[r]=="function"&&(Se[r][et]=!0),Se[r].deterministic=typeof Se[r].deterministic>"u"?!0:Se[r].deterministic});Se.var.deterministic=(r,i)=>i.insideIterator&&!String(r).includes("../../");Object.assign(Se.missing,{deterministic:!1});Object.assign(Se.missing_some,{deterministic:!1});Se["<"].compile=function(r,i){return Array.isArray(r)?r.length===2?i.compile`(${r[0]} < ${r[1]})`:r.length===3?i.compile`(${r[0]} < ${r[1]} && ${r[1]} < ${r[2]})`:!1:!1};Se["<="].compile=function(r,i){return Array.isArray(r)?r.length===2?i.compile`(${r[0]} <= ${r[1]})`:r.length===3?i.compile`(${r[0]} <= ${r[1]} && ${r[1]} <= ${r[2]})`:!1:!1};Se.min.compile=function(r,i){return Array.isArray(r)?`Math.min(${r.map(u=>ze(u,i)).join(", ")})`:!1};Se.max.compile=function(r,i){return Array.isArray(r)?`Math.max(${r.map(u=>ze(u,i)).join(", ")})`:!1};Se[">"].compile=function(r,i){return!Array.isArray(r)||r.length!==2?!1:i.compile`(${r[0]} > ${r[1]})`};Se[">="].compile=function(r,i){return!Array.isArray(r)||r.length!==2?!1:i.compile`(${r[0]} >= ${r[1]})`};Se["=="].compile=function(r,i){return!Array.isArray(r)||r.length!==2?!1:i.compile`(${r[0]} == ${r[1]})`};Se["!="].compile=function(r,i){return!Array.isArray(r)||r.length!==2?!1:i.compile`(${r[0]} != ${r[1]})`};Se.if.compile=function(r,i){if(!Array.isArray(r)||r.length<3)return!1;r=[...r],r.length%2!==1&&r.push(null);const u=r.pop();let l=i.compile``;for(;r.length;){const c=r.shift(),o=r.shift();l=i.compile`${l} engine.truthy(${c}) ? ${o} : `}return i.compile`(${l} ${u})`};Se["==="].compile=function(r,i){return!Array.isArray(r)||r.length!==2?!1:i.compile`(${r[0]} === ${r[1]})`};Se["+"].compile=function(r,i){return Array.isArray(r)?`(${r.map(u=>`(+${ze(u,i)})`).join(" + ")})`:typeof r=="string"||typeof r=="number"?`(+${ze(r,i)})`:`([].concat(${ze(r,i)})).reduce((a,b) => (+a)+(+b), 0)`};Se["%"].compile=function(r,i){return Array.isArray(r)?`(${r.map(u=>`(+${ze(u,i)})`).join(" % ")})`:`(${ze(r,i)}).reduce((a,b) => (+a)%(+b))`};Se.in.compile=function(r,i){return Array.isArray(r)?i.compile`(${r[1]} || []).includes(${r[0]})`:!1};Se["-"].compile=function(r,i){return Array.isArray(r)?`${r.length===1?"-":""}(${r.map(u=>`(+${ze(u,i)})`).join(" - ")})`:typeof r=="string"||typeof r=="number"?`(-${ze(r,i)})`:`((a=>(a.length===1?a[0]=-a[0]:a)&0||a)([].concat(${ze(r,i)}))).reduce((a,b) => (+a)-(+b))`};Se["/"].compile=function(r,i){return Array.isArray(r)?`(${r.map(u=>`(+${ze(u,i)})`).join(" / ")})`:`(${ze(r,i)}).reduce((a,b) => (+a)/(+b))`};Se["*"].compile=function(r,i){return Array.isArray(r)?`(${r.map(u=>`(+${ze(u,i)})`).join(" * ")})`:`(${ze(r,i)}).reduce((a,b) => (+a)*(+b))`};Se.cat.compile=function(r,i){if(typeof r=="string")return JSON.stringify(r);if(!Array.isArray(r))return!1;let u=i.compile`''`;for(let l=0;l"u"?null:r[2],l&&typeof l=="object")return!1;l=l.toString();const o=Yl(l);return gv?`((${ze(c,i)})${o.map(d=>`?.[${ze(d,i)}]`).join("")} ?? ${ze(u,i)})`:`(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${o.reduce((d,h)=>`(${d}||0)[${JSON.stringify(h)}]`,`(${ze(c,i)}||0)`)}, ${ze(u,i)}))`}return!1};Se.var.compile=function(r,i){let u=r,l=null;if(i.varTop=i.varTop||new Set,!u||typeof r=="string"||typeof r=="number"||Array.isArray(r)&&r.length<=2){if(Array.isArray(r)&&(u=r[0],l=typeof r[1]>"u"?null:r[1]),u==="../index"&&i.iteratorCompile)return"index";if(typeof u>"u"||u===null||u==="")return"context";if(typeof u!="string"&&typeof u!="number"||(u=u.toString(),u.includes("../")))return!1;const c=Yl(u),[o]=c;return i.varTop.add(o),i.engine.allowFunctions?i.methods.preventFunctions=d=>d:i.methods.preventFunctions=d=>typeof d=="function"?null:d,gv?`(methods.preventFunctions(context${c.map(d=>`?.[${JSON.stringify(d)}]`).join("")} ?? ${ze(l,i)}))`:`(methods.preventFunctions(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${c.reduce((d,h)=>`(${d}||0)[${JSON.stringify(h)}]`,"(context||0)")}, ${ze(l,i)})))`}return!1};Se["+"].optimizeUnary=Se["-"].optimizeUnary=Se.var.optimizeUnary=Se["!"].optimizeUnary=Se["!!"].optimizeUnary=Se.cat.optimizeUnary=!0;const zc={...Se},vv=function(i){return Object.keys(i).forEach(u=>{i[u]===void 0&&delete i[u]}),i};function VE(r,i,u,l){const c=i.methods[u],o=c.method?c.method:c;if(c.traverse===!1){const h=r[u];return(m,y)=>o(h,m,y||l,i)}let d=r[u];if((!d||typeof d!="object")&&(d=[d]),Array.isArray(d)){const h=d.map(m=>kl(m,i,l));return(m,y)=>{const S=h.map(N=>typeof N=="function"?N(m,y):N);return o(S,m,y||l,i)}}else{const h=kl(d,i,l);return(m,y)=>o(or(typeof h=="function"?h(m,y):h,c.optimizeUnary),m,y||l,i)}}function kl(r,i,u=[]){if(Array.isArray(r)){const l=r.map(c=>kl(c,i,u));return(c,o)=>l.map(d=>typeof d=="function"?d(c,o):d)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(i.isData(r,c))return()=>r;const d=!i.disableInline&&qi(r,i,{engine:i});if(c in i.methods){const h=VE(r,i,c,u);return d?h():h}}return r}const Cl=zc.all,xE={method:(r,i,u,l)=>{if(Array.isArray(r)){const c=l.run(r[0],i,u);if(Array.isArray(c)&&c.length===0)return!1}return Cl.method(r,i,u,l)},asyncMethod:async(r,i,u,l)=>{if(Array.isArray(r)){const c=await l.run(r[0],i,u);if(Array.isArray(c)&&c.length===0)return!1}return Cl.asyncMethod(r,i,u,l)},deterministic:Cl.deterministic,traverse:Cl.traverse};function BE(r){return Array.isArray(r)&&r.length===0?!1:r}function bv(r){r.methods.all=xE,r.truthy=BE}class Uc{constructor(i=zc,u={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.disableInline=u.disableInline,this.disableInterpretedOptimization=u.disableInterpretedOptimization,this.methods={...i},this.optimizedMap=new WeakMap,this.missesSinceSeen=0,u.compatible&&bv(this),this.options={disableInline:u.disableInline,disableInterpretedOptimization:u.disableInterpretedOptimization},this.isData||(u.permissive?this.isData=(l,c)=>!(c in this.methods):this.isData=()=>!1)}truthy(i){return i}_parse(i,u,l){const[c]=Object.keys(i),o=i[c];if(this.isData(i,c))return i;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const d=!o||typeof o!="object"?[o]:or(this.run(o,u,{above:l}));return this.methods[c](d,u,l,this)}if(typeof this.methods[c]=="object"){const{method:d,traverse:h}=this.methods[c],y=(typeof h>"u"?!0:h)?!o||typeof o!="object"?[o]:or(this.run(o,u,{above:l})):o;return d(y,u,l,this)}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(i,u,{deterministic:l,optimizeUnary:c}={}){typeof u=="function"?u={method:u,traverse:!0}:u={...u},Object.assign(u,vv({deterministic:l,optimizeUnary:c})),this.methods[i]=zn(u)}addModule(i,u,l){Object.getOwnPropertyNames(u).forEach(c=>{(typeof u[c]=="function"||typeof u[c]=="object")&&this.addMethod(`${i}${i?".":""}${c}`,u[c],l)})}run(i,u={},l={}){const{above:c=[]}=l;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof i=="object"&&i&&!this.optimizedMap.has(i))return this.optimizedMap.set(i,kl(i,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,c):this.optimizedMap.get(i);if(!this.disableInterpretedOptimization&&i&&typeof i=="object"&&this.optimizedMap.get(i))return this.missesSinceSeen=0,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,c):this.optimizedMap.get(i);if(Array.isArray(i)){const o=[];for(let d=0;d0?this._parse(i,u,c):i}build(i,u={}){const{above:l=[],top:c=!0}=u;if(c){const o=Il(i,{state:{},engine:this,above:l});return typeof o=="function"||c===!0?(...d)=>typeof o=="function"?o(...d):o:o}return i}}Object.assign(Uc.prototype.truthy,{IDENTITY:!0});function HE(r,i,u,l){const c=i.methods[u],o=c.asyncMethod?c.asyncMethod:c.method?c.method:c;if(c.traverse===!1){if(typeof c[et]=="function"&&c[et](r,{engine:i})){const m=c.method?c.method:c;return zn((y,S)=>m(r[u],y,S||l,i.fallback),!0)}const h=r[u];return(m,y)=>o(h,m,y||l,i)}let d=r[u];if((!d||typeof d!="object")&&(d=[d]),Array.isArray(d)){const h=d.map(m=>Pl(m,i,l));if(rn(h)&&(c.method||c[et])){const m=c.method?c.method:c;return zn((y,S)=>{const N=h.map(x=>typeof x=="function"?x(y,S):x);return m(N,y,S||l,i.fallback)},!0)}return async(m,y)=>{const S=await Cc(h,N=>typeof N=="function"?N(m,y):N);return o(S,m,y||l,i)}}else{const h=Pl(d,i,l);if(rn(h)&&(c.method||c[et])){const m=c.method?c.method:c;return zn((y,S)=>m(or(typeof h=="function"?h(y,S):h,c.optimizeUnary),y,S||l,i),!0)}return async(m,y)=>o(or(typeof h=="function"?await h(m,y):h,c.optimizeUnary),m,y||l,i)}}function Pl(r,i,u=[]){if(i.fallback.allowFunctions=i.allowFunctions,Array.isArray(r)){const l=r.map(c=>Pl(c,i,u));return rn(l)?zn((c,o)=>l.map(d=>typeof d=="function"?d(c,o):d),!0):async(c,o)=>Cc(l,d=>typeof d=="function"?d(c,o):d)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(i.isData(r,c))return()=>r;const d=!i.disableInline&&qi(r,i,{engine:i});if(c in i.methods){const h=HE(r,i,c,u);if(d){let m;return rn(h)?zn(()=>(m||(m=h()),m),!0):async()=>(m||(m=await h()),m)}return h}}return r}class GE{constructor(i=zc,u={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.methods={...i},this.options={disableInline:u.disableInline,disableInterpretedOptimization:u.disableInterpretedOptimization},this.disableInline=u.disableInline,this.disableInterpretedOptimization=u.disableInterpretedOptimization,this.async=!0,this.fallback=new Uc(i,u),u.compatible&&bv(this),this.optimizedMap=new WeakMap,this.missesSinceSeen=0,this.isData||(u.permissive?this.isData=(l,c)=>!(c in this.methods):this.isData=()=>!1),this.fallback.isData=this.isData}truthy(i){return i}async _parse(i,u,l){const[c]=Object.keys(i),o=i[c];if(this.isData(i,c))return i;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const d=!o||typeof o!="object"?[o]:await this.run(o,u,{above:l}),h=await this.methods[c](or(d),u,l,this);return Array.isArray(h)?Promise.all(h):h}if(typeof this.methods[c]=="object"){const{asyncMethod:d,method:h,traverse:m}=this.methods[c],S=(typeof m>"u"?!0:m)?!o||typeof o!="object"?[o]:or(await this.run(o,u,{above:l})):o,N=await(d||h)(S,u,l,this);return Array.isArray(N)?Promise.all(N):N}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(i,u,{deterministic:l,async:c,sync:o,optimizeUnary:d}={}){typeof c>"u"&&typeof o>"u"&&(o=!1),typeof o<"u"&&(c=!o),typeof c<"u"&&(o=!c),typeof u=="function"?c?u={asyncMethod:u,traverse:!0}:u={method:u,traverse:!0}:u={...u},Object.assign(u,vv({deterministic:l,optimizeUnary:d})),this.fallback.addMethod(i,u,{deterministic:l}),this.methods[i]=zn(u,o)}addModule(i,u,l={}){Object.getOwnPropertyNames(u).forEach(c=>{(typeof u[c]=="function"||typeof u[c]=="object")&&this.addMethod(`${i}${i?".":""}${c}`,u[c],l)})}async run(i,u={},l={}){const{above:c=[]}=l;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof i=="object"&&i&&!this.optimizedMap.has(i))return this.optimizedMap.set(i,Pl(i,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,c):this.optimizedMap.get(i);if(!this.disableInterpretedOptimization&&i&&typeof i=="object"&&this.optimizedMap.get(i))return this.missesSinceSeen=0,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,c):this.optimizedMap.get(i);if(Array.isArray(i)){const o=[];for(let d=0;d0?this._parse(i,u,c):i}async build(i,u={}){const{above:l=[],top:c=!0}=u;if(this.fallback.truthy=this.truthy,this.fallback.allowFunctions=this.allowFunctions,c){const o=await zE(i,{engine:this,above:l,async:!0,state:{}}),d=zn((...h)=>{if(c===!0)try{const m=typeof o=="function"?o(...h):o;return Promise.resolve(m)}catch(m){return Promise.reject(m)}return typeof o=="function"?o(...h):o},c!==!0&&rn(o));return typeof o=="function"||c===!0?d:o}return i}}Object.assign(GE.prototype.truthy,{IDENTITY:!0});var zl={exports:{}},Df,Jy;function Wl(){if(Jy)return Df;Jy=1;const r="2.0.0",i=256,u=Number.MAX_SAFE_INTEGER||9007199254740991,l=16,c=i-6;return Df={MAX_LENGTH:i,MAX_SAFE_COMPONENT_LENGTH:l,MAX_SAFE_BUILD_LENGTH:c,MAX_SAFE_INTEGER:u,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:r,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},Df}var Mf,Fy;function eu(){if(Fy)return Mf;Fy=1;var r={};return Mf=typeof process=="object"&&r&&r.NODE_DEBUG&&/\bsemver\b/i.test(r.NODE_DEBUG)?(...u)=>console.error("SEMVER",...u):()=>{},Mf}var Wy;function zi(){return Wy||(Wy=1,function(r,i){const{MAX_SAFE_COMPONENT_LENGTH:u,MAX_SAFE_BUILD_LENGTH:l}=Wl(),c=eu();i=r.exports={};const o=i.re=[],d=i.safeRe=[],h=i.src=[],m=i.t={};let y=0;const S="[a-zA-Z0-9-]",N=[["\\s",1],["\\d",u],[S,l]],x=L=>{for(const[C,g]of N)L=L.split(`${C}*`).join(`${C}{0,${g}}`).split(`${C}+`).join(`${C}{1,${g}}`);return L},V=(L,C,g)=>{const w=x(C),p=y++;c(L,p,C),m[L]=p,h[p]=C,o[p]=new RegExp(C,g?"g":void 0),d[p]=new RegExp(w,g?"g":void 0)};V("NUMERICIDENTIFIER","0|[1-9]\\d*"),V("NUMERICIDENTIFIERLOOSE","\\d+"),V("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${S}*`),V("MAINVERSION",`(${h[m.NUMERICIDENTIFIER]})\\.(${h[m.NUMERICIDENTIFIER]})\\.(${h[m.NUMERICIDENTIFIER]})`),V("MAINVERSIONLOOSE",`(${h[m.NUMERICIDENTIFIERLOOSE]})\\.(${h[m.NUMERICIDENTIFIERLOOSE]})\\.(${h[m.NUMERICIDENTIFIERLOOSE]})`),V("PRERELEASEIDENTIFIER",`(?:${h[m.NUMERICIDENTIFIER]}|${h[m.NONNUMERICIDENTIFIER]})`),V("PRERELEASEIDENTIFIERLOOSE",`(?:${h[m.NUMERICIDENTIFIERLOOSE]}|${h[m.NONNUMERICIDENTIFIER]})`),V("PRERELEASE",`(?:-(${h[m.PRERELEASEIDENTIFIER]}(?:\\.${h[m.PRERELEASEIDENTIFIER]})*))`),V("PRERELEASELOOSE",`(?:-?(${h[m.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${h[m.PRERELEASEIDENTIFIERLOOSE]})*))`),V("BUILDIDENTIFIER",`${S}+`),V("BUILD",`(?:\\+(${h[m.BUILDIDENTIFIER]}(?:\\.${h[m.BUILDIDENTIFIER]})*))`),V("FULLPLAIN",`v?${h[m.MAINVERSION]}${h[m.PRERELEASE]}?${h[m.BUILD]}?`),V("FULL",`^${h[m.FULLPLAIN]}$`),V("LOOSEPLAIN",`[v=\\s]*${h[m.MAINVERSIONLOOSE]}${h[m.PRERELEASELOOSE]}?${h[m.BUILD]}?`),V("LOOSE",`^${h[m.LOOSEPLAIN]}$`),V("GTLT","((?:<|>)?=?)"),V("XRANGEIDENTIFIERLOOSE",`${h[m.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),V("XRANGEIDENTIFIER",`${h[m.NUMERICIDENTIFIER]}|x|X|\\*`),V("XRANGEPLAIN",`[v=\\s]*(${h[m.XRANGEIDENTIFIER]})(?:\\.(${h[m.XRANGEIDENTIFIER]})(?:\\.(${h[m.XRANGEIDENTIFIER]})(?:${h[m.PRERELEASE]})?${h[m.BUILD]}?)?)?`),V("XRANGEPLAINLOOSE",`[v=\\s]*(${h[m.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[m.XRANGEIDENTIFIERLOOSE]})(?:\\.(${h[m.XRANGEIDENTIFIERLOOSE]})(?:${h[m.PRERELEASELOOSE]})?${h[m.BUILD]}?)?)?`),V("XRANGE",`^${h[m.GTLT]}\\s*${h[m.XRANGEPLAIN]}$`),V("XRANGELOOSE",`^${h[m.GTLT]}\\s*${h[m.XRANGEPLAINLOOSE]}$`),V("COERCE",`(^|[^\\d])(\\d{1,${u}})(?:\\.(\\d{1,${u}}))?(?:\\.(\\d{1,${u}}))?(?:$|[^\\d])`),V("COERCERTL",h[m.COERCE],!0),V("LONETILDE","(?:~>?)"),V("TILDETRIM",`(\\s*)${h[m.LONETILDE]}\\s+`,!0),i.tildeTrimReplace="$1~",V("TILDE",`^${h[m.LONETILDE]}${h[m.XRANGEPLAIN]}$`),V("TILDELOOSE",`^${h[m.LONETILDE]}${h[m.XRANGEPLAINLOOSE]}$`),V("LONECARET","(?:\\^)"),V("CARETTRIM",`(\\s*)${h[m.LONECARET]}\\s+`,!0),i.caretTrimReplace="$1^",V("CARET",`^${h[m.LONECARET]}${h[m.XRANGEPLAIN]}$`),V("CARETLOOSE",`^${h[m.LONECARET]}${h[m.XRANGEPLAINLOOSE]}$`),V("COMPARATORLOOSE",`^${h[m.GTLT]}\\s*(${h[m.LOOSEPLAIN]})$|^$`),V("COMPARATOR",`^${h[m.GTLT]}\\s*(${h[m.FULLPLAIN]})$|^$`),V("COMPARATORTRIM",`(\\s*)${h[m.GTLT]}\\s*(${h[m.LOOSEPLAIN]}|${h[m.XRANGEPLAIN]})`,!0),i.comparatorTrimReplace="$1$2$3",V("HYPHENRANGE",`^\\s*(${h[m.XRANGEPLAIN]})\\s+-\\s+(${h[m.XRANGEPLAIN]})\\s*$`),V("HYPHENRANGELOOSE",`^\\s*(${h[m.XRANGEPLAINLOOSE]})\\s+-\\s+(${h[m.XRANGEPLAINLOOSE]})\\s*$`),V("STAR","(<|>)?=?\\s*\\*"),V("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),V("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(zl,zl.exports)),zl.exports}var qf,eg;function Lc(){if(eg)return qf;eg=1;const r=Object.freeze({loose:!0}),i=Object.freeze({});return qf=l=>l?typeof l!="object"?r:l:i,qf}var Cf,tg;function Ev(){if(tg)return Cf;tg=1;const r=/^[0-9]+$/,i=(l,c)=>{const o=r.test(l),d=r.test(c);return o&&d&&(l=+l,c=+c),l===c?0:o&&!d?-1:d&&!o?1:li(c,l)},Cf}var zf,ng;function wt(){if(ng)return zf;ng=1;const r=eu(),{MAX_LENGTH:i,MAX_SAFE_INTEGER:u}=Wl(),{safeRe:l,t:c}=zi(),o=Lc(),{compareIdentifiers:d}=Ev();class h{constructor(y,S){if(S=o(S),y instanceof h){if(y.loose===!!S.loose&&y.includePrerelease===!!S.includePrerelease)return y;y=y.version}else if(typeof y!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof y}".`);if(y.length>i)throw new TypeError(`version is longer than ${i} characters`);r("SemVer",y,S),this.options=S,this.loose=!!S.loose,this.includePrerelease=!!S.includePrerelease;const N=y.trim().match(S.loose?l[c.LOOSE]:l[c.FULL]);if(!N)throw new TypeError(`Invalid Version: ${y}`);if(this.raw=y,this.major=+N[1],this.minor=+N[2],this.patch=+N[3],this.major>u||this.major<0)throw new TypeError("Invalid major version");if(this.minor>u||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>u||this.patch<0)throw new TypeError("Invalid patch version");N[4]?this.prerelease=N[4].split(".").map(x=>{if(/^[0-9]+$/.test(x)){const V=+x;if(V>=0&&V=0;)typeof this.prerelease[V]=="number"&&(this.prerelease[V]++,V=-2);if(V===-1){if(S===this.prerelease.join(".")&&N===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(x)}}if(S){let V=[S,x];N===!1&&(V=[S]),d(this.prerelease[0],S)===0?isNaN(this.prerelease[1])&&(this.prerelease=V):this.prerelease=V}break}default:throw new Error(`invalid increment argument: ${y}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return zf=h,zf}var Uf,rg;function Oa(){if(rg)return Uf;rg=1;const r=wt();return Uf=(u,l,c=!1)=>{if(u instanceof r)return u;try{return new r(u,l)}catch(o){if(!c)return null;throw o}},Uf}var Lf,ag;function IE(){if(ag)return Lf;ag=1;const r=Oa();return Lf=(u,l)=>{const c=r(u,l);return c?c.version:null},Lf}var Vf,ig;function YE(){if(ig)return Vf;ig=1;const r=Oa();return Vf=(u,l)=>{const c=r(u.trim().replace(/^[=v]+/,""),l);return c?c.version:null},Vf}var xf,sg;function kE(){if(sg)return xf;sg=1;const r=wt();return xf=(u,l,c,o,d)=>{typeof c=="string"&&(d=o,o=c,c=void 0);try{return new r(u instanceof r?u.version:u,c).inc(l,o,d).version}catch{return null}},xf}var Bf,lg;function PE(){if(lg)return Bf;lg=1;const r=Oa();return Bf=(u,l)=>{const c=r(u,null,!0),o=r(l,null,!0),d=c.compare(o);if(d===0)return null;const h=d>0,m=h?c:o,y=h?o:c,S=!!m.prerelease.length;if(!!y.prerelease.length&&!S)return!y.patch&&!y.minor?"major":m.patch?"patch":m.minor?"minor":"major";const x=S?"pre":"";return c.major!==o.major?x+"major":c.minor!==o.minor?x+"minor":c.patch!==o.patch?x+"patch":"prerelease"},Bf}var Hf,ug;function KE(){if(ug)return Hf;ug=1;const r=wt();return Hf=(u,l)=>new r(u,l).major,Hf}var Gf,og;function XE(){if(og)return Gf;og=1;const r=wt();return Gf=(u,l)=>new r(u,l).minor,Gf}var If,fg;function QE(){if(fg)return If;fg=1;const r=wt();return If=(u,l)=>new r(u,l).patch,If}var Yf,cg;function ZE(){if(cg)return Yf;cg=1;const r=Oa();return Yf=(u,l)=>{const c=r(u,l);return c&&c.prerelease.length?c.prerelease:null},Yf}var kf,dg;function sn(){if(dg)return kf;dg=1;const r=wt();return kf=(u,l,c)=>new r(u,c).compare(new r(l,c)),kf}var Pf,hg;function JE(){if(hg)return Pf;hg=1;const r=sn();return Pf=(u,l,c)=>r(l,u,c),Pf}var Kf,mg;function FE(){if(mg)return Kf;mg=1;const r=sn();return Kf=(u,l)=>r(u,l,!0),Kf}var Xf,pg;function Vc(){if(pg)return Xf;pg=1;const r=wt();return Xf=(u,l,c)=>{const o=new r(u,c),d=new r(l,c);return o.compare(d)||o.compareBuild(d)},Xf}var Qf,yg;function WE(){if(yg)return Qf;yg=1;const r=Vc();return Qf=(u,l)=>u.sort((c,o)=>r(c,o,l)),Qf}var Zf,gg;function e_(){if(gg)return Zf;gg=1;const r=Vc();return Zf=(u,l)=>u.sort((c,o)=>r(o,c,l)),Zf}var Jf,vg;function tu(){if(vg)return Jf;vg=1;const r=sn();return Jf=(u,l,c)=>r(u,l,c)>0,Jf}var Ff,bg;function xc(){if(bg)return Ff;bg=1;const r=sn();return Ff=(u,l,c)=>r(u,l,c)<0,Ff}var Wf,Eg;function _v(){if(Eg)return Wf;Eg=1;const r=sn();return Wf=(u,l,c)=>r(u,l,c)===0,Wf}var ec,_g;function Sv(){if(_g)return ec;_g=1;const r=sn();return ec=(u,l,c)=>r(u,l,c)!==0,ec}var tc,Sg;function Bc(){if(Sg)return tc;Sg=1;const r=sn();return tc=(u,l,c)=>r(u,l,c)>=0,tc}var nc,wg;function Hc(){if(wg)return nc;wg=1;const r=sn();return nc=(u,l,c)=>r(u,l,c)<=0,nc}var rc,$g;function wv(){if($g)return rc;$g=1;const r=_v(),i=Sv(),u=tu(),l=Bc(),c=xc(),o=Hc();return rc=(h,m,y,S)=>{switch(m){case"===":return typeof h=="object"&&(h=h.version),typeof y=="object"&&(y=y.version),h===y;case"!==":return typeof h=="object"&&(h=h.version),typeof y=="object"&&(y=y.version),h!==y;case"":case"=":case"==":return r(h,y,S);case"!=":return i(h,y,S);case">":return u(h,y,S);case">=":return l(h,y,S);case"<":return c(h,y,S);case"<=":return o(h,y,S);default:throw new TypeError(`Invalid operator: ${m}`)}},rc}var ac,Og;function t_(){if(Og)return ac;Og=1;const r=wt(),i=Oa(),{safeRe:u,t:l}=zi();return ac=(o,d)=>{if(o instanceof r)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;d=d||{};let h=null;if(!d.rtl)h=o.match(u[l.COERCE]);else{let m;for(;(m=u[l.COERCERTL].exec(o))&&(!h||h.index+h[0].length!==o.length);)(!h||m.index+m[0].length!==h.index+h[0].length)&&(h=m),u[l.COERCERTL].lastIndex=m.index+m[1].length+m[2].length;u[l.COERCERTL].lastIndex=-1}return h===null?null:i(`${h[2]}.${h[3]||"0"}.${h[4]||"0"}`,d)},ac}var ic,Ag;function n_(){return Ag||(Ag=1,ic=function(r){r.prototype[Symbol.iterator]=function*(){for(let i=this.head;i;i=i.next)yield i.value}}),ic}var sc,Rg;function r_(){if(Rg)return sc;Rg=1,sc=r,r.Node=c,r.create=r;function r(o){var d=this;if(d instanceof r||(d=new r),d.tail=null,d.head=null,d.length=0,o&&typeof o.forEach=="function")o.forEach(function(y){d.push(y)});else if(arguments.length>0)for(var h=0,m=arguments.length;h1)h=d;else if(this.head)m=this.head.next,h=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var y=0;m!==null;y++)h=o(h,m.value,y),m=m.next;return h},r.prototype.reduceReverse=function(o,d){var h,m=this.tail;if(arguments.length>1)h=d;else if(this.tail)m=this.tail.prev,h=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var y=this.length-1;m!==null;y--)h=o(h,m.value,y),m=m.prev;return h},r.prototype.toArray=function(){for(var o=new Array(this.length),d=0,h=this.head;h!==null;d++)o[d]=h.value,h=h.next;return o},r.prototype.toArrayReverse=function(){for(var o=new Array(this.length),d=0,h=this.tail;h!==null;d++)o[d]=h.value,h=h.prev;return o},r.prototype.slice=function(o,d){d=d||this.length,d<0&&(d+=this.length),o=o||0,o<0&&(o+=this.length);var h=new r;if(dthis.length&&(d=this.length);for(var m=0,y=this.head;y!==null&&mthis.length&&(d=this.length);for(var m=this.length,y=this.tail;y!==null&&m>d;m--)y=y.prev;for(;y!==null&&m>o;m--,y=y.prev)h.push(y.value);return h},r.prototype.splice=function(o,d,...h){o>this.length&&(o=this.length-1),o<0&&(o=this.length+o);for(var m=0,y=this.head;y!==null&&m1;class x{constructor(E){if(typeof E=="number"&&(E={max:E}),E||(E={}),E.max&&(typeof E.max!="number"||E.max<0))throw new TypeError("max must be a non-negative number");this[i]=E.max||1/0;const O=E.length||N;if(this[l]=typeof O!="function"?N:O,this[c]=E.stale||!1,E.maxAge&&typeof E.maxAge!="number")throw new TypeError("maxAge must be a number");this[o]=E.maxAge||0,this[d]=E.dispose,this[h]=E.noDisposeOnSet||!1,this[S]=E.updateAgeOnGet||!1,this.reset()}set max(E){if(typeof E!="number"||E<0)throw new TypeError("max must be a non-negative number");this[i]=E||1/0,C(this)}get max(){return this[i]}set allowStale(E){this[c]=!!E}get allowStale(){return this[c]}set maxAge(E){if(typeof E!="number")throw new TypeError("maxAge must be a non-negative number");this[o]=E,C(this)}get maxAge(){return this[o]}set lengthCalculator(E){typeof E!="function"&&(E=N),E!==this[l]&&(this[l]=E,this[u]=0,this[m].forEach(O=>{O.length=this[l](O.value,O.key),this[u]+=O.length})),C(this)}get lengthCalculator(){return this[l]}get length(){return this[u]}get itemCount(){return this[m].length}rforEach(E,O){O=O||this;for(let v=this[m].tail;v!==null;){const A=v.prev;p(this,E,v,O),v=A}}forEach(E,O){O=O||this;for(let v=this[m].head;v!==null;){const A=v.next;p(this,E,v,O),v=A}}keys(){return this[m].toArray().map(E=>E.key)}values(){return this[m].toArray().map(E=>E.value)}reset(){this[d]&&this[m]&&this[m].length&&this[m].forEach(E=>this[d](E.key,E.value)),this[y]=new Map,this[m]=new r,this[u]=0}dump(){return this[m].map(E=>L(this,E)?!1:{k:E.key,v:E.value,e:E.now+(E.maxAge||0)}).toArray().filter(E=>E)}dumpLru(){return this[m]}set(E,O,v){if(v=v||this[o],v&&typeof v!="number")throw new TypeError("maxAge must be a number");const A=v?Date.now():0,$=this[l](O,E);if(this[y].has(E)){if($>this[i])return g(this,this[y].get(E)),!1;const Y=this[y].get(E).value;return this[d]&&(this[h]||this[d](E,Y.value)),Y.now=A,Y.maxAge=v,Y.value=O,this[u]+=$-Y.length,Y.length=$,this.get(E),C(this),!0}const D=new w(E,O,$,A,v);return D.length>this[i]?(this[d]&&this[d](E,O),!1):(this[u]+=D.length,this[m].unshift(D),this[y].set(E,this[m].head),C(this),!0)}has(E){if(!this[y].has(E))return!1;const O=this[y].get(E).value;return!L(this,O)}get(E){return V(this,E,!0)}peek(E){return V(this,E,!1)}pop(){const E=this[m].tail;return E?(g(this,E),E.value):null}del(E){g(this,this[y].get(E))}load(E){this.reset();const O=Date.now();for(let v=E.length-1;v>=0;v--){const A=E[v],$=A.e||0;if($===0)this.set(A.k,A.v);else{const D=$-O;D>0&&this.set(A.k,A.v,D)}}}prune(){this[y].forEach((E,O)=>V(this,O,!1))}}const V=(b,E,O)=>{const v=b[y].get(E);if(v){const A=v.value;if(L(b,A)){if(g(b,v),!b[c])return}else O&&(b[S]&&(v.value.now=Date.now()),b[m].unshiftNode(v));return A.value}},L=(b,E)=>{if(!E||!E.maxAge&&!b[o])return!1;const O=Date.now()-E.now;return E.maxAge?O>E.maxAge:b[o]&&O>b[o]},C=b=>{if(b[u]>b[i])for(let E=b[m].tail;b[u]>b[i]&&E!==null;){const O=E.prev;g(b,E),E=O}},g=(b,E)=>{if(E){const O=E.value;b[d]&&b[d](O.key,O.value),b[u]-=O.length,b[y].delete(O.key),b[m].removeNode(E)}};class w{constructor(E,O,v,A,$){this.key=E,this.value=O,this.length=v,this.now=A,this.maxAge=$||0}}const p=(b,E,O,v)=>{let A=O.value;L(b,A)&&(g(b,O),b[c]||(A=void 0)),A&&E.call(v,A.value,A.key,b)};return lc=x,lc}var uc,Ng;function ln(){if(Ng)return uc;Ng=1;class r{constructor(F,ne){if(ne=l(ne),F instanceof r)return F.loose===!!ne.loose&&F.includePrerelease===!!ne.includePrerelease?F:new r(F.raw,ne);if(F instanceof c)return this.raw=F.value,this.set=[[F]],this.format(),this;if(this.options=ne,this.loose=!!ne.loose,this.includePrerelease=!!ne.includePrerelease,this.raw=F.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(P=>this.parseRange(P)).filter(P=>P.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const P=this.set[0];if(this.set=this.set.filter(ue=>!L(ue[0])),this.set.length===0)this.set=[P];else if(this.set.length>1){for(const ue of this.set)if(ue.length===1&&C(ue[0])){this.set=[ue];break}}}this.format()}format(){return this.range=this.set.map(F=>F.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(F){const P=((this.options.includePrerelease&&x)|(this.options.loose&&V))+":"+F,ue=u.get(P);if(ue)return ue;const re=this.options.loose,de=re?h[m.HYPHENRANGELOOSE]:h[m.HYPHENRANGE];F=F.replace(de,Y(this.options.includePrerelease)),o("hyphen replace",F),F=F.replace(h[m.COMPARATORTRIM],y),o("comparator trim",F),F=F.replace(h[m.TILDETRIM],S),o("tilde trim",F),F=F.replace(h[m.CARETTRIM],N),o("caret trim",F);let R=F.split(" ").map(T=>w(T,this.options)).join(" ").split(/\s+/).map(T=>j(T,this.options));re&&(R=R.filter(T=>(o("loose invalid filter",T,this.options),!!T.match(h[m.COMPARATORLOOSE])))),o("range list",R);const z=new Map,K=R.map(T=>new c(T,this.options));for(const T of K){if(L(T))return[T];z.set(T.value,T)}z.size>1&&z.has("")&&z.delete("");const k=[...z.values()];return u.set(P,k),k}intersects(F,ne){if(!(F instanceof r))throw new TypeError("a Range is required");return this.set.some(P=>g(P,ne)&&F.set.some(ue=>g(ue,ne)&&P.every(re=>ue.every(de=>re.intersects(de,ne)))))}test(F){if(!F)return!1;if(typeof F=="string")try{F=new d(F,this.options)}catch{return!1}for(let ne=0;neW.value==="<0.0.0-0",C=W=>W.value==="",g=(W,F)=>{let ne=!0;const P=W.slice();let ue=P.pop();for(;ne&&P.length;)ne=P.every(re=>ue.intersects(re,F)),ue=P.pop();return ne},w=(W,F)=>(o("comp",W,F),W=O(W,F),o("caret",W),W=b(W,F),o("tildes",W),W=A(W,F),o("xrange",W),W=D(W,F),o("stars",W),W),p=W=>!W||W.toLowerCase()==="x"||W==="*",b=(W,F)=>W.trim().split(/\s+/).map(ne=>E(ne,F)).join(" "),E=(W,F)=>{const ne=F.loose?h[m.TILDELOOSE]:h[m.TILDE];return W.replace(ne,(P,ue,re,de,R)=>{o("tilde",W,P,ue,re,de,R);let z;return p(ue)?z="":p(re)?z=`>=${ue}.0.0 <${+ue+1}.0.0-0`:p(de)?z=`>=${ue}.${re}.0 <${ue}.${+re+1}.0-0`:R?(o("replaceTilde pr",R),z=`>=${ue}.${re}.${de}-${R} <${ue}.${+re+1}.0-0`):z=`>=${ue}.${re}.${de} <${ue}.${+re+1}.0-0`,o("tilde return",z),z})},O=(W,F)=>W.trim().split(/\s+/).map(ne=>v(ne,F)).join(" "),v=(W,F)=>{o("caret",W,F);const ne=F.loose?h[m.CARETLOOSE]:h[m.CARET],P=F.includePrerelease?"-0":"";return W.replace(ne,(ue,re,de,R,z)=>{o("caret",W,ue,re,de,R,z);let K;return p(re)?K="":p(de)?K=`>=${re}.0.0${P} <${+re+1}.0.0-0`:p(R)?re==="0"?K=`>=${re}.${de}.0${P} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.0${P} <${+re+1}.0.0-0`:z?(o("replaceCaret pr",z),re==="0"?de==="0"?K=`>=${re}.${de}.${R}-${z} <${re}.${de}.${+R+1}-0`:K=`>=${re}.${de}.${R}-${z} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.${R}-${z} <${+re+1}.0.0-0`):(o("no pr"),re==="0"?de==="0"?K=`>=${re}.${de}.${R}${P} <${re}.${de}.${+R+1}-0`:K=`>=${re}.${de}.${R}${P} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.${R} <${+re+1}.0.0-0`),o("caret return",K),K})},A=(W,F)=>(o("replaceXRanges",W,F),W.split(/\s+/).map(ne=>$(ne,F)).join(" ")),$=(W,F)=>{W=W.trim();const ne=F.loose?h[m.XRANGELOOSE]:h[m.XRANGE];return W.replace(ne,(P,ue,re,de,R,z)=>{o("xRange",W,P,ue,re,de,R,z);const K=p(re),k=K||p(de),T=k||p(R),H=T;return ue==="="&&H&&(ue=""),z=F.includePrerelease?"-0":"",K?ue===">"||ue==="<"?P="<0.0.0-0":P="*":ue&&H?(k&&(de=0),R=0,ue===">"?(ue=">=",k?(re=+re+1,de=0,R=0):(de=+de+1,R=0)):ue==="<="&&(ue="<",k?re=+re+1:de=+de+1),ue==="<"&&(z="-0"),P=`${ue+re}.${de}.${R}${z}`):k?P=`>=${re}.0.0${z} <${+re+1}.0.0-0`:T&&(P=`>=${re}.${de}.0${z} <${re}.${+de+1}.0-0`),o("xRange return",P),P})},D=(W,F)=>(o("replaceStars",W,F),W.trim().replace(h[m.STAR],"")),j=(W,F)=>(o("replaceGTE0",W,F),W.trim().replace(h[F.includePrerelease?m.GTE0PRE:m.GTE0],"")),Y=W=>(F,ne,P,ue,re,de,R,z,K,k,T,H,te)=>(p(P)?ne="":p(ue)?ne=`>=${P}.0.0${W?"-0":""}`:p(re)?ne=`>=${P}.${ue}.0${W?"-0":""}`:de?ne=`>=${ne}`:ne=`>=${ne}${W?"-0":""}`,p(K)?z="":p(k)?z=`<${+K+1}.0.0-0`:p(T)?z=`<${K}.${+k+1}.0-0`:H?z=`<=${K}.${k}.${T}-${H}`:W?z=`<${K}.${k}.${+T+1}-0`:z=`<=${z}`,`${ne} ${z}`.trim()),Q=(W,F,ne)=>{for(let P=0;P0){const ue=W[P].semver;if(ue.major===F.major&&ue.minor===F.minor&&ue.patch===F.patch)return!0}return!1}return!0};return uc}var oc,jg;function nu(){if(jg)return oc;jg=1;const r=Symbol("SemVer ANY");class i{static get ANY(){return r}constructor(S,N){if(N=u(N),S instanceof i){if(S.loose===!!N.loose)return S;S=S.value}S=S.trim().split(/\s+/).join(" "),d("comparator",S,N),this.options=N,this.loose=!!N.loose,this.parse(S),this.semver===r?this.value="":this.value=this.operator+this.semver.version,d("comp",this)}parse(S){const N=this.options.loose?l[c.COMPARATORLOOSE]:l[c.COMPARATOR],x=S.match(N);if(!x)throw new TypeError(`Invalid comparator: ${S}`);this.operator=x[1]!==void 0?x[1]:"",this.operator==="="&&(this.operator=""),x[2]?this.semver=new h(x[2],this.options.loose):this.semver=r}toString(){return this.value}test(S){if(d("Comparator.test",S,this.options.loose),this.semver===r||S===r)return!0;if(typeof S=="string")try{S=new h(S,this.options)}catch{return!1}return o(S,this.operator,this.semver,this.options)}intersects(S,N){if(!(S instanceof i))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new m(S.value,N).test(this.value):S.operator===""?S.value===""?!0:new m(this.value,N).test(S.semver):(N=u(N),N.includePrerelease&&(this.value==="<0.0.0-0"||S.value==="<0.0.0-0")||!N.includePrerelease&&(this.value.startsWith("<0.0.0")||S.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&S.operator.startsWith(">")||this.operator.startsWith("<")&&S.operator.startsWith("<")||this.semver.version===S.semver.version&&this.operator.includes("=")&&S.operator.includes("=")||o(this.semver,"<",S.semver,N)&&this.operator.startsWith(">")&&S.operator.startsWith("<")||o(this.semver,">",S.semver,N)&&this.operator.startsWith("<")&&S.operator.startsWith(">")))}}oc=i;const u=Lc(),{safeRe:l,t:c}=zi(),o=wv(),d=eu(),h=wt(),m=ln();return oc}var fc,Dg;function ru(){if(Dg)return fc;Dg=1;const r=ln();return fc=(u,l,c)=>{try{l=new r(l,c)}catch{return!1}return l.test(u)},fc}var cc,Mg;function i_(){if(Mg)return cc;Mg=1;const r=ln();return cc=(u,l)=>new r(u,l).set.map(c=>c.map(o=>o.value).join(" ").trim().split(" ")),cc}var dc,qg;function s_(){if(qg)return dc;qg=1;const r=wt(),i=ln();return dc=(l,c,o)=>{let d=null,h=null,m=null;try{m=new i(c,o)}catch{return null}return l.forEach(y=>{m.test(y)&&(!d||h.compare(y)===-1)&&(d=y,h=new r(d,o))}),d},dc}var hc,Cg;function l_(){if(Cg)return hc;Cg=1;const r=wt(),i=ln();return hc=(l,c,o)=>{let d=null,h=null,m=null;try{m=new i(c,o)}catch{return null}return l.forEach(y=>{m.test(y)&&(!d||h.compare(y)===1)&&(d=y,h=new r(d,o))}),d},hc}var mc,zg;function u_(){if(zg)return mc;zg=1;const r=wt(),i=ln(),u=tu();return mc=(c,o)=>{c=new i(c,o);let d=new r("0.0.0");if(c.test(d)||(d=new r("0.0.0-0"),c.test(d)))return d;d=null;for(let h=0;h{const N=new r(S.semver.version);switch(S.operator){case">":N.prerelease.length===0?N.patch++:N.prerelease.push(0),N.raw=N.format();case"":case">=":(!y||u(N,y))&&(y=N);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${S.operator}`)}}),y&&(!d||u(d,y))&&(d=y)}return d&&c.test(d)?d:null},mc}var pc,Ug;function o_(){if(Ug)return pc;Ug=1;const r=ln();return pc=(u,l)=>{try{return new r(u,l).range||"*"}catch{return null}},pc}var yc,Lg;function Gc(){if(Lg)return yc;Lg=1;const r=wt(),i=nu(),{ANY:u}=i,l=ln(),c=ru(),o=tu(),d=xc(),h=Hc(),m=Bc();return yc=(S,N,x,V)=>{S=new r(S,V),N=new l(N,V);let L,C,g,w,p;switch(x){case">":L=o,C=h,g=d,w=">",p=">=";break;case"<":L=d,C=m,g=o,w="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(c(S,N,V))return!1;for(let b=0;b{A.semver===u&&(A=new i(">=0.0.0")),O=O||A,v=v||A,L(A.semver,O.semver,V)?O=A:g(A.semver,v.semver,V)&&(v=A)}),O.operator===w||O.operator===p||(!v.operator||v.operator===w)&&C(S,v.semver))return!1;if(v.operator===p&&g(S,v.semver))return!1}return!0},yc}var gc,Vg;function f_(){if(Vg)return gc;Vg=1;const r=Gc();return gc=(u,l,c)=>r(u,l,">",c),gc}var vc,xg;function c_(){if(xg)return vc;xg=1;const r=Gc();return vc=(u,l,c)=>r(u,l,"<",c),vc}var bc,Bg;function d_(){if(Bg)return bc;Bg=1;const r=ln();return bc=(u,l,c)=>(u=new r(u,c),l=new r(l,c),u.intersects(l,c)),bc}var Ec,Hg;function h_(){if(Hg)return Ec;Hg=1;const r=ru(),i=sn();return Ec=(u,l,c)=>{const o=[];let d=null,h=null;const m=u.sort((x,V)=>i(x,V,c));for(const x of m)r(x,l,c)?(h=x,d||(d=x)):(h&&o.push([d,h]),h=null,d=null);d&&o.push([d,null]);const y=[];for(const[x,V]of o)x===V?y.push(x):!V&&x===m[0]?y.push("*"):V?x===m[0]?y.push(`<=${V}`):y.push(`${x} - ${V}`):y.push(`>=${x}`);const S=y.join(" || "),N=typeof l.raw=="string"?l.raw:String(l);return S.length{if(N===x)return!0;N=new r(N,V),x=new r(x,V);let L=!1;e:for(const C of N.set){for(const g of x.set){const w=m(C,g,V);if(L=L||w!==null,w)continue e}if(L)return!1}return!0},d=[new i(">=0.0.0-0")],h=[new i(">=0.0.0")],m=(N,x,V)=>{if(N===x)return!0;if(N.length===1&&N[0].semver===u){if(x.length===1&&x[0].semver===u)return!0;V.includePrerelease?N=d:N=h}if(x.length===1&&x[0].semver===u){if(V.includePrerelease)return!0;x=h}const L=new Set;let C,g;for(const $ of N)$.operator===">"||$.operator===">="?C=y(C,$,V):$.operator==="<"||$.operator==="<="?g=S(g,$,V):L.add($.semver);if(L.size>1)return null;let w;if(C&&g){if(w=c(C.semver,g.semver,V),w>0)return null;if(w===0&&(C.operator!==">="||g.operator!=="<="))return null}for(const $ of L){if(C&&!l($,String(C),V)||g&&!l($,String(g),V))return null;for(const D of x)if(!l($,String(D),V))return!1;return!0}let p,b,E,O,v=g&&!V.includePrerelease&&g.semver.prerelease.length?g.semver:!1,A=C&&!V.includePrerelease&&C.semver.prerelease.length?C.semver:!1;v&&v.prerelease.length===1&&g.operator==="<"&&v.prerelease[0]===0&&(v=!1);for(const $ of x){if(O=O||$.operator===">"||$.operator===">=",E=E||$.operator==="<"||$.operator==="<=",C){if(A&&$.semver.prerelease&&$.semver.prerelease.length&&$.semver.major===A.major&&$.semver.minor===A.minor&&$.semver.patch===A.patch&&(A=!1),$.operator===">"||$.operator===">="){if(p=y(C,$,V),p===$&&p!==C)return!1}else if(C.operator===">="&&!l(C.semver,String($),V))return!1}if(g){if(v&&$.semver.prerelease&&$.semver.prerelease.length&&$.semver.major===v.major&&$.semver.minor===v.minor&&$.semver.patch===v.patch&&(v=!1),$.operator==="<"||$.operator==="<="){if(b=S(g,$,V),b===$&&b!==g)return!1}else if(g.operator==="<="&&!l(g.semver,String($),V))return!1}if(!$.operator&&(g||C)&&w!==0)return!1}return!(C&&E&&!g&&w!==0||g&&O&&!C&&w!==0||A||v)},y=(N,x,V)=>{if(!N)return x;const L=c(N.semver,x.semver,V);return L>0?N:L<0||x.operator===">"&&N.operator===">="?x:N},S=(N,x,V)=>{if(!N)return x;const L=c(N.semver,x.semver,V);return L<0?N:L>0||x.operator==="<"&&N.operator==="<="?x:N};return _c=o,_c}var Sc,Ig;function p_(){if(Ig)return Sc;Ig=1;const r=zi(),i=Wl(),u=wt(),l=Ev(),c=Oa(),o=IE(),d=YE(),h=kE(),m=PE(),y=KE(),S=XE(),N=QE(),x=ZE(),V=sn(),L=JE(),C=FE(),g=Vc(),w=WE(),p=e_(),b=tu(),E=xc(),O=_v(),v=Sv(),A=Bc(),$=Hc(),D=wv(),j=t_(),Y=nu(),Q=ln(),W=ru(),F=i_(),ne=s_(),P=l_(),ue=u_(),re=o_(),de=Gc(),R=f_(),z=c_(),K=d_(),k=h_(),T=m_();return Sc={parse:c,valid:o,clean:d,inc:h,diff:m,major:y,minor:S,patch:N,prerelease:x,compare:V,rcompare:L,compareLoose:C,compareBuild:g,sort:w,rsort:p,gt:b,lt:E,eq:O,neq:v,gte:A,lte:$,cmp:D,coerce:j,Comparator:Y,Range:Q,satisfies:W,toComparators:F,maxSatisfying:ne,minSatisfying:P,minVersion:ue,validRange:re,outside:de,gtr:R,ltr:z,intersects:K,simplifyRange:k,subset:T,SemVer:u,re:r.re,src:r.src,tokens:r.t,SEMVER_SPEC_VERSION:i.SEMVER_SPEC_VERSION,RELEASE_TYPES:i.RELEASE_TYPES,compareIdentifiers:l.compareIdentifiers,rcompareIdentifiers:l.rcompareIdentifiers},Sc}var wc=p_(),$c={exports:{}};/** +`)},_domwindow:function(){return M("domwindow")},_bigint:function(j){return M("bigint:"+j.toString())},_process:function(){return M("process")},_timer:function(){return M("timer")},_pipe:function(){return M("pipe")},_tcp:function(){return M("tcp")},_udp:function(){return M("udp")},_tty:function(){return M("tty")},_statwatcher:function(){return M("statwatcher")},_securecontext:function(){return M("securecontext")},_connection:function(){return M("connection")},_zlib:function(){return M("zlib")},_context:function(){return M("context")},_nodescript:function(){return M("nodescript")},_httpparser:function(){return M("httpparser")},_dataview:function(){return M("dataview")},_signal:function(){return M("signal")},_fsevent:function(){return M("fsevent")},_tlswrap:function(){return M("tlswrap")}}}function O(){return{buf:"",write:function(b){this.buf+=b},end:function(b){this.buf+=b},read:function(){return this.buf}}}s.writeToStream=function(b,T,$){return $===void 0&&($=T,T={}),_(T=g(b,T),$).dispatch(b)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/fake_9a5aa49d.js","/")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(u,l,s){(function(o,c,d,p,m,v,S,q,C){(function(U){var D=typeof Uint8Array<"u"?Uint8Array:Array,y=43,A=47,g=48,E=97,_=65,O=45,b=95;function T($){return $=$.charCodeAt(0),$===y||$===O?62:$===A||$===b?63:$>16),ne((65280&j)>>8),ne(255&j);return G==2?ne(255&(j=T($.charAt(M))<<2|T($.charAt(M+1))>>4)):G==1&&(ne((j=T($.charAt(M))<<10|T($.charAt(M+1))<<4|T($.charAt(M+2))>>2)>>8&255),ne(255&j)),X},U.fromByteArray=function($){var M,j,G,X,W=$.length%3,J="";function ne(P){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(P)}for(M=0,G=$.length-W;M>18&63)+ne(X>>12&63)+ne(X>>6&63)+ne(63&X);switch(W){case 1:J=(J+=ne((j=$[$.length-1])>>2))+ne(j<<4&63)+"==";break;case 2:J=(J=(J+=ne((j=($[$.length-2]<<8)+$[$.length-1])>>10))+ne(j>>4&63))+ne(j<<2&63)+"="}return J}})(s===void 0?this.base64js={}:s)}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:11}],3:[function(u,l,s){(function(o,c,y,p,m,v,S,q,C){var U=u("base64-js"),D=u("ieee754");function y(x,B,L){if(!(this instanceof y))return new y(x,B,L);var V,F,le,pe,ge=typeof x;if(B==="base64"&&ge=="string")for(x=(pe=x).trim?pe.trim():pe.replace(/^\s+|\s+$/g,"");x.length%4!=0;)x+="=";if(ge=="number")V=re(x);else if(ge=="string")V=y.byteLength(x,B);else{if(ge!="object")throw new Error("First argument needs to be a number, array or string.");V=re(x.length)}if(y._useTypedArrays?F=y._augment(new Uint8Array(V)):((F=this).length=V,F._isBuffer=!0),y._useTypedArrays&&typeof x.byteLength=="number")F._set(x);else if(de(pe=x)||y.isBuffer(pe)||pe&&typeof pe=="object"&&typeof pe.length=="number")for(le=0;le>8,pe=pe%256,ge.push(pe),ge.push(le);return ge}(B),x,L,V)}function E(x,B,L){var V="";L=Math.min(x.length,L);for(var F=B;F>>0)):(B+1>>0),F}function b(x,B,L,V){if(V||(ie(typeof L=="boolean","missing or invalid endian"),ie(B!=null,"missing offset"),ie(B+1>>8*(V?le:1-le)}function G(x,B,L,V,F){if(F||(ie(B!=null,"missing value"),ie(typeof V=="boolean","missing or invalid endian"),ie(L!=null,"missing offset"),ie(L+3>>8*(V?le:3-le)&255}function X(x,B,L,V,F){F||(ie(B!=null,"missing value"),ie(typeof V=="boolean","missing or invalid endian"),ie(L!=null,"missing offset"),ie(L+1this.length&&(V=this.length);var F=(V=x.length-B=this.length))return this[x]},y.prototype.readUInt16LE=function(x,B){return _(this,x,!0,B)},y.prototype.readUInt16BE=function(x,B){return _(this,x,!1,B)},y.prototype.readUInt32LE=function(x,B){return O(this,x,!0,B)},y.prototype.readUInt32BE=function(x,B){return O(this,x,!1,B)},y.prototype.readInt8=function(x,B){if(B||(ie(x!=null,"missing offset"),ie(x=this.length))return 128&this[x]?-1*(255-this[x]+1):this[x]},y.prototype.readInt16LE=function(x,B){return b(this,x,!0,B)},y.prototype.readInt16BE=function(x,B){return b(this,x,!1,B)},y.prototype.readInt32LE=function(x,B){return T(this,x,!0,B)},y.prototype.readInt32BE=function(x,B){return T(this,x,!1,B)},y.prototype.readFloatLE=function(x,B){return $(this,x,!0,B)},y.prototype.readFloatBE=function(x,B){return $(this,x,!1,B)},y.prototype.readDoubleLE=function(x,B){return M(this,x,!0,B)},y.prototype.readDoubleBE=function(x,B){return M(this,x,!1,B)},y.prototype.writeUInt8=function(x,B,L){L||(ie(x!=null,"missing value"),ie(B!=null,"missing offset"),ie(B=this.length||(this[B]=x)},y.prototype.writeUInt16LE=function(x,B,L){j(this,x,B,!0,L)},y.prototype.writeUInt16BE=function(x,B,L){j(this,x,B,!1,L)},y.prototype.writeUInt32LE=function(x,B,L){G(this,x,B,!0,L)},y.prototype.writeUInt32BE=function(x,B,L){G(this,x,B,!1,L)},y.prototype.writeInt8=function(x,B,L){L||(ie(x!=null,"missing value"),ie(B!=null,"missing offset"),ie(B=this.length||(0<=x?this.writeUInt8(x,B,L):this.writeUInt8(255+x+1,B,L))},y.prototype.writeInt16LE=function(x,B,L){X(this,x,B,!0,L)},y.prototype.writeInt16BE=function(x,B,L){X(this,x,B,!1,L)},y.prototype.writeInt32LE=function(x,B,L){W(this,x,B,!0,L)},y.prototype.writeInt32BE=function(x,B,L){W(this,x,B,!1,L)},y.prototype.writeFloatLE=function(x,B,L){J(this,x,B,!0,L)},y.prototype.writeFloatBE=function(x,B,L){J(this,x,B,!1,L)},y.prototype.writeDoubleLE=function(x,B,L){ne(this,x,B,!0,L)},y.prototype.writeDoubleBE=function(x,B,L){ne(this,x,B,!1,L)},y.prototype.fill=function(x,B,L){if(B=B||0,L=L||this.length,ie(typeof(x=typeof(x=x||0)=="string"?x.charCodeAt(0):x)=="number"&&!isNaN(x),"value is not a number"),ie(B<=L,"end < start"),L!==B&&this.length!==0){ie(0<=B&&B"},y.prototype.toArrayBuffer=function(){if(typeof Uint8Array>"u")throw new Error("Buffer.toArrayBuffer not supported in this browser");if(y._useTypedArrays)return new y(this).buffer;for(var x=new Uint8Array(this.length),B=0,L=x.length;B=B.length||F>=x.length);F++)B[F+L]=x[F];return F}function N(x){try{return decodeURIComponent(x)}catch{return"�"}}function H(x,B){ie(typeof x=="number","cannot write a non-number as a number"),ie(0<=x,"specified a negative value for writing an unsigned value"),ie(x<=B,"value is larger than maximum value for type"),ie(Math.floor(x)===x,"value has a fractional component")}function te(x,B,L){ie(typeof x=="number","cannot write a non-number as a number"),ie(x<=B,"value larger than maximum allowed value"),ie(L<=x,"value smaller than minimum allowed value"),ie(Math.floor(x)===x,"value has a fractional component")}function me(x,B,L){ie(typeof x=="number","cannot write a non-number as a number"),ie(x<=B,"value larger than maximum allowed value"),ie(L<=x,"value smaller than minimum allowed value")}function ie(x,B){if(!x)throw new Error(B||"Failed assertion")}y._augment=function(x){return x._isBuffer=!0,x._get=x.get,x._set=x.set,x.get=P.get,x.set=P.set,x.write=P.write,x.toString=P.toString,x.toLocaleString=P.toString,x.toJSON=P.toJSON,x.copy=P.copy,x.slice=P.slice,x.readUInt8=P.readUInt8,x.readUInt16LE=P.readUInt16LE,x.readUInt16BE=P.readUInt16BE,x.readUInt32LE=P.readUInt32LE,x.readUInt32BE=P.readUInt32BE,x.readInt8=P.readInt8,x.readInt16LE=P.readInt16LE,x.readInt16BE=P.readInt16BE,x.readInt32LE=P.readInt32LE,x.readInt32BE=P.readInt32BE,x.readFloatLE=P.readFloatLE,x.readFloatBE=P.readFloatBE,x.readDoubleLE=P.readDoubleLE,x.readDoubleBE=P.readDoubleBE,x.writeUInt8=P.writeUInt8,x.writeUInt16LE=P.writeUInt16LE,x.writeUInt16BE=P.writeUInt16BE,x.writeUInt32LE=P.writeUInt32LE,x.writeUInt32BE=P.writeUInt32BE,x.writeInt8=P.writeInt8,x.writeInt16LE=P.writeInt16LE,x.writeInt16BE=P.writeInt16BE,x.writeInt32LE=P.writeInt32LE,x.writeInt32BE=P.writeInt32BE,x.writeFloatLE=P.writeFloatLE,x.writeFloatBE=P.writeFloatBE,x.writeDoubleLE=P.writeDoubleLE,x.writeDoubleBE=P.writeDoubleBE,x.fill=P.fill,x.inspect=P.inspect,x.toArrayBuffer=P.toArrayBuffer,x}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(u,l,s){(function(o,c,U,p,m,v,S,q,C){var U=u("buffer").Buffer,D=4,y=new U(D);y.fill(0),l.exports={hash:function(A,g,E,_){for(var O=g(function(j,G){j.length%D!=0&&(X=j.length+(D-j.length%D),j=U.concat([j,y],X));for(var X,W=[],J=G?j.readInt32BE:j.readInt32LE,ne=0;neE?se=P(se):se.length>5]|=128<>>9<<4)]=T;for(var $=1732584193,M=-271733879,j=-1732584194,G=271733878,X=0;X>>32-j,$)}function A(b,T,$,M,j,G,X){return y(T&$|~T&M,b,T,j,G,X)}function g(b,T,$,M,j,G,X){return y(T&M|$&~M,b,T,j,G,X)}function E(b,T,$,M,j,G,X){return y(T^$^M,b,T,j,G,X)}function _(b,T,$,M,j,G,X){return y($^(T|~M),b,T,j,G,X)}function O(b,T){var $=(65535&b)+(65535&T);return(b>>16)+(T>>16)+($>>16)<<16|65535&$}l.exports=function(b){return U.hash(b,D,16)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],7:[function(u,l,s){(function(o,c,d,p,m,v,S,q,C){l.exports=function(U){for(var D,y=new Array(U),A=0;A>>((3&A)<<3)&255;return y}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:11}],8:[function(u,l,s){(function(o,c,d,p,m,v,S,q,C){var U=u("./helpers");function D(g,E){g[E>>5]|=128<<24-E%32,g[15+(E+64>>9<<4)]=E;for(var _,O,b,T=Array(80),$=1732584193,M=-271733879,j=-1732584194,G=271733878,X=-1009589776,W=0;W>16)+(E>>16)+(_>>16)<<16|65535&_}function A(g,E){return g<>>32-E}l.exports=function(g){return U.hash(g,D,20,!0)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],9:[function(u,l,s){(function(o,c,d,p,m,v,S,q,C){function U(E,_){var O=(65535&E)+(65535&_);return(E>>16)+(_>>16)+(O>>16)<<16|65535&O}function D(E,_){var O,b=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),T=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),$=new Array(64);E[_>>5]|=128<<24-_%32,E[15+(_+64>>9<<4)]=_;for(var M,j,G=0;G>>_|E<<32-_},g=function(E,_){return E>>>_};l.exports=function(E){return y.hash(E,D,32,!0)}}).call(this,u("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},u("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],10:[function(u,l,s){(function(o,c,d,p,m,v,S,q,C){s.read=function(U,D,y,A,G){var E,_,O=8*G-A-1,b=(1<>1,$=-7,M=y?G-1:0,j=y?-1:1,G=U[D+M];for(M+=j,E=G&(1<<-$)-1,G>>=-$,$+=O;0<$;E=256*E+U[D+M],M+=j,$-=8);for(_=E&(1<<-$)-1,E>>=-$,$+=A;0<$;_=256*_+U[D+M],M+=j,$-=8);if(E===0)E=1-T;else{if(E===b)return _?NaN:1/0*(G?-1:1);_+=Math.pow(2,A),E-=T}return(G?-1:1)*_*Math.pow(2,E-A)},s.write=function(U,D,y,A,g,X){var _,O,b=8*X-g-1,T=(1<>1,M=g===23?Math.pow(2,-24)-Math.pow(2,-77):0,j=A?0:X-1,G=A?1:-1,X=D<0||D===0&&1/D<0?1:0;for(D=Math.abs(D),isNaN(D)||D===1/0?(O=isNaN(D)?1:0,_=T):(_=Math.floor(Math.log(D)/Math.LN2),D*(A=Math.pow(2,-_))<1&&(_--,A*=2),2<=(D+=1<=_+$?M/A:M*Math.pow(2,1-$))*A&&(_++,A/=2),T<=_+$?(O=0,_=T):1<=_+$?(O=(D*A-1)*Math.pow(2,g),_+=$):(O=D*Math.pow(2,$-1)*Math.pow(2,g),_=0));8<=g;U[y+j]=255&O,j+=G,O/=256,g-=8);for(_=_<"u"?1:0;let s=l?n[0]:u;for(let o=l;o/g,""),/\.{3}|=/.test(i))?0:n.length}function vv(n,...i){let u="";const l=this;for(let s=0;sZa(l,i,u));if(n&&typeof n=="object"){const l=Object.keys(n)[0],s=n[l];if(i.isData(n,l)||s===void 0)return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(s,u):i.methods[l].deterministic:typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(s,u):i.methods[l].deterministic&&Za(s,i,u)}return!0}function ld(n,i){if(!i.async)return!0;if(Array.isArray(n))return n.every(u=>ld(u,i));if(typeof n=="object"){const u=Object.keys(n)[0],l=n[u];return cn(i.methods[u])?i.methods[u].traverse===!1?!!(typeof i.methods[u][tt]=="function"&&i.methods[u][tt](n,{engine:i})):ld(l,i):!1}return!0}function qe(n,i={}){const{notTraversed:u=[],async:l,processing:s=[],values:o=[],engine:c}=i;function d(S,q=!1){return OS(S,q)?JSON.stringify(S):(o.push(S),`values[${o.length-1}]`)}if(Array.isArray(n)){let S="";for(let q=0;q0&&(S+=","),S+=qe(n[q],i);return"["+S+"]"}let p=!1;function m(S){return i.asyncDetected=i.asyncDetected||p,l&&p?`await ${S}`:S}const v=n&&Object.keys(n)[0];if(n&&typeof n=="object"){if(!v)return d(n);if(!c.methods[v]){if(c.isData(n,v))return d(n,!0);throw new Error(`Method '${v}' was not found in the Logic Engine.`)}if(!i.engine.disableInline&&c.methods[v]&&Za(n,c,i))return ld(n,c)?d((c.fallback||c).run(n),!0):i.avoidInlineAsync?(i.asyncDetected=!0,`(await ${d(c.run(n))})`):(s.push(c.run(n).then(U=>d(U))),`__%%%${s.length-1}%%%__`);let S=n[v];if((!S||typeof S!="object")&&(S=[S]),c.methods[v]&&c.methods[v].compile){let U=c.methods[v].compile(S,i);if(U[Xa]&&(U=U[Xa]),(U||"").startsWith("await")&&(i.asyncDetected=!0),U!==!1)return U}let q=c.methods[v].optimizeUnary?"":"coerceArray";!q&&Array.isArray(S)&&S.length===1?S=S[0]:q&&Array.isArray(S)&&(q="");const C=[", context",", context, above",", context, above, engine"];if(typeof c.methods[v]=="function"){p=!cn(c.methods[v]);const U=C[Iy(c.methods[v])-1]||C[2];return m(`engine.methods["${v}"](${q}(`+qe(S,i)+")"+U+")")}else{p=!!(l&&c.methods[v]&&c.methods[v].asyncMethod);const U=Iy(p?c.methods[v].asyncMethod:c.methods[v].method),D=C[U-1]||C[2];return c.methods[v]&&(typeof c.methods[v].traverse>"u"||c.methods[v].traverse)?m(`engine.methods["${v}"]${p?".asyncMethod":".method"}(${q}(`+qe(S,i)+")"+D+")"):(u.push(S),m(`engine.methods["${v}"]${p?".asyncMethod":".method"}(notTraversed[${u.length-1}]`+D+")"))}}return d(n)}function cs(n,i={}){Object.assign(i,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:i.engine.async,asyncDetected:!1,values:[],compile:vv},i));const u=qe(n,i);return bv(n,u,i)}async function TS(n,i={}){Object.assign(i,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:i.engine.async,asyncDetected:!1,values:[],compile:vv},i));const u=qe(n,i);return i.processing=await Promise.all(i.processing||[]),bv(n,u,i)}function bv(n,i,u){const{engine:l,methods:s,notTraversed:o,processing:c=[],values:d}=u,p=[];c.forEach((v,S)=>{i=i.replace(`__%%%${S}%%%__`,v)});const m=`(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${u.asyncDetected?"async":""} (context ${u.extraArguments?","+u.extraArguments:""}) => { const result = ${i}; return result }`;return Object.assign((typeof globalThis<"u"?globalThis:global).eval(m)(d,s,o,fs,l,p,br),{[tt]:!u.asyncDetected,aboveDetected:typeof i=="string"&&i.includes(", above")})}const RS=()=>{try{const n={};return(typeof globalThis<"u"?globalThis:global).eval("(test) => test?.foo?.bar")(n)===void 0}catch{return!1}},Ev=RS();class En extends Error{constructor(i){super(),this.message="Built-in control structures are not allowed to receive dynamic inputs, this could allow a lesser version of remote-code execution.",this.input=i}}const Ya=new Map;function ds(n){if(Ya.has(n))return Ya.get(n);Ya.size>2048&&Ya.clear();const i=NS(n);return Ya.set(n,i),i}function NS(n,i=".",u="\\",l="/"){const s=[];let o="";for(let c=0;crn(l,i,u));if(n&&typeof n=="object"){const l=Object.keys(n)[0],s=n[l];if(i.isData(n,l))return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(s,u):i.methods[l].deterministic:typeof i.methods[l].deterministic=="function"?i.methods[l].deterministic(s,u):i.methods[l].deterministic&&rn(s,i,u)}return!0}function gr(n,i,u){if(Array.isArray(n))return n.every(l=>gr(l,i,u));if(n&&typeof n=="object"){const l=Object.keys(n)[0],s=n[l];if(i.isData(n,l))return!0;if(!i.methods[l])throw new Error(`Method '${l}' was not found in the Logic Engine.`);return i.methods[l].traverse===!1?typeof i.methods[l][tt]=="function"?i.methods[l][tt](s,u):i.methods[l][tt]:typeof i.methods[l][tt]=="function"?i.methods[l][tt](s,u):i.methods[l][tt]&&gr(s,i,u)}return!0}const we={"+":n=>{if(typeof n=="string"||typeof n=="number")return+n;let i=0;for(let u=0;u{let i=1;for(let u=0;u{let i=n[0];for(let u=1;u{if(typeof n=="string"||typeof n=="number")return-n;if(n.length===1)return-n[0];let i=n[0];for(let u=1;u{let i=n[0];for(let u=1;uMath.max(...n),min:n=>Math.min(...n),in:([n,i])=>(i||[]).includes(n),">":([n,i])=>n>i,"<":([n,i,u])=>u===void 0?nn,!0),[tt]:()=>!0},if:{method:(n,i,u,l)=>{if(!Array.isArray(n))throw new En(n);if(n.length===1)return l.run(n[0],i,{above:u});if(n.length<2)return null;n=[...n],n.length%2!==1&&n.push(null);const s=n.pop();for(;n.length;){const o=n.shift(),c=n.shift(),d=l.run(o,i,{above:u});if(l.truthy(d))return l.run(c,i,{above:u})}return l.run(s,i,{above:u})},[tt]:(n,i)=>gr(n,i.engine,i),deterministic:(n,i)=>rn(n,i.engine,i),asyncMethod:async(n,i,u,l)=>{if(!Array.isArray(n))throw new En(n);if(n.length===1)return l.run(n[0],i,{above:u});if(n.length<2)return null;n=[...n],n.length%2!==1&&n.push(null);const s=n.pop();for(;n.length;){const o=n.shift(),c=n.shift(),d=await l.run(o,i,{above:u});if(l.truthy(d))return l.run(c,i,{above:u})}return l.run(s,i,{above:u})},traverse:!1},"<=":([n,i,u])=>u===void 0?n<=i:n<=i&&i<=u,">=":([n,i])=>n>=i,"==":([n,i])=>n==i,"===":([n,i])=>n===i,"!=":([n,i])=>n!=i,"!==":([n,i])=>n!==i,xor:([n,i])=>n^i,or:{method:(n,i,u,l)=>{const s=Array.isArray(n);s||(n=l.run(n,i,{above:u}));let o;for(let c=0;c{const s=Array.isArray(n);s||(n=await l.run(n,i,{above:u}));let o;for(let c=0;crn(n,i.engine,i),compile:(n,i)=>i.engine.truthy.IDENTITY?Array.isArray(n)?`(${n.map(u=>qe(u,i)).join(" || ")})`:`(${qe(n,i)}).reduce((a,b) => a||b, false)`:!1,traverse:!1},and:{method:(n,i,u,l)=>{const s=Array.isArray(n);s||(n=l.run(n,i,{above:u}));let o;for(let c=0;c{const s=Array.isArray(n);s||(n=await l.run(n,i,{above:u}));let o;for(let c=0;crn(n,i.engine,i),compile:(n,i)=>i.engine.truthy.IDENTITY?Array.isArray(n)?`(${n.map(u=>qe(u,i)).join(" && ")})`:`(${qe(n,i)}).reduce((a,b) => a&&b, true)`:!1},substr:([n,i,u])=>{if(u<0){const l=n.substr(i);return l.substr(0,l.length+u)}return n.substr(i,u)},length:([n])=>typeof n=="string"||Array.isArray(n)?n.length:n&&typeof n=="object"?Object.keys(n).length:0,get:{method:([n,i,u],l,s,o)=>{const c=u===void 0?null:u,d=ds(String(i));for(let p=0;p{let s;Array.isArray(n)&&(s=n[1],n=n[0]);let o=0;for(;typeof n=="string"&&n.startsWith("../")&&o"u"||n===""||n===null)return l.allowFunctions||typeof i!="function"?i:null;const d=ds(String(n));for(let p=0;p(Array.isArray(n)?n:[n]).filter(s=>we.var(s,i,u,l)===null),missing_some:([n,i],u,l,s)=>{const o=we.missing(i,u,l,s);return i.length-o.length>=n?[]:o},map:Pa("map"),some:Pa("some",!0),all:Pa("every",!0),none:{traverse:!1,method:(n,i,u,l)=>!we.some.method(n,i,u,l),asyncMethod:async(n,i,u,l)=>!await we.some.asyncMethod(n,i,u,l),compile:(n,i)=>{const u=we.some.compile(n,i);return u?i.compile`!(${u})`:!1}},merge:n=>Array.isArray(n)?[].concat(...n):[n],every:Pa("every"),filter:Pa("filter"),reduce:{deterministic:(n,i)=>rn(n[0],i.engine,i)&&rn(n[1],i.engine,{...i,insideIterator:!0}),compile:(n,i)=>{if(!Array.isArray(n))throw new En(n);const{async:u}=i;let[l,s,o]=n;l=qe(l,i),typeof o<"u"&&(o=qe(o,i));const c={...i,extraArguments:"above",avoidInlineAsync:!0};s=cs(s,c);const d=s.aboveDetected?"[null, context, above]":"null";return i.methods.push(s),u&&(!cn(s)||l.includes("await"))?(i.detectAsync=!0,typeof o<"u"?`await asyncIterators.reduce(${l} || [], (a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${o})`:`await asyncIterators.reduce(${l} || [], (a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${d}))`):typeof o<"u"?`(${l} || []).reduce((a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${o})`:`(${l} || []).reduce((a,b) => methods[${i.methods.length-1}]({ accumulator: a, current: b }, ${d}))`},method:(n,i,u,l)=>{if(!Array.isArray(n))throw new En(n);let[s,o,c]=n;c=l.run(c,i,{above:u}),s=l.run(s,i,{above:u})||[];const d=(p,m)=>l.run(o,{accumulator:p,current:m},{above:[s,i,u]});return typeof c>"u"?s.reduce(d):s.reduce(d,c)},[tt]:(n,i)=>gr(n,i.engine,i),asyncMethod:async(n,i,u,l)=>{if(!Array.isArray(n))throw new En(n);let[s,o,c]=n;return c=await l.run(c,i,{above:u}),s=await l.run(s,i,{above:u})||[],fs.reduce(s,(d,p)=>l.run(o,{accumulator:d,current:p},{above:[s,i,u]}),c)},traverse:!1},"!":(n,i,u,l)=>Array.isArray(n)?!l.truthy(n[0]):!l.truthy(n),"!!":(n,i,u,l)=>!!(Array.isArray(n)?l.truthy(n[0]):l.truthy(n)),cat:n=>{if(typeof n=="string")return n;let i="";for(let u=0;utypeof n=="object"?Object.keys(n):[],pipe:{traverse:!1,[tt]:(n,i)=>gr(n,i.engine,i),method:(n,i,u,l)=>{if(!Array.isArray(n))throw new Error("Data for pipe must be an array");let s=l.run(n[0],i,{above:[n,i,u]});for(let o=1;o{if(!Array.isArray(n))throw new Error("Data for pipe must be an array");let s=await l.run(n[0],i,{above:[n,i,u]});for(let o=1;o{let u=i.compile`${n[0]}`;for(let l=1;l{if(!Array.isArray(n))return!1;n=[...n];const u=n.shift();return rn(u,i.engine,i)&&rn(n,i.engine,{...i,insideIterator:!0})}},eachKey:{traverse:!1,[tt]:(n,i)=>gr(Object.values(n[Object.keys(n)[0]]),i.engine,i),method:(n,i,u,l)=>Object.keys(n).reduce((o,c)=>{const d=n[c];return Object.defineProperty(o,c,{enumerable:!0,value:l.run(d,i,{above:u})}),o},{}),deterministic:(n,i)=>{if(n&&typeof n=="object")return Object.values(n).every(u=>rn(u,i.engine,i));throw new En(n)},compile:(n,i)=>{if(n&&typeof n=="object")return`({ ${Object.keys(n).reduce((l,s)=>(l.push(`${JSON.stringify(s)}: ${qe(n[s],i)}`),l),[]).join(",")} })`;throw new En(n)},asyncMethod:async(n,i,u,l)=>await fs.reduce(Object.keys(n),async(o,c)=>{const d=n[c];return Object.defineProperty(o,c,{enumerable:!0,value:await l.run(d,i,{above:u})}),o},{})}};function Pa(n,i=!1){return{deterministic:(u,l)=>rn(u[0],l.engine,l)&&rn(u[1],l.engine,{...l,insideIterator:!0}),[tt]:(u,l)=>gr(u,l.engine,l),method:(u,l,s,o)=>{if(!Array.isArray(u))throw new En(u);let[c,d]=u;return c=o.run(c,l,{above:s})||[],c[n]((p,m)=>{const v=o.run(d,p,{above:[{iterator:c,index:m},l,s]});return i?o.truthy(v):v})},asyncMethod:async(u,l,s,o)=>{if(!Array.isArray(u))throw new En(u);let[c,d]=u;return c=await o.run(c,l,{above:s})||[],fs[n](c,(p,m)=>{const v=o.run(d,p,{above:[{iterator:c,index:m},l,s]});return i?o.truthy(v):v})},compile:(u,l)=>{if(!Array.isArray(u))throw new En(u);const{async:s}=l,[o,c]=u,d={...l,avoidInlineAsync:!0,iteratorCompile:!0,extraArguments:"index, above"},p=cs(c,d),m=p.aboveDetected?l.compile`[{ iterator: z, index: x }, context, above]`:l.compile`null`;return s&&!gr(c,l.engine,l)?(l.detectAsync=!0,l.compile`await asyncIterators[${n}](${o} || [], async (i, x, z) => ${p}(i, x, ${m}))`):l.compile`(${o} || [])[${n}]((i, x, z) => ${p}(i, x, ${m}))`},traverse:!1}}we["?:"]=we.if;Object.keys(we).forEach(n=>{typeof we[n]=="function"&&(we[n][tt]=!0),we[n].deterministic=typeof we[n].deterministic>"u"?!0:we[n].deterministic});we.var.deterministic=(n,i)=>i.insideIterator&&!String(n).includes("../../");Object.assign(we.missing,{deterministic:!1});Object.assign(we.missing_some,{deterministic:!1});we["<"].compile=function(n,i){return Array.isArray(n)?n.length===2?i.compile`(${n[0]} < ${n[1]})`:n.length===3?i.compile`(${n[0]} < ${n[1]} && ${n[1]} < ${n[2]})`:!1:!1};we["<="].compile=function(n,i){return Array.isArray(n)?n.length===2?i.compile`(${n[0]} <= ${n[1]})`:n.length===3?i.compile`(${n[0]} <= ${n[1]} && ${n[1]} <= ${n[2]})`:!1:!1};we.min.compile=function(n,i){return Array.isArray(n)?`Math.min(${n.map(u=>qe(u,i)).join(", ")})`:!1};we.max.compile=function(n,i){return Array.isArray(n)?`Math.max(${n.map(u=>qe(u,i)).join(", ")})`:!1};we[">"].compile=function(n,i){return!Array.isArray(n)||n.length!==2?!1:i.compile`(${n[0]} > ${n[1]})`};we[">="].compile=function(n,i){return!Array.isArray(n)||n.length!==2?!1:i.compile`(${n[0]} >= ${n[1]})`};we["=="].compile=function(n,i){return!Array.isArray(n)||n.length!==2?!1:i.compile`(${n[0]} == ${n[1]})`};we["!="].compile=function(n,i){return!Array.isArray(n)||n.length!==2?!1:i.compile`(${n[0]} != ${n[1]})`};we.if.compile=function(n,i){if(!Array.isArray(n)||n.length<3)return!1;n=[...n],n.length%2!==1&&n.push(null);const u=n.pop();let l=i.compile``;for(;n.length;){const s=n.shift(),o=n.shift();l=i.compile`${l} engine.truthy(${s}) ? ${o} : `}return i.compile`(${l} ${u})`};we["==="].compile=function(n,i){return!Array.isArray(n)||n.length!==2?!1:i.compile`(${n[0]} === ${n[1]})`};we["+"].compile=function(n,i){return Array.isArray(n)?`(${n.map(u=>`(+${qe(u,i)})`).join(" + ")})`:typeof n=="string"||typeof n=="number"?`(+${qe(n,i)})`:`([].concat(${qe(n,i)})).reduce((a,b) => (+a)+(+b), 0)`};we["%"].compile=function(n,i){return Array.isArray(n)?`(${n.map(u=>`(+${qe(u,i)})`).join(" % ")})`:`(${qe(n,i)}).reduce((a,b) => (+a)%(+b))`};we.in.compile=function(n,i){return Array.isArray(n)?i.compile`(${n[1]} || []).includes(${n[0]})`:!1};we["-"].compile=function(n,i){return Array.isArray(n)?`${n.length===1?"-":""}(${n.map(u=>`(+${qe(u,i)})`).join(" - ")})`:typeof n=="string"||typeof n=="number"?`(-${qe(n,i)})`:`((a=>(a.length===1?a[0]=-a[0]:a)&0||a)([].concat(${qe(n,i)}))).reduce((a,b) => (+a)-(+b))`};we["/"].compile=function(n,i){return Array.isArray(n)?`(${n.map(u=>`(+${qe(u,i)})`).join(" / ")})`:`(${qe(n,i)}).reduce((a,b) => (+a)/(+b))`};we["*"].compile=function(n,i){return Array.isArray(n)?`(${n.map(u=>`(+${qe(u,i)})`).join(" * ")})`:`(${qe(n,i)}).reduce((a,b) => (+a)*(+b))`};we.cat.compile=function(n,i){if(typeof n=="string")return JSON.stringify(n);if(!Array.isArray(n))return!1;let u=i.compile`''`;for(let l=0;l"u"?null:n[2],l&&typeof l=="object")return!1;l=l.toString();const o=ds(l);return Ev?`((${qe(s,i)})${o.map(c=>`?.[${qe(c,i)}]`).join("")} ?? ${qe(u,i)})`:`(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${o.reduce((c,d)=>`(${c}||0)[${JSON.stringify(d)}]`,`(${qe(s,i)}||0)`)}, ${qe(u,i)}))`}return!1};we.var.compile=function(n,i){let u=n,l=null;if(i.varTop=i.varTop||new Set,!u||typeof n=="string"||typeof n=="number"||Array.isArray(n)&&n.length<=2){if(Array.isArray(n)&&(u=n[0],l=typeof n[1]>"u"?null:n[1]),u==="../index"&&i.iteratorCompile)return"index";if(typeof u>"u"||u===null||u==="")return"context";if(typeof u!="string"&&typeof u!="number"||(u=u.toString(),u.includes("../")))return!1;const s=ds(u),[o]=s;return i.varTop.add(o),i.engine.allowFunctions?i.methods.preventFunctions=c=>c:i.methods.preventFunctions=c=>typeof c=="function"?null:c,Ev?`(methods.preventFunctions(context${s.map(c=>`?.[${JSON.stringify(c)}]`).join("")} ?? ${qe(l,i)}))`:`(methods.preventFunctions(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${s.reduce((c,d)=>`(${c}||0)[${JSON.stringify(d)}]`,"(context||0)")}, ${qe(l,i)})))`}return!1};we["+"].optimizeUnary=we["-"].optimizeUnary=we.var.optimizeUnary=we["!"].optimizeUnary=we["!!"].optimizeUnary=we.cat.optimizeUnary=!0;const vd={...we},_v=function(i){return Object.keys(i).forEach(u=>{i[u]===void 0&&delete i[u]}),i};function jS(n,i,u,l){const s=i.methods[u],o=s.method?s.method:s;if(s.traverse===!1){const d=n[u];return(p,m)=>o(d,p,m||l,i)}let c=n[u];if((!c||typeof c!="object")&&(c=[c]),Array.isArray(c)){const d=c.map(p=>hs(p,i,l));return(p,m)=>{const v=d.map(S=>typeof S=="function"?S(p,m):S);return o(v,p,m||l,i)}}else{const d=hs(c,i,l);return(p,m)=>o(br(typeof d=="function"?d(p,m):d,s.optimizeUnary),p,m||l,i)}}function hs(n,i,u=[]){if(Array.isArray(n)){const l=n.map(s=>hs(s,i,u));return(s,o)=>l.map(c=>typeof c=="function"?c(s,o):c)}if(n&&typeof n=="object"){const s=Object.keys(n)[0];if(i.isData(n,s))return()=>n;const c=!i.disableInline&&Za(n,i,{engine:i});if(s in i.methods){const d=jS(n,i,s,u);return c?d():d}}return n}const ns=vd.all,DS={method:(n,i,u,l)=>{if(Array.isArray(n)){const s=l.run(n[0],i,u);if(Array.isArray(s)&&s.length===0)return!1}return ns.method(n,i,u,l)},asyncMethod:async(n,i,u,l)=>{if(Array.isArray(n)){const s=await l.run(n[0],i,u);if(Array.isArray(s)&&s.length===0)return!1}return ns.asyncMethod(n,i,u,l)},deterministic:ns.deterministic,traverse:ns.traverse};function MS(n){return Array.isArray(n)&&n.length===0?!1:n}function Sv(n){n.methods.all=DS,n.truthy=MS}class bd{constructor(i=vd,u={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.disableInline=u.disableInline,this.disableInterpretedOptimization=u.disableInterpretedOptimization,this.methods={...i},this.optimizedMap=new WeakMap,this.missesSinceSeen=0,u.compatible&&Sv(this),this.options={disableInline:u.disableInline,disableInterpretedOptimization:u.disableInterpretedOptimization},this.isData||(u.permissive?this.isData=(l,s)=>!(s in this.methods):this.isData=()=>!1)}truthy(i){return i}_parse(i,u,l){const[s]=Object.keys(i),o=i[s];if(this.isData(i,s))return i;if(!this.methods[s])throw new Error(`Method '${s}' was not found in the Logic Engine.`);if(typeof this.methods[s]=="function"){const c=!o||typeof o!="object"?[o]:br(this.run(o,u,{above:l}));return this.methods[s](c,u,l,this)}if(typeof this.methods[s]=="object"){const{method:c,traverse:d}=this.methods[s],m=(typeof d>"u"?!0:d)?!o||typeof o!="object"?[o]:br(this.run(o,u,{above:l})):o;return c(m,u,l,this)}throw new Error(`Method '${s}' is not set up properly.`)}addMethod(i,u,{deterministic:l,optimizeUnary:s}={}){typeof u=="function"?u={method:u,traverse:!0}:u={...u},Object.assign(u,_v({deterministic:l,optimizeUnary:s})),this.methods[i]=kn(u)}addModule(i,u,l){Object.getOwnPropertyNames(u).forEach(s=>{(typeof u[s]=="function"||typeof u[s]=="object")&&this.addMethod(`${i}${i?".":""}${s}`,u[s],l)})}run(i,u={},l={}){const{above:s=[]}=l;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof i=="object"&&i&&!this.optimizedMap.has(i))return this.optimizedMap.set(i,hs(i,this,s)),this.missesSinceSeen++,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,s):this.optimizedMap.get(i);if(!this.disableInterpretedOptimization&&i&&typeof i=="object"&&this.optimizedMap.get(i))return this.missesSinceSeen=0,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,s):this.optimizedMap.get(i);if(Array.isArray(i)){const o=[];for(let c=0;c0?this._parse(i,u,s):i}build(i,u={}){const{above:l=[],top:s=!0}=u;if(s){const o=cs(i,{state:{},engine:this,above:l});return typeof o=="function"||s===!0?(...c)=>typeof o=="function"?o(...c):o:o}return i}}Object.assign(bd.prototype.truthy,{IDENTITY:!0});function CS(n,i,u,l){const s=i.methods[u],o=s.asyncMethod?s.asyncMethod:s.method?s.method:s;if(s.traverse===!1){if(typeof s[tt]=="function"&&s[tt](n,{engine:i})){const p=s.method?s.method:s;return kn((m,v)=>p(n[u],m,v||l,i.fallback),!0)}const d=n[u];return(p,m)=>o(d,p,m||l,i)}let c=n[u];if((!c||typeof c!="object")&&(c=[c]),Array.isArray(c)){const d=c.map(p=>ps(p,i,l));if(cn(d)&&(s.method||s[tt])){const p=s.method?s.method:s;return kn((m,v)=>{const S=d.map(q=>typeof q=="function"?q(m,v):q);return p(S,m,v||l,i.fallback)},!0)}return async(p,m)=>{const v=await yd(d,S=>typeof S=="function"?S(p,m):S);return o(v,p,m||l,i)}}else{const d=ps(c,i,l);if(cn(d)&&(s.method||s[tt])){const p=s.method?s.method:s;return kn((m,v)=>p(br(typeof d=="function"?d(m,v):d,s.optimizeUnary),m,v||l,i),!0)}return async(p,m)=>o(br(typeof d=="function"?await d(p,m):d,s.optimizeUnary),p,m||l,i)}}function ps(n,i,u=[]){if(i.fallback.allowFunctions=i.allowFunctions,Array.isArray(n)){const l=n.map(s=>ps(s,i,u));return cn(l)?kn((s,o)=>l.map(c=>typeof c=="function"?c(s,o):c),!0):async(s,o)=>yd(l,c=>typeof c=="function"?c(s,o):c)}if(n&&typeof n=="object"){const s=Object.keys(n)[0];if(i.isData(n,s))return()=>n;const c=!i.disableInline&&Za(n,i,{engine:i});if(s in i.methods){const d=CS(n,i,s,u);if(c){let p;return cn(d)?kn(()=>(p||(p=d()),p),!0):async()=>(p||(p=await d()),p)}return d}}return n}class xS{constructor(i=vd,u={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.methods={...i},this.options={disableInline:u.disableInline,disableInterpretedOptimization:u.disableInterpretedOptimization},this.disableInline=u.disableInline,this.disableInterpretedOptimization=u.disableInterpretedOptimization,this.async=!0,this.fallback=new bd(i,u),u.compatible&&Sv(this),this.optimizedMap=new WeakMap,this.missesSinceSeen=0,this.isData||(u.permissive?this.isData=(l,s)=>!(s in this.methods):this.isData=()=>!1),this.fallback.isData=this.isData}truthy(i){return i}async _parse(i,u,l){const[s]=Object.keys(i),o=i[s];if(this.isData(i,s))return i;if(!this.methods[s])throw new Error(`Method '${s}' was not found in the Logic Engine.`);if(typeof this.methods[s]=="function"){const c=!o||typeof o!="object"?[o]:await this.run(o,u,{above:l}),d=await this.methods[s](br(c),u,l,this);return Array.isArray(d)?Promise.all(d):d}if(typeof this.methods[s]=="object"){const{asyncMethod:c,method:d,traverse:p}=this.methods[s],v=(typeof p>"u"?!0:p)?!o||typeof o!="object"?[o]:br(await this.run(o,u,{above:l})):o,S=await(c||d)(v,u,l,this);return Array.isArray(S)?Promise.all(S):S}throw new Error(`Method '${s}' is not set up properly.`)}addMethod(i,u,{deterministic:l,async:s,sync:o,optimizeUnary:c}={}){typeof s>"u"&&typeof o>"u"&&(o=!1),typeof o<"u"&&(s=!o),typeof s<"u"&&(o=!s),typeof u=="function"?s?u={asyncMethod:u,traverse:!0}:u={method:u,traverse:!0}:u={...u},Object.assign(u,_v({deterministic:l,optimizeUnary:c})),this.fallback.addMethod(i,u,{deterministic:l}),this.methods[i]=kn(u,o)}addModule(i,u,l={}){Object.getOwnPropertyNames(u).forEach(s=>{(typeof u[s]=="function"||typeof u[s]=="object")&&this.addMethod(`${i}${i?".":""}${s}`,u[s],l)})}async run(i,u={},l={}){const{above:s=[]}=l;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof i=="object"&&i&&!this.optimizedMap.has(i))return this.optimizedMap.set(i,ps(i,this,s)),this.missesSinceSeen++,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,s):this.optimizedMap.get(i);if(!this.disableInterpretedOptimization&&i&&typeof i=="object"&&this.optimizedMap.get(i))return this.missesSinceSeen=0,typeof this.optimizedMap.get(i)=="function"?this.optimizedMap.get(i)(u,s):this.optimizedMap.get(i);if(Array.isArray(i)){const o=[];for(let c=0;c0?this._parse(i,u,s):i}async build(i,u={}){const{above:l=[],top:s=!0}=u;if(this.fallback.truthy=this.truthy,this.fallback.allowFunctions=this.allowFunctions,s){const o=await TS(i,{engine:this,above:l,async:!0,state:{}}),c=kn((...d)=>{if(s===!0)try{const p=typeof o=="function"?o(...d):o;return Promise.resolve(p)}catch(p){return Promise.reject(p)}return typeof o=="function"?o(...d):o},s!==!0&&cn(o));return typeof o=="function"||s===!0?c:o}return i}}Object.assign(xS.prototype.truthy,{IDENTITY:!0});var rs={exports:{}},ac,By;function Os(){if(By)return ac;By=1;const n="2.0.0",i=256,u=Number.MAX_SAFE_INTEGER||9007199254740991,l=16,s=i-6;return ac={MAX_LENGTH:i,MAX_SAFE_COMPONENT_LENGTH:l,MAX_SAFE_BUILD_LENGTH:s,MAX_SAFE_INTEGER:u,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:n,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},ac}var lc,Hy;function Ts(){if(Hy)return lc;Hy=1;var n={};return lc=typeof process=="object"&&n&&n.NODE_DEBUG&&/\bsemver\b/i.test(n.NODE_DEBUG)?(...u)=>console.error("SEMVER",...u):()=>{},lc}var Vy;function rl(){return Vy||(Vy=1,function(n,i){const{MAX_SAFE_COMPONENT_LENGTH:u,MAX_SAFE_BUILD_LENGTH:l}=Os(),s=Ts();i=n.exports={};const o=i.re=[],c=i.safeRe=[],d=i.src=[],p=i.t={};let m=0;const v="[a-zA-Z0-9-]",S=[["\\s",1],["\\d",u],[v,l]],q=U=>{for(const[D,y]of S)U=U.split(`${D}*`).join(`${D}{0,${y}}`).split(`${D}+`).join(`${D}{1,${y}}`);return U},C=(U,D,y)=>{const A=q(D),g=m++;s(U,g,D),p[U]=g,d[g]=D,o[g]=new RegExp(D,y?"g":void 0),c[g]=new RegExp(A,y?"g":void 0)};C("NUMERICIDENTIFIER","0|[1-9]\\d*"),C("NUMERICIDENTIFIERLOOSE","\\d+"),C("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${v}*`),C("MAINVERSION",`(${d[p.NUMERICIDENTIFIER]})\\.(${d[p.NUMERICIDENTIFIER]})\\.(${d[p.NUMERICIDENTIFIER]})`),C("MAINVERSIONLOOSE",`(${d[p.NUMERICIDENTIFIERLOOSE]})\\.(${d[p.NUMERICIDENTIFIERLOOSE]})\\.(${d[p.NUMERICIDENTIFIERLOOSE]})`),C("PRERELEASEIDENTIFIER",`(?:${d[p.NUMERICIDENTIFIER]}|${d[p.NONNUMERICIDENTIFIER]})`),C("PRERELEASEIDENTIFIERLOOSE",`(?:${d[p.NUMERICIDENTIFIERLOOSE]}|${d[p.NONNUMERICIDENTIFIER]})`),C("PRERELEASE",`(?:-(${d[p.PRERELEASEIDENTIFIER]}(?:\\.${d[p.PRERELEASEIDENTIFIER]})*))`),C("PRERELEASELOOSE",`(?:-?(${d[p.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${d[p.PRERELEASEIDENTIFIERLOOSE]})*))`),C("BUILDIDENTIFIER",`${v}+`),C("BUILD",`(?:\\+(${d[p.BUILDIDENTIFIER]}(?:\\.${d[p.BUILDIDENTIFIER]})*))`),C("FULLPLAIN",`v?${d[p.MAINVERSION]}${d[p.PRERELEASE]}?${d[p.BUILD]}?`),C("FULL",`^${d[p.FULLPLAIN]}$`),C("LOOSEPLAIN",`[v=\\s]*${d[p.MAINVERSIONLOOSE]}${d[p.PRERELEASELOOSE]}?${d[p.BUILD]}?`),C("LOOSE",`^${d[p.LOOSEPLAIN]}$`),C("GTLT","((?:<|>)?=?)"),C("XRANGEIDENTIFIERLOOSE",`${d[p.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),C("XRANGEIDENTIFIER",`${d[p.NUMERICIDENTIFIER]}|x|X|\\*`),C("XRANGEPLAIN",`[v=\\s]*(${d[p.XRANGEIDENTIFIER]})(?:\\.(${d[p.XRANGEIDENTIFIER]})(?:\\.(${d[p.XRANGEIDENTIFIER]})(?:${d[p.PRERELEASE]})?${d[p.BUILD]}?)?)?`),C("XRANGEPLAINLOOSE",`[v=\\s]*(${d[p.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[p.XRANGEIDENTIFIERLOOSE]})(?:\\.(${d[p.XRANGEIDENTIFIERLOOSE]})(?:${d[p.PRERELEASELOOSE]})?${d[p.BUILD]}?)?)?`),C("XRANGE",`^${d[p.GTLT]}\\s*${d[p.XRANGEPLAIN]}$`),C("XRANGELOOSE",`^${d[p.GTLT]}\\s*${d[p.XRANGEPLAINLOOSE]}$`),C("COERCE",`(^|[^\\d])(\\d{1,${u}})(?:\\.(\\d{1,${u}}))?(?:\\.(\\d{1,${u}}))?(?:$|[^\\d])`),C("COERCERTL",d[p.COERCE],!0),C("LONETILDE","(?:~>?)"),C("TILDETRIM",`(\\s*)${d[p.LONETILDE]}\\s+`,!0),i.tildeTrimReplace="$1~",C("TILDE",`^${d[p.LONETILDE]}${d[p.XRANGEPLAIN]}$`),C("TILDELOOSE",`^${d[p.LONETILDE]}${d[p.XRANGEPLAINLOOSE]}$`),C("LONECARET","(?:\\^)"),C("CARETTRIM",`(\\s*)${d[p.LONECARET]}\\s+`,!0),i.caretTrimReplace="$1^",C("CARET",`^${d[p.LONECARET]}${d[p.XRANGEPLAIN]}$`),C("CARETLOOSE",`^${d[p.LONECARET]}${d[p.XRANGEPLAINLOOSE]}$`),C("COMPARATORLOOSE",`^${d[p.GTLT]}\\s*(${d[p.LOOSEPLAIN]})$|^$`),C("COMPARATOR",`^${d[p.GTLT]}\\s*(${d[p.FULLPLAIN]})$|^$`),C("COMPARATORTRIM",`(\\s*)${d[p.GTLT]}\\s*(${d[p.LOOSEPLAIN]}|${d[p.XRANGEPLAIN]})`,!0),i.comparatorTrimReplace="$1$2$3",C("HYPHENRANGE",`^\\s*(${d[p.XRANGEPLAIN]})\\s+-\\s+(${d[p.XRANGEPLAIN]})\\s*$`),C("HYPHENRANGELOOSE",`^\\s*(${d[p.XRANGEPLAINLOOSE]})\\s+-\\s+(${d[p.XRANGEPLAINLOOSE]})\\s*$`),C("STAR","(<|>)?=?\\s*\\*"),C("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),C("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(rs,rs.exports)),rs.exports}var uc,ky;function Ed(){if(ky)return uc;ky=1;const n=Object.freeze({loose:!0}),i=Object.freeze({});return uc=l=>l?typeof l!="object"?n:l:i,uc}var sc,Gy;function wv(){if(Gy)return sc;Gy=1;const n=/^[0-9]+$/,i=(l,s)=>{const o=n.test(l),c=n.test(s);return o&&c&&(l=+l,s=+s),l===s?0:o&&!c?-1:c&&!o?1:li(s,l)},sc}var oc,Yy;function Nt(){if(Yy)return oc;Yy=1;const n=Ts(),{MAX_LENGTH:i,MAX_SAFE_INTEGER:u}=Os(),{safeRe:l,t:s}=rl(),o=Ed(),{compareIdentifiers:c}=wv();class d{constructor(m,v){if(v=o(v),m instanceof d){if(m.loose===!!v.loose&&m.includePrerelease===!!v.includePrerelease)return m;m=m.version}else if(typeof m!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof m}".`);if(m.length>i)throw new TypeError(`version is longer than ${i} characters`);n("SemVer",m,v),this.options=v,this.loose=!!v.loose,this.includePrerelease=!!v.includePrerelease;const S=m.trim().match(v.loose?l[s.LOOSE]:l[s.FULL]);if(!S)throw new TypeError(`Invalid Version: ${m}`);if(this.raw=m,this.major=+S[1],this.minor=+S[2],this.patch=+S[3],this.major>u||this.major<0)throw new TypeError("Invalid major version");if(this.minor>u||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>u||this.patch<0)throw new TypeError("Invalid patch version");S[4]?this.prerelease=S[4].split(".").map(q=>{if(/^[0-9]+$/.test(q)){const C=+q;if(C>=0&&C=0;)typeof this.prerelease[C]=="number"&&(this.prerelease[C]++,C=-2);if(C===-1){if(v===this.prerelease.join(".")&&S===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(q)}}if(v){let C=[v,q];S===!1&&(C=[v]),c(this.prerelease[0],v)===0?isNaN(this.prerelease[1])&&(this.prerelease=C):this.prerelease=C}break}default:throw new Error(`invalid increment argument: ${m}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return oc=d,oc}var fc,Py;function Vi(){if(Py)return fc;Py=1;const n=Nt();return fc=(u,l,s=!1)=>{if(u instanceof n)return u;try{return new n(u,l)}catch(o){if(!s)return null;throw o}},fc}var cc,Ky;function LS(){if(Ky)return cc;Ky=1;const n=Vi();return cc=(u,l)=>{const s=n(u,l);return s?s.version:null},cc}var dc,Fy;function qS(){if(Fy)return dc;Fy=1;const n=Vi();return dc=(u,l)=>{const s=n(u.trim().replace(/^[=v]+/,""),l);return s?s.version:null},dc}var hc,Xy;function US(){if(Xy)return hc;Xy=1;const n=Nt();return hc=(u,l,s,o,c)=>{typeof s=="string"&&(c=o,o=s,s=void 0);try{return new n(u instanceof n?u.version:u,s).inc(l,o,c).version}catch{return null}},hc}var pc,Qy;function zS(){if(Qy)return pc;Qy=1;const n=Vi();return pc=(u,l)=>{const s=n(u,null,!0),o=n(l,null,!0),c=s.compare(o);if(c===0)return null;const d=c>0,p=d?s:o,m=d?o:s,v=!!p.prerelease.length;if(!!m.prerelease.length&&!v)return!m.patch&&!m.minor?"major":p.patch?"patch":p.minor?"minor":"major";const q=v?"pre":"";return s.major!==o.major?q+"major":s.minor!==o.minor?q+"minor":s.patch!==o.patch?q+"patch":"prerelease"},pc}var mc,Zy;function IS(){if(Zy)return mc;Zy=1;const n=Nt();return mc=(u,l)=>new n(u,l).major,mc}var gc,Jy;function BS(){if(Jy)return gc;Jy=1;const n=Nt();return gc=(u,l)=>new n(u,l).minor,gc}var yc,Wy;function HS(){if(Wy)return yc;Wy=1;const n=Nt();return yc=(u,l)=>new n(u,l).patch,yc}var vc,e0;function VS(){if(e0)return vc;e0=1;const n=Vi();return vc=(u,l)=>{const s=n(u,l);return s&&s.prerelease.length?s.prerelease:null},vc}var bc,t0;function hn(){if(t0)return bc;t0=1;const n=Nt();return bc=(u,l,s)=>new n(u,s).compare(new n(l,s)),bc}var Ec,n0;function kS(){if(n0)return Ec;n0=1;const n=hn();return Ec=(u,l,s)=>n(l,u,s),Ec}var _c,r0;function GS(){if(r0)return _c;r0=1;const n=hn();return _c=(u,l)=>n(u,l,!0),_c}var Sc,i0;function _d(){if(i0)return Sc;i0=1;const n=Nt();return Sc=(u,l,s)=>{const o=new n(u,s),c=new n(l,s);return o.compare(c)||o.compareBuild(c)},Sc}var wc,a0;function YS(){if(a0)return wc;a0=1;const n=_d();return wc=(u,l)=>u.sort((s,o)=>n(s,o,l)),wc}var Ac,l0;function PS(){if(l0)return Ac;l0=1;const n=_d();return Ac=(u,l)=>u.sort((s,o)=>n(o,s,l)),Ac}var $c,u0;function Rs(){if(u0)return $c;u0=1;const n=hn();return $c=(u,l,s)=>n(u,l,s)>0,$c}var Oc,s0;function Sd(){if(s0)return Oc;s0=1;const n=hn();return Oc=(u,l,s)=>n(u,l,s)<0,Oc}var Tc,o0;function Av(){if(o0)return Tc;o0=1;const n=hn();return Tc=(u,l,s)=>n(u,l,s)===0,Tc}var Rc,f0;function $v(){if(f0)return Rc;f0=1;const n=hn();return Rc=(u,l,s)=>n(u,l,s)!==0,Rc}var Nc,c0;function wd(){if(c0)return Nc;c0=1;const n=hn();return Nc=(u,l,s)=>n(u,l,s)>=0,Nc}var jc,d0;function Ad(){if(d0)return jc;d0=1;const n=hn();return jc=(u,l,s)=>n(u,l,s)<=0,jc}var Dc,h0;function Ov(){if(h0)return Dc;h0=1;const n=Av(),i=$v(),u=Rs(),l=wd(),s=Sd(),o=Ad();return Dc=(d,p,m,v)=>{switch(p){case"===":return typeof d=="object"&&(d=d.version),typeof m=="object"&&(m=m.version),d===m;case"!==":return typeof d=="object"&&(d=d.version),typeof m=="object"&&(m=m.version),d!==m;case"":case"=":case"==":return n(d,m,v);case"!=":return i(d,m,v);case">":return u(d,m,v);case">=":return l(d,m,v);case"<":return s(d,m,v);case"<=":return o(d,m,v);default:throw new TypeError(`Invalid operator: ${p}`)}},Dc}var Mc,p0;function KS(){if(p0)return Mc;p0=1;const n=Nt(),i=Vi(),{safeRe:u,t:l}=rl();return Mc=(o,c)=>{if(o instanceof n)return o;if(typeof o=="number"&&(o=String(o)),typeof o!="string")return null;c=c||{};let d=null;if(!c.rtl)d=o.match(u[l.COERCE]);else{let p;for(;(p=u[l.COERCERTL].exec(o))&&(!d||d.index+d[0].length!==o.length);)(!d||p.index+p[0].length!==d.index+d[0].length)&&(d=p),u[l.COERCERTL].lastIndex=p.index+p[1].length+p[2].length;u[l.COERCERTL].lastIndex=-1}return d===null?null:i(`${d[2]}.${d[3]||"0"}.${d[4]||"0"}`,c)},Mc}var Cc,m0;function FS(){return m0||(m0=1,Cc=function(n){n.prototype[Symbol.iterator]=function*(){for(let i=this.head;i;i=i.next)yield i.value}}),Cc}var xc,g0;function XS(){if(g0)return xc;g0=1,xc=n,n.Node=s,n.create=n;function n(o){var c=this;if(c instanceof n||(c=new n),c.tail=null,c.head=null,c.length=0,o&&typeof o.forEach=="function")o.forEach(function(m){c.push(m)});else if(arguments.length>0)for(var d=0,p=arguments.length;d1)d=c;else if(this.head)p=this.head.next,d=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var m=0;p!==null;m++)d=o(d,p.value,m),p=p.next;return d},n.prototype.reduceReverse=function(o,c){var d,p=this.tail;if(arguments.length>1)d=c;else if(this.tail)p=this.tail.prev,d=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var m=this.length-1;p!==null;m--)d=o(d,p.value,m),p=p.prev;return d},n.prototype.toArray=function(){for(var o=new Array(this.length),c=0,d=this.head;d!==null;c++)o[c]=d.value,d=d.next;return o},n.prototype.toArrayReverse=function(){for(var o=new Array(this.length),c=0,d=this.tail;d!==null;c++)o[c]=d.value,d=d.prev;return o},n.prototype.slice=function(o,c){c=c||this.length,c<0&&(c+=this.length),o=o||0,o<0&&(o+=this.length);var d=new n;if(cthis.length&&(c=this.length);for(var p=0,m=this.head;m!==null&&pthis.length&&(c=this.length);for(var p=this.length,m=this.tail;m!==null&&p>c;p--)m=m.prev;for(;m!==null&&p>o;p--,m=m.prev)d.push(m.value);return d},n.prototype.splice=function(o,c,...d){o>this.length&&(o=this.length-1),o<0&&(o=this.length+o);for(var p=0,m=this.head;m!==null&&p1;class q{constructor(_){if(typeof _=="number"&&(_={max:_}),_||(_={}),_.max&&(typeof _.max!="number"||_.max<0))throw new TypeError("max must be a non-negative number");this[i]=_.max||1/0;const O=_.length||S;if(this[l]=typeof O!="function"?S:O,this[s]=_.stale||!1,_.maxAge&&typeof _.maxAge!="number")throw new TypeError("maxAge must be a number");this[o]=_.maxAge||0,this[c]=_.dispose,this[d]=_.noDisposeOnSet||!1,this[v]=_.updateAgeOnGet||!1,this.reset()}set max(_){if(typeof _!="number"||_<0)throw new TypeError("max must be a non-negative number");this[i]=_||1/0,D(this)}get max(){return this[i]}set allowStale(_){this[s]=!!_}get allowStale(){return this[s]}set maxAge(_){if(typeof _!="number")throw new TypeError("maxAge must be a non-negative number");this[o]=_,D(this)}get maxAge(){return this[o]}set lengthCalculator(_){typeof _!="function"&&(_=S),_!==this[l]&&(this[l]=_,this[u]=0,this[p].forEach(O=>{O.length=this[l](O.value,O.key),this[u]+=O.length})),D(this)}get lengthCalculator(){return this[l]}get length(){return this[u]}get itemCount(){return this[p].length}rforEach(_,O){O=O||this;for(let b=this[p].tail;b!==null;){const T=b.prev;g(this,_,b,O),b=T}}forEach(_,O){O=O||this;for(let b=this[p].head;b!==null;){const T=b.next;g(this,_,b,O),b=T}}keys(){return this[p].toArray().map(_=>_.key)}values(){return this[p].toArray().map(_=>_.value)}reset(){this[c]&&this[p]&&this[p].length&&this[p].forEach(_=>this[c](_.key,_.value)),this[m]=new Map,this[p]=new n,this[u]=0}dump(){return this[p].map(_=>U(this,_)?!1:{k:_.key,v:_.value,e:_.now+(_.maxAge||0)}).toArray().filter(_=>_)}dumpLru(){return this[p]}set(_,O,b){if(b=b||this[o],b&&typeof b!="number")throw new TypeError("maxAge must be a number");const T=b?Date.now():0,$=this[l](O,_);if(this[m].has(_)){if($>this[i])return y(this,this[m].get(_)),!1;const G=this[m].get(_).value;return this[c]&&(this[d]||this[c](_,G.value)),G.now=T,G.maxAge=b,G.value=O,this[u]+=$-G.length,G.length=$,this.get(_),D(this),!0}const M=new A(_,O,$,T,b);return M.length>this[i]?(this[c]&&this[c](_,O),!1):(this[u]+=M.length,this[p].unshift(M),this[m].set(_,this[p].head),D(this),!0)}has(_){if(!this[m].has(_))return!1;const O=this[m].get(_).value;return!U(this,O)}get(_){return C(this,_,!0)}peek(_){return C(this,_,!1)}pop(){const _=this[p].tail;return _?(y(this,_),_.value):null}del(_){y(this,this[m].get(_))}load(_){this.reset();const O=Date.now();for(let b=_.length-1;b>=0;b--){const T=_[b],$=T.e||0;if($===0)this.set(T.k,T.v);else{const M=$-O;M>0&&this.set(T.k,T.v,M)}}}prune(){this[m].forEach((_,O)=>C(this,O,!1))}}const C=(E,_,O)=>{const b=E[m].get(_);if(b){const T=b.value;if(U(E,T)){if(y(E,b),!E[s])return}else O&&(E[v]&&(b.value.now=Date.now()),E[p].unshiftNode(b));return T.value}},U=(E,_)=>{if(!_||!_.maxAge&&!E[o])return!1;const O=Date.now()-_.now;return _.maxAge?O>_.maxAge:E[o]&&O>E[o]},D=E=>{if(E[u]>E[i])for(let _=E[p].tail;E[u]>E[i]&&_!==null;){const O=_.prev;y(E,_),_=O}},y=(E,_)=>{if(_){const O=_.value;E[c]&&E[c](O.key,O.value),E[u]-=O.length,E[m].delete(O.key),E[p].removeNode(_)}};class A{constructor(_,O,b,T,$){this.key=_,this.value=O,this.length=b,this.now=T,this.maxAge=$||0}}const g=(E,_,O,b)=>{let T=O.value;U(E,T)&&(y(E,O),E[s]||(T=void 0)),T&&_.call(b,T.value,T.key,E)};return Lc=q,Lc}var qc,v0;function pn(){if(v0)return qc;v0=1;class n{constructor(J,ne){if(ne=l(ne),J instanceof n)return J.loose===!!ne.loose&&J.includePrerelease===!!ne.includePrerelease?J:new n(J.raw,ne);if(J instanceof s)return this.raw=J.value,this.set=[[J]],this.format(),this;if(this.options=ne,this.loose=!!ne.loose,this.includePrerelease=!!ne.includePrerelease,this.raw=J.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(P=>this.parseRange(P)).filter(P=>P.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const P=this.set[0];if(this.set=this.set.filter(se=>!U(se[0])),this.set.length===0)this.set=[P];else if(this.set.length>1){for(const se of this.set)if(se.length===1&&D(se[0])){this.set=[se];break}}}this.format()}format(){return this.range=this.set.map(J=>J.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(J){const P=((this.options.includePrerelease&&q)|(this.options.loose&&C))+":"+J,se=u.get(P);if(se)return se;const re=this.options.loose,de=re?d[p.HYPHENRANGELOOSE]:d[p.HYPHENRANGE];J=J.replace(de,G(this.options.includePrerelease)),o("hyphen replace",J),J=J.replace(d[p.COMPARATORTRIM],m),o("comparator trim",J),J=J.replace(d[p.TILDETRIM],v),o("tilde trim",J),J=J.replace(d[p.CARETTRIM],S),o("caret trim",J);let R=J.split(" ").map(N=>A(N,this.options)).join(" ").split(/\s+/).map(N=>j(N,this.options));re&&(R=R.filter(N=>(o("loose invalid filter",N,this.options),!!N.match(d[p.COMPARATORLOOSE])))),o("range list",R);const z=new Map,K=R.map(N=>new s(N,this.options));for(const N of K){if(U(N))return[N];z.set(N.value,N)}z.size>1&&z.has("")&&z.delete("");const Y=[...z.values()];return u.set(P,Y),Y}intersects(J,ne){if(!(J instanceof n))throw new TypeError("a Range is required");return this.set.some(P=>y(P,ne)&&J.set.some(se=>y(se,ne)&&P.every(re=>se.every(de=>re.intersects(de,ne)))))}test(J){if(!J)return!1;if(typeof J=="string")try{J=new c(J,this.options)}catch{return!1}for(let ne=0;neW.value==="<0.0.0-0",D=W=>W.value==="",y=(W,J)=>{let ne=!0;const P=W.slice();let se=P.pop();for(;ne&&P.length;)ne=P.every(re=>se.intersects(re,J)),se=P.pop();return ne},A=(W,J)=>(o("comp",W,J),W=O(W,J),o("caret",W),W=E(W,J),o("tildes",W),W=T(W,J),o("xrange",W),W=M(W,J),o("stars",W),W),g=W=>!W||W.toLowerCase()==="x"||W==="*",E=(W,J)=>W.trim().split(/\s+/).map(ne=>_(ne,J)).join(" "),_=(W,J)=>{const ne=J.loose?d[p.TILDELOOSE]:d[p.TILDE];return W.replace(ne,(P,se,re,de,R)=>{o("tilde",W,P,se,re,de,R);let z;return g(se)?z="":g(re)?z=`>=${se}.0.0 <${+se+1}.0.0-0`:g(de)?z=`>=${se}.${re}.0 <${se}.${+re+1}.0-0`:R?(o("replaceTilde pr",R),z=`>=${se}.${re}.${de}-${R} <${se}.${+re+1}.0-0`):z=`>=${se}.${re}.${de} <${se}.${+re+1}.0-0`,o("tilde return",z),z})},O=(W,J)=>W.trim().split(/\s+/).map(ne=>b(ne,J)).join(" "),b=(W,J)=>{o("caret",W,J);const ne=J.loose?d[p.CARETLOOSE]:d[p.CARET],P=J.includePrerelease?"-0":"";return W.replace(ne,(se,re,de,R,z)=>{o("caret",W,se,re,de,R,z);let K;return g(re)?K="":g(de)?K=`>=${re}.0.0${P} <${+re+1}.0.0-0`:g(R)?re==="0"?K=`>=${re}.${de}.0${P} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.0${P} <${+re+1}.0.0-0`:z?(o("replaceCaret pr",z),re==="0"?de==="0"?K=`>=${re}.${de}.${R}-${z} <${re}.${de}.${+R+1}-0`:K=`>=${re}.${de}.${R}-${z} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.${R}-${z} <${+re+1}.0.0-0`):(o("no pr"),re==="0"?de==="0"?K=`>=${re}.${de}.${R}${P} <${re}.${de}.${+R+1}-0`:K=`>=${re}.${de}.${R}${P} <${re}.${+de+1}.0-0`:K=`>=${re}.${de}.${R} <${+re+1}.0.0-0`),o("caret return",K),K})},T=(W,J)=>(o("replaceXRanges",W,J),W.split(/\s+/).map(ne=>$(ne,J)).join(" ")),$=(W,J)=>{W=W.trim();const ne=J.loose?d[p.XRANGELOOSE]:d[p.XRANGE];return W.replace(ne,(P,se,re,de,R,z)=>{o("xRange",W,P,se,re,de,R,z);const K=g(re),Y=K||g(de),N=Y||g(R),H=N;return se==="="&&H&&(se=""),z=J.includePrerelease?"-0":"",K?se===">"||se==="<"?P="<0.0.0-0":P="*":se&&H?(Y&&(de=0),R=0,se===">"?(se=">=",Y?(re=+re+1,de=0,R=0):(de=+de+1,R=0)):se==="<="&&(se="<",Y?re=+re+1:de=+de+1),se==="<"&&(z="-0"),P=`${se+re}.${de}.${R}${z}`):Y?P=`>=${re}.0.0${z} <${+re+1}.0.0-0`:N&&(P=`>=${re}.${de}.0${z} <${re}.${+de+1}.0-0`),o("xRange return",P),P})},M=(W,J)=>(o("replaceStars",W,J),W.trim().replace(d[p.STAR],"")),j=(W,J)=>(o("replaceGTE0",W,J),W.trim().replace(d[J.includePrerelease?p.GTE0PRE:p.GTE0],"")),G=W=>(J,ne,P,se,re,de,R,z,K,Y,N,H,te)=>(g(P)?ne="":g(se)?ne=`>=${P}.0.0${W?"-0":""}`:g(re)?ne=`>=${P}.${se}.0${W?"-0":""}`:de?ne=`>=${ne}`:ne=`>=${ne}${W?"-0":""}`,g(K)?z="":g(Y)?z=`<${+K+1}.0.0-0`:g(N)?z=`<${K}.${+Y+1}.0-0`:H?z=`<=${K}.${Y}.${N}-${H}`:W?z=`<${K}.${Y}.${+N+1}-0`:z=`<=${z}`,`${ne} ${z}`.trim()),X=(W,J,ne)=>{for(let P=0;P0){const se=W[P].semver;if(se.major===J.major&&se.minor===J.minor&&se.patch===J.patch)return!0}return!1}return!0};return qc}var Uc,b0;function Ns(){if(b0)return Uc;b0=1;const n=Symbol("SemVer ANY");class i{static get ANY(){return n}constructor(v,S){if(S=u(S),v instanceof i){if(v.loose===!!S.loose)return v;v=v.value}v=v.trim().split(/\s+/).join(" "),c("comparator",v,S),this.options=S,this.loose=!!S.loose,this.parse(v),this.semver===n?this.value="":this.value=this.operator+this.semver.version,c("comp",this)}parse(v){const S=this.options.loose?l[s.COMPARATORLOOSE]:l[s.COMPARATOR],q=v.match(S);if(!q)throw new TypeError(`Invalid comparator: ${v}`);this.operator=q[1]!==void 0?q[1]:"",this.operator==="="&&(this.operator=""),q[2]?this.semver=new d(q[2],this.options.loose):this.semver=n}toString(){return this.value}test(v){if(c("Comparator.test",v,this.options.loose),this.semver===n||v===n)return!0;if(typeof v=="string")try{v=new d(v,this.options)}catch{return!1}return o(v,this.operator,this.semver,this.options)}intersects(v,S){if(!(v instanceof i))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new p(v.value,S).test(this.value):v.operator===""?v.value===""?!0:new p(this.value,S).test(v.semver):(S=u(S),S.includePrerelease&&(this.value==="<0.0.0-0"||v.value==="<0.0.0-0")||!S.includePrerelease&&(this.value.startsWith("<0.0.0")||v.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&v.operator.startsWith(">")||this.operator.startsWith("<")&&v.operator.startsWith("<")||this.semver.version===v.semver.version&&this.operator.includes("=")&&v.operator.includes("=")||o(this.semver,"<",v.semver,S)&&this.operator.startsWith(">")&&v.operator.startsWith("<")||o(this.semver,">",v.semver,S)&&this.operator.startsWith("<")&&v.operator.startsWith(">")))}}Uc=i;const u=Ed(),{safeRe:l,t:s}=rl(),o=Ov(),c=Ts(),d=Nt(),p=pn();return Uc}var zc,E0;function js(){if(E0)return zc;E0=1;const n=pn();return zc=(u,l,s)=>{try{l=new n(l,s)}catch{return!1}return l.test(u)},zc}var Ic,_0;function ZS(){if(_0)return Ic;_0=1;const n=pn();return Ic=(u,l)=>new n(u,l).set.map(s=>s.map(o=>o.value).join(" ").trim().split(" ")),Ic}var Bc,S0;function JS(){if(S0)return Bc;S0=1;const n=Nt(),i=pn();return Bc=(l,s,o)=>{let c=null,d=null,p=null;try{p=new i(s,o)}catch{return null}return l.forEach(m=>{p.test(m)&&(!c||d.compare(m)===-1)&&(c=m,d=new n(c,o))}),c},Bc}var Hc,w0;function WS(){if(w0)return Hc;w0=1;const n=Nt(),i=pn();return Hc=(l,s,o)=>{let c=null,d=null,p=null;try{p=new i(s,o)}catch{return null}return l.forEach(m=>{p.test(m)&&(!c||d.compare(m)===1)&&(c=m,d=new n(c,o))}),c},Hc}var Vc,A0;function ew(){if(A0)return Vc;A0=1;const n=Nt(),i=pn(),u=Rs();return Vc=(s,o)=>{s=new i(s,o);let c=new n("0.0.0");if(s.test(c)||(c=new n("0.0.0-0"),s.test(c)))return c;c=null;for(let d=0;d{const S=new n(v.semver.version);switch(v.operator){case">":S.prerelease.length===0?S.patch++:S.prerelease.push(0),S.raw=S.format();case"":case">=":(!m||u(S,m))&&(m=S);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${v.operator}`)}}),m&&(!c||u(c,m))&&(c=m)}return c&&s.test(c)?c:null},Vc}var kc,$0;function tw(){if($0)return kc;$0=1;const n=pn();return kc=(u,l)=>{try{return new n(u,l).range||"*"}catch{return null}},kc}var Gc,O0;function $d(){if(O0)return Gc;O0=1;const n=Nt(),i=Ns(),{ANY:u}=i,l=pn(),s=js(),o=Rs(),c=Sd(),d=Ad(),p=wd();return Gc=(v,S,q,C)=>{v=new n(v,C),S=new l(S,C);let U,D,y,A,g;switch(q){case">":U=o,D=d,y=c,A=">",g=">=";break;case"<":U=c,D=p,y=o,A="<",g="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(s(v,S,C))return!1;for(let E=0;E{T.semver===u&&(T=new i(">=0.0.0")),O=O||T,b=b||T,U(T.semver,O.semver,C)?O=T:y(T.semver,b.semver,C)&&(b=T)}),O.operator===A||O.operator===g||(!b.operator||b.operator===A)&&D(v,b.semver))return!1;if(b.operator===g&&y(v,b.semver))return!1}return!0},Gc}var Yc,T0;function nw(){if(T0)return Yc;T0=1;const n=$d();return Yc=(u,l,s)=>n(u,l,">",s),Yc}var Pc,R0;function rw(){if(R0)return Pc;R0=1;const n=$d();return Pc=(u,l,s)=>n(u,l,"<",s),Pc}var Kc,N0;function iw(){if(N0)return Kc;N0=1;const n=pn();return Kc=(u,l,s)=>(u=new n(u,s),l=new n(l,s),u.intersects(l,s)),Kc}var Fc,j0;function aw(){if(j0)return Fc;j0=1;const n=js(),i=hn();return Fc=(u,l,s)=>{const o=[];let c=null,d=null;const p=u.sort((q,C)=>i(q,C,s));for(const q of p)n(q,l,s)?(d=q,c||(c=q)):(d&&o.push([c,d]),d=null,c=null);c&&o.push([c,null]);const m=[];for(const[q,C]of o)q===C?m.push(q):!C&&q===p[0]?m.push("*"):C?q===p[0]?m.push(`<=${C}`):m.push(`${q} - ${C}`):m.push(`>=${q}`);const v=m.join(" || "),S=typeof l.raw=="string"?l.raw:String(l);return v.length{if(S===q)return!0;S=new n(S,C),q=new n(q,C);let U=!1;e:for(const D of S.set){for(const y of q.set){const A=p(D,y,C);if(U=U||A!==null,A)continue e}if(U)return!1}return!0},c=[new i(">=0.0.0-0")],d=[new i(">=0.0.0")],p=(S,q,C)=>{if(S===q)return!0;if(S.length===1&&S[0].semver===u){if(q.length===1&&q[0].semver===u)return!0;C.includePrerelease?S=c:S=d}if(q.length===1&&q[0].semver===u){if(C.includePrerelease)return!0;q=d}const U=new Set;let D,y;for(const $ of S)$.operator===">"||$.operator===">="?D=m(D,$,C):$.operator==="<"||$.operator==="<="?y=v(y,$,C):U.add($.semver);if(U.size>1)return null;let A;if(D&&y){if(A=s(D.semver,y.semver,C),A>0)return null;if(A===0&&(D.operator!==">="||y.operator!=="<="))return null}for(const $ of U){if(D&&!l($,String(D),C)||y&&!l($,String(y),C))return null;for(const M of q)if(!l($,String(M),C))return!1;return!0}let g,E,_,O,b=y&&!C.includePrerelease&&y.semver.prerelease.length?y.semver:!1,T=D&&!C.includePrerelease&&D.semver.prerelease.length?D.semver:!1;b&&b.prerelease.length===1&&y.operator==="<"&&b.prerelease[0]===0&&(b=!1);for(const $ of q){if(O=O||$.operator===">"||$.operator===">=",_=_||$.operator==="<"||$.operator==="<=",D){if(T&&$.semver.prerelease&&$.semver.prerelease.length&&$.semver.major===T.major&&$.semver.minor===T.minor&&$.semver.patch===T.patch&&(T=!1),$.operator===">"||$.operator===">="){if(g=m(D,$,C),g===$&&g!==D)return!1}else if(D.operator===">="&&!l(D.semver,String($),C))return!1}if(y){if(b&&$.semver.prerelease&&$.semver.prerelease.length&&$.semver.major===b.major&&$.semver.minor===b.minor&&$.semver.patch===b.patch&&(b=!1),$.operator==="<"||$.operator==="<="){if(E=v(y,$,C),E===$&&E!==y)return!1}else if(y.operator==="<="&&!l(y.semver,String($),C))return!1}if(!$.operator&&(y||D)&&A!==0)return!1}return!(D&&_&&!y&&A!==0||y&&O&&!D&&A!==0||T||b)},m=(S,q,C)=>{if(!S)return q;const U=s(S.semver,q.semver,C);return U>0?S:U<0||q.operator===">"&&S.operator===">="?q:S},v=(S,q,C)=>{if(!S)return q;const U=s(S.semver,q.semver,C);return U<0?S:U>0||q.operator==="<"&&S.operator==="<="?q:S};return Xc=o,Xc}var Qc,M0;function uw(){if(M0)return Qc;M0=1;const n=rl(),i=Os(),u=Nt(),l=wv(),s=Vi(),o=LS(),c=qS(),d=US(),p=zS(),m=IS(),v=BS(),S=HS(),q=VS(),C=hn(),U=kS(),D=GS(),y=_d(),A=YS(),g=PS(),E=Rs(),_=Sd(),O=Av(),b=$v(),T=wd(),$=Ad(),M=Ov(),j=KS(),G=Ns(),X=pn(),W=js(),J=ZS(),ne=JS(),P=WS(),se=ew(),re=tw(),de=$d(),R=nw(),z=rw(),K=iw(),Y=aw(),N=lw();return Qc={parse:s,valid:o,clean:c,inc:d,diff:p,major:m,minor:v,patch:S,prerelease:q,compare:C,rcompare:U,compareLoose:D,compareBuild:y,sort:A,rsort:g,gt:E,lt:_,eq:O,neq:b,gte:T,lte:$,cmp:M,coerce:j,Comparator:G,Range:X,satisfies:W,toComparators:J,maxSatisfying:ne,minSatisfying:P,minVersion:se,validRange:re,outside:de,gtr:R,ltr:z,intersects:K,simplifyRange:Y,subset:N,SemVer:u,re:n.re,src:n.src,tokens:n.t,SEMVER_SPEC_VERSION:i.SEMVER_SPEC_VERSION,RELEASE_TYPES:i.RELEASE_TYPES,compareIdentifiers:l.compareIdentifiers,rcompareIdentifiers:l.rcompareIdentifiers},Qc}var Zc=uw(),Jc={exports:{}};/** * @preserve * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) * @@ -68,8 +68,39 @@ list should be an Array.`),M.length===0)return new g(0);if(M.length===1)return M * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ - */var Yg;function y_(){return Yg||(Yg=1,function(r){(function(){var i;function u(l,c){var o=this instanceof u?this:i;if(o.reset(c),typeof l=="string"&&l.length>0&&o.hash(l),o!==this)return o}u.prototype.hash=function(l){var c,o,d,h,m;switch(m=l.length,this.len+=m,o=this.k1,d=0,this.rem){case 0:o^=m>d?l.charCodeAt(d++)&65535:0;case 1:o^=m>d?(l.charCodeAt(d++)&65535)<<8:0;case 2:o^=m>d?(l.charCodeAt(d++)&65535)<<16:0;case 3:o^=m>d?(l.charCodeAt(d)&255)<<24:0,o^=m>d?(l.charCodeAt(d++)&65280)>>8:0}if(this.rem=m+this.rem&3,m-=this.rem,m>0){for(c=this.h1;o=o*11601+(o&65535)*3432906752&4294967295,o=o<<15|o>>>17,o=o*13715+(o&65535)*461832192&4294967295,c^=o,c=c<<13|c>>>19,c=c*5+3864292196&4294967295,!(d>=m);)o=l.charCodeAt(d++)&65535^(l.charCodeAt(d++)&65535)<<8^(l.charCodeAt(d++)&65535)<<16,h=l.charCodeAt(d++),o^=(h&255)<<24^(h&65280)>>8;switch(o=0,this.rem){case 3:o^=(l.charCodeAt(d+2)&65535)<<16;case 2:o^=(l.charCodeAt(d+1)&65535)<<8;case 1:o^=l.charCodeAt(d)&65535}this.h1=c}return this.k1=o,this},u.prototype.result=function(){var l,c;return l=this.k1,c=this.h1,l>0&&(l=l*11601+(l&65535)*3432906752&4294967295,l=l<<15|l>>>17,l=l*13715+(l&65535)*461832192&4294967295,c^=l),c^=this.len,c^=c>>>16,c=c*51819+(c&65535)*2246770688&4294967295,c^=c>>>13,c=c*44597+(c&65535)*3266445312&4294967295,c^=c>>>16,c>>>0},u.prototype.reset=function(l){return this.h1=typeof l=="number"?l:0,this.rem=this.k1=this.len=0,this},i=new u,r.exports=u})()}($c)),$c.exports}var g_=y_();const v_=Xl(g_);var b_="https://flagd.dev/schema/v0/flags.json",E_="http://json-schema.org/draft-07/schema#",__="flagd Flag Configuration",S_="Defines flags for use in flagd, including typed variants and rules.",w_="object",$_={flags:{title:"Flags",description:"Top-level flags object. All flags are defined here.",type:"object",$comment:"flag objects are one of the 4 flag types defined in definitions",additionalProperties:!1,patternProperties:{"^.{1,}$":{oneOf:[{title:"Boolean flag",description:"A flag having boolean values.",$ref:"#/definitions/booleanFlag"},{title:"String flag",description:"A flag having string values.",$ref:"#/definitions/stringFlag"},{title:"Numeric flag",description:"A flag having numeric values.",$ref:"#/definitions/numberFlag"},{title:"Object flag",description:"A flag having arbitrary object values.",$ref:"#/definitions/objectFlag"}]}}},$evaluators:{title:"Evaluators",description:'Reusable targeting rules that can be referenced with "$ref": "myRule" in multiple flags.',type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{$comment:"this relative ref means that targeting.json MUST be in the same dir, or available on the same HTTP path",$ref:"./targeting.json"}}},metadata:{title:"Flag Set Metadata",description:"Metadata about the flag set, with keys of type string, and values of type boolean, string, or number.",properties:{flagSetId:{description:"The unique identifier for the flag set.",type:"string"},version:{description:"The version of the flag set.",type:"string"}},$ref:"#/definitions/metadata"}},O_={flag:{$comment:"base flag object; no title/description here, allows for better UX, keep it in the overrides",type:"object",properties:{state:{title:"Flag State",description:"Indicates whether the flag is functional. Disabled flags are treated as if they don't exist.",type:"string",enum:["ENABLED","DISABLED"]},defaultVariant:{title:"Default Variant",description:"The variant to serve if no dynamic targeting applies (including if the targeting returns null).",type:"string"},targeting:{$ref:"./targeting.json"},metadata:{title:"Flag Metadata",description:"Metadata about an individual feature flag, with keys of type string, and values of type boolean, string, or number.",$ref:"#/definitions/metadata"}},required:["state","defaultVariant"]},booleanVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"boolean"}},default:{true:!0,false:!1}}}},stringVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"string"}}}}},numberVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"number"}}}}},objectVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"object"}}}}},booleanFlag:{$comment:"merge the variants with the base flag to build our typed flags",allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/booleanVariants"}]},stringFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/stringVariants"}]},numberFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/numberVariants"}]},objectFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/objectVariants"}]},metadata:{type:"object",additionalProperties:{description:"Any additional key/value pair with value of type boolean, string, or number.",type:["string","number","boolean"]},required:[]}},A_={$id:b_,$schema:E_,title:__,description:S_,type:w_,properties:$_,definitions:O_},R_="https://flagd.dev/schema/v0/targeting.json",T_="http://json-schema.org/draft-07/schema#",N_="flagd Targeting",j_='Defines targeting logic for flagd; a extension of JSONLogic, including purpose-built feature-flagging operations. Note that this schema applies to top-level objects; no additional properties are supported, including "$schema", which means built-in JSON-schema support is not possible in editors. Please use flags.json (which imports this schema) for a rich editor experience.',D_="object",M_=[{$comment:"we need this to support empty targeting",type:"object",additionalProperties:!1,properties:{}},{$ref:"#/definitions/anyRule"}],q_={primitive:{oneOf:[{description:'When returned from rules, a null value "exits", the targeting, and the "defaultValue" is returned, with the reason indicating the targeting did not match.',type:"null"},{description:'When returned from rules, booleans are converted to strings ("true"/"false"), and used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!',type:"boolean"},{description:"When returned from rules, the behavior of numbers is not defined.",type:"number"},{description:'When returned from rules, strings are used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!.',type:"string"},{description:'When returned from rules, strings are used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!.',type:"array"}]},varRule:{title:"Var Operation",description:"Retrieve data from the provided data object.",type:"object",additionalProperties:!1,properties:{var:{anyOf:[{type:"string",description:'flagd automatically injects "$flagd.timestamp" (unix epoch) and "$flagd.flagKey" (the key of the flag in evaluation) into the context.',pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},{not:{$comment:'this is a negated (not) match of "$flagd.{some-key}", which is faster and more compatible that a negative lookahead regex',type:"string",description:'flagd automatically injects "$flagd.timestamp" (unix epoch) and "$flagd.flagKey" (the key of the flag in evaluation) into the context.',pattern:"^\\$flagd\\..*$"}},{type:"array",$comment:"this is to support the form of var with a default... there seems to be a bug here, where ajv gives a warning (not an error) because maxItems doesn't equal the number of entries in items, though this is valid in this case",minItems:1,items:[{type:"string"}],additionalItems:{anyOf:[{type:"null"},{type:"boolean"},{type:"string"},{type:"number"}]}}]}}},missingRule:{title:"Missing Operation",description:"Takes an array of data keys to search for (same format as var). Returns an array of any keys that are missing from the data object, or an empty array.",type:"object",additionalProperties:!1,properties:{missing:{type:"array",items:{type:"string"}}}},missingSomeRule:{title:"Missing-Some Operation",description:"Takes a minimum number of data keys that are required, and an array of keys to search for (same format as var or missing). Returns an empty array if the minimum is met, or an array of the missing keys otherwise.",type:"object",additionalProperties:!1,properties:{missing_some:{minItems:2,maxItems:2,type:"array",items:[{type:"number"},{type:"array",items:{type:"string"}}]}}},binaryOrTernaryOp:{type:"array",minItems:2,maxItems:3,items:{$ref:"#/definitions/args"}},binaryOrTernaryRule:{type:"object",additionalProperties:!1,properties:{substr:{title:"Substring Operation",description:"Get a portion of a string. Give a positive start position to return everything beginning at that index. Give a negative start position to work backwards from the end of the string, then return everything. Give a positive length to express how many characters to return.",$ref:"#/definitions/binaryOrTernaryOp"},"<":{title:"Less-Than/Between Operation. Can be used to test that one value is between two others.",$ref:"#/definitions/binaryOrTernaryOp"},"<=":{title:"Less-Than-Or-Equal-To/Between Operation. Can be used to test that one value is between two others.",$ref:"#/definitions/binaryOrTernaryOp"}}},binaryOp:{type:"array",minItems:2,maxItems:2,items:{$ref:"#/definitions/args"}},binaryRule:{title:"Binary Operation",description:"Any primitive JSONLogic operation with 2 operands.",type:"object",additionalProperties:!1,properties:{if:{title:"If Operator",description:'The if statement takes 1 or more arguments: a condition ("if"), what to do if its true ("then", optional, defaults to returning true), and what to do if its false ("else", optional, defaults to returning false). Note that the else condition can be used as an else-if statement by adding additional arguments.',$ref:"#/definitions/variadicOp"},"==":{title:"Lose Equality Operation",description:"Tests equality, with type coercion. Requires two arguments.",$ref:"#/definitions/binaryOp"},"===":{title:"Strict Equality Operation",description:"Tests strict equality. Requires two arguments.",$ref:"#/definitions/binaryOp"},"!=":{title:"Lose Inequality Operation",description:"Tests not-equal, with type coercion.",$ref:"#/definitions/binaryOp"},"!==":{title:"Strict Inequality Operation",description:"Tests strict not-equal.",$ref:"#/definitions/binaryOp"},">":{title:"Greater-Than Operation",$ref:"#/definitions/binaryOp"},">=":{title:"Greater-Than-Or-Equal-To Operation",$ref:"#/definitions/binaryOp"},"%":{title:"Modulo Operation",description:"Finds the remainder after the first argument is divided by the second argument.",$ref:"#/definitions/binaryOp"},"/":{title:"Division Operation",$ref:"#/definitions/binaryOp"},map:{title:"Map Operation",description:"Perform an action on every member of an array. Note, that inside the logic being used to map, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},filter:{title:"Filter Operation",description:"Keep only elements of the array that pass a test. Note, that inside the logic being used to filter, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},all:{title:"All Operation",description:"Perform a test on each member of that array, returning true if all pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},none:{title:"None Operation",description:"Perform a test on each member of that array, returning true if none pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},some:{title:"Some Operation",description:"Perform a test on each member of that array, returning true if some pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},in:{title:"In Operation",description:"If the second argument is an array, tests that the first argument is a member of the array.",$ref:"#/definitions/binaryOp"}}},reduceRule:{type:"object",additionalProperties:!1,properties:{reduce:{title:"Reduce Operation",description:'Combine all the elements in an array into a single value, like adding up a list of numbers. Note, that inside the logic being used to reduce, var operations only have access to an object with a "current" and a "accumulator".',type:"array",minItems:3,maxItems:3,items:{$ref:"#/definitions/args"}}}},associativeOp:{type:"array",minItems:2,items:{$ref:"#/definitions/args"}},associativeRule:{title:"Mathematically Associative Operation",description:"Operation applicable to 2 or more parameters.",type:"object",additionalProperties:!1,properties:{"*":{title:"Multiplication Operation",description:"Multiplication; associative, will accept and unlimited amount of arguments.",$ref:"#/definitions/associativeOp"}}},unaryOp:{anyOf:[{type:"array",minItems:1,maxItems:1,items:{$ref:"#/definitions/args"}},{$ref:"#/definitions/args"}]},unaryRule:{title:"Unary Operation",description:"Any primitive JSONLogic operation with 1 operands.",type:"object",additionalProperties:!1,properties:{"!":{title:"Negation Operation",description:"Logical negation (“not”). Takes just one argument.",$ref:"#/definitions/unaryOp"},"!!":{title:"Double Negation Operation",description:"Double negation, or 'cast to a boolean'. Takes a single argument.",$ref:"#/definitions/unaryOp"}}},variadicOp:{type:"array",minItems:1,items:{$ref:"#/definitions/args"}},variadicRule:{$comment:"note < and <= can be used with up to 3 ops (between)",type:"object",additionalProperties:!1,properties:{or:{title:"Or Operation",description:'Simple boolean test, with 1 or more arguments. At a more sophisticated level, "or" returns the first truthy argument, or the last argument.',$ref:"#/definitions/variadicOp"},and:{title:"",description:'Simple boolean test, with 1 or more arguments. At a more sophisticated level, "and" returns the first falsy argument, or the last argument.',$ref:"#/definitions/variadicOp"},"+":{title:"Addition Operation",description:"Addition; associative, will accept and unlimited amount of arguments.",$ref:"#/definitions/variadicOp"},"-":{title:"Subtraction Operation",$ref:"#/definitions/variadicOp"},max:{title:"Maximum Operation",description:"Return the maximum from a list of values.",$ref:"#/definitions/variadicOp"},min:{title:"Minimum Operation",description:"Return the minimum from a list of values.",$ref:"#/definitions/variadicOp"},merge:{title:"Merge Operation",description:"Takes one or more arrays, and merges them into one array. If arguments aren't arrays, they get cast to arrays.",$ref:"#/definitions/variadicOp"},cat:{title:"Concatenate Operation",description:"Concatenate all the supplied arguments. Note that this is not a join or implode operation, there is no “glue” string.",$ref:"#/definitions/variadicOp"}}},stringCompareArg:{oneOf:[{type:"string"},{$ref:"#/definitions/anyRule"}]},stringCompareArgs:{type:"array",minItems:2,maxItems:2,items:{$ref:"#/definitions/stringCompareArg"}},stringCompareRule:{type:"object",additionalProperties:!1,properties:{starts_with:{title:"Starts-With Operation",description:"The string attribute starts with the specified string value.",$ref:"#/definitions/stringCompareArgs"},ends_with:{title:"Ends-With Operation",description:"The string attribute ends with the specified string value.",$ref:"#/definitions/stringCompareArgs"}}},semVerString:{title:"Semantic Version String",description:"A string representing a valid semantic version expression as per https://semver.org/.",type:"string",pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},ruleSemVer:{type:"object",additionalProperties:!1,properties:{sem_ver:{title:"Semantic Version Operation",description:'Attribute matches a semantic version condition. Accepts "npm-style" range specifiers: "=", "!=", ">", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',type:"array",minItems:3,maxItems:3,items:[{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]},{description:'Range specifiers: "=", "!=", ">", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',enum:["=","!=",">","<",">=","<=","~","^"]},{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]}]}}},fractionalWeightArg:{description:"Distribution for all possible variants, with their associated weighting.",type:"array",minItems:1,maxItems:2,items:[{description:'If this bucket is randomly selected, this string is used to as a key to retrieve the associated value from the "variants" object.',type:"string"},{description:"Weighted distribution for this variant key.",type:"number"}]},fractionalOp:{type:"array",minItems:3,$comment:"there seems to be a bug here, where ajv gives a warning (not an error) because maxItems doesn't equal the number of entries in items, though this is valid in this case",items:[{description:"Bucketing value used in pseudorandom assignment; should be unique and stable for each subject of flag evaluation. Defaults to a concatenation of the flagKey and targetingKey.",$ref:"#/definitions/anyRule"},{$ref:"#/definitions/fractionalWeightArg"},{$ref:"#/definitions/fractionalWeightArg"}],additionalItems:{$ref:"#/definitions/fractionalWeightArg"}},fractionalShorthandOp:{type:"array",minItems:2,items:{$ref:"#/definitions/fractionalWeightArg"}},fractionalRule:{type:"object",additionalProperties:!1,properties:{fractional:{title:"Fractional Operation",description:"Deterministic, pseudorandom fractional distribution.",oneOf:[{$ref:"#/definitions/fractionalOp"},{$ref:"#/definitions/fractionalShorthandOp"}]}}},reference:{additionalProperties:!1,type:"object",$comment:"patternProperties here is a bit of a hack to prevent this definition from being dereferenced early.",patternProperties:{"^\\$ref$":{title:"Reference",description:"A reference to another entity, used for $evaluators (shared rules).",type:"string"}}},args:{oneOf:[{$ref:"#/definitions/reference"},{$ref:"#/definitions/anyRule"},{$ref:"#/definitions/primitive"}]},anyRule:{anyOf:[{$ref:"#/definitions/varRule"},{$ref:"#/definitions/missingRule"},{$ref:"#/definitions/missingSomeRule"},{$ref:"#/definitions/binaryRule"},{$ref:"#/definitions/binaryOrTernaryRule"},{$ref:"#/definitions/associativeRule"},{$ref:"#/definitions/unaryRule"},{$ref:"#/definitions/variadicRule"},{$ref:"#/definitions/reduceRule"},{$ref:"#/definitions/stringCompareRule"},{$ref:"#/definitions/ruleSemVer"},{$ref:"#/definitions/fractionalRule"}]}},C_={$id:R_,$schema:T_,title:N_,description:j_,type:D_,anyOf:M_,definitions:q_};const Vl="$flagd",$v="flagKey",z_="timestamp",U_="targetingKey",Ov=Symbol.for("flagd.logger");function Ic(r){const i=r[Ov];if(!i)throw new Error("Logger not found in context");return i}const Yc="starts_with",kc="ends_with";function L_(r,i){return Av(Yc,r,i)}function V_(r,i){return Av(kc,r,i)}function Av(r,i,u){const l=Ic(u);if(!Array.isArray(i))return l.debug("Invalid comparison configuration: input is not an array"),!1;if(i.length!=2)return l.debug(`Invalid comparison configuration: invalid array length ${i.length}`),!1;if(typeof i[0]!="string"||typeof i[1]!="string")return l.debug("Invalid comparison configuration: array values are not strings"),!1;switch(r){case Yc:return i[0].startsWith(i[1]);case kc:return i[0].endsWith(i[1]);default:return l.debug(`Invalid comparison configuration: Invalid method '${r}'`),!1}}const xl="sem_ver";function x_(r,i){const u=Ic(i);if(!Array.isArray(r))return u.debug(`Invalid ${xl} configuration: Expected an array`),!1;const l=Array.from(r);if(l.length!=3)return u.debug(`Invalid ${xl} configuration: Expected 3 arguments, got ${l.length}`),!1;const c=wc.parse(l[0]),o=wc.parse(l[2]);if(!c||!o)return u.debug(`Invalid ${xl} configuration: Unable to parse semver`),!1;const d=String(l[1]),h=wc.compare(c,o);switch(d){case"=":return h==0;case"!=":return h!=0;case"<":return h<0;case"<=":return h<=0;case">=":return h>=0;case">":return h>0;case"^":return c.major==o.major;case"~":return c.major==o.major&&c.minor==o.minor}return!1}const Nc="fractional";function B_(r,i){const u=Ic(i);if(!Array.isArray(r))return null;const l=Array.from(r);if(l.length<2)return u.debug(`Invalid ${Nc} configuration: Expected at least 2 buckets, got ${l.length}`),null;const c=i[Vl];if(!c)return u.debug("Missing flagd properties, cannot perform fractional targeting"),null;let o,d;if(typeof l[0]=="string")o=l[0],d=l.slice(1,l.length);else{const N=i[U_];if(!N)return u.debug("Missing targetingKey property, cannot perform fractional targeting"),null;o=`${c[$v]}${N}`,d=l}let h;try{h=G_(d)}catch(N){return u.debug(`Invalid ${Nc} configuration: `,N.message),null}const m=new v_(o).result()|0,y=Math.abs(m)/2147483648*100;let S=0;for(let N=0;N=y)return x.variant}return null}function H_(r,i){return i==0?0:i*100/r}function G_(r){const i=[];let u=0;for(let l=0;l2)throw new Error("Invalid bucketing entry. Requires at least a variant");if(typeof c[0]!="string")throw new Error("Bucketing require variant to be present in string format");let o=1;if(c.length>=2){if(typeof c[1]!="number")throw new Error("Bucketing require bucketing percentage to be present");o=c[1]}i.push({fraction:o,variant:c[0]}),u+=o}return{fractions:i,totalWeight:u}}class I_{constructor(i,u){this.logger=u;const l=new Uc;l.addMethod(Yc,L_),l.addMethod(kc,V_),l.addMethod(xl,x_),l.addMethod(Nc,B_),this._logicEngine=l.build(i)}evaluate(i,u,l=this.logger){return Object.hasOwn(u,Vl)&&this.logger.debug(`overwriting ${Vl} property in the context`),this._logicEngine(Object.assign(Object.assign({},u),{[Vl]:{[$v]:i,[z_]:Math.floor(Date.now()/1e3)},[Ov]:l}))}}class Y_{constructor(i,u,l){var c;if(this.logger=l,this._key=i,this._state=u.state,this._defaultVariant=u.defaultVariant,this._variants=new Map(Object.entries(u.variants)),this._metadata=(c=u.metadata)!==null&&c!==void 0?c:{},u.targeting&&Object.keys(u.targeting).length>0)try{this._targeting=new I_(u.targeting,l)}catch{const d=`Invalid targeting configuration for flag '${i}'`;this.logger.warn(d),this._targetingParseErrorMessage=d}this._hash=TE.sha1(u),this.validateStructure()}get key(){return this._key}get hash(){return this._hash}get state(){return this._state}get defaultVariant(){return this._defaultVariant}get variants(){return this._variants}get metadata(){return this._metadata}evaluate(i,u=this.logger){let l,c;if(this._targetingParseErrorMessage)return{reason:Cn.ERROR,errorCode:Vr.PARSE_ERROR,errorMessage:this._targetingParseErrorMessage,flagMetadata:this.metadata};if(!this._targeting)l=this._defaultVariant,c=Cn.STATIC;else{let d;try{d=this._targeting.evaluate(this._key,i,u)}catch(h){return u.debug(`Error evaluating targeting rule for flag '${this._key}': ${h.message}`),{reason:Cn.ERROR,errorCode:Vr.GENERAL,errorMessage:`Error evaluating targeting rule for flag '${this._key}'`,flagMetadata:this.metadata}}d==null?(l=this._defaultVariant,c=Cn.DEFAULT):(l=d.toString(),c=Cn.TARGETING_MATCH)}const o=this._variants.get(l);return o===void 0?{reason:Cn.ERROR,errorCode:Vr.GENERAL,errorMessage:`Variant '${l}' not found in flag with key '${this._key}'`,flagMetadata:this.metadata}:{value:o,reason:c,variant:l,flagMetadata:this.metadata}}validateStructure(){if(this._state!=="ENABLED"&&this._state!=="DISABLED")throw new $a(`Invalid flag state: ${JSON.stringify(this._state,void 0,2)}`);if(this._defaultVariant===void 0)throw new $a(`Invalid flag defaultVariant: ${JSON.stringify(this._defaultVariant,void 0,2)}`);if(!this._variants.has(this._defaultVariant))throw new $a(`Default variant ${this._defaultVariant} missing from variants ${JSON.stringify(this._variants,void 0,2)}`)}}const k_=new AE({strict:!1}),kg=k_.addSchema(C_).compile(A_),P_="$evaluators",K_=new RegExp("^[^{]*\\{|}[^}]*$","g"),Pg="invalid flagd flag configuration";function X_(r,i,u){var l;try{const c=Q_(r),o=JSON.parse(c);if(!kg(o)){const y=`${Pg}: ${JSON.stringify(kg.errors,void 0,2)}`;if(i)throw new $a(y);u.debug(y)}const h=new Map,m=(l=o.metadata)!==null&&l!==void 0?l:{};for(const y in o.flags){const S=o.flags[y];h.set(y,new Y_(y,Object.assign(Object.assign({},S),{metadata:Object.assign(Object.assign({},o.metadata),S.metadata)}),u))}return{flags:h,metadata:m}}catch(c){throw c instanceof $a?c:new $a(Pg,{cause:c})}}function Q_(r){const i=JSON.parse(r)[P_];if(!i)return r;let u=r;for(const l in i){const c=JSON.stringify(i[l]).replaceAll(K_,""),o=new RegExp('"\\$ref":(\\s)*"'+l+'"',"g");u=u.replaceAll(o,c)}return u}class Rv{constructor(i){this.logger=i,this._flagSetMetadata={},this._flags=new Map}getFlag(i){return this._flags.get(i)}getFlags(){return this._flags}getFlagSetMetadata(){return this._flagSetMetadata}setConfigurations(i,u=!1){const{flags:l,metadata:c}=X_(i,u,this.logger),o=this._flags,d=[],h=[],m=[];return l.forEach((y,S)=>{var N;o.has(S)?((N=o.get(S))===null||N===void 0?void 0:N.hash)!==y.hash&&m.push(S):d.push(S)}),o.forEach((y,S)=>{l.has(S)||h.push(S)}),this._flags=l,this._flagSetMetadata=c,[...d,...h,...m]}}class Z_{constructor(i,u){this._logger=u?new gb(u):new uv,this._storage=i||new Rv(this._logger)}setConfigurations(i){return this._storage.setConfigurations(i)}getFlag(i){return this._storage.getFlag(i)}getFlags(){return this._storage.getFlags()}getFlagSetMetadata(){return this._storage.getFlagSetMetadata()}resolveBooleanEvaluation(i,u,l,c=this._logger){return this.resolve("boolean",i,u,l,c)}resolveStringEvaluation(i,u,l,c=this._logger){return this.resolve("string",i,u,l,c)}resolveNumberEvaluation(i,u,l,c=this._logger){return this.resolve("number",i,u,l,c)}resolveObjectEvaluation(i,u,l,c=this._logger){return this.resolve("object",i,u,l,c)}resolveAll(i={},u=this._logger){const l=[];for(const[c,o]of this.getFlags())try{if(o.state==="DISABLED")continue;const d=o.evaluate(i,u);d.value!==void 0?l.push(Object.assign(Object.assign({},d),{flagKey:c})):u.debug(`Flag ${c} omitted because ${d.errorCode}: ${d.errorMessage}`)}catch(d){u.debug(`Error resolving flag ${c}: ${d.message}`)}return l}resolve(i,u,l,c={},o=this._logger){const d=this._storage.getFlag(u);if(!d)return{value:l,reason:Cn.ERROR,errorCode:Vr.FLAG_NOT_FOUND,errorMessage:`flag '${u}' not found`,flagMetadata:this._storage.getFlagSetMetadata()};if(d.state==="DISABLED")return{value:l,reason:Cn.ERROR,errorCode:Vr.FLAG_NOT_FOUND,errorMessage:`flag '${u}' is disabled`,flagMetadata:d.metadata};const h=d.evaluate(c,o);return h.value===void 0?Object.assign(Object.assign({},h),{value:l}):typeof h.value!==i?{value:l,reason:Cn.ERROR,errorCode:Vr.TYPE_MISMATCH,errorMessage:`Evaluated type of the flag ${u} does not match. Expected ${i}, got ${typeof h.value}`,flagMetadata:d.metadata}:Object.assign(Object.assign({},h),{value:h.value})}}const J_={$schema:"https://flagd.dev/schema/v0/flags.json"};function Tv(r){return JSON.stringify(JSON.parse(r),null,2)}function $t(r){return Tv(JSON.stringify({...J_,...r}))}function Ot(r){return Tv(JSON.stringify(r))}function Kg(r){return typeof r=="function"?r():r}function F_(r){try{return JSON.parse(r),!0}catch{return!1}}const W_={description:["In this scenario, we have a feature flag with the key 'basic-boolean' that is enabled and has two variants: true and false.","The default variant is false. Try changing the 'defaultVariant' to 'true' or add a targeting rule."].join(" "),flagDefinition:$t({flags:{"basic-boolean":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{}}}}),flagKey:"basic-boolean",returnType:"boolean",context:Ot({})},eS={description:['In this scenario, we have a feature flag with the key "basic-number" that is enabled and has two variants: 1 and 2.','The default variant is 1. Try changing the "defaultVariant" to "2" or add a targeting rule.'].join(" "),flagDefinition:$t({flags:{"basic-number":{state:"ENABLED",defaultVariant:"1",variants:{1:1,2:2},targeting:{}}}}),flagKey:"basic-number",returnType:"number",context:Ot({})},tS={description:['In this scenario, we have a feature flag with the key "basic-object" that is enabled and has two variants: foo and bar.','The default variant is foo. Try changing the "defaultVariant" to "bar" or add a targeting rule.'].join(" "),flagDefinition:$t({flags:{"basic-object":{state:"ENABLED",defaultVariant:"foo",variants:{foo:{foo:"foo"},bar:{bar:"bar"}},targeting:{}}}}),flagKey:"basic-object",returnType:"object",context:Ot({})},nS={description:['In this scenario, we have a feature flag with the key "basic-string" that is enabled and has two variants: foo and bar.','The default variant is foo. Try changing the "defaultVariant" to "bar" or add a targeting rule.'].join(" "),flagDefinition:$t({flags:{"basic-string":{state:"ENABLED",defaultVariant:"foo",variants:{foo:"foo",bar:"bar"},targeting:{}}}}),flagKey:"basic-string",returnType:"string",context:Ot({})},rS={description:["In this scenario, we have a feature flag with a targeting rule that returns true when the age is 18 or greater.","This targeting rule leverages the boolean shorthand syntax, which converts a boolean to its string equivalent.","The converted value is then used as the variant key.","Try changing the value of the context attribute 'age'."].join(" "),flagDefinition:$t({flags:{"feature-1":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{">=":[{var:"age"},18]}}}}),flagKey:"feature-1",returnType:"boolean",context:Ot({age:20})},aS={description:["In this scenario, we have a feature flag with the key 'acceptable-feature-stability' with three variants: alpha, beta, and ga.","The flag has a targeting rule that enables the flag based on the customer ID.","The flag is enabled for customer-A in the alpha variant, for customer-B1 and customer-B2 in the beta variant, and for all other customers in the ga variant.","Experiment by changing the 'customerId' in the context."].join(" "),flagDefinition:$t({flags:{"acceptable-feature-stability":{state:"ENABLED",defaultVariant:"ga",variants:{alpha:"alpha",beta:"beta",ga:"ga"},targeting:{if:[{"===":[{var:"customerId"},"customer-A"]},"alpha",{in:[{var:"customerId"},["customer-B1","customer-B2"]]},"beta","ga"]}}}}),flagKey:"acceptable-feature-stability",returnType:"string",context:Ot({targetingKey:"sessionId-123",customerId:"customer-A"})},iS={description:['In this scenario, we have a feature flag with the key "enable-mainframe-access" that is enabled and has two variants: true and false.','This flag has a targeting rule defined that enables the flag for users with an email address that ends with "@ingen.com".',"Experiment with changing the email address in the context or in the targeting rule."].join(" "),flagDefinition:$t({flags:{"enable-mainframe-access":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{ends_with:[{var:"email"},"@ingen.com"]},"true"]}}}}),flagKey:"enable-mainframe-access",returnType:"boolean",context:Ot({email:"john.arnold@ingen.com"})},sS={description:['In this scenario, we have a feature flag with the key "supports-one-hour-delivery" that is enabled and has two variants: true and false.','This flag has a targeting rule defined that enables the flag for users with a locale of "us" or "ca".',"Experiment with changing the locale in the context or in the locale list in the targeting rule."].join(" "),flagDefinition:$t({flags:{"supports-one-hour-delivery":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{in:[{var:"locale"},["us","ca"]]},"true"]}}}}),context:Ot({locale:"us"}),flagKey:"supports-one-hour-delivery",returnType:"boolean"},lS={description:['In this scenario, we have a feature flag with the key "enable-announcement-banner" that is enabled and has two variants: true and false.',"This flag has a targeting rule defined that enables the flag after a specified time.",'The current time (epoch) can be accessed using "$flagd.timestamp" which is automatically provided by flagd.','Five seconds after loading this scenario, the response will change to "true".'].join(" "),flagDefinition:()=>$t({flags:{"enable-announcement-banner":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{">":[{var:"$flagd.timestamp"},Math.floor(Date.now()/1e3)+5]},"true"]}}}}),flagKey:"enable-announcement-banner",returnType:"boolean",context:()=>Ot({})},uS={description:['In this scenario, we have a feature flag with the key "enable-performance-mode" that is enabled and has two variants: true and false.','This rule looks for the evaluation context "version". If the version is greater or equal to "1.7.0" the feature is enabled.','Otherwise, the "defaultVariant" is return. Experiment by changing the version in the context.'].join(" "),flagDefinition:$t({flags:{"enable-performance-mode":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{sem_ver:[{var:"version"},">=","1.7.0"]},"true"]}}}}),flagKey:"enable-performance-mode",returnType:"boolean",context:Ot({version:"1.6.0"})},oS={description:['In this scenario, we have a feature flag with the key "color-palette-experiment" that is enabled and has four variants: red, blue, green, and grey.','The targeting rule uses the "fractional" operator, which deterministically splits the traffic based on the configuration.','This configuration splits the traffic evenly between the four variants by bucketing evaluations pseudorandomly using the "targetingKey" and feature flag key.','Experiment by changing the "targetingKey" to another value.'].join(" "),flagDefinition:$t({flags:{"color-palette-experiment":{state:"ENABLED",defaultVariant:"grey",variants:{red:"#b91c1c",blue:"#0284c7",green:"#16a34a",grey:"#4b5563"},targeting:{fractional:[["red",25],["blue",25],["green",25],["grey",25]]}}}}),flagKey:"color-palette-experiment",returnType:"string",context:Ot({targetingKey:"sessionId-123"})},fS={description:['In this scenario, we have a feature flag with the key "enable-new-llm-model" with multiple variant for illustrative purposes.',"This flag has a targeting rule defined that enables the flag for a percentage of users based on the release phase.",'The "targetingKey" ensures that the user always sees the same results during a each phase of the rollout process.'].join(" "),flagDefinition:()=>{const r=Math.floor(Date.now()/1e3)+5,i=Math.floor(Date.now()/1e3)+10,u=Math.floor(Date.now()/1e3)+15,l=Math.floor(Date.now()/1e3)+20;return $t({flags:{"enable-new-llm-model":{state:"ENABLED",defaultVariant:"disabled",variants:{disabled:!1,phase1Enabled:!0,phase1Disabled:!1,phase2Enabled:!0,phase2Disabled:!1,phase3Enabled:!0,phase3Disabled:!1,enabled:!0},targeting:{if:[{">=":[r,{var:"$flagd.timestamp"}]},"disabled",{"<=":[r,{var:"$flagd.timestamp"},i]},{fractional:[["phase1Enabled",10],["phase1Disabled",90]]},{"<=":[i,{var:"$flagd.timestamp"},u]},{fractional:[["phase2Enabled",25],["phase2Disabled",75]]},{"<=":[u,{var:"$flagd.timestamp"},l]},{fractional:[["phase3Enabled",50],["phase3Disabled",50]]},"enabled"]}}}})},flagKey:"enable-new-llm-model",returnType:"boolean",context:()=>Ot({targetingKey:"sessionId-12345"})},cS={description:["In this scenario, we have two feature flags that share targeting rule logic.","This is accomplished by defining a $evaluators object in the feature flag definition and referencing it by name in a targeting rule.","Experiment with changing the email domain in the shared evaluator."].join(" "),flagDefinition:$t({flags:{"feature-1":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}},"feature-2":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}}},$evaluators:{emailWithFaas:{ends_with:[{var:"email"},"@faas.com"]}}}),flagKey:"feature-1",returnType:"boolean",context:Ot({email:"example@faas.com"})},dS={description:["In this scenario, we have a feature flag that is evaluated based on its targeting key.","The targeting key is contain a string uniquely identifying the subject of the flag evaluation, such as a user's email, or a session identifier.",`In this case, null is returned from targeting if the targeting key doesn't match; this results in a reason of "DEFAULT", since no variant was matched by the targeting rule.`].join(" "),flagDefinition:$t({flags:{"targeting-key-flag":{state:"ENABLED",variants:{miss:"miss",hit:"hit"},defaultVariant:"miss",targeting:{if:[{"==":[{var:"targetingKey"},"5c3d8535-f81a-4478-a6d3-afaa4d51199e"]},"hit",null]}}}}),flagKey:"targeting-key-flag",returnType:"string",context:Ot({targetingKey:"5c3d8535-f81a-4478-a6d3-afaa4d51199e"})},hS={description:["In this scenario, we have a feature flag with metadata about the flag.","There is top-level metadata for the flag set and metadata specific to the flag.","These values are merged together, with the flag metadata taking precedence."].join(" "),flagDefinition:$t({flags:{"flag-with-metadata":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:"on",metadata:{version:"1"}}},metadata:{flagSetId:"playground/dev"}}),flagKey:"flag-with-metadata",returnType:"boolean",context:Ot({})},nn={"Basic boolean flag":W_,"Basic numeric flag":eS,"Basic string flag":nS,"Basic object flag":tS,"Enable for a specific email domain":iS,"Enable based on users locale":sS,"Enable based on release version":uS,"Enable based on the current time":lS,"Chainable if/else/then":aS,"Multi-variant experiment":oS,"Progressive rollout":fS,"Shared evaluators":cS,"Boolean variant shorthand":rS,"Targeting key":dS,"Flag metadata":hS};function mS(r,i,u){return i in r?Object.defineProperty(r,i,{value:u,enumerable:!0,configurable:!0,writable:!0}):r[i]=u,r}function Xg(r,i){var u=Object.keys(r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(r);i&&(l=l.filter(function(c){return Object.getOwnPropertyDescriptor(r,c).enumerable})),u.push.apply(u,l)}return u}function Qg(r){for(var i=1;i=0)&&(u[c]=r[c]);return u}function yS(r,i){if(r==null)return{};var u=pS(r,i),l,c;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);for(c=0;c=0)&&Object.prototype.propertyIsEnumerable.call(r,l)&&(u[l]=r[l])}return u}function gS(r,i){return vS(r)||bS(r,i)||ES(r,i)||_S()}function vS(r){if(Array.isArray(r))return r}function bS(r,i){if(!(typeof Symbol>"u"||!(Symbol.iterator in Object(r)))){var u=[],l=!0,c=!1,o=void 0;try{for(var d=r[Symbol.iterator](),h;!(l=(h=d.next()).done)&&(u.push(h.value),!(i&&u.length===i));l=!0);}catch(m){c=!0,o=m}finally{try{!l&&d.return!=null&&d.return()}finally{if(c)throw o}}return u}}function ES(r,i){if(r){if(typeof r=="string")return Zg(r,i);var u=Object.prototype.toString.call(r).slice(8,-1);if(u==="Object"&&r.constructor&&(u=r.constructor.name),u==="Map"||u==="Set")return Array.from(r);if(u==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(u))return Zg(r,i)}}function Zg(r,i){(i==null||i>r.length)&&(i=r.length);for(var u=0,l=new Array(i);u=r.length?r.apply(this,c):function(){for(var d=arguments.length,h=new Array(d),m=0;m1&&arguments[1]!==void 0?arguments[1]:{};Ul.initial(r),Ul.handler(i);var u={current:r},l=ji(zS)(u,i),c=ji(CS)(u),o=ji(Ul.changes)(r),d=ji(qS)(u);function h(){var y=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(S){return S};return Ul.selector(y),y(u.current)}function m(y){wS(l,c,o,d)(y)}return[h,m]}function qS(r,i){return Ci(i)?i(r.current):i}function CS(r,i){return r.current=Fg(Fg({},r.current),i),i}function zS(r,i,u){return Ci(i)?i(r.current):Object.keys(u).forEach(function(l){var c;return(c=i[l])===null||c===void 0?void 0:c.call(i,r.current[l])}),u}var US={create:MS},LS={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.43.0/min/vs"}};function VS(r){return function i(){for(var u=this,l=arguments.length,c=new Array(l),o=0;o=r.length?r.apply(this,c):function(){for(var d=arguments.length,h=new Array(d),m=0;m0&&o.hash(l),o!==this)return o}u.prototype.hash=function(l){var s,o,c,d,p;switch(p=l.length,this.len+=p,o=this.k1,c=0,this.rem){case 0:o^=p>c?l.charCodeAt(c++)&65535:0;case 1:o^=p>c?(l.charCodeAt(c++)&65535)<<8:0;case 2:o^=p>c?(l.charCodeAt(c++)&65535)<<16:0;case 3:o^=p>c?(l.charCodeAt(c)&255)<<24:0,o^=p>c?(l.charCodeAt(c++)&65280)>>8:0}if(this.rem=p+this.rem&3,p-=this.rem,p>0){for(s=this.h1;o=o*11601+(o&65535)*3432906752&4294967295,o=o<<15|o>>>17,o=o*13715+(o&65535)*461832192&4294967295,s^=o,s=s<<13|s>>>19,s=s*5+3864292196&4294967295,!(c>=p);)o=l.charCodeAt(c++)&65535^(l.charCodeAt(c++)&65535)<<8^(l.charCodeAt(c++)&65535)<<16,d=l.charCodeAt(c++),o^=(d&255)<<24^(d&65280)>>8;switch(o=0,this.rem){case 3:o^=(l.charCodeAt(c+2)&65535)<<16;case 2:o^=(l.charCodeAt(c+1)&65535)<<8;case 1:o^=l.charCodeAt(c)&65535}this.h1=s}return this.k1=o,this},u.prototype.result=function(){var l,s;return l=this.k1,s=this.h1,l>0&&(l=l*11601+(l&65535)*3432906752&4294967295,l=l<<15|l>>>17,l=l*13715+(l&65535)*461832192&4294967295,s^=l),s^=this.len,s^=s>>>16,s=s*51819+(s&65535)*2246770688&4294967295,s^=s>>>13,s=s*44597+(s&65535)*3266445312&4294967295,s^=s>>>16,s>>>0},u.prototype.reset=function(l){return this.h1=typeof l=="number"?l:0,this.rem=this.k1=this.len=0,this},i=new u,n.exports=u})()}(Jc)),Jc.exports}var ow=sw();const fw=_s(ow);var cw="https://flagd.dev/schema/v0/flags.json",dw="http://json-schema.org/draft-07/schema#",hw="flagd Flag Configuration",pw="Defines flags for use in flagd, including typed variants and rules.",mw="object",gw={flags:{title:"Flags",description:"Top-level flags object. All flags are defined here.",type:"object",$comment:"flag objects are one of the 4 flag types defined in definitions",additionalProperties:!1,patternProperties:{"^.{1,}$":{oneOf:[{title:"Boolean flag",description:"A flag having boolean values.",$ref:"#/definitions/booleanFlag"},{title:"String flag",description:"A flag having string values.",$ref:"#/definitions/stringFlag"},{title:"Numeric flag",description:"A flag having numeric values.",$ref:"#/definitions/numberFlag"},{title:"Object flag",description:"A flag having arbitrary object values.",$ref:"#/definitions/objectFlag"}]}}},$evaluators:{title:"Evaluators",description:'Reusable targeting rules that can be referenced with "$ref": "myRule" in multiple flags.',type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{$comment:"this relative ref means that targeting.json MUST be in the same dir, or available on the same HTTP path",$ref:"./targeting.json"}}},metadata:{title:"Flag Set Metadata",description:"Metadata about the flag set, with keys of type string, and values of type boolean, string, or number.",properties:{flagSetId:{description:"The unique identifier for the flag set.",type:"string"},version:{description:"The version of the flag set.",type:"string"}},$ref:"#/definitions/metadata"}},yw={flag:{$comment:"base flag object; no title/description here, allows for better UX, keep it in the overrides",type:"object",properties:{state:{title:"Flag State",description:"Indicates whether the flag is functional. Disabled flags are treated as if they don't exist.",type:"string",enum:["ENABLED","DISABLED"]},defaultVariant:{title:"Default Variant",description:"The variant to serve if no dynamic targeting applies (including if the targeting returns null).",type:"string"},targeting:{$ref:"./targeting.json"},metadata:{title:"Flag Metadata",description:"Metadata about an individual feature flag, with keys of type string, and values of type boolean, string, or number.",$ref:"#/definitions/metadata"}},required:["state","defaultVariant"]},booleanVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"boolean"}},default:{true:!0,false:!1}}}},stringVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"string"}}}}},numberVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"number"}}}}},objectVariants:{type:"object",properties:{variants:{type:"object",additionalProperties:!1,patternProperties:{"^.{1,}$":{type:"object"}}}}},booleanFlag:{$comment:"merge the variants with the base flag to build our typed flags",allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/booleanVariants"}]},stringFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/stringVariants"}]},numberFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/numberVariants"}]},objectFlag:{allOf:[{$ref:"#/definitions/flag"},{$ref:"#/definitions/objectVariants"}]},metadata:{type:"object",additionalProperties:{description:"Any additional key/value pair with value of type boolean, string, or number.",type:["string","number","boolean"]},required:[]}},vw={$id:cw,$schema:dw,title:hw,description:pw,type:mw,properties:gw,definitions:yw},bw="https://flagd.dev/schema/v0/targeting.json",Ew="http://json-schema.org/draft-07/schema#",_w="flagd Targeting",Sw='Defines targeting logic for flagd; a extension of JSONLogic, including purpose-built feature-flagging operations. Note that this schema applies to top-level objects; no additional properties are supported, including "$schema", which means built-in JSON-schema support is not possible in editors. Please use flags.json (which imports this schema) for a rich editor experience.',ww="object",Aw=[{$comment:"we need this to support empty targeting",type:"object",additionalProperties:!1,properties:{}},{$ref:"#/definitions/anyRule"}],$w={primitive:{oneOf:[{description:'When returned from rules, a null value "exits", the targeting, and the "defaultValue" is returned, with the reason indicating the targeting did not match.',type:"null"},{description:'When returned from rules, booleans are converted to strings ("true"/"false"), and used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!',type:"boolean"},{description:"When returned from rules, the behavior of numbers is not defined.",type:"number"},{description:'When returned from rules, strings are used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!.',type:"string"},{description:'When returned from rules, strings are used to as keys to retrieve the associated value from the "variants" object. Be sure that the returned string is present as a key in the variants!.',type:"array"}]},varRule:{title:"Var Operation",description:"Retrieve data from the provided data object.",type:"object",additionalProperties:!1,properties:{var:{anyOf:[{type:"string",description:'flagd automatically injects "$flagd.timestamp" (unix epoch) and "$flagd.flagKey" (the key of the flag in evaluation) into the context.',pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},{not:{$comment:'this is a negated (not) match of "$flagd.{some-key}", which is faster and more compatible that a negative lookahead regex',type:"string",description:'flagd automatically injects "$flagd.timestamp" (unix epoch) and "$flagd.flagKey" (the key of the flag in evaluation) into the context.',pattern:"^\\$flagd\\..*$"}},{type:"array",$comment:"this is to support the form of var with a default... there seems to be a bug here, where ajv gives a warning (not an error) because maxItems doesn't equal the number of entries in items, though this is valid in this case",minItems:1,items:[{type:"string"}],additionalItems:{anyOf:[{type:"null"},{type:"boolean"},{type:"string"},{type:"number"}]}}]}}},missingRule:{title:"Missing Operation",description:"Takes an array of data keys to search for (same format as var). Returns an array of any keys that are missing from the data object, or an empty array.",type:"object",additionalProperties:!1,properties:{missing:{type:"array",items:{type:"string"}}}},missingSomeRule:{title:"Missing-Some Operation",description:"Takes a minimum number of data keys that are required, and an array of keys to search for (same format as var or missing). Returns an empty array if the minimum is met, or an array of the missing keys otherwise.",type:"object",additionalProperties:!1,properties:{missing_some:{minItems:2,maxItems:2,type:"array",items:[{type:"number"},{type:"array",items:{type:"string"}}]}}},binaryOrTernaryOp:{type:"array",minItems:2,maxItems:3,items:{$ref:"#/definitions/args"}},binaryOrTernaryRule:{type:"object",additionalProperties:!1,properties:{substr:{title:"Substring Operation",description:"Get a portion of a string. Give a positive start position to return everything beginning at that index. Give a negative start position to work backwards from the end of the string, then return everything. Give a positive length to express how many characters to return.",$ref:"#/definitions/binaryOrTernaryOp"},"<":{title:"Less-Than/Between Operation. Can be used to test that one value is between two others.",$ref:"#/definitions/binaryOrTernaryOp"},"<=":{title:"Less-Than-Or-Equal-To/Between Operation. Can be used to test that one value is between two others.",$ref:"#/definitions/binaryOrTernaryOp"}}},binaryOp:{type:"array",minItems:2,maxItems:2,items:{$ref:"#/definitions/args"}},binaryRule:{title:"Binary Operation",description:"Any primitive JSONLogic operation with 2 operands.",type:"object",additionalProperties:!1,properties:{if:{title:"If Operator",description:'The if statement takes 1 or more arguments: a condition ("if"), what to do if its true ("then", optional, defaults to returning true), and what to do if its false ("else", optional, defaults to returning false). Note that the else condition can be used as an else-if statement by adding additional arguments.',$ref:"#/definitions/variadicOp"},"==":{title:"Lose Equality Operation",description:"Tests equality, with type coercion. Requires two arguments.",$ref:"#/definitions/binaryOp"},"===":{title:"Strict Equality Operation",description:"Tests strict equality. Requires two arguments.",$ref:"#/definitions/binaryOp"},"!=":{title:"Lose Inequality Operation",description:"Tests not-equal, with type coercion.",$ref:"#/definitions/binaryOp"},"!==":{title:"Strict Inequality Operation",description:"Tests strict not-equal.",$ref:"#/definitions/binaryOp"},">":{title:"Greater-Than Operation",$ref:"#/definitions/binaryOp"},">=":{title:"Greater-Than-Or-Equal-To Operation",$ref:"#/definitions/binaryOp"},"%":{title:"Modulo Operation",description:"Finds the remainder after the first argument is divided by the second argument.",$ref:"#/definitions/binaryOp"},"/":{title:"Division Operation",$ref:"#/definitions/binaryOp"},map:{title:"Map Operation",description:"Perform an action on every member of an array. Note, that inside the logic being used to map, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},filter:{title:"Filter Operation",description:"Keep only elements of the array that pass a test. Note, that inside the logic being used to filter, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},all:{title:"All Operation",description:"Perform a test on each member of that array, returning true if all pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},none:{title:"None Operation",description:"Perform a test on each member of that array, returning true if none pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},some:{title:"Some Operation",description:"Perform a test on each member of that array, returning true if some pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},in:{title:"In Operation",description:"If the second argument is an array, tests that the first argument is a member of the array.",$ref:"#/definitions/binaryOp"}}},reduceRule:{type:"object",additionalProperties:!1,properties:{reduce:{title:"Reduce Operation",description:'Combine all the elements in an array into a single value, like adding up a list of numbers. Note, that inside the logic being used to reduce, var operations only have access to an object with a "current" and a "accumulator".',type:"array",minItems:3,maxItems:3,items:{$ref:"#/definitions/args"}}}},associativeOp:{type:"array",minItems:2,items:{$ref:"#/definitions/args"}},associativeRule:{title:"Mathematically Associative Operation",description:"Operation applicable to 2 or more parameters.",type:"object",additionalProperties:!1,properties:{"*":{title:"Multiplication Operation",description:"Multiplication; associative, will accept and unlimited amount of arguments.",$ref:"#/definitions/associativeOp"}}},unaryOp:{anyOf:[{type:"array",minItems:1,maxItems:1,items:{$ref:"#/definitions/args"}},{$ref:"#/definitions/args"}]},unaryRule:{title:"Unary Operation",description:"Any primitive JSONLogic operation with 1 operands.",type:"object",additionalProperties:!1,properties:{"!":{title:"Negation Operation",description:"Logical negation (“not”). Takes just one argument.",$ref:"#/definitions/unaryOp"},"!!":{title:"Double Negation Operation",description:"Double negation, or 'cast to a boolean'. Takes a single argument.",$ref:"#/definitions/unaryOp"}}},variadicOp:{type:"array",minItems:1,items:{$ref:"#/definitions/args"}},variadicRule:{$comment:"note < and <= can be used with up to 3 ops (between)",type:"object",additionalProperties:!1,properties:{or:{title:"Or Operation",description:'Simple boolean test, with 1 or more arguments. At a more sophisticated level, "or" returns the first truthy argument, or the last argument.',$ref:"#/definitions/variadicOp"},and:{title:"",description:'Simple boolean test, with 1 or more arguments. At a more sophisticated level, "and" returns the first falsy argument, or the last argument.',$ref:"#/definitions/variadicOp"},"+":{title:"Addition Operation",description:"Addition; associative, will accept and unlimited amount of arguments.",$ref:"#/definitions/variadicOp"},"-":{title:"Subtraction Operation",$ref:"#/definitions/variadicOp"},max:{title:"Maximum Operation",description:"Return the maximum from a list of values.",$ref:"#/definitions/variadicOp"},min:{title:"Minimum Operation",description:"Return the minimum from a list of values.",$ref:"#/definitions/variadicOp"},merge:{title:"Merge Operation",description:"Takes one or more arrays, and merges them into one array. If arguments aren't arrays, they get cast to arrays.",$ref:"#/definitions/variadicOp"},cat:{title:"Concatenate Operation",description:"Concatenate all the supplied arguments. Note that this is not a join or implode operation, there is no “glue” string.",$ref:"#/definitions/variadicOp"}}},stringCompareArg:{oneOf:[{type:"string"},{$ref:"#/definitions/anyRule"}]},stringCompareArgs:{type:"array",minItems:2,maxItems:2,items:{$ref:"#/definitions/stringCompareArg"}},stringCompareRule:{type:"object",additionalProperties:!1,properties:{starts_with:{title:"Starts-With Operation",description:"The string attribute starts with the specified string value.",$ref:"#/definitions/stringCompareArgs"},ends_with:{title:"Ends-With Operation",description:"The string attribute ends with the specified string value.",$ref:"#/definitions/stringCompareArgs"}}},semVerString:{title:"Semantic Version String",description:"A string representing a valid semantic version expression as per https://semver.org/.",type:"string",pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},ruleSemVer:{type:"object",additionalProperties:!1,properties:{sem_ver:{title:"Semantic Version Operation",description:'Attribute matches a semantic version condition. Accepts "npm-style" range specifiers: "=", "!=", ">", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',type:"array",minItems:3,maxItems:3,items:[{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]},{description:'Range specifiers: "=", "!=", ">", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',enum:["=","!=",">","<",">=","<=","~","^"]},{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]}]}}},fractionalWeightArg:{description:"Distribution for all possible variants, with their associated weighting.",type:"array",minItems:1,maxItems:2,items:[{description:'If this bucket is randomly selected, this string is used to as a key to retrieve the associated value from the "variants" object.',type:"string"},{description:"Weighted distribution for this variant key.",type:"number"}]},fractionalOp:{type:"array",minItems:3,$comment:"there seems to be a bug here, where ajv gives a warning (not an error) because maxItems doesn't equal the number of entries in items, though this is valid in this case",items:[{description:"Bucketing value used in pseudorandom assignment; should be unique and stable for each subject of flag evaluation. Defaults to a concatenation of the flagKey and targetingKey.",$ref:"#/definitions/anyRule"},{$ref:"#/definitions/fractionalWeightArg"},{$ref:"#/definitions/fractionalWeightArg"}],additionalItems:{$ref:"#/definitions/fractionalWeightArg"}},fractionalShorthandOp:{type:"array",minItems:2,items:{$ref:"#/definitions/fractionalWeightArg"}},fractionalRule:{type:"object",additionalProperties:!1,properties:{fractional:{title:"Fractional Operation",description:"Deterministic, pseudorandom fractional distribution.",oneOf:[{$ref:"#/definitions/fractionalOp"},{$ref:"#/definitions/fractionalShorthandOp"}]}}},reference:{additionalProperties:!1,type:"object",$comment:"patternProperties here is a bit of a hack to prevent this definition from being dereferenced early.",patternProperties:{"^\\$ref$":{title:"Reference",description:"A reference to another entity, used for $evaluators (shared rules).",type:"string"}}},args:{oneOf:[{$ref:"#/definitions/reference"},{$ref:"#/definitions/anyRule"},{$ref:"#/definitions/primitive"}]},anyRule:{anyOf:[{$ref:"#/definitions/varRule"},{$ref:"#/definitions/missingRule"},{$ref:"#/definitions/missingSomeRule"},{$ref:"#/definitions/binaryRule"},{$ref:"#/definitions/binaryOrTernaryRule"},{$ref:"#/definitions/associativeRule"},{$ref:"#/definitions/unaryRule"},{$ref:"#/definitions/variadicRule"},{$ref:"#/definitions/reduceRule"},{$ref:"#/definitions/stringCompareRule"},{$ref:"#/definitions/ruleSemVer"},{$ref:"#/definitions/fractionalRule"}]}},Ow={$id:bw,$schema:Ew,title:_w,description:Sw,type:ww,anyOf:Aw,definitions:$w};const ls="$flagd",Tv="flagKey",Tw="timestamp",Rw="targetingKey",Rv=Symbol.for("flagd.logger");function Od(n){const i=n[Rv];if(!i)throw new Error("Logger not found in context");return i}const Td="starts_with",Rd="ends_with";function Nw(n,i){return Nv(Td,n,i)}function jw(n,i){return Nv(Rd,n,i)}function Nv(n,i,u){const l=Od(u);if(!Array.isArray(i))return l.debug("Invalid comparison configuration: input is not an array"),!1;if(i.length!=2)return l.debug(`Invalid comparison configuration: invalid array length ${i.length}`),!1;if(typeof i[0]!="string"||typeof i[1]!="string")return l.debug("Invalid comparison configuration: array values are not strings"),!1;switch(n){case Td:return i[0].startsWith(i[1]);case Rd:return i[0].endsWith(i[1]);default:return l.debug(`Invalid comparison configuration: Invalid method '${n}'`),!1}}const us="sem_ver";function Dw(n,i){const u=Od(i);if(!Array.isArray(n))return u.debug(`Invalid ${us} configuration: Expected an array`),!1;const l=Array.from(n);if(l.length!=3)return u.debug(`Invalid ${us} configuration: Expected 3 arguments, got ${l.length}`),!1;const s=Zc.parse(l[0]),o=Zc.parse(l[2]);if(!s||!o)return u.debug(`Invalid ${us} configuration: Unable to parse semver`),!1;const c=String(l[1]),d=Zc.compare(s,o);switch(c){case"=":return d==0;case"!=":return d!=0;case"<":return d<0;case"<=":return d<=0;case">=":return d>=0;case">":return d>0;case"^":return s.major==o.major;case"~":return s.major==o.major&&s.minor==o.minor}return!1}const ud="fractional";function Mw(n,i){const u=Od(i);if(!Array.isArray(n))return null;const l=Array.from(n);if(l.length<2)return u.debug(`Invalid ${ud} configuration: Expected at least 2 buckets, got ${l.length}`),null;const s=i[ls];if(!s)return u.debug("Missing flagd properties, cannot perform fractional targeting"),null;let o,c;if(typeof l[0]=="string")o=l[0],c=l.slice(1,l.length);else{const S=i[Rw];if(!S)return u.debug("Missing targetingKey property, cannot perform fractional targeting"),null;o=`${s[Tv]}${S}`,c=l}let d;try{d=xw(c)}catch(S){return u.debug(`Invalid ${ud} configuration: `,S.message),null}const p=new fw(o).result()|0,m=Math.abs(p)/2147483648*100;let v=0;for(let S=0;S=m)return q.variant}return null}function Cw(n,i){return i==0?0:i*100/n}function xw(n){const i=[];let u=0;for(let l=0;l2)throw new Error("Invalid bucketing entry. Requires at least a variant");if(typeof s[0]!="string")throw new Error("Bucketing require variant to be present in string format");let o=1;if(s.length>=2){if(typeof s[1]!="number")throw new Error("Bucketing require bucketing percentage to be present");o=s[1]}i.push({fraction:o,variant:s[0]}),u+=o}return{fractions:i,totalWeight:u}}class Lw{constructor(i,u){this.logger=u;const l=new bd;l.addMethod(Td,Nw),l.addMethod(Rd,jw),l.addMethod(us,Dw),l.addMethod(ud,Mw),this._logicEngine=l.build(i)}evaluate(i,u,l=this.logger){return Object.hasOwn(u,ls)&&this.logger.debug(`overwriting ${ls} property in the context`),this._logicEngine(Object.assign(Object.assign({},u),{[ls]:{[Tv]:i,[Tw]:Math.floor(Date.now()/1e3)},[Rv]:l}))}}class qw{constructor(i,u,l){var s;if(this.logger=l,this._key=i,this._state=u.state,this._defaultVariant=u.defaultVariant,this._variants=new Map(Object.entries(u.variants)),this._metadata=(s=u.metadata)!==null&&s!==void 0?s:{},u.targeting&&Object.keys(u.targeting).length>0)try{this._targeting=new Lw(u.targeting,l)}catch{const c=`Invalid targeting configuration for flag '${i}'`;this.logger.warn(c),this._targetingParseErrorMessage=c}this._hash=ES.sha1(u),this.validateStructure()}get key(){return this._key}get hash(){return this._hash}get state(){return this._state}get defaultVariant(){return this._defaultVariant}get variants(){return this._variants}get metadata(){return this._metadata}evaluate(i,u=this.logger){let l,s;if(this._targetingParseErrorMessage)return{reason:Vn.ERROR,errorCode:Xr.PARSE_ERROR,errorMessage:this._targetingParseErrorMessage,flagMetadata:this.metadata};if(!this._targeting)l=this._defaultVariant,s=Vn.STATIC;else{let c;try{c=this._targeting.evaluate(this._key,i,u)}catch(d){return u.debug(`Error evaluating targeting rule for flag '${this._key}': ${d.message}`),{reason:Vn.ERROR,errorCode:Xr.GENERAL,errorMessage:`Error evaluating targeting rule for flag '${this._key}'`,flagMetadata:this.metadata}}c==null?(l=this._defaultVariant,s=Vn.DEFAULT):(l=c.toString(),s=Vn.TARGETING_MATCH)}const o=this._variants.get(l);return o===void 0?{reason:Vn.ERROR,errorCode:Xr.GENERAL,errorMessage:`Variant '${l}' not found in flag with key '${this._key}'`,flagMetadata:this.metadata}:{value:o,reason:s,variant:l,flagMetadata:this.metadata}}validateStructure(){if(this._state!=="ENABLED"&&this._state!=="DISABLED")throw new Bi(`Invalid flag state: ${JSON.stringify(this._state,void 0,2)}`);if(this._defaultVariant===void 0)throw new Bi(`Invalid flag defaultVariant: ${JSON.stringify(this._defaultVariant,void 0,2)}`);if(!this._variants.has(this._defaultVariant))throw new Bi(`Default variant ${this._defaultVariant} missing from variants ${JSON.stringify(this._variants,void 0,2)}`)}}const Uw=new vS({strict:!1}),x0=Uw.addSchema(Ow).compile(vw),zw="$evaluators",Iw=new RegExp("^[^{]*\\{|}[^}]*$","g"),L0="invalid flagd flag configuration";function Bw(n,i,u){var l;try{const s=Hw(n),o=JSON.parse(s);if(!x0(o)){const m=`${L0}: ${JSON.stringify(x0.errors,void 0,2)}`;if(i)throw new Bi(m);u.debug(m)}const d=new Map,p=(l=o.metadata)!==null&&l!==void 0?l:{};for(const m in o.flags){const v=o.flags[m];d.set(m,new qw(m,Object.assign(Object.assign({},v),{metadata:Object.assign(Object.assign({},o.metadata),v.metadata)}),u))}return{flags:d,metadata:p}}catch(s){throw s instanceof Bi?s:new Bi(L0,{cause:s})}}function Hw(n){const i=JSON.parse(n)[zw];if(!i)return n;let u=n;for(const l in i){const s=JSON.stringify(i[l]).replaceAll(Iw,""),o=new RegExp('"\\$ref":(\\s)*"'+l+'"',"g");u=u.replaceAll(o,s)}return u}class jv{constructor(i){this.logger=i,this._flagSetMetadata={},this._flags=new Map}getFlag(i){return this._flags.get(i)}getFlags(){return this._flags}getFlagSetMetadata(){return this._flagSetMetadata}setConfigurations(i,u=!1){const{flags:l,metadata:s}=Bw(i,u,this.logger),o=this._flags,c=[],d=[],p=[];return l.forEach((m,v)=>{var S;o.has(v)?((S=o.get(v))===null||S===void 0?void 0:S.hash)!==m.hash&&p.push(v):c.push(v)}),o.forEach((m,v)=>{l.has(v)||d.push(v)}),this._flags=l,this._flagSetMetadata=s,[...c,...d,...p]}}class Vw{constructor(i,u){this._logger=u?new o_(u):new cv,this._storage=i||new jv(this._logger)}setConfigurations(i){return this._storage.setConfigurations(i)}getFlag(i){return this._storage.getFlag(i)}getFlags(){return this._storage.getFlags()}getFlagSetMetadata(){return this._storage.getFlagSetMetadata()}resolveBooleanEvaluation(i,u,l,s=this._logger){return this.resolve("boolean",i,u,l,s)}resolveStringEvaluation(i,u,l,s=this._logger){return this.resolve("string",i,u,l,s)}resolveNumberEvaluation(i,u,l,s=this._logger){return this.resolve("number",i,u,l,s)}resolveObjectEvaluation(i,u,l,s=this._logger){return this.resolve("object",i,u,l,s)}resolveAll(i={},u=this._logger){const l=[];for(const[s,o]of this.getFlags())try{if(o.state==="DISABLED")continue;const c=o.evaluate(i,u);c.value!==void 0?l.push(Object.assign(Object.assign({},c),{flagKey:s})):u.debug(`Flag ${s} omitted because ${c.errorCode}: ${c.errorMessage}`)}catch(c){u.debug(`Error resolving flag ${s}: ${c.message}`)}return l}resolve(i,u,l,s={},o=this._logger){const c=this._storage.getFlag(u);if(!c)return{value:l,reason:Vn.ERROR,errorCode:Xr.FLAG_NOT_FOUND,errorMessage:`flag '${u}' not found`,flagMetadata:this._storage.getFlagSetMetadata()};if(c.state==="DISABLED")return{value:l,reason:Vn.ERROR,errorCode:Xr.FLAG_NOT_FOUND,errorMessage:`flag '${u}' is disabled`,flagMetadata:c.metadata};const d=c.evaluate(s,o);return d.value===void 0?Object.assign(Object.assign({},d),{value:l}):typeof d.value!==i?{value:l,reason:Vn.ERROR,errorCode:Xr.TYPE_MISMATCH,errorMessage:`Evaluated type of the flag ${u} does not match. Expected ${i}, got ${typeof d.value}`,flagMetadata:c.metadata}:Object.assign(Object.assign({},d),{value:d.value})}}/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function Dv(n){return typeof n>"u"||n===null}function kw(n){return typeof n=="object"&&n!==null}function Gw(n){return Array.isArray(n)?n:Dv(n)?[]:[n]}function Yw(n,i){var u,l,s,o;if(i)for(o=Object.keys(i),u=0,l=o.length;ud&&(o=" ... ",i=l-d+o.length),u-l>d&&(c=" ...",u=l+d-c.length),{str:o+n.slice(i,u).replace(/\t/g,"→")+c,pos:l-i+o.length}}function ed(n,i){return ft.repeat(" ",i-n.length)+n}function eA(n,i){if(i=Object.create(i||null),!n.buffer)return null;i.maxLength||(i.maxLength=79),typeof i.indent!="number"&&(i.indent=1),typeof i.linesBefore!="number"&&(i.linesBefore=3),typeof i.linesAfter!="number"&&(i.linesAfter=2);for(var u=/\r?\n|\r|\0/g,l=[0],s=[],o,c=-1;o=u.exec(n.buffer);)s.push(o.index),l.push(o.index+o[0].length),n.position<=o.index&&c<0&&(c=l.length-2);c<0&&(c=l.length-1);var d="",p,m,v=Math.min(n.line+i.linesAfter,s.length).toString().length,S=i.maxLength-(i.indent+v+3);for(p=1;p<=i.linesBefore&&!(c-p<0);p++)m=Wc(n.buffer,l[c-p],s[c-p],n.position-(l[c]-l[c-p]),S),d=ft.repeat(" ",i.indent)+ed((n.line-p+1).toString(),v)+" | "+m.str+` +`+d;for(m=Wc(n.buffer,l[c],s[c],n.position,S),d+=ft.repeat(" ",i.indent)+ed((n.line+1).toString(),v)+" | "+m.str+` +`,d+=ft.repeat("-",i.indent+v+3+m.pos)+`^ +`,p=1;p<=i.linesAfter&&!(c+p>=s.length);p++)m=Wc(n.buffer,l[c+p],s[c+p],n.position-(l[c]-l[c+p]),S),d+=ft.repeat(" ",i.indent)+ed((n.line+p+1).toString(),v)+" | "+m.str+` +`;return d.replace(/\n$/,"")}var tA=eA,nA=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],rA=["scalar","sequence","mapping"];function iA(n){var i={};return n!==null&&Object.keys(n).forEach(function(u){n[u].forEach(function(l){i[String(l)]=u})}),i}function aA(n,i){if(i=i||{},Object.keys(i).forEach(function(u){if(nA.indexOf(u)===-1)throw new Rt('Unknown option "'+u+'" is met in definition of "'+n+'" YAML type.')}),this.options=i,this.tag=n,this.kind=i.kind||null,this.resolve=i.resolve||function(){return!0},this.construct=i.construct||function(u){return u},this.instanceOf=i.instanceOf||null,this.predicate=i.predicate||null,this.represent=i.represent||null,this.representName=i.representName||null,this.defaultStyle=i.defaultStyle||null,this.multi=i.multi||!1,this.styleAliases=iA(i.styleAliases||null),rA.indexOf(this.kind)===-1)throw new Rt('Unknown kind "'+this.kind+'" is specified for "'+n+'" YAML type.')}var Et=aA;function q0(n,i){var u=[];return n[i].forEach(function(l){var s=u.length;u.forEach(function(o,c){o.tag===l.tag&&o.kind===l.kind&&o.multi===l.multi&&(s=c)}),u[s]=l}),u}function lA(){var n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},i,u;function l(s){s.multi?(n.multi[s.kind].push(s),n.multi.fallback.push(s)):n[s.kind][s.tag]=n.fallback[s.tag]=s}for(i=0,u=arguments.length;i=0?"0b"+n.toString(2):"-0b"+n.toString(2).slice(1)},octal:function(n){return n>=0?"0o"+n.toString(8):"-0o"+n.toString(8).slice(1)},decimal:function(n){return n.toString(10)},hexadecimal:function(n){return n>=0?"0x"+n.toString(16).toUpperCase():"-0x"+n.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),bA=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function EA(n){return!(n===null||!bA.test(n)||n[n.length-1]==="_")}function _A(n){var i,u;return i=n.replace(/_/g,"").toLowerCase(),u=i[0]==="-"?-1:1,"+-".indexOf(i[0])>=0&&(i=i.slice(1)),i===".inf"?u===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:i===".nan"?NaN:u*parseFloat(i,10)}var SA=/^[-+]?[0-9]+e/;function wA(n,i){var u;if(isNaN(n))switch(i){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===n)switch(i){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===n)switch(i){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ft.isNegativeZero(n))return"-0.0";return u=n.toString(10),SA.test(u)?u.replace("e",".e"):u}function AA(n){return Object.prototype.toString.call(n)==="[object Number]"&&(n%1!==0||ft.isNegativeZero(n))}var Hv=new Et("tag:yaml.org,2002:float",{kind:"scalar",resolve:EA,construct:_A,predicate:AA,represent:wA,defaultStyle:"lowercase"}),Vv=Uv.extend({implicit:[zv,Iv,Bv,Hv]}),kv=Vv,Gv=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Yv=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function $A(n){return n===null?!1:Gv.exec(n)!==null||Yv.exec(n)!==null}function OA(n){var i,u,l,s,o,c,d,p=0,m=null,v,S,q;if(i=Gv.exec(n),i===null&&(i=Yv.exec(n)),i===null)throw new Error("Date resolve error");if(u=+i[1],l=+i[2]-1,s=+i[3],!i[4])return new Date(Date.UTC(u,l,s));if(o=+i[4],c=+i[5],d=+i[6],i[7]){for(p=i[7].slice(0,3);p.length<3;)p+="0";p=+p}return i[9]&&(v=+i[10],S=+(i[11]||0),m=(v*60+S)*6e4,i[9]==="-"&&(m=-m)),q=new Date(Date.UTC(u,l,s,o,c,d,p)),m&&q.setTime(q.getTime()-m),q}function TA(n){return n.toISOString()}var Pv=new Et("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:$A,construct:OA,instanceOf:Date,represent:TA});function RA(n){return n==="<<"||n===null}var Kv=new Et("tag:yaml.org,2002:merge",{kind:"scalar",resolve:RA}),Nd=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function NA(n){if(n===null)return!1;var i,u,l=0,s=n.length,o=Nd;for(u=0;u64)){if(i<0)return!1;l+=6}return l%8===0}function jA(n){var i,u,l=n.replace(/[\r\n=]/g,""),s=l.length,o=Nd,c=0,d=[];for(i=0;i>16&255),d.push(c>>8&255),d.push(c&255)),c=c<<6|o.indexOf(l.charAt(i));return u=s%4*6,u===0?(d.push(c>>16&255),d.push(c>>8&255),d.push(c&255)):u===18?(d.push(c>>10&255),d.push(c>>2&255)):u===12&&d.push(c>>4&255),new Uint8Array(d)}function DA(n){var i="",u=0,l,s,o=n.length,c=Nd;for(l=0;l>18&63],i+=c[u>>12&63],i+=c[u>>6&63],i+=c[u&63]),u=(u<<8)+n[l];return s=o%3,s===0?(i+=c[u>>18&63],i+=c[u>>12&63],i+=c[u>>6&63],i+=c[u&63]):s===2?(i+=c[u>>10&63],i+=c[u>>4&63],i+=c[u<<2&63],i+=c[64]):s===1&&(i+=c[u>>2&63],i+=c[u<<4&63],i+=c[64],i+=c[64]),i}function MA(n){return Object.prototype.toString.call(n)==="[object Uint8Array]"}var Fv=new Et("tag:yaml.org,2002:binary",{kind:"scalar",resolve:NA,construct:jA,predicate:MA,represent:DA}),CA=Object.prototype.hasOwnProperty,xA=Object.prototype.toString;function LA(n){if(n===null)return!0;var i=[],u,l,s,o,c,d=n;for(u=0,l=d.length;u>10)+55296,(n-65536&1023)+56320)}function n1(n,i,u){i==="__proto__"?Object.defineProperty(n,i,{configurable:!0,enumerable:!0,writable:!0,value:u}):n[i]=u}var r1=new Array(256),i1=new Array(256);for(var Li=0;Li<256;Li++)r1[Li]=I0(Li)?1:0,i1[Li]=I0(Li);function ZA(n,i){this.input=n,this.filename=i.filename||null,this.schema=i.schema||jd,this.onWarning=i.onWarning||null,this.legacy=i.legacy||!1,this.json=i.json||!1,this.listener=i.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=n.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function a1(n,i){var u={name:n.filename,buffer:n.input.slice(0,-1),position:n.position,line:n.line,column:n.position-n.lineStart};return u.snippet=tA(u),new Rt(i,u)}function _e(n,i){throw a1(n,i)}function ys(n,i){n.onWarning&&n.onWarning.call(null,a1(n,i))}var B0={YAML:function(i,u,l){var s,o,c;i.version!==null&&_e(i,"duplication of %YAML directive"),l.length!==1&&_e(i,"YAML directive accepts exactly one argument"),s=/^([0-9]+)\.([0-9]+)$/.exec(l[0]),s===null&&_e(i,"ill-formed argument of the YAML directive"),o=parseInt(s[1],10),c=parseInt(s[2],10),o!==1&&_e(i,"unacceptable YAML version of the document"),i.version=l[0],i.checkLineBreaks=c<2,c!==1&&c!==2&&ys(i,"unsupported YAML version of the document")},TAG:function(i,u,l){var s,o;l.length!==2&&_e(i,"TAG directive accepts exactly two arguments"),s=l[0],o=l[1],e1.test(s)||_e(i,"ill-formed tag handle (first argument) of the TAG directive"),Er.call(i.tagMap,s)&&_e(i,'there is a previously declared suffix for "'+s+'" tag handle'),t1.test(o)||_e(i,"ill-formed tag prefix (second argument) of the TAG directive");try{o=decodeURIComponent(o)}catch{_e(i,"tag prefix is malformed: "+o)}i.tagMap[s]=o}};function yr(n,i,u,l){var s,o,c,d;if(i1&&(n.result+=ft.repeat(` +`,i-1))}function JA(n,i,u){var l,s,o,c,d,p,m,v,S=n.kind,q=n.result,C;if(C=n.input.charCodeAt(n.position),Lt(C)||Ui(C)||C===35||C===38||C===42||C===33||C===124||C===62||C===39||C===34||C===37||C===64||C===96||(C===63||C===45)&&(s=n.input.charCodeAt(n.position+1),Lt(s)||u&&Ui(s)))return!1;for(n.kind="scalar",n.result="",o=c=n.position,d=!1;C!==0;){if(C===58){if(s=n.input.charCodeAt(n.position+1),Lt(s)||u&&Ui(s))break}else if(C===35){if(l=n.input.charCodeAt(n.position-1),Lt(l))break}else{if(n.position===n.lineStart&&Ds(n)||u&&Ui(C))break;if(_n(C))if(p=n.line,m=n.lineStart,v=n.lineIndent,ut(n,!1,-1),n.lineIndent>=i){d=!0,C=n.input.charCodeAt(n.position);continue}else{n.position=c,n.line=p,n.lineStart=m,n.lineIndent=v;break}}d&&(yr(n,o,c,!1),Md(n,n.line-p),o=c=n.position,d=!1),Qr(C)||(c=n.position+1),C=n.input.charCodeAt(++n.position)}return yr(n,o,c,!1),n.result?!0:(n.kind=S,n.result=q,!1)}function WA(n,i){var u,l,s;if(u=n.input.charCodeAt(n.position),u!==39)return!1;for(n.kind="scalar",n.result="",n.position++,l=s=n.position;(u=n.input.charCodeAt(n.position))!==0;)if(u===39)if(yr(n,l,n.position,!0),u=n.input.charCodeAt(++n.position),u===39)l=n.position,n.position++,s=n.position;else return!0;else _n(u)?(yr(n,l,s,!0),Md(n,ut(n,!1,i)),l=s=n.position):n.position===n.lineStart&&Ds(n)?_e(n,"unexpected end of the document within a single quoted scalar"):(n.position++,s=n.position);_e(n,"unexpected end of the stream within a single quoted scalar")}function e2(n,i){var u,l,s,o,c,d;if(d=n.input.charCodeAt(n.position),d!==34)return!1;for(n.kind="scalar",n.result="",n.position++,u=l=n.position;(d=n.input.charCodeAt(n.position))!==0;){if(d===34)return yr(n,u,n.position,!0),n.position++,!0;if(d===92){if(yr(n,u,n.position,!0),d=n.input.charCodeAt(++n.position),_n(d))ut(n,!1,i);else if(d<256&&r1[d])n.result+=i1[d],n.position++;else if((c=FA(d))>0){for(s=c,o=0;s>0;s--)d=n.input.charCodeAt(++n.position),(c=KA(d))>=0?o=(o<<4)+c:_e(n,"expected hexadecimal character");n.result+=QA(o),n.position++}else _e(n,"unknown escape sequence");u=l=n.position}else _n(d)?(yr(n,u,l,!0),Md(n,ut(n,!1,i)),u=l=n.position):n.position===n.lineStart&&Ds(n)?_e(n,"unexpected end of the document within a double quoted scalar"):(n.position++,l=n.position)}_e(n,"unexpected end of the stream within a double quoted scalar")}function t2(n,i){var u=!0,l,s,o,c=n.tag,d,p=n.anchor,m,v,S,q,C,U=Object.create(null),D,y,A,g;if(g=n.input.charCodeAt(n.position),g===91)v=93,C=!1,d=[];else if(g===123)v=125,C=!0,d={};else return!1;for(n.anchor!==null&&(n.anchorMap[n.anchor]=d),g=n.input.charCodeAt(++n.position);g!==0;){if(ut(n,!0,i),g=n.input.charCodeAt(n.position),g===v)return n.position++,n.tag=c,n.anchor=p,n.kind=C?"mapping":"sequence",n.result=d,!0;u?g===44&&_e(n,"expected the node content, but found ','"):_e(n,"missed comma between flow collection entries"),y=D=A=null,S=q=!1,g===63&&(m=n.input.charCodeAt(n.position+1),Lt(m)&&(S=q=!0,n.position++,ut(n,!0,i))),l=n.line,s=n.lineStart,o=n.position,Hi(n,i,ms,!1,!0),y=n.tag,D=n.result,ut(n,!0,i),g=n.input.charCodeAt(n.position),(q||n.line===l)&&g===58&&(S=!0,g=n.input.charCodeAt(++n.position),ut(n,!0,i),Hi(n,i,ms,!1,!0),A=n.result),C?zi(n,d,U,y,D,A,l,s,o):S?d.push(zi(n,null,U,y,D,A,l,s,o)):d.push(D),ut(n,!0,i),g=n.input.charCodeAt(n.position),g===44?(u=!0,g=n.input.charCodeAt(++n.position)):u=!1}_e(n,"unexpected end of the stream within a flow collection")}function n2(n,i){var u,l,s=td,o=!1,c=!1,d=i,p=0,m=!1,v,S;if(S=n.input.charCodeAt(n.position),S===124)l=!1;else if(S===62)l=!0;else return!1;for(n.kind="scalar",n.result="";S!==0;)if(S=n.input.charCodeAt(++n.position),S===43||S===45)td===s?s=S===43?U0:kA:_e(n,"repeat of a chomping mode identifier");else if((v=XA(S))>=0)v===0?_e(n,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?_e(n,"repeat of an indentation width identifier"):(d=i+v-1,c=!0);else break;if(Qr(S)){do S=n.input.charCodeAt(++n.position);while(Qr(S));if(S===35)do S=n.input.charCodeAt(++n.position);while(!_n(S)&&S!==0)}for(;S!==0;){for(Dd(n),n.lineIndent=0,S=n.input.charCodeAt(n.position);(!c||n.lineIndentd&&(d=n.lineIndent),_n(S)){p++;continue}if(n.lineIndenti)&&p!==0)_e(n,"bad indentation of a sequence entry");else if(n.lineIndenti)&&(y&&(c=n.line,d=n.lineStart,p=n.position),Hi(n,i,gs,!0,s)&&(y?U=n.result:D=n.result),y||(zi(n,S,q,C,U,D,c,d,p),C=U=D=null),ut(n,!0,-1),g=n.input.charCodeAt(n.position)),(n.line===o||n.lineIndent>i)&&g!==0)_e(n,"bad indentation of a mapping entry");else if(n.lineIndenti?p=1:n.lineIndent===i?p=0:n.lineIndenti?p=1:n.lineIndent===i?p=0:n.lineIndent tag; it should be "scalar", not "'+n.kind+'"'),S=0,q=n.implicitTypes.length;S"),n.result!==null&&U.kind!==n.kind&&_e(n,"unacceptable node kind for !<"+n.tag+'> tag; it should be "'+U.kind+'", not "'+n.kind+'"'),U.resolve(n.result,n.tag)?(n.result=U.construct(n.result,n.tag),n.anchor!==null&&(n.anchorMap[n.anchor]=n.result)):_e(n,"cannot resolve a node with !<"+n.tag+"> explicit tag")}return n.listener!==null&&n.listener("close",n),n.tag!==null||n.anchor!==null||v}function u2(n){var i=n.position,u,l,s,o=!1,c;for(n.version=null,n.checkLineBreaks=n.legacy,n.tagMap=Object.create(null),n.anchorMap=Object.create(null);(c=n.input.charCodeAt(n.position))!==0&&(ut(n,!0,-1),c=n.input.charCodeAt(n.position),!(n.lineIndent>0||c!==37));){for(o=!0,c=n.input.charCodeAt(++n.position),u=n.position;c!==0&&!Lt(c);)c=n.input.charCodeAt(++n.position);for(l=n.input.slice(u,n.position),s=[],l.length<1&&_e(n,"directive name must not be less than one character in length");c!==0;){for(;Qr(c);)c=n.input.charCodeAt(++n.position);if(c===35){do c=n.input.charCodeAt(++n.position);while(c!==0&&!_n(c));break}if(_n(c))break;for(u=n.position;c!==0&&!Lt(c);)c=n.input.charCodeAt(++n.position);s.push(n.input.slice(u,n.position))}c!==0&&Dd(n),Er.call(B0,l)?B0[l](n,l,s):ys(n,'unknown document directive "'+l+'"')}if(ut(n,!0,-1),n.lineIndent===0&&n.input.charCodeAt(n.position)===45&&n.input.charCodeAt(n.position+1)===45&&n.input.charCodeAt(n.position+2)===45?(n.position+=3,ut(n,!0,-1)):o&&_e(n,"directives end mark is expected"),Hi(n,n.lineIndent-1,gs,!1,!0),ut(n,!0,-1),n.checkLineBreaks&&YA.test(n.input.slice(i,n.position))&&ys(n,"non-ASCII line breaks are interpreted as content"),n.documents.push(n.result),n.position===n.lineStart&&Ds(n)){n.input.charCodeAt(n.position)===46&&(n.position+=3,ut(n,!0,-1));return}if(n.position"u"&&(u=i,i=null);var l=l1(n,u);if(typeof i!="function")return l;for(var s=0,o=l.length;s=55296&&u<=56319&&i+1=56320&&l<=57343)?(u-55296)*1024+l-56320+65536:u}function m1(n){var i=/^\n* /;return i.test(n)}var g1=1,cd=2,y1=3,v1=4,qi=5;function U2(n,i,u,l,s,o,c,d){var p,m=0,v=null,S=!1,q=!1,C=l!==-1,U=-1,D=L2(Ka(n,0))&&q2(Ka(n,n.length-1));if(i||c)for(p=0;p=65536?p+=2:p++){if(m=Ka(n,p),!tl(m))return qi;D=D&&Y0(m,v,d),v=m}else{for(p=0;p=65536?p+=2:p++){if(m=Ka(n,p),m===Wa)S=!0,C&&(q=q||p-U-1>l&&n[U+1]!==" ",U=p);else if(!tl(m))return qi;D=D&&Y0(m,v,d),v=m}q=q||C&&p-U-1>l&&n[U+1]!==" "}return!S&&!q?D&&!c&&!s(n)?g1:o===el?qi:cd:u>9&&m1(n)?qi:c?o===el?qi:cd:q?v1:y1}function z2(n,i,u,l,s){n.dump=function(){if(i.length===0)return n.quotingType===el?'""':"''";if(!n.noCompatMode&&(R2.indexOf(i)!==-1||N2.test(i)))return n.quotingType===el?'"'+i+'"':"'"+i+"'";var o=n.indent*Math.max(1,u),c=n.lineWidth===-1?-1:Math.max(Math.min(n.lineWidth,40),n.lineWidth-o),d=l||n.flowLevel>-1&&u>=n.flowLevel;function p(m){return x2(n,m)}switch(U2(i,d,n.indent,c,p,n.quotingType,n.forceQuotes&&!l,s)){case g1:return i;case cd:return"'"+i.replace(/'/g,"''")+"'";case y1:return"|"+P0(i,n.indent)+K0(k0(i,o));case v1:return">"+P0(i,n.indent)+K0(k0(I2(i,c),o));case qi:return'"'+B2(i)+'"';default:throw new Rt("impossible error: invalid scalar style")}}()}function P0(n,i){var u=m1(n)?String(i):"",l=n[n.length-1]===` +`,s=l&&(n[n.length-2]===` +`||n===` +`),o=s?"+":l?"":"-";return u+o+` +`}function K0(n){return n[n.length-1]===` +`?n.slice(0,-1):n}function I2(n,i){for(var u=/(\n+)([^\n]*)/g,l=function(){var m=n.indexOf(` +`);return m=m!==-1?m:n.length,u.lastIndex=m,F0(n.slice(0,m),i)}(),s=n[0]===` +`||n[0]===" ",o,c;c=u.exec(n);){var d=c[1],p=c[2];o=p[0]===" ",l+=d+(!s&&!o&&p!==""?` +`:"")+F0(p,i),s=o}return l}function F0(n,i){if(n===""||n[0]===" ")return n;for(var u=/ [^ ]/g,l,s=0,o,c=0,d=0,p="";l=u.exec(n);)d=l.index,d-s>i&&(o=c>s?c:d,p+=` +`+n.slice(s,o),s=o+1),c=d;return p+=` +`,n.length-s>i&&c>s?p+=n.slice(s,c)+` +`+n.slice(c+1):p+=n.slice(s),p.slice(1)}function B2(n){for(var i="",u=0,l,s=0;s=65536?s+=2:s++)u=Ka(n,s),l=At[u],!l&&tl(u)?(i+=n[s],u>=65536&&(i+=n[s+1])):i+=l||D2(u);return i}function H2(n,i,u){var l="",s=n.tag,o,c,d;for(o=0,c=u.length;o"u"&&Gn(n,i,null,!1,!1))&&(l!==""&&(l+=","+(n.condenseFlow?"":" ")),l+=n.dump);n.tag=s,n.dump="["+l+"]"}function X0(n,i,u,l){var s="",o=n.tag,c,d,p;for(c=0,d=u.length;c"u"&&Gn(n,i+1,null,!0,!0,!1,!0))&&((!l||s!=="")&&(s+=fd(n,i)),n.dump&&Wa===n.dump.charCodeAt(0)?s+="-":s+="- ",s+=n.dump);n.tag=o,n.dump=s||"[]"}function V2(n,i,u){var l="",s=n.tag,o=Object.keys(u),c,d,p,m,v;for(c=0,d=o.length;c1024&&(v+="? "),v+=n.dump+(n.condenseFlow?'"':"")+":"+(n.condenseFlow?"":" "),Gn(n,i,m,!1,!1)&&(v+=n.dump,l+=v));n.tag=s,n.dump="{"+l+"}"}function k2(n,i,u,l){var s="",o=n.tag,c=Object.keys(u),d,p,m,v,S,q;if(n.sortKeys===!0)c.sort();else if(typeof n.sortKeys=="function")c.sort(n.sortKeys);else if(n.sortKeys)throw new Rt("sortKeys must be a boolean or a function");for(d=0,p=c.length;d1024,S&&(n.dump&&Wa===n.dump.charCodeAt(0)?q+="?":q+="? "),q+=n.dump,S&&(q+=fd(n,i)),Gn(n,i+1,v,!0,S)&&(n.dump&&Wa===n.dump.charCodeAt(0)?q+=":":q+=": ",q+=n.dump,s+=q));n.tag=o,n.dump=s||"{}"}function Q0(n,i,u){var l,s,o,c,d,p;for(s=u?n.explicitTypes:n.implicitTypes,o=0,c=s.length;o tag resolver accepts not "'+p+'" style');n.dump=l}return!0}return!1}function Gn(n,i,u,l,s,o,c){n.tag=null,n.dump=u,Q0(n,u,!1)||Q0(n,u,!0);var d=s1.call(n.dump),p=l,m;l&&(l=n.flowLevel<0||n.flowLevel>i);var v=d==="[object Object]"||d==="[object Array]",S,q;if(v&&(S=n.duplicates.indexOf(u),q=S!==-1),(n.tag!==null&&n.tag!=="?"||q||n.indent!==2&&i>0)&&(s=!1),q&&n.usedDuplicates[S])n.dump="*ref_"+S;else{if(v&&q&&!n.usedDuplicates[S]&&(n.usedDuplicates[S]=!0),d==="[object Object]")l&&Object.keys(n.dump).length!==0?(k2(n,i,n.dump,s),q&&(n.dump="&ref_"+S+n.dump)):(V2(n,i,n.dump),q&&(n.dump="&ref_"+S+" "+n.dump));else if(d==="[object Array]")l&&n.dump.length!==0?(n.noArrayIndent&&!c&&i>0?X0(n,i-1,n.dump,s):X0(n,i,n.dump,s),q&&(n.dump="&ref_"+S+n.dump)):(H2(n,i,n.dump),q&&(n.dump="&ref_"+S+" "+n.dump));else if(d==="[object String]")n.tag!=="?"&&z2(n,n.dump,i,o,p);else{if(d==="[object Undefined]")return!1;if(n.skipInvalid)return!1;throw new Rt("unacceptable kind of an object to dump "+d)}n.tag!==null&&n.tag!=="?"&&(m=encodeURI(n.tag[0]==="!"?n.tag.slice(1):n.tag).replace(/!/g,"%21"),n.tag[0]==="!"?m="!"+m:m.slice(0,18)==="tag:yaml.org,2002:"?m="!!"+m.slice(18):m="!<"+m+">",n.dump=m+" "+n.dump)}return!0}function G2(n,i){var u=[],l=[],s,o;for(dd(n,u,l),s=0,o=l.length;s=":[{var:"age"},18]}}}}),flagKey:"feature-1",returnType:"boolean",context:Dt({age:20})},g$={description:["In this scenario, we have a feature flag with the key 'acceptable-feature-stability' with three variants: alpha, beta, and ga.","The flag has a targeting rule that enables the flag based on the customer ID.","The flag is enabled for customer-A in the alpha variant, for customer-B1 and customer-B2 in the beta variant, and for all other customers in the ga variant.","Experiment by changing the 'customerId' in the context."].join(" "),flagDefinition:jt({flags:{"acceptable-feature-stability":{state:"ENABLED",defaultVariant:"ga",variants:{alpha:"alpha",beta:"beta",ga:"ga"},targeting:{if:[{"===":[{var:"customerId"},"customer-A"]},"alpha",{in:[{var:"customerId"},["customer-B1","customer-B2"]]},"beta","ga"]}}}}),flagKey:"acceptable-feature-stability",returnType:"string",context:Dt({targetingKey:"sessionId-123",customerId:"customer-A"})},y$={description:['In this scenario, we have a feature flag with the key "enable-mainframe-access" that is enabled and has two variants: true and false.','This flag has a targeting rule defined that enables the flag for users with an email address that ends with "@ingen.com".',"Experiment with changing the email address in the context or in the targeting rule."].join(" "),flagDefinition:jt({flags:{"enable-mainframe-access":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{ends_with:[{var:"email"},"@ingen.com"]},"true"]}}}}),flagKey:"enable-mainframe-access",returnType:"boolean",context:Dt({email:"john.arnold@ingen.com"})},v$={description:['In this scenario, we have a feature flag with the key "supports-one-hour-delivery" that is enabled and has two variants: true and false.','This flag has a targeting rule defined that enables the flag for users with a locale of "us" or "ca".',"Experiment with changing the locale in the context or in the locale list in the targeting rule."].join(" "),flagDefinition:jt({flags:{"supports-one-hour-delivery":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{in:[{var:"locale"},["us","ca"]]},"true"]}}}}),context:Dt({locale:"us"}),flagKey:"supports-one-hour-delivery",returnType:"boolean"},b$={description:['In this scenario, we have a feature flag with the key "enable-announcement-banner" that is enabled and has two variants: true and false.',"This flag has a targeting rule defined that enables the flag after a specified time.",'The current time (epoch) can be accessed using "$flagd.timestamp" which is automatically provided by flagd.','Five seconds after loading this scenario, the response will change to "true".'].join(" "),flagDefinition:()=>jt({flags:{"enable-announcement-banner":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{">":[{var:"$flagd.timestamp"},Math.floor(Date.now()/1e3)+5]},"true"]}}}}),flagKey:"enable-announcement-banner",returnType:"boolean",context:()=>Dt({})},E$={description:['In this scenario, we have a feature flag with the key "enable-performance-mode" that is enabled and has two variants: true and false.','This rule looks for the evaluation context "version". If the version is greater or equal to "1.7.0" the feature is enabled.','Otherwise, the "defaultVariant" is return. Experiment by changing the version in the context.'].join(" "),flagDefinition:jt({flags:{"enable-performance-mode":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{sem_ver:[{var:"version"},">=","1.7.0"]},"true"]}}}}),flagKey:"enable-performance-mode",returnType:"boolean",context:Dt({version:"1.6.0"})},_$={description:['In this scenario, we have a feature flag with the key "color-palette-experiment" that is enabled and has four variants: red, blue, green, and grey.','The targeting rule uses the "fractional" operator, which deterministically splits the traffic based on the configuration.','This configuration splits the traffic evenly between the four variants by bucketing evaluations pseudorandomly using the "targetingKey" and feature flag key.','Experiment by changing the "targetingKey" to another value.'].join(" "),flagDefinition:jt({flags:{"color-palette-experiment":{state:"ENABLED",defaultVariant:"grey",variants:{red:"#b91c1c",blue:"#0284c7",green:"#16a34a",grey:"#4b5563"},targeting:{fractional:[["red",25],["blue",25],["green",25],["grey",25]]}}}}),flagKey:"color-palette-experiment",returnType:"string",context:Dt({targetingKey:"sessionId-123"})},S$={description:['In this scenario, we have a feature flag with the key "enable-new-llm-model" with multiple variant for illustrative purposes.',"This flag has a targeting rule defined that enables the flag for a percentage of users based on the release phase.",'The "targetingKey" ensures that the user always sees the same results during a each phase of the rollout process.'].join(" "),flagDefinition:()=>{const n=Math.floor(Date.now()/1e3)+5,i=Math.floor(Date.now()/1e3)+10,u=Math.floor(Date.now()/1e3)+15,l=Math.floor(Date.now()/1e3)+20;return jt({flags:{"enable-new-llm-model":{state:"ENABLED",defaultVariant:"disabled",variants:{disabled:!1,phase1Enabled:!0,phase1Disabled:!1,phase2Enabled:!0,phase2Disabled:!1,phase3Enabled:!0,phase3Disabled:!1,enabled:!0},targeting:{if:[{">=":[n,{var:"$flagd.timestamp"}]},"disabled",{"<=":[n,{var:"$flagd.timestamp"},i]},{fractional:[["phase1Enabled",10],["phase1Disabled",90]]},{"<=":[i,{var:"$flagd.timestamp"},u]},{fractional:[["phase2Enabled",25],["phase2Disabled",75]]},{"<=":[u,{var:"$flagd.timestamp"},l]},{fractional:[["phase3Enabled",50],["phase3Disabled",50]]},"enabled"]}}}})},flagKey:"enable-new-llm-model",returnType:"boolean",context:()=>Dt({targetingKey:"sessionId-12345"})},w$={description:["In this scenario, we have two feature flags that share targeting rule logic.","This is accomplished by defining a $evaluators object in the feature flag definition and referencing it by name in a targeting rule.","Experiment with changing the email domain in the shared evaluator."].join(" "),flagDefinition:jt({flags:{"feature-1":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}},"feature-2":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}}},$evaluators:{emailWithFaas:{ends_with:[{var:"email"},"@faas.com"]}}}),flagKey:"feature-1",returnType:"boolean",context:Dt({email:"example@faas.com"})},A$={description:["In this scenario, we have a feature flag that is evaluated based on its targeting key.","The targeting key is contain a string uniquely identifying the subject of the flag evaluation, such as a user's email, or a session identifier.",`In this case, null is returned from targeting if the targeting key doesn't match; this results in a reason of "DEFAULT", since no variant was matched by the targeting rule.`].join(" "),flagDefinition:jt({flags:{"targeting-key-flag":{state:"ENABLED",variants:{miss:"miss",hit:"hit"},defaultVariant:"miss",targeting:{if:[{"==":[{var:"targetingKey"},"5c3d8535-f81a-4478-a6d3-afaa4d51199e"]},"hit",null]}}}}),flagKey:"targeting-key-flag",returnType:"string",context:Dt({targetingKey:"5c3d8535-f81a-4478-a6d3-afaa4d51199e"})},$$={description:["In this scenario, we have a feature flag with metadata about the flag.","There is top-level metadata for the flag set and metadata specific to the flag.","These values are merged together, with the flag metadata taking precedence."].join(" "),flagDefinition:jt({flags:{"flag-with-metadata":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:"on",metadata:{version:"1"}}},metadata:{flagSetId:"playground/dev"}}),flagKey:"flag-with-metadata",returnType:"boolean",context:Dt({})},fn={"Basic boolean flag":c$,"Basic numeric flag":d$,"Basic string flag":p$,"Basic object flag":h$,"Enable for a specific email domain":y$,"Enable based on users locale":v$,"Enable based on release version":E$,"Enable based on the current time":b$,"Chainable if/else/then":g$,"Multi-variant experiment":_$,"Progressive rollout":S$,"Shared evaluators":w$,"Boolean variant shorthand":m$,"Targeting key":A$,"Flag metadata":$$};function O$(n,i,u){return i in n?Object.defineProperty(n,i,{value:u,enumerable:!0,configurable:!0,writable:!0}):n[i]=u,n}function J0(n,i){var u=Object.keys(n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(n);i&&(l=l.filter(function(s){return Object.getOwnPropertyDescriptor(n,s).enumerable})),u.push.apply(u,l)}return u}function W0(n){for(var i=1;i=0)&&(u[s]=n[s]);return u}function R$(n,i){if(n==null)return{};var u=T$(n,i),l,s;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(s=0;s=0)&&Object.prototype.propertyIsEnumerable.call(n,l)&&(u[l]=n[l])}return u}function N$(n,i){return j$(n)||D$(n,i)||M$(n,i)||C$()}function j$(n){if(Array.isArray(n))return n}function D$(n,i){if(!(typeof Symbol>"u"||!(Symbol.iterator in Object(n)))){var u=[],l=!0,s=!1,o=void 0;try{for(var c=n[Symbol.iterator](),d;!(l=(d=c.next()).done)&&(u.push(d.value),!(i&&u.length===i));l=!0);}catch(p){s=!0,o=p}finally{try{!l&&c.return!=null&&c.return()}finally{if(s)throw o}}return u}}function M$(n,i){if(n){if(typeof n=="string")return ev(n,i);var u=Object.prototype.toString.call(n).slice(8,-1);if(u==="Object"&&n.constructor&&(u=n.constructor.name),u==="Map"||u==="Set")return Array.from(n);if(u==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(u))return ev(n,i)}}function ev(n,i){(i==null||i>n.length)&&(i=n.length);for(var u=0,l=new Array(i);u=n.length?n.apply(this,s):function(){for(var c=arguments.length,d=new Array(c),p=0;p1&&arguments[1]!==void 0?arguments[1]:{};is.initial(n),is.handler(i);var u={current:n},l=Fa(K$)(u,i),s=Fa(P$)(u),o=Fa(is.changes)(n),c=Fa(Y$)(u);function d(){var m=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(v){return v};return is.selector(m),m(u.current)}function p(m){L$(l,s,o,c)(m)}return[d,p]}function Y$(n,i){return nl(i)?i(n.current):i}function P$(n,i){return n.current=nv(nv({},n.current),i),i}function K$(n,i,u){return nl(i)?i(n.current):Object.keys(u).forEach(function(l){var s;return(s=i[l])===null||s===void 0?void 0:s.call(i,n.current[l])}),u}var F$={create:G$},X$={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.43.0/min/vs"}};function Q$(n){return function i(){for(var u=this,l=arguments.length,s=new Array(l),o=0;o=n.length?n.apply(this,s):function(){for(var c=arguments.length,d=new Array(c),p=0;p{l.current=!1}:r,i)}var Lt=ow;function Mi(){}function wa(r,i,u,l){return fw(r,l)||cw(r,i,u,l)}function fw(r,i){return r.editor.getModel(Uv(r,i))}function cw(r,i,u,l){return r.editor.createModel(i,u,l?Uv(r,l):void 0)}function Uv(r,i){return r.Uri.parse(i)}function dw({original:r,modified:i,language:u,originalLanguage:l,modifiedLanguage:c,originalModelPath:o,modifiedModelPath:d,keepCurrentOriginalModel:h=!1,keepCurrentModifiedModel:m=!1,theme:y="light",loading:S="Loading...",options:N={},height:x="100%",width:V="100%",className:L,wrapperProps:C={},beforeMount:g=Mi,onMount:w=Mi}){let[p,b]=ve.useState(!1),[E,O]=ve.useState(!0),v=ve.useRef(null),A=ve.useRef(null),$=ve.useRef(null),D=ve.useRef(w),j=ve.useRef(g),Y=ve.useRef(!1);zv(()=>{let ne=qv.init();return ne.then(P=>(A.current=P)&&O(!1)).catch(P=>(P==null?void 0:P.type)!=="cancelation"&&console.error("Monaco initialization: error:",P)),()=>v.current?F():ne.cancel()}),Lt(()=>{if(v.current&&A.current){let ne=v.current.getOriginalEditor(),P=wa(A.current,r||"",l||u||"text",o||"");P!==ne.getModel()&&ne.setModel(P)}},[o],p),Lt(()=>{if(v.current&&A.current){let ne=v.current.getModifiedEditor(),P=wa(A.current,i||"",c||u||"text",d||"");P!==ne.getModel()&&ne.setModel(P)}},[d],p),Lt(()=>{let ne=v.current.getModifiedEditor();ne.getOption(A.current.editor.EditorOption.readOnly)?ne.setValue(i||""):i!==ne.getValue()&&(ne.executeEdits("",[{range:ne.getModel().getFullModelRange(),text:i||"",forceMoveMarkers:!0}]),ne.pushUndoStop())},[i],p),Lt(()=>{var ne,P;(P=(ne=v.current)==null?void 0:ne.getModel())==null||P.original.setValue(r||"")},[r],p),Lt(()=>{let{original:ne,modified:P}=v.current.getModel();A.current.editor.setModelLanguage(ne,l||u||"text"),A.current.editor.setModelLanguage(P,c||u||"text")},[u,l,c],p),Lt(()=>{var ne;(ne=A.current)==null||ne.editor.setTheme(y)},[y],p),Lt(()=>{var ne;(ne=v.current)==null||ne.updateOptions(N)},[N],p);let Q=ve.useCallback(()=>{var ue;if(!A.current)return;j.current(A.current);let ne=wa(A.current,r||"",l||u||"text",o||""),P=wa(A.current,i||"",c||u||"text",d||"");(ue=v.current)==null||ue.setModel({original:ne,modified:P})},[u,i,c,r,l,o,d]),W=ve.useCallback(()=>{var ne;!Y.current&&$.current&&(v.current=A.current.editor.createDiffEditor($.current,{automaticLayout:!0,...N}),Q(),(ne=A.current)==null||ne.editor.setTheme(y),b(!0),Y.current=!0)},[N,y,Q]);ve.useEffect(()=>{p&&D.current(v.current,A.current)},[p]),ve.useEffect(()=>{!E&&!p&&W()},[E,p,W]);function F(){var P,ue,re,de;let ne=(P=v.current)==null?void 0:P.getModel();h||((ue=ne==null?void 0:ne.original)==null||ue.dispose()),m||((re=ne==null?void 0:ne.modified)==null||re.dispose()),(de=v.current)==null||de.dispose()}return Lr.createElement(Cv,{width:V,height:x,isEditorReady:p,loading:S,_ref:$,className:L,wrapperProps:C})}var hw=dw;ve.memo(hw);function mw(r){let i=ve.useRef();return ve.useEffect(()=>{i.current=r},[r]),i.current}var pw=mw,Ll=new Map;function yw({defaultValue:r,defaultLanguage:i,defaultPath:u,value:l,language:c,path:o,theme:d="light",line:h,loading:m="Loading...",options:y={},overrideServices:S={},saveViewState:N=!0,keepCurrentModel:x=!1,width:V="100%",height:L="100%",className:C,wrapperProps:g={},beforeMount:w=Mi,onMount:p=Mi,onChange:b,onValidate:E=Mi}){let[O,v]=ve.useState(!1),[A,$]=ve.useState(!0),D=ve.useRef(null),j=ve.useRef(null),Y=ve.useRef(null),Q=ve.useRef(p),W=ve.useRef(w),F=ve.useRef(),ne=ve.useRef(l),P=pw(o),ue=ve.useRef(!1),re=ve.useRef(!1);zv(()=>{let z=qv.init();return z.then(K=>(D.current=K)&&$(!1)).catch(K=>(K==null?void 0:K.type)!=="cancelation"&&console.error("Monaco initialization: error:",K)),()=>j.current?R():z.cancel()}),Lt(()=>{var K,k,T,H;let z=wa(D.current,r||l||"",i||c||"",o||u||"");z!==((K=j.current)==null?void 0:K.getModel())&&(N&&Ll.set(P,(k=j.current)==null?void 0:k.saveViewState()),(T=j.current)==null||T.setModel(z),N&&((H=j.current)==null||H.restoreViewState(Ll.get(o))))},[o],O),Lt(()=>{var z;(z=j.current)==null||z.updateOptions(y)},[y],O),Lt(()=>{!j.current||l===void 0||(j.current.getOption(D.current.editor.EditorOption.readOnly)?j.current.setValue(l):l!==j.current.getValue()&&(re.current=!0,j.current.executeEdits("",[{range:j.current.getModel().getFullModelRange(),text:l,forceMoveMarkers:!0}]),j.current.pushUndoStop(),re.current=!1))},[l],O),Lt(()=>{var K,k;let z=(K=j.current)==null?void 0:K.getModel();z&&c&&((k=D.current)==null||k.editor.setModelLanguage(z,c))},[c],O),Lt(()=>{var z;h!==void 0&&((z=j.current)==null||z.revealLine(h))},[h],O),Lt(()=>{var z;(z=D.current)==null||z.editor.setTheme(d)},[d],O);let de=ve.useCallback(()=>{var z;if(!(!Y.current||!D.current)&&!ue.current){W.current(D.current);let K=o||u,k=wa(D.current,l||r||"",i||c||"",K||"");j.current=(z=D.current)==null?void 0:z.editor.create(Y.current,{model:k,automaticLayout:!0,...y},S),N&&j.current.restoreViewState(Ll.get(K)),D.current.editor.setTheme(d),h!==void 0&&j.current.revealLine(h),v(!0),ue.current=!0}},[r,i,u,l,c,o,y,S,N,d,h]);ve.useEffect(()=>{O&&Q.current(j.current,D.current)},[O]),ve.useEffect(()=>{!A&&!O&&de()},[A,O,de]),ne.current=l,ve.useEffect(()=>{var z,K;O&&b&&((z=F.current)==null||z.dispose(),F.current=(K=j.current)==null?void 0:K.onDidChangeModelContent(k=>{re.current||b(j.current.getValue(),k)}))},[O,b]),ve.useEffect(()=>{if(O){let z=D.current.editor.onDidChangeMarkers(K=>{var T;let k=(T=j.current.getModel())==null?void 0:T.uri;if(k&&K.find(H=>H.path===k.path)){let H=D.current.editor.getModelMarkers({resource:k});E==null||E(H)}});return()=>{z==null||z.dispose()}}return()=>{}},[O,E]);function R(){var z,K;(z=F.current)==null||z.dispose(),x?N&&Ll.set(o,j.current.saveViewState()):(K=j.current.getModel())==null||K.dispose(),j.current.dispose()}return Lr.createElement(Cv,{width:V,height:L,isEditorReady:O,loading:m,_ref:Y,className:C,wrapperProps:g})}var gw=yw,ev=ve.memo(gw);const tv="data-md-color-scheme",vw="[data-md-component=palette]",nv=()=>document.body.getAttribute(tv)&&document.body.getAttribute(tv)!=="default"?"custom-dark":"custom",rv=r=>{r==null||r.editor.defineTheme("custom-dark",{base:"vs-dark",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.editor.defineTheme("custom",{base:"vs",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.languages.json.jsonDefaults.setDiagnosticsOptions({enableSchemaRequest:!0,allowComments:!1})};function av(r){const i=JSON.parse(r);return JSON.stringify(i)}function iv(r){const i=JSON.parse(r);return JSON.stringify(i,null,2)}function bw(){const[r,i]=ve.useState("Basic boolean flag"),[u,l]=ve.useState(nn[r].flagDefinition),[c,o]=ve.useState(nn[r].flagKey),[d,h]=ve.useState(nn[r].returnType),[m,y]=ve.useState(Kg(nn[r].context)),[S,N]=ve.useState(!1),[x,V]=ve.useState(""),[L,C]=ve.useState([]),[g,w]=ve.useState(nn[r].description),[p,b]=ve.useState(!0),[E,O]=ve.useState(!0),[v,A]=ve.useState(!1),[$,D]=ve.useState("success"),[j,Y]=ve.useState(nv()),Q=ve.useCallback(()=>{V(""),N(!1);const R=nn[r];l(R.flagDefinition),o(R.flagKey),h(R.returnType),y(Kg(R.context)),w(R.description),b(!0),O(!0),A(!1),D("success")},[r]);ve.useEffect(()=>{Q()},[r,Q]);const W=ve.useMemo(()=>new Rv(console),[]),F=ve.useMemo(()=>new Z_(W,console),[W]);ve.useEffect(()=>{if(F_(u))try{F.setConfigurations(u),C(Array.from(F.getFlags().keys())),b(!0)}catch(R){console.error("Invalid flagd configuration",R),b(!1)}else b(!1)},[u,F]),ve.useEffect(()=>{try{JSON.parse(m),O(!0)}catch(R){console.error("Invalid JSON input",R),O(!1)}},[m]),ve.useEffect(()=>{var K;const R=document.querySelector(vw),z=(K=window.component$)==null?void 0:K.subscribe(k=>{(k==null?void 0:k.ref)===R&&Y(nv())});return()=>{z==null||z.unsubscribe()}}),ve.useEffect(()=>{const R=new URLSearchParams(window.location.search),z=R.get("flags"),K=R.get("flag-key"),k=R.get("return-type"),T=R.get("eval-context"),H=R.get("scenario-name");if(z)try{const te=iv(z);if(l(te),K&&o(K),k&&h(k),T){const pe=iv(T);y(pe)}}catch(te){console.error("Error decoding URL parameters: ",te)}else H&&nn[H]&&(i(H),l(nn[H].flagDefinition))},[]);const ne=()=>{N(!0);try{let R;const z=JSON.parse(m);switch(d){case"boolean":R=F.resolveBooleanEvaluation(c,!1,z,console);break;case"string":R=F.resolveStringEvaluation(c,"",z,console);break;case"number":R=F.resolveNumberEvaluation(c,0,z,console);break;case"object":R=F.resolveObjectEvaluation(c,{},z,console);break}D("success"),V(JSON.stringify(R,null,2))}catch(R){console.error("Invalid JSON input",R),D("failure"),V(R.message)}},P=ve.useMemo(()=>{try{return JSON.parse(x)}catch{return x}},[x]),ue=mb("(max-width: 1220px)"),re={border:"none",backgroundColor:"var(--md-code-bg-color)",color:"var(--md-code-fg-color)",fontFeatureSettings:"kern",fontFamily:"var(--md-code-font-family)"},de=()=>{const R=window.location.origin+window.location.pathname,z=new URL(R),K=av(u),k=av(m);Object.keys(nn).includes(r)&&nn[r].flagDefinition===u?z.searchParams.set("scenario-name",r):(z.searchParams.delete("scenario-name"),z.searchParams.set("flags",K),z.searchParams.set("flag-key",c),z.searchParams.set("return-type",d),z.searchParams.set("eval-context",k)),window.history.pushState({},"",z.href),navigator.clipboard.writeText(z.href).then(()=>{console.log("URL copied to clipboard"),A(!0),setTimeout(()=>{A(!1)},5e3)}).catch(T=>{console.error("Failed to copy URL: ",T)})};return we.jsxs("div",{style:{maxWidth:"825px"},children:[we.jsx("div",{children:we.jsxs("p",{style:{margin:"-32px 0 0 0",lineHeight:"1.4",fontSize:"medium"},children:["Explore flagd flag definitions in your browser. Begin by selecting an example below; these are merely starting points, so customize the flag definition as you wish. Find an overview of the flag definition structure ",we.jsx("a",{href:"/reference/flag-definitions/",children:"here"}),"."]})}),we.jsxs("div",{children:[we.jsx("h4",{children:"Select a scenario"}),we.jsxs("div",{style:{display:"flex",flexDirection:ue?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[we.jsx("div",{style:{flex:"2"},children:we.jsx("select",{style:{width:"100%",minWidth:"250px",padding:"8px",...re},value:r,onChange:R=>i(R.target.value),children:Object.keys(nn).map(R=>we.jsx("option",{value:R,children:R},R))})}),we.jsx("div",{style:{flex:"3"},children:we.jsx("p",{style:{lineHeight:"1.4",margin:"-4px 0 0 0",fontSize:"small"},children:g})})]}),we.jsxs("div",{style:{display:"flex",flexDirection:ue?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[we.jsxs("div",{style:{flex:"3"},children:[we.jsx("h4",{children:"Feature definition"}),we.jsx("div",{style:{backgroundColor:re.backgroundColor},children:we.jsx(ev,{theme:j,width:"100%",height:"500px",language:"json",value:u,options:{minimap:{enabled:!1},lineNumbers:"off"},beforeMount:rv,onChange:R=>{R&&l(R)}})})]}),we.jsxs("div",{style:{flex:"2"},children:[we.jsxs("div",{children:[we.jsx("h4",{children:"Flag key"}),we.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...re},name:"flag-key",list:"flag-keys",value:c,onChange:R=>o(R.target.value)}),we.jsx("datalist",{id:"flag-keys",children:L.map((R,z)=>we.jsx("option",{value:R},z))})]}),we.jsxs("div",{children:[we.jsx("h4",{children:"Return type"}),we.jsxs("select",{style:{width:"100%",padding:"8px 0 8px 0",...re},value:d,onChange:R=>h(R.target.value),children:[we.jsx("option",{value:"boolean",children:"boolean"}),we.jsx("option",{value:"string",children:"string"}),we.jsx("option",{value:"number",children:"number"}),we.jsx("option",{value:"object",children:"object"})]})]}),we.jsxs("div",{children:[we.jsx("h4",{children:"Evaluation context"}),we.jsx("div",{style:{backgroundColor:re.backgroundColor},children:we.jsx(ev,{theme:j,width:"100%",height:"80px",language:"json",options:{minimap:{enabled:!1},lineNumbers:"off",folding:!1},beforeMount:rv,value:m,onChange:R=>{R&&y(R)}})})]}),we.jsxs("div",{style:{display:"flex",gap:"8px",paddingTop:"8px"},children:[we.jsx("button",{className:"md-button md-button--primary",onClick:ne,disabled:!p||!E,children:"Evaluate"}),we.jsx("button",{className:"md-button",onClick:Q,children:"Reset"}),we.jsx("button",{className:"md-button",onClick:de,disabled:!p||!E,children:"Share"})]}),we.jsxs("div",{className:`output ${S?"visible":""} admonition ${$==="success"?"success":"failure"}`,children:[we.jsx("p",{className:"admonition-title",children:$==="success"?"Success":"Failure"}),typeof P=="object"?we.jsx("div",{style:{margin:"0.6rem 0 0.6rem 0"},children:Object.entries(P).map(([R,z])=>we.jsxs("div",{children:[we.jsxs("strong",{children:[R,":"]})," ",JSON.stringify(z)]},R))}):we.jsx("p",{children:P})]}),v&&we.jsx("h4",{className:"admonition-title",style:{paddingLeft:"45px",borderLeftWidth:"0rem",borderLeftStyle:"solid",left:"15px"},children:"URL copied to clipboard"})]})]})]})]})}cb.createRoot(document.getElementById("playground")).render(we.jsx(Lr.StrictMode,{children:we.jsx(bw,{})})); + `},rv=Q$(eO)(_1),tO={config:J$},nO=function(){for(var i=arguments.length,u=new Array(i),l=0;l{l.current=!1}:n,i)}var Gt=_O;function Qa(){}function Ii(n,i,u,l){return SO(n,l)||wO(n,i,u,l)}function SO(n,i){return n.editor.getModel(R1(n,i))}function wO(n,i,u,l){return n.editor.createModel(i,u,l?R1(n,l):void 0)}function R1(n,i){return n.Uri.parse(i)}function AO({original:n,modified:i,language:u,originalLanguage:l,modifiedLanguage:s,originalModelPath:o,modifiedModelPath:c,keepCurrentOriginalModel:d=!1,keepCurrentModifiedModel:p=!1,theme:m="light",loading:v="Loading...",options:S={},height:q="100%",width:C="100%",className:U,wrapperProps:D={},beforeMount:y=Qa,onMount:A=Qa}){let[g,E]=ve.useState(!1),[_,O]=ve.useState(!0),b=ve.useRef(null),T=ve.useRef(null),$=ve.useRef(null),M=ve.useRef(A),j=ve.useRef(y),G=ve.useRef(!1);T1(()=>{let ne=$1.init();return ne.then(P=>(T.current=P)&&O(!1)).catch(P=>(P==null?void 0:P.type)!=="cancelation"&&console.error("Monaco initialization: error:",P)),()=>b.current?J():ne.cancel()}),Gt(()=>{if(b.current&&T.current){let ne=b.current.getOriginalEditor(),P=Ii(T.current,n||"",l||u||"text",o||"");P!==ne.getModel()&&ne.setModel(P)}},[o],g),Gt(()=>{if(b.current&&T.current){let ne=b.current.getModifiedEditor(),P=Ii(T.current,i||"",s||u||"text",c||"");P!==ne.getModel()&&ne.setModel(P)}},[c],g),Gt(()=>{let ne=b.current.getModifiedEditor();ne.getOption(T.current.editor.EditorOption.readOnly)?ne.setValue(i||""):i!==ne.getValue()&&(ne.executeEdits("",[{range:ne.getModel().getFullModelRange(),text:i||"",forceMoveMarkers:!0}]),ne.pushUndoStop())},[i],g),Gt(()=>{var ne,P;(P=(ne=b.current)==null?void 0:ne.getModel())==null||P.original.setValue(n||"")},[n],g),Gt(()=>{let{original:ne,modified:P}=b.current.getModel();T.current.editor.setModelLanguage(ne,l||u||"text"),T.current.editor.setModelLanguage(P,s||u||"text")},[u,l,s],g),Gt(()=>{var ne;(ne=T.current)==null||ne.editor.setTheme(m)},[m],g),Gt(()=>{var ne;(ne=b.current)==null||ne.updateOptions(S)},[S],g);let X=ve.useCallback(()=>{var se;if(!T.current)return;j.current(T.current);let ne=Ii(T.current,n||"",l||u||"text",o||""),P=Ii(T.current,i||"",s||u||"text",c||"");(se=b.current)==null||se.setModel({original:ne,modified:P})},[u,i,s,n,l,o,c]),W=ve.useCallback(()=>{var ne;!G.current&&$.current&&(b.current=T.current.editor.createDiffEditor($.current,{automaticLayout:!0,...S}),X(),(ne=T.current)==null||ne.editor.setTheme(m),E(!0),G.current=!0)},[S,m,X]);ve.useEffect(()=>{g&&M.current(b.current,T.current)},[g]),ve.useEffect(()=>{!_&&!g&&W()},[_,g,W]);function J(){var P,se,re,de;let ne=(P=b.current)==null?void 0:P.getModel();d||((se=ne==null?void 0:ne.original)==null||se.dispose()),p||((re=ne==null?void 0:ne.modified)==null||re.dispose()),(de=b.current)==null||de.dispose()}return Fr.createElement(O1,{width:C,height:q,isEditorReady:g,loading:v,_ref:$,className:U,wrapperProps:D})}var $O=AO;ve.memo($O);function OO(n){let i=ve.useRef();return ve.useEffect(()=>{i.current=n},[n]),i.current}var TO=OO,as=new Map;function RO({defaultValue:n,defaultLanguage:i,defaultPath:u,value:l,language:s,path:o,theme:c="light",line:d,loading:p="Loading...",options:m={},overrideServices:v={},saveViewState:S=!0,keepCurrentModel:q=!1,width:C="100%",height:U="100%",className:D,wrapperProps:y={},beforeMount:A=Qa,onMount:g=Qa,onChange:E,onValidate:_=Qa}){let[O,b]=ve.useState(!1),[T,$]=ve.useState(!0),M=ve.useRef(null),j=ve.useRef(null),G=ve.useRef(null),X=ve.useRef(g),W=ve.useRef(A),J=ve.useRef(),ne=ve.useRef(l),P=TO(o),se=ve.useRef(!1),re=ve.useRef(!1);T1(()=>{let z=$1.init();return z.then(K=>(M.current=K)&&$(!1)).catch(K=>(K==null?void 0:K.type)!=="cancelation"&&console.error("Monaco initialization: error:",K)),()=>j.current?R():z.cancel()}),Gt(()=>{var K,Y,N,H;let z=Ii(M.current,n||l||"",i||s||"",o||u||"");z!==((K=j.current)==null?void 0:K.getModel())&&(S&&as.set(P,(Y=j.current)==null?void 0:Y.saveViewState()),(N=j.current)==null||N.setModel(z),S&&((H=j.current)==null||H.restoreViewState(as.get(o))))},[o],O),Gt(()=>{var z;(z=j.current)==null||z.updateOptions(m)},[m],O),Gt(()=>{!j.current||l===void 0||(j.current.getOption(M.current.editor.EditorOption.readOnly)?j.current.setValue(l):l!==j.current.getValue()&&(re.current=!0,j.current.executeEdits("",[{range:j.current.getModel().getFullModelRange(),text:l,forceMoveMarkers:!0}]),j.current.pushUndoStop(),re.current=!1))},[l],O),Gt(()=>{var K,Y;let z=(K=j.current)==null?void 0:K.getModel();z&&s&&((Y=M.current)==null||Y.editor.setModelLanguage(z,s))},[s],O),Gt(()=>{var z;d!==void 0&&((z=j.current)==null||z.revealLine(d))},[d],O),Gt(()=>{var z;(z=M.current)==null||z.editor.setTheme(c)},[c],O);let de=ve.useCallback(()=>{var z;if(!(!G.current||!M.current)&&!se.current){W.current(M.current);let K=o||u,Y=Ii(M.current,l||n||"",i||s||"",K||"");j.current=(z=M.current)==null?void 0:z.editor.create(G.current,{model:Y,automaticLayout:!0,...m},v),S&&j.current.restoreViewState(as.get(K)),M.current.editor.setTheme(c),d!==void 0&&j.current.revealLine(d),b(!0),se.current=!0}},[n,i,u,l,s,o,m,v,S,c,d]);ve.useEffect(()=>{O&&X.current(j.current,M.current)},[O]),ve.useEffect(()=>{!T&&!O&&de()},[T,O,de]),ne.current=l,ve.useEffect(()=>{var z,K;O&&E&&((z=J.current)==null||z.dispose(),J.current=(K=j.current)==null?void 0:K.onDidChangeModelContent(Y=>{re.current||E(j.current.getValue(),Y)}))},[O,E]),ve.useEffect(()=>{if(O){let z=M.current.editor.onDidChangeMarkers(K=>{var N;let Y=(N=j.current.getModel())==null?void 0:N.uri;if(Y&&K.find(H=>H.path===Y.path)){let H=M.current.editor.getModelMarkers({resource:Y});_==null||_(H)}});return()=>{z==null||z.dispose()}}return()=>{}},[O,_]);function R(){var z,K;(z=J.current)==null||z.dispose(),q?S&&as.set(o,j.current.saveViewState()):(K=j.current.getModel())==null||K.dispose(),j.current.dispose()}return Fr.createElement(O1,{width:C,height:U,isEditorReady:O,loading:p,_ref:G,className:D,wrapperProps:y})}var NO=RO,iv=ve.memo(NO);const av="data-md-color-scheme",jO="[data-md-component=palette]",lv=()=>document.body.getAttribute(av)&&document.body.getAttribute(av)!=="default"?"custom-dark":"custom",uv=n=>{n==null||n.editor.defineTheme("custom-dark",{base:"vs-dark",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),n==null||n.editor.defineTheme("custom",{base:"vs",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),n==null||n.languages.json.jsonDefaults.setDiagnosticsOptions({enableSchemaRequest:!0,allowComments:!1})};function sv(n){const i=JSON.parse(n);return JSON.stringify(i,null,2)}function DO(){const[n,i]=ve.useState("Basic boolean flag"),[u,l]=ve.useState(fn[n].flagDefinition),[s,o]=ve.useState(fn[n].flagKey),[c,d]=ve.useState(fn[n].returnType),[p,m]=ve.useState(Z0(fn[n].context)),[v,S]=ve.useState(!1),[q,C]=ve.useState(""),[U,D]=ve.useState([]),[y,A]=ve.useState(fn[n].description),[g,E]=ve.useState(!0),[_,O]=ve.useState(!0),[b,T]=ve.useState(!1),[$,M]=ve.useState("success"),[j,G]=ve.useState(lv()),X=ve.useCallback(()=>{C(""),S(!1);const R=fn[n];l(R.flagDefinition),o(R.flagKey),d(R.returnType),m(Z0(R.context)),A(R.description),E(!0),O(!0),T(!1),M("success")},[n]);ve.useEffect(()=>{X()},[n,X]);const W=ve.useMemo(()=>new jv(console),[]),J=ve.useMemo(()=>new Vw(W,console),[W]);ve.useEffect(()=>{if(f$(u))try{const R=nd(u);J.setConfigurations(R),D(Array.from(J.getFlags().keys())),E(!0)}catch(R){console.error("Invalid flagd configuration",R),E(!1)}else E(!1)},[u,J]),ve.useEffect(()=>{try{JSON.parse(p),O(!0)}catch(R){console.error("Invalid JSON input",R),O(!1)}},[p]),ve.useEffect(()=>{var K;const R=document.querySelector(jO),z=(K=window.component$)==null?void 0:K.subscribe(Y=>{(Y==null?void 0:Y.ref)===R&&G(lv())});return()=>{z==null||z.unsubscribe()}}),ve.useEffect(()=>{const R=new URLSearchParams(window.location.search),z=R.get("flags"),K=R.get("flag-key"),Y=R.get("return-type"),N=R.get("eval-context"),H=R.get("scenario-name");if(z)try{const te=sv(z);if(l(te),K&&o(K),Y&&d(Y),N){const me=sv(N);m(me)}}catch(te){console.error("Error decoding URL parameters: ",te)}else H&&fn[H]&&(i(H),l(fn[H].flagDefinition))},[]);const ne=()=>{S(!0);try{let R;const z=JSON.parse(p);switch(c){case"boolean":R=J.resolveBooleanEvaluation(s,!1,z,console);break;case"string":R=J.resolveStringEvaluation(s,"",z,console);break;case"number":R=J.resolveNumberEvaluation(s,0,z,console);break;case"object":R=J.resolveObjectEvaluation(s,{},z,console);break}M("success"),C(JSON.stringify(R,null,2))}catch(R){console.error("Invalid JSON input",R),M("failure"),C(R.message)}},P=ve.useMemo(()=>{try{return JSON.parse(q)}catch{return q}},[q]),se=l_("(max-width: 1220px)"),re={border:"none",backgroundColor:"var(--md-code-bg-color)",color:"var(--md-code-fg-color)",fontFeatureSettings:"kern",fontFamily:"var(--md-code-font-family)"},de=()=>{const R=window.location.origin+window.location.pathname,z=new URL(R),K=nd(u),Y=nd(p);Object.keys(fn).includes(n)&&fn[n].flagDefinition===u?z.searchParams.set("scenario-name",n):(z.searchParams.delete("scenario-name"),z.searchParams.set("flags",K),z.searchParams.set("flag-key",s),z.searchParams.set("return-type",c),z.searchParams.set("eval-context",Y)),window.history.pushState({},"",z.href),navigator.clipboard.writeText(z.href).then(()=>{console.log("URL copied to clipboard"),T(!0),setTimeout(()=>{T(!1)},5e3)}).catch(N=>{console.error("Failed to copy URL: ",N)})};return Ae.jsxs("div",{style:{maxWidth:"825px"},children:[Ae.jsx("div",{children:Ae.jsxs("p",{style:{margin:"-32px 0 0 0",lineHeight:"1.4",fontSize:"medium"},children:["Explore flagd flag definitions in your browser. Begin by selecting an example below; these are merely starting points, so customize the flag definition as you wish. Find an overview of the flag definition structure ",Ae.jsx("a",{href:"/reference/flag-definitions/",children:"here"}),"."]})}),Ae.jsxs("div",{children:[Ae.jsx("h4",{children:"Select a scenario"}),Ae.jsxs("div",{style:{display:"flex",flexDirection:se?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[Ae.jsx("div",{style:{flex:"2"},children:Ae.jsx("select",{style:{width:"100%",minWidth:"250px",padding:"8px",...re},value:n,onChange:R=>i(R.target.value),children:Object.keys(fn).map(R=>Ae.jsx("option",{value:R,children:R},R))})}),Ae.jsx("div",{style:{flex:"3"},children:Ae.jsx("p",{style:{lineHeight:"1.4",margin:"-4px 0 0 0",fontSize:"small"},children:y})})]}),Ae.jsxs("div",{style:{display:"flex",flexDirection:se?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[Ae.jsxs("div",{style:{flex:"3"},children:[Ae.jsx("h4",{children:"Feature definition"}),Ae.jsx("div",{style:{backgroundColor:re.backgroundColor},children:Ae.jsx(iv,{theme:j,width:"100%",height:"500px",language:"yaml",value:u,options:{minimap:{enabled:!1},lineNumbers:"off"},beforeMount:uv,onChange:R=>{R&&l(R)}})})]}),Ae.jsxs("div",{style:{flex:"2"},children:[Ae.jsxs("div",{children:[Ae.jsx("h4",{children:"Flag key"}),Ae.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...re},name:"flag-key",list:"flag-keys",value:s,onChange:R=>o(R.target.value)}),Ae.jsx("datalist",{id:"flag-keys",children:U.map((R,z)=>Ae.jsx("option",{value:R},z))})]}),Ae.jsxs("div",{children:[Ae.jsx("h4",{children:"Return type"}),Ae.jsxs("select",{style:{width:"100%",padding:"8px 0 8px 0",...re},value:c,onChange:R=>d(R.target.value),children:[Ae.jsx("option",{value:"boolean",children:"boolean"}),Ae.jsx("option",{value:"string",children:"string"}),Ae.jsx("option",{value:"number",children:"number"}),Ae.jsx("option",{value:"object",children:"object"})]})]}),Ae.jsxs("div",{children:[Ae.jsx("h4",{children:"Evaluation context"}),Ae.jsx("div",{style:{backgroundColor:re.backgroundColor},children:Ae.jsx(iv,{theme:j,width:"100%",height:"80px",language:"yaml",options:{minimap:{enabled:!1},lineNumbers:"off",folding:!1},beforeMount:uv,value:p,onChange:R=>{R&&m(R)}})})]}),Ae.jsxs("div",{style:{display:"flex",gap:"8px",paddingTop:"8px"},children:[Ae.jsx("button",{className:"md-button md-button--primary",onClick:ne,disabled:!g||!_,children:"Evaluate"}),Ae.jsx("button",{className:"md-button",onClick:X,children:"Reset"}),Ae.jsx("button",{className:"md-button",onClick:de,disabled:!g||!_,children:"Share"})]}),Ae.jsxs("div",{className:`output ${v?"visible":""} admonition ${$==="success"?"success":"failure"}`,children:[Ae.jsx("p",{className:"admonition-title",children:$==="success"?"Success":"Failure"}),typeof P=="object"?Ae.jsx("div",{style:{margin:"0.6rem 0 0.6rem 0"},children:Object.entries(P).map(([R,z])=>Ae.jsxs("div",{children:[Ae.jsxs("strong",{children:[R,":"]})," ",JSON.stringify(z)]},R))}):Ae.jsx("p",{children:P})]}),b&&Ae.jsx("h4",{className:"admonition-title",style:{paddingLeft:"45px",borderLeftWidth:"0rem",borderLeftStyle:"solid",left:"15px"},children:"URL copied to clipboard"})]})]})]})]})}r_.createRoot(document.getElementById("playground")).render(Ae.jsx(Fr.StrictMode,{children:Ae.jsx(DO,{})})); diff --git a/playground-app/package-lock.json b/playground-app/package-lock.json index 8000c9cb8..f0f894e08 100644 --- a/playground-app/package-lock.json +++ b/playground-app/package-lock.json @@ -10,11 +10,13 @@ "dependencies": { "@monaco-editor/react": "^4.7.0-rc.0", "@openfeature/flagd-core": "^1.0.0", + "js-yaml": "^4.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-use": "^17.6.0" }, "devDependencies": { + "@types/js-yaml": "^4.0.9", "@types/react": "^19.0.3", "@types/react-dom": "^19.0.2", "@typescript-eslint/eslint-plugin": "^8.19.1", @@ -1395,6 +1397,13 @@ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1693,8 +1702,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -2501,10 +2509,10 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, diff --git a/playground-app/package.json b/playground-app/package.json index 23f8f2744..6a41d8c94 100644 --- a/playground-app/package.json +++ b/playground-app/package.json @@ -12,11 +12,13 @@ "dependencies": { "@monaco-editor/react": "^4.7.0-rc.0", "@openfeature/flagd-core": "^1.0.0", + "js-yaml": "^4.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-use": "^17.6.0" }, "devDependencies": { + "@types/js-yaml": "^4.0.9", "@types/react": "^19.0.3", "@types/react-dom": "^19.0.2", "@typescript-eslint/eslint-plugin": "^8.19.1", diff --git a/playground-app/src/App.tsx b/playground-app/src/App.tsx index 72d29cbfa..83367a1bf 100644 --- a/playground-app/src/App.tsx +++ b/playground-app/src/App.tsx @@ -3,7 +3,7 @@ import { useMedia } from "react-use"; import { FlagdCore, MemoryStorage } from "@openfeature/flagd-core"; import { ScenarioName, scenarios } from "./scenarios"; import type { FlagValueType } from "@openfeature/core"; -import { getString, isValidJson } from "./utils"; +import { getString, isValidYaml, yamlToCompactJson } from "./utils"; import { BeforeMount, Editor } from "@monaco-editor/react"; import { Observable } from "react-use/lib/useObservable"; @@ -44,11 +44,6 @@ const monacoBeforeMount: BeforeMount = (monaco) => { }); }; -function shortenJson(formattedString: string) { - const object = JSON.parse(formattedString); - return JSON.stringify(object); -}; - function formatJson(shortenedString: string) { const object = JSON.parse(shortenedString); return JSON.stringify(object, null, 2); @@ -109,9 +104,10 @@ function App() { ); useEffect(() => { - if (isValidJson(featureDefinition)) { + if (isValidYaml(featureDefinition)) { try { - flagdCore.setConfigurations(featureDefinition); + const jsonConfig = yamlToCompactJson(featureDefinition); + flagdCore.setConfigurations(jsonConfig); setAutocompleteFlagKeys(Array.from(flagdCore.getFlags().keys())); setValidFeatureDefinition(true); } catch (err) { @@ -241,8 +237,8 @@ function App() { const copyUrl = () => { const baseUrl = window.location.origin + window.location.pathname; const newUrl = new URL(baseUrl) - const encodedFeatureDefinition = shortenJson(featureDefinition); - const encodedEvaluationContext = shortenJson(evaluationContext); + const encodedFeatureDefinition = yamlToCompactJson(featureDefinition); + const encodedEvaluationContext = yamlToCompactJson(evaluationContext); if (Object.keys(scenarios).includes(selectedTemplate) && scenarios[selectedTemplate].flagDefinition === featureDefinition) { @@ -351,7 +347,7 @@ function App() { theme={editorTheme} width="100%" height="500px" - language="json" + language="yaml" value={featureDefinition} options={{ minimap: { enabled: false }, @@ -416,7 +412,7 @@ function App() { theme={editorTheme} width="100%" height="80px" - language="json" + language="yaml" options={{ minimap: { enabled: false }, lineNumbers: "off", diff --git a/playground-app/src/utils.ts b/playground-app/src/utils.ts index 305b50158..d20db84f6 100644 --- a/playground-app/src/utils.ts +++ b/playground-app/src/utils.ts @@ -1,5 +1,6 @@ import { FeatureDefinition } from "./types"; import type { EvaluationContext } from "@openfeature/core"; +import yaml from "js-yaml"; const schemaMixin = { $schema: "https://flagd.dev/schema/v0/flags.json", @@ -29,9 +30,18 @@ export function getString(input: string | (() => string)): string { return input; } -export function isValidJson(input: string) { +export function parseYaml(input: string): unknown { + return yaml.load(input); +} + +export function yamlToCompactJson(input: string): string { + const parsed = parseYaml(input); + return JSON.stringify(parsed); +} + +export function isValidYaml(input: string): boolean { try { - JSON.parse(input); + parseYaml(input); return true; } catch { return false; From 7e0762b921ea70bed7915bcaab50e450e0a51158 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 15:26:30 -0500 Subject: [PATCH 08/97] fix(security): update module golang.org/x/crypto to v0.45.0 [security] (#1826) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto) | [`v0.39.0` -> `v0.45.0`](https://cs.opensource.google/go/x/crypto/+/refs/tags/v0.39.0...refs/tags/v0.45.0) | ![age](https://developer.mend.io/api/mc/badges/age/go/golang.org%2fx%2fcrypto/v0.45.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/golang.org%2fx%2fcrypto/v0.39.0/v0.45.0?slim=true) | ### GitHub Vulnerability Alerts #### [CVE-2025-58181](https://nvd.nist.gov/vuln/detail/CVE-2025-58181) SSH servers parsing GSSAPI authentication requests do not validate the number of mechanisms specified in the request, allowing an attacker to cause unbounded memory consumption. #### [CVE-2025-47914](https://nvd.nist.gov/vuln/detail/CVE-2025-47914) SSH Agent servers do not validate the size of messages when processing new identity requests, which may cause the program to panic if the message is malformed due to an out of bounds read. --- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled because a matching PR was automerged previously. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). --------- Signed-off-by: Todd Baert Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- core/go.mod | 9 ++++---- core/go.sum | 18 ++------------- flagd-proxy/go.mod | 12 +++++----- flagd-proxy/go.sum | 45 ++++++++++++++++++++++++++----------- flagd/go.mod | 22 +++++++++---------- flagd/go.sum | 55 ++++++++++++++++++++-------------------------- 6 files changed, 78 insertions(+), 83 deletions(-) diff --git a/core/go.mod b/core/go.mod index 72e5fb039..2a3c63ee2 100644 --- a/core/go.mod +++ b/core/go.mod @@ -31,8 +31,6 @@ require ( go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 gocloud.dev v0.42.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 golang.org/x/crypto v0.45.0 golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac golang.org/x/mod v0.29.0 @@ -158,9 +156,10 @@ require ( go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/core/go.sum b/core/go.sum index bc52d9876..82084e2ea 100644 --- a/core/go.sum +++ b/core/go.sum @@ -396,8 +396,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -412,8 +410,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -431,8 +427,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -447,8 +441,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -464,8 +456,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -474,8 +464,6 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -485,8 +473,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= @@ -503,8 +489,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index e06df3224..a5c122752 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -17,8 +17,8 @@ require ( go.opentelemetry.io/otel/metric v1.37.0 go.opentelemetry.io/otel/sdk/metric v1.37.0 go.uber.org/zap v1.27.0 - golang.org/x/net v0.41.0 - golang.org/x/sync v0.15.0 + golang.org/x/net v0.47.0 + golang.org/x/sync v0.18.0 google.golang.org/grpc v1.73.0 ) @@ -133,12 +133,12 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect - golang.org/x/crypto v0.39.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.26.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index e22f6d528..91515e5a4 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -16,12 +16,15 @@ cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQ cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0= cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= @@ -29,9 +32,11 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= @@ -39,6 +44,7 @@ github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW github.com/Azure/go-autorest/autorest/to v0.4.1 h1:CxNHBqdzTr7rLtdrtb5CMjJcDut+WNGCVv7OmS5+lTc= github.com/Azure/go-autorest/autorest/to v0.4.1/go.mod h1:EtaofgU4zmtvn1zT2ARsjRFdq9vXx0YWtmElwL+GZ9M= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -47,6 +53,7 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= @@ -107,6 +114,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= @@ -124,6 +132,7 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= +github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= @@ -194,6 +203,7 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -217,6 +227,7 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= @@ -244,7 +255,9 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= github.com/open-feature/flagd/core v0.11.8 h1:84uDdSzhtVNBnsjuAnBqBXbFwXC2CQ6aO5cNNKKM7uc= @@ -272,6 +285,7 @@ github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGI github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= @@ -297,6 +311,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -328,11 +343,13 @@ go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPx go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= @@ -344,6 +361,7 @@ go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXe go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= +go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= @@ -356,8 +374,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= @@ -385,8 +403,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= @@ -399,8 +417,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -417,16 +435,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -434,8 +452,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -450,7 +468,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/flagd/go.mod b/flagd/go.mod index 94a9578dc..07ba7450c 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -12,7 +12,7 @@ require ( github.com/dimiro1/banner v1.1.0 github.com/gorilla/mux v1.8.1 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.11.8 + github.com/open-feature/flagd/core v0.12.1 github.com/prometheus/client_golang v1.22.0 github.com/rs/cors v1.11.1 github.com/rs/xid v1.6.0 @@ -27,8 +27,8 @@ require ( go.opentelemetry.io/otel/trace v1.37.0 go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 - golang.org/x/net v0.41.0 - golang.org/x/sync v0.15.0 + golang.org/x/net v0.47.0 + golang.org/x/sync v0.18.0 google.golang.org/grpc v1.73.0 google.golang.org/protobuf v1.36.6 ) @@ -107,13 +107,11 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-memdb v1.3.5 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -133,7 +131,6 @@ require ( github.com/robfig/cron v1.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect @@ -145,6 +142,7 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zeebo/errs v1.4.0 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect @@ -157,13 +155,13 @@ require ( go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect - golang.org/x/crypto v0.39.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/mod v0.25.0 // indirect + golang.org/x/mod v0.29.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.26.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index a9ac28d91..627c5bf0d 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -128,8 +128,6 @@ github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1 github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -233,16 +231,6 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= -github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -259,6 +247,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -287,7 +277,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= -github.com/open-feature/flagd/core v0.11.8/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/flagd/core v0.12.1 h1:fCBenpE0/m/l1KiU6gjM59FUQPnqeuxnO9D4v3UDqu4= +github.com/open-feature/flagd/core v0.12.1/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -324,8 +315,6 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -367,8 +356,12 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= @@ -417,8 +410,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= @@ -431,8 +424,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -448,8 +441,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= @@ -462,8 +455,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -480,16 +473,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -497,8 +490,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -513,8 +506,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 814a6aca1ebac04ff9fe570767d91ed95741643b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 23:11:08 -0500 Subject: [PATCH 09/97] chore: release main (#1699) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.13.0 ## [0.13.0](https://github.com/open-feature/flagd/compare/flagd/v0.12.9...flagd/v0.13.0) (2025-12-23) ### 🐛 Bug Fixes * fixing sync return format missing flag layer, adding full e2e suite ([#1827](https://github.com/open-feature/flagd/issues/1827)) ([570693d](https://github.com/open-feature/flagd/commit/570693d9e7b3200c0865e7ebb3b467ccfc38bb88)) * **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) * **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158)) ### ✨ New Features * add support for http-based ofrep metrics ([#1803](https://github.com/open-feature/flagd/issues/1803)) ([fcd19b3](https://github.com/open-feature/flagd/commit/fcd19b310b319c9837b41c19d6f082ac750cb81d)) * cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) ([aa504f7](https://github.com/open-feature/flagd/commit/aa504f7077093746f886248a4766d9ae5587bf3d)) * enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) ([97c6ffa](https://github.com/open-feature/flagd/commit/97c6ffaf2b51765ccd6aaec38c2902ed2ac8f5f3)) * multi-project support via selectors and flagSetId namespacing ([#1702](https://github.com/open-feature/flagd/issues/1702)) ([f9ce46f](https://github.com/open-feature/flagd/commit/f9ce46f1032e7cb423e0e5c75a7c02f91ab5a88f)) * normalize selector in sync (use header as in OFREP and RPC) ([#1815](https://github.com/open-feature/flagd/issues/1815)) ([c1f06cb](https://github.com/open-feature/flagd/commit/c1f06cb00fc5425d6ee73d6cfca314e9711913df)) ### 🧹 Chore * **refactor:** use memdb for flag storage ([#1697](https://github.com/open-feature/flagd/issues/1697)) ([5c5c1cf](https://github.com/open-feature/flagd/commit/5c5c1cfe84890c4cdd74c9b82504fd2632965221)) ### 🔄 Refactoring * store cleanup ([#1705](https://github.com/open-feature/flagd/issues/1705)) ([bcff8d7](https://github.com/open-feature/flagd/commit/bcff8d757b6d0ca69bccee26ba41880bdf2b5040))
flagd-proxy: 0.8.1 ## [0.8.1](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.0...flagd-proxy/v0.8.1) (2025-12-23) ### 🐛 Bug Fixes * **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) * **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158))
core: 0.13.0 ## [0.13.0](https://github.com/open-feature/flagd/compare/core/v0.12.1...core/v0.13.0) (2025-12-23) ### ⚠ BREAKING CHANGES * enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) * cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) * removes the `fractionalEvaluation` operator since it has been replaced with `fractional`. ([#1704](https://github.com/open-feature/flagd/issues/1704)) ### 🐛 Bug Fixes * **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) * **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1825](https://github.com/open-feature/flagd/issues/1825)) ([44edcc9](https://github.com/open-feature/flagd/commit/44edcc97e9fc11af721527cc3d30ab491ddea44e)) * **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158)) ### ✨ New Features * Add OAuth support for HTTP Sync ([#1791](https://github.com/open-feature/flagd/issues/1791)) ([268fd75](https://github.com/open-feature/flagd/commit/268fd75039588f285913bf100d9972d26c2003a6)) * Add OTEL default variables ([#1812](https://github.com/open-feature/flagd/issues/1812)) ([c2e3fc6](https://github.com/open-feature/flagd/commit/c2e3fc62e06faf870db74e1a26b141075e6fbaa4)) * allow null flagSetId Selector, restrict Selector to single key-value-pairs ([#1708](https://github.com/open-feature/flagd/issues/1708)) ([#1811](https://github.com/open-feature/flagd/issues/1811)) ([c12a0ae](https://github.com/open-feature/flagd/commit/c12a0ae01e2991a8365192a5cebf8cc11ff8bcd1)) * change jsonschema parser ([#1794](https://github.com/open-feature/flagd/issues/1794)) ([bf3f722](https://github.com/open-feature/flagd/commit/bf3f7220227428715422ea9f2311e6bd5f46ed97)) * cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) ([aa504f7](https://github.com/open-feature/flagd/commit/aa504f7077093746f886248a4766d9ae5587bf3d)) * enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) ([97c6ffa](https://github.com/open-feature/flagd/commit/97c6ffaf2b51765ccd6aaec38c2902ed2ac8f5f3)) * multi-project support via selectors and flagSetId namespacing ([#1702](https://github.com/open-feature/flagd/issues/1702)) ([f9ce46f](https://github.com/open-feature/flagd/commit/f9ce46f1032e7cb423e0e5c75a7c02f91ab5a88f)) ### 🧹 Chore * **refactor:** use memdb for flag storage ([#1697](https://github.com/open-feature/flagd/issues/1697)) ([5c5c1cf](https://github.com/open-feature/flagd/commit/5c5c1cfe84890c4cdd74c9b82504fd2632965221)) * removes the `fractionalEvaluation` operator since it has been replaced with `fractional`. ([#1704](https://github.com/open-feature/flagd/issues/1704)) ([3228ad8](https://github.com/open-feature/flagd/commit/3228ad895117ed179325f80d3b0b318f575a4584)) ### 🔄 Refactoring * remove deprecated bearerToken option ([#1816](https://github.com/open-feature/flagd/issues/1816)) ([efda06a](https://github.com/open-feature/flagd/commit/efda06aa6d4cd7472a7f2f64fe69b7ce8d9fcbd1)) * removed unused Selector from Flag and Store. ([#1747](https://github.com/open-feature/flagd/issues/1747)) ([1083005](https://github.com/open-feature/flagd/commit/108300529241de7221f4f143c60ecd62991b5c63)) * store cleanup ([#1705](https://github.com/open-feature/flagd/issues/1705)) ([bcff8d7](https://github.com/open-feature/flagd/commit/bcff8d757b6d0ca69bccee26ba41880bdf2b5040))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Todd Baert Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 39 +++++++++++++++++++++++++++++++++++ flagd-proxy/CHANGELOG.md | 8 +++++++ flagd/CHANGELOG.md | 28 +++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b4ecc9e02..0f415179a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.12.9", - "flagd-proxy": "0.8.0", - "core": "0.12.1" + "flagd": "0.13.0", + "flagd-proxy": "0.8.1", + "core": "0.13.0" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 7fdbed322..62a051bf0 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,44 @@ # Changelog +## [0.13.0](https://github.com/open-feature/flagd/compare/core/v0.12.1...core/v0.13.0) (2025-12-23) + + +### ⚠ BREAKING CHANGES + +* enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) +* cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) +* removes the `fractionalEvaluation` operator since it has been replaced with `fractional`. ([#1704](https://github.com/open-feature/flagd/issues/1704)) + +### 🐛 Bug Fixes + +* **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) +* **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1825](https://github.com/open-feature/flagd/issues/1825)) ([44edcc9](https://github.com/open-feature/flagd/commit/44edcc97e9fc11af721527cc3d30ab491ddea44e)) +* **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158)) + + +### ✨ New Features + +* Add OAuth support for HTTP Sync ([#1791](https://github.com/open-feature/flagd/issues/1791)) ([268fd75](https://github.com/open-feature/flagd/commit/268fd75039588f285913bf100d9972d26c2003a6)) +* Add OTEL default variables ([#1812](https://github.com/open-feature/flagd/issues/1812)) ([c2e3fc6](https://github.com/open-feature/flagd/commit/c2e3fc62e06faf870db74e1a26b141075e6fbaa4)) +* allow null flagSetId Selector, restrict Selector to single key-value-pairs ([#1708](https://github.com/open-feature/flagd/issues/1708)) ([#1811](https://github.com/open-feature/flagd/issues/1811)) ([c12a0ae](https://github.com/open-feature/flagd/commit/c12a0ae01e2991a8365192a5cebf8cc11ff8bcd1)) +* change jsonschema parser ([#1794](https://github.com/open-feature/flagd/issues/1794)) ([bf3f722](https://github.com/open-feature/flagd/commit/bf3f7220227428715422ea9f2311e6bd5f46ed97)) +* cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) ([aa504f7](https://github.com/open-feature/flagd/commit/aa504f7077093746f886248a4766d9ae5587bf3d)) +* enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) ([97c6ffa](https://github.com/open-feature/flagd/commit/97c6ffaf2b51765ccd6aaec38c2902ed2ac8f5f3)) +* multi-project support via selectors and flagSetId namespacing ([#1702](https://github.com/open-feature/flagd/issues/1702)) ([f9ce46f](https://github.com/open-feature/flagd/commit/f9ce46f1032e7cb423e0e5c75a7c02f91ab5a88f)) + + +### 🧹 Chore + +* **refactor:** use memdb for flag storage ([#1697](https://github.com/open-feature/flagd/issues/1697)) ([5c5c1cf](https://github.com/open-feature/flagd/commit/5c5c1cfe84890c4cdd74c9b82504fd2632965221)) +* removes the `fractionalEvaluation` operator since it has been replaced with `fractional`. ([#1704](https://github.com/open-feature/flagd/issues/1704)) ([3228ad8](https://github.com/open-feature/flagd/commit/3228ad895117ed179325f80d3b0b318f575a4584)) + + +### 🔄 Refactoring + +* remove deprecated bearerToken option ([#1816](https://github.com/open-feature/flagd/issues/1816)) ([efda06a](https://github.com/open-feature/flagd/commit/efda06aa6d4cd7472a7f2f64fe69b7ce8d9fcbd1)) +* removed unused Selector from Flag and Store. ([#1747](https://github.com/open-feature/flagd/issues/1747)) ([1083005](https://github.com/open-feature/flagd/commit/108300529241de7221f4f143c60ecd62991b5c63)) +* store cleanup ([#1705](https://github.com/open-feature/flagd/issues/1705)) ([bcff8d7](https://github.com/open-feature/flagd/commit/bcff8d757b6d0ca69bccee26ba41880bdf2b5040)) + ## [0.12.1](https://github.com/open-feature/flagd/compare/core/v0.12.0...core/v0.12.1) (2025-07-28) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 6c625a31c..2c87edabd 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.8.1](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.0...flagd-proxy/v0.8.1) (2025-12-23) + + +### 🐛 Bug Fixes + +* **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) +* **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158)) + ## [0.8.0](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.7.6...flagd-proxy/v0.8.0) (2025-07-21) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 5d51a4ff1..14cb293ae 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## [0.13.0](https://github.com/open-feature/flagd/compare/flagd/v0.12.9...flagd/v0.13.0) (2025-12-23) + + +### 🐛 Bug Fixes + +* fixing sync return format missing flag layer, adding full e2e suite ([#1827](https://github.com/open-feature/flagd/issues/1827)) ([570693d](https://github.com/open-feature/flagd/commit/570693d9e7b3200c0865e7ebb3b467ccfc38bb88)) +* **security:** update module github.com/go-viper/mapstructure/v2 to v2.4.0 [security] ([#1784](https://github.com/open-feature/flagd/issues/1784)) ([037e30b](https://github.com/open-feature/flagd/commit/037e30b2f87897499580b25497049b88da7e386c)) +* **security:** update module golang.org/x/crypto to v0.45.0 [security] ([#1826](https://github.com/open-feature/flagd/issues/1826)) ([7e0762b](https://github.com/open-feature/flagd/commit/7e0762b921ea70bed7915bcaab50e450e0a51158)) + + +### ✨ New Features + +* add support for http-based ofrep metrics ([#1803](https://github.com/open-feature/flagd/issues/1803)) ([fcd19b3](https://github.com/open-feature/flagd/commit/fcd19b310b319c9837b41c19d6f082ac750cb81d)) +* cleanup evaluator interface ([#1793](https://github.com/open-feature/flagd/issues/1793)) ([aa504f7](https://github.com/open-feature/flagd/commit/aa504f7077093746f886248a4766d9ae5587bf3d)) +* enable parsing of array flag configurations for flagd ([#1797](https://github.com/open-feature/flagd/issues/1797)) ([97c6ffa](https://github.com/open-feature/flagd/commit/97c6ffaf2b51765ccd6aaec38c2902ed2ac8f5f3)) +* multi-project support via selectors and flagSetId namespacing ([#1702](https://github.com/open-feature/flagd/issues/1702)) ([f9ce46f](https://github.com/open-feature/flagd/commit/f9ce46f1032e7cb423e0e5c75a7c02f91ab5a88f)) +* normalize selector in sync (use header as in OFREP and RPC) ([#1815](https://github.com/open-feature/flagd/issues/1815)) ([c1f06cb](https://github.com/open-feature/flagd/commit/c1f06cb00fc5425d6ee73d6cfca314e9711913df)) + + +### 🧹 Chore + +* **refactor:** use memdb for flag storage ([#1697](https://github.com/open-feature/flagd/issues/1697)) ([5c5c1cf](https://github.com/open-feature/flagd/commit/5c5c1cfe84890c4cdd74c9b82504fd2632965221)) + + +### 🔄 Refactoring + +* store cleanup ([#1705](https://github.com/open-feature/flagd/issues/1705)) ([bcff8d7](https://github.com/open-feature/flagd/commit/bcff8d757b6d0ca69bccee26ba41880bdf2b5040)) + ## [0.12.9](https://github.com/open-feature/flagd/compare/flagd/v0.12.8...flagd/v0.12.9) (2025-07-28) From 87183f5e053570b4470c6a47da5d6e7a7312d11e Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 23 Dec 2025 23:11:50 -0500 Subject: [PATCH 10/97] docs: add docs for selector, metadata (#1829) This PR: - adds documentation for our new selector and metadata features, added mostly in https://github.com/open-feature/flagd/pull/1702 - conceptual docs - practical usage docs - additions to troubleshooting - migration guide Fixes: https://github.com/open-feature/flagd/issues/1828 --------- Signed-off-by: Todd Baert Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Guido Breitenhuber --- docs/concepts/metadata.md | 215 +++++++++++++++++++++ docs/concepts/selectors.md | 196 +++++++++++++++++++ docs/guides/migrating-to-flag-sets.md | 150 ++++++++++++++ docs/reference/selector-syntax.md | 191 ++++++++++++++++++ docs/reference/specifications/providers.md | 141 +++++++++++--- docs/reference/sync-configuration.md | 48 +++-- docs/troubleshooting.md | 42 ++++ mkdocs.yml | 5 + 8 files changed, 952 insertions(+), 36 deletions(-) create mode 100644 docs/concepts/metadata.md create mode 100644 docs/concepts/selectors.md create mode 100644 docs/guides/migrating-to-flag-sets.md create mode 100644 docs/reference/selector-syntax.md diff --git a/docs/concepts/metadata.md b/docs/concepts/metadata.md new file mode 100644 index 000000000..f7837163a --- /dev/null +++ b/docs/concepts/metadata.md @@ -0,0 +1,215 @@ +# Metadata + +Metadata in flagd provides contextual information about flags and flag sets. +It enables rich observability, logical separation, and debugging capabilities. + +## Overview + +Flagd supports metadata at two levels: + +- **Flag Set-Level Metadata**: Applied to entire flag configurations +- **Flag-Level Metadata**: Applied to individual flags + +## Metadata Inheritance + +Flagd uses a hierarchical metadata system where flags inherit metadata from their containing flag set, with the ability to override specific values at the flag level. + +### Flag Set-Level Metadata + +The most common pattern is defining metadata at the configuration level, where all flags inherit it: + +```json +{ + "metadata": { + "flagSetId": "payment-service", + "team": "payments", + "version": "v1.2.0", + "environment": "production" + }, + "flags": { + "checkout-flow": { + "state": "ENABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "on" + // Inherits all set-level metadata + }, + "payment-gateway": { + "state": "DISABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "off" + // Also inherits all set-level metadata + } + } +} +``` + +### Flag-Level Overrides + +Individual flags can override inherited metadata or add flag-specific metadata: + +```json +{ + "metadata": { + "flagSetId": "payment-service", + "team": "payments", + "version": "v1.2.0" + }, + "flags": { + "standard-feature": { + "state": "ENABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "on" + // Inherits: flagSetId="payment-service", team="payments", version="v1.2.0" + }, + "experimental-feature": { + "state": "DISABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "off", + "metadata": { + // Still inherits: flagSetId="payment-service", version="v1.2.0" + "team": "marketing", // Override: different flag set + "owner": "Tom", // Addition: flag-specific metadata + "experimental": true // Addition: flag-specific metadata + } + } + } +} +``` + +### Inheritance Behavior + +1. **Default Inheritance**: Flags inherit all set-level metadata +2. **Selective Override**: Flag-level metadata overrides specific inherited values +3. **Additive Enhancement**: Flag-level metadata can add new keys not present at set level +4. **Preserved Inheritance**: Non-overridden set-level metadata remains inherited + +## Metadata Reflection + +Metadata reflection provides transparency by echoing selector and configuration information back in API responses. This enables debugging, auditing, and verification of flag targeting. + +### Selector Reflection + +When making requests with selectors, flagd "reflects" the parsed selector information in the "top-level" `metadata` field: + +**Request:** + +```bash +curl -H "Flagd-Selector: flagSetId=payment-service" \ + http://localhost:8014/ofrep/v1/evaluate/flags +``` + +**Response includes reflected metadata:** + +```json +{ + "flags": { + "checkout-flow": { + "key": "checkout-flow", + "value": true, + "variant": "on", + "metadata": { + "flagSetId": "payment-service", + "team": "payments" + } + } + }, + "metadata": { + "flagSetId": "payment-service" // Reflected from selector + } +} +``` + +### Configuration Reflection + +Flag evaluation responses include the complete merged metadata for each flag: + +```json +{ + "key": "experimental-feature", + "value": false, + "variant": "off", + "metadata": { + "flagSetId": "experiments", // Overridden at flag level + "owner": "research-team", // Added at flag level + "experimental": true, // Added at flag level + "team": "payments", // Inherited from set level + "version": "v1.2.0" // Inherited from set level + } +} +``` + +## Common Metadata Fields + +### Standard Fields + +Some metadata fields are defined in the flag-definition schema for common use-cases: + +- **`flagSetId`**: Logical grouping identifier for selectors +- **`version`**: Configuration or flag version + +### Custom Fields + +You can define any custom metadata fields relevant to your use case: + +```json +{ + "metadata": { + "flagSetId": "user-service", + "version": "v34", + "costCenter": "engineering", + "compliance": "pci-dss", + "lastReviewed": "2024-01-15", + "approver": "team-lead" + } +} +``` + +## Retrieving Metadata in the OpenFeature SDK + +Flag metadata is available in evaluation details returned by flag evaluations. + +### Go + +```go +details, err := client.BooleanValueDetails(ctx, "new-checkout-flow", false, evalCtx) + +// Access metadata from evaluation details +metadata := details.FlagMetadata +flagSetId := metadata["flagSetId"] +team := metadata["team"] +``` + +### Java + +```java +FlagEvaluationDetails details = client.getBooleanDetails( + "new-checkout-flow", false, new ImmutableContext()); + +// Access metadata from evaluation details +ImmutableMetadata metadata = details.getFlagMetadata(); +String flagSetId = metadata.getString("flagSetId"); +String team = metadata.getString("team"); +``` + +### JavaScript + +```javascript +const details = await client.getBooleanDetails('new-checkout-flow', false, {}); + +// Access metadata from evaluation details +const metadata = details.flagMetadata; +const flagSetId = metadata.flagSetId; +const team = metadata.team; +``` + +## Use Cases + +**Debugging**: Metadata reflection shows which selectors were used and how inheritance resolved, making it easier to troubleshoot flag targeting issues. + +**Governance**: Track team ownership, compliance requirements, and approval workflows through custom metadata fields. + +**Environment Management**: Use metadata for version tracking, environment identification, and change management across deployments. + +**Multi-Tenancy**: Isolate tenants through flag sets and maintain tenant-specific configurations and governance. + +**Observability**: Metadata attributes can be used in telemetry spans and metrics, providing operational visibility into flag usage patterns and configuration context. diff --git a/docs/concepts/selectors.md b/docs/concepts/selectors.md new file mode 100644 index 000000000..988003ab4 --- /dev/null +++ b/docs/concepts/selectors.md @@ -0,0 +1,196 @@ +# Selectors + +Selectors are query expressions that allow you to filter flag configurations from flagd's sync service. They enable providers to request only specific subsets of flags instead of receiving all flags, making flagd more efficient and flexible for complex deployments. + +## Overview + +In flagd, **selectors** provide a way to query flags based on different criteria. This is particularly powerful because flagd decouples **flag sources** from **flag sets**, allowing for more granular control over which flags are synchronized and evaluated. + +### Key Concepts + +- **Flag Source**: Where flag configuration data comes from (file, HTTP endpoint, gRPC service, etc.) +- **Flag Set**: A logical grouping of flags identified by a `flagSetId` +- **Selector**: A query expression that filters flags by source, flag set, or other criteria +- **Flag Set Metadata**: The selector information is "reflected" back in response metadata for transparency + +!!! tip + + The `flagSetId` + `key` combination represents the unique identifier for a flag. + Be sure not to create duplicates, or unexpected behavior may result. + See [Array-Based Flag Definitions](#array-based-flag-definitions) for how this enables flags with the same key to coexist in different flag sets. + +## Source vs Flag Set Decoupling + +### Before: Tight Coupling + +Historically, each source provided exactly one flag set, and providers had to target specific sources: + +```yaml +# Old approach - targeting a specific source +selector: "my-flag-source.json" +``` + +### After: Flexible Flag Sets + +Now, sources and flag sets are decoupled. A single source can contain multiple flag sets, and flag sets can span multiple sources: + +```yaml +# New approach - targeting a logical flag set +selector: "flagSetId=project-42" +``` + +### Array-Based Flag Definitions + +Flags can be defined as an array instead of an object, with each flag specifying its `key` explicitly: + +```json +{ + "flags": [ + { + "key": "checkout-flow", + "state": "ENABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "on", + "metadata": { "flagSetId": "payment-service" } + }, + { + "key": "checkout-flow", + "state": "DISABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "off", + "metadata": { "flagSetId": "user-service" } + } + ] +} +``` + +This format is useful for systems that generate large flag configurations programmatically. It also allows flags with the same key to coexist when they belong to different flag sets, since the `flagSetId` + `key` combination represents the unique identifier for a flag. + +## Flag Set Configuration + +Flag sets are typically configured at the top level of a flag configuration, with all flags in that configuration inheriting the same `flagSetId`. This is the recommended approach for most use cases. + +### Set-Level Configuration + +The most common pattern is to set the `flagSetId` at the configuration level, where all flags inherit it: + +```json +{ + "metadata": { + "flagSetId": "payment-service", + "version": "v1.2.0" + }, + "flags": { + "new-checkout-flow": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "on" + }, + "bill-buddy-integration": { + "state": "DISABLED", + "variants": { "on": true, "off": false }, + "defaultVariant": "off" + } + } +} +``` + +In this example, both `new-checkout-flow` and `bill-buddy-integration` flags belong to the `payment-service` flag set. + +### Flag-Level Configuration + +Alternatively, the `flagSetId` can be defined on flag level: + +```json +{ + "metadata": { + "version": "v1.2.0" + }, + "flags": { + "new-checkout-flow": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "on", + "metadata": { + "flagSetId": "webshop", + "version": "v1.2.0" + } + }, + "bill-buddy-integration": { + "state": "DISABLED", + "variants": { "on": true, "off": false }, + "defaultVariant": "off", + "metadata": { + "flagSetId": "payment-service", + "version": "v1.2.0" + }, + } + } +} +``` + +In this example the two flags `new-checkout-flow` and `bill-buddy-integration` flags belong to different flag sets. + +### Metadata Integration + +Selectors work closely with flagd's metadata system. For advanced patterns like flag-level overrides of `flagSetId` or complex metadata inheritance, see the [Metadata concepts](metadata.md) section. + +## Metadata Reflection + +When you make a request with a selector, flagd "reflects" the selector information back in the response metadata for transparency and debugging. For complete details on metadata selector reflection, inheritance, and configuration patterns, see the [Metadata concepts](metadata.md) section. + +## Use Cases + +### Multi-Tenant Applications + +```yaml +# Tenant A's flags +selector: "flagSetId=tenant-a" + +# Tenant B's flags +selector: "flagSetId=tenant-b" +``` + +### Component Separation + +```yaml +# Web service +selector: "flagSetId=payment-service" +# Web application +selector: "flagSetId=webshop" +``` + +### Environment Separation + +```yaml +# Development environment +selector: "flagSetId=dev-features" + +# Production environment +selector: "flagSetId=prod-features" +``` + +### Legacy Source-Based Selection + +```yaml +# Still supported for backward compatibility +selector: "source=legacy-config.json" +``` + +## Best Practices + +1. **Use Flag Sets for Logical Grouping**: Prefer `flagSetId` over `source` for new deployments +2. **Plan Your Flag Set Strategy**: Design flag sets around logical boundaries (teams, features, environments) +3. **Leverage Metadata**: Use metadata for debugging and auditing +4. **Document Your Schema**: Clearly document your flag set naming conventions for your team +5. **Do Not Duplicate Flags Across Sources**: Make sure that flags with the same key and flagSetId do not exist in multiple sources (relative priority of flags in such configurations is not defined). + +## Migration Considerations + +The selector enhancement maintains full backward compatibility. See the [migration guide](../guides/migrating-to-flag-sets.md) for detailed guidance on transitioning from source-based to flag-set-based selection patterns. diff --git a/docs/guides/migrating-to-flag-sets.md b/docs/guides/migrating-to-flag-sets.md new file mode 100644 index 000000000..90ec10a67 --- /dev/null +++ b/docs/guides/migrating-to-flag-sets.md @@ -0,0 +1,150 @@ +# Migrating to Flag Sets + +This guide helps you transition from source-based selector patterns to flag-set-based patterns, taking advantage of flagd's enhanced selector capabilities while maintaining backward compatibility. + +## Understanding the Change + +### Before: Source-Based Selection + +In the traditional approach, providers targeted specific sources: + +```yaml +# Provider configuration targeting a source file +selector: "config/my-flags.json" +``` + +This created tight coupling between providers and sources: + +- Providers had to know which source contained their flags +- Moving flags between sources required provider reconfiguration +- One source could only serve one logical set of flags + +### After: Flag Set-Based Selection + +With flag sets, providers target logical groupings of flags: + +```yaml +# Provider configuration targeting a flag set +selector: "flagSetId=my-application" +``` + +This provides flexibility: + +- Providers are decoupled from sources +- Sources can contain multiple flag sets +- Flag sets can span multiple sources +- No breaking changes - old selectors still work + +## Migration Process + +### Step 1: Add Flag Set IDs to Configurations + +Add `flagSetId` to your flag configurations at the set level: + +**Before:** + +```json +{ + "flags": { + "feature-a": { + "state": "ENABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "on" + } + } +} +``` + +**After:** + +```json +{ + "metadata": { + "flagSetId": "my-application" + }, + "flags": { + "feature-a": { + "state": "ENABLED", + "variants": {"on": true, "off": false}, + "defaultVariant": "on" + } + } +} +``` + +### Step 2: Update Provider Configurations + +Change provider selectors from source-based to flag set-based: + +```java +// Before +new FlagdProvider(FlagdOptions.builder() + .selector("config/app-flags.json").build()); + +// After +new FlagdProvider(FlagdOptions.builder() + .selector("flagSetId=my-application").build()); +``` + +### Step 3: Verify Migration + +Test that selectors work correctly and check metadata reflection: + +```bash +curl -H "Flagd-Selector: flagSetId=my-application" \ + http://localhost:8014/ofrep/v1/evaluate/flags +``` + +## Flag Set Organization Patterns + +**By Application/Service:** + +```yaml +flagSetId: "user-service" # All user-related flags +flagSetId: "payment-service" # All payment-related flags +``` + +**By Environment:** + +```yaml +flagSetId: "development" # Dev-specific flags +flagSetId: "production" # Production flags +``` + +**By Team:** + +```yaml +flagSetId: "frontend-team" # Frontend features +flagSetId: "backend-team" # Backend features +``` + +Choose the pattern that best matches your deployment and organizational structure. + +## Common Issues + +**No flags returned**: Check that `flagSetId` in selector matches flag configuration exactly + +**Wrong flags returned**: Look for flag-level `flagSetId` overrides or header/body selector conflicts + +**Selector ignored**: Verify selector syntax is correct (`flagSetId=value`, not `flagSetId:value`) + +## Best Practices + +- **Group logically**: Organize flags by service, environment, or team +- **Name consistently**: Use clear, descriptive flag set names +- **Test first**: Validate migration in non-production environments +- **Use metadata reflection**: Check reflected metadata for debugging + +## FAQ + +**Q: Do I have to migrate?** +A: No, source-based selectors continue to work. Migration is optional but recommended. + +**Q: Can flag sets span multiple sources?** +A: Yes, multiple sources can contribute flags to the same flag set. + +## Additional Resources + +- [Selector Concepts](../concepts/selectors.md) - Understanding selectors and flag sets +- [Selector Syntax Reference](../reference/selector-syntax.md) - Complete syntax documentation +- [ADR: Decouple Flag Source and Set](../architecture-decisions/decouple-flag-source-and-set.md) - Technical decision rationale diff --git a/docs/reference/selector-syntax.md b/docs/reference/selector-syntax.md new file mode 100644 index 000000000..995d649a6 --- /dev/null +++ b/docs/reference/selector-syntax.md @@ -0,0 +1,191 @@ +# Selector Syntax Reference + +This document provides the complete technical specification for flagd selector syntax, including supported operators, precedence rules, and metadata reflection behavior. + +## Syntax Overview + +Selectors use a simple key-value syntax to filter flags. Currently, selectors support single key-value pairs with plans to expand to more complex queries in the future. + +### Basic Syntax + +```text += +``` + +### Backward Compatibility Syntax + +```text + +``` + +When no `=` is present, the value is treated as a source selector for backward compatibility. + +## Supported Keys + +### `flagSetId` + +Selects flags belonging to a specific flag set. + +**Syntax:** + +```text +flagSetId= +``` + +**Examples:** + +```text +flagSetId=project-42 +flagSetId=dev-environment +flagSetId=team-payments +``` + +**Special Case - Empty Flag Set:** + +```text +flagSetId= +``` + +Selects flags that don't belong to any named flag set (equivalent to the "null" flag set). + +### `source` + +Selects flags from a specific source. + +**Syntax:** + +```text +source= +``` + +**Examples:** + +```text +source=config/flags.json +source=http://flag-server/config +source=./local-flags.yaml +``` + +## Selector Precedence + +When selectors are provided in multiple locations, flagd uses the following precedence order (highest to lowest): + +1. **gRPC Metadata**: `Flagd-Selector` header in gRPC metadata +2. **HTTP Header**: `Flagd-Selector` header in HTTP requests +3. **Request Body**: `selector` field in protobuf/JSON request body + +### Example: Header Precedence + +```bash +# gRPC request with both header and body selector +# Header takes precedence +grpcurl -H "Flagd-Selector: flagSetId=production" \ + -d '{"selector": "flagSetId=development"}' \ + localhost:8013 flagd.sync.v1.FlagSyncService/FetchAllFlags + +# Result: Uses "flagSetId=production" from header +``` + +## Metadata Reflection + +Flagd reflects selector information back in response metadata, providing transparency about query execution. For complete details on metadata selector reflection, inheritance patterns, and configuration examples, see the [Metadata concepts](../concepts/metadata.md) section. + +## Examples + +### Flag Set Selection + +```bash +# Select flags from the "payments" flag set +curl -H "Flagd-Selector: flagSetId=payments" \ + http://localhost:8014/ofrep/v1/evaluate/flags +``` + +### Source Selection (Legacy) + +```bash +# Select flags from a specific source (backward compatibility) +curl -H "Flagd-Selector: source=config/prod-flags.json" \ + http://localhost:8014/ofrep/v1/evaluate/flags +``` + +### No Flag Set Selection + +```bash +# Select flags that don't belong to any named flag set +curl -H "Flagd-Selector: flagSetId=" \ + http://localhost:8014/ofrep/v1/evaluate/flags +``` + +### Provider SDK Usage + +#### Go Provider + +```go +import "github.com/open-feature/go-sdk-contrib/providers/flagd" + +provider := flagd.NewProvider( + flagd.WithHost("localhost"), + flagd.WithPort(8013), + flagd.WithSelector("flagSetId=user-service"), +) +``` + +#### Java Provider + +```java +FlagdProvider provider = new FlagdProvider( + FlagdOptions.builder() + .host("localhost") + .port(8013) + .selector("flagSetId=payment-service") + .build() +); +``` + +#### JavaScript Provider + +```javascript +const provider = new FlagdProvider({ + host: 'localhost', + port: 8013, + selector: 'flagSetId=frontend-features' +}); +``` + +## Future Enhancements + +The selector syntax is designed to be extensible. Future versions may support: + +- **Multiple Criteria**: `flagSetId=app1,source=prod` +- **Complex Queries**: `flagSetId=app1 OR flagSetId=app2` +- **Filter Expressions**: `metadata.environment=production` +- **Kubernetes-Style Selectors**: `app=frontend,tier=web` + +> **Note**: The current implementation supports single key-value pairs only. Complex selectors are planned for future releases. + +## API Reference + +### gRPC Services + +**Sync Service:** + +- `SyncFlags(SyncFlagsRequest)`: Supports selector in header and request body +- `FetchAllFlags(FetchAllFlagsRequest)`: Supports selector in header and request body + +**Evaluation Service:** + +- `ResolveBoolean(ResolveBooleanRequest)`: Supports selector in header +- `ResolveString(ResolveStringRequest)`: Supports selector in header +- `ResolveInt(ResolveIntRequest)`: Supports selector in header +- `ResolveFloat(ResolveFloatRequest)`: Supports selector in header +- `ResolveObject(ResolveObjectRequest)`: Supports selector in header +- `ResolveAll(ResolveAllRequest)`: Supports selector in header + +### HTTP/OFREP Services + +**OFREP Endpoints:** + +- `POST /ofrep/v1/evaluate/flags/{key}`: Supports selector in header +- `POST /ofrep/v1/evaluate/flags`: Supports selector in header + +All HTTP endpoints support the `Flagd-Selector` header for selector specification. diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index 18ce9a14a..2d276bda4 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -262,28 +262,28 @@ precedence. Below are the supported configuration parameters (note that not all apply to both resolver modes): -| Option name | Environment variable name | Explanation | Type & Values | Default | Compatible resolver | -| --------------------- | ------------------------------ | ---------------------------------------------------------------------- | ---------------------------- | ----------------------------- | ----------------------- | -| resolver | FLAGD_RESOLVER | mode of operation | String - `rpc`, `in-process` | rpc | rpc & in-process | -| host | FLAGD_HOST | remote host | String | localhost | rpc & in-process | -| port | FLAGD_PORT | remote port | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | -| targetUri | FLAGD_TARGET_URI | alternative to host/port, supporting custom name resolution | string | null | rpc & in-process | -| tls | FLAGD_TLS | connection encryption | boolean | false | rpc & in-process | -| socketPath | FLAGD_SOCKET_PATH | alternative to host port, unix socket | String | null | rpc & in-process | -| certPath | FLAGD_SERVER_CERT_PATH | tls cert path | String | null | rpc & in-process | -| deadlineMs | FLAGD_DEADLINE_MS | deadline for unary calls, and timeout for initialization | int | 500 | rpc & in-process & file | -| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | deadline for streaming calls, useful as an application-layer keepalive | int | 600000 | rpc & in-process | -| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | initial backoff for stream retry | int | 1000 | rpc & in-process | -| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 120000 | rpc & in-process | -| retryGracePeriod | FLAGD_RETRY_GRACE_PERIOD | period in seconds before provider moves from STALE to ERROR state | int | 5 | rpc & in-process & file | -| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | http 2 keepalive | long | 0 | rpc & in-process | -| cache | FLAGD_CACHE | enable cache of static flags | String - `lru`, `disabled` | lru | rpc | -| maxCacheSize | FLAGD_MAX_CACHE_SIZE | max size of static flag cache | int | 1000 | rpc | -| selector | FLAGD_SOURCE_SELECTOR | selects a single sync source to retrieve flags from only that source | string | null | in-process | -| providerId | FLAGD_PROVIDER_ID | A unique identifier for flagd(grpc client) initiating the request. | string | null | in-process | -| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | offline, file-based flag definitions, overrides host/port/targetUri | string | null | file | -| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | poll interval for reading offlineFlagSourcePath | int | 5000 | file | -| contextEnricher | - | sync-metadata to evaluation context mapping function | function | identity function | in-process | +| Option name | Environment variable name | Explanation | Type & Values | Default | Compatible resolver | +| --------------------- | ------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------- | ----------------------------- | ----------------------- | +| resolver | FLAGD_RESOLVER | mode of operation | String - `rpc`, `in-process` | rpc | rpc & in-process | +| host | FLAGD_HOST | remote host | String | localhost | rpc & in-process | +| port | FLAGD_PORT | remote port | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | +| targetUri | FLAGD_TARGET_URI | alternative to host/port, supporting custom name resolution | string | null | rpc & in-process | +| tls | FLAGD_TLS | connection encryption | boolean | false | rpc & in-process | +| socketPath | FLAGD_SOCKET_PATH | alternative to host port, unix socket | String | null | rpc & in-process | +| certPath | FLAGD_SERVER_CERT_PATH | tls cert path | String | null | rpc & in-process | +| deadlineMs | FLAGD_DEADLINE_MS | deadline for unary calls, and timeout for initialization | int | 500 | rpc & in-process & file | +| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | deadline for streaming calls, useful as an application-layer keepalive | int | 600000 | rpc & in-process | +| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | initial backoff for stream retry | int | 1000 | rpc & in-process | +| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 120000 | rpc & in-process | +| retryGracePeriod | FLAGD_RETRY_GRACE_PERIOD | period in seconds before provider moves from STALE to ERROR state | int | 5 | rpc & in-process & file | +| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | http 2 keepalive | long | 0 | rpc & in-process | +| cache | FLAGD_CACHE | enable cache of static flags | String - `lru`, `disabled` | lru | rpc | +| maxCacheSize | FLAGD_MAX_CACHE_SIZE | max size of static flag cache | int | 1000 | rpc | +| selector | FLAGD_SOURCE_SELECTOR | Selector expression to filter flags (e.g., `flagSetId=my-app`, `source=config.json`) | string | null | in-process | +| providerId | FLAGD_PROVIDER_ID | A unique identifier for flagd(grpc client) initiating the request. | string | null | in-process | +| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | offline, file-based flag definitions, overrides host/port/targetUri | string | null | file | +| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | poll interval for reading offlineFlagSourcePath | int | 5000 | file | +| contextEnricher | - | sync-metadata to evaluation context mapping function | function | identity function | in-process | ### Custom Name Resolution @@ -298,8 +298,103 @@ envoy://localhost:9211/flagd-sync.service The custom name resolver provider in this case will use the endpoint name i.e. `flagd-sync.service` as [authority](https://github.com/grpc/grpc-java/blob/master/examples/src/main/java/io/grpc/examples/nameresolve/ExampleNameResolver.java#L55-L61) and connect to `localhost:9211`. -### Metadata +### Selector Configuration + +Providers support selector configuration to filter which flags are synchronized or evaluated. This enables more granular control in multi-tenant or multi-environment deployments. + +#### Selector Syntax + +Providers accept selector expressions using the following syntax: + +- **Flag Set Selection**: `flagSetId=` - Target flags belonging to a specific flag set +- **Source Selection**: `source=` - Target flags from a specific source (legacy) +- **Backward Compatibility**: `` - Treated as source selection + +#### Selector Precedence + +When selectors are provided in multiple locations, the following precedence applies: + +1. **Request Header**: `Flagd-Selector` header (RPC and OFREP requests) +2. **Provider Configuration**: `selector` option in provider constructor + +#### Usage Examples + +**Flag Set-Based Selection (Recommended):** + +```javascript +const provider = new FlagdProvider({ + host: 'localhost', + port: 8013, + selector: 'flagSetId=user-service' +}); +``` + +**Source-Based Selection (Legacy):** + +```javascript +const provider = new FlagdProvider({ + host: 'localhost', + port: 8013, + selector: 'source=config/app-flags.json' +}); +``` + +**Header-Based Selection:** + +```bash +# gRPC request with selector header +grpcurl -H "Flagd-Selector: flagSetId=payment-service" \ + localhost:8013 flagd.evaluation.v1.Service/ResolveBoolean + +# OFREP request with selector header +curl -H "Flagd-Selector: flagSetId=frontend-features" \ + http://localhost:8014/ofrep/v1/evaluate/flags/my-flag +``` + +### Metadata and Metadata Reflection + +#### Flag Metadata When a flag is resolved, the returned [metadata](./flag-definitions.md#metadata) is a merged representation of the metadata defined on the flag set, and on the flag, with the flag metadata taking priority. Flag metadata is returned on a "best effort" basis when flags are resolved: disabled, missing or erroneous flags return the metadata of the associated flag set whenever possible. This is particularly important for debugging purposes and error metrics. + +#### Selector Metadata "Reflection" + +Flagd "reflects" selector information back in response metadata, providing transparency about query execution. This helps with debugging selector expressions and understanding which flags were actually queried. + +**Example - gRPC Response:** + +```protobuf +// Request with selector header: "Flagd-Selector: flagSetId=payment-service" +message ResolveBooleanResponse { + bool value = 1; + string reason = 2; + string variant = 3; + google.protobuf.Struct metadata = 4; // Contains reflected selector info +} +``` + +**Example - OFREP Response:** + +```json +{ + "value": true, + "reason": "TARGETING_MATCH", + "variant": "on", + "metadata": { + "flagSetId": "payment-service", + "team": "payments", + "version": "1.2.0" + } +} +``` + +#### Debugging with Metadata + +Use reflected metadata to: + +- **Verify Selector Parsing**: Confirm your selector was interpreted correctly +- **Debug Empty Results**: Check if selectors are filtering flags as expected +- **Audit Access Patterns**: Log selector metadata for compliance and monitoring +- **Troubleshoot Configuration**: Identify selector precedence issues diff --git a/docs/reference/sync-configuration.md b/docs/reference/sync-configuration.md index a14c09fa9..812b68458 100644 --- a/docs/reference/sync-configuration.md +++ b/docs/reference/sync-configuration.md @@ -47,17 +47,17 @@ The flagd accepts a string argument, which should be a JSON representation of an Alternatively, these configurations can be passed to flagd via config file, specified using the `--config` flag. -| Field | Type | Note | -| ----------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| uri | required `string` | Flag configuration source of the sync | -| provider | required `string` | Provider type - `file`, `fsnotify`, `fileinfo`, `kubernetes`, `http`, `grpc`, `gcs` or `azblob` | -| authHeader | optional `string` | Used for http sync; set this to include the complete `Authorization` header value for any authentication scheme (e.g., "Bearer token_here", "Basic base64_credentials", etc.). | -| interval | optional `uint32` | Used for http, gcs and azblob syncs; requests will be made at this interval. Defaults to 5 seconds. | -| tls | optional `boolean` | Enable/Disable secure TLS connectivity. Currently used only by gRPC sync. Default (ex: if unset) is false, which will use an insecure connection | -| providerID | optional `string` | Value binds to grpc connection's providerID field. gRPC server implementations may use this to identify connecting flagd instance | -| selector | optional `string` | Value binds to grpc connection's selector field. gRPC server implementations may use this to filter flag configurations | -| certPath | optional `string` | Used for grpcs sync when TLS certificate is needed. If not provided, system certificates will be used for TLS connection | -| maxMsgSize | optional `int` | Used for gRPC sync to set max receive message size (in bytes) e.g. 5242880 for 5MB. If not provided, the default is [4MB](https://pkg.go.dev/google.golang.org#grpc#MaxCallRecvMsgSize) | +| Field | Type | Note | +| ---------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| uri | required `string` | Flag configuration source of the sync | +| provider | required `string` | Provider type - `file`, `fsnotify`, `fileinfo`, `kubernetes`, `http`, `grpc`, `gcs` or `azblob` | +| authHeader | optional `string` | Used for http sync; set this to include the complete `Authorization` header value for any authentication scheme (e.g., "Bearer token_here", "Basic base64_credentials", etc.). | +| interval | optional `uint32` | Used for http, gcs and azblob syncs; requests will be made at this interval. Defaults to 5 seconds. | +| tls | optional `boolean` | Enable/Disable secure TLS connectivity. Currently used only by gRPC sync. Default (ex: if unset) is false, which will use an insecure connection | +| providerID | optional `string` | Value binds to grpc connection's providerID field. gRPC server implementations may use this to identify connecting flagd instance | +| selector | optional `string` | Selector expression to filter flag configurations. Supports `source=` and `flagSetId=` syntax. See [selector syntax](selector-syntax.md) for details. | +| certPath | optional `string` | Used for grpcs sync when TLS certificate is needed. If not provided, system certificates will be used for TLS connection | +| maxMsgSize | optional `int` | Used for gRPC sync to set max receive message size (in bytes) e.g. 5242880 for 5MB. If not provided, the default is [4MB](https://pkg.go.dev/google.golang.org#grpc#MaxCallRecvMsgSize) | The `uri` field values **do not** follow the [URI patterns](#uri-patterns). The provider type is instead derived from the `provider` field. Only exception is the remote provider where `http(s)://` is expected by default. Incorrect @@ -100,7 +100,7 @@ Startup command: {"uri":"grpc-source:8080","provider":"grpc"}, {"uri":"my-flag-source:8080","provider":"grpc", "maxMsgSize": 5242880}, {"uri":"envoy://localhost:9211/test.service", "provider":"grpc"}, - {"uri":"my-flag-source:8080","provider":"grpc", "certPath": "/certs/ca.cert", "tls": true, "providerID": "flagd-weatherapp-sidecar", "selector": "source=database,app=weatherapp"}, + {"uri":"my-flag-source:8080","provider":"grpc", "certPath": "/certs/ca.cert", "tls": true, "providerID": "flagd-weatherapp-sidecar", "selector": "flagSetId=weatherapp"}, {"uri":"gs://my-bucket/my-flag.json","provider":"gcs"}, {"uri":"azblob://my-container/my-flag.json","provider":"azblob"}]' ``` @@ -132,7 +132,7 @@ sources: certPath: /certs/ca.cert tls: true providerID: flagd-weatherapp-sidecar - selector: "source=database,app=weatherapp" + selector: "flagSetId=weatherapp" - uri: gs://my-bucket/my-flag.json provider: gcs - uri: azblob://my-container/my-flags.json @@ -181,3 +181,25 @@ To support rotating the secrets without restarting flagd, the additional paramet "tokenURL": "http://localhost:8180/sso/oauth2/token" }}]' ``` + +## Selector Configuration + +Selectors allow you to filter flag configurations from sync sources. Add the `selector` field to source configurations: + +```yaml +sources: + - uri: grpc://flag-server:8080 + provider: grpc + selector: "flagSetId=payment-service" # Flag set selection + - uri: grpc://flag-server:8080 + provider: grpc + selector: "source=legacy-flags" # Source selection (legacy) +``` + +### Selector Precedence + +1. **Request Headers**: `Flagd-Selector` header (highest priority) +2. **Request Body**: `selector` field in request +3. **Configuration**: `selector` field in source configuration (lowest priority) + +For complete selector syntax, patterns, and examples, see the [Selectors concepts](../concepts/selectors.md) and [Selector Syntax Reference](selector-syntax.md). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 6537d81f1..4ab0cdd2c 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -71,3 +71,45 @@ You may need to explicitly allow HTTP2 or gRPC in your platform if you're using !!! note HTTP2 _is not_ strictly for the flag [evaluation gRPC service](./reference/specifications/protos.md#schemav1schemaproto), which is exposed both as a gRPC service and a RESTful HTTP/1.1 service, thanks to the [connect protocol](https://connectrpc.com/docs/protocol/). + +--- + +## Selector Issues + +### No Flags Returned with Selector + +**Problem**: Provider returns no flags when using a selector. + +**Debugging Steps:** + +- Verify `flagSetId` in selector matches flag configuration exactly +- Check selector syntax: `flagSetId=my-app` (not `flagSetId:my-app`) +- Test without selector to confirm flags exist + +### Wrong Flags Returned + +**Problem**: Selector returns unexpected flags. + +**Debugging Steps:** + +- Check for flag-level `flagSetId` overrides in individual flags +- Verify header precedence: `Flagd-Selector` header overrides request body +- Use metadata reflection to see what selector was actually applied + +### Selector Ignored + +**Problem**: Selector appears to be ignored, all flags returned. + +**Debugging Steps:** + +- Verify selector syntax is correct (`key=value` format) +- Check if provider configuration has a selector that overrides requests +- Ensure selector value is not empty (`flagSetId=` returns all flags without flagSetId) + +**Debug with metadata reflection:** + +```bash +curl -H "Flagd-Selector: flagSetId=my-app" \ + http://localhost:8014/ofrep/v1/evaluate/flags +# Check response metadata to see parsed selector +``` diff --git a/mkdocs.yml b/mkdocs.yml index 641f133f8..68de9503b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -78,7 +78,11 @@ nav: - 'Concepts': - 'Feature Flagging': 'concepts/feature-flagging.md' - 'Syncs': 'concepts/syncs.md' + - 'Selectors': 'concepts/selectors.md' + - 'Metadata': 'concepts/metadata.md' - 'Architecture': 'architecture.md' + - 'Guides': + - 'Migrating to Flag Sets': 'guides/migrating-to-flag-sets.md' - 'OpenFeature Providers': - 'providers/index.md' - 'Go': 'providers/go.md' @@ -95,6 +99,7 @@ nav: - 'Start': 'reference/flagd-cli/flagd_start.md' - 'Version': 'reference/flagd-cli/flagd_version.md' - 'Sync Configuration': 'reference/sync-configuration.md' + - 'Selector Syntax': 'reference/selector-syntax.md' - 'gRPC sync service': 'reference/grpc-sync-service.md' - 'OFREP service': 'reference/flagd-ofrep.md' - 'Flag Definitions': From 6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 27 Dec 2025 07:59:51 -0500 Subject: [PATCH 11/97] fix(security): update go for various stdlib CVEs (#1840) To fix CVE-2025-47907 | CVE-2025-61725 | CVE-2025-58188 | CVE-2025-61723 | CVE-2025-58187 | CVE-2025-61729 Thanks @pramod-ahire for the headsup. I had to make some unrelated minor code changes to fix new lint issues that came with the required upgrade of our linter. Most were auto-fixed by the linter. --------- Signed-off-by: Todd Baert Co-authored-by: Pramod Ahire --- .github/workflows/release-please.yaml | 2 +- Makefile | 4 ++-- core/go.mod | 4 ++-- core/pkg/sync/http/http_sync_test.go | 11 +++++++---- flagd-proxy/build.Dockerfile | 2 +- flagd-proxy/go.mod | 4 ++-- flagd-proxy/tests/loadtest/go.mod | 4 ++-- flagd/build.Dockerfile | 2 +- flagd/go.mod | 4 ++-- flagd/pkg/service/flag-sync/handler.go | 1 + flagd/profile.Dockerfile | 2 +- test/integration/go.mod | 4 +--- test/loadtest/go.mod | 2 +- test/zero-downtime-flagd-proxy/go.mod | 4 ++-- test/zero-downtime-flagd-proxy/grpc.go | 4 ++-- 15 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 30ab6ae7a..265930890 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -8,7 +8,7 @@ env: PUBLISHABLE_ITEMS: '["flagd","flagd-proxy"]' REGISTRY: ghcr.io REPO_OWNER: ${{ github.repository_owner }} - DEFAULT_GO_VERSION: '~1.21' + DEFAULT_GO_VERSION: '~1.25' PUBLIC_KEY_FILE: publicKey.pub GOPRIVATE: buf.build/gen/go diff --git a/Makefile b/Makefile index c4a210aec..f0036d23b 100644 --- a/Makefile +++ b/Makefile @@ -73,10 +73,10 @@ uninstall: rm /etc/systemd/system/flagd.service rm -f $(DESTDIR)$(PREFIX)/bin/flagd lint: - go install -v github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.1 + go install -v github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 $(foreach module, $(ALL_GO_MOD_DIRS), ${GOPATH}/bin/golangci-lint run $(module)/...;) lint-fix: - go install -v github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.1 + go install -v github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 $(foreach module, $(ALL_GO_MOD_DIRS), ${GOPATH}/bin/golangci-lint run --fix $(module)/...;) install-mockgen: go install go.uber.org/mock/mockgen@v0.4.0 diff --git a/core/go.mod b/core/go.mod index 2a3c63ee2..ed947bb77 100644 --- a/core/go.mod +++ b/core/go.mod @@ -1,8 +1,8 @@ module github.com/open-feature/flagd/core -go 1.24.0 +go 1.25.5 -toolchain go1.24.4 +toolchain go1.25.5 require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 diff --git a/core/pkg/sync/http/http_sync_test.go b/core/pkg/sync/http/http_sync_test.go index 916d9f172..45d1409d4 100644 --- a/core/pkg/sync/http/http_sync_test.go +++ b/core/pkg/sync/http/http_sync_test.go @@ -557,7 +557,7 @@ func TestHTTPSync_OAuth(t *testing.T) { defer ts.Close() l := logger.NewLogger(nil, false) s := NewHTTP(sync.SourceConfig{ - URI: ts.URL, + URI: ts.URL, AuthHeader: "Bearer it_should_be_replaced_by_oauth", OAuth: &sync.OAuthCredentialHandler{ ClientID: clientID, @@ -620,11 +620,14 @@ func TestHTTPSync_OAuthFolderSecrets(t *testing.T) { return } else if strings.HasSuffix(r.URL.Path, flagsPath) { // mock flags response - io.ReadAll(r.Body) + _, err := io.ReadAll(r.Body) + if err != nil { + t.Fatalf("cannot read request: %v", err) + } w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") - _, err := w.Write([]byte(fmt.Sprintf(`{"flagKey": {"default": true}}`))) + _, err = w.Write([]byte(fmt.Sprintf(`{"flagKey": {"default": true}}`))) if err != nil { t.Fatalf("cannot write response: %v", err) } @@ -650,7 +653,7 @@ func TestHTTPSync_OAuthFolderSecrets(t *testing.T) { l := logger.NewLogger(nil, false) s := NewHTTP(sync.SourceConfig{ - URI: ts.URL + flagsPath, + URI: ts.URL + flagsPath, AuthHeader: "Bearer it_should_be_replaced_by_oauth", OAuth: &sync.OAuthCredentialHandler{ ClientID: clientID, diff --git a/flagd-proxy/build.Dockerfile b/flagd-proxy/build.Dockerfile index 1cf6aa51a..33941b2f8 100644 --- a/flagd-proxy/build.Dockerfile +++ b/flagd-proxy/build.Dockerfile @@ -1,6 +1,6 @@ # Main Dockerfile for flagd builds # Build the manager binary -FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.25-alpine AS builder WORKDIR /src diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index a5c122752..9191a60cd 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -1,8 +1,8 @@ module github.com/open-feature/flagd/flagd-proxy -go 1.24.0 +go 1.25.5 -toolchain go1.24.4 +toolchain go1.25.5 require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 diff --git a/flagd-proxy/tests/loadtest/go.mod b/flagd-proxy/tests/loadtest/go.mod index 169271f61..37b4e8467 100644 --- a/flagd-proxy/tests/loadtest/go.mod +++ b/flagd-proxy/tests/loadtest/go.mod @@ -1,8 +1,8 @@ module github.com/open-feature/flagd/flagd-proxy/tests/loadtest -go 1.23.0 +go 1.25.5 -toolchain go1.24.1 +toolchain go1.25.5 require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 diff --git a/flagd/build.Dockerfile b/flagd/build.Dockerfile index 5f7442828..8a67587dc 100644 --- a/flagd/build.Dockerfile +++ b/flagd/build.Dockerfile @@ -1,6 +1,6 @@ # Main Dockerfile for flagd builds # Build the manager binary -FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.25-alpine AS builder WORKDIR /src diff --git a/flagd/go.mod b/flagd/go.mod index 07ba7450c..45e97e620 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -1,8 +1,8 @@ module github.com/open-feature/flagd/flagd -go 1.24.0 +go 1.25.5 -toolchain go1.24.4 +toolchain go1.25.5 require ( buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 diff --git a/flagd/pkg/service/flag-sync/handler.go b/flagd/pkg/service/flag-sync/handler.go index 4de4a3463..1c45d8522 100644 --- a/flagd/pkg/service/flag-sync/handler.go +++ b/flagd/pkg/service/flag-sync/handler.go @@ -159,6 +159,7 @@ func (s syncHandler) FetchAllFlags(ctx context.Context, req *syncv1.FetchAllFlag // Deprecated - GetMetadata is deprecated and will be removed in a future release. // Use the sync_context field in syncv1.SyncFlagsResponse, providing same info. +//nolint:staticcheck // SA1019 temporarily suppress deprecation warning func (s syncHandler) GetMetadata(_ context.Context, _ *syncv1.GetMetadataRequest) ( *syncv1.GetMetadataResponse, error, ) { diff --git a/flagd/profile.Dockerfile b/flagd/profile.Dockerfile index b414126bf..8c9f97687 100644 --- a/flagd/profile.Dockerfile +++ b/flagd/profile.Dockerfile @@ -1,6 +1,6 @@ # Dockerfile with pprof profiler # Build the manager binary -FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.25-alpine AS builder WORKDIR /src diff --git a/test/integration/go.mod b/test/integration/go.mod index cbbc3a6d6..17dbd0866 100644 --- a/test/integration/go.mod +++ b/test/integration/go.mod @@ -1,8 +1,6 @@ module integration_test -go 1.24.9 - -toolchain go1.24.10 +go 1.25.5 require ( github.com/go-git/go-git/v5 v5.16.2 diff --git a/test/loadtest/go.mod b/test/loadtest/go.mod index 17805b300..aa5aa24cb 100644 --- a/test/loadtest/go.mod +++ b/test/loadtest/go.mod @@ -1,3 +1,3 @@ module tests.loadtest -go 1.19 +go 1.25.5 diff --git a/test/zero-downtime-flagd-proxy/go.mod b/test/zero-downtime-flagd-proxy/go.mod index 97e4ffe97..9be8701a1 100644 --- a/test/zero-downtime-flagd-proxy/go.mod +++ b/test/zero-downtime-flagd-proxy/go.mod @@ -1,8 +1,8 @@ module zero-downtime-test -go 1.23.0 +go 1.25.5 -toolchain go1.24.0 +toolchain go1.25.5 require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 diff --git a/test/zero-downtime-flagd-proxy/grpc.go b/test/zero-downtime-flagd-proxy/grpc.go index dbf1fbc8e..44b549763 100644 --- a/test/zero-downtime-flagd-proxy/grpc.go +++ b/test/zero-downtime-flagd-proxy/grpc.go @@ -19,7 +19,7 @@ func doRequests(grpcClient pb.FlagSyncServiceClient, waitSecondsBetweenRequests Selector: "file:/etc/flagd/config.json", }) if err != nil { - return fmt.Errorf("error SyncFlags(): " + err.Error()) + return fmt.Errorf("%s", "error SyncFlags(): "+err.Error()) } for { @@ -33,7 +33,7 @@ func doRequests(grpcClient pb.FlagSyncServiceClient, waitSecondsBetweenRequests Selector: "file:/etc/flagd/config.json", }) if err != nil { - return fmt.Errorf("error SyncFlags(): " + err.Error()) + return fmt.Errorf("%s", "error SyncFlags(): "+err.Error()) } } <-time.After(time.Duration(waitSecondsBetweenRequests) * time.Second) From 5e4218cefabe40138f20d07f0ca0665d4ab34c09 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 Dec 2025 08:10:22 -0500 Subject: [PATCH 12/97] chore: release main (#1841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.13.1 ## [0.13.1](https://github.com/open-feature/flagd/compare/flagd/v0.13.0...flagd/v0.13.1) (2025-12-27) ### 🐛 Bug Fixes * **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc))
flagd-proxy: 0.8.2 ## [0.8.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.1...flagd-proxy/v0.8.2) (2025-12-27) ### 🐛 Bug Fixes * **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc))
core: 0.13.1 ## [0.13.1](https://github.com/open-feature/flagd/compare/core/v0.13.0...core/v0.13.1) (2025-12-27) ### 🐛 Bug Fixes * **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 7 +++++++ flagd-proxy/CHANGELOG.md | 7 +++++++ flagd/CHANGELOG.md | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 0f415179a..a4335475d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.13.0", - "flagd-proxy": "0.8.1", - "core": "0.13.0" + "flagd": "0.13.1", + "flagd-proxy": "0.8.2", + "core": "0.13.1" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 62a051bf0..f23c3041f 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.13.1](https://github.com/open-feature/flagd/compare/core/v0.13.0...core/v0.13.1) (2025-12-27) + + +### 🐛 Bug Fixes + +* **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc)) + ## [0.13.0](https://github.com/open-feature/flagd/compare/core/v0.12.1...core/v0.13.0) (2025-12-23) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 2c87edabd..94f0c057d 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.8.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.1...flagd-proxy/v0.8.2) (2025-12-27) + + +### 🐛 Bug Fixes + +* **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc)) + ## [0.8.1](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.0...flagd-proxy/v0.8.1) (2025-12-23) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 14cb293ae..38accf91a 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.13.1](https://github.com/open-feature/flagd/compare/flagd/v0.13.0...flagd/v0.13.1) (2025-12-27) + + +### 🐛 Bug Fixes + +* **security:** update go for various stdlib CVEs ([#1840](https://github.com/open-feature/flagd/issues/1840)) ([6dcb36d](https://github.com/open-feature/flagd/commit/6dcb36d2d6b55b7fe0b6107ac9a25baf302c5cdc)) + ## [0.13.0](https://github.com/open-feature/flagd/compare/flagd/v0.12.9...flagd/v0.13.0) (2025-12-23) From 138a45836a6b2d3136148f1201e5e5fda7ea1ebd Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Fri, 2 Jan 2026 09:21:58 -0500 Subject: [PATCH 13/97] docs: command and query cheat sheet, context injection (#1839) Adds a "cheat sheet" with a a bunch of simple, easily searchable examples for: - starting flagd - docker and binary - with file source - with http source - with multiple sources - with header and static context injection - calling OFREP with curl - evaluating multiple flags - evaluating one flag - using the `flagd-selector` header - calling proto API - streaming and evaluation - flagd-selector ... and more [DIRECT PREVIEW](https://deploy-preview-1839--polite-licorice-3db33c.netlify.app/reference/cheat-sheet/) :play_or_pause_button: The idea is this is a searchable reference. Concepts are not explained we have lots of that elsewhere. This is just for quick reference for useful commands. --------- Signed-off-by: Todd Baert Co-authored-by: Michael Beemer --- Dockerfile | 2 +- docs/assets/cheat-sheet-flags-payments.json | 48 ++ docs/assets/cheat-sheet-flags.json | 102 +++++ docs/concepts/selectors.md | 2 + docs/concepts/syncs.md | 1 + docs/faq.md | 1 + docs/reference/cheat-sheet.md | 479 ++++++++++++++++++++ docs/reference/flag-definitions.md | 92 +++- docs/reference/flagd-ofrep.md | 2 + docs/reference/grpc-sync-service.md | 2 + mkdocs.yml | 1 + requirements.txt | 2 +- runtime.txt | 2 +- 13 files changed, 729 insertions(+), 7 deletions(-) create mode 100644 docs/assets/cheat-sheet-flags-payments.json create mode 100644 docs/assets/cheat-sheet-flags.json create mode 100644 docs/reference/cheat-sheet.md diff --git a/Dockerfile b/Dockerfile index 8c7d80bbf..bc8822145 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,2 +1,2 @@ -FROM squidfunk/mkdocs-material:9.5 +FROM squidfunk/mkdocs-material:9.7.1 RUN pip install mkdocs-include-markdown-plugin diff --git a/docs/assets/cheat-sheet-flags-payments.json b/docs/assets/cheat-sheet-flags-payments.json new file mode 100644 index 000000000..6edb1922e --- /dev/null +++ b/docs/assets/cheat-sheet-flags-payments.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://flagd.dev/schema/v0/flags.json", + "flags": { + "payment-provider": { + "state": "ENABLED", + "variants": { + "slash": "slash", + "billbuddy": "billbuddy", + "cube": "cube" + }, + "defaultVariant": "slash" + }, + "max-transaction-amount": { + "state": "ENABLED", + "variants": { + "standard": 1000, + "elevated": 5000, + "unlimited": 999999 + }, + "defaultVariant": "standard", + "targeting": { + "if": [ + { "===": [{ "var": "account-verified" }, true] }, + "elevated", + "standard" + ] + } + }, + "enable-crypto-payments": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off", + "targeting": { + "if": [ + { "in": [{ "var": "country" }, ["us", "ca", "uk", "de"]] }, + "on", + "off" + ] + } + } + }, + "metadata": { + "flagSetId": "payment-flags" + } +} diff --git a/docs/assets/cheat-sheet-flags.json b/docs/assets/cheat-sheet-flags.json new file mode 100644 index 000000000..bf303798d --- /dev/null +++ b/docs/assets/cheat-sheet-flags.json @@ -0,0 +1,102 @@ +{ + "$schema": "https://flagd.dev/schema/v0/flags.json", + "flags": { + "simple-boolean": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "on" + }, + "simple-string": { + "state": "ENABLED", + "variants": { + "greeting": "Hello, World!", + "farewell": "Goodbye, World!" + }, + "defaultVariant": "greeting" + }, + "simple-number": { + "state": "ENABLED", + "variants": { + "low": 10, + "medium": 50, + "high": 100 + }, + "defaultVariant": "medium" + }, + "simple-object": { + "state": "ENABLED", + "variants": { + "config-a": { + "theme": "light", + "maxItems": 10 + }, + "config-b": { + "theme": "dark", + "maxItems": 25 + } + }, + "defaultVariant": "config-a" + }, + "user-tier-flag": { + "state": "ENABLED", + "variants": { + "basic": "basic-features", + "premium": "premium-features", + "enterprise": "enterprise-features" + }, + "defaultVariant": "basic", + "targeting": { + "if": [ + { "===": [{ "var": "tier" }, "enterprise"] }, + "enterprise", + { "if": [ + { "===": [{ "var": "tier" }, "premium"] }, + "premium", + null + ]} + ] + } + }, + "email-based-feature": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off", + "targeting": { + "if": [ + { "ends_with": [{ "var": "email" }, "@example.com"] }, + "on", + null + ] + } + }, + "region-config": { + "state": "ENABLED", + "variants": { + "us": { "currency": "USD", "dateFormat": "MM/DD/YYYY" }, + "eu": { "currency": "EUR", "dateFormat": "DD/MM/YYYY" }, + "default": { "currency": "USD", "dateFormat": "YYYY-MM-DD" } + }, + "defaultVariant": "default", + "targeting": { + "if": [ + { "in": [{ "var": "region" }, ["us", "usa", "united-states"]] }, + "us", + { "if": [ + { "in": [{ "var": "region" }, ["eu", "europe", "uk", "de", "fr"]] }, + "eu", + null + ]} + ] + } + } + }, + "metadata": { + "flagSetId": "app-flags" + } +} diff --git a/docs/concepts/selectors.md b/docs/concepts/selectors.md index 988003ab4..170f21f1e 100644 --- a/docs/concepts/selectors.md +++ b/docs/concepts/selectors.md @@ -13,6 +13,8 @@ In flagd, **selectors** provide a way to query flags based on different criteria - **Selector**: A query expression that filters flags by source, flag set, or other criteria - **Flag Set Metadata**: The selector information is "reflected" back in response metadata for transparency +See the [cheat sheet](../reference/cheat-sheet.md#using-the-selector-header) for practical examples of using selectors. + !!! tip The `flagSetId` + `key` combination represents the unique identifier for a flag. diff --git a/docs/concepts/syncs.md b/docs/concepts/syncs.md index 94edf41b0..3d80456c5 100644 --- a/docs/concepts/syncs.md +++ b/docs/concepts/syncs.md @@ -2,6 +2,7 @@ Syncs are a core part of flagd; they are the abstraction that enables different sources for feature flag definitions. flagd can connect to one or more sync sources. +See the [cheat sheet](../reference/cheat-sheet.md#running-flagd) for quick startup examples with different sync sources. ## Available syncs diff --git a/docs/faq.md b/docs/faq.md index 3227b7c12..036da18f7 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -30,6 +30,7 @@ flagd is sub-project of OpenFeature and aims to be fully [OpenFeature-compliant] You can run flagd as a standalone application, accessible over HTTP or gRPC, or you can embed it into your application. Please see [architecture](./architecture.md) and [installation](./installation.md) for more information. +For quick command examples, see the [cheat sheet](./reference/cheat-sheet.md). --- diff --git a/docs/reference/cheat-sheet.md b/docs/reference/cheat-sheet.md new file mode 100644 index 000000000..b36461c0e --- /dev/null +++ b/docs/reference/cheat-sheet.md @@ -0,0 +1,479 @@ +--- +description: flagd cheat sheet - quick reference for common operations +--- + +# Cheat sheet + +This cheat sheet provides quick reference examples for running flagd and evaluating flags using various protocols and configurations. + +Recommended tools: + +- [docker](https://docs.docker.com/) +- [curl](https://curl.se/) +- [grpcurl](https://github.com/fullstorydev/grpcurl) +- [jq](https://jqlang.org/) (optional, for formatting) + +!!! tip + + These commands assume a unix-like shell. + + Output is generally JSON, and can be pretty-printed by piping into `jq` (ie: `curl ... | jq`) + +## Sample Flag Definitions + +The examples below use these sample flag definition files. Download them to follow along: + +- [cheat-sheet-flags.json](../assets/cheat-sheet-flags.json) - General application flags (flagSetId: `app-flags`) +- [cheat-sheet-flags-payments.json](../assets/cheat-sheet-flags-payments.json) - Payment-related flags (flagSetId: `payment-flags`) + +The `app-flags` set includes: + +| Flag Key | Type | Description | +|----------|------|-------------| +| `simple-boolean` | boolean | Static boolean flag | +| `simple-string` | string | Static string flag | +| `simple-number` | integer | Static numeric flag | +| `simple-object` | object | Static object flag | +| `user-tier-flag` | string | Context-sensitive flag based on `tier` | +| `email-based-feature` | boolean | Context-sensitive flag based on `email` domain | +| `region-config` | object | Context-sensitive flag based on `region` | + +The `payment-flags` set includes: + +| Flag Key | Type | Description | +|----------|------|-------------| +| `payment-provider` | string | Static payment provider selection | +| `max-transaction-amount` | integer | Context-sensitive based on `account-verified` | +| `enable-crypto-payments` | boolean | Context-sensitive based on `country` | + +--- + +## Running flagd + +=== "Docker" + + ```shell + # Single flag source (local file) + docker run --rm -it \ + -p 8013:8013 \ + -p 8015:8015 \ + -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri file:./flags/cheat-sheet-flags.json + ``` + + ```shell + # Multiple flag sources + docker run --rm -it \ + -p 8013:8013 \ + -p 8015:8015 \ + -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri file:./flags/cheat-sheet-flags.json \ + --uri file:./flags/cheat-sheet-flags-payments.json + ``` + + ```shell + # HTTP source + docker run --rm -it \ + -p 8013:8013 \ + -p 8015:8015 \ + -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri https://flagd.dev/assets/cheat-sheet-flags.json + ``` + +=== "Binary" + + ```shell + # Single flag source (local file) + flagd start --uri file:./cheat-sheet-flags.json + ``` + + ```shell + # Multiple flag sources + flagd start \ + --uri file:./cheat-sheet-flags.json \ + --uri file:./cheat-sheet-flags-payments.json + ``` + + ```shell + # HTTP source + flagd start --uri https://flagd.dev/assets/cheat-sheet-flags.json + ``` + +!!! note + The remaining examples use Docker, but all CLI flags work identically with the binary. + +--- + +## OFREP API (HTTP) + +The [OFREP (OpenFeature Remote Evaluation Protocol)](https://openfeature.dev/docs/reference/other-technologies/ofrep/) API is available on port `8016` by default. + +### Evaluate a Single Flag + +```shell +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/simple-boolean' +``` + +Response: + +```json +{ + "key": "simple-boolean", + "reason": "STATIC", + "variant": "on", + "value": true, + "metadata": {} +} +``` + +### Evaluate Different Flag Types + +```shell +# String flag +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/simple-string' + +# Number flag +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/simple-number' + +# Object flag +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/simple-object' +``` + +### Evaluate Multiple Flags (Bulk Evaluation) + +```shell +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' +``` + +Response: + +```json +{ + "flags": [ + {"key": "simple-boolean", "reason": "STATIC", "variant": "on", "value": true, "metadata": {}}, + {"key": "simple-string", "reason": "STATIC", "variant": "greeting", "value": "Hello, World!", "metadata": {}}, + {"key": "simple-number", "reason": "STATIC", "variant": "medium", "value": 50, "metadata": {}} + ] +} +``` + +--- + +## Context-Aware Evaluation + +### Context from Request Body + +Pass evaluation context in the request body to trigger targeting rules: + +```shell +# Evaluate with email context (triggers email-based-feature targeting) +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/email-based-feature' \ + -H 'Content-Type: application/json' \ + -d '{"context": {"email": "user@example.com"}}' +``` + +Response (email matches `@example.com`): + +```json +{ + "key": "email-based-feature", + "reason": "TARGETING_MATCH", + "variant": "on", + "value": true, + "metadata": {} +} +``` + +```shell +# Evaluate with tier context +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/user-tier-flag' \ + -H 'Content-Type: application/json' \ + -d '{"context": {"tier": "premium"}}' +``` + +```shell +# Bulk evaluation with multiple context values +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' \ + -H 'Content-Type: application/json' \ + -d '{"context": {"email": "admin@example.com", "tier": "enterprise", "region": "us"}}' +``` + +### Context from Static Values + +Add static context values using the `-X` flag at startup. These are automatically included in all evaluations: + +```shell +docker run --rm -it \ + -p 8013:8013 -p 8015:8015 -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri file:./flags/cheat-sheet-flags.json \ + -X region=eu \ + -X environment=production +``` + +```shell +# region=eu and environment=production is automatically applied without needing to send context +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/region-config' +``` + +### Context from HTTP Headers + +Map HTTP headers to evaluation context keys using the `-H` flag at startup: + +```shell +docker run --rm -it \ + -p 8013:8013 -p 8015:8015 -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri file:./flags/cheat-sheet-flags.json \ + -H "X-User-Tier=tier" \ + -H "X-User-Email=email" +``` + +Now context is extracted from request headers: + +```shell +# tier context comes from X-User-Tier header +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/user-tier-flag' \ + -H 'X-User-Tier: enterprise' + +# email context comes from X-User-Email header +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/email-based-feature' \ + -H 'X-User-Email: developer@example.com' +``` + +### Context Priority + +When using multiple context sources, values are merged with this priority (highest to lowest): + +1. Header-mapped context values (`-H` flag) +2. Static context values (`-X` flag) +3. Request body context + +--- + +## Using the Selector Header + +When using multiple flag sources, the `Flagd-Selector` header restricts which flags are evaluated. + +Start flagd with multiple sources: + +```shell +docker run --rm -it \ + -p 8013:8013 -p 8015:8015 -p 8016:8016 \ + -v $(pwd):/flags \ + ghcr.io/open-feature/flagd:latest start \ + --uri file:./flags/cheat-sheet-flags.json \ + --uri file:./flags/cheat-sheet-flags-payments.json +``` + +Filter evaluations by flag set (`flagSetId`): + +```shell +# Evaluate only flags from the app flag set +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' \ + -H 'Flagd-Selector: flagSetId=app-flags' + +# Evaluate only flags from the payments flag set +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' \ + -H 'Flagd-Selector: flagSetId=payment-flags' + +# Single flag evaluation with selector +curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags/payment-provider' \ + -H 'Flagd-Selector: flagSetId=payment-flags' +``` + +--- + +## gRPC Evaluation API (evaluation.proto) + +The gRPC evaluation service is available on port `8013` by default. +Use [grpcurl](https://github.com/fullstorydev/grpcurl) to interact with it. + +!!! note "Proto files required" + flagd does not support gRPC reflection. You must provide the proto files to grpcurl so it knows how to serialize/deserialize requests and responses. + Clone the flagd repo or download the protos from [buf.build/open-feature/flagd](https://buf.build/open-feature/flagd). + +```shell +# Clone the repo for proto files +git clone git@github.com:open-feature/flagd-schemas.git +PROTO_DIR="flagd-schemas/protobuf/" +``` + +### Evaluate Flags by Type + +```shell +# Boolean flag +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -d '{"flagKey": "simple-boolean", "context": {}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveBoolean + +# String flag +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -d '{"flagKey": "simple-string", "context": {}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveString + +# With context +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -d '{"flagKey": "user-tier-flag", "context": {"tier": "enterprise"}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveString +``` + +### Evaluate All Flags + +```shell +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -d '{"context": {}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveAll +``` + +--- + +## gRPC Sync API (sync.proto) + +The gRPC sync service is available on port `8015` by default. +This is used by in-process providers to fetch and sync flag configurations. + +Use [grpcurl](https://github.com/fullstorydev/grpcurl) to interact with it. + +!!! note "Proto files required" + flagd does not support gRPC reflection. You must provide the proto files to grpcurl so it knows how to serialize/deserialize requests and responses. + Clone the flagd repo or download the protos from [buf.build/open-feature/flagd](https://buf.build/open-feature/flagd). + +### FetchAllFlags + +Get all flag configurations as a single response: + +```shell +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/FetchAllFlags +``` + +Response contains the complete flag configuration JSON: + +```json +{ + "flagConfiguration": "{\"flags\":{\"simple-boolean\":{...}}}" +} +``` + +### FetchAllFlags with Selector + +Filter which flag source's configuration is returned: + +```shell +# Fetch only flags from cheat-sheet-flags.json +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{"selector": "flagSetId=app-flags"}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/FetchAllFlags + +# Fetch only payment flags +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{"selector": "flagSetId=payment-flags"}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/FetchAllFlags + +# With provider ID for identification +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{"providerId": "my-app-sidecar", "selector": "flagSetId=app-flags"}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/FetchAllFlags +``` + +### SyncFlags (Streaming) + +Establish a server-streaming connection that pushes flag configuration updates in real-time: + +```shell +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/SyncFlags +``` + +The stream outputs the initial flag configuration and continues streaming updates when flags change. + +### SyncFlags with Selector + +```shell +# Stream only changes to app flags +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{"selector": "flagSetId=app-flags"}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/SyncFlags + +# Stream with provider ID +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -d '{"providerId": "my-service", "selector": "flagSetId=app-flags"}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/SyncFlags +``` + +### Using Selector Header with Sync API + +The `Flagd-Selector` header can be used as an alternative to the request body selector field: + +```shell +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/sync/v1/sync.proto \ + -H 'Flagd-Selector: flagSetId=app-flags' \ + -d '{}' \ + localhost:8015 \ + flagd.sync.v1.FlagSyncService/FetchAllFlags +``` + +If both header and request body contain a selector, the header takes precedence. + +--- + +## Quick Reference + +### Ports + +| Port | Protocol | Service | Description | +|------|----------|---------|-------------| +| 8013 | gRPC | Evaluation | Flag evaluation API (evaluation.proto) | +| 8014 | HTTP | Management | Health checks, metrics | +| 8015 | gRPC | Sync | Flag sync for in-process providers (sync.proto) | +| 8016 | HTTP | OFREP | OpenFeature Remote Evaluation Protocol | + +### Health Check + +```shell +curl http://localhost:8014/readyz +``` + +--- + +## See Also + +- [Flag Definitions](./flag-definitions.md) - Complete flag definition reference +- [OFREP Service](./flagd-ofrep.md) - OFREP API details +- [gRPC Sync Service](./grpc-sync-service.md) - Sync service details +- [Sync Configuration](./sync-configuration.md) - Configure flag sources +- [CLI Reference](./flagd-cli/flagd_start.md) - Complete CLI options diff --git a/docs/reference/flag-definitions.md b/docs/reference/flag-definitions.md index 59974c9d8..d6f4f0a28 100644 --- a/docs/reference/flag-definitions.md +++ b/docs/reference/flag-definitions.md @@ -177,7 +177,22 @@ See [Boolean Variant Shorthand](#boolean-variant-shorthand). #### Evaluation Context -Evaluation context is included as part of the evaluation request. +Evaluation context provides the attributes used by targeting rules to determine flag values. +Context can come from multiple sources, which are merged together before evaluation. + +##### Context Sources + +flagd supports three sources of evaluation context: + +| Source | Flag | Description | +| --------------------- | ------------------------------ | ------------------------------------------------------------- | +| Request body | - | Context sent with each evaluation request | +| Static context | `-X` / `--context-value` | Key-value pairs added at startup, included in all evaluations | +| Header-mapped context | `-H` / `--context-from-header` | Maps HTTP/gRPC request headers to context keys | + +##### Request Body Context + +Context included as part of the evaluation request. For example, when accessing flagd via HTTP, the POST body may look like this: ```json @@ -189,10 +204,77 @@ For example, when accessing flagd via HTTP, the POST body may look like this: } ``` -The evaluation context can be accessed in targeting rules using the `var` operation followed by the evaluation context property name. +This is the most common approach when the calling application has user or session information available. + +##### Static Context (`-X` flag) + +Static context values are specified at startup and automatically included in every evaluation. +This is useful for server-wide or environment-specific values that don't change per-request. + +```shell +flagd start \ + --uri file:./flags.json \ + -X environment=production \ + -X region=us-east-1 \ + -X service=payment-api +``` + +**Use cases:** + +- **Environment identification**: Different flag behavior for production vs staging (`-X environment=production`) +- **Regional configuration**: Apply region-specific rules (`-X region=eu-west-1`) +- **Service identification**: When multiple services share flag definitions (`-X service=checkout`) +- **Infrastructure metadata**: Cloud provider, datacenter, or cluster information + +##### Header-Mapped Context (`-H` flag) + +Header-mapped context extracts values from HTTP or gRPC request headers and adds them to the evaluation context. +This enables context-sensitive evaluation without modifying request bodies. + +```shell +flagd start \ + --uri file:./flags.json \ + -H "X-User-Id=userId" \ + -H "X-User-Tier=tier" +``` -The evaluation context can be appended by arbitrary key value pairs -via the `-X` command line flag. +With this configuration: + +- A request with headers `X-User-Id: abc123` and `X-User-Tier: premium` will have `userId=abc123` and `tier=premium` in its evaluation context. + +**Use cases:** + +- **Gateway integration**: Extract user information from headers set by an API gateway or auth proxy +- **Multi-tenancy**: Use tenant ID headers for tenant-specific flag behavior + +##### Context Merge Priority + +When the same key appears in multiple context sources, values are merged with this priority (highest wins): + +1. **Header-mapped context** (`-H` flag) - highest priority +2. **Static context** (`-X` flag) +3. **Request body context** - lowest priority + +For example, with this configuration: + +```shell +flagd start \ + --uri file:./flags.json \ + -X tier=basic \ + -H "X-User-Tier=tier" +``` + +| Request Body | Header | Resulting `tier` value | +| ------------------------------- | ------------------------- | -------------------------------- | +| `{"context": {"tier": "free"}}` | (none) | `basic` (static overrides body) | +| `{"context": {"tier": "free"}}` | `X-User-Tier: premium` | `premium` (header overrides all) | +| (none) | `X-User-Tier: enterprise` | `enterprise` | + +This priority order allows operators to enforce certain context values at the infrastructure level while still accepting client-provided context for other attributes. + +##### Accessing Context in Targeting Rules + +The evaluation context can be accessed in targeting rules using the `var` operation followed by the evaluation context property name. | Description | Example | | -------------------------------------------------------------- | ---------------------------------------------------- | @@ -202,6 +284,8 @@ via the `-X` command line flag. > For more information, see the `var` section in the [JsonLogic documentation](https://jsonlogic.com/operations.html#var). +See the [cheat sheet](./cheat-sheet.md#context-aware-evaluation) for practical examples of context-sensitive evaluation. + #### Conditions Conditions can be used to control the logical flow and grouping of targeting rules. diff --git a/docs/reference/flagd-ofrep.md b/docs/reference/flagd-ofrep.md index c682ab6a5..f28ac3b85 100644 --- a/docs/reference/flagd-ofrep.md +++ b/docs/reference/flagd-ofrep.md @@ -22,3 +22,5 @@ To evaluate all flags currently configured at flagd, use OFREP bulk evaluation r ```shell curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' ``` + +See the [cheat sheet](./cheat-sheet.md#ofrep-api-http) for more OFREP examples including context-sensitive evaluation and selectors. diff --git a/docs/reference/grpc-sync-service.md b/docs/reference/grpc-sync-service.md index a6db08024..5303cc991 100644 --- a/docs/reference/grpc-sync-service.md +++ b/docs/reference/grpc-sync-service.md @@ -40,3 +40,5 @@ final FlagdProvider flagdProvider = .selector("myFlags.json") .build()); ``` + +See the [cheat sheet](./cheat-sheet.md#grpc-sync-api-syncproto) for `grpcurl` examples using `FetchAllFlags` and `SyncFlags`. diff --git a/mkdocs.yml b/mkdocs.yml index 68de9503b..97707cbab 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -94,6 +94,7 @@ nav: - 'Rust': 'providers/rust.md' - 'Web': 'providers/web.md' - 'Reference': + - 'Cheat sheet': 'reference/cheat-sheet.md' - 'CLI': - 'Overview': 'reference/flagd-cli/flagd.md' - 'Start': 'reference/flagd-cli/flagd_start.md' diff --git a/requirements.txt b/requirements.txt index f0d6f8ff8..ec696cfb3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ mkdocs==1.6.1 -mkdocs-material==9.5.42 +mkdocs-material==9.7.1 pymdown-extensions mkdocs-material-extensions fontawesome-markdown diff --git a/runtime.txt b/runtime.txt index cc1923a40..6324d401a 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -3.8 +3.14 From c92a159251e08ed39aa7c1dae42995e00c3186ac Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Fri, 9 Jan 2026 13:59:27 +0000 Subject: [PATCH 14/97] revert: use go 1.24 in go.mod for core package (#1844) ## This PR - Keeps Go 1.24 as the minimum supported version for the core package. While development may use newer Go releases (e.g. 1.25.x), go.mod should reflect the lowest compatible version to avoid unnecessarily restricting downstream users. ### Related Issues Closes #1843 Signed-off-by: Roman Dmytrenko --- core/go.mod | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/go.mod b/core/go.mod index ed947bb77..f0a11175f 100644 --- a/core/go.mod +++ b/core/go.mod @@ -1,8 +1,6 @@ module github.com/open-feature/flagd/core -go 1.25.5 - -toolchain go1.25.5 +go 1.24.0 require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 From a8a57adb1d49640bfc14bf02cf77961652f7516a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:08:46 +0000 Subject: [PATCH 15/97] fix(security): update module github.com/open-feature/flagd/core to v0.13.1 [security] (#1846) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/open-feature/flagd/core](https://redirect.github.com/open-feature/flagd) | `v0.12.1` → `v0.13.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fopen-feature%2fflagd%2fcore/v0.13.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fopen-feature%2fflagd%2fcore/v0.12.1/v0.13.1?slim=true) | | [github.com/open-feature/flagd/core](https://redirect.github.com/open-feature/flagd) | `v0.11.8` → `v0.13.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fopen-feature%2fflagd%2fcore/v0.13.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fopen-feature%2fflagd%2fcore/v0.11.8/v0.13.1?slim=true) | ### GitHub Vulnerability Alerts #### [GHSA-4c5f-9mj4-m247](https://redirect.github.com/open-feature/flagd/security/advisories/GHSA-4c5f-9mj4-m247) ### Summary In 2025, several vulnerabilities in the Go Standard Library were disclosed, impacting Go-based applications like flagd (the evaluation engine for OpenFeature). These CVEs primarily focus on Denial of Service (DoS) through resource exhaustion and Race Conditions in database handling. | CVE ID | Impacted Package | Severity | Description & Impact on flagd | | -- | -- | -- | -- | | CVE-2025-47907 | database/sql | 7.0 (High) | Race Condition: Canceling a query during a Scan call can return data from the wrong query. Critical if flagd uses SQL-based sync providers (e.g., Postgres), potentially leading to incorrect flag configurations. | | CVE-2025-61725 | net/mail | 7.5 (High) | DoS: Inefficient complexity in ParseAddress. Attackers can provide crafted email strings with large domain literals to exhaust CPU if flagd parses email-formatted metadata. | | CVE-2025-61723 | encoding/pem | 7.5 (High) | DoS: Quadratic complexity when parsing invalid PEM inputs. Relevant if flagd loads TLS certificates or keys via PEM files from untrusted sources. | | CVE-2025-61729 | crypto/x509 | 7.5 (High) | Resource Exhaustion: HostnameError.Error() lacks string concatenation limits. A malicious TLS certificate with thousands of hostnames could crash flagd during connection handshakes. | | CVE-2025-58188 | net/http | Medium | Request Smuggling: Improper header handling in HTTP/1.1. Could allow attackers to bypass security filters positioned in front of flagd sync or evaluation APIs. | | CVE-2025-58187 | archive/zip | Medium | DoS: Improper validation of malformed ZIP archives. Impacts flagd if configured to fetch and unpack zipped configuration bundles from remote providers. | --- ### Release Notes
open-feature/flagd (github.com/open-feature/flagd/core) ### [`v0.12.1`](https://redirect.github.com/open-feature/flagd/releases/tag/flagd/v0.12.1): flagd: v0.12.1 ##### 🐛 Bug Fixes - **deps:** update module github.com/open-feature/flagd/core to v0.11.0 ([#​1541](https://redirect.github.com/open-feature/flagd/issues/1541)) ([986a436](https://redirect.github.com/open-feature/flagd/commit/986a436e10e9766b897319085cf7dbbe2f10cb24)) - **deps:** update module golang.org/x/sync to v0.11.0 ([#​1543](https://redirect.github.com/open-feature/flagd/issues/1543)) ([7d6c0dc](https://redirect.github.com/open-feature/flagd/commit/7d6c0dc6e6e6955af1e5225807deeb2b6797900b)) ### [`v0.12.0`](https://redirect.github.com/open-feature/flagd/releases/tag/flagd/v0.12.0): flagd: v0.12.0 ##### ⚠ BREAKING CHANGES - flagSetMetadata in OFREP/ResolveAll, core refactors ([#​1540](https://redirect.github.com/open-feature/flagd/issues/1540)) ##### 🐛 Bug Fixes - **deps:** update module buf.build/gen/go/open-feature/flagd/connectrpc/go to v1.18.1-20250127221518-be6d1143b690.1 ([#​1535](https://redirect.github.com/open-feature/flagd/issues/1535)) ([d5ec921](https://redirect.github.com/open-feature/flagd/commit/d5ec921f02263615cd87625e211ba82b0811d041)) - **deps:** update module buf.build/gen/go/open-feature/flagd/grpc/go to v1.5.1-20250127221518-be6d1143b690.2 ([#​1536](https://redirect.github.com/open-feature/flagd/issues/1536)) ([e23060f](https://redirect.github.com/open-feature/flagd/commit/e23060f24b2a714ae748e6b37d0d06b7caa1c95c)) - **deps:** update module buf.build/gen/go/open-feature/flagd/protocolbuffers/go to v1.36.4-20241220192239-696330adaff0.1 ([#​1529](https://redirect.github.com/open-feature/flagd/issues/1529)) ([8881a80](https://redirect.github.com/open-feature/flagd/commit/8881a804b4055da0127a16b8fc57022d24906e1b)) - **deps:** update module buf.build/gen/go/open-feature/flagd/protocolbuffers/go to v1.36.4-20250127221518-be6d1143b690.1 ([#​1537](https://redirect.github.com/open-feature/flagd/issues/1537)) ([f74207b](https://redirect.github.com/open-feature/flagd/commit/f74207bc13b75bae4275bc486df51e2da569dd41)) - **deps:** update module github.com/open-feature/flagd/core to v0.10.8 ([#​1526](https://redirect.github.com/open-feature/flagd/issues/1526)) ([fbf2ed5](https://redirect.github.com/open-feature/flagd/commit/fbf2ed527fcf3b300808c7b835a8d891df7b88a8)) - **deps:** update module google.golang.org/grpc to v1.70.0 ([#​1528](https://redirect.github.com/open-feature/flagd/issues/1528)) ([79b2b0a](https://redirect.github.com/open-feature/flagd/commit/79b2b0a6bbd48676dcbdd2393feb8247529bf29c)) ##### ✨ New Features - flagSetMetadata in OFREP/ResolveAll, core refactors ([#​1540](https://redirect.github.com/open-feature/flagd/issues/1540)) ([b49abf9](https://redirect.github.com/open-feature/flagd/commit/b49abf95069da93bdf8369c8aa0ae40e698df760))
--- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- flagd-proxy/go.mod | 40 ++++++++++----------- flagd-proxy/go.sum | 40 +++++++++++++++++++++ flagd/go.mod | 69 ++++++++++++++++++++++--------------- flagd/go.sum | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 47 deletions(-) diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index 9191a60cd..01f235e7e 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -2,28 +2,26 @@ module github.com/open-feature/flagd/flagd-proxy go 1.25.5 -toolchain go1.25.5 - require ( buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 github.com/dimiro1/banner v1.1.0 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.11.8 - github.com/prometheus/client_golang v1.22.0 + github.com/open-feature/flagd/core v0.13.1 + github.com/prometheus/client_golang v1.23.0 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 - go.opentelemetry.io/otel/exporters/prometheus v0.59.0 - go.opentelemetry.io/otel/metric v1.37.0 - go.opentelemetry.io/otel/sdk/metric v1.37.0 + go.opentelemetry.io/otel/exporters/prometheus v0.60.0 + go.opentelemetry.io/otel/metric v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.73.0 + google.golang.org/grpc v1.75.0 ) require ( - cel.dev/expr v0.23.0 // indirect + cel.dev/expr v0.24.0 // indirect cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -39,7 +37,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -64,7 +62,7 @@ require ( github.com/aws/smithy-go v1.22.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect @@ -74,7 +72,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -91,6 +89,7 @@ require ( github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.2 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -101,7 +100,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 // indirect + github.com/open-feature/flagd-schemas v0.2.13 // indirect github.com/open-feature/open-feature-operator/apis v0.2.45 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect @@ -109,7 +108,8 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/otlptranslator v0.0.2 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect @@ -128,9 +128,9 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/sdk v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect golang.org/x/crypto v0.45.0 // indirect @@ -144,9 +144,9 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index 91515e5a4..62d777196 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -4,6 +4,8 @@ buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-eb buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= @@ -50,6 +52,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -105,6 +109,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -145,6 +151,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -216,6 +224,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -260,8 +270,12 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= +github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/cOO8N0n8dpbRc= +github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= github.com/open-feature/flagd/core v0.11.8 h1:84uDdSzhtVNBnsjuAnBqBXbFwXC2CQ6aO5cNNKKM7uc= github.com/open-feature/flagd/core v0.11.8/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/flagd/core v0.13.1 h1:3LYTCHZbFBl1uJTroGFQEpkEHL6NcIANikC3LlsXxZw= +github.com/open-feature/flagd/core v0.13.1/go.mod h1:Oa6A6O2eluSuPcNGgOwrz3xaXUYanvQeHq2+rGySMBQ= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -277,13 +291,19 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= +github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= @@ -346,18 +366,30 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/X go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -489,8 +521,12 @@ google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuO google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -498,6 +534,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -509,6 +547,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/flagd/go.mod b/flagd/go.mod index 45e97e620..53d549f6e 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -2,8 +2,6 @@ module github.com/open-feature/flagd/flagd go 1.25.5 -toolchain go1.25.5 - require ( buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 @@ -12,29 +10,29 @@ require ( github.com/dimiro1/banner v1.1.0 github.com/gorilla/mux v1.8.1 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.12.1 - github.com/prometheus/client_golang v1.22.0 + github.com/open-feature/flagd/core v0.13.1 + github.com/prometheus/client_golang v1.23.0 github.com/rs/cors v1.11.1 github.com/rs/xid v1.6.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 - go.opentelemetry.io/otel v1.37.0 - go.opentelemetry.io/otel/sdk v1.37.0 - go.opentelemetry.io/otel/sdk/metric v1.37.0 - go.opentelemetry.io/otel/trace v1.37.0 + go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel/sdk v1.38.0 + go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.opentelemetry.io/otel/trace v1.38.0 go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.73.0 - google.golang.org/protobuf v1.36.6 + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.8 ) require ( - cel.dev/expr v0.23.0 // indirect + cel.dev/expr v0.24.0 // indirect cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -50,7 +48,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -75,9 +73,9 @@ require ( github.com/aws/smithy-go v1.22.3 // indirect github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v5 v5.0.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -89,7 +87,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -106,7 +104,11 @@ require ( github.com/google/wire v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.14.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-memdb v1.3.5 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -118,7 +120,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 // indirect + github.com/open-feature/flagd-schemas v0.2.13 // indirect github.com/open-feature/open-feature-operator/apis v0.2.45 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect @@ -127,10 +129,12 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/otlptranslator v0.0.2 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/robfig/cron v1.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect @@ -145,14 +149,25 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/prometheus v0.59.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/proto/otlp v1.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.60.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect golang.org/x/crypto v0.45.0 // indirect @@ -167,8 +182,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index 627c5bf0d..0cce7ec63 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -6,6 +6,8 @@ buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-eb buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= @@ -54,6 +56,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -106,6 +110,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -113,6 +119,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -156,6 +164,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -229,8 +239,20 @@ github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3 github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= +github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -277,8 +299,12 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= +github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/cOO8N0n8dpbRc= +github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= github.com/open-feature/flagd/core v0.12.1 h1:fCBenpE0/m/l1KiU6gjM59FUQPnqeuxnO9D4v3UDqu4= github.com/open-feature/flagd/core v0.12.1/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/flagd/core v0.13.1 h1:3LYTCHZbFBl1uJTroGFQEpkEHL6NcIANikC3LlsXxZw= +github.com/open-feature/flagd/core v0.13.1/go.mod h1:Oa6A6O2eluSuPcNGgOwrz3xaXUYanvQeHq2+rGySMBQ= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -294,13 +320,19 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= +github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= @@ -315,6 +347,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -340,6 +374,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= @@ -366,34 +402,76 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= +go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= +go.opentelemetry.io/contrib/exporters/autoexport v0.63.0/go.mod h1:OvRg7gm5WRSCtxzGSsrFHbDLToYlStHNZQ+iPNIyD6g= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= +go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= +go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= +go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= +go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -527,8 +605,12 @@ google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuO google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -536,6 +618,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -547,6 +631,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 623e5e2ec8b24fa8c0c233aee47aa76839480b0b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 Jan 2026 10:41:29 -0500 Subject: [PATCH 16/97] chore: release main (#1845) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.13.2 ## [0.13.2](https://github.com/open-feature/flagd/compare/flagd/v0.13.1...flagd/v0.13.2) (2026-01-09) ### 🐛 Bug Fixes * **security:** update module github.com/open-feature/flagd/core to v0.13.1 [security] ([#1846](https://github.com/open-feature/flagd/issues/1846)) ([a8a57ad](https://github.com/open-feature/flagd/commit/a8a57adb1d49640bfc14bf02cf77961652f7516a))
flagd-proxy: 0.8.3 ## [0.8.3](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.2...flagd-proxy/v0.8.3) (2026-01-09) ### 🐛 Bug Fixes * **security:** update module github.com/open-feature/flagd/core to v0.13.1 [security] ([#1846](https://github.com/open-feature/flagd/issues/1846)) ([a8a57ad](https://github.com/open-feature/flagd/commit/a8a57adb1d49640bfc14bf02cf77961652f7516a))
core: 0.13.2 ## [0.13.2](https://github.com/open-feature/flagd/compare/core/v0.13.1...core/v0.13.2) (2026-01-09) ### 🔙 Reverts * use go 1.24 in go.mod for core package ([#1844](https://github.com/open-feature/flagd/issues/1844)) ([c92a159](https://github.com/open-feature/flagd/commit/c92a159251e08ed39aa7c1dae42995e00c3186ac))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 7 +++++++ flagd-proxy/CHANGELOG.md | 7 +++++++ flagd/CHANGELOG.md | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index a4335475d..3de5749e5 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.13.1", - "flagd-proxy": "0.8.2", - "core": "0.13.1" + "flagd": "0.13.2", + "flagd-proxy": "0.8.3", + "core": "0.13.2" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index f23c3041f..093c28312 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.13.2](https://github.com/open-feature/flagd/compare/core/v0.13.1...core/v0.13.2) (2026-01-09) + + +### 🔙 Reverts + +* use go 1.24 in go.mod for core package ([#1844](https://github.com/open-feature/flagd/issues/1844)) ([c92a159](https://github.com/open-feature/flagd/commit/c92a159251e08ed39aa7c1dae42995e00c3186ac)) + ## [0.13.1](https://github.com/open-feature/flagd/compare/core/v0.13.0...core/v0.13.1) (2025-12-27) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 94f0c057d..c3103ac7c 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.8.3](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.2...flagd-proxy/v0.8.3) (2026-01-09) + + +### 🐛 Bug Fixes + +* **security:** update module github.com/open-feature/flagd/core to v0.13.1 [security] ([#1846](https://github.com/open-feature/flagd/issues/1846)) ([a8a57ad](https://github.com/open-feature/flagd/commit/a8a57adb1d49640bfc14bf02cf77961652f7516a)) + ## [0.8.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.1...flagd-proxy/v0.8.2) (2025-12-27) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 38accf91a..0c617551e 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.13.2](https://github.com/open-feature/flagd/compare/flagd/v0.13.1...flagd/v0.13.2) (2026-01-09) + + +### 🐛 Bug Fixes + +* **security:** update module github.com/open-feature/flagd/core to v0.13.1 [security] ([#1846](https://github.com/open-feature/flagd/issues/1846)) ([a8a57ad](https://github.com/open-feature/flagd/commit/a8a57adb1d49640bfc14bf02cf77961652f7516a)) + ## [0.13.1](https://github.com/open-feature/flagd/compare/flagd/v0.13.0...flagd/v0.13.1) (2025-12-27) From ace1a7c7fdf9cf9edf136e0fecc2faf3af7cdaaf Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Fri, 9 Jan 2026 13:27:55 -0500 Subject: [PATCH 17/97] docs: fatal codes, re-init, and retry policy (#1818) This PR specifies some provider behavior, specifically around stream health, gRPC retry policy, and FATAL codes. Specifically, it: - publishes a retry policy that is shall be used by all flagd providers - specifies a new option for marking some gRPC status codes as FATAL, which will cause the provider to stop attempting to reconnect (generally useful and requested in https://github.com/open-feature/go-sdk-contrib/issues/756) - makes clear via state diagram that flagd provider should support re-initialization (if not in FATAL state) --------- Signed-off-by: Todd Baert --- docs/concepts/selectors.md | 3 +- docs/reference/specifications/providers.md | 114 +++++++++++++-------- test-harness | 2 +- 3 files changed, 75 insertions(+), 44 deletions(-) diff --git a/docs/concepts/selectors.md b/docs/concepts/selectors.md index 170f21f1e..87e43120f 100644 --- a/docs/concepts/selectors.md +++ b/docs/concepts/selectors.md @@ -1,6 +1,7 @@ # Selectors -Selectors are query expressions that allow you to filter flag configurations from flagd's sync service. They enable providers to request only specific subsets of flags instead of receiving all flags, making flagd more efficient and flexible for complex deployments. +Selectors are query expressions that allow you to filter flag configurations from flagd. +They enable providers to sync or evaluate only specific subsets of flags instead of all flags, making flagd more efficient and flexible for complex deployments, and supporting basic multi-tenancy. ## Overview diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index 2d276bda4..6fe91d0be 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -64,18 +64,21 @@ stateDiagram-v2 NOT_READY --> ERROR: initialize READY --> ERROR: disconnected, disconnected period == 0 READY --> STALE: disconnected, disconnect period < retry grace period + READY --> NOT_READY: shutdown STALE --> ERROR: disconnect period >= retry grace period + STALE --> NOT_READY: shutdown ERROR --> READY: reconnected - ERROR --> [*]: shutdown + ERROR --> NOT_READY: shutdown + ERROR --> [*]: Error code == PROVIDER_FATAL - note right of STALE + note left of STALE stream disconnected, attempting to reconnect, resolve from cache* resolve from flag set rules** STALE emitted end note - note right of READY + note left of READY stream connected, evaluation cache active*, flag set rules stored**, @@ -84,7 +87,7 @@ stateDiagram-v2 CHANGE emitted with stream messages end note - note right of ERROR + note left of ERROR stream disconnected, attempting to reconnect, evaluation cache purged*, ERROR emitted @@ -101,25 +104,51 @@ stateDiagram-v2 ### Stream Reconnection -When either stream (sync or event) disconnects, whether due to the associated deadline being exceeded, network error or any other cause, the provider attempts to re-establish the stream immediately, and then retries with an exponential back-off. -We always rely on the [integrated functionality of GRPC for reconnection](https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md) and utilize [Wait-for-Ready](https://grpc.io/docs/guides/wait-for-ready/) to re-establish the stream. -We are configuring the underlying reconnection mechanism whenever we can, based on our configuration. (not all GRPC implementations support this) +When either stream (sync or event) fails or completes, whether due to the associated deadline being exceeded, network error or any other cause, the provider attempts to re-establish the stream. +Both the RPC and sync streams will forever attempt to be re-established unless the stream response indicates a [fatal status code](#fatal-status-codes). +This is distinct from the [gRPC retry-policy](#grpc-retry-policy), which automatically retries *all RPCs* (streams or otherwise) a limited number of times to make the provider resilient to transient errors. +It's also distinct from the [gRPC layer 4 reconnection mechanism](https://grpc.github.io/grpc/core/md_doc_connection-backoff.html) which only reconnects the TCP connection, but not any streams. +When the stream is reconnecting, providers transition to the [STALE](https://openfeature.dev/docs/reference/concepts/events/#provider_stale) state, and after `retryGracePeriod`, transition to the ERROR state, emitting the respective events during these transitions. -| language/property | min connect timeout | max backoff | initial backoff | jitter | multiplier | -| ----------------- | --------------------------------- | ------------------------ | ------------------------ | ------ | ---------- | -| GRPC property | grpc.initial_reconnect_backoff_ms | max_reconnect_backoff_ms | min_reconnect_backoff_ms | 0.2 | 1.6 | -| Flagd property | deadlineMs | retryBackoffMaxMs | retryBackoffMs | 0.2 | 1.6 | -| --- | --- | --- | --- | --- | --- | -| default [^1] | ✅ | ✅ | ✅ | 0.2 | 1.6 | -| js | ✅ | ✅ | ❌ | 0.2 | 1.6 | -| java | ❌ | ❌ | ❌ | 0.2 | 1.6 | +## gRPC Retry Policy -[^1] : C++, Python, Ruby, Objective-C, PHP, C#, js(deprecated) +flagd leverages gRPC built-in retry mechanism for all RPCs. +In short, the retry policy attempts to retry all RPCs which return `UNAVAILABLE` or `UNKNOWN` status codes 3 times, with a 1s, 2s, 4s, backoff respectively. +No other status codes are retried. +The flagd gRPC retry policy is specified below: -When disconnected, if the time since disconnection is less than `retryGracePeriod`, the provider emits `STALE` when it disconnects. -While the provider is in state `STALE` the provider resolves values from its cache or stored flag set rules, depending on its resolver mode. -When the time since the last disconnect first exceeds `retryGracePeriod`, the provider emits `ERROR`. -The provider attempts to reconnect indefinitely, with a maximum interval of `retryBackoffMaxMs`. +```json +{ + "methodConfig": [ + { + "name": [ + { + "service": "flagd.evaluation.v1.Service" + }, + { + "service": "flagd.sync.v1.FlagSyncService" + } + ], + "retryPolicy": { + "MaxAttempts": 4, + "InitialBackoff": "1s", + "MaxBackoff": $FLAGD_RETRY_BACKOFF_MAX_MS, // from provider options + "BackoffMultiplier": 2.0, + "RetryableStatusCodes": [ + "UNAVAILABLE", + "UNKNOWN" + ] + } + } + ] +} +``` + +## Fatal Status Codes + +Providers accept an option for defining fatal gRPC status codes which, when received in the RPC or sync streams, transition the provider to the PROVIDER_FATAL state. +This configuration is useful for situations wherein these codes indicate to a client that their configuration is invalid and must be changed (i.e., the error is non-transient). +Examples for this include status codes such as `UNAUTHENTICATED` or `PERMISSION_DENIED`. ## RPC Resolver @@ -262,28 +291,29 @@ precedence. Below are the supported configuration parameters (note that not all apply to both resolver modes): -| Option name | Environment variable name | Explanation | Type & Values | Default | Compatible resolver | -| --------------------- | ------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------- | ----------------------------- | ----------------------- | -| resolver | FLAGD_RESOLVER | mode of operation | String - `rpc`, `in-process` | rpc | rpc & in-process | -| host | FLAGD_HOST | remote host | String | localhost | rpc & in-process | -| port | FLAGD_PORT | remote port | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | -| targetUri | FLAGD_TARGET_URI | alternative to host/port, supporting custom name resolution | string | null | rpc & in-process | -| tls | FLAGD_TLS | connection encryption | boolean | false | rpc & in-process | -| socketPath | FLAGD_SOCKET_PATH | alternative to host port, unix socket | String | null | rpc & in-process | -| certPath | FLAGD_SERVER_CERT_PATH | tls cert path | String | null | rpc & in-process | -| deadlineMs | FLAGD_DEADLINE_MS | deadline for unary calls, and timeout for initialization | int | 500 | rpc & in-process & file | -| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | deadline for streaming calls, useful as an application-layer keepalive | int | 600000 | rpc & in-process | -| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | initial backoff for stream retry | int | 1000 | rpc & in-process | -| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 120000 | rpc & in-process | -| retryGracePeriod | FLAGD_RETRY_GRACE_PERIOD | period in seconds before provider moves from STALE to ERROR state | int | 5 | rpc & in-process & file | -| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | http 2 keepalive | long | 0 | rpc & in-process | -| cache | FLAGD_CACHE | enable cache of static flags | String - `lru`, `disabled` | lru | rpc | -| maxCacheSize | FLAGD_MAX_CACHE_SIZE | max size of static flag cache | int | 1000 | rpc | -| selector | FLAGD_SOURCE_SELECTOR | Selector expression to filter flags (e.g., `flagSetId=my-app`, `source=config.json`) | string | null | in-process | -| providerId | FLAGD_PROVIDER_ID | A unique identifier for flagd(grpc client) initiating the request. | string | null | in-process | -| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | offline, file-based flag definitions, overrides host/port/targetUri | string | null | file | -| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | poll interval for reading offlineFlagSourcePath | int | 5000 | file | -| contextEnricher | - | sync-metadata to evaluation context mapping function | function | identity function | in-process | +| Option name | Environment variable name | Explanation | Type & Values | Default | Compatible resolver | +| --------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------- | ----------------------- | +| resolver | FLAGD_RESOLVER | mode of operation | string - `rpc`, `in-process` | rpc | rpc & in-process | +| host | FLAGD_HOST | remote host | string | localhost | rpc & in-process | +| port | FLAGD_PORT | remote port | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | +| targetUri | FLAGD_TARGET_URI | alternative to host/port, supporting custom name resolution | string | null | rpc & in-process | +| tls | FLAGD_TLS | connection encryption | boolean | false | rpc & in-process | +| socketPath | FLAGD_SOCKET_PATH | alternative to host port, unix socket | string | null | rpc & in-process | +| certPath | FLAGD_SERVER_CERT_PATH | tls cert path | string | null | rpc & in-process | +| deadlineMs | FLAGD_DEADLINE_MS | deadline for unary calls, and timeout for initialization | int | 500 | rpc & in-process & file | +| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | deadline for streaming calls, useful as an application-layer keepalive | int | 600000 | rpc & in-process | +| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | initial backoff for stream retry | int | 1000 | rpc & in-process | +| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 120000 | rpc & in-process | +| retryGracePeriod | FLAGD_RETRY_GRACE_PERIOD | period in seconds before provider moves from STALE to ERROR state | int | 5 | rpc & in-process & file | +| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | http 2 keepalive | long | 0 | rpc & in-process | +| selector | FLAGD_SOURCE_SELECTOR | expression to filter flags (e.g., `flagSetId=my-app`, `source=config.json`) | string | null | rpc & in-process | +| cache | FLAGD_CACHE | enable cache of static flags | string - `lru`, `disabled` | lru | rpc | +| maxCacheSize | FLAGD_MAX_CACHE_SIZE | max size of static flag cache | int | 1000 | rpc | +| providerId | FLAGD_PROVIDER_ID | A unique identifier for flagd(grpc client) initiating the request. | string | null | in-process | +| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | offline, file-based flag definitions, overrides host/port/targetUri | string | null | file | +| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | poll interval for reading offlineFlagSourcePath | int | 5000 | file | +| contextEnricher | - | sync-metadata to evaluation context mapping function | function | identity function | in-process | +| fatalStatusCodes | FLAGD_FATAL_STATUS_CODES | a list of gRPC status codes, which will cause streams to give up and put the provider in a PROVIDER_FATAL state | array | [] | rpc & in-process | ### Custom Name Resolution diff --git a/test-harness b/test-harness index 7d7d51848..b0057abde 160000 --- a/test-harness +++ b/test-harness @@ -1 +1 @@ -Subproject commit 7d7d51848a31805b4248b1d8e8a9f295554b1aee +Subproject commit b0057abde5d84272d6dd91f4737655c9d6cead15 From 8688bf5cdd9c4f7f32dcdfa66fb9b1f1143b91e5 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 14 Jan 2026 16:57:18 -0500 Subject: [PATCH 18/97] doc: correct default retryBackoffMaxMs value Corrected default value for retryBackoffMaxMs from 120000 to 12000. Signed-off-by: Todd Baert --- docs/reference/specifications/providers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index 6fe91d0be..9da4e014e 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -303,7 +303,7 @@ Below are the supported configuration parameters (note that not all apply to bot | deadlineMs | FLAGD_DEADLINE_MS | deadline for unary calls, and timeout for initialization | int | 500 | rpc & in-process & file | | streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | deadline for streaming calls, useful as an application-layer keepalive | int | 600000 | rpc & in-process | | retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | initial backoff for stream retry | int | 1000 | rpc & in-process | -| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 120000 | rpc & in-process | +| retryBackoffMaxMs | FLAGD_RETRY_BACKOFF_MAX_MS | maximum backoff for stream retry | int | 12000 | rpc & in-process | | retryGracePeriod | FLAGD_RETRY_GRACE_PERIOD | period in seconds before provider moves from STALE to ERROR state | int | 5 | rpc & in-process & file | | keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | http 2 keepalive | long | 0 | rpc & in-process | | selector | FLAGD_SOURCE_SELECTOR | expression to filter flags (e.g., `flagSetId=my-app`, `source=config.json`) | string | null | rpc & in-process | From 82a2ad3d7bef897245150ddb305c277edc74577f Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 19 Jan 2026 14:03:40 -0500 Subject: [PATCH 19/97] doc: clarify fatal init Signed-off-by: Todd Baert --- docs/reference/specifications/providers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index 9da4e014e..e31c3b4e7 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -146,7 +146,7 @@ The flagd gRPC retry policy is specified below: ## Fatal Status Codes -Providers accept an option for defining fatal gRPC status codes which, when received in the RPC or sync streams, transition the provider to the PROVIDER_FATAL state. +Providers accept an option for defining fatal gRPC status codes which, when received in the RPC or sync streams during initialization, transition the provider to the PROVIDER_FATAL state. This configuration is useful for situations wherein these codes indicate to a client that their configuration is invalid and must be changed (i.e., the error is non-transient). Examples for this include status codes such as `UNAUTHENTICATED` or `PERMISSION_DENIED`. From 33774c712c4ef771334fef748886cacaa290a018 Mon Sep 17 00:00:00 2001 From: m-olko Date: Tue, 27 Jan 2026 20:06:29 +0100 Subject: [PATCH 20/97] docs: update info that defaultVariant can be optional (#1851) ## This PR With [this Feature introduced](https://github.com/open-feature/flagd/issues/1646), the defaultVariant is no longer *required* property. This PR updates the documentation to match those changes. ### Related Issues Follow up on #1646 ### Notes No breaking changes, just update to documentation --------- Signed-off-by: Marcin Olko Signed-off-by: m-olko Signed-off-by: Todd Baert Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- docs/reference/flag-definitions.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/reference/flag-definitions.md b/docs/reference/flag-definitions.md index d6f4f0a28..0fe51fb40 100644 --- a/docs/reference/flag-definitions.md +++ b/docs/reference/flag-definitions.md @@ -122,9 +122,10 @@ Example of an invalid configuration: ### Default Variant -`defaultVariant` is a **required** property. -The value **must** match the name of one of the variants defined above. -The default variant is always used unless a targeting rule explicitly overrides it. +`defaultVariant` is an **optional** property. +If `defaultVariant` is a string, its value **must** match the name of one of the variants defined above. +The default variant is used unless a targeting rule explicitly overrides it. +If `defaultVariant` is omitted or null, flagd providers will revert to the code default for the flag in question if targeting is not defined or falls through. Example: @@ -147,6 +148,16 @@ Example: "defaultVariant": "red" ``` +Example of explicitly using the code default: + +```json +"variants": { + "on": true, + "off": false +}, +"defaultVariant": null +``` + Example of an invalid configuration: ```json @@ -172,6 +183,12 @@ One exception to the above is that rules may return `true` or `false` which will If a null value is returned by the targeting rule, the `defaultVariant` is used. This can be useful for conditionally "exiting" targeting rules and falling back to the default (in this case the returned reason will be `DEFAULT`). If an invalid variant is returned (not a string, `true`, or `false`, or a string that is not in the set of variants) the evaluation is considered erroneous. +If `defaultVariant` is not defined or is `null`, and no variant is resolved from `targeting`, flagd providers will revert to the code default. + +!!! note + + When `defaultVariant` is omitted, and no variant is resolved from a rule, providers default by behaving as if the flag does not exist (`reason=ERROR` and `error=FLAG_NOT_FOUND`). + This will be improved in upcoming versions, such that delegation to code default in this scenario will not be considered erroneous. See [Boolean Variant Shorthand](#boolean-variant-shorthand). From a86c593ccfffe4aedb6951bc214cef662e9aa11c Mon Sep 17 00:00:00 2001 From: Maks Date: Thu, 29 Jan 2026 17:34:07 +0100 Subject: [PATCH 21/97] chore(ADR): Update the status of Harden Hashing Consistency And Add Support For Non-string Attributes in Fractional Evaluation ADR to accepted (#1831) Update the status of the [ADR](https://github.com/open-feature/flagd/blob/main/docs/architecture-decisions/fractional-non-string-rand-units.md) to `accepted` --------- Signed-off-by: cupofcat Signed-off-by: Maks Osowski --- .../fractional-non-string-rand-units.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/architecture-decisions/fractional-non-string-rand-units.md b/docs/architecture-decisions/fractional-non-string-rand-units.md index 17690dfa7..12fe12ebc 100644 --- a/docs/architecture-decisions/fractional-non-string-rand-units.md +++ b/docs/architecture-decisions/fractional-non-string-rand-units.md @@ -1,9 +1,9 @@ --- # Valid statuses: draft | proposed | rejected | accepted | superseded -status: draft +status: accepted author: Maks Osowski (@cupofcat) created: 2025-08-21 -updated: 2025-09-02 +updated: 2025-12-03 --- # Harden Hashing Consistency And Add Support For Non-string Attributes in Fractional Evaluation From 48c53bc1758e9d34a38c20fbc5e442e940704bb8 Mon Sep 17 00:00:00 2001 From: lea konvalinka Date: Fri, 30 Jan 2026 21:09:18 +0100 Subject: [PATCH 22/97] docs(ADR): backfill context enrichment ADR in flagd (#1850) ## This PR - backfills the ADR on static and dynamic context enrichment ### Related Issues Closes https://github.com/open-feature/flagd/issues/1745 ### Notes If I missed anything, please point it out so I can add it! --------- Signed-off-by: Konvalinka Signed-off-by: Todd Baert Co-authored-by: Todd Baert Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../static-and-dynamic-context.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 docs/architecture-decisions/static-and-dynamic-context.md diff --git a/docs/architecture-decisions/static-and-dynamic-context.md b/docs/architecture-decisions/static-and-dynamic-context.md new file mode 100644 index 000000000..59109dcd5 --- /dev/null +++ b/docs/architecture-decisions/static-and-dynamic-context.md @@ -0,0 +1,63 @@ +--- +# Valid statuses: draft | proposed | rejected | accepted | superseded +status: accepted +author: @leakonvalinka +created: 2026-01-21 +updated: 2026-01-21 +--- + +# Static and Dynamic Context Enrichment in flagd + +This document retrospectively records the introduction of static context enrichment (`--context-value` or `-X`) and dynamic context enrichment (`--context-from-header` or `-H`) for flag evaluations in the flagd daemon. +It explains the purpose and basic use cases for both options and defines the merge priority if the same context item can be found in more than one provided context source. + +## Background + +Initially, evaluation context could only be provided in the request body. This required clients to include server-wide attributes (region, environment) with every request, even when these values never change during a flagd instance's lifetime. + +Additionally, useful context often exists in HTTP headers (set by API gateways or auth proxies) but couldn't be used for targeting without client-side extraction and forwarding. + +## Requirements + +* support HTTP header mapping in OFREP requests +* support HTTP header mapping in evaluation service v2 via connect +* clearly defined priority list for merging context values from multiple sources + +## Proposal + +### Allow definition of static context values at startup: `--context-value` or `-X` + +On startup, static context data can be provided in the form of concrete key-value pairs, which is then used as context in every evaluation. +This is aimed at attributes that do not change during a flagd instance’s lifetime (such as the server region or cloud provider), reducing effort on the client-side. +For example, `flagd start -X region=europe ...` adds a `region` attribute with value `europe` as a context to every evaluation. + +### Allow definition of header to context attribute mapping at startup: `--context-from-header` or `-H` + +On startup, specific request headers can be configured so that, for each incoming request, their values are automatically extracted and included as context attributes for the evaluation. +This is targeted at dynamic values that likely vary per request (like the email of the user making the request). +For example, `flagd start -H X-User-Email:userEmail ...` tells flagd to extract the value of the `X-User-Email` header from each incoming request and include it as the `userEmail` attribute in the evaluation context, if provided. + +### Merging + +In case the same context key can be found in more than one context source, this priority list defines which value takes precedence (from highest to lowest): + + 1. Dynamic context from request headers (`-H`) + 1. Static context from startup options (`-X`) + 1. Context provided in the evaluation request body + +This priority allows operators to enforce infrastructure-level context while still accepting client-provided values for other attributes. + +### Consequences + +* Good, because static context values reduce effort on the client-side for attributes that do not change often. +* Good, because this allows a more targeted way of providing context depending on whether the attribute is static or dynamic. + +### Timeline + +* Static context enrichment: The issue was created in October 2024, the final PR was merged in December 2024. +* Dynamic context enrichment: The issue was created in March 2025, the final PR was merged in June 2025. + +## More Information + +* [Static context enrichment Issue](https://github.com/open-feature/flagd/issues/1435) +* [Dynamic context enrichment Issue](https://github.com/open-feature/flagd/issues/1583) From 128003162bed41bd8fc02a6dd30377fcf48e91c9 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Fri, 30 Jan 2026 15:24:52 -0500 Subject: [PATCH 23/97] docs: clarify event stream reconnect Signed-off-by: Todd Baert --- docs/reference/specifications/providers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/specifications/providers.md b/docs/reference/specifications/providers.md index e31c3b4e7..7d7cbcb96 100644 --- a/docs/reference/specifications/providers.md +++ b/docs/reference/specifications/providers.md @@ -105,7 +105,7 @@ stateDiagram-v2 ### Stream Reconnection When either stream (sync or event) fails or completes, whether due to the associated deadline being exceeded, network error or any other cause, the provider attempts to re-establish the stream. -Both the RPC and sync streams will forever attempt to be re-established unless the stream response indicates a [fatal status code](#fatal-status-codes). +Both the event and sync streams will forever attempt to be re-established in cases of reconnection (no status codes are considered fatal after the initial connection, see: [fatal status codes](#fatal-status-codes)). This is distinct from the [gRPC retry-policy](#grpc-retry-policy), which automatically retries *all RPCs* (streams or otherwise) a limited number of times to make the provider resilient to transient errors. It's also distinct from the [gRPC layer 4 reconnection mechanism](https://grpc.github.io/grpc/core/md_doc_connection-backoff.html) which only reconnects the TCP connection, but not any streams. When the stream is reconnecting, providers transition to the [STALE](https://openfeature.dev/docs/reference/concepts/events/#provider_stale) state, and after `retryGracePeriod`, transition to the ERROR state, emitting the respective events during these transitions. From be5c94fc06f7cced8d6ee3701f59374a1f315fc3 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 3 Feb 2026 10:06:52 -0500 Subject: [PATCH 24/97] fix: case sensitivity in header context mapping (#1855) Fixes an issue that made header -> context mapping case-sensitive, because we were using direct access instead of `headers.Get`. Also reduces some duplication by extracting this logic, and adds test coverage. --------- Signed-off-by: Todd Baert --- docs/reference/flag-definitions.md | 6 +- .../service/flag-evaluation/context_utils.go | 36 ++++ .../flag-evaluation/context_utils_test.go | 182 ++++++++++++++++++ .../service/flag-evaluation/flag_evaluator.go | 16 +- .../flag-evaluation/flag_evaluator_v2_test.go | 8 +- .../service/flag-evaluation/ofrep/handler.go | 19 +- .../flag-evaluation/ofrep/handler_test.go | 44 +++++ 7 files changed, 274 insertions(+), 37 deletions(-) create mode 100644 flagd/pkg/service/flag-evaluation/context_utils.go create mode 100644 flagd/pkg/service/flag-evaluation/context_utils_test.go diff --git a/docs/reference/flag-definitions.md b/docs/reference/flag-definitions.md index 0fe51fb40..a796d99e2 100644 --- a/docs/reference/flag-definitions.md +++ b/docs/reference/flag-definitions.md @@ -299,9 +299,11 @@ The evaluation context can be accessed in targeting rules using the `var` operat | Retrieve property from the evaluation context or use a default | `#!json { "var": ["email", "noreply@example.com"] }` | | Retrieve a nested property from the evaluation context | `#!json { "var": "user.email" }` | -> For more information, see the `var` section in the [JsonLogic documentation](https://jsonlogic.com/operations.html#var). +See the [cheat sheet](./cheat-sheet.md#context-aware-evaluation) for practical examples of context-sensitive evaluations. For details on extracting values from context, see the `var` section in the [JsonLogic documentation](https://jsonlogic.com/operations.html#var). -See the [cheat sheet](./cheat-sheet.md#context-aware-evaluation) for practical examples of context-sensitive evaluation. +!!! tip + + flagd's evaluation engine is case-sensitive, including attribute extraction using the `var` operator. #### Conditions diff --git a/flagd/pkg/service/flag-evaluation/context_utils.go b/flagd/pkg/service/flag-evaluation/context_utils.go new file mode 100644 index 000000000..72d7c00ad --- /dev/null +++ b/flagd/pkg/service/flag-evaluation/context_utils.go @@ -0,0 +1,36 @@ +package service + +import ( + "net/http" +) + +// MergeContextsAndHeaders merges evaluation contexts with static context values and header-based context. +// highest priority > header-context-from-cli > static-context-from-cli > request-context > lowest priority +// Header names are matched case-insensitively according to HTTP specification. +func MergeContextsAndHeaders( + requestContext map[string]any, + staticContext map[string]any, + headers http.Header, + headerToContextKeyMappings map[string]string, +) map[string]any { + merged := make(map[string]any) + + // request-body/client context first (lowest priority) + for k, v := range requestContext { + merged[k] = v + } + + // static/config context (overrides request context) + for k, v := range staticContext { + merged[k] = v + } + + // header-derived context (highest priority) we use .Get which is case-insensitive + for headerName, contextKey := range headerToContextKeyMappings { + if value := headers.Get(headerName); value != "" { + merged[contextKey] = value + } + } + + return merged +} diff --git a/flagd/pkg/service/flag-evaluation/context_utils_test.go b/flagd/pkg/service/flag-evaluation/context_utils_test.go new file mode 100644 index 000000000..71d0f480e --- /dev/null +++ b/flagd/pkg/service/flag-evaluation/context_utils_test.go @@ -0,0 +1,182 @@ +package service + +import ( + "net/http" + "reflect" + "testing" +) + +const ( + headerXUserTier = "X-User-Tier" + headerXUserTierLowercase = "x-user-tier" + headerXUserEmailLowercase = "x-user-email" +) + +func TestMergeContextsWithHeaders(t *testing.T) { + type args struct { + requestContext map[string]any + staticContext map[string]any + headers http.Header + headerToContextKeyMappings map[string]string + } + + tests := []struct { + name string + args args + want map[string]any + }{ + { + name: "empty contexts and headers", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: http.Header{}, + headerToContextKeyMappings: map[string]string{}, + }, + want: map[string]any{}, + }, + { + name: "request context only", + args: args{ + requestContext: map[string]any{"k1": "v1"}, + staticContext: map[string]any{}, + headers: http.Header{}, + headerToContextKeyMappings: map[string]string{}, + }, + want: map[string]any{"k1": "v1"}, + }, + { + name: "static context overrides request context", + args: args{ + requestContext: map[string]any{"k1": "v1", "k2": "v2"}, + staticContext: map[string]any{"k2": "v22", "k3": "v3"}, + headers: http.Header{}, + headerToContextKeyMappings: map[string]string{}, + }, + want: map[string]any{"k1": "v1", "k2": "v22", "k3": "v3"}, + }, + { + name: "exact case match - canonical header with canonical mapping", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: func() http.Header { + h := http.Header{} + h.Set(headerXUserTier, "premium") + return h + }(), + headerToContextKeyMappings: map[string]string{headerXUserTier: "userTier"}, + }, + want: map[string]any{"userTier": "premium"}, + }, + { + name: "case mismatch - lowercase header mapping with canonical header", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: func() http.Header { + h := http.Header{} + h.Set(headerXUserTier, "premium") + return h + }(), + headerToContextKeyMappings: map[string]string{headerXUserTierLowercase: "userTier"}, + }, + want: map[string]any{"userTier": "premium"}, + }, + { + name: "case mismatch - canonical mapping with lowercase header", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: func() http.Header { + h := http.Header{} + h.Set(headerXUserTierLowercase, "premium") + return h + }(), + headerToContextKeyMappings: map[string]string{headerXUserTier: "userTier"}, + }, + want: map[string]any{"userTier": "premium"}, + }, + { + name: "multiple headers with mixed case", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: func() http.Header { + h := http.Header{} + h.Set(headerXUserTier, "premium") + h.Set(headerXUserEmailLowercase, "user@example.com") + h.Set("X-Request-ID", "req-123") + return h + }(), + headerToContextKeyMappings: map[string]string{ + headerXUserTierLowercase: "userTier", + headerXUserEmailLowercase: "userEmail", + "x-request-id": "requestId", + }, + }, + want: map[string]any{ + "userTier": "premium", + "userEmail": "user@example.com", + "requestId": "req-123", + }, + }, + { + name: "header context overrides static context", + args: args{ + requestContext: map[string]any{"k1": "v1"}, + staticContext: map[string]any{"k2": "v22"}, + headers: func() http.Header { + h := http.Header{} + h.Set("X-Override", "override-value") + return h + }(), + headerToContextKeyMappings: map[string]string{"X-Override": "k2"}, + }, + want: map[string]any{"k1": "v1", "k2": "override-value"}, + }, + { + name: "header not present - should not be in context", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: http.Header{}, + headerToContextKeyMappings: map[string]string{ + "X-Missing": "missingKey", + }, + }, + want: map[string]any{}, + }, + { + name: "empty header value - should not be added", + args: args{ + requestContext: map[string]any{}, + staticContext: map[string]any{}, + headers: func() http.Header { + h := http.Header{} + h.Set("X-Empty", "") + return h + }(), + headerToContextKeyMappings: map[string]string{ + "X-Empty": "emptyKey", + }, + }, + want: map[string]any{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := MergeContextsAndHeaders( + tt.args.requestContext, + tt.args.staticContext, + tt.args.headers, + tt.args.headerToContextKeyMappings, + ) + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("\ngot: %+v\nwant: %+v", got, tt.want) + } + }) + } +} diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator.go b/flagd/pkg/service/flag-evaluation/flag_evaluator.go index 58c1c3b80..ff376ebfb 100644 --- a/flagd/pkg/service/flag-evaluation/flag_evaluator.go +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator.go @@ -341,22 +341,8 @@ func (s *OldFlagEvaluationService) ResolveObject( return res, err } -// mergeContexts combines context values from headers, static context (from cli) and request context. -// highest priority > header-context-from-cli > static-context-from-cli > request-context > lowest priority func mergeContexts(reqCtx, configFlagsCtx map[string]any, headers http.Header, headerToContextKeyMappings map[string]string) map[string]any { - merged := make(map[string]any) - for k, v := range reqCtx { - merged[k] = v - } - for k, v := range configFlagsCtx { - merged[k] = v - } - for header, contextKey := range headerToContextKeyMappings { - if values, ok := headers[header]; ok { - merged[contextKey] = values[0] - } - } - return merged + return MergeContextsAndHeaders(reqCtx, configFlagsCtx, headers, headerToContextKeyMappings) } // resolve is a generic flag resolver diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go index 9a5788ab8..70dbf3bf6 100644 --- a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go @@ -1027,7 +1027,7 @@ func Test_mergeContexts(t *testing.T) { args: args{ clientContext: map[string]any{"k1": "v1", "k2": "v2"}, configContext: map[string]any{"k2": "v22", "k3": "v3"}, - headers: http.Header{"X-key": []string{"value"}, "X-token": []string{"token"}}, + headers: http.Header{"X-Key": []string{"value"}, "X-Token": []string{"token"}}, headerToContextKeyMappings: map[string]string{}, }, // static context should "win" @@ -1039,7 +1039,7 @@ func Test_mergeContexts(t *testing.T) { clientContext: map[string]any{"k1": "v1", "k2": "v2"}, configContext: map[string]any{"k2": "v22", "k3": "v3"}, headers: http.Header{}, - headerToContextKeyMappings: map[string]string{"X-key": "k2"}, + headerToContextKeyMappings: map[string]string{"X-Key": "k2"}, }, // static context should "win" want: map[string]any{"k1": "v1", "k2": "v22", "k3": "v3"}, @@ -1049,8 +1049,8 @@ func Test_mergeContexts(t *testing.T) { args: args{ clientContext: map[string]any{"k1": "v1", "k2": "v2"}, configContext: map[string]any{"k2": "v22", "k3": "v3"}, - headers: http.Header{"X-key": []string{"value"}, "X-token": []string{"token"}}, - headerToContextKeyMappings: map[string]string{"X-key": "k2"}, + headers: http.Header{"X-Key": []string{"value"}, "X-Token": []string{"token"}}, + headerToContextKeyMappings: map[string]string{"X-Key": "k2"}, }, // header context should "win" want: map[string]any{"k1": "v1", "k2": "value", "k3": "v3"}, diff --git a/flagd/pkg/service/flag-evaluation/ofrep/handler.go b/flagd/pkg/service/flag-evaluation/ofrep/handler.go index cbc8d435b..502b77373 100644 --- a/flagd/pkg/service/flag-evaluation/ofrep/handler.go +++ b/flagd/pkg/service/flag-evaluation/ofrep/handler.go @@ -14,6 +14,7 @@ import ( "github.com/open-feature/flagd/core/pkg/store" "github.com/open-feature/flagd/core/pkg/telemetry" "github.com/open-feature/flagd/flagd/pkg/service" + evalservice "github.com/open-feature/flagd/flagd/pkg/service/flag-evaluation" metricsmw "github.com/open-feature/flagd/flagd/pkg/service/middleware/metrics" "github.com/rs/xid" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" @@ -160,29 +161,15 @@ func extractOfrepRequest(req *http.Request) (ofrep.Request, error) { return request, nil } -// flagdContext returns combined context values from headers, static context (from cli) and request context. -// highest priority > header-context-from-cli > static-context-from-cli > request-context > lowest priority func flagdContext( log *logger.Logger, requestID string, request ofrep.Request, staticContextValues map[string]any, headers http.Header, headerToContextKeyMappings map[string]string, ) map[string]any { context := make(map[string]any) if res, ok := request.Context.(map[string]any); ok { - for k, v := range res { - context[k] = v - } + context = res } else { log.WarnWithID(requestID, "provided context does not comply with flagd, continuing ignoring the context") } - for k, v := range staticContextValues { - context[k] = v - } - - for header, contextKey := range headerToContextKeyMappings { - if values, ok := headers[header]; ok { - context[contextKey] = values[0] - } - } - - return context + return evalservice.MergeContextsAndHeaders(context, staticContextValues, headers, headerToContextKeyMappings) } diff --git a/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go b/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go index 2ef114d41..9621e55d7 100644 --- a/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go +++ b/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go @@ -290,3 +290,47 @@ func TestWriteJSONResponse(t *testing.T) { }) } } +func TestFlagdContextInvalidContextType(t *testing.T) { + log := logger.NewLogger(nil, false) + + result := flagdContext( + log, + "test-request-id", + ofrep.Request{Context: "not a map"}, // invalid: string instead of map + map[string]any{"staticKey": "staticValue"}, + http.Header{}, + map[string]string{}, + ) + + if val, exists := result["staticKey"]; !exists || val != "staticValue" { + t.Errorf("expected static context to be included even with invalid request context") + } +} + +func TestFlagdContextDelegatesContextMerging(t *testing.T) { + log := logger.NewLogger(nil, false) + + h := http.Header{} + h.Set("X-User-Tier", "premium") + + result := flagdContext( + log, + "test-request-id", + ofrep.Request{Context: map[string]any{"requestKey": "requestValue"}}, + map[string]any{"staticKey": "staticValue"}, + h, + map[string]string{"X-User-Tier": "userTier"}, + ) + + expected := map[string]any{ + "requestKey": "requestValue", + "staticKey": "staticValue", + "userTier": "premium", + } + + for k, v := range expected { + if result[k] != v { + t.Errorf("expected key '%s' to have value '%s', but got '%v'", k, v, result[k]) + } + } +} From 335af32b6f1087d624b77ffb7b50dea612ef234f Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun <11556013+alxckn@users.noreply.github.com> Date: Tue, 3 Feb 2026 19:01:35 +0100 Subject: [PATCH 25/97] fix: correct parameter order in histogram bucket configuration :warning: (#1859) # Fix HTTP Metrics Histogram Bucket Boundaries The HTTP request duration histogram was using incorrect bucket boundaries due to swapped parameters in the `getDurationView()` function calls. This caused the intended Prometheus default buckets to never be applied, falling back to OpenTelemetry's default buckets instead. The default OpenTelemetry buckets provide very coarse granularity for HTTP request latency: **Before (incorrect buckets - in seconds):** ``` [0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000] ``` **After (correct buckets - in seconds):** ``` [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] ``` ## Testing Added two new test cases: 1. `TestHTTPRequestDurationBuckets` - Validates HTTP request duration uses `prometheus.DefBuckets` 2. `TestHTTPResponseSizeBuckets` - Validates HTTP response size uses exponential buckets These tests verify that the custom bucket configuration is actually applied by: 1. Creating a metrics recorder 2. Recording sample data 3. Collecting the histogram metadata 4. Asserting bucket boundaries match expected values --------- Signed-off-by: Alexandre Chakroun Co-authored-by: Claude Sonnet 4.5 --- core/pkg/telemetry/metrics.go | 4 +- core/pkg/telemetry/metrics_test.go | 60 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/core/pkg/telemetry/metrics.go b/core/pkg/telemetry/metrics.go index 27aea5c01..05160c5ae 100644 --- a/core/pkg/telemetry/metrics.go +++ b/core/pkg/telemetry/metrics.go @@ -153,9 +153,9 @@ func NewOTelRecorder(exporter msdk.Reader, resource *resource.Resource, serviceN provider := msdk.NewMeterProvider( msdk.WithReader(exporter), // for the request duration metric we use the default bucket size which are tailored for response time in seconds - msdk.WithView(getDurationView(httpRequestDurationMetric, serviceName, prometheus.DefBuckets)), + msdk.WithView(getDurationView(serviceName, httpRequestDurationMetric, prometheus.DefBuckets)), // for response size we want 8 exponential bucket starting from 100 Bytes - msdk.WithView(getDurationView(httpResponseSizeMetric, serviceName, prometheus.ExponentialBuckets(100, 10, 8))), + msdk.WithView(getDurationView(serviceName, httpResponseSizeMetric, prometheus.ExponentialBuckets(100, 10, 8))), // set entity producing telemetry msdk.WithResource(resource), ) diff --git a/core/pkg/telemetry/metrics_test.go b/core/pkg/telemetry/metrics_test.go index 68af7a1e1..b5b4d3add 100644 --- a/core/pkg/telemetry/metrics_test.go +++ b/core/pkg/telemetry/metrics_test.go @@ -4,7 +4,9 @@ import ( "context" "fmt" "testing" + "time" + "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric" @@ -239,3 +241,61 @@ func TestNoopMetricsRecorder_Impressions(_ *testing.T) { no := NoopMetricsRecorder{} no.Impressions(context.TODO(), "", "", "") } + +// testHistogramBuckets is a helper function that tests histogram bucket configuration +func testHistogramBuckets(t *testing.T, metricName string, expectedBounds []float64, recordMetric func(rec *MetricsRecorder, attrs []attribute.KeyValue), assertMsg string) { + t.Helper() + const testSvcName = "testService" + exp := metric.NewManualReader() + rs := resource.NewWithAttributes("testSchema") + rec := NewOTelRecorder(exp, rs, testSvcName) + + attrs := []attribute.KeyValue{ + semconv.ServiceNameKey.String(testSvcName), + } + recordMetric(rec, attrs) + + var data metricdata.ResourceMetrics + err := exp.Collect(context.TODO(), &data) + require.NoError(t, err) + + require.Len(t, data.ScopeMetrics, 1) + scopeMetrics := data.ScopeMetrics[0] + require.Equal(t, testSvcName, scopeMetrics.Scope.Name) + + var foundHistogram bool + for _, m := range scopeMetrics.Metrics { + if m.Name == metricName { + histogram, ok := m.Data.(metricdata.Histogram[float64]) + require.True(t, ok, "Expected metric to be a Histogram") + + require.NotEmpty(t, histogram.DataPoints, "Expected at least one data point") + require.Equal(t, expectedBounds, histogram.DataPoints[0].Bounds, assertMsg) + foundHistogram = true + break + } + } + require.Truef(t, foundHistogram, "Expected to find %s histogram", metricName) +} + +func TestHTTPRequestDurationBuckets(t *testing.T) { + testHistogramBuckets(t, + httpRequestDurationMetric, + prometheus.DefBuckets, + func(rec *MetricsRecorder, attrs []attribute.KeyValue) { + rec.HTTPRequestDuration(context.TODO(), 100*time.Millisecond, attrs) + }, + "Expected histogram buckets to match prometheus.DefBuckets", + ) +} + +func TestHTTPResponseSizeBuckets(t *testing.T) { + testHistogramBuckets(t, + httpResponseSizeMetric, + prometheus.ExponentialBuckets(100, 10, 8), + func(rec *MetricsRecorder, attrs []attribute.KeyValue) { + rec.HTTPResponseSize(context.TODO(), 500, attrs) + }, + "Expected histogram buckets to match exponential buckets (100, 10, 8)", + ) +} From ff2b4a3819bd70ff803cd06e0278503a4ebedd3b Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Thu, 5 Feb 2026 15:16:26 -0500 Subject: [PATCH 26/97] docs(ADR): update support for explicit code default values in flagd configuration (#1706) ## This PR - Changes the code default implementation approach from error-based (`FLAG_NOT_FOUND`) to success-based (`DEFAULT` reason code) - Specifies need for `optional` fields in response messages to enable proper field presence detection - Code default usage now treated as successful evaluation rather than error condition - Removes false error metrics when code defaults are used - Documents the significant architectural change ### Notes This revision addresses a fundamental change in approach enabled by recent OFREP improvements (see [OFREP ADR 0006](https://github.com/open-feature/protocol/blob/main/service/adrs/0006-optional-value-for-code-defaults.md)). The key changes include: - Previously used `FLAG_NOT_FOUND` error responses - Now uses `DEFAULT` reason with omitted value fields - Added need for `optional` fields to support field presence detection - Reordered steps to prioritize schema changes and proper dependency flow The revised approach provides better semantics, accurate telemetry, and cleaner client-side handling while maintaining backward compatibility. ### Follow-up Tasks Implementation work will follow the updated implementation plan: 1. Protobuf schema updates (add `optional` fields) 2. JSON schema updates 3. Core flagd logic implementation 4. Provider updates for field presence detection 5. Comprehensive testing across all protocols ### How to test This is a documentation-only change to the ADR. No functional testing required at this stage. --------- Signed-off-by: Michael Beemer Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../support-code-default.md | 148 +++++++++++++----- 1 file changed, 107 insertions(+), 41 deletions(-) diff --git a/docs/architecture-decisions/support-code-default.md b/docs/architecture-decisions/support-code-default.md index b409fdf18..8518b86eb 100644 --- a/docs/architecture-decisions/support-code-default.md +++ b/docs/architecture-decisions/support-code-default.md @@ -1,8 +1,8 @@ --- status: accepted -author: @beeme1mr +author: Michael Beemer `@beeme1mr` created: 2025-06-06 -updated: 2025-06-20 +updated: 2025-08-08 --- # Support Explicit Code Default Values in flagd Configuration @@ -49,14 +49,17 @@ Related discussions and context can be found in the [OpenFeature specification]( We propose implementing **Option 1: Allow `null` as Default Variant**, potentially combined with **Option 2: Make Default Variant Optional** for maximum flexibility. -The implementation leverages field presence in evaluation responses across all protocols (in-process, RPC, and OFREP). When a flag configuration has `defaultVariant: null`, the evaluation response omits the value field entirely, which serves as a programmatic signal to the client to use its code-defined default value. +The implementation leverages field presence in evaluation responses across all protocols. +When a flag configuration has `defaultVariant: null`, the evaluation response omits the value field entirely and uses the "DEFAULT" reason code, which serves as a programmatic signal to the client to use its code-defined default value. This approach offers several key advantages: -1. **No Protocol Changes**: RPC and OFREP protocols remain unchanged -2. **Clear Semantics**: Omitted value field = "use your code default" -3. **Backward Compatible**: Existing clients and servers continue to work -4. **Universal Pattern**: Works consistently across all evaluation modes +1. **Semantically Correct**: Uses "DEFAULT" reason code which accurately represents the evaluation outcome +2. **Success Responses**: Treats code default usage as successful evaluation, not an error +3. **Clear Semantics**: Omitted value field = "use your code default" +4. **Backward Compatible**: Existing clients and servers continue to work +5. **Universal Pattern**: Works consistently across all evaluation modes +6. **Accurate Telemetry**: Metrics correctly reflect successful evaluations rather than false errors The absence of a value field provides an unambiguous signal that distinguishes between "the server evaluated to null/false/empty" (value field present) and "the server delegates to your code default" (value field absent). @@ -77,22 +80,57 @@ The absence of a value field provides an unambiguous signal that distinguishes b ``` 2. **Evaluation Behavior**: + - When flag has `defaultVariant: null` and targeting returns no match - - Server responds with reason set to reason "ERROR" and error code "FLAG_NOT_FOUND" - - Client detects this reason value field and uses its code-defined default - - This same pattern works across all evaluation modes + - Server responds with reason "DEFAULT" and omits value and variant fields + - Client detects the omitted fields and uses its code-defined default + - This pattern works consistently across all evaluation modes + +3. **Protobuf Schema Changes**: + + - Update response message definitions to use `optional` fields for `value` and `variant` + - This enables proper field presence detection for code default signaling + + Example protobuf changes: + + ```protobuf + message ResolveBooleanResponse { + // The response value, will be unset when deferring to code defaults + optional bool value = 1; + + // The reason for the given return value + string reason = 2; + + // The variant name, will be unset when deferring to code defaults + optional string variant = 3; + + // Metadata for this evaluation + google.protobuf.Struct metadata = 4; + } + ``` + +4. **Provider Implementation**: + + **RPC Providers**: -3. **Provider Implementation**: - - No changes to existing providers + - Providers must be updated to check field presence rather than just reading field values + + **In-Process Providers**: + + - Check if both the resolved variant (from targeting evaluation) AND the configured default variant are null/undefined + - When both conditions are true, use the application's code default value with reason "DEFAULT" and no variant ### Design Rationale -**Using "ERROR" reason**: We intentionally reuse the existing "ERROR" reason code rather than introducing a new one (like "CODE_DEFAULT"). This retains the current behavior of an disabled flag and allows for progressive enablement of a flag without unexpected variations in flag evaluation behavior. +**Using "DEFAULT" reason with omitted value fields**: We use the "DEFAULT" reason code to accurately represent that a default value is being used, combined with omitting the value and variant fields to signal code default deferral. This approach leverages recent OFREP improvements and requires updating protobuf definitions to use `optional` fields for proper field presence detection. Advantages of this approach: -- The "ERROR" reason is already used for cases where the flag is not found or misconfigured, so it aligns with the intent of using code defaults. -- This approach avoids introducing new reason codes that would require additional handling in providers and clients. +- **Accurate Semantics**: "DEFAULT" reason correctly represents the evaluation outcome +- **Proper Telemetry**: Evaluations are recorded as successful rather than errors +- **Clear Field Presence**: Optional fields provide unambiguous signaling across all protocols +- **Standards Aligned**: Leverages accepted patterns for optional values +- **Backward Compatible**: Existing clients continue to work while new clients can detect code defaults ### API changes @@ -118,15 +156,14 @@ flags: #### Single flag evaluation response -A single flag evaluation returns a `404` status code. +A single flag evaluation returns a `200` status code: ```json { "key": "my-feature", - "errorCode": "FLAG_NOT_FOUND", - // Optional error details - "errorDetails": "Targeting not matched, using code default", + "reason": "DEFAULT", "metadata": {} + // Note: No value field - indicates code default usage } ``` @@ -135,7 +172,12 @@ A single flag evaluation returns a `404` status code. ```json { "flags": [ - // Flag is omitted from bulk response + { + "key": "my-feature", + "reason": "DEFAULT", + "metadata": {} + // Note: No value field - indicates code default usage + } ] } ``` @@ -144,9 +186,9 @@ A single flag evaluation returns a `404` status code. ```protobuf { - "reason": "ERROR", - "errorCode": "FLAG_NOT_FOUND", + "reason": "DEFAULT", "metadata": {} + // Note: value and variant fields omitted to indicate code default } ``` @@ -157,20 +199,31 @@ A single flag evaluation returns a `404` status code. - Good, because it aligns flagd more closely with OpenFeature specification principles - Good, because it supports gradual flag rollout patterns more naturally - Good, because it provides the ability to delegate to whatever is defined in code -- Good, because it requires no changes to existing RPC or protocol signatures -- Good, because it uses established patterns (field presence) for clear semantics -- Good, because it maintains full backward compatibility +- Good, because it uses the "DEFAULT" reason code which accurately represents the evaluation outcome +- Good, because it treats code default usage as successful evaluation with proper telemetry +- Good, because telemetry can distinguish between configured defaults (variant present) and code defaults (variant absent) +- Good, because it uses a simple field presence pattern that works across all protocols +- Good, because it maintains backward compatibility for existing flag configurations +- Bad, because it requires protobuf schema changes to use `optional` fields - Bad, because it requires updates across multiple components (flagd, providers, testbed) - Bad, because it introduces a new concept that users need to understand -- Neutral, because existing configurations continue to work unchange +- Bad, because it creates a breaking change for older clients evaluating flags configured with `defaultVariant: null` (they would receive zero values instead of using code defaults) +- Bad, because providers must be updated to handle field presence detection +- Neutral, because existing configurations continue to work unchanged ### Implementation Plan -1. Update flagd-schemas with new JSON schema supporting null default variants -2. Update flagd-testbed with comprehensive test cases for all evaluation modes -3. Implement core logic in flagd to handle null defaults and omit value/variant fields -4. Update OpenFeature providers with the latest schema and test harness to ensure they handle the new behavior correctly -5. Documentation updates, migration guides, and playground examples to demonstrate the new configuration options +1. Update flagd protobuf schemas to use `optional` fields for `value` and `variant` in response messages +2. Update flagd-schemas with new JSON schema supporting null default variants +3. Update flagd-testbed with comprehensive test cases for all evaluation modes +4. Implement core logic in flagd to handle null defaults by conditionally omitting fields in responses +5. Update OpenFeature providers to check field presence rather than just reading field values +6. Regenerate protobuf client libraries for all supported languages with new optional field support +7. Release updated clients before configuring any flags with `defaultVariant: null` to avoid zero-value issues with older clients +8. Update provider documentation with field presence detection patterns for each language +9. Add backward compatibility testing to ensure existing clients continue to work +10. Update CI/CD pipelines to validate protobuf schema changes and field presence behavior +11. Documentation updates, migration guides, and playground examples to demonstrate the new configuration options ### Testing Considerations @@ -178,9 +231,12 @@ To ensure correct implementation across all components: 1. **Provider Tests**: Each component (flagd, providers) must have unit tests verifying the handling of `null` as a default variant 2. **Integration Tests**: End-to-end tests across different language combinations (e.g., Go flagd with Java provider) -3. **OFREP Tests**: Verify JSON responses correctly omits flags with a `null` default variant -4. **Backward Compatibility Tests**: Ensure old providers handle new responses gracefully -5. **Consistency Tests**: Verify identical behavior across in-process, RPC, and OFREP modes +3. **Schema Tests**: Verify protobuf schemas correctly define `optional` fields and generate appropriate client code +4. **Field Presence Tests**: Verify that providers can correctly detect field presence vs. absence across all languages +5. **OFREP Tests**: Verify JSON responses correctly omit value fields for code default scenarios +6. **RPC Tests**: Verify protobuf responses correctly omit optional fields for code default scenarios +7. **Backward Compatibility Tests**: Ensure old providers handle new responses gracefully +8. **Consistency Tests**: Verify consistent field presence behavior across all evaluation modes ### Open questions @@ -190,18 +246,27 @@ To ensure correct implementation across all components: - Yes, we'll support both `null` and absent fields to maximize flexibility. An absent `defaultVariant` will be the equivalent of `null`. - What migration path should we recommend for users currently using workarounds? - Update the flag configurations to use `defaultVariant: null` and remove any misconfigured rulesets that force code defaults. +- How should we handle the breaking change for older clients evaluating `defaultVariant: null` flags? + - Older clients built without optional protobuf fields will receive zero values (false, 0, "") instead of using code defaults. This requires coordinated rollout: (1) Update and deploy all clients with new protobuf definitions, (2) Only then configure flags with `defaultVariant: null`. Alternatively, maintain separate flag configurations during transition period. - Should this feature be gated behind a configuration flag during initial rollout? - We'll avoid public facing documentation until the feature is fully implemented and tested. - How do we ensure consistent behavior across all provider implementations? - Gherkin tests will be added to the flagd testbed to ensure all providers handle the new behavior consistently. -- Should providers validate that the reason is "DEFAULT" when value is omitted, or accept any omitted value as delegation? - - Providers should accept any omitted value as delegation. -- How do we handle edge cases where network protocols might strip empty fields? - - It would behaving as expected, as the absence of fields is the intended signal. +- How do OFREP providers detect and handle responses with omitted value fields? + - Providers should check for the absence of the `value` field in successful responses and treat it as a signal to use code defaults. +- Should we maintain backward compatibility for providers that don't yet support omitted value fields? + - Yes, older providers will continue to work but may not benefit from the code default deferral feature until updated. - When the client uses its code default after receiving a delegation response, what variant should be reported in telemetry/analytics? - - The variant will be omitted, indicating that the code default was used. -- Should we add explicit proto comments documenting the field omission behavior? - - Leave this to the implementers, but it would be beneficial to add comments in the proto files to clarify this behavior for future maintainers. + - No variant will be reported since the variant is unknown when using code defaults. The absence of a variant in telemetry indicates that a code default was used. +- Should we add explicit documentation about the field omission behavior? + - Yes, clear documentation should explain how omitted value fields signal code default deferral for implementers. + +## Revision History + +| Date | Author | Change Summary | +| ---------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 2025-06-06 | Michael Beemer | Initial ADR creation with error-based approach | +| 2025-08-08 | Michael Beemer | **Major revision**: Changed from error-based (`FLAG_NOT_FOUND`) to success-based approach (`DEFAULT` reason) following OFREP improvements that enable optional value fields | ## More Information @@ -209,3 +274,4 @@ To ensure correct implementation across all components: - [flagd Flag Definitions Reference](https://flagd.dev/reference/flag-definitions/) - [flagd JSON Schema Repository](https://github.com/open-feature/flagd-schemas) - [flagd Testbed](https://github.com/open-feature/flagd-testbed) +- [OFREP ADR: Optional value field for code default deferral](https://github.com/open-feature/protocol/blob/main/service/adrs/0006-optional-value-for-code-defaults.md) From 88ffcb33327bc9f2c4e7a113195b9242546c8bea Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Fri, 6 Feb 2026 08:01:29 -0500 Subject: [PATCH 27/97] docs(ADR): extends the fractional operator to support up to .001% distributions (#1800) ## This PR - extends the fractional operator to support up to .001% distributions. - defines the expected behavior of several edge cases. ### Notes Addresses a limitation of the current fractional operator that prevents sub-percent traffic allocations. In high-throughput services, 1% of traffic may represent a significant number of requests. ### Related issues https://github.com/open-feature/flagd/issues/1788 --------- Signed-off-by: Michael Beemer Signed-off-by: Todd Baert Co-authored-by: Todd Baert --- .../high-precision-fractional-bucketing.md | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 docs/architecture-decisions/high-precision-fractional-bucketing.md diff --git a/docs/architecture-decisions/high-precision-fractional-bucketing.md b/docs/architecture-decisions/high-precision-fractional-bucketing.md new file mode 100644 index 000000000..724168818 --- /dev/null +++ b/docs/architecture-decisions/high-precision-fractional-bucketing.md @@ -0,0 +1,187 @@ +--- +# Valid statuses: draft | proposed | rejected | accepted | superseded +status: draft +author: Michael Beemer +created: 2025-09-10 +updated: 2026-01-29 +--- + +# High-Precision Fractional Bucketing for Sub-Percent Traffic Allocation + +This ADR proposes enhancing the fractional operation to support high-precision traffic allocation down to 0.001% granularity by increasing the internal bucket count from 100 to 100,000 while maintaining the existing weight-based API. + +## Background + +The current fractional operation in flagd uses a 100-bucket system that maps hash values to percentages in the range [0, 100]. +This approach works well for most use cases but has significant limitations in high-throughput environments where precise sub-percent traffic allocation is required. + +Currently, the smallest allocation possible is 1%, which is insufficient for: + +- Gradual rollouts in ultra-high-traffic systems where 1% could represent millions of users +- A/B testing scenarios requiring precise control over small experimental groups +- Canary deployments where operators need to start with very small traffic percentages (e.g., 0.1% or 0.01%) + +The current implementation in `fractional.go` calculates bucket assignment using: + +```go +bucket := hashRatio * 100 // in range [0, 100] +``` + +This limits granularity to 1% increments, making it impossible to achieve the precision required for sophisticated traffic management strategies. + +## Requirements + +- Support traffic allocation precision down to 0.001% (3 decimal places) +- Maintain backwards compatibility with existing weight-based API +- Preserve deterministic bucketing behavior (same hash input always produces same bucket) +- Ensure consistent bucket assignment across different programming languages +- Support weight values up to a reasonable maximum that works across multiple languages +- Maintain current performance characteristics +- Prevent users from being moved between buckets when only distribution percentages change +- Guarantee that any variant with weight > 0 receives some traffic allocation +- Handle edge cases gracefully without silent failures +- Validate weight configurations and provide clear error messages for invalid inputs + +## Considered Options + +- **Option 1: 10,000 buckets (0.01% precision)** - 1 in every 10,000 users, better but still not sufficient for many high-throughput use cases +- **Option 2: 100,000 buckets (0.001% precision)** - 1 in every 100,000 users, meets most high-precision needs +- **Option 3: 1,000,000 buckets (0.0001% precision)** - 1 in every 1,000,000 users, likely overkill and could impact performance +- **Option 4 (Favored): Max 32-bit signed integer buckets** - Use `math.MaxInt32` (2,147,483,647) as the maximum allowed weight sum. This naturally sidesteps minimum allocation guarantees and excess bucket handling + +## Proposal: Max Int32 Weight Sum (Favored) + +> **Amendment (2026-01-29):** This alternative is now favored over the original 100,000-bucket proposal. + +### Rationale + +After experimentation comparing static vs dynamic bucket sizes, and considering implementation complexity, a simpler approach emerged: use the maximum 32-bit signed integer value (`math.MaxInt32` = 2,147,483,647) as the maximum allowed weight sum. + +This value ensures cross-language compatibility. +The bucket calculation requires multiplying a 32-bit hash by the total weight, producing a 64-bit intermediate product. +The max product (`MaxUint32 × MaxInt32` = 9.22 × 10¹⁸) fits within Java's signed `long` with ~6 billion headroom. Java is the limiting factor — using `MaxUint32` for the weight sum would overflow `long`. +JavaScript's `Number` type cannot safely represent the max product, so `BigInt` is required. See [Cross-Language Implementation Notes](#cross-language-implementation-notes) for details. + +### Constraints + +- The sum of all variant weights must not exceed `math.MaxInt32` (2,147,483,647) +- Weights must be defined as integers + +### Advantages + +Since the total weight sum cannot exceed `math.MaxInt32`, any variant with a weight of at least 1 is guaranteed at least 1 bucket. This **naturally sidesteps** the need for: + +- **Minimum Allocation Guarantee** (as described above): A weight of 1 out of any valid total will always yield at least 1 bucket—no special handling required +- **Excess Bucket Management**: Without minimum allocation adjustments, bucket totals don't exceed the bucket count + +### Simplified Implementation + +This implementation is designed to be compatible with the "Harden Hashing" ADR, accepting a pre-computed hash value rather than performing string hashing internally. This decouples fractional bucketing from the hashing strategy. + +```go +const maxWeightSum = math.MaxInt32 // 2,147,483,647 + +// distributeValue accepts the hash calculated by the "Harden Hashing" ADR logic. +// It relies purely on integer math, avoiding floating-point precision issues. +// Note: hashValue is uint32 (full 32-bit hash range), while weights are int32 +// (max sum of MaxInt32 for cross-language compatibility). +func distributeValue(hashValue uint32, feDistribution *fractionalEvaluationDistribution) string { + // 0. Validation: Handle empty distribution + if feDistribution.totalWeight == 0 { + return "" + } + + // 1. Use the hash provided 32-bit hash + + // 2. Projection: Map 32-bit hash to [0, totalWeight) + // We cast to uint64 to ensure the multiplication does not overflow. + // Shifting right by 32 bits is mathematically equivalent to dividing by 2^32. + // This logic is safe across major languages because it relies on fundamental + // binary operations. + bucket := (uint64(hashValue) * uint64(feDistribution.totalWeight)) >> 32 + + // 3. Selection: Find which variant range the bucket falls into + var rangeEnd uint64 = 0 + for _, variant := range feDistribution.weightedVariants { + rangeEnd += uint64(variant.weight) // this would be a Java long, or JS BigInt - needs to handle max product: 9.223372030 × 10^18 (9,223,372,030,412,324,865) + if bucket < rangeEnd { + return variant.variant + } + } + + // Unreachable given strict validation of weights (integers, sum <= MaxInt32) + return "" +} +``` + +> **Note:** This implementation uses pure integer arithmetic to avoid floating-point precision issues entirely. +> The expression `(uint64(hashValue) * uint64(totalWeight)) >> 32` is mathematically equivalent to `(hashValue / 2^32) * totalWeight`, but performed in integer space. The Go code uses `uint64`, but each language uses its own 64-bit type (e.g., Java uses `long`). +> The `MaxInt32` weight constraint ensures the intermediate product fits within Java's more limited signed `long` range, while Go's `uint64` handles it with additional headroom. +> The right-shift by 32 bits provides exact division by 2^32. This approach is portable across all major languages since it relies only on fundamental binary operations. + +### Cross-Language Implementation Notes + +MurmurHash3-32 always produces a 32-bit value, but languages differ in how they represent it. The algorithm requires: + +1. Treating the hash as an **unsigned** 32-bit integer +2. Performing the multiplication in a 64-bit integer type +3. The `MaxInt32` weight constraint ensures the product fits in Java's signed `long` (the most restrictive common 64-bit type) + +| Language | Hash Type | Conversion to Unsigned | 64-bit Multiply | Right-Shift | +| -------------- | -------------- | --------------------------------- | --------------- | ------------------- | +| **Go** | `uint32` | None needed | `uint64(hash)` | `>> 32` | +| **Java** | `int` (signed) | `hash & 0xFFFFFFFFL` | Use `long` | `>>> 32` (unsigned) | +| **JavaScript** | `Number` | `BigInt(hash)` | Use `BigInt` | `>> 32n` | +| **Python** | `int` | None needed (arbitrary precision) | Native | `>> 32` | +| **C/C++** | `uint32_t` | None needed | `(uint64_t)` | `>> 32` | +| **C#/.NET** | `uint` | None needed | `(ulong)` | `>> 32` | + +**Java example:** + +```java +int hash = murmur3_32(value); // signed int +long hashUnsigned = hash & 0xFFFFFFFFL; // treat as unsigned +long bucket = (hashUnsigned * totalWeight) >>> 32; // unsigned right-shift +``` + +**JavaScript example:** + +```javascript +const hash = murmur3_32(value); // Number +const bucket = (BigInt(hash) * BigInt(totalWeight)) >> 32n; +``` + +### API changes + +No API changes are required. The existing fractional operation syntax remains unchanged: + +```yaml +# Constraint: The sum of all variant weights must not exceed math.MaxInt32 (2,147,483,647). +# Constraint: Weights must be defined as Integers (can be enforced by JSON schema). +"fractional": [ + { "cat": [{ "var": "$flagd.flagKey" }, { "var": "email" }] }, + ["red", 50], + ["blue", 30], + ["green", 20] +] +``` + +### Benefits Over Original Proposal + +- **Simpler**: No minimum allocation guarantee logic needed +- **No minimum allocation guarantee needed**: With smaller fixed bucket counts, a configuration like `["variant-a", 1], ["variant-b", 1000000]` could round variant-a to 0 buckets (0% traffic). Special handling was needed to guarantee at least 1 bucket. With the integer math approach, any weight ≥1 naturally gets proportional traffic. +- **No excess bucket handling**: With fixed bucket counts (100, 10,000, 100,000), minimum allocation adjustments could cause the total allocated buckets to exceed the bucket count, requiring complex logic to redistribute the excess. With integer math, allocations naturally sum to the total weight. +- **Same validation**: Weight sum validation against `math.MaxInt32` remains unchanged +- **Backwards compatible**: Existing configurations continue to work +- **Effectively infinite precision**: Precision limited only by the total weight sum (up to ~0.00000005%) +- **~25-35% less user reassignment**: Experimental testing showed reduced "thrashing" compared to purely dynamic bucket sizes when configurations change + +### Consequences + +- Good, because implementation is significantly simpler +- Good, because it eliminates surprising edge-case behaviors (minimum allocation, excess handling) +- Good, because validation logic remains the same +- Good, because it provides effectively unlimited precision for practical use cases +- Good, because experimental testing showed less user reassignment than dynamic alternatives +- Bad, because it represents a behavioral breaking change for existing configurations (just the bucket assignment, same as original proposal) +- Neutral, performance is comparable—division by large 32-bit values is not meaningfully slower From a58a7076ac4aef66a10dee7a40aa2ee4b53c7169 Mon Sep 17 00:00:00 2001 From: lea konvalinka Date: Mon, 9 Feb 2026 14:48:12 +0100 Subject: [PATCH 28/97] fix: Enhance error logs in store's Watch func (#1865) ## This PR - improves errror logs in the store's Watch function ### Related Issues https://github.com/open-feature/flagd/issues/1863 --------- Signed-off-by: Konvalinka Signed-off-by: lea konvalinka Co-authored-by: Todd Baert --- core/pkg/store/query.go | 10 ++++++++++ core/pkg/store/store.go | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/pkg/store/query.go b/core/pkg/store/query.go index 17968fd83..f72a3a25e 100644 --- a/core/pkg/store/query.go +++ b/core/pkg/store/query.go @@ -1,6 +1,7 @@ package store import ( + "fmt" "maps" "sort" "strings" @@ -133,3 +134,12 @@ func (s *Selector) ToMetadata() model.Metadata { } return meta } + +func (s *Selector) ToLogString() string { + if s != nil && len(s.indexMap) == 1 { + for k, v := range s.indexMap { + return fmt.Sprintf("'%s=%s'", k, v) + } + } + return "" +} diff --git a/core/pkg/store/store.go b/core/pkg/store/store.go index ee25d9910..baad3892c 100644 --- a/core/pkg/store/store.go +++ b/core/pkg/store/store.go @@ -2,6 +2,7 @@ package store import ( "context" + "errors" "fmt" "slices" "sort" @@ -9,6 +10,7 @@ import ( "github.com/hashicorp/go-memdb" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" + "go.uber.org/zap" ) var noValidatedSources = []string{} @@ -313,7 +315,7 @@ func (s *Store) Watch(ctx context.Context, selector *Selector, watcher chan<- Fl ws := memdb.NewWatchSet() it, err := s.selectOrAll(selector) if err != nil { - s.logger.Error(fmt.Sprintf("error watching flags: %v", err)) + s.logger.WithFields(zap.String("selector", selector.ToLogString()), zap.Error(err)).Error("error getting flags") close(watcher) return } @@ -326,7 +328,11 @@ func (s *Store) Watch(ctx context.Context, selector *Selector, watcher chan<- Fl } if err = ws.WatchCtx(ctx); err != nil { - s.logger.Error(fmt.Sprintf("error watching flags: %v", err)) + if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) { + s.logger.WithFields(zap.String("selector", selector.ToLogString()), zap.Error(err)).Debug("context cancellation while watching flags") + } else { + s.logger.WithFields(zap.String("selector", selector.ToLogString()), zap.Error(err)).Error("context error watching flags") + } close(watcher) return } From 47f904b3a5a5a6e4389de6201bef3c15158dbc97 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 13:02:21 -0500 Subject: [PATCH 29/97] chore: release main (#1860) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.13.3 ## [0.13.3](https://github.com/open-feature/flagd/compare/flagd/v0.13.2...flagd/v0.13.3) (2026-02-09) ### 🐛 Bug Fixes * case sensitivity in header context mapping ([#1855](https://github.com/open-feature/flagd/issues/1855)) ([be5c94f](https://github.com/open-feature/flagd/commit/be5c94fc06f7cced8d6ee3701f59374a1f315fc3))
core: 0.13.3 ## [0.13.3](https://github.com/open-feature/flagd/compare/core/v0.13.2...core/v0.13.3) (2026-02-09) ### 🐛 Bug Fixes * correct parameter order in histogram bucket configuration :warning: ([#1859](https://github.com/open-feature/flagd/issues/1859)) ([335af32](https://github.com/open-feature/flagd/commit/335af32b6f1087d624b77ffb7b50dea612ef234f)) * Enhance error logs in store's Watch func ([#1865](https://github.com/open-feature/flagd/issues/1865)) ([a58a707](https://github.com/open-feature/flagd/commit/a58a7076ac4aef66a10dee7a40aa2ee4b53c7169))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 4 ++-- core/CHANGELOG.md | 8 ++++++++ flagd/CHANGELOG.md | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3de5749e5..74ed29f3e 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.13.2", + "flagd": "0.13.3", "flagd-proxy": "0.8.3", - "core": "0.13.2" + "core": "0.13.3" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 093c28312..07efad5f6 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.13.3](https://github.com/open-feature/flagd/compare/core/v0.13.2...core/v0.13.3) (2026-02-09) + + +### 🐛 Bug Fixes + +* correct parameter order in histogram bucket configuration :warning: ([#1859](https://github.com/open-feature/flagd/issues/1859)) ([335af32](https://github.com/open-feature/flagd/commit/335af32b6f1087d624b77ffb7b50dea612ef234f)) +* Enhance error logs in store's Watch func ([#1865](https://github.com/open-feature/flagd/issues/1865)) ([a58a707](https://github.com/open-feature/flagd/commit/a58a7076ac4aef66a10dee7a40aa2ee4b53c7169)) + ## [0.13.2](https://github.com/open-feature/flagd/compare/core/v0.13.1...core/v0.13.2) (2026-01-09) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 0c617551e..ba300937b 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.13.3](https://github.com/open-feature/flagd/compare/flagd/v0.13.2...flagd/v0.13.3) (2026-02-09) + + +### 🐛 Bug Fixes + +* case sensitivity in header context mapping ([#1855](https://github.com/open-feature/flagd/issues/1855)) ([be5c94f](https://github.com/open-feature/flagd/commit/be5c94fc06f7cced8d6ee3701f59374a1f315fc3)) + ## [0.13.2](https://github.com/open-feature/flagd/compare/flagd/v0.13.1...flagd/v0.13.2) (2026-01-09) From 08faf863e2608477290b4540687815bbabe2774f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:35:36 +0000 Subject: [PATCH 30/97] fix(security): update module go.opentelemetry.io/otel/sdk to v1.40.0 [security] (#1883) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > ℹ️ **Note** > > This PR body was truncated due to platform limits. This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [go.opentelemetry.io/otel/sdk](https://redirect.github.com/open-telemetry/opentelemetry-go) | `v1.38.0` → `v1.40.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fsdk/v1.40.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fsdk/v1.38.0/v1.40.0?slim=true) | ### GitHub Vulnerability Alerts #### [CVE-2026-24051](https://redirect.github.com/open-telemetry/opentelemetry-go/security/advisories/GHSA-9h8m-3fm2-qjrq) ### Impact The OpenTelemetry Go SDK in version `v1.20.0`-`1.39.0` is vulnerable to Path Hijacking (Untrusted Search Paths) on macOS/Darwin systems. The resource detection code in `sdk/resource/host_id.go` executes the `ioreg` system command using a search path. An attacker with the ability to locally modify the PATH environment variable can achieve Arbitrary Code Execution (ACE) within the context of the application. ### Patches This has been patched in [d45961b](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/d45961bcda453fcbdb6469c22d6e88a1f9970a53), which was released with `v1.40.0`. ### References - [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html) --- ### Release Notes
open-telemetry/opentelemetry-go (go.opentelemetry.io/otel/sdk) ### [`v1.40.0`](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...v1.40.0) [Compare Source](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...v1.40.0) ### [`v1.39.0`](https://redirect.github.com/open-telemetry/opentelemetry-go/releases/tag/v1.39.0) [Compare Source](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.38.0...v1.39.0) #### Overview ##### Added - Greatly reduce the cost of recording metrics in `go.opentelemetry.io/otel/sdk/metric` using hashing for map keys. ([#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7175)) - Add `WithInstrumentationAttributeSet` option to `go.opentelemetry.io/otel/log`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/trace` packages. This provides a concurrent-safe and performant alternative to `WithInstrumentationAttributes` by accepting a pre-constructed `attribute.Set`. ([#​7287](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7287)) - Add experimental observability for the Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus`. Check the `go.opentelemetry.io/otel/exporters/prometheus/internal/x` package documentation for more information. ([#​7345](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7345)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. ([#​7353](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7353)) - Add temporality selector functions `DeltaTemporalitySelector`, `CumulativeTemporalitySelector`, `LowMemoryTemporalitySelector` to `go.opentelemetry.io/otel/sdk/metric`. ([#​7434](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7434)) - Add experimental observability metrics for simple log processor in `go.opentelemetry.io/otel/sdk/log`. ([#​7548](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7548)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7459](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7459)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. ([#​7486](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7486)) - Add experimental observability metrics for simple span processor in `go.opentelemetry.io/otel/sdk/trace`. ([#​7374](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7374)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7512](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7512)) - Add experimental observability metrics for manual reader in `go.opentelemetry.io/otel/sdk/metric`. ([#​7524](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7524)) - Add experimental observability metrics for periodic reader in `go.opentelemetry.io/otel/sdk/metric`. ([#​7571](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7571)) - Support `OTEL_EXPORTER_OTLP_LOGS_INSECURE` and `OTEL_EXPORTER_OTLP_INSECURE` environmental variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7608](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7608)) - Add `Enabled` method to the `Processor` interface in `go.opentelemetry.io/otel/sdk/log`. All `Processor` implementations now include an `Enabled` method. ([#​7639](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7639)) - The `go.opentelemetry.io/otel/semconv/v1.38.0` package. The package contains semantic conventions from the `v1.38.0` version of the OpenTelemetry Semantic Conventions. See the [migration documentation](./semconv/v1.38.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.37.0.`([#​7648](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7648)) ##### Changed - `Distinct` in `go.opentelemetry.io/otel/attribute` is no longer guaranteed to uniquely identify an attribute set. Collisions between `Distinct` values for different Sets are possible with extremely high cardinality (billions of series per instrument), but are highly unlikely. ([#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7175)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/trace` synchronously de-duplicates the passed attributes instead of delegating it to the returned `TracerOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/meter` synchronously de-duplicates the passed attributes instead of delegating it to the returned `MeterOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/log` synchronously de-duplicates the passed attributes instead of delegating it to the returned `LoggerOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - Rename the `OTEL_GO_X_SELF_OBSERVABILITY` environment variable to `OTEL_GO_X_OBSERVABILITY` in `go.opentelemetry.io/otel/sdk/trace`, `go.opentelemetry.io/otel/sdk/log`, and `go.opentelemetry.io/otel/exporters/stdout/stdouttrace`. ([#​7302](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7302)) - Improve performance of histogram `Record` in `go.opentelemetry.io/otel/sdk/metric` when min and max are disabled using `NoMinMax`. ([#​7306](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7306)) - Improve error handling for dropped data during translation by using `prometheus.NewInvalidMetric` in `go.opentelemetry.io/otel/exporters/prometheus`. ⚠️ **Breaking Change:** Previously, these cases were only logged and scrapes succeeded. Now, when translation would drop data (e.g., invalid label/value), the exporter emits a `NewInvalidMetric`, and Prometheus scrapes **fail with HTTP 500** by default. To preserve the prior behavior (scrapes succeed while errors are logged), configure your Prometheus HTTP handler with: `promhttp.HandlerOpts{ ErrorHandling: promhttp.ContinueOnError }`. ([#​7363](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7363)) - Replace fnv hash with xxhash in `go.opentelemetry.io/otel/attribute` for better performance. ([#​7371](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7371)) - The default `TranslationStrategy` in `go.opentelemetry.io/exporters/prometheus` is changed from `otlptranslator.NoUTF8EscapingWithSuffixes` to `otlptranslator.UnderscoreEscapingWithSuffixes`. ([#​7421](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7421)) - Improve performance of concurrent measurements in `go.opentelemetry.io/otel/sdk/metric`. ([#​7427](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7427)) - Include W3C TraceFlags (bits 0–7) in the OTLP `Span.Flags` field in `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracehttp` and `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7438](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7438)) - The `ErrorType` function in `go.opentelemetry.io/otel/semconv/v1.37.0` now handles custom error types. If an error implements an `ErrorType() string` method, the return value of that method will be used as the error type. ([#​7442](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7442)) ##### Fixed - Fix `WithInstrumentationAttributes` options in `go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/log` to properly merge attributes when passed multiple times instead of replacing them. Attributes with duplicate keys will use the last value passed. ([#​7300](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7300)) - The equality of `attribute.Set` when using the `Equal` method is not affected by the user overriding the empty set pointed to by `attribute.EmptySet` in `go.opentelemetry.io/otel/attribute`. ([#​7357](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7357)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Fix `AddAttributes`, `SetAttributes`, `SetBody` on `Record` in `go.opentelemetry.io/otel/sdk/log` to not mutate input. ([#​7403](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7403)) - Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.37.0`. ([#​7655](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7655)) - Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.36.0`. ([#​7656](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7656)) ##### Removed - Drop support for \[Go 1.23]. ([#​7274](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7274)) - Remove the `FilterProcessor` interface in `go.opentelemetry.io/otel/sdk/log`. The `Enabled` method has been added to the `Processor` interface instead. All `Processor` implementations must now implement the `Enabled` method. Custom processors that do not filter records can implement `Enabled` to return `true`. ([#​7639](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7639)) #### What's Changed - Drop support for Go 1.23 by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7274](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7274) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.40.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7275](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7275) - chore(deps): update module github.com/securego/gosec/v2 to v2.22.8 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7276](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7276) - fix(deps): update module github.com/golangci/golangci-lint/v2 to v2.4.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7277](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7277) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7188](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7188) - fix(deps): update module github.com/opentracing-contrib/go-grpc to v0.1.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7281](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7281) - fix(deps): update googleapis to [`ef028d9`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/ef028d9) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7279](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7279) - chore(deps): update module github.com/rogpeppe/go-internal to v1.14.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7283](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7283) - chore(deps): update module github.com/spf13/pflag to v1.0.9 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7282](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7282) - fix(deps): update github.com/opentracing-contrib/go-grpc/test digest to [`0261db7`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/0261db7) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7278](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7278) - Fix missing link in changelog by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7273](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7273) - chore(deps): update module github.com/spf13/cobra to v1.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7285](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7285) - chore(deps): update github/codeql-action action to v3.30.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7284](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7284) - chore(deps): update module github.com/spf13/cobra to v1.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7286](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7286) - Add tracetest example for testing instrumentation by [@​adity1raut](https://redirect.github.com/adity1raut) in [#​7107](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7107) - Fix schema urls by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7288](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7288) - chore(deps): update module github.com/spf13/pflag to v1.0.10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7291](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7291) - chore(deps): update benchmark-action/github-action-benchmark action to v1.20.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7293](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7293) - chore(deps): update module github.com/ghostiam/protogetter to v0.3.16 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7289](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7289) - chore(deps): update module github.com/golangci/go-printf-func-name to v0.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7290](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7290) - chore(deps): update module mvdan.cc/gofumpt to v0.9.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7292](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7292) - fix(deps): update module go.opentelemetry.io/proto/otlp to v1.8.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7296](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7296) - chore(deps): update actions/stale action to v10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7299](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7299) - chore(deps): update actions/setup-go action to v6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7298](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7298) - fix(deps): update module github.com/prometheus/client\_golang to v1.23.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7304](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7304) - chore(deps): update codecov/codecov-action action to v5.5.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7303](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7303) - Add Observability section to CONTRIBUTING doc by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7272](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7272) - chore(deps): update module github.com/bombsimon/wsl/v5 to v5.2.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7309](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7309) - chore(deps): update golang.org/x/telemetry digest to [`9b996f7`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9b996f7) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7308](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7308) - chore(deps): update github/codeql-action action to v3.30.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7312](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7312) - chore(deps): update github.com/grafana/regexp digest to [`f7b3be9`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/f7b3be9) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7311](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7311) - chore(deps): update module github.com/pjbgf/sha1cd to v0.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7317](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7317) - chore(deps): update golang.org/x/telemetry digest to [`af835b0`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/af835b0) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7313](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7313) - fix(deps): update module github.com/prometheus/client\_golang to v1.23.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7314](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7314) - chore(deps): update benchmark-action/github-action-benchmark action to v1.20.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7319](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7319) - Don't track min and max when disabled by [@​dashpole](https://redirect.github.com/dashpole) in [#​7306](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7306) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7320](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7320) - Add benchmark for exponential histogram measurements by [@​dashpole](https://redirect.github.com/dashpole) in [#​7305](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7305) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7324](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7324) - chore(deps): update module mvdan.cc/gofumpt to v0.9.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7322](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7322) - trace,metric,log: WithInstrumentationAttributes options to merge attributes by [@​pellared](https://redirect.github.com/pellared) in [#​7300](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7300) - Encapsulate observability in Logs SDK by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7315](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7315) - trace,metric,log: add WithInstrumentationAttributeSet option by [@​pellared](https://redirect.github.com/pellared) in [#​7287](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7287) - chore(deps): update module github.com/spf13/afero to v1.15.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7330](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7330) - chore(deps): update module github.com/sagikazarmark/locafero to v0.11.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7329](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7329) - chore(deps): update module github.com/lucasb-eyer/go-colorful to v1.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7327](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7327) - chore(deps): update module github.com/antonboom/errname to v1.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7338](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7338) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.41.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7337](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7337) - chore(deps): update module github.com/spf13/viper to v1.21.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7334](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7334) - chore(deps): update module github.com/spf13/cast to v1.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7333](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7333) - fix(deps): update googleapis to [`9702482`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9702482) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7335](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7335) - chore(deps): update github/codeql-action action to v3.30.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7339](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7339) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7326](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7326) - fix(deps): update module google.golang.org/protobuf to v1.36.9 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7340](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7340) - Encapsulate `stdouttrace.Exporter` instrumentation in internal package by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7307](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7307) - Do not allocate instrument options if possible in generated semconv packages by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7328](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7328) - chore(deps): update module github.com/antonboom/nilnil to v1.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7343](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7343) - chore(deps): update module golang.org/x/net to v0.44.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7341](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7341) - fix(deps): update module golang.org/x/tools to v0.37.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7347](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7347) - fix(deps): update module google.golang.org/grpc to v1.75.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7344](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7344) - chore(deps): update module go.yaml.in/yaml/v2 to v2.4.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7349](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7349) - chore(deps): update github/codeql-action action to v3.30.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7348](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7348) - Rename Self-Observability as just Observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7302](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7302) - fix(deps): update golang.org/x to [`df92998`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/df92998) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7350](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7350) - trace,metric,log: change WithInstrumentationAttributes to not de-depuplicate the passed attributes in a closure by [@​axw](https://redirect.github.com/axw) in [#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7266) - sdk/metric: add example for metricdatatest package by [@​sanojsubran](https://redirect.github.com/sanojsubran) in [#​7323](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7323) - chore(deps): update module github.com/antonboom/testifylint to v1.6.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7359](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7359) - chore(deps): update module github.com/nunnatsa/ginkgolinter to v0.21.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7362](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7362) - chore(deps): update module github.com/tetafro/godot to v1.5.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7360](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7360) - Do not use the user-defined empty set when comparing sets. by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7357](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7357) - Track context containing span in `recordingSpan` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7354](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7354) - fix(deps): update module go.opentelemetry.io/auto/sdk to v1.2.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7365](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7365) - Encapsulate SDK BatchSpanProcessor observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7332](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7332) - Encapsulate SDK Tracer observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7331](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7331) - chore: generate feature flag files from shared by [@​flc1125](https://redirect.github.com/flc1125) in [#​7361](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7361) - fix(deps): update module github.com/prometheus/otlptranslator to v1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7358](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7358) - chore(deps): update module github.com/djarvur/go-err113 to v0.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7368](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7368) - Fix the typo in the function name `TestNewInstrumentation` by [@​yumosx](https://redirect.github.com/yumosx) in [#​7369](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7369) - Use Set hash in Distinct (2nd attempt) by [@​dashpole](https://redirect.github.com/dashpole) in [#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7175) - chore(deps): update module github.com/ldez/grignotin to v0.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7373](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7373) - chore(deps): update module github.com/kulti/thelper to v0.7.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7376](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7376) - chore(deps): update otel/weaver docker tag to v0.18.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7377](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7377) - fix(deps): update github.com/opentracing-contrib/go-grpc/test digest to [`a6e64aa`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/a6e64aa) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7375](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7375) - feat(prometheus): Add observability for prometheus exporter by [@​tongoss](https://redirect.github.com/tongoss) in [#​7345](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7345) - Return partial OTLP export errors to the caller by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7372) - sdk/log: add TestRecordMethodsInputConcurrentSafe by [@​pellared](https://redirect.github.com/pellared) in [#​7378](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7378) - chore(deps): update module github.com/sagikazarmark/locafero to v0.12.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7390](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7390) - chore(deps): update module github.com/tetafro/godot to v1.5.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7391](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7391) - fix(deps): update module github.com/golangci/golangci-lint/v2 to v2.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7392](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7392) - chore: sdk/log/internal/x - generate x package from x component template by [@​nikhilmantri0902](https://redirect.github.com/nikhilmantri0902) in [#​7389](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7389) - chore(deps): update module go.opentelemetry.io/build-tools to v0.28.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7394](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7394) - fix(deps): update build-tools to v0.28.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7395](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7395) - fix(deps): update googleapis to [`9219d12`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9219d12) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7393](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7393) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.42.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7397](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7397) - refactor: replace `context.Background()` with `t.Context()`/`b.Context()` in tests by [@​flc1125](https://redirect.github.com/flc1125) in [#​7352](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7352) - sdk/log: BenchmarkAddAttributes, BenchmarkSetAttributes, BenchmarkSetBody by [@​pellared](https://redirect.github.com/pellared) in [#​7387](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7387) - Link checker: ignore https localhost uris by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7399](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7399) - chore(deps): update module github.com/ldez/gomoddirectives to v0.7.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7400](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7400) - chore(deps): update module dev.gaijin.team/go/golib to v0.7.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7402](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7402) - Add experimental `x` package to `otlptracegrpc` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7401](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7401) - chore(deps): update actions/cache action to v4.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7409](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7409) - \[chore]: Clean-up unused obsScopeName const by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7408](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7408) - Add benchmark for synchronous gauge measurement by [@​dashpole](https://redirect.github.com/dashpole) in [#​7407](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7407) - Add measure benchmarks with exemplars recorded by [@​dashpole](https://redirect.github.com/dashpole) in [#​7406](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7406) - chore(deps): update github/codeql-action action to v3.30.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7414](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7414) - chore(deps): update module github.com/quasilyte/go-ruleguard to v0.4.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7416](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7416) - chore(deps): update module github.com/quasilyte/go-ruleguard/dsl to v0.3.23 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7417](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7417) - Optimize the return type of ExportSpans by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7405](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7405) - Optimize Observability return types in in Prometheus exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7410](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7410) - chore(deps): update module github.com/mattn/go-runewidth to v0.0.17 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7418](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7418) - chore(deps): update module github.com/cyphar/filepath-securejoin to v0.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7419](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7419) - Add concurrent safe tests for metric aggregations by [@​dashpole](https://redirect.github.com/dashpole) in [#​7379](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7379) - chore(deps): update github/codeql-action action to v3.30.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7425](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7425) - sdk/trace/internal/x: generate x package from x component template [#​7385](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7385) by [@​ternua8](https://redirect.github.com/ternua8) in [#​7411](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7411) - chore(deps): update module go.augendre.info/fatcontext to v0.9.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7426](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7426) - Generate gRPC Client target parsing func by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7424](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7424) - chore(deps): update module github.com/mattn/go-runewidth to v0.0.19 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7428](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7428) - Prometheus exporter: change default translation strategy by [@​dashpole](https://redirect.github.com/dashpole) in [#​7421](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7421) - Only enforce cardinality limits when the attribute set does not already exist by [@​dashpole](https://redirect.github.com/dashpole) in [#​7422](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7422) - fix(deps): update googleapis to [`57b25ae`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/57b25ae) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7429](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7429) - chore(deps): update module github.com/charmbracelet/x/ansi to v0.10.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7432](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7432) - chore(deps): update golang.org/x/telemetry digest to [`8e64475`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/8e64475) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7431](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7431) - chore(deps): update ossf/scorecard-action action to v2.4.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7435](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7435) - Allow optimizing locking for built-in exemplar reservoirs by [@​dashpole](https://redirect.github.com/dashpole) in [#​7423](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7423) - chore(deps): update golang.org/x/telemetry digest to [`4eae98a`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/4eae98a) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7439](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7439) - chore(deps): update peter-evans/create-issue-from-file action to v6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7440](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7440) - Add temporality selector functions by [@​dprotaso](https://redirect.github.com/dprotaso) in [#​7434](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7434) - fix(deps): update module google.golang.org/protobuf to v1.36.10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7445](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7445) - chore(deps): update github/codeql-action action to v3.30.6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7446](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7446) - Skip link checking for acm.org which blocks the link checker by [@​dashpole](https://redirect.github.com/dashpole) in [#​7444](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7444) - feat: logs SDK observability - otlploggrpc exporter metrics by [@​yumosx](https://redirect.github.com/yumosx) in [#​7353](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7353) - fix(deps): update golang.org/x to [`27f1f14`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/27f1f14) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7448](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7448) - fix(deps): update googleapis to [`7c0ddcb`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/7c0ddcb) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7449](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7449) - chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to v2.27.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7450](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7450) - Add exemplar reservoir parallel benchmarks by [@​dashpole](https://redirect.github.com/dashpole) in [#​7441](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7441) - chore(deps): update module github.com/ghostiam/protogetter to v0.3.17 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7451](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7451) - chore(deps): update actions/stale action to v10.1.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7452](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7452) - Support custom error type semantics by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7442](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7442) - fix(deps): update build-tools to v0.28.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7455](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7455) - chore(deps): update module github.com/go-git/go-git/v5 to v5.16.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7456](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7456) - chore(deps): update module github.com/bombsimon/wsl/v5 to v5.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7457](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7457) - sdk/trace: trace id high 64 bit tests by [@​mahendrabishnoi2](https://redirect.github.com/mahendrabishnoi2) in [#​7212](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7212) - Add the `internal/observ` package to `otlptracegrpc` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7404](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7404) - fix(deps): update googleapis to [`65f7160`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/65f7160) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7460](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7460) - chore(deps): update module go.opentelemetry.io/collector/featuregate to v1.43.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7461](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7461) - fix(deps): update module google.golang.org/grpc to v1.76.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7463](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7463) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.43.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7462](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7462) - Use sync.Map and atomics to improve sum performance by [@​dashpole](https://redirect.github.com/dashpole) in [#​7427](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7427) - chore(deps): update module github.com/stretchr/objx to v0.5.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7464](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7464) - chore(deps): update module github.com/prometheus/common to v0.67.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7465](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7465) - Document the ordering guarantees provided by the metrics SDK by [@​dashpole](https://redirect.github.com/dashpole) in [#​7453](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7453) - chore(deps): update github/codeql-action action to v3.30.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7467](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7467) - chore(deps): update google.golang.org/genproto/googleapis/api digest to [`49b9836`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/49b9836) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7468](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7468) - Instrument the `otlptracegrpc` exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7459](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7459) - fix(deps): update google.golang.org/genproto/googleapis/rpc digest to [`49b9836`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/49b9836) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7469](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7469) - chore(deps): update module golang.org/x/net to v0.45.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7470](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7470) - chore(deps): update github/codeql-action action to v4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7472](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7472) - chore(deps): update module github.com/skeema/knownhosts to v1.3.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7471](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7471) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7475](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7475) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7477](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7477) - chore(deps): update module github.com/nunnatsa/ginkgolinter to v0.21.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7481](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7481) - chore(deps): update module github.com/ldez/exptostd to v0.4.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7483](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7483) - Add the internal `x` package to `otlptracehttp` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7476](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7476) - Add a version const to otlptracehttp by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7479](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7479) - feat: Improve error handling in prometheus exporter by [@​tongoss](https://redirect.github.com/tongoss) in [#​7363](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7363) - Add the `internal/observ` pkg to `otlptracehttp` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7480](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7480) - Move sdk/internal/env to sdk/trace/internal/env by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7437](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7437) - chore(deps): update module github.com/gofrs/flock to v0.13.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7487](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7487) - Instrument the `otlptracehttp` exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7486](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7486) - chore(deps): update github/codeql-action action to v4.30.8 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7489](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7489) - chore(deps): update module github.com/catenacyber/perfsprint to v0.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7496](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7496) - OTLP trace exporter include W3C trace flags (bits 0–7) in Span.Flags by [@​nikhilmantri0902](https://redirect.github.com/nikhilmantri0902) in [#​7438](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7438) - Fix typos and linguistic errors in documentation / hacktoberfest by [@​survivant](https://redirect.github.com/survivant) in [#​7494](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7494) - chore(deps): update module github.com/kunwardeep/paralleltest to v1.0.15 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7501](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7501) - RELEASING - Remove demo-accounting service from dependency list by [@​Kielek](https://redirect.github.com/Kielek) in [#​7503](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7503) - Added the `internal/observ` package to otlploghttp by [@​yumosx](https://redirect.github.com/yumosx) in [#​7484](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7484) - fix(deps): update googleapis to [`4626949`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/4626949) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7506](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7506) - chore(deps): update module github.com/godoc-lint/godoc-lint to v0.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7508](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7508) - fix(observ): correct rejected items and update comment style by [@​yumosx](https://redirect.github.com/yumosx) in [#​7502](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7502) - chore(deps): update module github.com/go-critic/go-critic to v0.14.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7509](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7509) - Prometheus exporter tests: iterate through all scopes rather than looking only at the first by [@​tongoss](https://redirect.github.com/tongoss) in [#​7510](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7510) - chore: sdk/internal/x - generate x package from shared template by [@​nikhilmantri0902](https://redirect.github.com/nikhilmantri0902) in [#​7495](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7495) - sdk/log: Fix AddAttributes, SetAttributes, SetBody on Record to not mutate input by [@​pellared](https://redirect.github.com/pellared) in [#​7403](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7403) - chore(deps): update github/codeql-action action to v4.30.9 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7515](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7515) - feat: sdk/trace: span processed metric for simple span processor by [@​mahendrabishnoi2](https://redirect.github.com/mahendrabishnoi2) in [#​7374](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7374) - Simulate failures for histogram creation paths without risking a nil-interface panic by [@​tongoss](https://redirect.github.com/tongoss) in [#​7518](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7518) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7482](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7482) - fix(deps): update googleapis to [`88f65dc`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/88f65dc) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7521](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7521) - chore(deps): update module go.opentelemetry.io/collector/featuregate to v1.44.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7522](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7522) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.44.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7523](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7523) - chore(deps): update module github.com/abirdcfly/dupword to v0.1.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7525](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7525) - Instrument the `otlploghttp` exporter by [@​yumosx](https://redirect.github.com/yumosx) in [#​7512](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7512) - chore(deps): update module mvdan.cc/gofumpt to v0.9.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7527](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7527) - Move scorpionknifes to emeritus by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7526](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7526) - chore(deps): update module github.com/prometheus/procfs to v0.18.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7530](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7530) - fix(deps): update googleapis to [`3a174f9`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/3a174f9) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7529](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7529) - chore(deps): update golang.org/x/telemetry digest to [`5be28d7`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/5be28d7) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7528](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7528) - fix(deps): update golang.org/x to [`a4bb9ff`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/a4bb9ff) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7533](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7533) - Added the `internal/observ` package to log by [@​yumosx](https://redirect.github.com/yumosx) in [#​7532](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7532) - chore(deps): update module github.com/charithe/durationcheck to v0.0.11 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7534](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7534) - chore(deps): update github artifact actions (major) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7537](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7537) - chore(deps): update github/codeql-action action to v4.
--- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/go.mod | 14 +++++++------- core/go.sum | 14 ++++++++++++++ flagd/go.mod | 14 +++++++------- flagd/go.sum | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/core/go.mod b/core/go.mod index f0a11175f..c93bc29b2 100644 --- a/core/go.mod +++ b/core/go.mod @@ -20,12 +20,12 @@ require ( github.com/stretchr/testify v1.11.1 github.com/twmb/murmur3 v1.1.8 go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 - go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel v1.40.0 go.opentelemetry.io/otel/exporters/prometheus v0.60.0 - go.opentelemetry.io/otel/metric v1.38.0 - go.opentelemetry.io/otel/sdk v1.38.0 - go.opentelemetry.io/otel/sdk/metric v1.38.0 - go.opentelemetry.io/otel/trace v1.38.0 + go.opentelemetry.io/otel/metric v1.40.0 + go.opentelemetry.io/otel/sdk v1.40.0 + go.opentelemetry.io/otel/sdk/metric v1.40.0 + go.opentelemetry.io/otel/trace v1.40.0 go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 gocloud.dev v0.42.0 @@ -135,7 +135,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect @@ -155,7 +155,7 @@ require ( go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.47.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect diff --git a/core/go.sum b/core/go.sum index 82084e2ea..4b9a5ae4f 100644 --- a/core/go.sum +++ b/core/go.sum @@ -330,6 +330,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= @@ -342,6 +344,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/X go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= @@ -368,16 +372,24 @@ go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNG go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -458,6 +470,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= diff --git a/flagd/go.mod b/flagd/go.mod index 53d549f6e..3042ccd1d 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -19,10 +19,10 @@ require ( github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.11.1 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 - go.opentelemetry.io/otel v1.38.0 - go.opentelemetry.io/otel/sdk v1.38.0 - go.opentelemetry.io/otel/sdk/metric v1.38.0 - go.opentelemetry.io/otel/trace v1.38.0 + go.opentelemetry.io/otel v1.40.0 + go.opentelemetry.io/otel/sdk v1.40.0 + go.opentelemetry.io/otel/sdk/metric v1.40.0 + go.opentelemetry.io/otel/trace v1.40.0 go.uber.org/mock v0.5.2 go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 @@ -148,7 +148,7 @@ require ( github.com/zeebo/errs v1.4.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 // indirect @@ -165,7 +165,7 @@ require ( go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 // indirect go.opentelemetry.io/otel/log v0.14.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.40.0 // indirect go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.uber.org/multierr v1.11.0 // indirect @@ -174,7 +174,7 @@ require ( golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/mod v0.29.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index 0cce7ec63..d5c55ec64 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -402,6 +402,8 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= @@ -416,6 +418,8 @@ go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= @@ -454,20 +458,28 @@ go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/Wgbsd go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= @@ -553,6 +565,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From 7812de78ec37932aa338a2cebcc69b90b299150e Mon Sep 17 00:00:00 2001 From: Maks Date: Tue, 3 Mar 2026 16:36:48 +0100 Subject: [PATCH 31/97] docs(ADR): Proposal for the Semantic Versioning policy for flagd (#1849) ## This PR Establishes a comprehensive versioning policy for flagd binaries and providers, aiming for stability and predictable upgrades. This policy creates a "Modified SemVer" contract where the ecosystem stays on v1.x.y indefinitely, with specific rules for breaking changes and support windows. **Addresses:** - Define API stability guarantees (Providers expect API support, no forward/backward guarantees). - Define "breaking change" (Detailed sections for configuration, observability, runtime behavior). - Create deprecation policy (Announced in minor, supported for 3 minors/12 months). - Set per-minor release cadence (Feature-driven/Ad-hoc, not calendar-based). - Define active-support windows (Support latest + 3 previous minor releases). - Create policy for back-porting (Roll-forward preferred; backporting for severe bugs/security only). **Out of Scope / Future Work:** - Create requirements for authoring migration guides. - Publish conformance reports with each minor release. - Include benchmark report with each minor release. **Key Components:** - **Release Strategy**: Ad-hoc minor releases based on feature readiness; Patch releases for critical fixes. - **Artifacts**: Immutable artifacts with published hashes. - **Provider Alignment**: Strives for minor version alignment for feature parity. ### Related Issues - https://github.com/open-feature/flagd/issues/1754 --------- Signed-off-by: Maks Osowski Signed-off-by: Todd Baert Co-authored-by: Todd Baert Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../semantic-versioning-policy.md | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 docs/architecture-decisions/semantic-versioning-policy.md diff --git a/docs/architecture-decisions/semantic-versioning-policy.md b/docs/architecture-decisions/semantic-versioning-policy.md new file mode 100644 index 000000000..73cec26c9 --- /dev/null +++ b/docs/architecture-decisions/semantic-versioning-policy.md @@ -0,0 +1,183 @@ +--- +# Valid statuses: draft | proposed | rejected | accepted | superseded +status: accepted +author: Maks Osowski (@cupofcat) +created: 2026-01-22 +--- + +# flagd Ecosystem Semantic Versioning Policy + +## Introduction + +This document outlines the versioning policy for the flagd ecosystem, including the flagd binary, and language-specific providers. The goal is to establish a predictable, stable, and transparent contract between the components and their consumers and ensure that users can confidently adopt updates while allowing the ecosystem to evolve. + +The flagd ecosystem consists of distinct components that maintain their own versioning tracks but adhere to a unified policy. The scope for this policy is flagd binaries, and providers. Various API surfaces (e.g. Evaluation API, Sync API, OFREP) are out of scope. The compatibility between components and the [Flag Definition schema](https://flagd.dev/reference/schema/?h=schema) is in scope, as the schema acts as a fundamental feature-contract bundled with these components. + +## Legend and definitions + +**X.Y.Z** refers to the semantic version of a release component (**X** is the major version, **Y** is the minor version, **Z** is the patch version). + +### Major versions (X.) + +For example: 1.3.4 → 2.0.0 + +flagd community is not anticipating new major version releases (2.0.0) of any of the components. These are reserved for fundamental paradigm shifts or massive architectural changes. For the foreseeable future the ecosystem aims to maintain stability within the v1.x.y series. + +### Minor versions (Y.) + +For example: 1.3.4 → 1.4.0 + +Minor versions of components include new features and may include breaking changes or introduce incompatibilities. Breaking changes to existing functionality will only be released if adhering to the Deprecation Policy. + +### Patch versions (Z.) + +For example: 1.3.4 → 1.3.5 + +Patch releases are intended for critical bug fixes to the latest minor version, such as addressing security vulnerabilities, fixes to problems affecting a large number of users, and severe problems with no workaround. + +They should not contain miscellaneous feature additions or improvements, and especially no incompatibilities should be introduced between patch versions of the same minor version. + +Dependencies, such as JSON Logic, should also not be changed unless absolutely necessary, and also just to fix critical bugs (so, at most patch version changes, not new major nor minor versions). + +## Release Versioning + +The flagd ecosystem follows a lightweight, **feature-driven release process**. Releases are driven by feature readiness and stability needs rather than a rigid calendar schedule. This ensures that features reach users quickly without imposing unnecessary process overhead on maintainers. + +### Branching Strategy + +* **Main Branch (`main`):** The single source of truth. The main branch is expected to be in a stable, deployable state at all times. +* **Tags:** Releases are strictly defined by Git tags (e.g., `v1.2.0`) created directly on the main branch. +* **Maintenance Branches (Exception Only):** Long-lived release branches (e.g., `release-1.2`) are **not** created by default. They are only utilized if a critical patch is required for an older version while the main branch has already progressed with breaking changes. + +### Release Cadence and Process + +#### Minor Releases (X.Y.0) + +* **Trigger:** Released when a significant set of new features, improvements, or non-breaking changes have been merged to `main` and validated. +* **Cadence:** Ad-hoc. There are no mandatory waiting periods or fixed release windows. However, the set of changes going into each release is **planned ahead** of the release and the criteria for “ready” are set ahead of time so all the languages can stay aligned. +* **Process:** A tag is pushed to the main branch, triggering the release pipeline to build artifacts and publish notes. + +#### Patch Releases (X.Y.Z) + +* **Trigger:** Released to fix critical bugs, security vulnerabilities, or regressions found in the current minor version. +* **Strategy (Roll-Forward):** The preferred method is to merge the fix to `main` and immediately cut the next patch release (e.g., `v1.2.1`). This minimizes branch management overhead. +* **Strategy (Backporting):** Backporting via a temporary branch is an exception, reserved only for critical fixes required for a specific version where rolling forward is not an option (e.g., the main branch contains breaking changes for the next minor version). + +#### Pre-Releases (Alpha/Beta/RC) + +* **Trigger:** **Optional**. Pre-releases are only utilized when a release contains significant architectural changes or high-risk features that require wider community testing before broad adoption. +* **Format:** `X.Y.Z-rc.N` (e.g., `v1.5.0-rc.1`). +* **Process:** Tagged directly from the main branch. If issues are found, fixes are merged to main, and a subsequent RC is tagged. There are no mandatory alpha/beta cycles to streamline the process. + +### Artifact Integrity + +Released artifacts (binaries, container images) must be immutable. Hashes (e.g., SHA-256) of all released artifacts must be published with the release notes. A specific version tag must always resolve to the same artifact hash. + +## Upgrades and SLOs + +We expect users to stay reasonably up-to-date with the versions of flagd components they use in production, but understand that it may take time to upgrade, especially for production-critical components. + +We expect users to be running approximately the latest patch release of a given minor release; we often include critical bug fixes in patch releases, and so encourage users to upgrade as soon as possible. + +We expect to “support” 3 minor releases at a time. "Support" means we expect users to be running that version in production, and we strive to port fixes back into the supported versions. +For example, when v1.3 comes out, v1.0 will no longer be “supported” but v1.1 would be expected to contain critical bug fixes discovered when v1.3 is the latest version. +Basically, that means that the reasonable response to the question "my v1.0 flagd Go provider isn't working," is, "you should probably upgrade it, (and probably should have some time ago)". + +Being an OSS project, we do **NOT** offer any SLA on resolving issues. + +We have a “best-effort SLO” of: + +* addressing CVEs within 14 days of disclosure +* addressing severe bugs within 31 days of reporting + +## Component Skew + +### flagd Providers and APIs + +Providers communicate with the Sync and Evaluation API endpoints. Over time the API messages might evolve within the same major version to support new functionalities in backward compatible manners. To ensure system stability, we define the following policy. + +**API Compatibility**: Providers expect the API endpoints they are configured with to support the version of the provider. Providers themselves are not expected to support multiple versions of the API. Providers to not give any guarantees of forward or backward compatibility. It’s entirely the responsibility of the API owners to not break the clients that use their APIs. + +### flagd Components and the Flag Definition Schema + +The [Flag Definition Schema](https://flagd.dev/reference/schema/?h=schema) represents a **feature-contract** for the ecosystem. Each released version of the flagd binary and every provider bundles a schema at a particular version. This helps ensure deterministic support for all the features and targeting operators utilized in a definition file. + +**Version Alignment and Validation**: + +* **New Features**: When new features (e.g., a "regex" operator in targeting) are added to the schema, support for them is rolled out via **minor** version releases of the flagd binary and providers. +* **Validation**: If a user attempts to load a flag definition that uses features not present in the provider's or flagd binary's bundled schema version, the schema will fail to validate. The component will output specific error messages indicating the incompatibility, ensuring users know which version upgrade is required to support their configuration. +* A **patch** version upgrade of a flagd binary or provider will **NOT** change the bundled schema version to ensure stability. + +### flagd Providers and OpenFeature SDKs + +Each flagd provider implementation is bound to the OpenFeature SDK of its respective language. To ensure stability, we define the following policies: + +**Compatibility Declaration**: Each provider release **MUST** declare the [OpenFeature spec version](https://github.com/open-feature/spec/releases) it’s compatible with. + +**Version Dependency**: + +* A **patch** version upgrade of a flagd provider will **NOT** change the spec version +* A **minor** version upgrade of a flagd provider **may** **increase** the spec version + +## Cross-Provider Alignment + +While released independently, providers strive for feature parity. + +**Minor Version Alignment**: We aim to align minor versions across providers to represent a consistent feature set and behavior (e.g., Python provider 1.1.x and Java provider 1.1.x should support the same Flag Definition schema version and offer similar configuration options). + +**Patch Divergence**: Patch versions are released independently as needed for language-specific fixes and do not require alignment. + +## Deprecation Policy + +To evolve the ecosystem without immediate breaking changes, we employ a strict deprecation process for the flagd binary and providers. + +**Announcement**: Features/Behavior must be marked and announced as deprecated in a **minor** release. + +**Duration**: Deprecated features must be supported for at least **3 minor releases** or **12 months**, whichever is longer (e.g. a feature deprecated in 1.0 is expected to be supported in 1.0, 1.1, and 1.2, and may be removed in 1.3 if 12 months have passed since the 1.0 release. If 12 months have not passed since the 1.0 release, the feature will continue to be supported in 1.3+ until the release that is released 12 months after the 1.0 release.) + +**Visibility**: Runtime warnings should be emitted when deprecated features are used. + +**Removal**: After the deprecation period, the feature may be removed in a subsequent **minor** release (marked as a breaking change) + +## Breaking Changes + +### For flagd binary (daemon) and providers + +* **Configuration**: Changes to the names, types, or default values of environmental variables, CLI flags (`flagd start` options), or provider constructor options (e.g., `FLAGD_CACHE`). + +* **Observability**: + * Changes to metric names or types that move, remove, or rename existing parts of the schemas (additions, e.g. of labels, are fine). + * Changes to the mapping of evaluation details to OpenTelemetry feature-flag event records. + * Please note that the following are considered **not** breaking: + * Removing or changing existing logging at any level (ERROR, WARNING, INFO, etc) + +* **Runtime Behavior**: + * Changes to startup behavior (e.g., fail-open vs. fail-close). + * Changes to retry-ability, idempotency, or backoff behavior. + * **Flag Definition Schema Validation**: Upgrading the bundled schema or validation logic in a way that drops support for previously valid operators, properties, or structures (i.e., backwards-incompatible schema changes that cause existing flag definition files to fail validation). + +* **Licensing**: Changes to the license texts of the artifacts. + +### Additionally, for flagd providers only + +* Changes to existing public interfaces (signatures, return types, or behavior for the same input/state) that break the existing client of those interfaces (note that, for example, adding a new optional configuration option to an existing interface is **not** breaking). +* Changing the minimum supported language runtime or compiler version. +* Changing the supported OpenFeature spec version + +### Additionally, for flagd binary (daemon) only + +* Changes to which API versions are exposed by default. +* Changes to the supported URI patterns for flag sources (e.g., `file:`, `kubernetes:`, `s3:`). +* Changes to the merge strategy or precedence when using multiple flag sources. +* Implementing documented future default flips (e.g., the plan to default `--disable-sync-metadata` to true is a breaking change). + +## Policy Rollout Checklist (Ahead of 1.0.0) + +Before graduating core components to 1.0.0 and finalizing this policy: + +* [ ] Battle-testing 1.0.0-rc.1 candidates extensively. +* [ ] Extraction and independent versioning of the `flagd-core` Go library. +* [ ] Implementation of CI checks to validate SemVer compliance (e.g., detecting accidental breaking changes in public APIs). +* [ ] Designation of release stewards for each component. +* [ ] Publication of the initial compatibility matrix. +* [ ] Establish the release notes process (where to publish, what format) for minor releases From 89117d8eaba0e9d205b3b47544528c42d5698176 Mon Sep 17 00:00:00 2001 From: Marco Zabel Date: Wed, 4 Mar 2026 09:58:52 +0100 Subject: [PATCH 32/97] feat!: no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) (#1862) ## This PR Adds support for v2 proto schemas, which enable RPC mode to signal that code-default should be used if no `defaultVariant` is configued. Equivalent changes added to OFREP. In-process resolvers will be updated to have the same behavior. Previously, this situation resulted in `FLAG_NOT_FOUND` - now it just gracefully results in a code default (no error). ### Related Issues https://github.com/open-feature/flagd/issues/1856 Signed-off-by: marcozabel Signed-off-by: Todd Baert Co-authored-by: Todd Baert Co-authored-by: lea konvalinka --- core/go.mod | 31 +- core/go.sum | 84 ++-- core/pkg/evaluator/json.go | 26 +- core/pkg/evaluator/json_test.go | 16 +- core/pkg/model/reason.go | 3 + core/pkg/service/ofrep/models.go | 14 +- core/pkg/service/ofrep/models_test.go | 317 ++++++++++++++- flagd-proxy/go.mod | 36 +- flagd-proxy/go.sum | 122 +++--- flagd-proxy/tests/loadtest/go.mod | 18 +- flagd-proxy/tests/loadtest/go.sum | 49 ++- flagd/go.mod | 37 +- flagd/go.sum | 158 +++----- .../flag-evaluation/connect_service.go | 39 +- .../flag-evaluation/flag_evaluator_types.go | 181 +++++++++ .../flag-evaluation/flag_evaluator_v1.go | 370 ++++++++++++++++++ ...r_v2_test.go => flag_evaluator_v1_test.go} | 0 .../flag-evaluation/flag_evaluator_v2.go | 236 +++++------ .../service/flag-evaluation/ofrep/handler.go | 1 + .../flag-evaluation/ofrep/handler_test.go | 40 ++ test/integration/go.mod | 2 +- test/integration/go.sum | 4 +- test/zero-downtime-flagd-proxy/go.mod | 18 +- test/zero-downtime-flagd-proxy/go.sum | 49 ++- 24 files changed, 1346 insertions(+), 505 deletions(-) create mode 100644 flagd/pkg/service/flag-evaluation/flag_evaluator_v1.go rename flagd/pkg/service/flag-evaluation/{flag_evaluator_v2_test.go => flag_evaluator_v1_test.go} (100%) diff --git a/core/go.mod b/core/go.mod index c93bc29b2..c990421c1 100644 --- a/core/go.mod +++ b/core/go.mod @@ -3,9 +3,9 @@ module github.com/open-feature/flagd/core go 1.24.0 require ( - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 - connectrpc.com/connect v1.18.1 + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 + connectrpc.com/connect v1.19.1 connectrpc.com/otelconnect v0.7.2 github.com/diegoholiveira/jsonlogic/v3 v3.8.4 github.com/fsnotify/fsnotify v1.9.0 @@ -32,10 +32,10 @@ require ( golang.org/x/crypto v0.45.0 golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac golang.org/x/mod v0.29.0 - golang.org/x/oauth2 v0.30.0 + golang.org/x/oauth2 v0.32.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + google.golang.org/grpc v1.78.0 + google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 k8s.io/apimachinery v0.33.2 k8s.io/client-go v0.33.2 @@ -46,7 +46,7 @@ require ( cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect cloud.google.com/go/storage v1.55.0 // indirect @@ -57,7 +57,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -84,15 +84,15 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.35.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -128,16 +128,15 @@ require ( github.com/prometheus/otlptranslator v0.0.2 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect @@ -163,8 +162,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/api v0.33.2 // indirect diff --git a/core/go.sum b/core/go.sum index 4b9a5ae4f..9bcd54264 100644 --- a/core/go.sum +++ b/core/go.sum @@ -1,7 +1,7 @@ -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -11,8 +11,8 @@ cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= @@ -25,8 +25,8 @@ cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2zn cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= -connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= -connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI= connectrpc.com/otelconnect v0.7.2/go.mod h1:JS7XUKfuJs2adhCnXhNHPHLz6oAaZniCJdSF00OZSew= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= @@ -50,8 +50,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mo github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -109,8 +109,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -126,10 +126,10 @@ github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= -github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= -github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= -github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= +github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -145,8 +145,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -291,14 +291,14 @@ github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= -github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -324,26 +324,20 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= -github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0/go.mod h1:OvRg7gm5WRSCtxzGSsrFHbDLToYlStHNZQ+iPNIyD6g= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= @@ -370,24 +364,16 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= -go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= @@ -442,8 +428,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -468,8 +454,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -524,17 +508,17 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda h1:+2XxjfsAu6vqFxwGBRcHiMaDCuZiqXGDUDVWVtrFAnE= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -544,8 +528,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/core/pkg/evaluator/json.go b/core/pkg/evaluator/json.go index 5849bb5f3..45a13175d 100644 --- a/core/pkg/evaluator/json.go +++ b/core/pkg/evaluator/json.go @@ -32,6 +32,7 @@ const ( // evaluation if the user did not supply the optional bucketing property. targetingKeyKey = "targetingKey" Disabled = "DISABLED" + ProtoVersionKey = "__flagd.protoVersion__" // used to mark if the request is coming from an older proto source, which has different fallback behavior ) var regBrace *regexp.Regexp @@ -196,6 +197,13 @@ func (je *Resolver) ResolveAllValues(ctx context.Context, reqID string, context value, variant, reason, metadata, err = resolve[float64](ctx, reqID, flag.Key, context, je.evaluateVariant) case map[string]any: value, variant, reason, metadata, err = resolve[map[string]any](ctx, reqID, flag.Key, context, je.evaluateVariant) + default: + if ctx.Value(ProtoVersionKey) == nil { + value, variant, reason, metadata, err = resolve[interface{}](ctx, reqID, flag.Key, context, je.evaluateVariant) + } else { + // old proto version behavior + continue + } } if err != nil { je.Logger.ErrorWithID(reqID, fmt.Sprintf("bulk evaluation: key: %s returned error: %s", flag.Key, err.Error())) @@ -307,6 +315,11 @@ func resolve[T constraints](ctx context.Context, reqID string, key string, conte return value, variant, reason, metadata, err } + if reason == model.FallbackReason { + var zero T + return zero, variant, model.FallbackReason, metadata, nil + } + var ok bool value, ok = variants[variant].(T) if !ok { @@ -380,7 +393,12 @@ func (je *Resolver) evaluateVariant(ctx context.Context, reqID string, flagKey s if trimmed == "null" { if flag.DefaultVariant == "" { - return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.FlagNotFoundErrorCode) + if ctx.Value(ProtoVersionKey) != nil { + // old proto version behavior + return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.FlagNotFoundErrorCode) + } + + return "", flag.Variants, model.FallbackReason, metadata, nil } return flag.DefaultVariant, flag.Variants, model.DefaultReason, metadata, nil @@ -399,7 +417,11 @@ func (je *Resolver) evaluateVariant(ctx context.Context, reqID string, flagKey s } if flag.DefaultVariant == "" { - return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.FlagNotFoundErrorCode) + if ctx.Value(ProtoVersionKey) != nil { + // old proto version behavior + return "", flag.Variants, model.ErrorReason, metadata, errors.New(model.FlagNotFoundErrorCode) + } + return "", flag.Variants, model.FallbackReason, metadata, nil } return flag.DefaultVariant, flag.Variants, model.StaticReason, metadata, nil diff --git a/core/pkg/evaluator/json_test.go b/core/pkg/evaluator/json_test.go index 60880b12a..d9b988692 100644 --- a/core/pkg/evaluator/json_test.go +++ b/core/pkg/evaluator/json_test.go @@ -5,10 +5,11 @@ import ( "context" "encoding/json" "fmt" - "github.com/stretchr/testify/require" "testing" "time" + "github.com/stretchr/testify/require" + flagdEvaluator "github.com/open-feature/flagd/core/pkg/evaluator" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" @@ -927,10 +928,10 @@ func TestResolve_DefaultVariant(t *testing.T) { reason string errorCode string }{ - {NullDefault, ValidFlag, nil, model.ErrorReason, model.FlagNotFoundErrorCode}, - {UndefinedDefault, ValidFlag, nil, model.ErrorReason, model.FlagNotFoundErrorCode}, - {NullDefaultWithTargetting, ValidFlag, nil, model.ErrorReason, model.FlagNotFoundErrorCode}, - {UndefinedDefaultWithTargetting, ValidFlag, nil, model.ErrorReason, model.FlagNotFoundErrorCode}, + {NullDefault, ValidFlag, nil, model.FallbackReason, ""}, + {UndefinedDefault, ValidFlag, nil, model.FallbackReason, ""}, + {NullDefaultWithTargetting, ValidFlag, nil, model.FallbackReason, ""}, + {UndefinedDefaultWithTargetting, ValidFlag, nil, model.FallbackReason, ""}, } for _, test := range tests { @@ -944,8 +945,9 @@ func TestResolve_DefaultVariant(t *testing.T) { anyResult := evaluator.ResolveAsAnyValue(context.TODO(), "", test.flagKey, test.context) - assert.Equal(t, model.ErrorReason, anyResult.Reason) - assert.EqualError(t, anyResult.Error, test.errorCode) + assert.Equal(t, model.FallbackReason, anyResult.Reason) + // for code defaults, there should be no error + assert.NoError(t, anyResult.Error) }) } } diff --git a/core/pkg/model/reason.go b/core/pkg/model/reason.go index 3eef9f24e..96f19fe30 100644 --- a/core/pkg/model/reason.go +++ b/core/pkg/model/reason.go @@ -10,4 +10,7 @@ const ( UnknownReason = "UNKNOWN" ErrorReason = "ERROR" StaticReason = "STATIC" + // only used internally if no default value could be determined + // will be translated to DefaultReason in the API response + FallbackReason = "FALLBACK" ) diff --git a/core/pkg/service/ofrep/models.go b/core/pkg/service/ofrep/models.go index 4accb51b5..be08bf948 100644 --- a/core/pkg/service/ofrep/models.go +++ b/core/pkg/service/ofrep/models.go @@ -12,10 +12,10 @@ type Request struct { } type EvaluationSuccess struct { - Value interface{} `json:"value"` + Value interface{} `json:"value,omitempty"` Key string `json:"key"` Reason string `json:"reason"` - Variant string `json:"variant"` + Variant string `json:"variant,omitempty"` Metadata model.Metadata `json:"metadata"` } @@ -60,6 +60,16 @@ func BulkEvaluationResponseFrom(resolutions []evaluator.AnyValue, metadata model } func SuccessResponseFrom(result evaluator.AnyValue) EvaluationSuccess { + // if reason is fallback, we want to omit the value and variant from the response, and set reason to default + if result.Reason == model.FallbackReason { + return EvaluationSuccess{ + Value: nil, // not marshalled due to omitempty + Key: result.FlagKey, + Reason: model.DefaultReason, + Variant: "", // not marshalled due to omitempty + Metadata: result.Metadata, + } + } return EvaluationSuccess{ Value: result.Value, Key: result.FlagKey, diff --git a/core/pkg/service/ofrep/models_test.go b/core/pkg/service/ofrep/models_test.go index 947b8ded6..4d0b955b9 100644 --- a/core/pkg/service/ofrep/models_test.go +++ b/core/pkg/service/ofrep/models_test.go @@ -46,16 +46,86 @@ func TestSuccessResult(t *testing.T) { } } +func TestSuccessResultCodeDefault(t *testing.T) { + value := evaluator.AnyValue{ + Value: false, // zero value for boolean + Variant: "", // empty variant + Reason: model.FallbackReason, + FlagKey: "noDefaultFlag", + Metadata: map[string]interface{}{}, + } + + // when + evaluationSuccess := SuccessResponseFrom(value) + + // then verify the reason is converted to DEFAULT + if evaluationSuccess.Reason != model.DefaultReason { + t.Errorf("expected reason %v, got %v", model.DefaultReason, evaluationSuccess.Reason) + } + + if evaluationSuccess.Value != nil { + t.Errorf("expected nil value for code default, got %v", evaluationSuccess.Value) + } + + if evaluationSuccess.Variant != "" { + t.Errorf("expected empty variant for code default, got %v", evaluationSuccess.Variant) + } + + if evaluationSuccess.Key != value.FlagKey { + t.Errorf("expected key %v, got %v", value.FlagKey, evaluationSuccess.Key) + } + + // Verify JSON marshaling omits the value field + marshaled, err := json.Marshal(evaluationSuccess) + if err != nil { + t.Errorf("error marshalling: %v", err) + } + + // Check that "value" field is not in the JSON + if string(marshaled) == "" { + t.Errorf("marshalled output is empty") + } + + // Parse back to verify structure + var result map[string]interface{} + err = json.Unmarshal(marshaled, &result) + if err != nil { + t.Errorf("error unmarshalling: %v", err) + } + + if _, hasValue := result["value"]; hasValue { + t.Errorf("value field should be omitted for code defaults, but found in: %s", string(marshaled)) + } + + if _, hasVariant := result["variant"]; hasVariant { + t.Errorf("variant field should be omitted for code defaults, but found in: %s", string(marshaled)) + } + + if reason, ok := result["reason"].(string); !ok || reason != model.DefaultReason { + t.Errorf("reason should be DEFAULT, got: %v", result["reason"]) + } +} + func TestBulkEvaluationResponse(t *testing.T) { tests := []struct { - name string - input []evaluator.AnyValue - marshalledOutput string + name string + input []evaluator.AnyValue + verify func(*testing.T, []byte) }{ { - name: "empty input", - input: nil, - marshalledOutput: "{\"flags\":[],\"metadata\":{}}", + name: "empty input", + input: nil, + verify: func(t *testing.T, data []byte) { + var result BulkEvaluationResponse + err := json.Unmarshal(data, &result) + if err != nil { + t.Errorf("error unmarshalling: %v", err) + return + } + if len(result.Flags) != 0 { + t.Errorf("expected 0 flags, got %d", len(result.Flags)) + } + }, }, { name: "valid values", @@ -78,21 +148,167 @@ func TestBulkEvaluationResponse(t *testing.T) { Metadata: map[string]interface{}{}, }, }, - marshalledOutput: "{\"flags\":[{\"value\":false,\"key\":\"key\",\"reason\":\"STATIC\",\"variant\":\"false\",\"metadata\":{\"key\":\"value\"}},{\"key\":\"errorFlag\",\"errorCode\":\"FLAG_NOT_FOUND\",\"errorDetails\":\"flag `errorFlag` does not exist\",\"metadata\":{}}],\"metadata\":{}}", + verify: func(t *testing.T, data []byte) { + var result BulkEvaluationResponse + err := json.Unmarshal(data, &result) + if err != nil { + t.Errorf("error unmarshalling: %v", err) + return + } + if len(result.Flags) != 2 { + t.Errorf("expected 2 flags, got %d", len(result.Flags)) + return + } + + // Verify first flag (success case) + firstFlag, ok := result.Flags[0].(map[string]interface{}) + if !ok { + t.Errorf("first flag: expected map[string]interface{}, got %T", result.Flags[0]) + return + } + if firstFlag["key"] != "key" { + t.Errorf("first flag: expected key 'key', got '%v'", firstFlag["key"]) + } + if firstFlag["value"] != false { + t.Errorf("first flag: expected value false, got %v", firstFlag["value"]) + } + if firstFlag["variant"] != "false" { + t.Errorf("first flag: expected variant 'false', got '%v'", firstFlag["variant"]) + } + if firstFlag["reason"] != model.StaticReason { + t.Errorf("first flag: expected reason %v, got %v", model.StaticReason, firstFlag["reason"]) + } + metadata, ok := firstFlag["metadata"].(map[string]interface{}) + if !ok || metadata["key"] != "value" { + t.Errorf("first flag: expected metadata['key']='value', got %v", firstFlag["metadata"]) + } + + // Verify second flag (error case) + secondFlag, ok := result.Flags[1].(map[string]interface{}) + if !ok { + t.Errorf("second flag: expected map[string]interface{}, got %T", result.Flags[1]) + return + } + if secondFlag["key"] != "errorFlag" { + t.Errorf("second flag: expected key 'errorFlag', got '%v'", secondFlag["key"]) + } + if secondFlag["errorCode"] != model.FlagNotFoundErrorCode { + t.Errorf("second flag: expected errorCode %v, got %v", model.FlagNotFoundErrorCode, secondFlag["errorCode"]) + } + }, + }, + { + name: "mixed with code defaults", + input: []evaluator.AnyValue{ + { + Value: "on", + Variant: "on", + Reason: model.StaticReason, + FlagKey: "featureA", + Metadata: map[string]interface{}{ + "description": "feature A", + }, + }, + { + Value: false, // code default (no defaultVariant set) + Variant: "", + Reason: model.FallbackReason, + FlagKey: "featureNoDefault", + Metadata: map[string]interface{}{}, + }, + { + Value: 42, + Variant: "high", + Reason: model.TargetingMatchReason, + FlagKey: "priority", + Metadata: map[string]interface{}{ + "tier": "premium", + }, + }, + }, + verify: func(t *testing.T, data []byte) { + var result BulkEvaluationResponse + err := json.Unmarshal(data, &result) + if err != nil { + t.Errorf("error unmarshalling: %v", err) + return + } + if len(result.Flags) != 3 { + t.Errorf("expected 3 flags, got %d", len(result.Flags)) + return + } + + // Verify first flag (normal static evaluation) + firstFlag, ok := result.Flags[0].(map[string]interface{}) + if !ok { + t.Errorf("first flag: expected map[string]interface{}, got %T", result.Flags[0]) + return + } + if firstFlag["key"] != "featureA" { + t.Errorf("first flag: expected key 'featureA', got '%v'", firstFlag["key"]) + } + if firstFlag["value"] != "on" { + t.Errorf("first flag: expected value 'on', got %v", firstFlag["value"]) + } + if firstFlag["variant"] != "on" { + t.Errorf("first flag: expected variant 'on', got '%v'", firstFlag["variant"]) + } + if firstFlag["reason"] != model.StaticReason { + t.Errorf("first flag: expected reason %v, got %v", model.StaticReason, firstFlag["reason"]) + } + + // Verify second flag (code default, should omit value and variant fields) + secondFlag, ok := result.Flags[1].(map[string]interface{}) + if !ok { + t.Errorf("second flag: expected map[string]interface{}, got %T", result.Flags[1]) + return + } + if secondFlag["key"] != "featureNoDefault" { + t.Errorf("second flag: expected key 'featureNoDefault', got '%v'", secondFlag["key"]) + } + if secondFlag["reason"] != model.DefaultReason { + t.Errorf("second flag: expected reason %v, got %v", model.DefaultReason, secondFlag["reason"]) + } + if _, hasValue := secondFlag["value"]; hasValue { + t.Errorf("second flag: value field should be omitted for code defaults, but found: %v", secondFlag["value"]) + } + if _, hasVariant := secondFlag["variant"]; hasVariant { + t.Errorf("second flag: variant field should be omitted for code defaults, but found: %v", secondFlag["variant"]) + } + + // Verify third flag (targeting match evaluation) + thirdFlag, ok := result.Flags[2].(map[string]interface{}) + if !ok { + t.Errorf("third flag: expected map[string]interface{}, got %T", result.Flags[2]) + return + } + if thirdFlag["key"] != "priority" { + t.Errorf("third flag: expected key 'priority', got '%v'", thirdFlag["key"]) + } + if thirdFlag["value"] != float64(42) { + t.Errorf("third flag: expected value 42, got %v", thirdFlag["value"]) + } + if thirdFlag["variant"] != "high" { + t.Errorf("third flag: expected variant 'high', got '%v'", thirdFlag["variant"]) + } + if thirdFlag["reason"] != model.TargetingMatchReason { + t.Errorf("third flag: expected reason %v, got %v", model.TargetingMatchReason, thirdFlag["reason"]) + } + }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { response := BulkEvaluationResponseFrom(test.input, model.Metadata{}) - marshal, err := json.Marshal(response) if err != nil { t.Errorf("error marshalling the response: %v", err) + return } - if test.marshalledOutput != string(marshal) { - t.Errorf("expected %s, got %s", test.marshalledOutput, string(marshal)) + if test.verify != nil { + test.verify(t, marshal) } }) } @@ -151,3 +367,84 @@ func TestErrorStatus(t *testing.T) { }) } } + +func TestZeroValuesAreMarshaled(t *testing.T) { + // This test verifies that zero-values (false, 0, empty string) are properly + // communicated in OFREP responses, even with omitempty tags on fields + tests := []struct { + name string + value interface{} + variant string + expectedInJSON bool + }{ + { + name: "boolean false is included", + value: false, + variant: "false", + expectedInJSON: true, + }, + { + name: "numeric zero is included", + value: float64(0), + variant: "zero", + expectedInJSON: true, + }, + { + name: "empty string is included", + value: "", + variant: "empty", + expectedInJSON: true, + }, + { + name: "nil value is omitted", + value: nil, + variant: "", + expectedInJSON: false, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + anyValue := evaluator.AnyValue{ + Value: test.value, + Variant: test.variant, + Reason: model.StaticReason, + FlagKey: "testFlag", + Metadata: map[string]interface{}{}, + } + + if test.value == nil { + anyValue.Reason = model.FallbackReason + } + + success := SuccessResponseFrom(anyValue) + marshaled, err := json.Marshal(success) + if err != nil { + t.Errorf("error marshalling: %v", err) + return + } + + var result map[string]interface{} + err = json.Unmarshal(marshaled, &result) + if err != nil { + t.Errorf("error unmarshalling: %v", err) + return + } + + _, hasValue := result["value"] + if test.expectedInJSON && !hasValue { + t.Errorf("expected value field to be in JSON for %s, but it was omitted: %s", test.name, string(marshaled)) + } + if !test.expectedInJSON && hasValue { + t.Errorf("expected value field to be omitted from JSON for %s, but it was present: %v", test.name, result["value"]) + } + + // For non-nil values, verify the actual value matches + if test.expectedInJSON && test.value != nil { + if result["value"] != test.value { + t.Errorf("expected value %v, but got %v", test.value, result["value"]) + } + } + }) + } +} diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index 01f235e7e..2996ebc47 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -3,11 +3,11 @@ module github.com/open-feature/flagd/flagd-proxy go 1.25.5 require ( - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 github.com/dimiro1/banner v1.1.0 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.13.1 + github.com/open-feature/flagd/core v0.11.8 github.com/prometheus/client_golang v1.23.0 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 @@ -17,7 +17,7 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.75.0 + google.golang.org/grpc v1.78.0 ) require ( @@ -25,11 +25,11 @@ require ( cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect cloud.google.com/go/storage v1.55.0 // indirect - connectrpc.com/connect v1.18.1 // indirect + connectrpc.com/connect v1.19.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect @@ -37,7 +37,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -62,17 +62,17 @@ require ( github.com/aws/smithy-go v1.22.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.35.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -116,26 +116,26 @@ require ( github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/pflag v1.0.6 // indirect - github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/zeebo/errs v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 // indirect go.opentelemetry.io/otel/sdk v1.38.0 // indirect go.opentelemetry.io/otel/trace v1.38.0 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect golang.org/x/sys v0.38.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect @@ -144,9 +144,9 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/protobuf v1.36.8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index 62d777196..84dc193cb 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -1,9 +1,7 @@ -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= -cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= -cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -13,8 +11,8 @@ cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= @@ -27,8 +25,8 @@ cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2zn cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= -connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= -connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= @@ -50,10 +48,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mo github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -107,10 +103,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -128,10 +122,10 @@ github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= -github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= -github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= -github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= +github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -149,10 +143,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -268,14 +260,10 @@ github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/cOO8N0n8dpbRc= github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= github.com/open-feature/flagd/core v0.11.8 h1:84uDdSzhtVNBnsjuAnBqBXbFwXC2CQ6aO5cNNKKM7uc= github.com/open-feature/flagd/core v0.11.8/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= -github.com/open-feature/flagd/core v0.13.1 h1:3LYTCHZbFBl1uJTroGFQEpkEHL6NcIANikC3LlsXxZw= -github.com/open-feature/flagd/core v0.13.1/go.mod h1:Oa6A6O2eluSuPcNGgOwrz3xaXUYanvQeHq2+rGySMBQ= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -289,8 +277,6 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -300,19 +286,19 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -325,8 +311,8 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= -github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= -github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -336,8 +322,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -352,42 +338,28 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= -github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -438,8 +410,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -510,6 +482,8 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.235.0 h1:C3MkpQSRxS1Jy6AkzTGKKrpSCOd2WOGrezZ+icKSkKo= google.golang.org/api v0.235.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -519,23 +493,17 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda h1:+2XxjfsAu6vqFxwGBRcHiMaDCuZiqXGDUDVWVtrFAnE= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -545,10 +513,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/flagd-proxy/tests/loadtest/go.mod b/flagd-proxy/tests/loadtest/go.mod index 37b4e8467..7ddf92ebe 100644 --- a/flagd-proxy/tests/loadtest/go.mod +++ b/flagd-proxy/tests/loadtest/go.mod @@ -5,17 +5,15 @@ go 1.25.5 toolchain go1.25.5 require ( - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 - google.golang.org/grpc v1.73.0 + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 + google.golang.org/grpc v1.78.0 ) require ( - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/protobuf v1.36.6 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/flagd-proxy/tests/loadtest/go.sum b/flagd-proxy/tests/loadtest/go.sum index 0d3d1bcbc..bfa17d75c 100644 --- a/flagd-proxy/tests/loadtest/go.sum +++ b/flagd-proxy/tests/loadtest/go.sum @@ -1,19 +1,40 @@ -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= diff --git a/flagd/go.mod b/flagd/go.mod index 3042ccd1d..ded98357a 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -3,14 +3,14 @@ module github.com/open-feature/flagd/flagd go 1.25.5 require ( - buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 - connectrpc.com/connect v1.18.1 + buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2 + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 + connectrpc.com/connect v1.19.1 github.com/dimiro1/banner v1.1.0 github.com/gorilla/mux v1.8.1 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.13.1 + github.com/open-feature/flagd/core v0.13.3 github.com/prometheus/client_golang v1.23.0 github.com/rs/cors v1.11.1 github.com/rs/xid v1.6.0 @@ -27,8 +27,8 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 golang.org/x/sync v0.18.0 - google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.8 + google.golang.org/grpc v1.78.0 + google.golang.org/protobuf v1.36.11 ) require ( @@ -36,7 +36,7 @@ require ( cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect cloud.google.com/go/storage v1.55.0 // indirect @@ -48,7 +48,7 @@ require ( github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect @@ -75,19 +75,19 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/diegoholiveira/jsonlogic/v3 v3.8.4 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.35.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -113,7 +113,6 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -138,19 +137,17 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/twmb/murmur3 v1.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/zeebo/errs v1.4.0 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect @@ -173,7 +170,7 @@ require ( golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/mod v0.29.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect @@ -182,8 +179,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/api v0.235.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index d5c55ec64..e707026df 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -1,11 +1,9 @@ -buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 h1:qnXaezo9s36RjysUq6omZlU3rjQNykMpqCXfCL/CH1Q= -buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1/go.mod h1:/9fZNSPUzUwGRzDAjyasa5NC+YFgQthby355ZVuKS2Q= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= -cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= -cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2 h1:n2DShwj5AfzieZKN2tid3gFt/HCZo/UUn4qMbUJ4H7M= +buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2/go.mod h1:NRDpVnsDW1gkVfxKOXVpUkW9Tx5SIUPXgqCUq3dftew= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -15,8 +13,8 @@ cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= @@ -29,8 +27,8 @@ cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2zn cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= -connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= -connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI= connectrpc.com/otelconnect v0.7.2/go.mod h1:JS7XUKfuJs2adhCnXhNHPHLz6oAaZniCJdSF00OZSew= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= @@ -54,10 +52,8 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mo github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= @@ -108,8 +104,6 @@ github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLo github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= -github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -117,10 +111,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= -github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= +github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -136,15 +128,17 @@ github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1 github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= -github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= -github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= -github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= +github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= +github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= +github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -162,10 +156,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= -github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= -github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -241,8 +233,6 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= @@ -250,6 +240,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-memdb v1.3.5 h1:b3taDMxCBCBVgyRrS1AZVHO14ubMYZB++QpNhBg+Nyo= github.com/hashicorp/go-memdb v1.3.5/go.mod h1:8IVKKBkVe+fxFgdFOYxzQQNjz+sWCyHCdIC/+5+Vy1Y= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -269,8 +261,6 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -297,14 +287,10 @@ github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/cOO8N0n8dpbRc= github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= -github.com/open-feature/flagd/core v0.12.1 h1:fCBenpE0/m/l1KiU6gjM59FUQPnqeuxnO9D4v3UDqu4= -github.com/open-feature/flagd/core v0.12.1/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= -github.com/open-feature/flagd/core v0.13.1 h1:3LYTCHZbFBl1uJTroGFQEpkEHL6NcIANikC3LlsXxZw= -github.com/open-feature/flagd/core v0.13.1/go.mod h1:Oa6A6O2eluSuPcNGgOwrz3xaXUYanvQeHq2+rGySMBQ= +github.com/open-feature/flagd/core v0.13.3 h1:naEvPiNPMtUpqhnsLSwD/21xB5wiNvv814B5CpQqX4M= +github.com/open-feature/flagd/core v0.13.3/go.mod h1:DIt7X93nGyVcwNuPlB9W/cSw9hdpA/42bw26BzctfVw= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -318,8 +304,6 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -329,16 +313,14 @@ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2 github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/otlptranslator v0.0.2 h1:+1CdeLVrRQ6Psmhnobldo0kTp96Rj80DRXRd5OSnMEQ= github.com/prometheus/otlptranslator v0.0.2/go.mod h1:P8AwMgdD7XEr6QRUJ2QWLpiAZTgTE2UYgjlu3svompI= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= @@ -361,8 +343,8 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= -github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= -github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -372,8 +354,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -392,96 +372,58 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= -github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= -go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= +go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0/go.mod h1:OvRg7gm5WRSCtxzGSsrFHbDLToYlStHNZQ+iPNIyD6g= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= -go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= -go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= +go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= -go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= -go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -534,8 +476,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -563,8 +505,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -608,6 +548,8 @@ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhS golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.235.0 h1:C3MkpQSRxS1Jy6AkzTGKKrpSCOd2WOGrezZ+icKSkKo= google.golang.org/api v0.235.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -617,23 +559,17 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= -google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda h1:+2XxjfsAu6vqFxwGBRcHiMaDCuZiqXGDUDVWVtrFAnE= +google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= -google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= -google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -643,10 +579,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/flagd/pkg/service/flag-evaluation/connect_service.go b/flagd/pkg/service/flag-evaluation/connect_service.go index 3fa1b4a93..cab5013a2 100644 --- a/flagd/pkg/service/flag-evaluation/connect_service.go +++ b/flagd/pkg/service/flag-evaluation/connect_service.go @@ -12,6 +12,7 @@ import ( "time" evaluationV1 "buf.build/gen/go/open-feature/flagd/connectrpc/go/flagd/evaluation/v1/evaluationv1connect" + evaluationV2 "buf.build/gen/go/open-feature/flagd/connectrpc/go/flagd/evaluation/v2/evaluationv2connect" schemaConnectV1 "buf.build/gen/go/open-feature/flagd/connectrpc/go/schema/v1/schemav1connect" "github.com/open-feature/flagd/core/pkg/evaluator" "github.com/open-feature/flagd/core/pkg/logger" @@ -36,20 +37,24 @@ import ( const ( ErrorPrefix = "FlagdError:" - flagdSchemaPrefix = "/flagd" + flagdSchemaPrefix = "/flagd" + flagdV2SchemaPrefix = "/flagd.evaluation.v2" ) -// bufSwitchHandler combines the handlers of the old and new evaluation schema and combines them into one -// this way we support both the new and the (deprecated) old schemas until only the new schema is supported +// bufSwitchHandler combines the handlers of the old and new evaluation schemas +// this way we support both the new (v2) and the old (v1 and deprecated) schemas // NOTE: this will not be required anymore when it is time to work on https://github.com/open-feature/flagd/issues/1088 type bufSwitchHandler struct { old http.Handler - new http.Handler + v1 http.Handler + v2 http.Handler } func (b bufSwitchHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - if strings.HasPrefix(request.URL.Path, flagdSchemaPrefix) { - b.new.ServeHTTP(writer, request) + if strings.HasPrefix(request.URL.Path, flagdV2SchemaPrefix) { + b.v2.ServeHTTP(writer, request) + } else if strings.HasPrefix(request.URL.Path, flagdSchemaPrefix) { + b.v1.ServeHTTP(writer, request) } else { b.old.ServeHTTP(writer, request) } @@ -168,9 +173,9 @@ func (s *ConnectService) setupServer(svcConf service.Configuration) (net.Listene _, oldHandler := schemaConnectV1.NewServiceHandler(fes, append(svcConf.Options, marshalOpts)...) - // register handler for new flag evaluation schema + // register handler for new flag evaluation schema (v1) - newFes := NewFlagEvaluationService(s.logger.WithFields(zap.String("component", "flagd.evaluation.v1")), + v1Fes := NewFlagEvaluationService(s.logger.WithFields(zap.String("component", "flagd.evaluation.v1")), s.eval, s.eventingConfiguration, s.metrics, @@ -179,11 +184,25 @@ func (s *ConnectService) setupServer(svcConf service.Configuration) (net.Listene svcConf.StreamDeadline, ) - _, newHandler := evaluationV1.NewServiceHandler(newFes, append(svcConf.Options, marshalOpts)...) + _, v1Handler := evaluationV1.NewServiceHandler(v1Fes, append(svcConf.Options, marshalOpts)...) + + // register handler for evaluation v2 schema (with optional value and variant) + + v2Fes := NewFlagEvaluationServiceV2(s.logger.WithFields(zap.String("component", "flagd.evaluation.v2")), + s.eval, + s.eventingConfiguration, + s.metrics, + svcConf.ContextValues, + svcConf.HeaderToContextKeyMappings, + svcConf.StreamDeadline, + ) + + _, v2Handler := evaluationV2.NewServiceHandler(v2Fes, append(svcConf.Options, marshalOpts)...) bs := bufSwitchHandler{ old: oldHandler, - new: newHandler, + v1: v1Handler, + v2: v2Handler, } s.serverMtx.Lock() diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go index 416aca047..3ba99393b 100644 --- a/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go @@ -4,6 +4,7 @@ import ( "fmt" evalV1 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v1" + evalV2 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v2" schemaV1 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/schema/v1" "connectrpc.com/connect" "google.golang.org/protobuf/types/known/structpb" @@ -171,3 +172,183 @@ func (r *objectResponse) SetResult(value map[string]any, variant, reason string, } return nil } + +// V2 response types with optional value and variant + +type responseV2[T constraints] interface { + SetResult(value T, variant, reason string, metadata map[string]interface{}) error + SetReasonOnly(reason string, metadata map[string]interface{}) error +} + +type booleanResponseV2 struct { + evalV2Resp *connect.Response[evalV2.ResolveBooleanResponse] +} + +func (r *booleanResponseV2) SetResult(value bool, variant, reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + r.evalV2Resp.Msg.Value = &value + if variant != "" { + r.evalV2Resp.Msg.Variant = &variant + } + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +func (r *booleanResponseV2) SetReasonOnly(reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + // Leave Value and Variant as nil (unset) + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +type stringResponseV2 struct { + evalV2Resp *connect.Response[evalV2.ResolveStringResponse] +} + +func (r *stringResponseV2) SetResult(value string, variant, reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + r.evalV2Resp.Msg.Value = &value + if variant != "" { + r.evalV2Resp.Msg.Variant = &variant + } + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +func (r *stringResponseV2) SetReasonOnly(reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + // Leave Value and Variant as nil (unset) + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +type floatResponseV2 struct { + evalV2Resp *connect.Response[evalV2.ResolveFloatResponse] +} + +func (r *floatResponseV2) SetResult(value float64, variant, reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + r.evalV2Resp.Msg.Value = &value + if variant != "" { + r.evalV2Resp.Msg.Variant = &variant + } + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +func (r *floatResponseV2) SetReasonOnly(reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + // Leave Value and Variant as nil (unset) + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + + return nil +} + +type intResponseV2 struct { + evalV2Resp *connect.Response[evalV2.ResolveIntResponse] +} + +func (r *intResponseV2) SetResult(value int64, variant, reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + r.evalV2Resp.Msg.Value = &value + if variant != "" { + r.evalV2Resp.Msg.Variant = &variant + } + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + return nil +} + +func (r *intResponseV2) SetReasonOnly(reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + + if r.evalV2Resp != nil { + // Leave Value and Variant as nil (unset) + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + return nil +} + +type objectResponseV2 struct { + evalV2Resp *connect.Response[evalV2.ResolveObjectResponse] +} + +func (r *objectResponseV2) SetResult(value map[string]any, variant, reason string, + metadata map[string]interface{}, +) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + if r.evalV2Resp != nil { + r.evalV2Resp.Msg.Reason = reason + val, err := structpb.NewStruct(value) + if err != nil { + return fmt.Errorf("struct response construction: %w", err) + } + + r.evalV2Resp.Msg.Value = val + if variant != "" { + r.evalV2Resp.Msg.Variant = &variant + } + r.evalV2Resp.Msg.Metadata = newStruct + } + return nil +} diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_v1.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_v1.go new file mode 100644 index 000000000..747a8742b --- /dev/null +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_v1.go @@ -0,0 +1,370 @@ +package service + +import ( + "context" + "errors" + "fmt" + "time" + + evalV1 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v1" + "connectrpc.com/connect" + "github.com/open-feature/flagd/core/pkg/evaluator" + "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/service" + "github.com/open-feature/flagd/core/pkg/store" + "github.com/open-feature/flagd/core/pkg/telemetry" + flagdService "github.com/open-feature/flagd/flagd/pkg/service" + "github.com/rs/xid" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + "google.golang.org/protobuf/types/known/structpb" +) + +type FlagEvaluationService struct { + logger *logger.Logger + eval evaluator.IEvaluator + metrics telemetry.IMetricsRecorder + eventingConfiguration IEvents + flagEvalTracer trace.Tracer + contextValues map[string]any + headerToContextKeyMappings map[string]string + deadline time.Duration +} + +// NewFlagEvaluationService creates a FlagEvaluationService with provided parameters +func NewFlagEvaluationService(log *logger.Logger, + eval evaluator.IEvaluator, + eventingCfg IEvents, + metricsRecorder telemetry.IMetricsRecorder, + contextValues map[string]any, + headerToContextKeyMappings map[string]string, + streamDeadline time.Duration, +) *FlagEvaluationService { + svc := &FlagEvaluationService{ + logger: log, + eval: eval, + metrics: &telemetry.NoopMetricsRecorder{}, + eventingConfiguration: eventingCfg, + flagEvalTracer: otel.Tracer("flagd.evaluation.v1"), + contextValues: contextValues, + headerToContextKeyMappings: headerToContextKeyMappings, + deadline: streamDeadline, + } + + if metricsRecorder != nil { + svc.metrics = metricsRecorder + } + + return svc +} + +// nolint:dupl,funlen +func (s *FlagEvaluationService) ResolveAll( + ctx context.Context, + req *connect.Request[evalV1.ResolveAllRequest], +) (*connect.Response[evalV1.ResolveAllResponse], error) { + reqID := xid.New().String() + defer s.logger.ClearFields(reqID) + + ctx, span := s.flagEvalTracer.Start(ctx, "resolveAll", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + res := &evalV1.ResolveAllResponse{ + Flags: make(map[string]*evalV1.AnyFlag), + } + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + evaluationContext := mergeContexts(req.Msg.GetContext().AsMap(), s.contextValues, req.Header(), s.headerToContextKeyMappings) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + resolutions, flagSetMetadata, err := s.eval.ResolveAllValues(ctx, reqID, evaluationContext) + if err != nil { + s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) + return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) + } + + span.SetAttributes(attribute.Int("feature_flag.count", len(resolutions))) + for _, resolved := range resolutions { + // register the impression and reason for each flag evaluated + s.metrics.RecordEvaluation(ctx, resolved.Error, resolved.Reason, resolved.Variant, resolved.FlagKey) + switch v := resolved.Value.(type) { + case bool: + res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ + Reason: resolved.Reason, + Variant: resolved.Variant, + Value: &evalV1.AnyFlag_BoolValue{ + BoolValue: v, + }, + } + case string: + res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ + Reason: resolved.Reason, + Variant: resolved.Variant, + Value: &evalV1.AnyFlag_StringValue{ + StringValue: v, + }, + } + case float64: + res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ + Reason: resolved.Reason, + Variant: resolved.Variant, + Value: &evalV1.AnyFlag_DoubleValue{ + DoubleValue: v, + }, + } + case map[string]any: + val, err := structpb.NewStruct(v) + if err != nil { + s.logger.ErrorWithID(reqID, fmt.Sprintf("struct response construction: %v", err)) + continue + } + res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ + Reason: resolved.Reason, + Variant: resolved.Variant, + Value: &evalV1.AnyFlag_ObjectValue{ + ObjectValue: val, + }, + } + } + metadata, err := structpb.NewStruct(resolved.Metadata) + if err != nil { + s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) + return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) + } + + res.Flags[resolved.FlagKey].Metadata = metadata + } + res.Metadata, err = structpb.NewStruct(flagSetMetadata) + if err != nil { + s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) + return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) + } + + return connect.NewResponse(res), nil +} + +// nolint: dupl +func (s *FlagEvaluationService) EventStream( + ctx context.Context, + req *connect.Request[evalV1.EventStreamRequest], + stream *connect.ServerStream[evalV1.EventStreamResponse], +) error { + // attach server-side stream deadline to context + s.logger.Debug("starting event stream for request") + + if s.deadline != 0 { + streamDeadline := time.Now().Add(s.deadline) + deadlineCtx, cancel := context.WithDeadline(ctx, streamDeadline) + ctx = deadlineCtx + defer cancel() + } + + s.logger.Debug("starting event stream for request") + requestNotificationChan := make(chan service.Notification, 1) + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + s.eventingConfiguration.Subscribe(ctx, req, &selector, requestNotificationChan) + defer s.eventingConfiguration.Unsubscribe(req) + + requestNotificationChan <- service.Notification{ + Type: service.ProviderReady, + } + for { + select { + case <-time.After(20 * time.Second): + err := stream.Send(&evalV1.EventStreamResponse{ + Type: string(service.KeepAlive), + }) + if err != nil { + s.logger.Error(err.Error()) + } + case notification := <-requestNotificationChan: + d, err := structpb.NewStruct(notification.Data) + if err != nil { + s.logger.Error(err.Error()) + } + err = stream.Send(&evalV1.EventStreamResponse{ + Type: string(notification.Type), + Data: d, + }) + if err != nil { + s.logger.Error(err.Error()) + } + case <-ctx.Done(): + if errors.Is(ctx.Err(), context.DeadlineExceeded) { + s.logger.Debug(fmt.Sprintf("server-side deadline of %s exceeded, exiting stream request with grpc error code 4", s.deadline.String())) + return connect.NewError(connect.CodeDeadlineExceeded, fmt.Errorf("%s", "stream closed due to server-side timeout")) + } + return nil + } + } +} + +func (s *FlagEvaluationService) ResolveBoolean( + ctx context.Context, + req *connect.Request[evalV1.ResolveBooleanRequest], +) (*connect.Response[evalV1.ResolveBooleanResponse], error) { + ctx, span := s.flagEvalTracer.Start(ctx, "resolveBoolean", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + res := connect.NewResponse(&evalV1.ResolveBooleanResponse{}) + err := resolve( + ctx, + s.logger, + s.eval.ResolveBooleanValue, + req.Header(), + req.Msg.GetFlagKey(), + req.Msg.GetContext(), + &booleanResponse{evalV1Resp: res}, + s.metrics, + s.contextValues, + s.headerToContextKeyMappings, + ) + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, fmt.Sprintf("error evaluating flag with key %s", req.Msg.GetFlagKey())) + } + + return res, err +} + +func (s *FlagEvaluationService) ResolveString( + ctx context.Context, + req *connect.Request[evalV1.ResolveStringRequest], +) (*connect.Response[evalV1.ResolveStringResponse], error) { + ctx, span := s.flagEvalTracer.Start(ctx, "resolveString", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + res := connect.NewResponse(&evalV1.ResolveStringResponse{}) + err := resolve( + ctx, + s.logger, + s.eval.ResolveStringValue, + req.Header(), + req.Msg.GetFlagKey(), + req.Msg.GetContext(), + &stringResponse{evalV1Resp: res}, + s.metrics, + s.contextValues, + s.headerToContextKeyMappings, + ) + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, fmt.Sprintf("error evaluating flag with key %s", req.Msg.GetFlagKey())) + } + + return res, err +} + +func (s *FlagEvaluationService) ResolveInt( + ctx context.Context, + req *connect.Request[evalV1.ResolveIntRequest], +) (*connect.Response[evalV1.ResolveIntResponse], error) { + ctx, span := s.flagEvalTracer.Start(ctx, "resolveInt", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + res := connect.NewResponse(&evalV1.ResolveIntResponse{}) + err := resolve( + ctx, + s.logger, + s.eval.ResolveIntValue, + req.Header(), + req.Msg.GetFlagKey(), + req.Msg.GetContext(), + &intResponse{evalV1Resp: res}, + s.metrics, + s.contextValues, + s.headerToContextKeyMappings, + ) + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, fmt.Sprintf("error evaluating flag with key %s", req.Msg.GetFlagKey())) + } + + return res, err +} + +func (s *FlagEvaluationService) ResolveFloat( + ctx context.Context, + req *connect.Request[evalV1.ResolveFloatRequest], +) (*connect.Response[evalV1.ResolveFloatResponse], error) { + ctx, span := s.flagEvalTracer.Start(ctx, "resolveFloat", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + res := connect.NewResponse(&evalV1.ResolveFloatResponse{}) + err := resolve( + ctx, + s.logger, + s.eval.ResolveFloatValue, + req.Header(), + req.Msg.GetFlagKey(), + req.Msg.GetContext(), + &floatResponse{evalV1Resp: res}, + s.metrics, + s.contextValues, + s.headerToContextKeyMappings, + ) + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, fmt.Sprintf("error evaluating flag with key %s", req.Msg.GetFlagKey())) + } + + return res, err +} + +func (s *FlagEvaluationService) ResolveObject( + ctx context.Context, + req *connect.Request[evalV1.ResolveObjectRequest], +) (*connect.Response[evalV1.ResolveObjectResponse], error) { + ctx, span := s.flagEvalTracer.Start(ctx, "resolveObject", trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) + selector := store.NewSelector(selectorExpression) + ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) + ctx = context.WithValue(ctx, evaluator.ProtoVersionKey, "v1") + + res := connect.NewResponse(&evalV1.ResolveObjectResponse{}) + err := resolve( + ctx, + s.logger, + s.eval.ResolveObjectValue, + req.Header(), + req.Msg.GetFlagKey(), + req.Msg.GetContext(), + &objectResponse{evalV1Resp: res}, + s.metrics, + s.contextValues, + s.headerToContextKeyMappings, + ) + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, fmt.Sprintf("error evaluating flag with key %s", req.Msg.GetFlagKey())) + } + + return res, err +} diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_v1_test.go similarity index 100% rename from flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go rename to flagd/pkg/service/flag-evaluation/flag_evaluator_v1_test.go diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2.go index 083173783..48bad2da1 100644 --- a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2.go +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2.go @@ -4,25 +4,27 @@ import ( "context" "errors" "fmt" + "net/http" "time" - evalV1 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v1" + evalV2 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v2" "connectrpc.com/connect" "github.com/open-feature/flagd/core/pkg/evaluator" "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/model" "github.com/open-feature/flagd/core/pkg/service" "github.com/open-feature/flagd/core/pkg/store" "github.com/open-feature/flagd/core/pkg/telemetry" flagdService "github.com/open-feature/flagd/flagd/pkg/service" "github.com/rs/xid" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" "google.golang.org/protobuf/types/known/structpb" ) -type FlagEvaluationService struct { +type FlagEvaluationServiceV2 struct { logger *logger.Logger eval evaluator.IEvaluator metrics telemetry.IMetricsRecorder @@ -33,21 +35,21 @@ type FlagEvaluationService struct { deadline time.Duration } -// NewFlagEvaluationService creates a FlagEvaluationService with provided parameters -func NewFlagEvaluationService(log *logger.Logger, +// NewFlagEvaluationServiceV2 creates a FlagEvaluationServiceV2 with provided parameters +func NewFlagEvaluationServiceV2(log *logger.Logger, eval evaluator.IEvaluator, eventingCfg IEvents, metricsRecorder telemetry.IMetricsRecorder, contextValues map[string]any, headerToContextKeyMappings map[string]string, streamDeadline time.Duration, -) *FlagEvaluationService { - svc := &FlagEvaluationService{ +) *FlagEvaluationServiceV2 { + svc := &FlagEvaluationServiceV2{ logger: log, eval: eval, metrics: &telemetry.NoopMetricsRecorder{}, eventingConfiguration: eventingCfg, - flagEvalTracer: otel.Tracer("flagd.evaluation.v1"), + flagEvalTracer: otel.Tracer("flagd.evaluation.v2"), contextValues: contextValues, headerToContextKeyMappings: headerToContextKeyMappings, deadline: streamDeadline, @@ -60,97 +62,11 @@ func NewFlagEvaluationService(log *logger.Logger, return svc } -// nolint:dupl,funlen -func (s *FlagEvaluationService) ResolveAll( - ctx context.Context, - req *connect.Request[evalV1.ResolveAllRequest], -) (*connect.Response[evalV1.ResolveAllResponse], error) { - reqID := xid.New().String() - defer s.logger.ClearFields(reqID) - - ctx, span := s.flagEvalTracer.Start(ctx, "resolveAll", trace.WithSpanKind(trace.SpanKindServer)) - defer span.End() - - res := &evalV1.ResolveAllResponse{ - Flags: make(map[string]*evalV1.AnyFlag), - } - - selectorExpression := req.Header().Get(flagdService.FLAGD_SELECTOR_HEADER) - selector := store.NewSelector(selectorExpression) - evaluationContext := mergeContexts(req.Msg.GetContext().AsMap(), s.contextValues, req.Header(), s.headerToContextKeyMappings) - ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - - resolutions, flagSetMetadata, err := s.eval.ResolveAllValues(ctx, reqID, evaluationContext) - if err != nil { - s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) - return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) - } - - span.SetAttributes(attribute.Int("feature_flag.count", len(resolutions))) - for _, resolved := range resolutions { - // register the impression and reason for each flag evaluated - s.metrics.RecordEvaluation(ctx, resolved.Error, resolved.Reason, resolved.Variant, resolved.FlagKey) - switch v := resolved.Value.(type) { - case bool: - res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ - Reason: resolved.Reason, - Variant: resolved.Variant, - Value: &evalV1.AnyFlag_BoolValue{ - BoolValue: v, - }, - } - case string: - res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ - Reason: resolved.Reason, - Variant: resolved.Variant, - Value: &evalV1.AnyFlag_StringValue{ - StringValue: v, - }, - } - case float64: - res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ - Reason: resolved.Reason, - Variant: resolved.Variant, - Value: &evalV1.AnyFlag_DoubleValue{ - DoubleValue: v, - }, - } - case map[string]any: - val, err := structpb.NewStruct(v) - if err != nil { - s.logger.ErrorWithID(reqID, fmt.Sprintf("struct response construction: %v", err)) - continue - } - res.Flags[resolved.FlagKey] = &evalV1.AnyFlag{ - Reason: resolved.Reason, - Variant: resolved.Variant, - Value: &evalV1.AnyFlag_ObjectValue{ - ObjectValue: val, - }, - } - } - metadata, err := structpb.NewStruct(resolved.Metadata) - if err != nil { - s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) - return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) - } - - res.Flags[resolved.FlagKey].Metadata = metadata - } - res.Metadata, err = structpb.NewStruct(flagSetMetadata) - if err != nil { - s.logger.WarnWithID(reqID, fmt.Sprintf("error resolving all flags: %v", err)) - return nil, fmt.Errorf("error resolving flags. Tracking ID: %s", reqID) - } - - return connect.NewResponse(res), nil -} - // nolint: dupl -func (s *FlagEvaluationService) EventStream( +func (s *FlagEvaluationServiceV2) EventStream( ctx context.Context, - req *connect.Request[evalV1.EventStreamRequest], - stream *connect.ServerStream[evalV1.EventStreamResponse], + req *connect.Request[evalV2.EventStreamRequest], + stream *connect.ServerStream[evalV2.EventStreamResponse], ) error { // attach server-side stream deadline to context s.logger.Debug("starting event stream for request") @@ -175,7 +91,7 @@ func (s *FlagEvaluationService) EventStream( for { select { case <-time.After(20 * time.Second): - err := stream.Send(&evalV1.EventStreamResponse{ + err := stream.Send(&evalV2.EventStreamResponse{ Type: string(service.KeepAlive), }) if err != nil { @@ -186,7 +102,7 @@ func (s *FlagEvaluationService) EventStream( if err != nil { s.logger.Error(err.Error()) } - err = stream.Send(&evalV1.EventStreamResponse{ + err = stream.Send(&evalV2.EventStreamResponse{ Type: string(notification.Type), Data: d, }) @@ -203,10 +119,10 @@ func (s *FlagEvaluationService) EventStream( } } -func (s *FlagEvaluationService) ResolveBoolean( +func (s *FlagEvaluationServiceV2) ResolveBoolean( ctx context.Context, - req *connect.Request[evalV1.ResolveBooleanRequest], -) (*connect.Response[evalV1.ResolveBooleanResponse], error) { + req *connect.Request[evalV2.ResolveBooleanRequest], +) (*connect.Response[evalV2.ResolveBooleanResponse], error) { ctx, span := s.flagEvalTracer.Start(ctx, "resolveBoolean", trace.WithSpanKind(trace.SpanKindServer)) defer span.End() @@ -214,15 +130,15 @@ func (s *FlagEvaluationService) ResolveBoolean( selector := store.NewSelector(selectorExpression) ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - res := connect.NewResponse(&evalV1.ResolveBooleanResponse{}) - err := resolve( + res := connect.NewResponse(&evalV2.ResolveBooleanResponse{}) + err := resolveV2( ctx, s.logger, s.eval.ResolveBooleanValue, req.Header(), req.Msg.GetFlagKey(), req.Msg.GetContext(), - &booleanResponse{evalV1Resp: res}, + &booleanResponseV2{evalV2Resp: res}, s.metrics, s.contextValues, s.headerToContextKeyMappings, @@ -235,10 +151,10 @@ func (s *FlagEvaluationService) ResolveBoolean( return res, err } -func (s *FlagEvaluationService) ResolveString( +func (s *FlagEvaluationServiceV2) ResolveString( ctx context.Context, - req *connect.Request[evalV1.ResolveStringRequest], -) (*connect.Response[evalV1.ResolveStringResponse], error) { + req *connect.Request[evalV2.ResolveStringRequest], +) (*connect.Response[evalV2.ResolveStringResponse], error) { ctx, span := s.flagEvalTracer.Start(ctx, "resolveString", trace.WithSpanKind(trace.SpanKindServer)) defer span.End() @@ -246,15 +162,15 @@ func (s *FlagEvaluationService) ResolveString( selector := store.NewSelector(selectorExpression) ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - res := connect.NewResponse(&evalV1.ResolveStringResponse{}) - err := resolve( + res := connect.NewResponse(&evalV2.ResolveStringResponse{}) + err := resolveV2( ctx, s.logger, s.eval.ResolveStringValue, req.Header(), req.Msg.GetFlagKey(), req.Msg.GetContext(), - &stringResponse{evalV1Resp: res}, + &stringResponseV2{evalV2Resp: res}, s.metrics, s.contextValues, s.headerToContextKeyMappings, @@ -267,10 +183,10 @@ func (s *FlagEvaluationService) ResolveString( return res, err } -func (s *FlagEvaluationService) ResolveInt( +func (s *FlagEvaluationServiceV2) ResolveInt( ctx context.Context, - req *connect.Request[evalV1.ResolveIntRequest], -) (*connect.Response[evalV1.ResolveIntResponse], error) { + req *connect.Request[evalV2.ResolveIntRequest], +) (*connect.Response[evalV2.ResolveIntResponse], error) { ctx, span := s.flagEvalTracer.Start(ctx, "resolveInt", trace.WithSpanKind(trace.SpanKindServer)) defer span.End() @@ -278,15 +194,15 @@ func (s *FlagEvaluationService) ResolveInt( selector := store.NewSelector(selectorExpression) ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - res := connect.NewResponse(&evalV1.ResolveIntResponse{}) - err := resolve( + res := connect.NewResponse(&evalV2.ResolveIntResponse{}) + err := resolveV2( ctx, s.logger, s.eval.ResolveIntValue, req.Header(), req.Msg.GetFlagKey(), req.Msg.GetContext(), - &intResponse{evalV1Resp: res}, + &intResponseV2{evalV2Resp: res}, s.metrics, s.contextValues, s.headerToContextKeyMappings, @@ -299,10 +215,10 @@ func (s *FlagEvaluationService) ResolveInt( return res, err } -func (s *FlagEvaluationService) ResolveFloat( +func (s *FlagEvaluationServiceV2) ResolveFloat( ctx context.Context, - req *connect.Request[evalV1.ResolveFloatRequest], -) (*connect.Response[evalV1.ResolveFloatResponse], error) { + req *connect.Request[evalV2.ResolveFloatRequest], +) (*connect.Response[evalV2.ResolveFloatResponse], error) { ctx, span := s.flagEvalTracer.Start(ctx, "resolveFloat", trace.WithSpanKind(trace.SpanKindServer)) defer span.End() @@ -310,15 +226,15 @@ func (s *FlagEvaluationService) ResolveFloat( selector := store.NewSelector(selectorExpression) ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - res := connect.NewResponse(&evalV1.ResolveFloatResponse{}) - err := resolve( + res := connect.NewResponse(&evalV2.ResolveFloatResponse{}) + err := resolveV2( ctx, s.logger, s.eval.ResolveFloatValue, req.Header(), req.Msg.GetFlagKey(), req.Msg.GetContext(), - &floatResponse{evalV1Resp: res}, + &floatResponseV2{evalV2Resp: res}, s.metrics, s.contextValues, s.headerToContextKeyMappings, @@ -331,10 +247,10 @@ func (s *FlagEvaluationService) ResolveFloat( return res, err } -func (s *FlagEvaluationService) ResolveObject( +func (s *FlagEvaluationServiceV2) ResolveObject( ctx context.Context, - req *connect.Request[evalV1.ResolveObjectRequest], -) (*connect.Response[evalV1.ResolveObjectResponse], error) { + req *connect.Request[evalV2.ResolveObjectRequest], +) (*connect.Response[evalV2.ResolveObjectResponse], error) { ctx, span := s.flagEvalTracer.Start(ctx, "resolveObject", trace.WithSpanKind(trace.SpanKindServer)) defer span.End() @@ -342,15 +258,15 @@ func (s *FlagEvaluationService) ResolveObject( selector := store.NewSelector(selectorExpression) ctx = context.WithValue(ctx, store.SelectorContextKey{}, selector) - res := connect.NewResponse(&evalV1.ResolveObjectResponse{}) - err := resolve( + res := connect.NewResponse(&evalV2.ResolveObjectResponse{}) + err := resolveV2( ctx, s.logger, s.eval.ResolveObjectValue, req.Header(), req.Msg.GetFlagKey(), req.Msg.GetContext(), - &objectResponse{evalV1Resp: res}, + &objectResponseV2{evalV2Resp: res}, s.metrics, s.contextValues, s.headerToContextKeyMappings, @@ -362,3 +278,65 @@ func (s *FlagEvaluationService) ResolveObject( return res, err } + +func resolveV2[T constraints](ctx context.Context, logger *logger.Logger, resolver resolverSignature[T], header http.Header, flagKey string, + evaluationContext *structpb.Struct, resp response[T], metrics telemetry.IMetricsRecorder, + configContextValues map[string]any, configHeaderToContextKeyMappings map[string]string, +) error { + reqID := xid.New().String() + defer logger.ClearFields(reqID) + + mergedContext := mergeContexts(evaluationContext.AsMap(), configContextValues, header, configHeaderToContextKeyMappings) + + logger.WriteFields( + reqID, + zap.String("flag-key", flagKey), + zap.Strings("context-keys", formatContextKeys(mergedContext)), + ) + + var evalErrFormatted error + result, variant, reason, metadata, evalErr := resolver(ctx, reqID, flagKey, mergedContext) + if evalErr != nil { + logger.WarnWithID(reqID, fmt.Sprintf("returning error response, reason: %v", evalErr)) + reason = model.ErrorReason + evalErrFormatted = errFormat(evalErr) + } + + if metrics != nil { + metrics.RecordEvaluation(ctx, evalErr, reason, variant, flagKey) + } + + spanFromContext := trace.SpanFromContext(ctx) + spanFromContext.SetAttributes(telemetry.SemConvFeatureFlagAttributes(flagKey, variant)...) + + if reason == model.FallbackReason { + if respV2, ok := resp.(responseV2[T]); ok { + if err := respV2.SetReasonOnly(model.DefaultReason, metadata); err != nil { + logger.ErrorWithID(reqID, err.Error()) + return fmt.Errorf("error setting response result: %w", err) + } + } + } else { + if err := resp.SetResult(result, variant, reason, metadata); err != nil && evalErr == nil { + logger.ErrorWithID(reqID, err.Error()) + return fmt.Errorf("error setting response result: %w", err) + } + } + + return evalErrFormatted +} + +// errFormatV2 formats errors for V2 API, excluding FLAG_NOT_FOUND and PARSE_ERROR which are not errors in V2 +func errFormatV2(err error) error { + ReadableErrorMsg := model.GetErrorMessage(err.Error()) + switch err.Error() { + case model.FlagDisabledErrorCode: + return connect.NewError(connect.CodeNotFound, fmt.Errorf("%s", ReadableErrorMsg)) + case model.TypeMismatchErrorCode: + return connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("%s", ReadableErrorMsg)) + case model.GeneralErrorCode: + return connect.NewError(connect.CodeUnknown, fmt.Errorf("%s", ReadableErrorMsg)) + } + + return err +} diff --git a/flagd/pkg/service/flag-evaluation/ofrep/handler.go b/flagd/pkg/service/flag-evaluation/ofrep/handler.go index 502b77373..7abbd053e 100644 --- a/flagd/pkg/service/flag-evaluation/ofrep/handler.go +++ b/flagd/pkg/service/flag-evaluation/ofrep/handler.go @@ -73,6 +73,7 @@ func NewOfrepHandler( return otelhttp.NewHandler(router, "flagd.ofrep") } + func (h *handler) HandleFlagEvaluation(w http.ResponseWriter, r *http.Request) { requestID := xid.New().String() defer h.Logger.ClearFields(requestID) diff --git a/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go b/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go index 9621e55d7..3ae4d4635 100644 --- a/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go +++ b/flagd/pkg/service/flag-evaluation/ofrep/handler_test.go @@ -109,6 +109,22 @@ func Test_handler_HandleFlagEvaluation(t *testing.T) { expectedStatus: http.StatusBadRequest, expectedResponseType: ofrep.EvaluationError{}, }, + { + name: "code default - flag without defaultVariant", + method: http.MethodPost, + path: "/ofrep/v1/evaluate/flags/featureNoDefault", + input: bytes.NewReader([]byte{}), + mockAnyResponse: &evaluator.AnyValue{ + Value: false, // code default (no defaultVariant) + Variant: "", + Reason: model.FallbackReason, + FlagKey: "featureNoDefault", + Metadata: nil, + Error: nil, + }, + expectedStatus: http.StatusOK, + expectedResponseType: ofrep.EvaluationSuccess{}, + }, } for _, test := range tests { @@ -202,6 +218,30 @@ func Test_handler_HandleBulkEvaluation(t *testing.T) { input: bytes.NewReader([]byte("{some invalid context}")), expectedStatus: http.StatusBadRequest, }, + { + name: "bulk evaluation with code defaults", + method: http.MethodPost, + input: bytes.NewReader([]byte{}), + mockAnyResponse: []evaluator.AnyValue{ + { + Value: true, + Variant: "on", + Reason: model.StaticReason, + FlagKey: "featureWithDefault", + Metadata: nil, + Error: nil, + }, + { + Value: false, // code default (no defaultVariant) + Variant: "", + Reason: model.FallbackReason, + FlagKey: "featureNoDefault", + Metadata: map[string]interface{}{}, + Error: nil, + }, + }, + expectedStatus: http.StatusOK, + }, } for _, test := range tests { diff --git a/test/integration/go.mod b/test/integration/go.mod index 17dbd0866..e154c24ff 100644 --- a/test/integration/go.mod +++ b/test/integration/go.mod @@ -12,7 +12,7 @@ require ( buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 // indirect buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 // indirect buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 // indirect - connectrpc.com/connect v1.18.1 // indirect + connectrpc.com/connect v1.19.1 // indirect connectrpc.com/otelconnect v0.7.2 // indirect dario.cat/mergo v1.0.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect diff --git a/test/integration/go.sum b/test/integration/go.sum index 3e719ca05..43bff4e38 100644 --- a/test/integration/go.sum +++ b/test/integration/go.sum @@ -4,8 +4,8 @@ buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= -connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= -connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI= connectrpc.com/otelconnect v0.7.2/go.mod h1:JS7XUKfuJs2adhCnXhNHPHLz6oAaZniCJdSF00OZSew= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= diff --git a/test/zero-downtime-flagd-proxy/go.mod b/test/zero-downtime-flagd-proxy/go.mod index 9be8701a1..5fddc88b2 100644 --- a/test/zero-downtime-flagd-proxy/go.mod +++ b/test/zero-downtime-flagd-proxy/go.mod @@ -5,17 +5,15 @@ go 1.25.5 toolchain go1.25.5 require ( - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 - google.golang.org/grpc v1.73.0 + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 + google.golang.org/grpc v1.78.0 ) require ( - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/protobuf v1.36.6 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/protobuf v1.36.11 // indirect ) diff --git a/test/zero-downtime-flagd-proxy/go.sum b/test/zero-downtime-flagd-proxy/go.sum index 0d3d1bcbc..bfa17d75c 100644 --- a/test/zero-downtime-flagd-proxy/go.sum +++ b/test/zero-downtime-flagd-proxy/go.sum @@ -1,19 +1,40 @@ -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= From ff28fd70ab30583ef3ecd59ab6b375dc66408f69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 04:08:49 -0500 Subject: [PATCH 33/97] chore: release main (#1887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.14.0 ## [0.14.0](https://github.com/open-feature/flagd/compare/flagd/v0.13.3...flagd/v0.14.0) (2026-03-04) ### ⚠ BREAKING CHANGES * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) * this is only a minor change impacting OFREP; now flags without default variants are returned without value/variant feilds ### ✨ New Features * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176)) * this is only a minor change impacting OFREP; now flags without default variants are returned without value/variant feilds
flagd-proxy: 0.9.0 ## [0.9.0](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.3...flagd-proxy/v0.9.0) (2026-03-04) ### ⚠ BREAKING CHANGES * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ### ✨ New Features * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176))
core: 0.14.0 ## [0.14.0](https://github.com/open-feature/flagd/compare/core/v0.13.3...core/v0.14.0) (2026-03-04) ### ⚠ BREAKING CHANGES * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ### ✨ New Features * no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Todd Baert Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 11 +++++++++++ flagd-proxy/CHANGELOG.md | 11 +++++++++++ flagd/CHANGELOG.md | 13 +++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 74ed29f3e..aa3969e19 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.13.3", - "flagd-proxy": "0.8.3", - "core": "0.13.3" + "flagd": "0.14.0", + "flagd-proxy": "0.9.0", + "core": "0.14.0" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 07efad5f6..45f7b777e 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.14.0](https://github.com/open-feature/flagd/compare/core/v0.13.3...core/v0.14.0) (2026-03-04) + + +### ⚠ BREAKING CHANGES + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) + +### ✨ New Features + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176)) + ## [0.13.3](https://github.com/open-feature/flagd/compare/core/v0.13.2...core/v0.13.3) (2026-02-09) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index c3103ac7c..e733c2546 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.9.0](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.3...flagd-proxy/v0.9.0) (2026-03-04) + + +### ⚠ BREAKING CHANGES + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) + +### ✨ New Features + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176)) + ## [0.8.3](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.8.2...flagd-proxy/v0.8.3) (2026-01-09) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index ba300937b..186b5526a 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [0.14.0](https://github.com/open-feature/flagd/compare/flagd/v0.13.3...flagd/v0.14.0) (2026-03-04) + + +### ⚠ BREAKING CHANGES + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) + * this is only a minor change impacting OFREP; now flags without default variants are returned without value/variant feilds + +### ✨ New Features + +* no `defaultVariant` -> code default (previosuly FLAG_NOT_FOUND) ([#1862](https://github.com/open-feature/flagd/issues/1862)) ([89117d8](https://github.com/open-feature/flagd/commit/89117d8eaba0e9d205b3b47544528c42d5698176)) + * this is only a minor change impacting OFREP; now flags without default variants are returned without value/variant feilds + ## [0.13.3](https://github.com/open-feature/flagd/compare/flagd/v0.13.2...flagd/v0.13.3) (2026-02-09) From 9334b5e51664f1d59d559a997d00b2c96c825a3d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 12:40:16 +0000 Subject: [PATCH 34/97] fix(security): update vulnerability-updates [security] (#1884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > ℹ️ **Note** > > This PR body was truncated due to platform limits. This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/open-feature/flagd/core](https://redirect.github.com/open-feature/flagd) | `v0.11.8` → `v0.13.1` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fopen-feature%2fflagd%2fcore/v0.13.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fopen-feature%2fflagd%2fcore/v0.11.8/v0.13.1?slim=true) | | [go.opentelemetry.io/otel/sdk](https://redirect.github.com/open-telemetry/opentelemetry-go) | `v1.38.0` → `v1.40.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/go.opentelemetry.io%2fotel%2fsdk/v1.40.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/go.opentelemetry.io%2fotel%2fsdk/v1.38.0/v1.40.0?slim=true) | ### GitHub Vulnerability Alerts #### [GHSA-4c5f-9mj4-m247](https://redirect.github.com/open-feature/flagd/security/advisories/GHSA-4c5f-9mj4-m247) ### Summary In 2025, several vulnerabilities in the Go Standard Library were disclosed, impacting Go-based applications like flagd (the evaluation engine for OpenFeature). These CVEs primarily focus on Denial of Service (DoS) through resource exhaustion and Race Conditions in database handling. | CVE ID | Impacted Package | Severity | Description & Impact on flagd | | -- | -- | -- | -- | | CVE-2025-47907 | database/sql | 7.0 (High) | Race Condition: Canceling a query during a Scan call can return data from the wrong query. Critical if flagd uses SQL-based sync providers (e.g., Postgres), potentially leading to incorrect flag configurations. | | CVE-2025-61725 | net/mail | 7.5 (High) | DoS: Inefficient complexity in ParseAddress. Attackers can provide crafted email strings with large domain literals to exhaust CPU if flagd parses email-formatted metadata. | | CVE-2025-61723 | encoding/pem | 7.5 (High) | DoS: Quadratic complexity when parsing invalid PEM inputs. Relevant if flagd loads TLS certificates or keys via PEM files from untrusted sources. | | CVE-2025-61729 | crypto/x509 | 7.5 (High) | Resource Exhaustion: HostnameError.Error() lacks string concatenation limits. A malicious TLS certificate with thousands of hostnames could crash flagd during connection handshakes. | | CVE-2025-58188 | net/http | Medium | Request Smuggling: Improper header handling in HTTP/1.1. Could allow attackers to bypass security filters positioned in front of flagd sync or evaluation APIs. | | CVE-2025-58187 | archive/zip | Medium | DoS: Improper validation of malformed ZIP archives. Impacts flagd if configured to fetch and unpack zipped configuration bundles from remote providers. | #### [CVE-2026-24051](https://redirect.github.com/open-telemetry/opentelemetry-go/security/advisories/GHSA-9h8m-3fm2-qjrq) ### Impact The OpenTelemetry Go SDK in version `v1.20.0`-`1.39.0` is vulnerable to Path Hijacking (Untrusted Search Paths) on macOS/Darwin systems. The resource detection code in `sdk/resource/host_id.go` executes the `ioreg` system command using a search path. An attacker with the ability to locally modify the PATH environment variable can achieve Arbitrary Code Execution (ACE) within the context of the application. ### Patches This has been patched in [d45961b](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/d45961bcda453fcbdb6469c22d6e88a1f9970a53), which was released with `v1.40.0`. ### References - [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html) --- ### Release Notes
open-feature/flagd (github.com/open-feature/flagd/core) ### [`v0.12.1`](https://redirect.github.com/open-feature/flagd/releases/tag/flagd/v0.12.1): flagd: v0.12.1 ##### 🐛 Bug Fixes - **deps:** update module github.com/open-feature/flagd/core to v0.11.0 ([#​1541](https://redirect.github.com/open-feature/flagd/issues/1541)) ([986a436](https://redirect.github.com/open-feature/flagd/commit/986a436e10e9766b897319085cf7dbbe2f10cb24)) - **deps:** update module golang.org/x/sync to v0.11.0 ([#​1543](https://redirect.github.com/open-feature/flagd/issues/1543)) ([7d6c0dc](https://redirect.github.com/open-feature/flagd/commit/7d6c0dc6e6e6955af1e5225807deeb2b6797900b)) ### [`v0.12.0`](https://redirect.github.com/open-feature/flagd/releases/tag/flagd/v0.12.0): flagd: v0.12.0 ##### ⚠ BREAKING CHANGES - flagSetMetadata in OFREP/ResolveAll, core refactors ([#​1540](https://redirect.github.com/open-feature/flagd/issues/1540)) ##### 🐛 Bug Fixes - **deps:** update module buf.build/gen/go/open-feature/flagd/connectrpc/go to v1.18.1-20250127221518-be6d1143b690.1 ([#​1535](https://redirect.github.com/open-feature/flagd/issues/1535)) ([d5ec921](https://redirect.github.com/open-feature/flagd/commit/d5ec921f02263615cd87625e211ba82b0811d041)) - **deps:** update module buf.build/gen/go/open-feature/flagd/grpc/go to v1.5.1-20250127221518-be6d1143b690.2 ([#​1536](https://redirect.github.com/open-feature/flagd/issues/1536)) ([e23060f](https://redirect.github.com/open-feature/flagd/commit/e23060f24b2a714ae748e6b37d0d06b7caa1c95c)) - **deps:** update module buf.build/gen/go/open-feature/flagd/protocolbuffers/go to v1.36.4-20241220192239-696330adaff0.1 ([#​1529](https://redirect.github.com/open-feature/flagd/issues/1529)) ([8881a80](https://redirect.github.com/open-feature/flagd/commit/8881a804b4055da0127a16b8fc57022d24906e1b)) - **deps:** update module buf.build/gen/go/open-feature/flagd/protocolbuffers/go to v1.36.4-20250127221518-be6d1143b690.1 ([#​1537](https://redirect.github.com/open-feature/flagd/issues/1537)) ([f74207b](https://redirect.github.com/open-feature/flagd/commit/f74207bc13b75bae4275bc486df51e2da569dd41)) - **deps:** update module github.com/open-feature/flagd/core to v0.10.8 ([#​1526](https://redirect.github.com/open-feature/flagd/issues/1526)) ([fbf2ed5](https://redirect.github.com/open-feature/flagd/commit/fbf2ed527fcf3b300808c7b835a8d891df7b88a8)) - **deps:** update module google.golang.org/grpc to v1.70.0 ([#​1528](https://redirect.github.com/open-feature/flagd/issues/1528)) ([79b2b0a](https://redirect.github.com/open-feature/flagd/commit/79b2b0a6bbd48676dcbdd2393feb8247529bf29c)) ##### ✨ New Features - flagSetMetadata in OFREP/ResolveAll, core refactors ([#​1540](https://redirect.github.com/open-feature/flagd/issues/1540)) ([b49abf9](https://redirect.github.com/open-feature/flagd/commit/b49abf95069da93bdf8369c8aa0ae40e698df760))
open-telemetry/opentelemetry-go (go.opentelemetry.io/otel/sdk) ### [`v1.40.0`](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...v1.40.0) [Compare Source](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...v1.40.0) ### [`v1.39.0`](https://redirect.github.com/open-telemetry/opentelemetry-go/releases/tag/v1.39.0) [Compare Source](https://redirect.github.com/open-telemetry/opentelemetry-go/compare/v1.38.0...v1.39.0) #### Overview ##### Added - Greatly reduce the cost of recording metrics in `go.opentelemetry.io/otel/sdk/metric` using hashing for map keys. ([#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7175)) - Add `WithInstrumentationAttributeSet` option to `go.opentelemetry.io/otel/log`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/trace` packages. This provides a concurrent-safe and performant alternative to `WithInstrumentationAttributes` by accepting a pre-constructed `attribute.Set`. ([#​7287](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7287)) - Add experimental observability for the Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus`. Check the `go.opentelemetry.io/otel/exporters/prometheus/internal/x` package documentation for more information. ([#​7345](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7345)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. ([#​7353](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7353)) - Add temporality selector functions `DeltaTemporalitySelector`, `CumulativeTemporalitySelector`, `LowMemoryTemporalitySelector` to `go.opentelemetry.io/otel/sdk/metric`. ([#​7434](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7434)) - Add experimental observability metrics for simple log processor in `go.opentelemetry.io/otel/sdk/log`. ([#​7548](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7548)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7459](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7459)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. ([#​7486](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7486)) - Add experimental observability metrics for simple span processor in `go.opentelemetry.io/otel/sdk/trace`. ([#​7374](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7374)) - Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7512](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7512)) - Add experimental observability metrics for manual reader in `go.opentelemetry.io/otel/sdk/metric`. ([#​7524](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7524)) - Add experimental observability metrics for periodic reader in `go.opentelemetry.io/otel/sdk/metric`. ([#​7571](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7571)) - Support `OTEL_EXPORTER_OTLP_LOGS_INSECURE` and `OTEL_EXPORTER_OTLP_INSECURE` environmental variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7608](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7608)) - Add `Enabled` method to the `Processor` interface in `go.opentelemetry.io/otel/sdk/log`. All `Processor` implementations now include an `Enabled` method. ([#​7639](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7639)) - The `go.opentelemetry.io/otel/semconv/v1.38.0` package. The package contains semantic conventions from the `v1.38.0` version of the OpenTelemetry Semantic Conventions. See the [migration documentation](./semconv/v1.38.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.37.0.`([#​7648](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7648)) ##### Changed - `Distinct` in `go.opentelemetry.io/otel/attribute` is no longer guaranteed to uniquely identify an attribute set. Collisions between `Distinct` values for different Sets are possible with extremely high cardinality (billions of series per instrument), but are highly unlikely. ([#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7175)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/trace` synchronously de-duplicates the passed attributes instead of delegating it to the returned `TracerOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/meter` synchronously de-duplicates the passed attributes instead of delegating it to the returned `MeterOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/log` synchronously de-duplicates the passed attributes instead of delegating it to the returned `LoggerOption`. ([#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7266)) - Rename the `OTEL_GO_X_SELF_OBSERVABILITY` environment variable to `OTEL_GO_X_OBSERVABILITY` in `go.opentelemetry.io/otel/sdk/trace`, `go.opentelemetry.io/otel/sdk/log`, and `go.opentelemetry.io/otel/exporters/stdout/stdouttrace`. ([#​7302](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7302)) - Improve performance of histogram `Record` in `go.opentelemetry.io/otel/sdk/metric` when min and max are disabled using `NoMinMax`. ([#​7306](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7306)) - Improve error handling for dropped data during translation by using `prometheus.NewInvalidMetric` in `go.opentelemetry.io/otel/exporters/prometheus`. ⚠️ **Breaking Change:** Previously, these cases were only logged and scrapes succeeded. Now, when translation would drop data (e.g., invalid label/value), the exporter emits a `NewInvalidMetric`, and Prometheus scrapes **fail with HTTP 500** by default. To preserve the prior behavior (scrapes succeed while errors are logged), configure your Prometheus HTTP handler with: `promhttp.HandlerOpts{ ErrorHandling: promhttp.ContinueOnError }`. ([#​7363](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7363)) - Replace fnv hash with xxhash in `go.opentelemetry.io/otel/attribute` for better performance. ([#​7371](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7371)) - The default `TranslationStrategy` in `go.opentelemetry.io/exporters/prometheus` is changed from `otlptranslator.NoUTF8EscapingWithSuffixes` to `otlptranslator.UnderscoreEscapingWithSuffixes`. ([#​7421](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7421)) - Improve performance of concurrent measurements in `go.opentelemetry.io/otel/sdk/metric`. ([#​7427](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7427)) - Include W3C TraceFlags (bits 0–7) in the OTLP `Span.Flags` field in `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracehttp` and `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7438](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7438)) - The `ErrorType` function in `go.opentelemetry.io/otel/semconv/v1.37.0` now handles custom error types. If an error implements an `ErrorType() string` method, the return value of that method will be used as the error type. ([#​7442](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7442)) ##### Fixed - Fix `WithInstrumentationAttributes` options in `go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/log` to properly merge attributes when passed multiple times instead of replacing them. Attributes with duplicate keys will use the last value passed. ([#​7300](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7300)) - The equality of `attribute.Set` when using the `Equal` method is not affected by the user overriding the empty set pointed to by `attribute.EmptySet` in `go.opentelemetry.io/otel/attribute`. ([#​7357](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7357)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. ([#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7372)) - Fix `AddAttributes`, `SetAttributes`, `SetBody` on `Record` in `go.opentelemetry.io/otel/sdk/log` to not mutate input. ([#​7403](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7403)) - Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.37.0`. ([#​7655](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7655)) - Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.36.0`. ([#​7656](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7656)) ##### Removed - Drop support for \[Go 1.23]. ([#​7274](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7274)) - Remove the `FilterProcessor` interface in `go.opentelemetry.io/otel/sdk/log`. The `Enabled` method has been added to the `Processor` interface instead. All `Processor` implementations must now implement the `Enabled` method. Custom processors that do not filter records can implement `Enabled` to return `true`. ([#​7639](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7639)) #### What's Changed - Drop support for Go 1.23 by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7274](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7274) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.40.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7275](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7275) - chore(deps): update module github.com/securego/gosec/v2 to v2.22.8 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7276](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7276) - fix(deps): update module github.com/golangci/golangci-lint/v2 to v2.4.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7277](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7277) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7188](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7188) - fix(deps): update module github.com/opentracing-contrib/go-grpc to v0.1.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7281](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7281) - fix(deps): update googleapis to [`ef028d9`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/ef028d9) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7279](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7279) - chore(deps): update module github.com/rogpeppe/go-internal to v1.14.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7283](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7283) - chore(deps): update module github.com/spf13/pflag to v1.0.9 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7282](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7282) - fix(deps): update github.com/opentracing-contrib/go-grpc/test digest to [`0261db7`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/0261db7) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7278](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7278) - Fix missing link in changelog by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7273](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7273) - chore(deps): update module github.com/spf13/cobra to v1.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7285](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7285) - chore(deps): update github/codeql-action action to v3.30.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7284](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7284) - chore(deps): update module github.com/spf13/cobra to v1.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7286](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7286) - Add tracetest example for testing instrumentation by [@​adity1raut](https://redirect.github.com/adity1raut) in [#​7107](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7107) - Fix schema urls by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7288](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7288) - chore(deps): update module github.com/spf13/pflag to v1.0.10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7291](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7291) - chore(deps): update benchmark-action/github-action-benchmark action to v1.20.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7293](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7293) - chore(deps): update module github.com/ghostiam/protogetter to v0.3.16 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7289](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7289) - chore(deps): update module github.com/golangci/go-printf-func-name to v0.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7290](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7290) - chore(deps): update module mvdan.cc/gofumpt to v0.9.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7292](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7292) - fix(deps): update module go.opentelemetry.io/proto/otlp to v1.8.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7296](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7296) - chore(deps): update actions/stale action to v10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7299](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7299) - chore(deps): update actions/setup-go action to v6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7298](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7298) - fix(deps): update module github.com/prometheus/client\_golang to v1.23.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7304](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7304) - chore(deps): update codecov/codecov-action action to v5.5.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7303](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7303) - Add Observability section to CONTRIBUTING doc by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7272](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7272) - chore(deps): update module github.com/bombsimon/wsl/v5 to v5.2.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7309](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7309) - chore(deps): update golang.org/x/telemetry digest to [`9b996f7`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9b996f7) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7308](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7308) - chore(deps): update github/codeql-action action to v3.30.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7312](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7312) - chore(deps): update github.com/grafana/regexp digest to [`f7b3be9`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/f7b3be9) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7311](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7311) - chore(deps): update module github.com/pjbgf/sha1cd to v0.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7317](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7317) - chore(deps): update golang.org/x/telemetry digest to [`af835b0`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/af835b0) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7313](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7313) - fix(deps): update module github.com/prometheus/client\_golang to v1.23.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7314](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7314) - chore(deps): update benchmark-action/github-action-benchmark action to v1.20.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7319](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7319) - Don't track min and max when disabled by [@​dashpole](https://redirect.github.com/dashpole) in [#​7306](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7306) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7320](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7320) - Add benchmark for exponential histogram measurements by [@​dashpole](https://redirect.github.com/dashpole) in [#​7305](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7305) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7324](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7324) - chore(deps): update module mvdan.cc/gofumpt to v0.9.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7322](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7322) - trace,metric,log: WithInstrumentationAttributes options to merge attributes by [@​pellared](https://redirect.github.com/pellared) in [#​7300](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7300) - Encapsulate observability in Logs SDK by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7315](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7315) - trace,metric,log: add WithInstrumentationAttributeSet option by [@​pellared](https://redirect.github.com/pellared) in [#​7287](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7287) - chore(deps): update module github.com/spf13/afero to v1.15.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7330](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7330) - chore(deps): update module github.com/sagikazarmark/locafero to v0.11.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7329](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7329) - chore(deps): update module github.com/lucasb-eyer/go-colorful to v1.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7327](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7327) - chore(deps): update module github.com/antonboom/errname to v1.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7338](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7338) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.41.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7337](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7337) - chore(deps): update module github.com/spf13/viper to v1.21.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7334](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7334) - chore(deps): update module github.com/spf13/cast to v1.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7333](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7333) - fix(deps): update googleapis to [`9702482`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9702482) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7335](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7335) - chore(deps): update github/codeql-action action to v3.30.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7339](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7339) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7326](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7326) - fix(deps): update module google.golang.org/protobuf to v1.36.9 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7340](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7340) - Encapsulate `stdouttrace.Exporter` instrumentation in internal package by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7307](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7307) - Do not allocate instrument options if possible in generated semconv packages by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7328](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7328) - chore(deps): update module github.com/antonboom/nilnil to v1.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7343](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7343) - chore(deps): update module golang.org/x/net to v0.44.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7341](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7341) - fix(deps): update module golang.org/x/tools to v0.37.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7347](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7347) - fix(deps): update module google.golang.org/grpc to v1.75.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7344](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7344) - chore(deps): update module go.yaml.in/yaml/v2 to v2.4.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7349](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7349) - chore(deps): update github/codeql-action action to v3.30.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7348](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7348) - Rename Self-Observability as just Observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7302](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7302) - fix(deps): update golang.org/x to [`df92998`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/df92998) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7350](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7350) - trace,metric,log: change WithInstrumentationAttributes to not de-depuplicate the passed attributes in a closure by [@​axw](https://redirect.github.com/axw) in [#​7266](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7266) - sdk/metric: add example for metricdatatest package by [@​sanojsubran](https://redirect.github.com/sanojsubran) in [#​7323](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7323) - chore(deps): update module github.com/antonboom/testifylint to v1.6.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7359](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7359) - chore(deps): update module github.com/nunnatsa/ginkgolinter to v0.21.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7362](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7362) - chore(deps): update module github.com/tetafro/godot to v1.5.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7360](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7360) - Do not use the user-defined empty set when comparing sets. by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7357](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7357) - Track context containing span in `recordingSpan` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7354](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7354) - fix(deps): update module go.opentelemetry.io/auto/sdk to v1.2.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7365](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7365) - Encapsulate SDK BatchSpanProcessor observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7332](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7332) - Encapsulate SDK Tracer observability by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7331](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7331) - chore: generate feature flag files from shared by [@​flc1125](https://redirect.github.com/flc1125) in [#​7361](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7361) - fix(deps): update module github.com/prometheus/otlptranslator to v1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7358](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7358) - chore(deps): update module github.com/djarvur/go-err113 to v0.1.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7368](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7368) - Fix the typo in the function name `TestNewInstrumentation` by [@​yumosx](https://redirect.github.com/yumosx) in [#​7369](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7369) - Use Set hash in Distinct (2nd attempt) by [@​dashpole](https://redirect.github.com/dashpole) in [#​7175](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7175) - chore(deps): update module github.com/ldez/grignotin to v0.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7373](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7373) - chore(deps): update module github.com/kulti/thelper to v0.7.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7376](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7376) - chore(deps): update otel/weaver docker tag to v0.18.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7377](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7377) - fix(deps): update github.com/opentracing-contrib/go-grpc/test digest to [`a6e64aa`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/a6e64aa) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7375](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7375) - feat(prometheus): Add observability for prometheus exporter by [@​tongoss](https://redirect.github.com/tongoss) in [#​7345](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7345) - Return partial OTLP export errors to the caller by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7372](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7372) - sdk/log: add TestRecordMethodsInputConcurrentSafe by [@​pellared](https://redirect.github.com/pellared) in [#​7378](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7378) - chore(deps): update module github.com/sagikazarmark/locafero to v0.12.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7390](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7390) - chore(deps): update module github.com/tetafro/godot to v1.5.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7391](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7391) - fix(deps): update module github.com/golangci/golangci-lint/v2 to v2.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7392](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7392) - chore: sdk/log/internal/x - generate x package from x component template by [@​nikhilmantri0902](https://redirect.github.com/nikhilmantri0902) in [#​7389](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7389) - chore(deps): update module go.opentelemetry.io/build-tools to v0.28.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7394](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7394) - fix(deps): update build-tools to v0.28.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7395](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7395) - fix(deps): update googleapis to [`9219d12`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/9219d12) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7393](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7393) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.42.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7397](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7397) - refactor: replace `context.Background()` with `t.Context()`/`b.Context()` in tests by [@​flc1125](https://redirect.github.com/flc1125) in [#​7352](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7352) - sdk/log: BenchmarkAddAttributes, BenchmarkSetAttributes, BenchmarkSetBody by [@​pellared](https://redirect.github.com/pellared) in [#​7387](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7387) - Link checker: ignore https localhost uris by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7399](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7399) - chore(deps): update module github.com/ldez/gomoddirectives to v0.7.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7400](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7400) - chore(deps): update module dev.gaijin.team/go/golib to v0.7.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7402](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7402) - Add experimental `x` package to `otlptracegrpc` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7401](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7401) - chore(deps): update actions/cache action to v4.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7409](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7409) - \[chore]: Clean-up unused obsScopeName const by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7408](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7408) - Add benchmark for synchronous gauge measurement by [@​dashpole](https://redirect.github.com/dashpole) in [#​7407](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7407) - Add measure benchmarks with exemplars recorded by [@​dashpole](https://redirect.github.com/dashpole) in [#​7406](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7406) - chore(deps): update github/codeql-action action to v3.30.4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7414](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7414) - chore(deps): update module github.com/quasilyte/go-ruleguard to v0.4.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7416](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7416) - chore(deps): update module github.com/quasilyte/go-ruleguard/dsl to v0.3.23 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7417](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7417) - Optimize the return type of ExportSpans by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7405](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7405) - Optimize Observability return types in in Prometheus exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7410](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7410) - chore(deps): update module github.com/mattn/go-runewidth to v0.0.17 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7418](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7418) - chore(deps): update module github.com/cyphar/filepath-securejoin to v0.5.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7419](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7419) - Add concurrent safe tests for metric aggregations by [@​dashpole](https://redirect.github.com/dashpole) in [#​7379](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7379) - chore(deps): update github/codeql-action action to v3.30.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7425](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7425) - sdk/trace/internal/x: generate x package from x component template [#​7385](https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7385) by [@​ternua8](https://redirect.github.com/ternua8) in [#​7411](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7411) - chore(deps): update module go.augendre.info/fatcontext to v0.9.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7426](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7426) - Generate gRPC Client target parsing func by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7424](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7424) - chore(deps): update module github.com/mattn/go-runewidth to v0.0.19 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7428](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7428) - Prometheus exporter: change default translation strategy by [@​dashpole](https://redirect.github.com/dashpole) in [#​7421](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7421) - Only enforce cardinality limits when the attribute set does not already exist by [@​dashpole](https://redirect.github.com/dashpole) in [#​7422](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7422) - fix(deps): update googleapis to [`57b25ae`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/57b25ae) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7429](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7429) - chore(deps): update module github.com/charmbracelet/x/ansi to v0.10.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7432](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7432) - chore(deps): update golang.org/x/telemetry digest to [`8e64475`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/8e64475) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7431](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7431) - chore(deps): update ossf/scorecard-action action to v2.4.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7435](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7435) - Allow optimizing locking for built-in exemplar reservoirs by [@​dashpole](https://redirect.github.com/dashpole) in [#​7423](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7423) - chore(deps): update golang.org/x/telemetry digest to [`4eae98a`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/4eae98a) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7439](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7439) - chore(deps): update peter-evans/create-issue-from-file action to v6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7440](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7440) - Add temporality selector functions by [@​dprotaso](https://redirect.github.com/dprotaso) in [#​7434](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7434) - fix(deps): update module google.golang.org/protobuf to v1.36.10 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7445](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7445) - chore(deps): update github/codeql-action action to v3.30.6 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7446](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7446) - Skip link checking for acm.org which blocks the link checker by [@​dashpole](https://redirect.github.com/dashpole) in [#​7444](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7444) - feat: logs SDK observability - otlploggrpc exporter metrics by [@​yumosx](https://redirect.github.com/yumosx) in [#​7353](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7353) - fix(deps): update golang.org/x to [`27f1f14`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/27f1f14) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7448](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7448) - fix(deps): update googleapis to [`7c0ddcb`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/7c0ddcb) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7449](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7449) - chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to v2.27.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7450](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7450) - Add exemplar reservoir parallel benchmarks by [@​dashpole](https://redirect.github.com/dashpole) in [#​7441](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7441) - chore(deps): update module github.com/ghostiam/protogetter to v0.3.17 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7451](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7451) - chore(deps): update actions/stale action to v10.1.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7452](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7452) - Support custom error type semantics by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7442](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7442) - fix(deps): update build-tools to v0.28.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7455](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7455) - chore(deps): update module github.com/go-git/go-git/v5 to v5.16.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7456](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7456) - chore(deps): update module github.com/bombsimon/wsl/v5 to v5.3.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7457](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7457) - sdk/trace: trace id high 64 bit tests by [@​mahendrabishnoi2](https://redirect.github.com/mahendrabishnoi2) in [#​7212](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7212) - Add the `internal/observ` package to `otlptracegrpc` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7404](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7404) - fix(deps): update googleapis to [`65f7160`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/65f7160) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7460](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7460) - chore(deps): update module go.opentelemetry.io/collector/featuregate to v1.43.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7461](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7461) - fix(deps): update module google.golang.org/grpc to v1.76.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7463](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7463) - fix(deps): update module go.opentelemetry.io/collector/pdata to v1.43.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7462](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7462) - Use sync.Map and atomics to improve sum performance by [@​dashpole](https://redirect.github.com/dashpole) in [#​7427](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7427) - chore(deps): update module github.com/stretchr/objx to v0.5.3 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7464](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7464) - chore(deps): update module github.com/prometheus/common to v0.67.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7465](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7465) - Document the ordering guarantees provided by the metrics SDK by [@​dashpole](https://redirect.github.com/dashpole) in [#​7453](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7453) - chore(deps): update github/codeql-action action to v3.30.7 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7467](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7467) - chore(deps): update google.golang.org/genproto/googleapis/api digest to [`49b9836`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/49b9836) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7468](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7468) - Instrument the `otlptracegrpc` exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7459](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7459) - fix(deps): update google.golang.org/genproto/googleapis/rpc digest to [`49b9836`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/49b9836) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7469](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7469) - chore(deps): update module golang.org/x/net to v0.45.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7470](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7470) - chore(deps): update github/codeql-action action to v4 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7472](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7472) - chore(deps): update module github.com/skeema/knownhosts to v1.3.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7471](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7471) - fix(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7475](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7475) - chore(deps): update golang.org/x by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7477](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7477) - chore(deps): update module github.com/nunnatsa/ginkgolinter to v0.21.2 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7481](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7481) - chore(deps): update module github.com/ldez/exptostd to v0.4.5 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7483](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7483) - Add the internal `x` package to `otlptracehttp` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7476](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7476) - Add a version const to otlptracehttp by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7479](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7479) - feat: Improve error handling in prometheus exporter by [@​tongoss](https://redirect.github.com/tongoss) in [#​7363](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7363) - Add the `internal/observ` pkg to `otlptracehttp` by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7480](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7480) - Move sdk/internal/env to sdk/trace/internal/env by [@​dmathieu](https://redirect.github.com/dmathieu) in [#​7437](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7437) - chore(deps): update module github.com/gofrs/flock to v0.13.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7487](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7487) - Instrument the `otlptracehttp` exporter by [@​MrAlias](https://redirect.github.com/MrAlias) in [#​7486](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7486) - chore(deps): update github/codeql-action action to v4.30.8 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7489](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7489) - chore(deps): update module github.com/catenacyber/perfsprint to v0.10.0 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7496](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7496) - OTLP trace exporter include W3C trace flags (bits 0–7) in Span.Flags by [@​nikhilmantri0902](https://redirect.github.com/nikhilmantri0902) in [#​7438](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7438) - Fix typos and linguistic errors in documentation / hacktoberfest by [@​survivant](https://redirect.github.com/survivant) in [#​7494](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7494) - chore(deps): update module github.com/kunwardeep/paralleltest to v1.0.15 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7501](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7501) - RELEASING - Remove demo-accounting service from dependency list by [@​Kielek](https://redirect.github.com/Kielek) in [#​7503](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7503) - Added the `internal/observ` package to otlploghttp by [@​yumosx](https://redirect.github.com/yumosx) in [#​7484](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7484) - fix(deps): update googleapis to [`4626949`](https://redirect.github.com/open-telemetry/opentelemetry-go/commit/4626949) by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7506](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7506) - chore(deps): update module github.com/godoc-lint/godoc-lint to v0.10.1 by [@​renovate](https://redirect.github.com/renovate)\[bot] in [#​7508](https://redirect.github.com/open-telemetry/opentelemetry-go/pull/7508) - fix(observ): correct rejected items and update comment style b
--- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- flagd-proxy/go.mod | 14 +++++++------- flagd-proxy/go.sum | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index 2996ebc47..dc0340abb 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -7,13 +7,13 @@ require ( buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 github.com/dimiro1/banner v1.1.0 github.com/mattn/go-colorable v0.1.14 - github.com/open-feature/flagd/core v0.11.8 + github.com/open-feature/flagd/core v0.13.1 github.com/prometheus/client_golang v1.23.0 github.com/spf13/cobra v1.9.1 github.com/spf13/viper v1.20.1 go.opentelemetry.io/otel/exporters/prometheus v0.60.0 - go.opentelemetry.io/otel/metric v1.38.0 - go.opentelemetry.io/otel/sdk/metric v1.38.0 + go.opentelemetry.io/otel/metric v1.40.0 + go.opentelemetry.io/otel/sdk/metric v1.40.0 go.uber.org/zap v1.27.0 golang.org/x/net v0.47.0 golang.org/x/sync v0.18.0 @@ -127,16 +127,16 @@ require ( go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel v1.40.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 // indirect - go.opentelemetry.io/otel/sdk v1.38.0 // indirect - go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.40.0 // indirect + go.opentelemetry.io/otel/trace v1.40.0 // indirect go.uber.org/multierr v1.11.0 // indirect gocloud.dev v0.42.0 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/oauth2 v0.32.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index 84dc193cb..81f23fdcf 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -264,6 +264,8 @@ github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/c github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= github.com/open-feature/flagd/core v0.11.8 h1:84uDdSzhtVNBnsjuAnBqBXbFwXC2CQ6aO5cNNKKM7uc= github.com/open-feature/flagd/core v0.11.8/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/flagd/core v0.13.1 h1:3LYTCHZbFBl1uJTroGFQEpkEHL6NcIANikC3LlsXxZw= +github.com/open-feature/flagd/core v0.13.1/go.mod h1:Oa6A6O2eluSuPcNGgOwrz3xaXUYanvQeHq2+rGySMBQ= github.com/open-feature/open-feature-operator/apis v0.2.45 h1:URnUf22ZoAx7/W8ek8dXCBYgY8FmnFEuEOSDLROQafY= github.com/open-feature/open-feature-operator/apis v0.2.45/go.mod h1:PYh/Hfyna1lZYZUeu/8LM0qh0ZgpH7kKEXRLYaaRhGs= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -350,18 +352,28 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/X go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= +go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0 h1:wm/Q0GAAykXv83wzcKzGGqAnnfLFyFe7RslekZuv+VI= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.38.0/go.mod h1:ra3Pa40+oKjvYh+ZD3EdxFZZB0xdMfuileHAm4nNN7w= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= +go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= +go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= +go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= +go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -441,6 +453,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= From 95d38fd8e7ec2cb17b3ed7a80a46f073e38d9e0e Mon Sep 17 00:00:00 2001 From: Karel Vervaeke Date: Wed, 4 Mar 2026 14:27:53 +0100 Subject: [PATCH 35/97] fix: RPC event serialization error, dont send empty messages (#1871) ## This PR - adds a test for the notification error that I encountered in https://github.com/open-feature/flagd/discussions/1869 ### Related Issues None that I'm aware of ### Notes vibe coding warning: I don't know go well enough to fix this, but I did use TDD and also did a manual test to verify that my problem went away. If any part of my solution is technicaly or doesn't fit in the codebase for any reason: feel free to comment, I'll do my best to improve it. ### How to test Running the test suite should be sufficient Signed-off-by: Karel Vervaeke --- .../flag-evaluation/connect_service_test.go | 5 +- flagd/pkg/service/flag-evaluation/eventing.go | 10 ++- .../service/flag-evaluation/eventing_test.go | 90 +++++++++++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/flagd/pkg/service/flag-evaluation/connect_service_test.go b/flagd/pkg/service/flag-evaluation/connect_service_test.go index 032806533..babafcdca 100644 --- a/flagd/pkg/service/flag-evaluation/connect_service_test.go +++ b/flagd/pkg/service/flag-evaluation/connect_service_test.go @@ -15,7 +15,6 @@ import ( mock "github.com/open-feature/flagd/core/pkg/evaluator/mock" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" - "github.com/open-feature/flagd/core/pkg/notifications" iservice "github.com/open-feature/flagd/core/pkg/service" "github.com/open-feature/flagd/core/pkg/store" "github.com/open-feature/flagd/core/pkg/telemetry" @@ -254,8 +253,8 @@ func TestConnectServiceWatcher(t *testing.T) { select { case n := <-sChan: require.Equal(t, ofType, n.Type, "expected notification type: %s, but received %s", ofType, n.Type) - notifications := n.Data["flags"].(notifications.Notifications) - flag1, ok := notifications["flag1"].(map[string]interface{}) + flags := n.Data["flags"].(map[string]interface{}) + flag1, ok := flags["flag1"].(map[string]interface{}) require.True(t, ok, "flag1 notification should be a map[string]interface{}") require.Equal(t, flag1["type"], string(model.NotificationCreate), "expected notification type: %s, but received %s", model.NotificationCreate, flag1["type"]) case <-timeout.Done(): diff --git a/flagd/pkg/service/flag-evaluation/eventing.go b/flagd/pkg/service/flag-evaluation/eventing.go index d9a47b02d..40410bbea 100644 --- a/flagd/pkg/service/flag-evaluation/eventing.go +++ b/flagd/pkg/service/flag-evaluation/eventing.go @@ -41,17 +41,23 @@ func (eventing *eventingConfiguration) Subscribe(ctx context.Context, id any, se for result := range watcher { newFlags := make(map[string]model.Flag) for _, flag := range result.Flags { - // we should be either selecting on a flag set here, or using the source-priority - duplicates are already handled, so we don't have to worry about overwrites + // we should be either selecting on a flag set here, or using the source-priority - duplicates are already handled, so we don't have to worry about overwrites newFlags[flag.Key] = flag } // ignore the first notification (nil old flags), the watcher emits on initialization, but for RPC we don't care until there's a change if oldFlags != nil { notifications := notifications.NewFromFlags(oldFlags, newFlags) + // if there are no changes, don't emit a notification + if len(notifications) == 0 { + oldFlags = newFlags + continue + } notifier <- iservice.Notification{ Type: iservice.ConfigurationChange, Data: map[string]interface{}{ - "flags": notifications, + // don't use our custom type or it cannot be serialized, convert to map + "flags": map[string]interface{}(notifications), }, } } diff --git a/flagd/pkg/service/flag-evaluation/eventing_test.go b/flagd/pkg/service/flag-evaluation/eventing_test.go index de4564691..c09fdcef3 100644 --- a/flagd/pkg/service/flag-evaluation/eventing_test.go +++ b/flagd/pkg/service/flag-evaluation/eventing_test.go @@ -4,11 +4,14 @@ import ( "context" "sync" "testing" + "time" "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/model" iservice "github.com/open-feature/flagd/core/pkg/service" "github.com/open-feature/flagd/core/pkg/store" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/structpb" ) func TestSubscribe(t *testing.T) { @@ -71,3 +74,90 @@ func TestUnsubscribe(t *testing.T) { "expected subscription cleared, but value present: %v", eventing.subs[idA]) require.Equal(t, chanB, eventing.subs[idB], "incorrect subscription association") } + +// TestNotificationCompatibleWithStructpb verifies that notification data from +// flag change events can be converted to protobuf structs, as required by the +// EventStream handlers. This is a regression test for +// https://github.com/open-feature/flagd/discussions/1869 +func TestNotificationCompatibleWithStructpb(t *testing.T) { + sources := []string{"source1"} + log := logger.NewLogger(nil, false) + s, err := store.NewStore(log, sources) + require.NoError(t, err) + + eventing := &eventingConfiguration{ + subs: make(map[interface{}]chan iservice.Notification), + mu: &sync.RWMutex{}, + store: s, + logger: log, + } + + notifyChan := make(chan iservice.Notification, 1) + eventing.Subscribe(context.Background(), "test", nil, notifyChan) + // allow the subscription goroutine to process the initial watch result + time.Sleep(100 * time.Millisecond) + + // first update sets up oldFlags. + s.Update(sources[0], []model.Flag{ + {Key: "flag1", DefaultVariant: "off"}, + }, model.Metadata{}) + + // second update triggers a ConfigurationChange with a real diff. + s.Update(sources[0], []model.Flag{ + {Key: "flag1", DefaultVariant: "on"}, + }, model.Metadata{}) + + select { + case n := <-notifyChan: + require.Equal(t, iservice.ConfigurationChange, n.Type) + // contains a named map type instead of plain map[string]interface{}. + _, err := structpb.NewStruct(n.Data) + require.NoError(t, err, "notification data must be compatible with structpb.NewStruct") + case <-time.After(2 * time.Second): + t.Fatal("timeout waiting for notification") + } +} + +// TestNoNotificationWhenFlagsUnchanged verifies that no ConfigurationChange +// notification is sent when a store update contains the same flags as before. +func TestNoNotificationWhenFlagsUnchanged(t *testing.T) { + sources := []string{"source1"} + log := logger.NewLogger(nil, false) + s, err := store.NewStore(log, sources) + require.NoError(t, err) + + eventing := &eventingConfiguration{ + subs: make(map[interface{}]chan iservice.Notification), + mu: &sync.RWMutex{}, + store: s, + logger: log, + } + + notifyChan := make(chan iservice.Notification, 1) + eventing.Subscribe(context.Background(), "test", nil, notifyChan) + time.Sleep(100 * time.Millisecond) + + // first update creates flag1 — this produces a notification (create). + s.Update(sources[0], []model.Flag{ + {Key: "flag1", DefaultVariant: "off"}, + }, model.Metadata{}) + + // drain the first notification (flag creation). + select { + case <-notifyChan: + case <-time.After(2 * time.Second): + t.Fatal("timeout waiting for first notification") + } + + // second update with the same flags — should not produce a notification. + s.Update(sources[0], []model.Flag{ + {Key: "flag1", DefaultVariant: "off"}, + }, model.Metadata{}) + + select { + case n := <-notifyChan: + t.Fatalf("unexpected notification received: %v", n) + case <-time.After(500 * time.Millisecond): + // expected: no notification sent + } +} From 068d886127b1e06fa3ad18fcac35fc52dc26a28c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:33:29 -0500 Subject: [PATCH 36/97] chore: release main (#1889) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.14.1 ## [0.14.1](https://github.com/open-feature/flagd/compare/flagd/v0.14.0...flagd/v0.14.1) (2026-03-04) ### 🐛 Bug Fixes * RPC event serialization error, dont send empty messages ([#1871](https://github.com/open-feature/flagd/issues/1871)) ([95d38fd](https://github.com/open-feature/flagd/commit/95d38fd8e7ec2cb17b3ed7a80a46f073e38d9e0e))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- flagd/CHANGELOG.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index aa3969e19..fc450fbcd 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.14.0", + "flagd": "0.14.1", "flagd-proxy": "0.9.0", "core": "0.14.0" } \ No newline at end of file diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 186b5526a..258195749 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.14.1](https://github.com/open-feature/flagd/compare/flagd/v0.14.0...flagd/v0.14.1) (2026-03-04) + + +### 🐛 Bug Fixes + +* RPC event serialization error, dont send empty messages ([#1871](https://github.com/open-feature/flagd/issues/1871)) ([95d38fd](https://github.com/open-feature/flagd/commit/95d38fd8e7ec2cb17b3ed7a80a46f073e38d9e0e)) + ## [0.14.0](https://github.com/open-feature/flagd/compare/flagd/v0.13.3...flagd/v0.14.0) (2026-03-04) From 8081cd67efe23e8656be43d8fce8bb3793034952 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 7 Mar 2026 11:28:57 +0100 Subject: [PATCH 37/97] chore: remove homebrew publishing (#1890) Remove homebrew. It hasn't been working for a while and requires constant attention in another repo. My justifications: - flagd is a "cloud native" tool - it easily runs in docker, even on darwin/arm (homebrew is really not for cloud infra) - maintenance burden - low usage Feel free to disagree, but if you do, you are committing to fixing it and taking care of it :grin: Signed-off-by: Todd Baert --- .github/workflows/release-please.yaml | 20 -------------------- docs/installation.md | 6 ------ 2 files changed, 26 deletions(-) diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 265930890..87841aaf1 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -211,23 +211,3 @@ jobs: ./sbom.xml ./*.tar.gz ./*.zip - homebrew: - name: Bump homebrew-core formula - needs: release-please - runs-on: ubuntu-latest - # Only run on non-forked flagd releases - if: ${{ github.repository_owner == 'open-feature' && needs.release-please.outputs.flagd_tag_name }} - steps: - - uses: mislav/bump-homebrew-formula-action@v2 - with: - formula-name: flagd - # https://github.com/mislav/bump-homebrew-formula-action/issues/58 - formula-path: Formula/f/flagd.rb - tag-name: ${{ needs.release-please.outputs.flagd_tag_name }} - download-url: https://github.com/${{ github.repository }}.git - commit-message: | - {{formulaName}} ${{ needs.release-please.outputs.flagd_version }} - - Created by https://github.com/mislav/bump-homebrew-formula-action - env: - COMMITTER_TOKEN: ${{ secrets.COMMITTER_TOKEN }} diff --git a/docs/installation.md b/docs/installation.md index e6a8a77c1..55741c694 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -45,12 +45,6 @@ You can also choose to run a Kubernetes service in front of a deployment with mu A systemd wrapper is available [here](https://github.com/open-feature/flagd/blob/main/systemd/flagd.service). -### Homebrew - -```shell -brew install flagd -``` - ## Summary Once flagd is installed, you can start using it within your application. From 9ffab8fdb9f78a48b7952ff8a8ac08926a21caa3 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 7 Mar 2026 11:29:33 +0100 Subject: [PATCH 38/97] docs: add example of selector in rpc mode (#1870) We were missing an example of this (we have it in OFREP and sync.proto, but not evaluation.proto) Signed-off-by: Todd Baert --- docs/reference/cheat-sheet.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/reference/cheat-sheet.md b/docs/reference/cheat-sheet.md index b36461c0e..910c89c8b 100644 --- a/docs/reference/cheat-sheet.md +++ b/docs/reference/cheat-sheet.md @@ -342,6 +342,28 @@ grpcurl -plaintext \ flagd.evaluation.v1.Service/ResolveAll ``` +### Using Selector Header + +Filter which flags are evaluated using the `Flagd-Selector` header: + +```shell +# Evaluate only flags from the app flag set +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -H 'Flagd-Selector: flagSetId=app-flags' \ + -d '{"flagKey": "simple-boolean", "context": {}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveBoolean + +# ResolveAll with selector +grpcurl -plaintext \ + -import-path "$PROTO_DIR" -proto flagd/evaluation/v1/evaluation.proto \ + -H 'Flagd-Selector: flagSetId=payment-flags' \ + -d '{"context": {}}' \ + localhost:8013 \ + flagd.evaluation.v1.Service/ResolveAll +``` + --- ## gRPC Sync API (sync.proto) From a176bc64c909a90703e9c4a1a417eb29e2a0b799 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 7 Mar 2026 11:32:41 +0100 Subject: [PATCH 39/97] docs: add json/yaml switch to playground to fix schema validation, make playground fullscreen (#1885) Adds a JSON/YAML switcher to the playground. This: - brings back JSON validation in JSON mode (doesn't work in YAML editor) - adds a button that converts from YAML/JSON - starts in the mode indicated by the query param --------- Signed-off-by: Todd Baert --- docs/assets/extra.css | 18 ++++++++ docs/playground/index.md | 6 +++ docs/playground/playground.js | 80 +++++++++++++++++------------------ playground-app/src/App.tsx | 58 +++++++++++++++++++++---- playground-app/src/main.tsx | 11 +++++ playground-app/src/utils.ts | 14 +++++- 6 files changed, 138 insertions(+), 49 deletions(-) diff --git a/docs/assets/extra.css b/docs/assets/extra.css index ab632f44b..ed69f3204 100644 --- a/docs/assets/extra.css +++ b/docs/assets/extra.css @@ -30,4 +30,22 @@ button:disabled { .output.visible { opacity: 1; +} + +/* custom css arrow */ +.playground-back { + display: inline-flex; + align-items: center; + gap: 0.25em; + font-size: 0.85rem; + text-decoration: none; +} +.playground-back::before { + content: ''; + display: inline-block; + width: 0.45em; + height: 0.45em; + border-left: 2px solid currentColor; + border-bottom: 2px solid currentColor; + transform: rotate(45deg); } \ No newline at end of file diff --git a/docs/playground/index.md b/docs/playground/index.md index 899d1f942..78d787c2e 100644 --- a/docs/playground/index.md +++ b/docs/playground/index.md @@ -1,3 +1,9 @@ +--- +hide: + - navigation + - toc +--- + If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/go.mod | 2 +- core/go.sum | 38 ++++++++++++++++++++++++++++++++++++++ flagd-proxy/go.mod | 14 +++++++------- flagd-proxy/go.sum | 14 ++++++++++++++ flagd/go.mod | 12 ++++++------ flagd/go.sum | 12 ++++++++++++ 6 files changed, 78 insertions(+), 14 deletions(-) diff --git a/core/go.mod b/core/go.mod index b8d3569e6..d064058b5 100644 --- a/core/go.mod +++ b/core/go.mod @@ -34,7 +34,7 @@ require ( golang.org/x/mod v0.32.0 golang.org/x/oauth2 v0.35.0 golang.org/x/sync v0.19.0 - google.golang.org/grpc v1.79.2 + google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 k8s.io/apimachinery v0.33.2 diff --git a/core/go.sum b/core/go.sum index 65bbd7a5d..f386df6c7 100644 --- a/core/go.sum +++ b/core/go.sum @@ -338,42 +338,78 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/X go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= +go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= +go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 h1:icqq3Z34UrEFk2u+HMhTtRsvo7Ues+eiJVjaJt62njs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0/go.mod h1:W2m8P+d5Wn5kipj4/xmbt9uMqezEKfBjzVJadfABSBE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 h1:NOyNnS19BF2SUDApbOKbDtWZ0IK7b8FJ2uAGdIWOGb0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0/go.mod h1:VL6EgVikRLcJa9ftukrHu/ZkkhFBSo1lzvdBC9CF1ss= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0 h1:9y5sHvAxWzft1WQ4BwqcvA+IFVUJ1Ya75mSAUnFEVwE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0/go.mod h1:eQqT90eR3X5Dbs1g9YSM30RavwLF725Ris5/XSXWvqE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 h1:H7O6RlGOMTizyl3R08Kn5pdM06bnH8oscSj7o11tmLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0/go.mod h1:mBFWu/WOVDkWWsR7Tx7h6EpQB8wsv7P0Yrh0Pb7othc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 h1:wVZXIWjQSeSmMoxF74LzAnpVQOAFDo3pPji9Y4SOFKc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0/go.mod h1:khvBS2IggMFNwZK/6lEeHg/W57h/IX6J4URh57fuI40= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 h1:uLXP+3mghfMf7XmV4PkGfFhFKuNWoCvvx5wP/wOXo0o= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0/go.mod h1:v0Tj04armyT59mnURNUJf7RCKcKzq+lgJs6QSjHjaTc= go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= +go.opentelemetry.io/otel/exporters/prometheus v0.64.0 h1:g0LRDXMX/G1SEZtK8zl8Chm4K6GBwRkjPKE36LxiTYs= +go.opentelemetry.io/otel/exporters/prometheus v0.64.0/go.mod h1:UrgcjnarfdlBDP3GjDIJWe6HTprwSazNjwsI+Ru6hro= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 h1:KJVjPD3rcPb98rIs3HznyJlrfx9ge5oJvxxlGR+P/7s= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0/go.mod h1:K3kRa2ckmHWQaTWQdPRHc7qGXASuVuoEQXzrvlA98Ws= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0 h1:MzfofMZN8ulNqobCmCAVbqVL5syHw+eB2qPRkCMA/fQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0/go.mod h1:E73G9UFtKRXrxhBsHtG00TB5WxX57lpsQzogDkqBTz8= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 h1:s/1iRkCKDfhlh1JF26knRneorus8aOwVIDhvYx9WoDw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0/go.mod h1:UI3wi0FXg1Pofb8ZBiBLhtMzgoTm1TYkMvn71fAqDzs= go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= +go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= +go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= +go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= +go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= +go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= +go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= +go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= +go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= +go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= +go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -519,6 +555,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index 88ca287f0..3125c912e 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -17,11 +17,11 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/net v0.49.0 golang.org/x/sync v0.19.0 - google.golang.org/grpc v1.78.0 + google.golang.org/grpc v1.79.3 ) require ( - cel.dev/expr v0.24.0 // indirect + cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -62,12 +62,12 @@ require ( github.com/aws/smithy-go v1.22.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.35.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect @@ -124,7 +124,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect go.opentelemetry.io/otel v1.40.0 // indirect @@ -135,7 +135,7 @@ require ( gocloud.dev v0.42.0 // indirect golang.org/x/crypto v0.47.0 // indirect golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/oauth2 v0.32.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.39.0 // indirect golang.org/x/text v0.33.0 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index 9f9a7a4a4..d53025db8 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -4,6 +4,8 @@ buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1 buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= @@ -105,6 +107,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -126,11 +130,15 @@ github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1: github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= @@ -344,6 +352,8 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= @@ -412,6 +422,8 @@ golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -504,6 +516,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/flagd/go.mod b/flagd/go.mod index a41c45c29..31c94713b 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -27,12 +27,12 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/net v0.49.0 golang.org/x/sync v0.19.0 - google.golang.org/grpc v1.78.0 + google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 ) require ( - cel.dev/expr v0.24.0 // indirect + cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.121.1 // indirect cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect @@ -75,14 +75,14 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/diegoholiveira/jsonlogic/v3 v3.8.4 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.35.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect @@ -147,7 +147,7 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index 17da223a4..f1f8cc93b 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -6,6 +6,8 @@ buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1 buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw= cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= @@ -113,6 +115,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -139,11 +143,15 @@ github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1: github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= @@ -380,6 +388,8 @@ go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rP go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0/go.mod h1:OvRg7gm5WRSCtxzGSsrFHbDLToYlStHNZQ+iPNIyD6g= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= @@ -570,6 +580,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 8b06d3e0d19859c320887c70f30180b78090011d Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 21 Mar 2026 10:12:38 -0400 Subject: [PATCH 51/97] fix(security): pin GitHub Actions to SHA digests (#1911) ## Summary - Pin `aquasecurity/trivy-action` from mutable tag `@0.28.0` to SHA-pinned `v0.35.0` (`57a97c7`) in response to CVE-2026-26189 / the Trivy supply chain incident on March 19, 2026 - Pin `docker/setup-qemu-action` and `docker/setup-buildx-action` from `@master` (!) to SHA-pinned `v3` tags - Add `.github/**` to renovate `includePaths` so the shared `open-feature/community-tooling` config (which already includes `helpers:pinGitHubActionDigests`) can manage workflow action updates going forward ## Context On March 19, 2026 an attacker force-pushed 75 existing tags in `aquasecurity/trivy-action` to malicious commits that exfiltrated CI/CD secrets. Any workflow referencing trivy-action by a mutable tag (rather than a commit SHA) was potentially vulnerable. See [Upwind's incident breakdown](https://www.upwind.io/feed/trivy-supply-chain-incident-github-actions-compromise-breakdown) for details. ### Impact assessment **This repo was not impacted.** We verified via the GitHub Actions API that no runs of the `build` workflow occurred during the attack window (March 19, 17:00-23:13 UTC). The last origin run completed at 08:35 UTC, well before the compromise began. Additionally, sensitive secrets (signing keys, publishing tokens, etc.) are only available in protected environments scoped to specific branches (e.g., `main`), so even if a PR branch run had been compromised, those secrets would not have been exposed. However, the use of mutable tags left the repo vulnerable to this class of attack, and `docker/setup-qemu-action@master` and `docker/setup-buildx-action@master` were pinned to the `master` branch, which carries the same risk. ## Changes | File | Change | |---|---| | `.github/workflows/build.yaml` | Pin `trivy-action` to `v0.35.0` SHA, pin `setup-qemu-action` and `setup-buildx-action` to `v3` SHAs | | `renovate.json` | Add `.github/**` to `includePaths` so Renovate manages action version updates | Signed-off-by: Todd Baert --- .github/workflows/build.yaml | 6 +++--- renovate.json | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 462278411..4d67df540 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -78,13 +78,13 @@ jobs: go-version-file: 'flagd/go.mod' - name: Set up QEMU - uses: docker/setup-qemu-action@master + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 with: platforms: all - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@master + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - name: Build uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5 @@ -95,7 +95,7 @@ jobs: tags: flagd-local:test - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@0.28.0 + uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 with: input: ${{ github.workspace }}/flagd-local.tar format: "sarif" diff --git a/renovate.json b/renovate.json index cf5200a17..b2a9199a5 100644 --- a/renovate.json +++ b/renovate.json @@ -8,6 +8,7 @@ "flagd/**", "flagd-proxy/**", "core/**", - "test/**" + "test/**", + ".github/**" ] } From 86010da1bd56d6e90c1feaab4961aab180b0c93b Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Sat, 21 Mar 2026 10:29:40 -0400 Subject: [PATCH 52/97] fix(security): pin remaining unpinned actions in release-please.yaml (#1912) ## Summary Follow-up to #1911. Pins the remaining unpinned actions in `release-please.yaml` to commit SHA digests. ## Changes | Action | Before | After | |---|---|---| | `google-github-actions/release-please-action` | `@v3` | `@db8f2c6...` (v3) | | `docker/setup-qemu-action` | `@master` | `@c7c5346...` (v3) | | `docker/setup-buildx-action` | `@master` | `@8d2750c...` (v3) | These were the last unpinned actions in the repo. With the `renovate.json` change from #1911 (adding `.github/**` to `includePaths`), Renovate will now keep all workflow action SHAs up to date automatically. Signed-off-by: Todd Baert --- .github/workflows/release-please.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release-please.yaml b/.github/workflows/release-please.yaml index 87841aaf1..cb53ccc0b 100644 --- a/.github/workflows/release-please.yaml +++ b/.github/workflows/release-please.yaml @@ -22,7 +22,7 @@ jobs: - name: Get current date id: date run: echo "::set-output name=date::$(date +'%Y-%m-%d')" - - uses: google-github-actions/release-please-action@v3 + - uses: google-github-actions/release-please-action@db8f2c60ee802b3748b512940dde88eabd7b7e01 # v3 id: release with: command: manifest @@ -93,13 +93,13 @@ jobs: images: ${{ env.REGISTRY }}/${{ matrix.path }} - name: Set up QEMU - uses: docker/setup-qemu-action@master + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 with: platforms: all - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@master + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 - name: Build id: build From 947af795f83f2d5c0fa28cdf14e7e8c826cd14ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 06:21:18 -0400 Subject: [PATCH 53/97] chore: release main (#1908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.14.4 ## [0.14.4](https://github.com/open-feature/flagd/compare/flagd/v0.14.3...flagd/v0.14.4) (2026-03-21) ### 🐛 Bug Fixes * **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083))
flagd-proxy: 0.9.2 ## [0.9.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.1...flagd-proxy/v0.9.2) (2026-03-21) ### 🐛 Bug Fixes * **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083))
core: 0.14.2 ## [0.14.2](https://github.com/open-feature/flagd/compare/core/v0.14.1...core/v0.14.2) (2026-03-21) ### 🐛 Bug Fixes * **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 7 +++++++ flagd-proxy/CHANGELOG.md | 7 +++++++ flagd/CHANGELOG.md | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1e7a6957b..6272a6f9c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.14.3", - "flagd-proxy": "0.9.1", - "core": "0.14.1" + "flagd": "0.14.4", + "flagd-proxy": "0.9.2", + "core": "0.14.2" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 507cf5537..99c651d6e 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.14.2](https://github.com/open-feature/flagd/compare/core/v0.14.1...core/v0.14.2) (2026-03-21) + + +### 🐛 Bug Fixes + +* **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083)) + ## [0.14.1](https://github.com/open-feature/flagd/compare/core/v0.14.0...core/v0.14.1) (2026-03-09) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 3f72b43be..12b723e0a 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.9.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.1...flagd-proxy/v0.9.2) (2026-03-21) + + +### 🐛 Bug Fixes + +* **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083)) + ## [0.9.1](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.0...flagd-proxy/v0.9.1) (2026-03-09) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 820e67c1b..bbc5e20e6 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.14.4](https://github.com/open-feature/flagd/compare/flagd/v0.14.3...flagd/v0.14.4) (2026-03-21) + + +### 🐛 Bug Fixes + +* **security:** update module google.golang.org/grpc to v1.79.3 [security] ([#1907](https://github.com/open-feature/flagd/issues/1907)) ([ad51d4e](https://github.com/open-feature/flagd/commit/ad51d4e8fe0570474c824273983f54b3ca38b083)) + ## [0.14.3](https://github.com/open-feature/flagd/compare/flagd/v0.14.2...flagd/v0.14.3) (2026-03-10) From b04dc5074a5be239914c4328653623aad36203ac Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun <11556013+alxckn@users.noreply.github.com> Date: Fri, 27 Mar 2026 19:08:54 +0100 Subject: [PATCH 54/97] feat: gRPC sync endpoint metrics (#1861) ## This PR Adds OpenTelemetry metrics for the gRPC flag sync service to enable monitoring of sync connections and operations. ### Metrics **Custom Metrics:** | Metric | Type | Description | | ------ | ---- | ----------- | | `feature_flag.flagd.sync.active_streams` | Gauge | Currently active streaming connections | | `feature_flag.flagd.sync.stream.duration` | Histogram | Duration of streaming connections (seconds) | **Standard gRPC Metrics:** - Leverages `otelgrpc.NewServerHandler()` for comprehensive gRPC server metrics (request counts, latencies, status codes, etc.) ### Changes - Add custom sync metric definitions in `core/pkg/telemetry/metrics.go` - Instrument `SyncFlags` streaming RPC with stream lifecycle metrics - Enable standard gRPC metrics via OpenTelemetry gRPC instrumentation - Add unit tests for metric collection, histogram buckets, and NoopMetricsRecorder --------- Signed-off-by: Alexandre Chakroun --- core/pkg/telemetry/metrics.go | 62 +++++++++- core/pkg/telemetry/metrics_test.go | 123 ++++++++++++++------ flagd/go.mod | 2 +- flagd/pkg/runtime/from_config.go | 1 + flagd/pkg/service/flag-sync/handler.go | 39 ++++++- flagd/pkg/service/flag-sync/handler_test.go | 9 +- flagd/pkg/service/flag-sync/sync_service.go | 21 +++- 7 files changed, 202 insertions(+), 55 deletions(-) diff --git a/core/pkg/telemetry/metrics.go b/core/pkg/telemetry/metrics.go index 05160c5ae..8fc1b3e53 100644 --- a/core/pkg/telemetry/metrics.go +++ b/core/pkg/telemetry/metrics.go @@ -5,6 +5,7 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/sdk/instrumentation" @@ -14,7 +15,8 @@ import ( ) const ( - ProviderName = "flagd" + ProviderName = "flagd" + featureFlagPrefix = "feature_flag." FeatureFlagReasonKey = attribute.Key("feature_flag.reason") ExceptionTypeKey = attribute.Key("ExceptionTypeKeyName") @@ -22,8 +24,11 @@ const ( httpRequestDurationMetric = "http.server.request.duration" httpResponseSizeMetric = "http.server.response.body.size" httpActiveRequestsMetric = "http.server.active_requests" - impressionMetric = "feature_flag." + ProviderName + ".impression" - reasonMetric = "feature_flag." + ProviderName + ".result.reason" + impressionMetric = featureFlagPrefix + ProviderName + ".impression" + reasonMetric = featureFlagPrefix + ProviderName + ".result.reason" + + syncActiveStreamsMetric = featureFlagPrefix + ProviderName + ".sync.active_streams" + syncStreamDurationMetric = featureFlagPrefix + ProviderName + ".sync.stream.duration" ) type IMetricsRecorder interface { @@ -34,6 +39,10 @@ type IMetricsRecorder interface { InFlightRequestEnd(ctx context.Context, attrs []attribute.KeyValue) RecordEvaluation(ctx context.Context, err error, reason, variant, key string) Impressions(ctx context.Context, reason, variant, key string) + // gRPC Sync metrics + SyncStreamStart(ctx context.Context, attrs []attribute.KeyValue) + SyncStreamEnd(ctx context.Context, attrs []attribute.KeyValue) + SyncStreamDuration(ctx context.Context, duration time.Duration, attrs []attribute.KeyValue) } type NoopMetricsRecorder struct{} @@ -60,12 +69,27 @@ func (NoopMetricsRecorder) RecordEvaluation(_ context.Context, _ error, _, _, _ func (NoopMetricsRecorder) Impressions(_ context.Context, _, _, _ string) { } +func (NoopMetricsRecorder) SyncStreamStart(_ context.Context, _ []attribute.KeyValue) { + // No-op implementation: intentionally does nothing +} + +func (NoopMetricsRecorder) SyncStreamEnd(_ context.Context, _ []attribute.KeyValue) { + // No-op implementation: intentionally does nothing +} + +func (NoopMetricsRecorder) SyncStreamDuration(_ context.Context, _ time.Duration, _ []attribute.KeyValue) { + // No-op implementation: intentionally does nothing +} + type MetricsRecorder struct { httpRequestDurHistogram metric.Float64Histogram httpResponseSizeHistogram metric.Float64Histogram httpRequestsInflight metric.Int64UpDownCounter impressions metric.Int64Counter reasons metric.Int64Counter + // gRPC Sync metrics + syncActiveStreams metric.Int64UpDownCounter + syncStreamDuration metric.Float64Histogram } func (r MetricsRecorder) HTTPAttributes(svcName, url, method, code, scheme string) []attribute.KeyValue { @@ -122,6 +146,18 @@ func (r MetricsRecorder) Reasons(ctx context.Context, key string, reason string, r.reasons.Add(ctx, 1, metric.WithAttributes(attrs...)) } +func (r MetricsRecorder) SyncStreamStart(ctx context.Context, attrs []attribute.KeyValue) { + r.syncActiveStreams.Add(ctx, 1, metric.WithAttributes(attrs...)) +} + +func (r MetricsRecorder) SyncStreamEnd(ctx context.Context, attrs []attribute.KeyValue) { + r.syncActiveStreams.Add(ctx, -1, metric.WithAttributes(attrs...)) +} + +func (r MetricsRecorder) SyncStreamDuration(ctx context.Context, duration time.Duration, attrs []attribute.KeyValue) { + r.syncStreamDuration.Record(ctx, duration.Seconds(), metric.WithAttributes(attrs...)) +} + func getDurationView(svcName, viewName string, bucket []float64) msdk.View { return msdk.NewView( msdk.Instrument{ @@ -156,10 +192,15 @@ func NewOTelRecorder(exporter msdk.Reader, resource *resource.Resource, serviceN msdk.WithView(getDurationView(serviceName, httpRequestDurationMetric, prometheus.DefBuckets)), // for response size we want 8 exponential bucket starting from 100 Bytes msdk.WithView(getDurationView(serviceName, httpResponseSizeMetric, prometheus.ExponentialBuckets(100, 10, 8))), + // for gRPC sync stream duration: 30s, 1min, 2min, 5min, 8min, 10min, 20min, 30min, 1h, 3h + msdk.WithView(getDurationView(serviceName, syncStreamDurationMetric, []float64{30, 60, 120, 300, 480, 600, 1200, 1800, 3600, 10800})), // set entity producing telemetry msdk.WithResource(resource), ) + // Set as global MeterProvider so otelgrpc and other instrumentation can use it + otel.SetMeterProvider(provider) + meter := provider.Meter(serviceName) // we can ignore errors from OpenTelemetry since they could occur if we select the wrong aggregator @@ -188,11 +229,26 @@ func NewOTelRecorder(exporter msdk.Reader, resource *resource.Resource, serviceN metric.WithDescription("Measures the number of evaluations for a given reason."), metric.WithUnit("{reason}"), ) + + // gRPC Sync metrics + syncActiveStreams, _ := meter.Int64UpDownCounter( + syncActiveStreamsMetric, + metric.WithDescription("Measures the number of currently active gRPC sync streaming connections."), + metric.WithUnit("{stream}"), + ) + syncStreamDuration, _ := meter.Float64Histogram( + syncStreamDurationMetric, + metric.WithDescription("Measures the duration of gRPC sync streaming connections."), + metric.WithUnit("s"), + ) + return &MetricsRecorder{ httpRequestDurHistogram: hduration, httpResponseSizeHistogram: hsize, httpRequestsInflight: reqCounter, impressions: impressions, reasons: reasons, + syncActiveStreams: syncActiveStreams, + syncStreamDuration: syncStreamDuration, } } diff --git a/core/pkg/telemetry/metrics_test.go b/core/pkg/telemetry/metrics_test.go index b5b4d3add..a5baa3e79 100644 --- a/core/pkg/telemetry/metrics_test.go +++ b/core/pkg/telemetry/metrics_test.go @@ -1,7 +1,6 @@ package telemetry import ( - "context" "fmt" "testing" "time" @@ -103,7 +102,7 @@ func TestMetrics(t *testing.T) { semconv.ServiceNameKey.String(svcName), } const n = 5 - type MetricF func(exp metric.Reader) + type MetricF func(t *testing.T, exp metric.Reader) tests := []struct { name string metricFunc MetricF @@ -111,32 +110,32 @@ func TestMetrics(t *testing.T) { }{ { name: "HTTPRequestDuration", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) for i := 0; i < n; i++ { - rec.HTTPRequestDuration(context.TODO(), 10, attrs) + rec.HTTPRequestDuration(t.Context(), 10, attrs) } }, metricsLen: 1, }, { name: "HTTPResponseSize", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) for i := 0; i < n; i++ { - rec.HTTPResponseSize(context.TODO(), 100, attrs) + rec.HTTPResponseSize(t.Context(), 100, attrs) } }, metricsLen: 1, }, { name: "InFlightRequestStart", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) - ctx := context.TODO() + ctx := t.Context() for i := 0; i < n; i++ { rec.InFlightRequestStart(ctx, attrs) rec.InFlightRequestEnd(ctx, attrs) @@ -146,54 +145,78 @@ func TestMetrics(t *testing.T) { }, { name: "Impressions", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) for i := 0; i < n; i++ { - rec.Impressions(context.TODO(), "reason", "variant", "key") + rec.Impressions(t.Context(), "reason", "variant", "key") } }, metricsLen: 1, }, { name: "Reasons", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) for i := 0; i < n; i++ { - rec.Reasons(context.TODO(), "keyA", "reason", nil) + rec.Reasons(t.Context(), "keyA", "reason", nil) } for i := 0; i < n; i++ { - rec.Reasons(context.TODO(), "keyB", "error", fmt.Errorf("err not found")) + rec.Reasons(t.Context(), "keyB", "error", fmt.Errorf("err not found")) } }, metricsLen: 1, }, { name: "RecordEvaluations", - metricFunc: func(exp metric.Reader) { + metricFunc: func(t *testing.T, exp metric.Reader) { rs := resource.NewWithAttributes("testSchema") rec := NewOTelRecorder(exp, rs, svcName) for i := 0; i < n; i++ { - rec.RecordEvaluation(context.TODO(), nil, "reason", "variant", "key") + rec.RecordEvaluation(t.Context(), nil, "reason", "variant", "key") } for i := 0; i < n; i++ { - rec.RecordEvaluation(context.TODO(), fmt.Errorf("general"), "error", "variant", "key") + rec.RecordEvaluation(t.Context(), fmt.Errorf("general"), "error", "variant", "key") } for i := 0; i < n; i++ { - rec.RecordEvaluation(context.TODO(), fmt.Errorf("not found"), "error", "variant", "key") + rec.RecordEvaluation(t.Context(), fmt.Errorf("not found"), "error", "variant", "key") } }, metricsLen: 2, }, + { + name: "SyncActiveStreams", + metricFunc: func(t *testing.T, exp metric.Reader) { + rs := resource.NewWithAttributes("testSchema") + rec := NewOTelRecorder(exp, rs, svcName) + ctx := t.Context() + for i := 0; i < n; i++ { + rec.SyncStreamStart(ctx, attrs) + rec.SyncStreamEnd(ctx, attrs) + } + }, + metricsLen: 1, + }, + { + name: "SyncStreamDuration", + metricFunc: func(t *testing.T, exp metric.Reader) { + rs := resource.NewWithAttributes("testSchema") + rec := NewOTelRecorder(exp, rs, svcName) + for i := 0; i < n; i++ { + rec.SyncStreamDuration(t.Context(), 100*time.Millisecond, attrs) + } + }, + metricsLen: 1, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { exp := metric.NewManualReader() - tt.metricFunc(exp) + tt.metricFunc(t, exp) var data metricdata.ResourceMetrics - err := exp.Collect(context.TODO(), &data) + err := exp.Collect(t.Context(), &data) if err != nil { t.Errorf("Got %v", err) } @@ -211,39 +234,54 @@ func TestMetrics(t *testing.T) { } // some really simple tests just to make sure all methods are actually implemented and nothing panics -func TestNoopMetricsRecorder_HTTPAttributes(t *testing.T) { +func TestNoopMetricsRecorderHTTPAttributes(t *testing.T) { no := NoopMetricsRecorder{} got := no.HTTPAttributes("", "", "", "", "") require.Empty(t, got) } -func TestNoopMetricsRecorder_HTTPRequestDuration(_ *testing.T) { +func TestNoopMetricsRecorderHTTPRequestDuration(t *testing.T) { + no := NoopMetricsRecorder{} + no.HTTPRequestDuration(t.Context(), 0, nil) +} + +func TestNoopMetricsRecorderInFlightRequestStart(t *testing.T) { no := NoopMetricsRecorder{} - no.HTTPRequestDuration(context.TODO(), 0, nil) + no.InFlightRequestStart(t.Context(), nil) } -func TestNoopMetricsRecorder_InFlightRequestStart(_ *testing.T) { +func TestNoopMetricsRecorderInFlightRequestEnd(t *testing.T) { no := NoopMetricsRecorder{} - no.InFlightRequestStart(context.TODO(), nil) + no.InFlightRequestEnd(t.Context(), nil) } -func TestNoopMetricsRecorder_InFlightRequestEnd(_ *testing.T) { +func TestNoopMetricsRecorderRecordEvaluation(t *testing.T) { no := NoopMetricsRecorder{} - no.InFlightRequestEnd(context.TODO(), nil) + no.RecordEvaluation(t.Context(), nil, "", "", "") } -func TestNoopMetricsRecorder_RecordEvaluation(_ *testing.T) { +func TestNoopMetricsRecorderImpressions(t *testing.T) { no := NoopMetricsRecorder{} - no.RecordEvaluation(context.TODO(), nil, "", "", "") + no.Impressions(t.Context(), "", "", "") } -func TestNoopMetricsRecorder_Impressions(_ *testing.T) { +func TestNoopMetricsRecorderSyncStreamStart(t *testing.T) { no := NoopMetricsRecorder{} - no.Impressions(context.TODO(), "", "", "") + no.SyncStreamStart(t.Context(), nil) +} + +func TestNoopMetricsRecorderSyncStreamEnd(t *testing.T) { + no := NoopMetricsRecorder{} + no.SyncStreamEnd(t.Context(), nil) +} + +func TestNoopMetricsRecorderSyncStreamDuration(t *testing.T) { + no := NoopMetricsRecorder{} + no.SyncStreamDuration(t.Context(), 0, nil) } // testHistogramBuckets is a helper function that tests histogram bucket configuration -func testHistogramBuckets(t *testing.T, metricName string, expectedBounds []float64, recordMetric func(rec *MetricsRecorder, attrs []attribute.KeyValue), assertMsg string) { +func testHistogramBuckets(t *testing.T, metricName string, expectedBounds []float64, recordMetric func(t *testing.T, rec *MetricsRecorder, attrs []attribute.KeyValue), assertMsg string) { t.Helper() const testSvcName = "testService" exp := metric.NewManualReader() @@ -253,10 +291,10 @@ func testHistogramBuckets(t *testing.T, metricName string, expectedBounds []floa attrs := []attribute.KeyValue{ semconv.ServiceNameKey.String(testSvcName), } - recordMetric(rec, attrs) + recordMetric(t, rec, attrs) var data metricdata.ResourceMetrics - err := exp.Collect(context.TODO(), &data) + err := exp.Collect(t.Context(), &data) require.NoError(t, err) require.Len(t, data.ScopeMetrics, 1) @@ -282,8 +320,8 @@ func TestHTTPRequestDurationBuckets(t *testing.T) { testHistogramBuckets(t, httpRequestDurationMetric, prometheus.DefBuckets, - func(rec *MetricsRecorder, attrs []attribute.KeyValue) { - rec.HTTPRequestDuration(context.TODO(), 100*time.Millisecond, attrs) + func(t *testing.T, rec *MetricsRecorder, attrs []attribute.KeyValue) { + rec.HTTPRequestDuration(t.Context(), 100*time.Millisecond, attrs) }, "Expected histogram buckets to match prometheus.DefBuckets", ) @@ -293,9 +331,20 @@ func TestHTTPResponseSizeBuckets(t *testing.T) { testHistogramBuckets(t, httpResponseSizeMetric, prometheus.ExponentialBuckets(100, 10, 8), - func(rec *MetricsRecorder, attrs []attribute.KeyValue) { - rec.HTTPResponseSize(context.TODO(), 500, attrs) + func(t *testing.T, rec *MetricsRecorder, attrs []attribute.KeyValue) { + rec.HTTPResponseSize(t.Context(), 500, attrs) }, "Expected histogram buckets to match exponential buckets (100, 10, 8)", ) } + +func TestGRPCSyncStreamDurationBuckets(t *testing.T) { + testHistogramBuckets(t, + syncStreamDurationMetric, + []float64{30, 60, 120, 300, 480, 600, 1200, 1800, 3600, 10800}, + func(t *testing.T, rec *MetricsRecorder, attrs []attribute.KeyValue) { + rec.SyncStreamDuration(t.Context(), 100*time.Millisecond, attrs) + }, + "Expected histogram buckets for long-lived sync streams (30s, 1min, 2min, 5min, 8min, 10min, 20min, 30min, 1h, 3h)", + ) +} diff --git a/flagd/go.mod b/flagd/go.mod index 31c94713b..53e5b4326 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -18,6 +18,7 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.11.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 go.opentelemetry.io/otel v1.40.0 go.opentelemetry.io/otel/sdk v1.40.0 @@ -149,7 +150,6 @@ require ( go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 // indirect diff --git a/flagd/pkg/runtime/from_config.go b/flagd/pkg/runtime/from_config.go index 304d79326..ad4a98a28 100644 --- a/flagd/pkg/runtime/from_config.go +++ b/flagd/pkg/runtime/from_config.go @@ -133,6 +133,7 @@ func FromConfig(logger *logger.Logger, version string, config Config) (*Runtime, SocketPath: config.SyncServiceSocketPath, StreamDeadline: config.StreamDeadline, DisableSyncMetadata: config.DisableSyncMetadata, + MetricsRecorder: recorder, }) if err != nil { return nil, fmt.Errorf("error creating sync service: %w", err) diff --git a/flagd/pkg/service/flag-sync/handler.go b/flagd/pkg/service/flag-sync/handler.go index 1c45d8522..559a33f44 100644 --- a/flagd/pkg/service/flag-sync/handler.go +++ b/flagd/pkg/service/flag-sync/handler.go @@ -9,6 +9,8 @@ import ( "time" "github.com/open-feature/flagd/core/pkg/model" + "github.com/open-feature/flagd/core/pkg/telemetry" + "go.opentelemetry.io/otel/attribute" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" @@ -30,11 +32,36 @@ type syncHandler struct { contextValues map[string]any deadline time.Duration disableSyncMetadata bool + metricsRecorder telemetry.IMetricsRecorder } func (s syncHandler) SyncFlags(req *syncv1.SyncFlagsRequest, server syncv1grpc.FlagSyncService_SyncFlagsServer) error { - watcher := make(chan store.FlagQueryResult, 1) + startTime := time.Now() selectorExpression := s.getSelectorExpression(server.Context(), req) + + // Build metric attributes + attrs := []attribute.KeyValue{} + if selectorExpression != "" { + attrs = append(attrs, attribute.String("selector", selectorExpression)) + } + if req.GetProviderId() != "" { + attrs = append(attrs, attribute.String("provider_id", req.GetProviderId())) + } + + // Record stream start + s.metricsRecorder.SyncStreamStart(server.Context(), attrs) + + // Track exit reason for duration metric + var exitReason string + defer func() { + duration := time.Since(startTime) + reasonAttrs := append([]attribute.KeyValue{}, attrs...) + reasonAttrs = append(reasonAttrs, attribute.String("reason", exitReason)) + s.metricsRecorder.SyncStreamEnd(server.Context(), attrs) + s.metricsRecorder.SyncStreamDuration(server.Context(), duration, reasonAttrs) + }() + + watcher := make(chan store.FlagQueryResult, 1) selector := store.NewSelector(selectorExpression) ctx := server.Context() @@ -42,6 +69,7 @@ func (s syncHandler) SyncFlags(req *syncv1.SyncFlagsRequest, server syncv1grpc.F maps.Copy(syncContextMap, s.contextValues) syncContext, err := structpb.NewStruct(syncContextMap) if err != nil { + exitReason = "error" return status.Error(codes.DataLoss, "error constructing sync context") } @@ -58,28 +86,27 @@ func (s syncHandler) SyncFlags(req *syncv1.SyncFlagsRequest, server syncv1grpc.F for { select { case payload := <-watcher: - if err != nil { - s.log.Error(fmt.Sprintf("error from struct creation: %v", err)) - return fmt.Errorf("error constructing metadata response") - } - flags, err := s.generateResponse(payload.Flags) if err != nil { s.log.Error(fmt.Sprintf("error retrieving flags from store: %v", err)) + exitReason = "error" return status.Error(codes.DataLoss, "error marshalling flags") } err = server.Send(&syncv1.SyncFlagsResponse{FlagConfiguration: string(flags), SyncContext: syncContext}) if err != nil { s.log.Debug(fmt.Sprintf("error sending stream response: %v", err)) + exitReason = "client_disconnect" return fmt.Errorf("error sending stream response: %w", err) } case <-ctx.Done(): if errors.Is(ctx.Err(), context.DeadlineExceeded) { s.log.Debug(fmt.Sprintf("server-side deadline of %s exceeded, exiting stream request with grpc error code 4", s.deadline.String())) + exitReason = "deadline_exceeded" return status.Error(codes.DeadlineExceeded, "stream closed due to server-side timeout") } s.log.Debug("context complete and exiting stream request") + exitReason = "normal_close" return nil } } diff --git a/flagd/pkg/service/flag-sync/handler_test.go b/flagd/pkg/service/flag-sync/handler_test.go index 6bbd5d04d..85af91eb8 100644 --- a/flagd/pkg/service/flag-sync/handler_test.go +++ b/flagd/pkg/service/flag-sync/handler_test.go @@ -12,6 +12,7 @@ import ( "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" "github.com/open-feature/flagd/core/pkg/store" + "github.com/open-feature/flagd/core/pkg/telemetry" flagdService "github.com/open-feature/flagd/flagd/pkg/service" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -64,6 +65,7 @@ func TestSyncHandler_SyncFlags(t *testing.T) { contextValues: tt.contextValues, log: logger.NewLogger(nil, false), disableSyncMetadata: disableSyncMetadata, + metricsRecorder: &telemetry.NoopMetricsRecorder{}, } // Test getting metadata from `GetMetadata` (deprecated) @@ -206,9 +208,10 @@ func TestSyncHandler_SelectorLocationPrecedence(t *testing.T) { require.NoError(t, err) handler := syncHandler{ - store: flagStore, - log: logger.NewLogger(nil, false), - contextValues: map[string]any{}, + store: flagStore, + log: logger.NewLogger(nil, false), + contextValues: map[string]any{}, + metricsRecorder: &telemetry.NoopMetricsRecorder{}, } // Create context with or without header metadata diff --git a/flagd/pkg/service/flag-sync/sync_service.go b/flagd/pkg/service/flag-sync/sync_service.go index 22f6c0ce6..49d1e8e06 100644 --- a/flagd/pkg/service/flag-sync/sync_service.go +++ b/flagd/pkg/service/flag-sync/sync_service.go @@ -11,6 +11,8 @@ import ( "buf.build/gen/go/open-feature/flagd/grpc/go/flagd/sync/v1/syncv1grpc" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/store" + "github.com/open-feature/flagd/core/pkg/telemetry" + "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "golang.org/x/sync/errgroup" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -35,6 +37,7 @@ type SvcConfigurations struct { SocketPath string StreamDeadline time.Duration DisableSyncMetadata bool + MetricsRecorder telemetry.IMetricsRecorder } type Service struct { @@ -65,9 +68,6 @@ func loadTLSCredentials(certPath string, keyPath string) (credentials.TransportC func NewSyncService(cfg SvcConfigurations) (*Service, error) { var err error l := cfg.Logger - if err != nil { - return nil, fmt.Errorf("error initializing multiplexer: %w", err) - } var server *grpc.Server if cfg.CertPath != "" && cfg.KeyPath != "" { @@ -75,9 +75,19 @@ func NewSyncService(cfg SvcConfigurations) (*Service, error) { if err != nil { return nil, fmt.Errorf("failed to load TLS cert and key: %w", err) } - server = grpc.NewServer(grpc.Creds(tlsCredentials)) + server = grpc.NewServer( + grpc.Creds(tlsCredentials), + grpc.StatsHandler(otelgrpc.NewServerHandler()), + ) } else { - server = grpc.NewServer() + server = grpc.NewServer( + grpc.StatsHandler(otelgrpc.NewServerHandler()), + ) + } + + metricsRecorder := cfg.MetricsRecorder + if metricsRecorder == nil { + metricsRecorder = &telemetry.NoopMetricsRecorder{} } syncv1grpc.RegisterFlagSyncServiceServer(server, &syncHandler{ @@ -86,6 +96,7 @@ func NewSyncService(cfg SvcConfigurations) (*Service, error) { contextValues: cfg.ContextValues, deadline: cfg.StreamDeadline, disableSyncMetadata: cfg.DisableSyncMetadata, + metricsRecorder: metricsRecorder, }) var lis net.Listener From d9b5aa2fccc09d4f938fa9cceaa8d53e9140b8aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 07:29:30 -0400 Subject: [PATCH 55/97] chore: release main (#1914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.14.5 ## [0.14.5](https://github.com/open-feature/flagd/compare/flagd/v0.14.4...flagd/v0.14.5) (2026-03-27) ### ✨ New Features * gRPC sync endpoint metrics ([#1861](https://github.com/open-feature/flagd/issues/1861)) ([b04dc50](https://github.com/open-feature/flagd/commit/b04dc5074a5be239914c4328653623aad36203ac))
core: 0.14.3 ## [0.14.3](https://github.com/open-feature/flagd/compare/core/v0.14.2...core/v0.14.3) (2026-03-27) ### ✨ New Features * gRPC sync endpoint metrics ([#1861](https://github.com/open-feature/flagd/issues/1861)) ([b04dc50](https://github.com/open-feature/flagd/commit/b04dc5074a5be239914c4328653623aad36203ac))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 4 ++-- core/CHANGELOG.md | 7 +++++++ flagd/CHANGELOG.md | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 6272a6f9c..d6e3f4143 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.14.4", + "flagd": "0.14.5", "flagd-proxy": "0.9.2", - "core": "0.14.2" + "core": "0.14.3" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 99c651d6e..8154a91eb 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.14.3](https://github.com/open-feature/flagd/compare/core/v0.14.2...core/v0.14.3) (2026-03-27) + + +### ✨ New Features + +* gRPC sync endpoint metrics ([#1861](https://github.com/open-feature/flagd/issues/1861)) ([b04dc50](https://github.com/open-feature/flagd/commit/b04dc5074a5be239914c4328653623aad36203ac)) + ## [0.14.2](https://github.com/open-feature/flagd/compare/core/v0.14.1...core/v0.14.2) (2026-03-21) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index bbc5e20e6..83157f6bb 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.14.5](https://github.com/open-feature/flagd/compare/flagd/v0.14.4...flagd/v0.14.5) (2026-03-27) + + +### ✨ New Features + +* gRPC sync endpoint metrics ([#1861](https://github.com/open-feature/flagd/issues/1861)) ([b04dc50](https://github.com/open-feature/flagd/commit/b04dc5074a5be239914c4328653623aad36203ac)) + ## [0.14.4](https://github.com/open-feature/flagd/compare/flagd/v0.14.3...flagd/v0.14.4) (2026-03-21) From 7190878fd0ea7a6f16fd8fbcdac68b55d9b9a2a5 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 1 Apr 2026 12:43:35 -0400 Subject: [PATCH 56/97] feat!: fractional bucketing improvements (#1909) ## High-precision and nested fractional This is a coordinated feature across flagd and all flagd providers. - `fractional` now supports up to max-int32 total weight and 1/max-int32 resolution as described in the [high-precision fractional bucketing ADR](https://flagd.dev/architecture-decisions/high-precision-fractional-bucketing) - `fractional` now supports computed (nested JSONLogic) variants and weights as described in the [fractional ADR](https://flagd.dev/architecture-decisions/fractional) - Includes e2e tests from the [flagd-testbed v3.1.0...v3.4.0](https://github.com/open-feature/flagd-testbed/compare/v3.1.0...v3.4.0) to validate consistent fractional bucketing across all provider implementations - :warning: Pseudorandom hash assignments will change with this release due to changes in the hashing algorithm; update flagd and your providers to ensure fractional assignment is consistent across all workloads ### Related PRs | Component | PR | |---|---| | flagd | https://github.com/open-feature/flagd/pull/1909 | | java-sdk-contrib | https://github.com/open-feature/java-sdk-contrib/pull/1740 | | js-sdk-contrib | https://github.com/open-feature/js-sdk-contrib/pull/1501 | | python-sdk-contrib | https://github.com/open-feature/python-sdk-contrib/pull/373 | | dotnet-sdk-contrib | https://github.com/open-feature/dotnet-sdk-contrib/pull/622 | | flagd-schemas | https://github.com/open-feature/flagd-schemas/pull/207 | > **Warning** > @toddbaert will coordinate the release across flagd and all providers. Do not merge without coordination. > @toddbaert will update the RPC mode tests accordingly once the associated flagd PR is merged and an up-to-date flagd-testbed image is available. --------- Signed-off-by: Todd Baert --- Makefile | 5 +- core/go.mod | 2 +- core/go.sum | 46 +- core/pkg/evaluator/fractional.go | 118 +++-- core/pkg/evaluator/fractional_test.go | 518 +++++++++++++++---- flagd/go.mod | 2 +- schemas | 2 +- test-harness | 2 +- test/integration/go.mod | 212 +++----- test/integration/go.sum | 700 ++++++++++---------------- test/integration/integration_test.go | 38 +- 11 files changed, 895 insertions(+), 750 deletions(-) diff --git a/Makefile b/Makefile index f0036d23b..0d8bad056 100644 --- a/Makefile +++ b/Makefile @@ -52,8 +52,9 @@ flagd-benchmark-test: flagd-integration-test-harness: # target used to start a locally built flagd with the e2e flags cd flagd; go run main.go start -f file:../test-harness/flags/testing-flags.json -f file:../test-harness/flags/custom-ops.json -f file:../test-harness/flags/evaluator-refs.json -f file:../test-harness/flags/zero-flags.json -f file:../test-harness/flags/edge-case-flags.json -flagd-integration-test: # dependent on flagd-e2e-test-harness if not running in github actions - go test -count=1 -cover ./test/integration $(ARGS) +flagd-integration-test: workspace-clean +# this is a intentionally an "orphaned" module so that it effectively does e2e testing independently of the rest of the code + cd test/integration && go test -count=1 -cover $(ARGS) run: # default to flagd make run-flagd run-flagd: diff --git a/core/go.mod b/core/go.mod index d064058b5..2341902c3 100644 --- a/core/go.mod +++ b/core/go.mod @@ -7,7 +7,7 @@ require ( buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 connectrpc.com/connect v1.19.1 connectrpc.com/otelconnect v0.7.2 - github.com/diegoholiveira/jsonlogic/v3 v3.8.4 + github.com/diegoholiveira/jsonlogic/v3 v3.9.0 github.com/fsnotify/fsnotify v1.9.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/core/go.sum b/core/go.sum index f386df6c7..50049bd15 100644 --- a/core/go.sum +++ b/core/go.sum @@ -117,8 +117,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1vfDaOVsaipH4= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0 h1:ZYx6tM8+1NRo0RwFpBmVxtmJnXs/f3rtIZo9t9dCk3Y= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= @@ -336,78 +336,42 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 h1:deI9UQMoGFgrg5iLPgzueqFPHevDl+28YKfSpPTI6rY= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0/go.mod h1:PFx9NgpNUKXdf7J4Q3agRxMs3Y07QhTCVipKmLsMKnU= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0 h1:icqq3Z34UrEFk2u+HMhTtRsvo7Ues+eiJVjaJt62njs= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.18.0/go.mod h1:W2m8P+d5Wn5kipj4/xmbt9uMqezEKfBjzVJadfABSBE= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0 h1:NOyNnS19BF2SUDApbOKbDtWZ0IK7b8FJ2uAGdIWOGb0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.40.0/go.mod h1:VL6EgVikRLcJa9ftukrHu/ZkkhFBSo1lzvdBC9CF1ss= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 h1:MdKucPl/HbzckWWEisiNqMPhRrAOQX8r4jTuGr636gk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0/go.mod h1:RolT8tWtfHcjajEH5wFIZ4Dgh5jpPdFXYV9pTAk/qjc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0 h1:9y5sHvAxWzft1WQ4BwqcvA+IFVUJ1Ya75mSAUnFEVwE= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.40.0/go.mod h1:eQqT90eR3X5Dbs1g9YSM30RavwLF725Ris5/XSXWvqE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0 h1:H7O6RlGOMTizyl3R08Kn5pdM06bnH8oscSj7o11tmLA= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.42.0/go.mod h1:mBFWu/WOVDkWWsR7Tx7h6EpQB8wsv7P0Yrh0Pb7othc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 h1:THuZiwpQZuHPul65w4WcwEnkX2QIuMT+UFoOrygtoJw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0/go.mod h1:J2pvYM5NGHofZ2/Ru6zw/TNWnEQp5crgyDeSrYpXkAw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 h1:zWWrB1U6nqhS/k6zYB74CjRpuiitRtLLi68VcgmOEto= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0/go.mod h1:2qXPNBX1OVRC0IwOnfo1ljoid+RD0QK3443EaqVlsOU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0 h1:wVZXIWjQSeSmMoxF74LzAnpVQOAFDo3pPji9Y4SOFKc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.40.0/go.mod h1:khvBS2IggMFNwZK/6lEeHg/W57h/IX6J4URh57fuI40= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 h1:uLXP+3mghfMf7XmV4PkGfFhFKuNWoCvvx5wP/wOXo0o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0/go.mod h1:v0Tj04armyT59mnURNUJf7RCKcKzq+lgJs6QSjHjaTc= -go.opentelemetry.io/otel/exporters/prometheus v0.60.0 h1:cGtQxGvZbnrWdC2GyjZi0PDKVSLWP/Jocix3QWfXtbo= -go.opentelemetry.io/otel/exporters/prometheus v0.60.0/go.mod h1:hkd1EekxNo69PTV4OWFGZcKQiIqg0RfuWExcPKFvepk= go.opentelemetry.io/otel/exporters/prometheus v0.64.0 h1:g0LRDXMX/G1SEZtK8zl8Chm4K6GBwRkjPKE36LxiTYs= go.opentelemetry.io/otel/exporters/prometheus v0.64.0/go.mod h1:UrgcjnarfdlBDP3GjDIJWe6HTprwSazNjwsI+Ru6hro= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0 h1:KJVjPD3rcPb98rIs3HznyJlrfx9ge5oJvxxlGR+P/7s= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.18.0/go.mod h1:K3kRa2ckmHWQaTWQdPRHc7qGXASuVuoEQXzrvlA98Ws= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0 h1:lSZHgNHfbmQTPfuTmWVkEu8J8qXaQwuV30pjCcAUvP8= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.42.0/go.mod h1:so9ounLcuoRDu033MW/E0AD4hhUjVqswrMF5FoZlBcw= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0 h1:MzfofMZN8ulNqobCmCAVbqVL5syHw+eB2qPRkCMA/fQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.40.0/go.mod h1:E73G9UFtKRXrxhBsHtG00TB5WxX57lpsQzogDkqBTz8= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 h1:s/1iRkCKDfhlh1JF26knRneorus8aOwVIDhvYx9WoDw= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0/go.mod h1:UI3wi0FXg1Pofb8ZBiBLhtMzgoTm1TYkMvn71fAqDzs= -go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= -go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= go.opentelemetry.io/otel/log v0.18.0 h1:XgeQIIBjZZrliksMEbcwMZefoOSMI1hdjiLEiiB0bAg= go.opentelemetry.io/otel/log v0.18.0/go.mod h1:KEV1kad0NofR3ycsiDH4Yjcoj0+8206I6Ox2QYFSNgI= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= -go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg= -go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM= go.opentelemetry.io/otel/sdk/log v0.18.0 h1:n8OyZr7t7otkeTnPTbDNom6rW16TBYGtvyy2Gk6buQw= go.opentelemetry.io/otel/sdk/log v0.18.0/go.mod h1:C0+wxkTwKpOCZLrlJ3pewPiiQwpzycPI/u6W0Z9fuYk= -go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM= -go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA= -go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= -go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0 h1:l3mYuPsuBx6UKE47BVcPrZoZ0q/KER57vbj2qkgDLXA= +go.opentelemetry.io/otel/sdk/log/logtest v0.18.0/go.mod h1:7cHtiVJpZebB3wybTa4NG+FUo5NPe3PROz1FqB0+qdw= go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= @@ -553,8 +517,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU= -google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/core/pkg/evaluator/fractional.go b/core/pkg/evaluator/fractional.go index dd3f7f855..fe9cb6647 100644 --- a/core/pkg/evaluator/fractional.go +++ b/core/pkg/evaluator/fractional.go @@ -9,6 +9,8 @@ import ( "github.com/twmb/murmur3" ) +const maxWeightSum = math.MaxInt32 // 2,147,483,647 + const FractionEvaluationName = "fractional" type Fractional struct { @@ -16,16 +18,18 @@ type Fractional struct { } type fractionalEvaluationDistribution struct { - totalWeight int + totalWeight int32 weightedVariants []fractionalEvaluationVariant + data any + logger *logger.Logger } type fractionalEvaluationVariant struct { - variant string - weight int + variant any // string, bool, number or nil + weight int32 } -func (v fractionalEvaluationVariant) getPercentage(totalWeight int) float64 { +func (v fractionalEvaluationVariant) getPercentage(totalWeight int32) float64 { if totalWeight == 0 { return 0 } @@ -38,16 +42,17 @@ func NewFractional(logger *logger.Logger) *Fractional { } func (fe *Fractional) Evaluate(values, data any) any { - valueToDistribute, feDistributions, err := parseFractionalEvaluationData(values, data) + valueToDistribute, feDistributions, err := parseFractionalEvaluationData(values, data, fe.Logger) if err != nil { fe.Logger.Warn(fmt.Sprintf("parse fractional evaluation data: %v", err)) return nil } - return distributeValue(valueToDistribute, feDistributions) + hashValue := uint32(murmur3.StringSum32(valueToDistribute)) + return distributeValue(hashValue, feDistributions) } -func parseFractionalEvaluationData(values, data any) (string, *fractionalEvaluationDistribution, error) { +func parseFractionalEvaluationData(values, data any, logger *logger.Logger) (string, *fractionalEvaluationDistribution, error) { valuesArray, ok := values.([]any) if !ok { return "", nil, errors.New("fractional evaluation data is not an array") @@ -61,9 +66,8 @@ func parseFractionalEvaluationData(values, data any) (string, *fractionalEvaluat return "", nil, errors.New("data isn't of type map[string]any") } - // Ignore the error as we can't really do anything if the properties are - // somehow missing. properties, _ := getFlagdProperties(dataMap) + flagKey := properties.FlagKey bucketBy, ok := valuesArray[0].(string) if ok { @@ -76,13 +80,13 @@ func parseFractionalEvaluationData(values, data any) (string, *fractionalEvaluat targetingKey, ok := dataMap[targetingKeyKey].(string) if !ok { - return "", nil, errors.New("bucketing value not supplied and no targetingKey in context") + return "", nil, fmt.Errorf("flag %q: bucketing value not supplied and no targetingKey in context", flagKey) } bucketBy = fmt.Sprintf("%s%s", properties.FlagKey, targetingKey) } - feDistributions, err := parseFractionalEvaluationDistributions(valuesArray) + feDistributions, err := parseFractionalEvaluationDistributions(valuesArray, data, logger, flagKey) if err != nil { return "", nil, err } @@ -90,59 +94,109 @@ func parseFractionalEvaluationData(values, data any) (string, *fractionalEvaluat return bucketBy, feDistributions, nil } -func parseFractionalEvaluationDistributions(values []any) (*fractionalEvaluationDistribution, error) { +func parseFractionalEvaluationDistributions(values []any, data any, logger *logger.Logger, flagKey string) (*fractionalEvaluationDistribution, error) { feDistributions := &fractionalEvaluationDistribution{ totalWeight: 0, weightedVariants: make([]fractionalEvaluationVariant, len(values)), + data: data, + logger: logger, } + + // parse all weights first to validate the sum + var totalWeightInt64 int64 = 0 + for i := 0; i < len(values); i++ { distributionArray, ok := values[i].([]any) if !ok { - return nil, errors.New("distribution elements aren't of type []any. " + - "please check your rule in flag definition") + return nil, fmt.Errorf("flag %q: distribution elements aren't of type []any. "+ + "please check your rule in flag definition", flagKey) } if len(distributionArray) == 0 { - return nil, errors.New("distribution element needs at least one element") + return nil, fmt.Errorf("flag %q: distribution element needs at least one element", flagKey) } - variant, ok := distributionArray[0].(string) - if !ok { - return nil, errors.New("first element of distribution element isn't string") + // JSONLogic pre-evaluates all arguments before they reach fractional. + // Pre-evaluated operators become primitive values (strings, numbers, etc.), never map[string]any nodes. + var variant any + switch v := distributionArray[0].(type) { + case string: + variant = v + case bool: + variant = v + case float64: + variant = v + case nil: + variant = nil + default: + return nil, fmt.Errorf("flag %q: first element of distribution element must be a string, bool, number, or nil", flagKey) } - weight := 1.0 + weight := int64(1) if len(distributionArray) >= 2 { + // parse as float64 first since that's what JSON gives us distributionWeight, ok := distributionArray[1].(float64) + if !ok && distributionArray[1] != nil { + return nil, fmt.Errorf("flag %q: weight must be a number", flagKey) + } if ok { - // default the weight to 1 if not specified explicitly - weight = distributionWeight + weight = int64(distributionWeight) + } + } + + // validate weight is a whole number + if len(distributionArray) >= 2 { + distributionWeight, ok := distributionArray[1].(float64) + if ok && distributionWeight != float64(int64(distributionWeight)) { + return nil, fmt.Errorf("flag %q: weights must be integers", flagKey) } } - feDistributions.totalWeight += int(weight) + // validate individual weight doesn't exceed int32 + if weight > math.MaxInt32 { + return nil, fmt.Errorf("flag %q: weight %d exceeds maximum allowed value %d", flagKey, weight, math.MaxInt32) + } + + // clamp negative weights to 0 + if weight < 0 { + // negative weights can be the result of rollout calculations, so we log and clamp to 0 rather than returning an error + logger.Debug(fmt.Sprintf("flag %q: negative weight %d clamped to 0", flagKey, weight)) + weight = 0 + } + + totalWeightInt64 += weight feDistributions.weightedVariants[i] = fractionalEvaluationVariant{ variant: variant, - weight: int(weight), + weight: int32(weight), } } + // validate total weight doesn't exceed MaxInt32 + if totalWeightInt64 > int64(maxWeightSum) { + return nil, fmt.Errorf("flag %q: sum of all weights (%d) exceeds maximum allowed value (%d)", flagKey, totalWeightInt64, maxWeightSum) + } + + feDistributions.totalWeight = int32(totalWeightInt64) return feDistributions, nil } -// distributeValue calculate hash for given hash key and find the bucket distributions belongs to -func distributeValue(value string, feDistribution *fractionalEvaluationDistribution) string { - hashValue := int32(murmur3.StringSum32(value)) - hashRatio := math.Abs(float64(hashValue)) / math.MaxInt32 - bucket := hashRatio * 100 // in range [0, 100] +// distributeValue accepts a pre-computed 32-bit hash value and distributes it to a variant using high-precision integer arithmetic. +// It maps a 32-bit hash to the range [0, totalWeight) and finds the variant bucket that contains that value. +func distributeValue(hashValue uint32, feDistribution *fractionalEvaluationDistribution) any { + if feDistribution.totalWeight == 0 { + return "" + } + + bucket := (uint64(hashValue) * uint64(feDistribution.totalWeight)) >> 32 - rangeEnd := float64(0) - for _, weightedVariant := range feDistribution.weightedVariants { - rangeEnd += weightedVariant.getPercentage(feDistribution.totalWeight) + var rangeEnd uint64 = 0 + for _, variant := range feDistribution.weightedVariants { + rangeEnd += uint64(variant.weight) if bucket < rangeEnd { - return weightedVariant.variant + return variant.variant } } + // unreachable given validation return "" } diff --git a/core/pkg/evaluator/fractional_test.go b/core/pkg/evaluator/fractional_test.go index c1dfb9a38..ce36ac799 100644 --- a/core/pkg/evaluator/fractional_test.go +++ b/core/pkg/evaluator/fractional_test.go @@ -10,17 +10,61 @@ import ( "github.com/stretchr/testify/assert" ) +// Test constants +const ( + emailField = "email" + localeField = "locale" + tierField = "tier" + targetingKeyField = "targetingKey" + + rachelEmail = "rachel@faas.com" + monicaEmail = "monica@faas.com" + joeyEmail = "joey@faas.com" + rossEmail = "ross@faas.com" + testAEmail = "test_a@faas.com" + testBEmail = "test_b@faas.com" + testCEmail = "test_c@faas.com" + testDEmail = "test_d@faas.com" + test4Email = "test4@faas.com" + fooEmail = "foo@foo.com" + + usLocale = "us" + caLocale = "ca" + premiumTier = "premium" + + redVariant = "red" + blueVariant = "blue" + greenVariant = "green" + yellowVariant = "yellow" + + redHex = "#FF0000" + blueHex = "#0000FF" + greenHex = "#00FF00" + yellowHex = "#FFFF00" +) + +// setupEvaluator creates and initializes a JSON evaluator with the given flags +func setupEvaluator(source string, flags []model.Flag) (*JSON, error) { + log := logger.NewLogger(nil, false) + s, err := store.NewStore(log, []string{source}) + if err != nil { + return nil, err + } + je := NewJSON(log, s) + je.store.Update(source, flags, model.Metadata{}) + return je, nil +} + func TestFractionalEvaluation(t *testing.T) { const source = "testSource" - var sources = []string{source} ctx := context.Background() commonFlags := []model.Flag{ { Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "if": [ { @@ -55,8 +99,8 @@ func TestFractionalEvaluation(t *testing.T) { { Key: "customSeededHeaderColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "if": [ { @@ -87,44 +131,44 @@ func TestFractionalEvaluation(t *testing.T) { expectedReason string expectedErrorCode string }{ - "rachel@faas.com": { + rachelEmail: { flags: commonFlags, flagKey: "headerColor", context: map[string]any{ - "email": "rachel@faas.com", + emailField: rachelEmail, }, - expectedVariant: "yellow", - expectedValue: "#FFFF00", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, - "monica@faas.com": { + monicaEmail: { flags: commonFlags, flagKey: "headerColor", context: map[string]any{ - "email": "monica@faas.com", + emailField: monicaEmail, }, - expectedVariant: "blue", - expectedValue: "#0000FF", + expectedVariant: yellowVariant, + expectedValue: yellowHex, expectedReason: model.TargetingMatchReason, }, - "joey@faas.com": { + joeyEmail: { flags: commonFlags, flagKey: "headerColor", context: map[string]any{ - "email": "joey@faas.com", + emailField: joeyEmail, }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: redVariant, + expectedValue: redHex, expectedReason: model.TargetingMatchReason, }, - "ross@faas.com": { + rossEmail: { flags: commonFlags, flagKey: "headerColor", context: map[string]any{ - "email": "ross@faas.com", + emailField: rossEmail, }, - expectedVariant: "green", - expectedValue: "#00FF00", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, "rachel@faas.com with custom seed": { @@ -133,8 +177,8 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "rachel@faas.com", }, - expectedVariant: "green", - expectedValue: "#00FF00", + expectedVariant: greenVariant, + expectedValue: greenHex, expectedReason: model.TargetingMatchReason, }, "monica@faas.com with custom seed": { @@ -143,8 +187,8 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "monica@faas.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: redVariant, + expectedValue: redHex, expectedReason: model.TargetingMatchReason, }, "joey@faas.com with custom seed": { @@ -153,8 +197,8 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "joey@faas.com", }, - expectedVariant: "green", - expectedValue: "#00FF00", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, "ross@faas.com with custom seed": { @@ -163,16 +207,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "ross@faas.com", }, - expectedVariant: "green", - expectedValue: "#00FF00", + expectedVariant: greenVariant, + expectedValue: greenHex, expectedReason: model.TargetingMatchReason, }, "ross@faas.com with different flag key": { flags: []model.Flag{{ Key: "footerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "if": [ { @@ -209,16 +253,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "ross@faas.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: redVariant, + expectedValue: redHex, expectedReason: model.TargetingMatchReason, }, "non even split": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "if": [ { @@ -251,16 +295,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "test4@faas.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: greenVariant, + expectedValue: greenHex, expectedReason: model.TargetingMatchReason, }, "fallback to default variant if no email provided": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "fractional": [ {"var": "email"}, @@ -286,16 +330,16 @@ func TestFractionalEvaluation(t *testing.T) { }, flagKey: "headerColor", context: map[string]any{}, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: redVariant, + expectedValue: redHex, expectedReason: model.DefaultReason, }, "get variant for non-percentage weight values": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "fractional": [ {"var": "email"}, @@ -315,16 +359,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "foo@foo.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, "get variant for non-specified weight values": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "fractional": [ {"var": "email"}, @@ -342,16 +386,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "email": "foo@foo.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, "default to targetingKey if no bucket key provided": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "fractional": [ [ @@ -370,16 +414,16 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "targetingKey": "foo@foo.com", }, - expectedVariant: "blue", - expectedValue: "#0000FF", + expectedVariant: greenVariant, + expectedValue: greenHex, expectedReason: model.TargetingMatchReason, }, "missing email - parser should ignore nil/missing custom variables and continue": { flags: []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte( `{ "fractional": [ @@ -394,23 +438,19 @@ func TestFractionalEvaluation(t *testing.T) { context: map[string]any{ "targetingKey": "foo@foo.com", }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, } const reqID = "default" for name, tt := range tests { t.Run(name, func(t *testing.T) { - log := logger.NewLogger(nil, false) - s, err := store.NewStore(log, sources) + je, err := setupEvaluator(source, tt.flags) if err != nil { - t.Fatalf("NewStore failed: %v", err) + t.Fatalf("setupEvaluator failed: %v", err) } - je := NewJSON(log, s) - je.store.Update(source, tt.flags, model.Metadata{}) - value, variant, reason, _, err := resolve[string](ctx, reqID, tt.flagKey, tt.context, je.evaluateVariant) if value != tt.expectedValue { @@ -437,14 +477,13 @@ func TestFractionalEvaluation(t *testing.T) { func BenchmarkFractionalEvaluation(b *testing.B) { const source = "testSource" - var sources = []string{source} ctx := context.Background() flags := []model.Flag{{ Key: "headerColor", State: "ENABLED", - DefaultVariant: "red", - Variants: colorVariants, + DefaultVariant: redVariant, + Variants: colorVariants, Targeting: []byte(`{ "if": [ { @@ -487,57 +526,54 @@ func BenchmarkFractionalEvaluation(b *testing.B) { expectedReason string expectedErrorCode string }{ - "test_a@faas.com": { + testAEmail: { flags: flags, flagKey: "headerColor", context: map[string]any{ - "email": "test_a@faas.com", + emailField: testAEmail, }, - expectedVariant: "blue", - expectedValue: "#0000FF", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, - "test_b@faas.com": { + testBEmail: { flags: flags, flagKey: "headerColor", context: map[string]any{ - "email": "test_b@faas.com", + emailField: testBEmail, }, - expectedVariant: "red", - expectedValue: "#FF0000", + expectedVariant: redVariant, + expectedValue: redHex, expectedReason: model.TargetingMatchReason, }, - "test_c@faas.com": { + testCEmail: { flags: flags, flagKey: "headerColor", context: map[string]any{ - "email": "test_c@faas.com", + emailField: testCEmail, }, - expectedVariant: "green", - expectedValue: "#00FF00", + expectedVariant: greenVariant, + expectedValue: greenHex, expectedReason: model.TargetingMatchReason, }, - "test_d@faas.com": { + testDEmail: { flags: flags, flagKey: "headerColor", context: map[string]any{ - "email": "test_d@faas.com", + emailField: testDEmail, }, - expectedVariant: "blue", - expectedValue: "#0000FF", + expectedVariant: blueVariant, + expectedValue: blueHex, expectedReason: model.TargetingMatchReason, }, } reqID := "test" for name, tt := range tests { b.Run(name, func(b *testing.B) { - log := logger.NewLogger(nil, false) - s, err := store.NewStore(log, sources) + je, err := setupEvaluator(source, tt.flags) if err != nil { - b.Fatalf("NewStore failed: %v", err) + b.Fatalf("setupEvaluator failed: %v", err) } - je := NewJSON(log, s) - je.store.Update(source, tt.flags, model.Metadata{}) for i := 0; i < b.N; i++ { value, variant, reason, _, err := resolve[string]( @@ -569,10 +605,10 @@ func BenchmarkFractionalEvaluation(b *testing.B) { func Test_fractionalEvaluationVariant_getPercentage(t *testing.T) { type fields struct { variant string - weight int + weight int32 } type args struct { - totalWeight int + totalWeight int32 } tests := []struct { name string @@ -611,3 +647,307 @@ func Test_fractionalEvaluationVariant_getPercentage(t *testing.T) { }) } } + +func TestFractionalEvaluationNegativeClamping(t *testing.T) { + ctx := context.Background() + flagKey := "clampedWeightFlag" + + evalContext := map[string]any{ + targetingKeyField: "some-targeting-key", + } + + commonFlags := []model.Flag{ + { + Key: flagKey, + State: "ENABLED", + DefaultVariant: blueVariant, + Variants: colorVariants, + Targeting: []byte(`{ + "fractional": [ + [ + "red", + -1000 + ], + [ + "green", + 1 + ] + ] + }`), + }, + } + + je, err := setupEvaluator("testSource", commonFlags) + if err != nil { + t.Fatalf("setupEvaluator failed: %v", err) + } + + value, variant, reason, _, err := resolve[string](ctx, "default", flagKey, evalContext, je.evaluateVariant) + assert.Equal(t, greenVariant, variant) + assert.Equal(t, greenHex, value) + assert.Equal(t, model.TargetingMatchReason, reason) + assert.NoError(t, err) +} + +func TestFractionalEvaluationWithNestedJSONLogic(t *testing.T) { + const source = "testSource" + ctx := context.Background() + + commonFlags := []model.Flag{ + { + Key: "nestedIfVariant", + State: "ENABLED", + DefaultVariant: redVariant, + Variants: colorVariants, + Targeting: []byte(`{ + "fractional": [ + "email", + [ + { + "if": [ + {"in": ["us", {"var": "locale"}]}, + "red", + "blue" + ] + }, + 25 + ], + [ + "green", + 75 + ] + ] + }`), + }, + { + Key: "nestedFractional", + State: "ENABLED", + DefaultVariant: redVariant, + Variants: colorVariants, + Targeting: []byte(`{ + "fractional": [ + "email", + [ + { + "fractional": [ + "tier", + ["red", 25], + ["blue", 25], + ["green", 25], + ["yellow", 25] + ] + }, + 25 + ], + [ + "green", + 75 + ] + ] + }`), + }, + { + Key: "dynamicWeights", + State: "ENABLED", + DefaultVariant: redVariant, + Variants: colorVariants, + Targeting: []byte(`{ + "fractional": [ + "email", + ["red", {"var": "redWeight"}], + ["blue", {"var": "blueWeight"}], + ["green", {"var": "greenWeight"}] + ] + }`), + }, + } + + tests := map[string]struct { + flags []model.Flag + flagKey string + context map[string]any + expectedVariant string + expectedValue string + expectedReason string + expectedErrorCode string + validVariants []string // for tests where exact variant depends on hash + }{ + "nested if - us locale in second bucket returns static variant": { + flags: commonFlags, + flagKey: "nestedIfVariant", + context: map[string]any{ + emailField: rachelEmail, + localeField: usLocale, + }, + expectedVariant: greenVariant, + expectedValue: greenHex, + expectedReason: model.TargetingMatchReason, + }, + "nested if - non-us locale in second bucket returns static value": { + flags: commonFlags, + flagKey: "nestedIfVariant", + context: map[string]any{ + emailField: rachelEmail, + localeField: caLocale, + }, + expectedVariant: greenVariant, + expectedValue: greenHex, + expectedReason: model.TargetingMatchReason, + }, + "nested fractional in second bucket returns one of variants": { + flags: commonFlags, + flagKey: "nestedFractional", + context: map[string]any{ + emailField: rachelEmail, + tierField: premiumTier, + }, + expectedVariant: greenVariant, + expectedValue: greenHex, + expectedReason: model.TargetingMatchReason, + }, + "weights computed from context variables": { + flags: commonFlags, + flagKey: "dynamicWeights", + context: map[string]any{ + emailField: testAEmail, + "redWeight": float64(0), + "blueWeight": float64(1), + "greenWeight": float64(0), + }, + expectedVariant: blueVariant, + expectedValue: blueHex, + expectedReason: model.TargetingMatchReason, + }, + "weights computed: red": { + flags: commonFlags, + flagKey: "dynamicWeights", + context: map[string]any{ + emailField: testAEmail, + "redWeight": float64(1), + "blueWeight": float64(0), + "greenWeight": float64(0), + }, + expectedVariant: redVariant, + expectedValue: redHex, + expectedReason: model.TargetingMatchReason, + }, + "weights computed: green": { + flags: commonFlags, + flagKey: "dynamicWeights", + context: map[string]any{ + emailField: testAEmail, + "redWeight": float64(0), + "blueWeight": float64(0), + "greenWeight": float64(1), + }, + expectedVariant: greenVariant, + expectedValue: greenHex, + expectedReason: model.TargetingMatchReason, + }, + } + const reqID = "default" + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + je, err := setupEvaluator(source, tt.flags) + if err != nil { + t.Fatalf("setupEvaluator failed: %v", err) + } + + value, variant, reason, _, err := resolve[string](ctx, reqID, tt.flagKey, tt.context, je.evaluateVariant) + + if tt.expectedVariant != "" && variant != tt.expectedVariant { + t.Errorf("expected variant '%s', got '%s'", tt.expectedVariant, variant) + } + + // check valid variants if specified (for hash-dependent tests) + if len(tt.validVariants) > 0 { + valid := false + for _, v := range tt.validVariants { + if variant == v { + valid = true + break + } + } + if !valid { + t.Errorf("expected variant to be one of %v, got '%s'", tt.validVariants, variant) + } + } + + if tt.expectedValue != "" && value != tt.expectedValue { + t.Errorf("expected value '%s', got '%s'", tt.expectedValue, value) + } + + if reason != tt.expectedReason { + t.Errorf("expected reason '%s', got '%s'", tt.expectedReason, reason) + } + + if err != nil { + errorCode := err.Error() + if errorCode != tt.expectedErrorCode { + t.Errorf("expected err '%v', got '%v'", tt.expectedErrorCode, err) + } + } + }) + } +} + +func TestFractionalVariantBoolNumericAndOperators(t *testing.T) { + log := logger.NewLogger(nil, false) + fractional := NewFractional(log) + + tests := []struct { + name string + values any + data any + expected any + expectedOptions []any // for hash-dependent or operators variants + }{ + { + name: "bool variant true", + values: []any{ + "user123", + []any{true, float64(50)}, + []any{false, float64(50)}, + }, + data: map[string]any{ + flagdPropertiesKey: map[string]any{ + "flagKey": "test", + "timestamp": int64(0), + }, + }, + expectedOptions: []any{true, false}, + }, + { + name: "numeric variant 0", + values: []any{ + "user789", + []any{float64(0), float64(33)}, + []any{float64(1), float64(33)}, + []any{float64(2), float64(34)}, + }, + data: map[string]any{ + flagdPropertiesKey: map[string]any{ + "flagKey": "test", + "timestamp": int64(0), + }, + }, + expectedOptions: []any{float64(0), float64(1), float64(2)}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := fractional.Evaluate(tt.values, tt.data) + + // Check if result is one of the expected options + found := false + for _, v := range tt.expectedOptions { + if result == v { + found = true + break + } + } + assert.True(t, found, "expected one of %v, got %v", tt.expectedOptions, result) + }) + } +} diff --git a/flagd/go.mod b/flagd/go.mod index 53e5b4326..218fb53a1 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -80,7 +80,7 @@ require ( github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/diegoholiveira/jsonlogic/v3 v3.8.4 // indirect + github.com/diegoholiveira/jsonlogic/v3 v3.9.0 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect diff --git a/schemas b/schemas index 58d732724..1daf5ff56 160000 --- a/schemas +++ b/schemas @@ -1 +1 @@ -Subproject commit 58d732724359b272001ee6a5b8b7a96c549397e4 +Subproject commit 1daf5ff56b48d582187d59e35d48c6e191c23839 diff --git a/test-harness b/test-harness index b0057abde..2684a3ecf 160000 --- a/test-harness +++ b/test-harness @@ -1 +1 @@ -Subproject commit b0057abde5d84272d6dd91f4737655c9d6cead15 +Subproject commit 2684a3ecf061002221a8be7d09e9c8f915c7b193 diff --git a/test/integration/go.mod b/test/integration/go.mod index e154c24ff..247d359d4 100644 --- a/test/integration/go.mod +++ b/test/integration/go.mod @@ -1,114 +1,87 @@ +// this is a intentionally an "orphaned" module so that it effectively does e2e testing independently of the rest of the code module integration_test go 1.25.5 require ( github.com/go-git/go-git/v5 v5.16.2 - github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0 - github.com/testcontainers/testcontainers-go v0.40.0 + github.com/open-feature/go-sdk-contrib/providers/flagd v0.4.0 + github.com/open-feature/go-sdk-contrib/tests/flagd/v2 v2.0.2 + github.com/testcontainers/testcontainers-go v0.41.0 ) require ( - buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 // indirect - buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 // indirect - buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 // indirect + buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2 // indirect + buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 // indirect + buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 // indirect connectrpc.com/connect v1.19.1 // indirect connectrpc.com/otelconnect v0.7.2 // indirect dario.cat/mergo v1.0.2 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e // indirect - github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.1.6 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.12 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.65 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect - github.com/aws/smithy-go v1.22.3 // indirect github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/buger/goterm v1.0.4 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/cenkalti/backoff/v5 v5.0.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect - github.com/compose-spec/compose-go/v2 v2.9.0 // indirect + github.com/compose-spec/compose-go/v2 v2.10.1 // indirect github.com/containerd/console v1.0.5 // indirect - github.com/containerd/containerd/api v1.9.0 // indirect - github.com/containerd/containerd/v2 v2.1.5 // indirect + github.com/containerd/containerd/api v1.10.0 // indirect + github.com/containerd/containerd/v2 v2.2.1 // indirect github.com/containerd/continuity v0.4.5 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/containerd/platforms v1.0.0-rc.1 // indirect + github.com/containerd/platforms v1.0.0-rc.2 // indirect github.com/containerd/ttrpc v1.2.7 // indirect github.com/containerd/typeurl/v2 v2.2.3 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/cucumber/gherkin/go/v26 v26.2.0 // indirect github.com/cucumber/godog v0.15.1 // indirect github.com/cucumber/messages/go/v21 v21.0.1 // indirect - github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/cyphar/filepath-securejoin v0.6.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/diegoholiveira/jsonlogic/v3 v3.8.4 // indirect + github.com/diegoholiveira/jsonlogic/v3 v3.9.0 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/buildx v0.29.1 // indirect - github.com/docker/cli v28.5.1+incompatible // indirect - github.com/docker/cli-docs-tool v0.10.0 // indirect - github.com/docker/compose/v2 v2.40.2 // indirect - github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v28.5.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.9.3 // indirect - github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect + github.com/docker/buildx v0.31.1 // indirect + github.com/docker/cli v29.2.1+incompatible // indirect + github.com/docker/compose/v5 v5.1.0 // indirect + github.com/docker/docker v28.5.2+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.5 // indirect github.com/docker/go-connections v0.6.0 // indirect - github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/ebitengine/purego v0.8.4 // indirect + github.com/ebitengine/purego v0.10.0 // indirect github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 // indirect - github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsevents v0.2.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fvbommel/sortorder v1.1.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-viper/mapstructure/v2 v2.4.0 // indirect - github.com/gofrs/flock v0.12.1 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/gofrs/flock v0.13.0 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.2 // indirect + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.5 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/in-toto/in-toto-golang v0.9.0 // indirect @@ -116,42 +89,33 @@ require ( github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/compress v1.18.3 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.10 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect - github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/moby/buildkit v0.25.2 // indirect + github.com/moby/buildkit v0.27.1 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/go-archive v0.1.0 // indirect + github.com/moby/go-archive v0.2.0 // indirect github.com/moby/locker v1.0.1 // indirect + github.com/moby/moby/api v1.53.0 // indirect + github.com/moby/moby/client v0.2.2 // indirect github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.5.0 // indirect github.com/moby/sys/atomicwriter v0.1.0 // indirect github.com/moby/sys/capability v0.4.0 // indirect - github.com/moby/sys/mountinfo v0.7.2 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/signal v0.7.1 // indirect github.com/moby/sys/symlink v0.3.0 // indirect github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 // indirect - github.com/open-feature/flagd/core v0.12.1 // indirect + github.com/morikuni/aec v1.1.0 // indirect + github.com/onsi/gomega v1.35.1 // indirect + github.com/open-feature/flagd-schemas v0.2.13 // indirect + github.com/open-feature/flagd/core v0.14.0 // indirect github.com/open-feature/go-sdk v1.17.0 // indirect - github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect @@ -159,91 +123,69 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.65.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.6.0 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.1 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect - github.com/shirou/gopsutil/v4 v4.25.6 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect + github.com/shirou/gopsutil/v4 v4.26.2 // indirect + github.com/sigstore/sigstore v1.10.4 // indirect + github.com/sigstore/sigstore-go v1.1.4-0.20251124094504-b5fe07a5a7d7 // indirect + github.com/sirupsen/logrus v1.9.4 // indirect github.com/skeema/knownhosts v1.3.1 // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/spf13/cobra v1.10.1 // indirect + github.com/spf13/cobra v1.10.2 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/stretchr/testify v1.11.1 // indirect - github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 // indirect - github.com/theupdateframework/notary v0.7.0 // indirect + github.com/testcontainers/testcontainers-go/modules/compose v0.41.0 // indirect github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 // indirect - github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f // indirect + github.com/tonistiigi/fsutil v0.0.0-20251211185533-a2aa163d723f // indirect github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 // indirect github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab // indirect github.com/twmb/murmur3 v1.1.8 // indirect - github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - github.com/zclconf/go-cty v1.17.0 // indirect - github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/sdk v1.37.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect - go.opentelemetry.io/proto/otlp v1.7.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect + go.opentelemetry.io/otel v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 // indirect + go.opentelemetry.io/otel/metric v1.41.0 // indirect + go.opentelemetry.io/otel/sdk v1.41.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.41.0 // indirect + go.opentelemetry.io/otel/trace v1.41.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.45.0 // indirect + go.yaml.in/yaml/v4 v4.0.0-rc.4 // indirect + golang.org/x/crypto v0.48.0 // indirect golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect - golang.org/x/mod v0.29.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect - golang.org/x/time v0.11.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/grpc v1.74.2 // indirect - google.golang.org/protobuf v1.36.9 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect + golang.org/x/mod v0.32.0 // indirect + golang.org/x/net v0.51.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/term v0.40.0 // indirect + golang.org/x/text v0.34.0 // indirect + golang.org/x/time v0.14.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/grpc v1.79.1 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.33.2 // indirect - k8s.io/apimachinery v0.33.2 // indirect - k8s.io/client-go v0.33.2 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect - tags.cncf.io/container-device-interface v1.0.1 // indirect + tags.cncf.io/container-device-interface v1.1.0 // indirect ) diff --git a/test/integration/go.sum b/test/integration/go.sum index 43bff4e38..c8f56fd4e 100644 --- a/test/integration/go.sum +++ b/test/integration/go.sum @@ -1,112 +1,68 @@ -buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1 h1:qnXaezo9s36RjysUq6omZlU3rjQNykMpqCXfCL/CH1Q= -buf.build/gen/go/open-feature/flagd/connectrpc/go v1.18.1-20250529171031-ebdc14163473.1/go.mod h1:/9fZNSPUzUwGRzDAjyasa5NC+YFgQthby355ZVuKS2Q= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2 h1:TZ+7u106u7C7lgNctxG03ABliF46eLhcIZG5Mdo67/E= -buf.build/gen/go/open-feature/flagd/grpc/go v1.5.1-20250529171031-ebdc14163473.2/go.mod h1:4u0WLwfkLob3dC/F8qNctqhtiEv2Mlyi8YgCDDzgYDs= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1 h1:LdC4xAuUaNdduzQr5VvhjsgrCfpW9IYxYsjyCF0ANs0= -buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.6-20250529171031-ebdc14163473.1/go.mod h1:cCQ49+ttXE2MZ/ciRNb0tCG+F3kj2ZVbP+0/psbhrLY= +buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2 h1:n2DShwj5AfzieZKN2tid3gFt/HCZo/UUn4qMbUJ4H7M= +buf.build/gen/go/open-feature/flagd/connectrpc/go v1.19.1-20260217192757-1388a552fc3c.2/go.mod h1:NRDpVnsDW1gkVfxKOXVpUkW9Tx5SIUPXgqCUq3dftew= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 h1:Vw1UTeqrKDQMasR9eSOh7JsA3Ii1dov0lPMPFwW16gg= +buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= +buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= connectrpc.com/otelconnect v0.7.2 h1:WlnwFzaW64dN06JXU+hREPUGeEzpz3Acz2ACOmN8cMI= connectrpc.com/otelconnect v0.7.2/go.mod h1:JS7XUKfuJs2adhCnXhNHPHLz6oAaZniCJdSF00OZSew= +cyphar.com/go-pathrs v0.2.1 h1:9nx1vOgwVvX1mNBWDu93+vaceedpbsDqo+XuBGL40b8= +cyphar.com/go-pathrs v0.2.1/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e h1:rd4bOvKmDIx0WeTv9Qz+hghsgyjikFiPrseXHlKepO0= github.com/DefangLabs/secret-detector v0.0.0-20250403165618-22662109213e/go.mod h1:blbwPQh4DTlCZEfk1BLU4oMIhLda2U+A840Uag9DsZw= -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.13.0 h1:/BcXOiS6Qi7N9XqUcv27vkIuVOkBEcWstd2pMlWSeaA= -github.com/Microsoft/hcsshim v0.13.0/go.mod h1:9KWJ/8DgU+QzYGupX4tzMhRQE8h6w90lH6HAaclpEok= -github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= -github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= -github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d h1:hi6J4K6DKrR4/ljxn6SF6nURyu785wKMuQcjt7H3VCQ= -github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Microsoft/hcsshim v0.14.0-rc.1 h1:qAPXKwGOkVn8LlqgBN8GS0bxZ83hOJpcjxzmlQKxKsQ= +github.com/Microsoft/hcsshim v0.14.0-rc.1/go.mod h1:hTKFGbnDtQb1wHiOWv4v0eN+7boSWAHyK/tNAaYZL0c= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= -github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= +github.com/anchore/go-struct-converter v0.1.0 h1:2rDRssAl6mgKBSLNiVCMADgZRhoqtw9dedlWa0OhD30= +github.com/anchore/go-struct-converter v0.1.0/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= -github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= -github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/config v1.29.12 h1:Y/2a+jLPrPbHpFkpAAYkVEtJmxORlXoo5k2g1fa2sUo= -github.com/aws/aws-sdk-go-v2/config v1.29.12/go.mod h1:xse1YTjmORlb/6fhkWi8qJh3cvZi4JoVNhc+NbJt4kI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65 h1:q+nV2yYegofO/SUXruT+pn4KxkxmaQ++1B/QedcKBFM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.65/go.mod h1:4zyjAuGOdikpNYiSGpsGz8hLGmUzlY8pc8r9QQ/RXYQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2 h1:pdgODsAhGo4dvzC3JAG5Ce0PX8kWXrTZGx+jxADD+5E= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.2/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0 h1:90uX0veLKcdHVfvxhkWUQSCi5VabtwMLFutYiRke4oo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.0/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 h1:PZV5W8yk4OtH1JAuhV2PXwwO9v5G5Aoj+eMCn4T+1Kc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.17/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= -github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= -github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= -github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= -github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= -github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= -github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/compose-spec/compose-go/v2 v2.9.0 h1:UHSv/QHlo6QJtrT4igF1rdORgIUhDo1gWuyJUoiNNIM= -github.com/compose-spec/compose-go/v2 v2.9.0/go.mod h1:Oky9AZGTRB4E+0VbTPZTUu4Kp+oEMMuwZXZtPPVT1iE= -github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= -github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/compose-spec/compose-go/v2 v2.10.1 h1:mFbXobojGRFIVi1UknrvaDAZ+PkJfyjqkA1yseh+vAU= +github.com/compose-spec/compose-go/v2 v2.10.1/go.mod h1:Ohac1SzhO/4fXXrzWIztIVB6ckmKBv1Nt5Z5mGVESUg= +github.com/containerd/cgroups/v3 v3.1.2 h1:OSosXMtkhI6Qove637tg1XgK4q+DhR0mX8Wi8EhrHa4= +github.com/containerd/cgroups/v3 v3.1.2/go.mod h1:PKZ2AcWmSBsY/tJUVhtS/rluX0b1uq1GmPO1ElCmbOw= github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= -github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= -github.com/containerd/containerd/v2 v2.1.5 h1:pWSmPxUszaLZKQPvOx27iD4iH+aM6o0BoN9+hg77cro= -github.com/containerd/containerd/v2 v2.1.5/go.mod h1:8C5QV9djwsYDNhxfTCFjWtTBZrqjditQ4/ghHSYjnHM= +github.com/containerd/containerd/api v1.10.0 h1:5n0oHYVBwN4VhoX9fFykCV9dF1/BvAXeg2F8W6UYq1o= +github.com/containerd/containerd/api v1.10.0/go.mod h1:NBm1OAk8ZL+LG8R0ceObGxT5hbUYj7CzTmR3xh0DlMM= +github.com/containerd/containerd/v2 v2.2.1 h1:TpyxcY4AL5A+07dxETevunVS5zxqzuq7ZqJXknM11yk= +github.com/containerd/containerd/v2 v2.2.1/go.mod h1:NR70yW1iDxe84F2iFWbR9xfAN0N2F0NcjTi1OVth4nU= github.com/containerd/continuity v0.4.5 h1:ZRoN1sXq9u7V6QoHMcVWGhOwDFqZ4B9i5H6un1Wh0x4= github.com/containerd/continuity v0.4.5/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= @@ -117,15 +73,15 @@ github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/nydus-snapshotter v0.15.2 h1:qsHI4M+Wwrf6Jr4eBqhNx8qh+YU0dSiJ+WPmcLFWNcg= -github.com/containerd/nydus-snapshotter v0.15.2/go.mod h1:FfwH2KBkNYoisK/e+KsmNr7xTU53DmnavQHMFOcXwfM= -github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= -github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= +github.com/containerd/nydus-snapshotter v0.15.10 h1:hphjuKOqSHLGznNJiAvmsOWkdu4qFXjf4DzGrWSuIsM= +github.com/containerd/nydus-snapshotter v0.15.10/go.mod h1:EWRd/QJ0b6UKHAqYgiV5gHlqLC2qq5cQiSlXEdVovrA= +github.com/containerd/platforms v1.0.0-rc.2 h1:0SPgaNZPVWGEi4grZdV8VRYQn78y+nm6acgLGv/QzE4= +github.com/containerd/platforms v1.0.0-rc.2/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= github.com/containerd/plugin v1.0.0 h1:c8Kf1TNl6+e2TtMHZt+39yAPDbouRH9WAToRjex483Y= github.com/containerd/plugin v1.0.0/go.mod h1:hQfJe5nmWfImiqT1q8Si3jLv3ynMUIBB47bQ+KexvO8= -github.com/containerd/stargz-snapshotter v0.16.3 h1:zbQMm8dRuPHEOD4OqAYGajJJUwCeUzt4j7w9Iaw58u4= -github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= -github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= +github.com/containerd/stargz-snapshotter v0.17.0 h1:djNS4KU8ztFhLdEDZ1bsfzOiYuVHT6TgSU5qwRk+cNc= +github.com/containerd/stargz-snapshotter/estargz v0.17.0 h1:+TyQIsR/zSFI1Rm31EQBwpAA1ovYgIKHy7kctL3sLcE= +github.com/containerd/stargz-snapshotter/estargz v0.17.0/go.mod h1:s06tWAiJcXQo9/8AReBCIo/QxcXFZ2n4qfsRnpl71SM= github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= @@ -134,7 +90,6 @@ github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GK github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= @@ -144,69 +99,58 @@ github.com/cucumber/godog v0.15.1/go.mod h1:qju+SQDewOljHuq9NSM66s0xEhogx0q30flf github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/cucumber/messages/go/v22 v22.0.0/go.mod h1:aZipXTKc0JnjCsXrJnuZpWhtay93k7Rn3Dee7iyPJjs= -github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= -github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= +github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is= +github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1vfDaOVsaipH4= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0 h1:ZYx6tM8+1NRo0RwFpBmVxtmJnXs/f3rtIZo9t9dCk3Y= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= +github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 h1:ge14PCmCvPjpMQMIAH7uKg0lrtNSOdpYsRXlwk3QbaE= +github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= +github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 h1:lxmTCgmHE1GUYL7P0MlNa00M67axePTq+9nBSGddR8I= +github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/docker/buildx v0.29.1 h1:58hxM5Z4mnNje3G5NKfULT9xCr8ooM8XFtlfUK9bKaA= -github.com/docker/buildx v0.29.1/go.mod h1:J4EFv6oxlPiV1MjO0VyJx2u5tLM7ImDEl9zyB8d4wPI= -github.com/docker/cli v28.5.1+incompatible h1:ESutzBALAD6qyCLqbQSEf1a/U8Ybms5agw59yGVc+yY= -github.com/docker/cli v28.5.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli-docs-tool v0.10.0 h1:bOD6mKynPQgojQi3s2jgcUWGp/Ebqy1SeCr9VfKQLLU= -github.com/docker/cli-docs-tool v0.10.0/go.mod h1:5EM5zPnT2E7yCLERZmrDA234Vwn09fzRHP4aX1qwp1U= -github.com/docker/compose/v2 v2.40.2 h1:h2bDBJkOuqmj93XvT2oI0ArPQonE0lGtWiILXdiXvbA= -github.com/docker/compose/v2 v2.40.2/go.mod h1:CbSJpKGw20LInVsPjglZ8z7Squ3OBQOD7Ux5nkjGfIU= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/buildx v0.31.1 h1:zbvbrb9nxBNVV8nnI33f2F+4aAZBA1gY+AmeBFflMqY= +github.com/docker/buildx v0.31.1/go.mod h1:SD+jYLnt3S4SXqohVtV+8z+dihnOgwMJ8t+bLQvsaCk= +github.com/docker/cli v29.2.1+incompatible h1:n3Jt0QVCN65eiVBoUTZQM9mcQICCJt3akW4pKAbKdJg= +github.com/docker/cli v29.2.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v5 v5.1.0 h1:HofsoOEJZSAjXzzeGxOub3WK/uEAL0v7g7J1kgmYETY= +github.com/docker/compose/v5 v5.1.0/go.mod h1:vpHFFnEFlKTz9HjSkRqQz8x77ZuoMoq6CN1VicxFeQM= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.5.1+incompatible h1:Bm8DchhSD2J6PsFzxC35TZo4TLGR2PdW/E69rU45NhM= -github.com/docker/docker v28.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= -github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= -github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= +github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= -github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= +github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= -github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= -github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -217,9 +161,6 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -227,70 +168,82 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= -github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= -github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/go-openapi/analysis v0.24.1 h1:Xp+7Yn/KOnVWYG8d+hPksOYnCYImE3TieBa7rBOesYM= +github.com/go-openapi/analysis v0.24.1/go.mod h1:dU+qxX7QGU1rl7IYhBC8bIfmWQdX4Buoea4TGtxXY84= +github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM= +github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= +github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= +github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= +github.com/go-openapi/jsonreference v0.21.3 h1:96Dn+MRPa0nYAR8DR1E03SblB5FJvh7W6krPI0Z7qMc= +github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4ZJIK1VzduhXYBEeGc4= +github.com/go-openapi/loads v0.23.2 h1:rJXAcP7g1+lWyBHC7iTY+WAF0rprtM+pm8Jxv1uQJp4= +github.com/go-openapi/loads v0.23.2/go.mod h1:IEVw1GfRt/P2Pplkelxzj9BYFajiWOtY2nHZNj4UnWY= +github.com/go-openapi/runtime v0.29.2 h1:UmwSGWNmWQqKm1c2MGgXVpC2FTGwPDQeUsBMufc5Yj0= +github.com/go-openapi/runtime v0.29.2/go.mod h1:biq5kJXRJKBJxTDJXAa00DOTa/anflQPhT0/wmjuy+0= +github.com/go-openapi/spec v0.22.1 h1:beZMa5AVQzRspNjvhe5aG1/XyBSMeX1eEOs7dMoXh/k= +github.com/go-openapi/spec v0.22.1/go.mod h1:c7aeIQT175dVowfp7FeCvXXnjN/MrpaONStibD2WtDA= +github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ= +github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8= +github.com/go-openapi/swag v0.25.3 h1:FAa5wJXyDtI7yUztKDfZxDrSx+8WTg31MfCQ9s3PV+s= +github.com/go-openapi/swag v0.25.3/go.mod h1:tX9vI8Mj8Ny+uCEk39I1QADvIPI7lkndX4qCsEqhkS8= +github.com/go-openapi/swag/cmdutils v0.25.3 h1:EIwGxN143JCThNHnqfqs85R8lJcJG06qjJRZp3VvjLI= +github.com/go-openapi/swag/cmdutils v0.25.3/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= +github.com/go-openapi/swag/conv v0.25.3 h1:PcB18wwfba7MN5BVlBIV+VxvUUeC2kEuCEyJ2/t2X7E= +github.com/go-openapi/swag/conv v0.25.3/go.mod h1:n4Ibfwhn8NJnPXNRhBO5Cqb9ez7alBR40JS4rbASUPU= +github.com/go-openapi/swag/fileutils v0.25.3 h1:P52Uhd7GShkeU/a1cBOuqIcHMHBrA54Z2t5fLlE85SQ= +github.com/go-openapi/swag/fileutils v0.25.3/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= +github.com/go-openapi/swag/jsonname v0.25.3 h1:U20VKDS74HiPaLV7UZkztpyVOw3JNVsit+w+gTXRj0A= +github.com/go-openapi/swag/jsonname v0.25.3/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.3 h1:kV7wer79KXUM4Ea4tBdAVTU842Rg6tWstX3QbM4fGdw= +github.com/go-openapi/swag/jsonutils v0.25.3/go.mod h1:ILcKqe4HC1VEZmJx51cVuZQ6MF8QvdfXsQfiaCs0z9o= +github.com/go-openapi/swag/loading v0.25.3 h1:Nn65Zlzf4854MY6Ft0JdNrtnHh2bdcS/tXckpSnOb2Y= +github.com/go-openapi/swag/loading v0.25.3/go.mod h1:xajJ5P4Ang+cwM5gKFrHBgkEDWfLcsAKepIuzTmOb/c= +github.com/go-openapi/swag/mangling v0.25.3 h1:rGIrEzXaYWuUW1MkFmG3pcH+EIA0/CoUkQnIyB6TUyo= +github.com/go-openapi/swag/mangling v0.25.3/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= +github.com/go-openapi/swag/netutils v0.25.3 h1:XWXHZfL/65ABiv8rvGp9dtE0C6QHTYkCrNV77jTl358= +github.com/go-openapi/swag/netutils v0.25.3/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= +github.com/go-openapi/swag/stringutils v0.25.3 h1:nAmWq1fUTWl/XiaEPwALjp/8BPZJun70iDHRNq/sH6w= +github.com/go-openapi/swag/stringutils v0.25.3/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.3 h1:2w4mEEo7DQt3V4veWMZw0yTPQibiL3ri2fdDV4t2TQc= +github.com/go-openapi/swag/typeutils v0.25.3/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.3 h1:LKTJjCn/W1ZfMec0XDL4Vxh8kyAnv1orH5F2OREDUrg= +github.com/go-openapi/swag/yamlutils v0.25.3/go.mod h1:Y7QN6Wc5DOBXK14/xeo1cQlq0EA0wvLoSv13gDQoCao= +github.com/go-openapi/validate v0.25.1 h1:sSACUI6Jcnbo5IWqbYHgjibrhhmt3vR6lCzKZnmAgBw= +github.com/go-openapi/validate v0.25.1/go.mod h1:RMVyVFYte0gbSTaZ0N4KmTn6u/kClvAFp+mAVfS/DQc= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= -github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/certificate-transparency-go v1.3.2 h1:9ahSNZF2o7SYMaKaXhAumVEzXB2QaayzII9C8rv7v+A= +github.com/google/certificate-transparency-go v1.3.2/go.mod h1:H5FpMUaGa5Ab2+KCYsxg6sELw3Flkl7pGZzWdBoYLXs= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= +github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= -github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -302,50 +255,32 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/in-toto/attestation v1.1.2 h1:MBFn6lsMq6dptQZJBhalXTcWMb/aJy3V+GX3VYj/V1E= +github.com/in-toto/attestation v1.1.2/go.mod h1:gYFddHMZj3DiQ0b62ltNi1Vj5rC879bTmBbrv9CRHpM= github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= -github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= -github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/klauspost/compress v1.18.3 h1:9PJRvfbmTabkOX8moIpXPbMMbYN60bWImDDU7L+/6zw= +github.com/klauspost/compress v1.18.3/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -354,42 +289,30 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/buildkit v0.25.2 h1:mReLKDPv05cqk6o/u3ixq2/iTsWGHoUO5Zg3lojrQTk= -github.com/moby/buildkit v0.25.2/go.mod h1:phM8sdqnvgK2y1dPDnbwI6veUCXHOZ6KFSl6E164tkc= +github.com/moby/buildkit v0.27.1 h1:qlIWpnZzqCkrYiGkctM1gBD/YZPOJTjtUdRBlI0oBOU= +github.com/moby/buildkit v0.27.1/go.mod h1:99qLrCrIAFgEOiFnCi9Y0Wwp6/qA7QvZ3uq/6wF0IsI= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= -github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= +github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= +github.com/moby/go-archive v0.2.0/go.mod h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/moby/api v1.53.0 h1:PihqG1ncw4W+8mZs69jlwGXdaYBeb5brF6BL7mPIS/w= +github.com/moby/moby/api v1.53.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc= +github.com/moby/moby/client v0.2.2 h1:Pt4hRMCAIlyjL3cr8M5TrXCwKzguebPAc2do2ur7dEM= +github.com/moby/moby/client v0.2.2/go.mod h1:2EkIPVNCqR05CMIzL1mfA07t0HvVUUOl85pasRz/GmQ= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= @@ -408,58 +331,36 @@ github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= +github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86 h1:r3e+qs3QUdf4+lUi2ZZnSHgYkjeLIb5yu5jo+ypA8iw= -github.com/open-feature/flagd-schemas v0.2.9-0.20250707123415-08b4c52d3b86/go.mod h1:WKtwo1eW9/K6D+4HfgTXWBqCDzpvMhDa5eRxW7R5B2U= -github.com/open-feature/flagd/core v0.12.1 h1:fCBenpE0/m/l1KiU6gjM59FUQPnqeuxnO9D4v3UDqu4= -github.com/open-feature/flagd/core v0.12.1/go.mod h1:3dNe+BX8HUpx/mXrGLD554G6cQB67yvuASVTKVC4TU4= +github.com/open-feature/flagd-schemas v0.2.13 h1:LzoyQfirfpR8cxI4PKnoFRtpwPjpC/cOO8N0n8dpbRc= +github.com/open-feature/flagd-schemas v0.2.13/go.mod h1:C0jnJ4C3j2LzGuqKgLDdTsdfKEWQp6sOHZyxu3QohFU= +github.com/open-feature/flagd/core v0.14.0 h1:eGjPKONDjGa0+Pkxi6XiTdusFUCN3EuF7b1aebcDPvM= +github.com/open-feature/flagd/core v0.14.0/go.mod h1:G1KZQoSD0gi6JMVwcZxHhzOhs/WnhoyPjZneqej1neI= github.com/open-feature/go-sdk v1.17.0 h1:/OUBBw5d9D61JaNZZxb2Nnr5/EJrEpjtKCTY3rspJQk= github.com/open-feature/go-sdk v1.17.0/go.mod h1:lPxPSu1UnZ4E3dCxZi5gV3et2ACi8O8P+zsTGVsDZUw= -github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1 h1:24PKDHPdh+2KBuVNTzqycHGi8thvPIUVWl4jsr5NNGg= -github.com/open-feature/go-sdk-contrib/providers/flagd v0.3.1/go.mod h1:az4enQx0mOryt0rOgAiBPqFbgOySryuyBe76kUHc7GU= -github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0 h1:WaSMl6wZZVHx0IvRGstY3iqyHGHe3olCj038i4qF6NE= -github.com/open-feature/go-sdk-contrib/tests/flagd v1.6.0/go.mod h1:gLzJfQ4BKlrn8syRyMMas3ArOMqNaaUDRgj3bi4aWSs= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/open-feature/go-sdk-contrib/providers/flagd v0.4.0 h1:FHcz/EQ+WtPrbrtB9XBbrOKnpXk2sHyIwLo7pFt2wm4= +github.com/open-feature/go-sdk-contrib/providers/flagd v0.4.0/go.mod h1:HcsGB/b695L9PZX9fZwpWU72tFQaj0wADbthStDaajE= +github.com/open-feature/go-sdk-contrib/tests/flagd/v2 v2.0.2 h1:deCtDKh3QKh6WXKDe6HzF6Gm01ZltVSF0JV5GhZbuRI= +github.com/open-feature/go-sdk-contrib/tests/flagd/v2 v2.0.2/go.mod h1:oRuJpK7H5Alg8D3xGU2f/xJK/UqUqODIwhLMol6yo1Q= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= -github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= -github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg= +github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.13.1 h1:A8nNeceYngH9Ow++M+VVEwJVpdFmrlxsN22F+ISDCJE= +github.com/opencontainers/selinux v1.13.1/go.mod h1:S10WXZ/osk2kWOYKy1x2f/eXF5ZHJoUs8UU/2caNRbg= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= @@ -467,78 +368,62 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= -github.com/secure-systems-lab/go-securesystemslib v0.6.0 h1:T65atpAVCJQK14UA57LMdZGpHi4QYSH/9FZyNGqMYIA= -github.com/secure-systems-lab/go-securesystemslib v0.6.0/go.mod h1:8Mtpo9JKks/qhPG4HGZ2LGMvrPbzuxwfz/f/zLfEWkk= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= +github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= -github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= -github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs= -github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= +github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= +github.com/sigstore/protobuf-specs v0.5.0 h1:F8YTI65xOHw70NrvPwJ5PhAzsvTnuJMGLkA4FIkofAY= +github.com/sigstore/protobuf-specs v0.5.0/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= +github.com/sigstore/rekor v1.4.3 h1:2+aw4Gbgumv8vYM/QVg6b+hvr4x4Cukur8stJrVPKU0= +github.com/sigstore/rekor v1.4.3/go.mod h1:o0zgY087Q21YwohVvGwV9vK1/tliat5mfnPiVI3i75o= +github.com/sigstore/rekor-tiles/v2 v2.0.1 h1:1Wfz15oSRNGF5Dzb0lWn5W8+lfO50ork4PGIfEKjZeo= +github.com/sigstore/rekor-tiles/v2 v2.0.1/go.mod h1:Pjsbhzj5hc3MKY8FfVTYHBUHQEnP0ozC4huatu4x7OU= +github.com/sigstore/sigstore v1.10.4 h1:ytOmxMgLdcUed3w1SbbZOgcxqwMG61lh1TmZLN+WeZE= +github.com/sigstore/sigstore v1.10.4/go.mod h1:tDiyrdOref3q6qJxm2G+JHghqfmvifB7hw+EReAfnbI= +github.com/sigstore/sigstore-go v1.1.4-0.20251124094504-b5fe07a5a7d7 h1:94NLPmq4bxvdmslzcG670IOkrlS98CGpmob8cjpFHuI= +github.com/sigstore/sigstore-go v1.1.4-0.20251124094504-b5fe07a5a7d7/go.mod h1:4r/PNX0G7uzkLpc3PSdYs5E2k4bWEJNXTK6kwAyw9TM= +github.com/sigstore/timestamp-authority/v2 v2.0.2 h1:WavlEeLh6HKt+osbmsHDg6/FaM/8Pz9iVUMh9pAsl/o= +github.com/sigstore/timestamp-authority/v2 v2.0.2/go.mod h1:D+wbQg8ASQzKnwBhLo7rIJD+9Zev4Ppqd4myPe8k57E= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= -github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= -github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= -github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= -github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spdx/tools-golang v0.5.7 h1:+sWcKGnhwp3vLdMqPcLdA6QK679vd86cK9hQWH3AwCg= +github.com/spdx/tools-golang v0.5.7/go.mod h1:jg7w0LOpoNAw6OxKEzCoqPC2GCTj45LyTlVmXubDsYw= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= -github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= -github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c h1:2EejZtjFjKJGk71ANb+wtFK5EjUzUkEM3R0xnp559xg= -github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -546,95 +431,85 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/testcontainers/testcontainers-go v0.40.0 h1:pSdJYLOVgLE8YdUY2FHQ1Fxu+aMnb6JfVz1mxk7OeMU= -github.com/testcontainers/testcontainers-go v0.40.0/go.mod h1:FSXV5KQtX2HAMlm7U3APNyLkkap35zNLxukw9oBi/MY= -github.com/testcontainers/testcontainers-go/modules/compose v0.40.0 h1:Bj8W7GieY56sRbVJx1yLh0JVEtOQ8SQMhX+jRtzenLA= -github.com/testcontainers/testcontainers-go/modules/compose v0.40.0/go.mod h1:fEEGqtsoH1KS+sUi1WG4+vH3fqdCyip1U9Hd8P3SRMA= -github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= -github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= +github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= +github.com/testcontainers/testcontainers-go/modules/compose v0.41.0 h1:6ttsQ6IilJYMoTFI2gu9l7KmKlnlY9XGkP0wtgh4rF4= +github.com/testcontainers/testcontainers-go/modules/compose v0.41.0/go.mod h1:6PfaNLXsylvZE5CID8QMZ4fWjLHORvqm1xcGBncdzAY= +github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI= +github.com/theupdateframework/go-tuf/v2 v2.3.0 h1:gt3X8xT8qu/HT4w+n1jgv+p7koi5ad8XEkLXXZqG9AA= +github.com/theupdateframework/go-tuf/v2 v2.3.0/go.mod h1:xW8yNvgXRncmovMLvBxKwrKpsOwJZu/8x+aB0KtFcdw= github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323 h1:r0p7fK56l8WPequOaR3i9LBqfPtEdXIQbUTzT55iqT4= github.com/tonistiigi/dchapes-mode v0.0.0-20250318174251-73d941a28323/go.mod h1:3Iuxbr0P7D3zUzBMAZB+ois3h/et0shEz0qApgHYGpY= -github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f h1:MoxeMfHAe5Qj/ySSBfL8A7l1V+hxuluj8owsIEEZipI= -github.com/tonistiigi/fsutil v0.0.0-20250605211040-586307ad452f/go.mod h1:BKdcez7BiVtBvIcef90ZPc6ebqIWr4JWD7+EvLm6J98= +github.com/tonistiigi/fsutil v0.0.0-20251211185533-a2aa163d723f h1:Z4NEQ86qFl1mHuCu9gwcE+EYCwDKfXAYXZbdIXyxmEA= +github.com/tonistiigi/fsutil v0.0.0-20251211185533-a2aa163d723f/go.mod h1:BKdcez7BiVtBvIcef90ZPc6ebqIWr4JWD7+EvLm6J98= github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0 h1:2f304B10LaZdB8kkVEaoXvAMVan2tl9AiK4G0odjQtE= github.com/tonistiigi/go-csvvalue v0.0.0-20240814133006-030d3b2625d0/go.mod h1:278M4p8WsNh3n4a1eqiFcV2FGk7wE5fwUpUom9mK9lE= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c h1:5a2XDQ2LiAUV+/RjckMyq9sXudfrPSuCY4FuPC1NyAw= +github.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c/go.mod h1:g85IafeFJZLxlzZCDRu4JLpfS7HKzR+Hw9qRh3bVzDI= +github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= +github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= -github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= +github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= -github.com/zclconf/go-cty v1.17.0/go.mod h1:wqFzcImaLTI6A5HfsRwB0nj5n0MRZFwmey8YoFPPs3U= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss= +go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0 h1:0NIXxOCFx+SKbhCVxwl3ETG8ClLPAa0KuKV6p3yhxP8= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0/go.mod h1:ChZSJbbfbl/DcRZNc9Gqh6DYGlfjw4PvO1pEOZH1ZsE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= -go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 h1:2pn7OzMewmYRiNtv1doZnLo3gONcnMHlFnmOR8Vgt+8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0/go.mod h1:rjbQTDEPQymPE0YnRQp9/NuPwwtL0sesz/fnqRW/v84= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= +go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0 h1:vl9obrcoWVKp/lwl8tRE33853I8Xru9HFbw/skNeLs8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.38.0/go.mod h1:GAXRxmLJcVM3u22IjTg74zWBrRCKq8BnOqUVLodpcpw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= +go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= +go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= +go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= +go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= +go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= +go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= +go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= +go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= @@ -643,53 +518,40 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.yaml.in/yaml/v4 v4.0.0-rc.4 h1:UP4+v6fFrBIb1l934bDl//mmnoIZEDK0idg1+AIvX5U= +go.yaml.in/yaml/v4 v4.0.0-rc.4/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -701,94 +563,52 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= +golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= -google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= -google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= -gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= -gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY= -k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs= -k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY= -k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E= -k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= -sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= -tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= +pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= +pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +tags.cncf.io/container-device-interface v1.1.0 h1:RnxNhxF1JOu6CJUVpetTYvrXHdxw9j9jFYgZpI+anSY= +tags.cncf.io/container-device-interface v1.1.0/go.mod h1:76Oj0Yqp9FwTx/pySDc8Bxjpg+VqXfDb50cKAXVJ34Q= diff --git a/test/integration/integration_test.go b/test/integration/integration_test.go index c8b3f7c11..48742626b 100644 --- a/test/integration/integration_test.go +++ b/test/integration/integration_test.go @@ -4,15 +4,17 @@ import ( "context" "flag" "fmt" - "github.com/go-git/go-git/v5" - "github.com/open-feature/go-sdk-contrib/tests/flagd/testframework" - "github.com/testcontainers/testcontainers-go" "os" "os/exec" "path/filepath" "runtime" "strings" "testing" + + "github.com/go-git/go-git/v5" + flagd "github.com/open-feature/go-sdk-contrib/providers/flagd/pkg" + "github.com/open-feature/go-sdk-contrib/tests/flagd/v2/testframework" + "github.com/testcontainers/testcontainers-go" ) func getGitCommitNative() string { @@ -96,6 +98,9 @@ func buildFlagdImage(ctx context.Context, buildContext string) (string, error) { cmd.Dir = buildContext + // Suppress docker build output by redirecting stderr to /dev/null + cmd.Stderr = nil + // Print the exact command being run fmt.Printf("Running command: %s\n", strings.Join(cmd.Args, " ")) @@ -108,6 +113,16 @@ func buildFlagdImage(ctx context.Context, buildContext string) (string, error) { } func buildTestbedImage(ctx context.Context, buildContext, flagdImage string) error { + // Suppress testcontainers output by redirecting stderr to Discard + oldStderr := os.Stderr + r, w, _ := os.Pipe() + os.Stderr = w + defer func() { + os.Stderr = oldStderr + w.Close() + r.Close() + }() + req := testcontainers.ContainerRequest{ FromDockerfile: testcontainers.FromDockerfile{ Context: filepath.Join(buildContext, "./test-harness"), // Path to testbed directory @@ -141,6 +156,11 @@ func TestRPC(t *testing.T) { TestbedDir: "../../test-harness", Image: "local-testbed-image", Tag: getGitCommitNative(), + // needed to speed up reconnection to make reconnection tests faster + ExtraOptions: []flagd.ProviderOption{ + flagd.WithRetryBackoffMs(100), + flagd.WithRetryBackoffMaxMs(1000), + }, }) defer runner.Cleanup() @@ -150,7 +170,7 @@ func TestRPC(t *testing.T) { } // Run tests with RPC-specific tags - exclude connection/event issues we won't tackle - tags := "@rpc && ~@unixsocket && ~@targetURI && ~@sync && ~@metadata && ~@grace && ~@events && ~@customCert && ~@reconnect && ~@caching && ~@forbidden" + tags := "@rpc && ~@unixsocket && ~@targetURI && ~@sync && ~@metadata && ~@grace && ~@events && ~@customCert && ~@reconnect && ~@caching && ~@forbidden && ~@fractional-v1 && ~@deprecated" if err := runner.RunGherkinTestsWithSubtests(t, featurePaths, tags); err != nil { t.Fatalf("Gherkin tests failed: %v", err) @@ -158,13 +178,19 @@ func TestRPC(t *testing.T) { } func TestInProcess(t *testing.T) { - // Setup testbed runner for RPC provider + + // Setup testbed runner for InProcess provider runner := testframework.NewTestbedRunner(testframework.TestbedConfig{ ResolverType: testframework.InProcess, TestbedConfig: "default", // Use default testbed configuration TestbedDir: "../../test-harness", Image: "local-testbed-image", Tag: getGitCommitNative(), + // needed to speed up reconnection to make reconnection tests faster + ExtraOptions: []flagd.ProviderOption{ + flagd.WithRetryBackoffMs(100), + flagd.WithRetryBackoffMaxMs(1000), + }, }) defer runner.Cleanup() @@ -174,7 +200,7 @@ func TestInProcess(t *testing.T) { } // Run tests with InProcess-specific tags - tags := "@in-process && ~@unixsocket&& ~@metadata && ~@contextEnrichment && ~@customCert && ~@forbidden && ~@sync-port && ~@sync-payload" + tags := "@in-process && ~@unixsocket&& ~@metadata && ~@contextEnrichment && ~@customCert && ~@forbidden && ~@sync-port && ~@sync-payload && ~@fractional-v2 && ~@fractional-nested && ~@deprecated" if err := runner.RunGherkinTestsWithSubtests(t, featurePaths, tags); err != nil { t.Fatalf("Gherkin tests failed: %v", err) From b4fc89c758a7083513f4fe0a187f1b7ac5c0a2d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:22:43 -0400 Subject: [PATCH 57/97] chore: release main (#1921) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.15.0 ## [0.15.0](https://github.com/open-feature/flagd/compare/flagd/v0.14.5...flagd/v0.15.0) (2026-04-01) ### ⚠ BREAKING CHANGES * fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) * no breaking API changes - but fractional pseudorandom assignments will change; update all providers to ensure consistency ### ✨ New Features * fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) ([7190878](https://github.com/open-feature/flagd/commit/7190878fd0ea7a6f16fd8fbcdac68b55d9b9a2a5))
core: 0.15.0 ## [0.15.0](https://github.com/open-feature/flagd/compare/core/v0.14.3...core/v0.15.0) (2026-04-01) ### ⚠ BREAKING CHANGES * fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) ### ✨ New Features * fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) ([7190878](https://github.com/open-feature/flagd/commit/7190878fd0ea7a6f16fd8fbcdac68b55d9b9a2a5))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Todd Baert Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- .release-please-manifest.json | 4 ++-- core/CHANGELOG.md | 11 +++++++++++ flagd/CHANGELOG.md | 12 ++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d6e3f4143..3a84ba67c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.14.5", + "flagd": "0.15.0", "flagd-proxy": "0.9.2", - "core": "0.14.3" + "core": "0.15.0" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 8154a91eb..eff5aa2f0 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.15.0](https://github.com/open-feature/flagd/compare/core/v0.14.3...core/v0.15.0) (2026-04-01) + + +### ⚠ BREAKING CHANGES + +* fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) + +### ✨ New Features + +* fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) ([7190878](https://github.com/open-feature/flagd/commit/7190878fd0ea7a6f16fd8fbcdac68b55d9b9a2a5)) + ## [0.14.3](https://github.com/open-feature/flagd/compare/core/v0.14.2...core/v0.14.3) (2026-03-27) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 83157f6bb..29d20cd4f 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [0.15.0](https://github.com/open-feature/flagd/compare/flagd/v0.14.5...flagd/v0.15.0) (2026-04-01) + + +### ⚠ BREAKING CHANGES + +* fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) + * no breaking API changes - but fractional pseudorandom assignments will change; update all providers to ensure consistency + +### ✨ New Features + +* fractional bucketing improvements ([#1909](https://github.com/open-feature/flagd/issues/1909)) ([7190878](https://github.com/open-feature/flagd/commit/7190878fd0ea7a6f16fd8fbcdac68b55d9b9a2a5)) + ## [0.14.5](https://github.com/open-feature/flagd/compare/flagd/v0.14.4...flagd/v0.14.5) (2026-03-27) From 80d805da8efa93324ec80f5e4ce74ad0dbff6500 Mon Sep 17 00:00:00 2001 From: Matt Van Horn Date: Mon, 6 Apr 2026 09:37:22 -0700 Subject: [PATCH 58/97] docs: document custom OTel resource attributes configuration (#1910) authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> --- docs/reference/monitoring.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/reference/monitoring.md b/docs/reference/monitoring.md index 0808259af..af897f42b 100644 --- a/docs/reference/monitoring.md +++ b/docs/reference/monitoring.md @@ -81,6 +81,30 @@ flag `metrics-exporter` to be `otel` and a valid `otel-collector-uri`. For examp `flagd start --uri file:/flags.json --metrics-exporter otel --otel-collector-uri localhost:4317` +### Custom resource attributes + +To attach custom resource attributes (e.g., environment name, deployment region) to flagd's exported telemetry, set the `OTEL_RESOURCE_ATTRIBUTES` environment variable before starting flagd: + +```sh +export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=staging,service.version=1.2.3" +export OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 +flagd start --uri file:/flags.json --metrics-exporter otel +``` + +These attributes follow the [OpenTelemetry resource semantic conventions](https://opentelemetry.io/docs/specs/semconv/resource/) and are attached to all exported metrics and traces. + +> **Tip:** If you're setting resource attributes for environment identification, you may also want to configure [static context values (`-X`)](../reference/flag-definitions.md#static-context--x-flag) so these same dimensions are available for flag targeting. + +To expose resource attributes as metric labels in Prometheus, enable `resource_to_telemetry_conversion` in your OpenTelemetry Collector exporter config: + +```yaml +exporters: + prometheus: + endpoint: "0.0.0.0:8889" + resource_to_telemetry_conversion: + enabled: true +``` + ### Configure local collector setup To configure a local collector setup along with Jaeger and Prometheus, you can use following sample docker-compose From cf22a110652af6f3ef867c17b9c6ea9471c9e5f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 20:27:22 +0000 Subject: [PATCH 59/97] fix(security): update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] (#1929) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [github.com/go-jose/go-jose/v4](https://redirect.github.com/go-jose/go-jose) | `v4.1.3` → `v4.1.4` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgo-jose%2fgo-jose%2fv4/v4.1.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgo-jose%2fgo-jose%2fv4/v4.1.3/v4.1.4?slim=true) | ### GitHub Vulnerability Alerts #### [CVE-2026-34986](https://redirect.github.com/go-jose/go-jose/security/advisories/GHSA-78h2-9frx-2jm8) ### Impact Decrypting a JSON Web Encryption (JWE) object will panic if the `alg` field indicates a key wrapping algorithm ([one ending in `KW`](https://pkg.go.dev/github.com/go-jose/go-jose/v4#pkg-constants), with the exception of `A128GCMKW`, `A192GCMKW`, and `A256GCMKW`) and the `encrypted_key` field is empty. The panic happens when `cipher.KeyUnwrap()` in `key_wrap.go` attempts to allocate a slice with a zero or negative length based on the length of the `encrypted_key`. This code path is reachable from `ParseEncrypted()` / `ParseEncryptedJSON()` / `ParseEncryptedCompact()` followed by `Decrypt()` on the resulting object. Note that the parse functions take a list of accepted key algorithms. If the accepted key algorithms do not include any key wrapping algorithms, parsing will fail and the application will be unaffected. This panic is also reachable by calling `cipher.KeyUnwrap()` directly with any `ciphertext` parameter less than 16 bytes long, but calling this function directly is less common. Panics can lead to denial of service. ### Fixed In 4.1.4 and v3.0.5 ### Workarounds If the list of `keyAlgorithms` passed to `ParseEncrypted()` / `ParseEncryptedJSON()` / `ParseEncryptedCompact()` does not include key wrapping algorithms (those ending in `KW`), your application is unaffected. If your application uses key wrapping, you can prevalidate to the JWE objects to ensure the `encrypted_key` field is nonempty. If your application accepts JWE Compact Serialization, apply that validation to the corresponding field of that serialization (the data between the first and second `.`). ### Thanks Go JOSE thanks Datadog's Security team for finding this issue. --- ### Release Notes
go-jose/go-jose (github.com/go-jose/go-jose/v4) ### [`v4.1.4`](https://redirect.github.com/go-jose/go-jose/releases/tag/v4.1.4) [Compare Source](https://redirect.github.com/go-jose/go-jose/compare/v4.1.3...v4.1.4) #### What's Changed Fixes Panic in JWE decryption. See **Full Changelog**:
--- ### Configuration 📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/open-feature/flagd). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/go.mod | 2 +- core/go.sum | 2 ++ flagd-proxy/go.mod | 2 +- flagd-proxy/go.sum | 2 ++ flagd/go.mod | 2 +- flagd/go.sum | 4 ++++ 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/go.mod b/core/go.mod index 2341902c3..45fb037e2 100644 --- a/core/go.mod +++ b/core/go.mod @@ -92,7 +92,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect diff --git a/core/go.sum b/core/go.sum index 50049bd15..c95c388fe 100644 --- a/core/go.sum +++ b/core/go.sum @@ -147,6 +147,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= diff --git a/flagd-proxy/go.mod b/flagd-proxy/go.mod index 3125c912e..2bf7ed87d 100644 --- a/flagd-proxy/go.mod +++ b/flagd-proxy/go.mod @@ -72,7 +72,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect diff --git a/flagd-proxy/go.sum b/flagd-proxy/go.sum index d53025db8..216b46904 100644 --- a/flagd-proxy/go.sum +++ b/flagd-proxy/go.sum @@ -153,6 +153,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= diff --git a/flagd/go.mod b/flagd/go.mod index 218fb53a1..bf7333484 100644 --- a/flagd/go.mod +++ b/flagd/go.mod @@ -88,7 +88,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect diff --git a/flagd/go.sum b/flagd/go.sum index f1f8cc93b..91b22cea1 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -130,6 +130,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1vfDaOVsaipH4= github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0 h1:ZYx6tM8+1NRo0RwFpBmVxtmJnXs/f3rtIZo9t9dCk3Y= +github.com/diegoholiveira/jsonlogic/v3 v3.9.0/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= github.com/dimiro1/banner v1.1.0/go.mod h1:tbL318TJiUaHxOUNN+jnlvFSgsh/RX7iJaQrGgOiTco= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= @@ -166,6 +168,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= From 0271068ec71b02a2c9ab6afda44193cc2a66a815 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 7 Apr 2026 10:18:14 -0400 Subject: [PATCH 60/97] fix: zombie process on metrics server fail (#1926) Fixes an issue where a failure of the metrics server to start can cause a zombie process. This is hard and relatively low value to test with unit tests, but I was able to easily reproduce it with this simple script: ```sh #!/bin/bash cd flagd && go build -o flagd . # --port and --sync-port both set to 8015; flagd should exit due to the conflict ./flagd start --port 8015 --sync-port 8015 --uri file:../config/samples/example_flags.flagd.json & PID=$! sleep 5 if ps -p $PID > /dev/null 2>&1; then echo "OH NO, BUG! Process is still alive despite port conflict." kill -9 $PID exit 1 fi echo "NO BUG" ``` After the simple context handling, the script confirms the bug is fixed. Fixes: https://github.com/open-feature/flagd/issues/1807 --------- Signed-off-by: Todd Baert --- .../flag-evaluation/connect_service.go | 86 ++++++++----------- 1 file changed, 35 insertions(+), 51 deletions(-) diff --git a/flagd/pkg/service/flag-evaluation/connect_service.go b/flagd/pkg/service/flag-evaluation/connect_service.go index 2191a70f7..d0cc822d0 100644 --- a/flagd/pkg/service/flag-evaluation/connect_service.go +++ b/flagd/pkg/service/flag-evaluation/connect_service.go @@ -69,9 +69,6 @@ type ConnectService struct { server *http.Server metricsServer *http.Server - serverMtx sync.RWMutex - metricsServerMtx sync.RWMutex - readinessEnabled bool } @@ -102,32 +99,10 @@ func (s *ConnectService) Serve(ctx context.Context, svcConf service.Configuratio s.readinessEnabled = true g.Go(func() error { - return s.startServer(svcConf) + return s.startServer(gCtx, svcConf) }) g.Go(func() error { - return s.startMetricsServer(svcConf) - }) - g.Go(func() error { - <-gCtx.Done() - s.serverMtx.RLock() - defer s.serverMtx.RUnlock() - if s.server != nil { - if err := s.server.Shutdown(gCtx); err != nil { - return fmt.Errorf("error returned from flag evaluation server shutdown: %w", err) - } - } - return nil - }) - g.Go(func() error { - <-gCtx.Done() - s.metricsServerMtx.RLock() - defer s.metricsServerMtx.RUnlock() - if s.metricsServer != nil { - if err := s.metricsServer.Shutdown(gCtx); err != nil { - return fmt.Errorf("error returned from metrics server shutdown: %w", err) - } - } - return nil + return s.startMetricsServer(gCtx, svcConf) }) if err := g.Wait(); err != nil { return fmt.Errorf("errgroup closed with error: %w", err) @@ -210,13 +185,11 @@ func (s *ConnectService) setupServer(svcConf service.Configuration) (net.Listene svcHandler = http.MaxBytesHandler(svcHandler, svcConf.MaxRequestBodyBytes) } - s.serverMtx.Lock() s.server = &http.Server{ ReadHeaderTimeout: time.Second, Handler: svcHandler, MaxHeaderBytes: int(svcConf.MaxRequestHeaderBytes), } - s.serverMtx.Unlock() // Add middlewares metricsMiddleware := metricsmw.NewHTTPMetric(metricsmw.Config{ @@ -251,31 +224,47 @@ func (s *ConnectService) Shutdown() { }) } -func (s *ConnectService) startServer(svcConf service.Configuration) error { +func serveWithShutdown(ctx context.Context, server *http.Server, serveFn func() error) error { + errChan := make(chan error, 1) + go func() { errChan <- serveFn() }() + + select { + case err := <-errChan: + if err != nil && !errors.Is(err, http.ErrServerClosed) { + return err + } + return nil + case <-ctx.Done(): + // use a fresh context; ctx is already cancelled + shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := server.Shutdown(shutdownCtx); err != nil { + return fmt.Errorf("error shutting down server: %w", err) + } + // wait for server to fully stop + <-errChan + return nil + } +} + +func (s *ConnectService) startServer(ctx context.Context, svcConf service.Configuration) error { lis, err := s.setupServer(svcConf) if err != nil { return err } s.logger.Info(fmt.Sprintf("Flag IResolver listening at %s", lis.Addr())) + if svcConf.CertPath != "" && svcConf.KeyPath != "" { - if err := s.server.ServeTLS( - lis, - svcConf.CertPath, - svcConf.KeyPath, - ); err != nil && !errors.Is(err, http.ErrServerClosed) { - return fmt.Errorf("error returned from flag evaluation server: %w", err) - } - } else { - if err := s.server.Serve( - lis, - ); err != nil && !errors.Is(err, http.ErrServerClosed) { - return fmt.Errorf("error returned from flag evaluation server: %w", err) - } + return serveWithShutdown(ctx, s.server, func() error { + return s.server.ServeTLS(lis, svcConf.CertPath, svcConf.KeyPath) + }) } - return nil + return serveWithShutdown(ctx, s.server, func() error { + return s.server.Serve(lis) + }) } -func (s *ConnectService) startMetricsServer(svcConf service.Configuration) error { +func (s *ConnectService) startMetricsServer(ctx context.Context, svcConf service.Configuration) error { s.logger.Info(fmt.Sprintf("metrics and probes listening at %d", svcConf.ManagementPort)) srv := grpc.NewServer() @@ -304,16 +293,11 @@ func (s *ConnectService) startMetricsServer(svcConf service.Configuration) error } }) - s.metricsServerMtx.Lock() s.metricsServer = &http.Server{ Addr: fmt.Sprintf(":%d", svcConf.ManagementPort), ReadHeaderTimeout: 3 * time.Second, Handler: h2c.NewHandler(handler, &http2.Server{}), // we need to use h2c to support plaintext HTTP2 } - s.metricsServerMtx.Unlock() - if err := s.metricsServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - return fmt.Errorf("error returned from metrics server: %w", err) - } - return nil + return serveWithShutdown(ctx, s.metricsServer, s.metricsServer.ListenAndServe) } From 17f833ea53341bce4e85250a089f237a0c002fb9 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 7 Apr 2026 11:26:21 -0400 Subject: [PATCH 61/97] fix: object flags without `defaultVaraint` dont default in RPC (#1925) `objectResponseV2` was missing the `SetReasonOnly` method, unlike all other V2 response types. I added an assertion to prevent regressions. thanks @asppsa for the detailed report! Fixes: https://github.com/open-feature/flagd/issues/1913 --------- Signed-off-by: Todd Baert --- flagd/go.sum | 20 +-- .../flag-evaluation/flag_evaluator_types.go | 22 ++++ .../flag-evaluation/flag_evaluator_v2_test.go | 123 ++++++++++++++++++ 3 files changed, 147 insertions(+), 18 deletions(-) create mode 100644 flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go diff --git a/flagd/go.sum b/flagd/go.sum index 91b22cea1..15f5634d7 100644 --- a/flagd/go.sum +++ b/flagd/go.sum @@ -4,8 +4,6 @@ buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1 buf.build/gen/go/open-feature/flagd/grpc/go v1.6.1-20260217192757-1388a552fc3c.1/go.mod h1:uCFRckBTXlZTJczpxd0j8qhQfLIWT8ds/3PlURS54wI= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1 h1:vzILwV5p1s2kk4FuaaYNqKPSdivPqyaDsjtQi2qSRuc= buf.build/gen/go/open-feature/flagd/protocolbuffers/go v1.36.11-20260217192757-1388a552fc3c.1/go.mod h1:itSRQViN+Mq9URSJbXJRlAT9irP54/x5n5sHn9NTKrU= -cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= -cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -113,8 +111,6 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= -github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -128,8 +124,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4 h1:IVVU/VLz2hn10ImbmibjiUkdVsSFIB1vfDaOVsaipH4= -github.com/diegoholiveira/jsonlogic/v3 v3.8.4/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/diegoholiveira/jsonlogic/v3 v3.9.0 h1:ZYx6tM8+1NRo0RwFpBmVxtmJnXs/f3rtIZo9t9dCk3Y= github.com/diegoholiveira/jsonlogic/v3 v3.9.0/go.mod h1:OYRb6FSTVmMM+MNQ7ElmMsczyNSepw+OU4Z8emDSi4w= github.com/dimiro1/banner v1.1.0 h1:TSfy+FsPIIGLzaMPOt52KrEed/omwFO1P15VA8PMUh0= @@ -141,17 +135,13 @@ github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329 h1:K+fnvUM0VZ7ZFJf0n4L/BRlnsb9pL/GuDG6FqaH+PwM= -github.com/envoyproxy/go-control-plane v0.13.5-0.20251024222203-75eaa193e329/go.mod h1:Alz8LEClvR7xKsrq3qzoc4N0guvVNSS8KmSChGYr9hs= -github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo= -github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= -github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= @@ -166,8 +156,6 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= -github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -390,8 +378,6 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0 h1:/Rij/t18Y7rUayNg7Id6rPrEnHgorxYabm2E6wUdPP4= go.opentelemetry.io/contrib/bridges/prometheus v0.63.0/go.mod h1:AdyDPn6pkbkt2w01n3BubRVk7xAsCRq1Yg1mpfyA/0E= -go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs= -go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= go.opentelemetry.io/contrib/exporters/autoexport v0.63.0 h1:NLnZybb9KkfMXPwZhd5diBYJoVxiO9Qa06dacEA7ySY= @@ -582,8 +568,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= -google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go index 3ba99393b..11a437c38 100644 --- a/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_types.go @@ -180,6 +180,15 @@ type responseV2[T constraints] interface { SetReasonOnly(reason string, metadata map[string]interface{}) error } +// compile-time interface satisfaction checks +var ( + _ responseV2[bool] = (*booleanResponseV2)(nil) + _ responseV2[string] = (*stringResponseV2)(nil) + _ responseV2[float64] = (*floatResponseV2)(nil) + _ responseV2[int64] = (*intResponseV2)(nil) + _ responseV2[map[string]any] = (*objectResponseV2)(nil) +) + type booleanResponseV2 struct { evalV2Resp *connect.Response[evalV2.ResolveBooleanResponse] } @@ -352,3 +361,16 @@ func (r *objectResponseV2) SetResult(value map[string]any, variant, reason strin } return nil } + +func (r *objectResponseV2) SetReasonOnly(reason string, metadata map[string]interface{}) error { + newStruct, err := structpb.NewStruct(metadata) + if err != nil { + return fmt.Errorf("failure to wrap metadata %w", err) + } + if r.evalV2Resp != nil { + // Leave Value and Variant as nil (unset) + r.evalV2Resp.Msg.Reason = reason + r.evalV2Resp.Msg.Metadata = newStruct + } + return nil +} diff --git a/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go new file mode 100644 index 000000000..c64699a62 --- /dev/null +++ b/flagd/pkg/service/flag-evaluation/flag_evaluator_v2_test.go @@ -0,0 +1,123 @@ +package service + +import ( + "context" + "testing" + + evalV2 "buf.build/gen/go/open-feature/flagd/protocolbuffers/go/flagd/evaluation/v2" + "connectrpc.com/connect" + mock "github.com/open-feature/flagd/core/pkg/evaluator/mock" + "github.com/open-feature/flagd/core/pkg/logger" + "github.com/open-feature/flagd/core/pkg/model" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.uber.org/mock/gomock" + "google.golang.org/protobuf/types/known/structpb" +) + +// fallbackResult captures the fields we care about from any resolve response. +type fallbackResult struct { + value any + variant *string + reason string + metadata *structpb.Struct +} + +// TestFlagEvaluationServiceV2_Fallback tests that the V2 service correctly +// handles the fallback case (null targeting + no defaultVariant) for all flag +// types. Each response type's SetReasonOnly method must set reason to DEFAULT +// with nil value and variant, signaling the provider to use the code default. +// note: V2 signals fallback via SetReasonOnly (V1 uses an error instead); +// other V2 behaviors are covered in flag_evaluator_v1_test.go. +func TestFlagEvaluationServiceV2_Fallback(t *testing.T) { + tests := []struct { + name string + // run sets up the mock, calls the service, and returns the common response fields + run func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) + }{ + { + name: "boolean", + run: func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) { + eval.EXPECT().ResolveBooleanValue(gomock.Any(), gomock.Any(), "flag", gomock.Any()).Return( + false, "", model.FallbackReason, metadata, nil, + ) + got, err := s.ResolveBoolean(context.Background(), connect.NewRequest(&evalV2.ResolveBooleanRequest{ + FlagKey: "flag", Context: &structpb.Struct{}, + })) + return fallbackResult{got.Msg.Value, got.Msg.Variant, got.Msg.Reason, got.Msg.Metadata}, err + }, + }, + { + name: "string", + run: func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) { + eval.EXPECT().ResolveStringValue(gomock.Any(), gomock.Any(), "flag", gomock.Any()).Return( + "", "", model.FallbackReason, metadata, nil, + ) + got, err := s.ResolveString(context.Background(), connect.NewRequest(&evalV2.ResolveStringRequest{ + FlagKey: "flag", Context: &structpb.Struct{}, + })) + return fallbackResult{got.Msg.Value, got.Msg.Variant, got.Msg.Reason, got.Msg.Metadata}, err + }, + }, + { + name: "int", + run: func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) { + eval.EXPECT().ResolveIntValue(gomock.Any(), gomock.Any(), "flag", gomock.Any()).Return( + int64(0), "", model.FallbackReason, metadata, nil, + ) + got, err := s.ResolveInt(context.Background(), connect.NewRequest(&evalV2.ResolveIntRequest{ + FlagKey: "flag", Context: &structpb.Struct{}, + })) + return fallbackResult{got.Msg.Value, got.Msg.Variant, got.Msg.Reason, got.Msg.Metadata}, err + }, + }, + { + name: "float", + run: func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) { + eval.EXPECT().ResolveFloatValue(gomock.Any(), gomock.Any(), "flag", gomock.Any()).Return( + float64(0), "", model.FallbackReason, metadata, nil, + ) + got, err := s.ResolveFloat(context.Background(), connect.NewRequest(&evalV2.ResolveFloatRequest{ + FlagKey: "flag", Context: &structpb.Struct{}, + })) + return fallbackResult{got.Msg.Value, got.Msg.Variant, got.Msg.Reason, got.Msg.Metadata}, err + }, + }, + { + name: "object", + run: func(eval *mock.MockIEvaluator, s *FlagEvaluationServiceV2) (fallbackResult, error) { + eval.EXPECT().ResolveObjectValue(gomock.Any(), gomock.Any(), "flag", gomock.Any()).Return( + nil, "", model.FallbackReason, metadata, nil, + ) + got, err := s.ResolveObject(context.Background(), connect.NewRequest(&evalV2.ResolveObjectRequest{ + FlagKey: "flag", Context: &structpb.Struct{}, + })) + return fallbackResult{got.Msg.Value, got.Msg.Variant, got.Msg.Reason, got.Msg.Metadata}, err + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + eval := mock.NewMockIEvaluator(ctrl) + metrics, exp := getMetricReader() + s := NewFlagEvaluationServiceV2( + logger.NewLogger(nil, false), eval, &eventingConfiguration{}, + metrics, nil, nil, 0, + ) + + result, err := tt.run(eval, s) + + require.NoError(t, err) + require.Nil(t, result.value, "value should be nil so the provider falls back to the code default") + require.Nil(t, result.variant, "variant should be nil") + require.Equal(t, model.DefaultReason, result.reason) + require.Equal(t, responseStruct, result.metadata) + + var data metricdata.ResourceMetrics + require.NoError(t, exp.Collect(context.TODO(), &data)) + require.Equal(t, 1, len(data.ScopeMetrics)) + }) + } +} From 176866e71625bee9ef7770700d8ce14e8abd8110 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 7 Apr 2026 13:26:22 -0400 Subject: [PATCH 62/97] fix: mem leak due to unbounded metrics cardinality (#1931) Fixes a memory leak that can be seen with many remote clients due to default OTel metrics attributes included remote peer and ephemeral port. See: https://github.com/connectrpc/otelconnect-go?tab=readme-ov-file#reducing-metrics-and-tracing-cardinality I tested this with this integration test (I can see the memory leak and confirmed this fixes it).
```go package service import ( "bytes" "context" "fmt" "net/http" "runtime" "testing" "time" mock "github.com/open-feature/flagd/core/pkg/evaluator/mock" "github.com/open-feature/flagd/core/pkg/logger" "github.com/open-feature/flagd/core/pkg/model" iservice "github.com/open-feature/flagd/core/pkg/service" "github.com/open-feature/flagd/core/pkg/telemetry" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" "go.uber.org/mock/gomock" ) // TestMemoryGrowthFromPeerAttributes is a long-running test that demonstrates // unbounded memory growth when otelconnect records net.peer.port in metrics. // // Run with: go test -v -run TestMemoryGrowthFromPeerAttributes -timeout=120s ./flagd/pkg/service/flag-evaluation/ func TestMemoryGrowthFromPeerAttributes(t *testing.T) { if testing.Short() { t.Skip("skipping long-running memory test in short mode") } const ( port = 18490 batchSize = 500 batches = 20 resolveURL = "http://localhost:%d/flagd.evaluation.v1.Service/ResolveBoolean" ) ctrl := gomock.NewController(t) eval := mock.NewMockIEvaluator(ctrl) eval.EXPECT().ResolveBooleanValue(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return( true, "on", model.DefaultReason, map[string]interface{}{}, nil, ).AnyTimes() reader := metric.NewManualReader() rs := resource.NewWithAttributes("testSchema") metricRecorder := telemetry.NewOTelRecorder(reader, rs, "memory-test") options, err := telemetry.BuildConnectOptions(telemetry.Config{}) require.NoError(t, err) svc := NewConnectService(logger.NewLogger(nil, false), eval, nil, metricRecorder) ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) go func() { _ = svc.Serve(ctx, iservice.Configuration{ ReadinessProbe: func() bool { return true }, Port: port, Options: options, }) }() url := fmt.Sprintf(resolveURL, port) require.Eventually(t, func() bool { resp, err := http.Get(fmt.Sprintf("http://localhost:%d/flagd.evaluation.v1.Service/ResolveAll", port)) if err == nil && resp != nil { resp.Body.Close() } return err == nil && resp != nil }, 3*time.Second, 100*time.Millisecond) body := []byte(`{"flagKey":"testFlag"}`) // baseline runtime.GC() var baseline runtime.MemStats runtime.ReadMemStats(&baseline) t.Logf("") t.Logf("%-10s %-12s %-12s %-12s", "Requests", "HeapInuse", "HeapAlloc", "Delta") t.Logf("%-10s %-12s %-12s %-12s", "--------", "---------", "---------", "-----") totalRequests := 0 for batch := 0; batch < batches; batch++ { for i := 0; i < batchSize; i++ { client := &http.Client{ Transport: &http.Transport{ DisableKeepAlives: true, }, } req, _ := http.NewRequest(http.MethodPost, url, bytes.NewReader(body)) req.Header.Set("Content-Type", "application/json") resp, err := client.Do(req) if err == nil { resp.Body.Close() } } totalRequests += batchSize runtime.GC() var m runtime.MemStats runtime.ReadMemStats(&m) delta := int64(m.HeapInuse) - int64(baseline.HeapInuse) t.Logf("%-10d %-12s %-12s %+.1f MB", totalRequests, formatMB(m.HeapInuse), formatMB(m.HeapAlloc), float64(delta)/1024/1024, ) } // final summary runtime.GC() var final runtime.MemStats runtime.ReadMemStats(&final) totalDelta := float64(int64(final.HeapInuse)-int64(baseline.HeapInuse)) / 1024 / 1024 t.Logf("") t.Logf("Total: %d requests, heap grew by %.1f MB", totalRequests, totalDelta) if totalDelta > 10 { t.Logf("WARNING: heap grew by %.1f MB; this indicates unbounded cardinality growth", totalDelta) } else { t.Logf("Heap growth is bounded (%.1f MB); cardinality is under control", totalDelta) } } func formatMB(b uint64) string { return fmt.Sprintf("%.1f MB", float64(b)/1024/1024) } ```
--------- Signed-off-by: Todd Baert --- core/pkg/telemetry/builder.go | 6 +++++- core/pkg/telemetry/metrics.go | 14 +++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/pkg/telemetry/builder.go b/core/pkg/telemetry/builder.go index 7be2736af..5b891d137 100644 --- a/core/pkg/telemetry/builder.go +++ b/core/pkg/telemetry/builder.go @@ -108,7 +108,11 @@ func BuildConnectOptions(_ Config) ([]connect.HandlerOption, error) { options := []connect.HandlerOption{} // Always add interceptor - autoexport will handle whether traces are enabled - interceptor, err := otelconnect.NewInterceptor(otelconnect.WithTrustRemote()) + interceptor, err := otelconnect.NewInterceptor( + otelconnect.WithTrustRemote(), + // this option prevents a cardinality explosion in OTel due to remote peer and ephemeral port attributes + otelconnect.WithoutServerPeerAttributes(), + ) if err != nil { return nil, fmt.Errorf("error creating interceptor, %w", err) } diff --git a/core/pkg/telemetry/metrics.go b/core/pkg/telemetry/metrics.go index 8fc1b3e53..a4725f80a 100644 --- a/core/pkg/telemetry/metrics.go +++ b/core/pkg/telemetry/metrics.go @@ -15,8 +15,8 @@ import ( ) const ( - ProviderName = "flagd" - featureFlagPrefix = "feature_flag." + ProviderName = "flagd" + featureFlagPrefix = "feature_flag." FeatureFlagReasonKey = attribute.Key("feature_flag.reason") ExceptionTypeKey = attribute.Key("ExceptionTypeKeyName") @@ -181,9 +181,8 @@ func ExceptionType(val string) attribute.KeyValue { return ExceptionTypeKey.String(val) } -// NewOTelRecorder creates a MetricsRecorder based on the provided metric.Reader. Note that, metric.NewMeterProvider is -// created here but not registered globally as this is the only place we derive a metric.Meter. Consider global provider -// registration if we need more meters +// NewOTelRecorder creates a MetricsRecorder based on the provided metric.Reader. The MeterProvider created here is +// registered globally so that otelgrpc, otelhttp, and otelconnect instrumentation libraries can use it. func NewOTelRecorder(exporter msdk.Reader, resource *resource.Resource, serviceName string) *MetricsRecorder { // create a metric provider with custom bucket size for histograms provider := msdk.NewMeterProvider( @@ -196,6 +195,11 @@ func NewOTelRecorder(exporter msdk.Reader, resource *resource.Resource, serviceN msdk.WithView(getDurationView(serviceName, syncStreamDurationMetric, []float64{30, 60, 120, 300, 480, 600, 1200, 1800, 3600, 10800})), // set entity producing telemetry msdk.WithResource(resource), + // limit metric attribute cardinality to prevent unbounded memory growth from + // high-cardinality attributes (OTel spec recommends 2000, Go SDK defaults to unlimited) + // 2000 is recommended by OTel spec and is a reasonable default for our use case, + // but can be overridden with the OTEL_GO_X_CARDINALITY_LIMIT environment variable + msdk.WithCardinalityLimit(2000), ) // Set as global MeterProvider so otelgrpc and other instrumentation can use it From a39e81bbd0d632fc9ee8ab77589d1fcd0bf09b75 Mon Sep 17 00:00:00 2001 From: Alexandre Chakroun <11556013+alxckn@users.noreply.github.com> Date: Tue, 7 Apr 2026 21:52:41 +0200 Subject: [PATCH 63/97] docs: Reorganize metrics documentation and add gRPC sync metrics docs (#1917) ## This PR - documents metrics added in https://github.com/open-feature/flagd/pull/1861 - reorganizes the documentation about metrics to avoid confusion between available metrics across services exposed by flagd --------- Signed-off-by: Alexandre Chakroun Signed-off-by: Todd Baert Co-authored-by: Todd Baert --- docs/reference/flagd-ofrep.md | 5 +++ docs/reference/grpc-sync-service.md | 5 +++ docs/reference/monitoring.md | 66 +++++++++++++++++++++++------ 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/docs/reference/flagd-ofrep.md b/docs/reference/flagd-ofrep.md index f28ac3b85..77a574e1c 100644 --- a/docs/reference/flagd-ofrep.md +++ b/docs/reference/flagd-ofrep.md @@ -24,3 +24,8 @@ curl -X POST 'http://localhost:8016/ofrep/v1/evaluate/flags' ``` See the [cheat sheet](./cheat-sheet.md#ofrep-api-http) for more OFREP examples including context-sensitive evaluation and selectors. + +## Monitoring + +The OFREP endpoint is instrumented with OpenTelemetry HTTP and flag evaluation metrics. +See the [Monitoring reference](./monitoring.md#http-metrics) for the full list of exposed metrics and their attributes. diff --git a/docs/reference/grpc-sync-service.md b/docs/reference/grpc-sync-service.md index 5303cc991..e0ae3a208 100644 --- a/docs/reference/grpc-sync-service.md +++ b/docs/reference/grpc-sync-service.md @@ -42,3 +42,8 @@ final FlagdProvider flagdProvider = ``` See the [cheat sheet](./cheat-sheet.md#grpc-sync-api-syncproto) for `grpcurl` examples using `FetchAllFlags` and `SyncFlags`. + +## Monitoring + +The gRPC sync service is instrumented with OpenTelemetry metrics for monitoring active connections and stream lifecycles. +See the [Monitoring reference](./monitoring.md#grpc-sync-metrics) for the full list of exposed metrics and their attributes. diff --git a/docs/reference/monitoring.md b/docs/reference/monitoring.md index af897f42b..1567c64c8 100644 --- a/docs/reference/monitoring.md +++ b/docs/reference/monitoring.md @@ -1,5 +1,5 @@ --- -description: monitoring and telemetry flagd and flagd providers +description: monitoring and telemetry for flagd HTTP, gRPC sync, and flagd providers --- # Monitoring @@ -45,26 +45,64 @@ Given below is the current implementation overview of flagd telemetry internals, ## Metrics -flagd exposes the following metrics: +> Please note that metric names may vary based on the consuming monitoring tool naming requirements. +> For example, the transformation of OTLP metrics to Prometheus is described [here](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/compatibility/prometheus_and_openmetrics.md#otlp-metric-points-to-prometheus). + +### HTTP Metrics + +These metrics apply to both the [flag evaluation](./specifications/protos.md) and [OFREP](./flagd-ofrep.md) endpoints. flagd uses the [OpenTelemetry Semantic Conventions for HTTP](https://opentelemetry.io/docs/specs/semconv/http/http-metrics/): + +- `http.server.request.duration` - Measures the duration of inbound HTTP requests (seconds). Histogram buckets: 5ms, 10ms, 25ms, 50ms, 75ms, 100ms, 250ms, 500ms, 750ms, 1s, 2.5s, 5s, 7.5s, 10s. +- `http.server.request.body.size` - Measures the size of HTTP request messages (bytes) +- `http.server.response.body.size` - Measures the size of HTTP response messages (bytes) + +For the full list of attributes on these metrics, see the [OpenTelemetry HTTP Server Metrics](https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#http-server) semantic conventions. + +### Flag Evaluation Metrics + +These metrics are recorded on every [flag evaluation](./specifications/protos.md), regardless of transport (HTTP, gRPC, connect). Attribute names are inspired by the [OpenTelemetry Semantic Conventions for Feature Flags](https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-events/): -- `http.server.request.duration` - Measures the duration of inbound HTTP requests -- `http.server.response.body.size` - Measures the size of HTTP response messages -- `http.server.active_requests` - Measures the number of concurrent HTTP requests that are currently in-flight - `feature_flag.flagd.impression` - Measures the number of evaluations for a given flag - `feature_flag.flagd.result.reason` - Measures the number of evaluations for a given reason -> Please note that metric names may vary based on the consuming monitoring tool naming requirements. -> For example, the transformation of OTLP metrics to Prometheus is described [here](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/compatibility/prometheus_and_openmetrics.md#otlp-metric-points-to-prometheus). +**Attributes:** + +- `feature_flag.key` - The flag key being evaluated +- `feature_flag.result.variant` - The variant returned by the evaluation +- `feature_flag.provider.name` - The feature flag provider name (always `flagd`) +- `feature_flag.reason` - The evaluation reason (e.g. `STATIC`, `TARGETING_MATCH`, `ERROR`) + +### gRPC Sync Metrics + +flagd instruments the [gRPC sync service](./grpc-sync-service.md) with standard RPC metrics and custom sync-specific metrics. + +#### Standard RPC metrics + +flagd uses the [OpenTelemetry Semantic Conventions for RPC](https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc): + +- `rpc.server.duration` - Measures the duration of inbound RPC calls (ms) +- `rpc.server.request.size` - Measures the size of RPC request messages (bytes) +- `rpc.server.response.size` - Measures the size of RPC response messages (bytes) +- `rpc.server.requests_per_rpc` - Measures the number of requests received per RPC +- `rpc.server.responses_per_rpc` - Measures the number of responses sent per RPC + +**Attributes:** + +- `rpc.system` - The RPC system (always `grpc`) +- `rpc.service` - The fully-qualified RPC service name (e.g. `flagd.sync.v1.FlagSyncService`) +- `rpc.method` - The RPC method name (e.g. `SyncFlags`, `FetchAllFlags`) +- `rpc.grpc.status_code` - The gRPC status code (e.g. `OK`, `CANCELLED`, `DEADLINE_EXCEEDED`) + +#### Custom sync metrics -### HTTP Metric Attributes +- `feature_flag.flagd.sync.active_streams` - Measures the number of currently active gRPC sync streaming connections +- `feature_flag.flagd.sync.stream.duration` - Measures the duration of gRPC sync streaming connections (seconds). Histogram buckets: 30s, 1min, 2min, 5min, 8min, 10min, 20min, 30min, 1h, 3h. -flagd uses the following OpenTelemetry Semantic Conventions for HTTP metrics: +**Attributes:** -- `service.name` - The name of the service -- `http.route` - The matched route (path template) -- `http.request.method` - The HTTP request method (GET, POST, etc.) -- `http.response.status_code` - The HTTP response status code -- `url.scheme` - The URI scheme (http or https) +- `selector` - The selector expression used by the sync stream, when specified in the request +- `provider_id` - The provider ID of the connecting client, when specified in the request +- `reason` - Stream exit reason: `normal_close`, `deadline_exceeded`, `client_disconnect`, or `error` (on `stream.duration` only) ## Traces From 18ad1db202aa5e623b99d53c5f1cc690d151e78c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:08:23 -0400 Subject: [PATCH 64/97] chore: release main (#1930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: I have created a release *beep* *boop* ---
flagd: 0.15.1 ## [0.15.1](https://github.com/open-feature/flagd/compare/flagd/v0.15.0...flagd/v0.15.1) (2026-04-07) ### 🐛 Bug Fixes * object flags without `defaultVaraint` dont default in RPC ([#1925](https://github.com/open-feature/flagd/issues/1925)) ([17f833e](https://github.com/open-feature/flagd/commit/17f833ea53341bce4e85250a089f237a0c002fb9)) * **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1)) * zombie process on metrics server fail ([#1926](https://github.com/open-feature/flagd/issues/1926)) ([0271068](https://github.com/open-feature/flagd/commit/0271068ec71b02a2c9ab6afda44193cc2a66a815)) * mem leak due to unbounded metrics cardinality ([#1931](https://github.com/open-feature/flagd/issues/1931)) ([176866e](https://github.com/open-feature/flagd/commit/176866e71625bee9ef7770700d8ce14e8abd8110))
flagd-proxy: 0.9.3 ## [0.9.3](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.2...flagd-proxy/v0.9.3) (2026-04-07) ### 🐛 Bug Fixes * **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1))
core: 0.15.1 ## [0.15.1](https://github.com/open-feature/flagd/compare/core/v0.15.0...core/v0.15.1) (2026-04-07) ### 🐛 Bug Fixes * mem leak due to unbounded metrics cardinality ([#1931](https://github.com/open-feature/flagd/issues/1931)) ([176866e](https://github.com/open-feature/flagd/commit/176866e71625bee9ef7770700d8ce14e8abd8110)) * **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1))
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Signed-off-by: Todd Baert Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Todd Baert --- .release-please-manifest.json | 6 +++--- core/CHANGELOG.md | 8 ++++++++ flagd-proxy/CHANGELOG.md | 7 +++++++ flagd/CHANGELOG.md | 10 ++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3a84ba67c..867b51fd8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "flagd": "0.15.0", - "flagd-proxy": "0.9.2", - "core": "0.15.0" + "flagd": "0.15.1", + "flagd-proxy": "0.9.3", + "core": "0.15.1" } \ No newline at end of file diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index eff5aa2f0..6f521c67b 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.15.1](https://github.com/open-feature/flagd/compare/core/v0.15.0...core/v0.15.1) (2026-04-07) + + +### 🐛 Bug Fixes + +* mem leak due to unbounded metrics cardinality ([#1931](https://github.com/open-feature/flagd/issues/1931)) ([176866e](https://github.com/open-feature/flagd/commit/176866e71625bee9ef7770700d8ce14e8abd8110)) +* **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1)) + ## [0.15.0](https://github.com/open-feature/flagd/compare/core/v0.14.3...core/v0.15.0) (2026-04-01) diff --git a/flagd-proxy/CHANGELOG.md b/flagd-proxy/CHANGELOG.md index 12b723e0a..d32bdff60 100644 --- a/flagd-proxy/CHANGELOG.md +++ b/flagd-proxy/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.9.3](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.2...flagd-proxy/v0.9.3) (2026-04-07) + + +### 🐛 Bug Fixes + +* **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1)) + ## [0.9.2](https://github.com/open-feature/flagd/compare/flagd-proxy/v0.9.1...flagd-proxy/v0.9.2) (2026-03-21) diff --git a/flagd/CHANGELOG.md b/flagd/CHANGELOG.md index 29d20cd4f..ad8ac8d74 100644 --- a/flagd/CHANGELOG.md +++ b/flagd/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [0.15.1](https://github.com/open-feature/flagd/compare/flagd/v0.15.0...flagd/v0.15.1) (2026-04-07) + + +### 🐛 Bug Fixes + +* object flags without `defaultVaraint` dont default in RPC ([#1925](https://github.com/open-feature/flagd/issues/1925)) ([17f833e](https://github.com/open-feature/flagd/commit/17f833ea53341bce4e85250a089f237a0c002fb9)) +* **security:** update module github.com/go-jose/go-jose/v4 to v4.1.4 [security] ([#1929](https://github.com/open-feature/flagd/issues/1929)) ([cf22a11](https://github.com/open-feature/flagd/commit/cf22a110652af6f3ef867c17b9c6ea9471c9e5f1)) +* zombie process on metrics server fail ([#1926](https://github.com/open-feature/flagd/issues/1926)) ([0271068](https://github.com/open-feature/flagd/commit/0271068ec71b02a2c9ab6afda44193cc2a66a815)) +* mem leak due to unbounded metrics cardinality ([#1931](https://github.com/open-feature/flagd/issues/1931)) ([176866e](https://github.com/open-feature/flagd/commit/176866e71625bee9ef7770700d8ce14e8abd8110)) + ## [0.15.0](https://github.com/open-feature/flagd/compare/flagd/v0.14.5...flagd/v0.15.0) (2026-04-01) From cf70d359b6eb63fb0a6fb7634ef442c3f50baa83 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 7 Apr 2026 16:18:41 -0400 Subject: [PATCH 65/97] docs: new fractional features (#1923) * update public facing JSON schema for rules: https://flagd.dev/schema/v0/flags.json, https://flagd.dev/schema/v0/targeting.json * update fractional docs * https://deploy-preview-1923--polite-licorice-3db33c.netlify.app/reference/custom-operations/fractional-operation/#nested-conditional-variants * https://deploy-preview-1923--polite-licorice-3db33c.netlify.app/reference/custom-operations/fractional-operation/#computed-weights-with-jsonlogic * new playground demo * https://deploy-preview-1923--polite-licorice-3db33c.netlify.app/playground/?scenario-name=Gradual+rollout * minor improvements to playground (better button click feedback) and fix bug with sharing scenarios (URL encoding) (NOTE: the schema validation warning here will be fixed once the PR is merged and we publish the schema update mentioned in point 1 above) --------- Signed-off-by: Todd Baert --- docs/playground/playground.js | 90 ++++++------- .../custom-operations/fractional-operation.md | 119 +++++++++++++++++- docs/reference/specifications/protos.md | 8 +- docs/schema/v0/targeting.json | 22 ++-- playground-app/package-lock.json | 60 ++++----- playground-app/package.json | 2 +- playground-app/src/App.tsx | 65 ++++++++-- .../src/scenarios/gradual-rollout.ts | 52 ++++++++ playground-app/src/scenarios/index.ts | 6 +- ...gressive-rollout.ts => stepped-rollout.ts} | 10 +- 10 files changed, 326 insertions(+), 108 deletions(-) create mode 100644 playground-app/src/scenarios/gradual-rollout.ts rename playground-app/src/scenarios/{progressive-rollout.ts => stepped-rollout.ts} (87%) diff --git a/docs/playground/playground.js b/docs/playground/playground.js index 408a03fec..3e957cce1 100644 --- a/docs/playground/playground.js +++ b/docs/playground/playground.js @@ -1,4 +1,4 @@ -(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))f(c);new MutationObserver(c=>{for(const u of c)if(u.type==="childList")for(const l of u.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&f(l)}).observe(document,{childList:!0,subtree:!0});function s(c){const u={};return c.integrity&&(u.integrity=c.integrity),c.referrerPolicy&&(u.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?u.credentials="include":c.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function f(c){if(c.ep)return;c.ep=!0;const u=s(c);fetch(c.href,u)}})();function bc(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var to={exports:{}},Qi={};/** +(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))o(c);new MutationObserver(c=>{for(const l of c)if(l.type==="childList")for(const u of l.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function s(c){const l={};return c.integrity&&(l.integrity=c.integrity),c.referrerPolicy&&(l.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?l.credentials="include":c.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function o(c){if(c.ep)return;c.ep=!0;const l=s(c);fetch(c.href,l)}})();function Ec(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var nf={exports:{}},Ki={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Om;function Z1(){if(Om)return Qi;Om=1;var r=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function s(f,c,u){var l=null;if(u!==void 0&&(l=""+u),c.key!==void 0&&(l=""+c.key),"key"in c){u={};for(var d in c)d!=="key"&&(u[d]=c[d])}else u=c;return c=u.ref,{$$typeof:r,type:f,key:l,ref:c!==void 0?c:null,props:u}}return Qi.Fragment=a,Qi.jsx=s,Qi.jsxs=s,Qi}var Sm;function Q1(){return Sm||(Sm=1,to.exports=Z1()),to.exports}var ve=Q1(),ro={exports:{}},Se={};/** + */var Om;function Q1(){if(Om)return Ki;Om=1;var r=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function s(o,c,l){var u=null;if(l!==void 0&&(u=""+l),c.key!==void 0&&(u=""+c.key),"key"in c){l={};for(var d in c)d!=="key"&&(l[d]=c[d])}else l=c;return c=l.ref,{$$typeof:r,type:o,key:u,ref:c!==void 0?c:null,props:l}}return Ki.Fragment=a,Ki.jsx=s,Ki.jsxs=s,Ki}var Tm;function K1(){return Tm||(Tm=1,nf.exports=Q1()),nf.exports}var ve=K1(),af={exports:{}},Oe={};/** * @license React * react.production.js * @@ -14,7 +14,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Tm;function K1(){if(Tm)return Se;Tm=1;var r=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),f=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),u=Symbol.for("react.consumer"),l=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),v=Symbol.iterator;function T(O){return O===null||typeof O!="object"?null:(O=v&&O[v]||O["@@iterator"],typeof O=="function"?O:null)}var j={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,N={};function D(O,$,ee){this.props=O,this.context=$,this.refs=N,this.updater=ee||j}D.prototype.isReactComponent={},D.prototype.setState=function(O,$){if(typeof O!="object"&&typeof O!="function"&&O!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,O,$,"setState")},D.prototype.forceUpdate=function(O){this.updater.enqueueForceUpdate(this,O,"forceUpdate")};function X(){}X.prototype=D.prototype;function k(O,$,ee){this.props=O,this.context=$,this.refs=N,this.updater=ee||j}var I=k.prototype=new X;I.constructor=k,C(I,D.prototype),I.isPureReactComponent=!0;var W=Array.isArray,te={H:null,A:null,T:null,S:null},R=Object.prototype.hasOwnProperty;function U(O,$,ee,se,ie,he){return ee=he.ref,{$$typeof:r,type:O,key:$,ref:ee!==void 0?ee:null,props:he}}function _(O,$){return U(O.type,$,void 0,void 0,void 0,O.props)}function w(O){return typeof O=="object"&&O!==null&&O.$$typeof===r}function E(O){var $={"=":"=0",":":"=2"};return"$"+O.replace(/[=:]/g,function(ee){return $[ee]})}var q=/\/+/g;function G(O,$){return typeof O=="object"&&O!==null&&O.key!=null?E(""+O.key):$.toString(36)}function ce(){}function K(O){switch(O.status){case"fulfilled":return O.value;case"rejected":throw O.reason;default:switch(typeof O.status=="string"?O.then(ce,ce):(O.status="pending",O.then(function($){O.status==="pending"&&(O.status="fulfilled",O.value=$)},function($){O.status==="pending"&&(O.status="rejected",O.reason=$)})),O.status){case"fulfilled":return O.value;case"rejected":throw O.reason}}throw O}function z(O,$,ee,se,ie){var he=typeof O;(he==="undefined"||he==="boolean")&&(O=null);var de=!1;if(O===null)de=!0;else switch(he){case"bigint":case"string":case"number":de=!0;break;case"object":switch(O.$$typeof){case r:case a:de=!0;break;case g:return de=O._init,z(de(O._payload),$,ee,se,ie)}}if(de)return ie=ie(O),de=se===""?"."+G(O,0):se,W(ie)?(ee="",de!=null&&(ee=de.replace(q,"$&/")+"/"),z(ie,$,ee,"",function(b){return b})):ie!=null&&(w(ie)&&(ie=_(ie,ee+(ie.key==null||O&&O.key===ie.key?"":(""+ie.key).replace(q,"$&/")+"/")+de)),$.push(ie)),1;de=0;var Re=se===""?".":se+":";if(W(O))for(var B=0;B>>1,O=x[J];if(0>>1;J<$;){var ee=2*(J+1)-1,se=x[ee],ie=ee+1,he=x[ie];if(0>c(se,P))iec(he,se)?(x[J]=he,x[ie]=P,J=ie):(x[J]=se,x[ee]=P,J=ee);else if(iec(he,P))x[J]=he,x[ie]=P,J=ie;else break e}}return Z}function c(x,Z){var P=x.sortIndex-Z.sortIndex;return P!==0?P:x.id-Z.id}if(r.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var u=performance;r.unstable_now=function(){return u.now()}}else{var l=Date,d=l.now();r.unstable_now=function(){return l.now()-d}}var m=[],p=[],g=1,v=null,T=3,j=!1,C=!1,N=!1,D=typeof setTimeout=="function"?setTimeout:null,X=typeof clearTimeout=="function"?clearTimeout:null,k=typeof setImmediate<"u"?setImmediate:null;function I(x){for(var Z=s(p);Z!==null;){if(Z.callback===null)f(p);else if(Z.startTime<=x)f(p),Z.sortIndex=Z.expirationTime,a(m,Z);else break;Z=s(p)}}function W(x){if(N=!1,I(x),!C)if(s(m)!==null)C=!0,K();else{var Z=s(p);Z!==null&&z(W,Z.startTime-x)}}var te=!1,R=-1,U=5,_=-1;function w(){return!(r.unstable_now()-_x&&w());){var J=v.callback;if(typeof J=="function"){v.callback=null,T=v.priorityLevel;var O=J(v.expirationTime<=x);if(x=r.unstable_now(),typeof O=="function"){v.callback=O,I(x),Z=!0;break t}v===s(m)&&f(m),I(x)}else f(m);v=s(m)}if(v!==null)Z=!0;else{var $=s(p);$!==null&&z(W,$.startTime-x),Z=!1}}break e}finally{v=null,T=P,j=!1}Z=void 0}}finally{Z?q():te=!1}}}var q;if(typeof k=="function")q=function(){k(E)};else if(typeof MessageChannel<"u"){var G=new MessageChannel,ce=G.port2;G.port1.onmessage=E,q=function(){ce.postMessage(null)}}else q=function(){D(E,0)};function K(){te||(te=!0,q())}function z(x,Z){R=D(function(){x(r.unstable_now())},Z)}r.unstable_IdlePriority=5,r.unstable_ImmediatePriority=1,r.unstable_LowPriority=4,r.unstable_NormalPriority=3,r.unstable_Profiling=null,r.unstable_UserBlockingPriority=2,r.unstable_cancelCallback=function(x){x.callback=null},r.unstable_continueExecution=function(){C||j||(C=!0,K())},r.unstable_forceFrameRate=function(x){0>x||125J?(x.sortIndex=P,a(p,x),s(m)===null&&x===s(p)&&(N?(X(R),R=-1):N=!0,z(W,P-J))):(x.sortIndex=O,a(m,x),C||j||(C=!0,K())),x},r.unstable_shouldYield=w,r.unstable_wrapCallback=function(x){var Z=T;return function(){var P=T;T=Z;try{return x.apply(this,arguments)}finally{T=P}}}})(io)),io}var Dm;function P1(){return Dm||(Dm=1,ao.exports=F1()),ao.exports}var lo={exports:{}},At={};/** + */var Dm;function P1(){return Dm||(Dm=1,(function(r){function a(D,I){var J=D.length;D.push(I);e:for(;0>>1,S=D[P];if(0>>1;Pc(se,J))uec(he,se)?(D[P]=he,D[ue]=J,P=ue):(D[P]=se,D[ee]=J,P=ee);else if(uec(he,J))D[P]=he,D[ue]=J,P=ue;else break e}}return I}function c(D,I){var J=D.sortIndex-I.sortIndex;return J!==0?J:D.id-I.id}if(r.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var l=performance;r.unstable_now=function(){return l.now()}}else{var u=Date,d=u.now();r.unstable_now=function(){return u.now()-d}}var m=[],p=[],g=1,v=null,R=3,C=!1,L=!1,j=!1,N=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,H=typeof setImmediate<"u"?setImmediate:null;function X(D){for(var I=s(p);I!==null;){if(I.callback===null)o(p);else if(I.startTime<=D)o(p),I.sortIndex=I.expirationTime,a(m,I);else break;I=s(p)}}function W(D){if(j=!1,X(D),!L)if(s(m)!==null)L=!0,K();else{var I=s(p);I!==null&&z(W,I.startTime-D)}}var re=!1,x=-1,U=5,_=-1;function w(){return!(r.unstable_now()-_D&&w());){var P=v.callback;if(typeof P=="function"){v.callback=null,R=v.priorityLevel;var S=P(v.expirationTime<=D);if(D=r.unstable_now(),typeof S=="function"){v.callback=S,X(D),I=!0;break t}v===s(m)&&o(m),X(D)}else o(m);v=s(m)}if(v!==null)I=!0;else{var k=s(p);k!==null&&z(W,k.startTime-D),I=!1}}break e}finally{v=null,R=J,C=!1}I=void 0}}finally{I?B():re=!1}}}var B;if(typeof H=="function")B=function(){H(b)};else if(typeof MessageChannel<"u"){var Y=new MessageChannel,ce=Y.port2;Y.port1.onmessage=b,B=function(){ce.postMessage(null)}}else B=function(){N(b,0)};function K(){re||(re=!0,B())}function z(D,I){x=N(function(){D(r.unstable_now())},I)}r.unstable_IdlePriority=5,r.unstable_ImmediatePriority=1,r.unstable_LowPriority=4,r.unstable_NormalPriority=3,r.unstable_Profiling=null,r.unstable_UserBlockingPriority=2,r.unstable_cancelCallback=function(D){D.callback=null},r.unstable_continueExecution=function(){L||C||(L=!0,K())},r.unstable_forceFrameRate=function(D){0>D||125P?(D.sortIndex=J,a(p,D),s(m)===null&&D===s(p)&&(j?(V(x),x=-1):j=!0,z(W,J-P))):(D.sortIndex=S,a(m,D),L||C||(L=!0,K())),D},r.unstable_shouldYield=w,r.unstable_wrapCallback=function(D){var I=R;return function(){var J=R;R=I;try{return D.apply(this,arguments)}finally{R=J}}}})(sf)),sf}var Nm;function J1(){return Nm||(Nm=1,uf.exports=P1()),uf.exports}var of={exports:{}},wt={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Nm;function J1(){if(Nm)return At;Nm=1;var r=Ec();function a(m){var p="https://react.dev/errors/"+m;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(a){console.error(a)}}return r(),lo.exports=J1(),lo.exports}/** + */var Mm;function W1(){if(Mm)return wt;Mm=1;var r=Ac();function a(m){var p="https://react.dev/errors/"+m;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(a){console.error(a)}}return r(),of.exports=W1(),of.exports}/** * @license React * react-dom-client.production.js * @@ -38,20 +38,20 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var jm;function eb(){if(jm)return Ki;jm=1;var r=P1(),a=Ec(),s=W1();function f(e){var t="https://react.dev/errors/"+e;if(1)":-1o||M[i]!==Y[o]){var ne=` -`+M[i].replace(" at new "," at ");return e.displayName&&ne.includes("")&&(ne=ne.replace("",e.displayName)),ne}while(1<=i&&0<=o);break}}}finally{K=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ce(n):""}function x(e){switch(e.tag){case 26:case 27:case 5:return ce(e.type);case 16:return ce("Lazy");case 13:return ce("Suspense");case 19:return ce("SuspenseList");case 0:case 15:return e=z(e.type,!1),e;case 11:return e=z(e.type.render,!1),e;case 1:return e=z(e.type,!0),e;default:return""}}function Z(e){try{var t="";do t+=x(e),e=e.return;while(e);return t}catch(n){return` +`+B+e+Y}var K=!1;function z(e,t){if(!e||K)return"";K=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var i={DetermineComponentFrameRoot:function(){try{if(t){var oe=function(){throw Error()};if(Object.defineProperty(oe.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(oe,[])}catch(ne){var F=ne}Reflect.construct(e,[],oe)}else{try{oe.call()}catch(ne){F=ne}e.call(oe.prototype)}}else{try{throw Error()}catch(ne){F=ne}(oe=e())&&typeof oe.catch=="function"&&oe.catch(function(){})}}catch(ne){if(ne&&F&&typeof ne.stack=="string")return[ne.stack,F.stack]}return[null,null]}};i.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var f=Object.getOwnPropertyDescriptor(i.DetermineComponentFrameRoot,"name");f&&f.configurable&&Object.defineProperty(i.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var h=i.DetermineComponentFrameRoot(),y=h[0],A=h[1];if(y&&A){var M=y.split(` +`),$=A.split(` +`);for(f=i=0;if||M[i]!==$[f]){var ae=` +`+M[i].replace(" at new "," at ");return e.displayName&&ae.includes("")&&(ae=ae.replace("",e.displayName)),ae}while(1<=i&&0<=f);break}}}finally{K=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ce(n):""}function D(e){switch(e.tag){case 26:case 27:case 5:return ce(e.type);case 16:return ce("Lazy");case 13:return ce("Suspense");case 19:return ce("SuspenseList");case 0:case 15:return e=z(e.type,!1),e;case 11:return e=z(e.type.render,!1),e;case 1:return e=z(e.type,!0),e;default:return""}}function I(e){try{var t="";do t+=D(e),e=e.return;while(e);return t}catch(n){return` Error generating stack: `+n.message+` -`+n.stack}}function P(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function J(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function O(e){if(P(e)!==e)throw Error(f(188))}function $(e){var t=e.alternate;if(!t){if(t=P(e),t===null)throw Error(f(188));return t!==e?null:e}for(var n=e,i=t;;){var o=n.return;if(o===null)break;var h=o.alternate;if(h===null){if(i=o.return,i!==null){n=i;continue}break}if(o.child===h.child){for(h=o.child;h;){if(h===n)return O(o),e;if(h===i)return O(o),t;h=h.sibling}throw Error(f(188))}if(n.return!==i.return)n=o,i=h;else{for(var y=!1,A=o.child;A;){if(A===n){y=!0,n=o,i=h;break}if(A===i){y=!0,i=o,n=h;break}A=A.sibling}if(!y){for(A=h.child;A;){if(A===n){y=!0,n=h,i=o;break}if(A===i){y=!0,i=h,n=o;break}A=A.sibling}if(!y)throw Error(f(189))}}if(n.alternate!==i)throw Error(f(190))}if(n.tag!==3)throw Error(f(188));return n.stateNode.current===n?e:t}function ee(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=ee(e),t!==null)return t;e=e.sibling}return null}var se=Array.isArray,ie=s.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,he={pending:!1,data:null,method:null,action:null},de=[],Re=-1;function B(e){return{current:e}}function b(e){0>Re||(e.current=de[Re],de[Re]=null,Re--)}function S(e,t){Re++,de[Re]=e.current,e.current=t}var L=B(null),ae=B(null),ue=B(null),oe=B(null);function Ee(e,t){switch(S(ue,t),S(ae,e),S(L,null),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)&&(t=t.namespaceURI)?Wp(t):0;break;default:if(e=e===8?t.parentNode:t,t=e.tagName,e=e.namespaceURI)e=Wp(e),t=em(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}b(L),S(L,t)}function Te(){b(L),b(ae),b(ue)}function Ue(e){e.memoizedState!==null&&S(oe,e);var t=L.current,n=em(t,e.type);t!==n&&(S(ae,e),S(L,n))}function Ve(e){ae.current===e&&(b(L),b(ae)),oe.current===e&&(b(oe),Gi._currentValue=he)}var Ie=Object.prototype.hasOwnProperty,tt=r.unstable_scheduleCallback,Ge=r.unstable_cancelCallback,Fe=r.unstable_shouldYield,Ir=r.unstable_requestPaint,Ct=r.unstable_now,R0=r.unstable_getCurrentPriorityLevel,Yc=r.unstable_ImmediatePriority,Gc=r.unstable_UserBlockingPriority,hl=r.unstable_NormalPriority,x0=r.unstable_LowPriority,Vc=r.unstable_IdlePriority,D0=r.log,N0=r.unstable_setDisableYieldValue,Ja=null,Lt=null;function M0(e){if(Lt&&typeof Lt.onCommitFiberRoot=="function")try{Lt.onCommitFiberRoot(Ja,e,void 0,(e.current.flags&128)===128)}catch{}}function Xr(e){if(typeof D0=="function"&&N0(e),Lt&&typeof Lt.setStrictMode=="function")try{Lt.setStrictMode(Ja,e)}catch{}}var zt=Math.clz32?Math.clz32:L0,j0=Math.log,C0=Math.LN2;function L0(e){return e>>>=0,e===0?32:31-(j0(e)/C0|0)|0}var dl=128,pl=4194304;function Tn(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194176;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ml(e,t){var n=e.pendingLanes;if(n===0)return 0;var i=0,o=e.suspendedLanes,h=e.pingedLanes,y=e.warmLanes;e=e.finishedLanes!==0;var A=n&134217727;return A!==0?(n=A&~o,n!==0?i=Tn(n):(h&=A,h!==0?i=Tn(h):e||(y=A&~y,y!==0&&(i=Tn(y))))):(A=n&~o,A!==0?i=Tn(A):h!==0?i=Tn(h):e||(y=n&~y,y!==0&&(i=Tn(y)))),i===0?0:t!==0&&t!==i&&(t&o)===0&&(o=i&-i,y=t&-t,o>=y||o===32&&(y&4194176)!==0)?t:i}function Wa(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function z0(e,t){switch(e){case 1:case 2:case 4:case 8:return t+250;case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ic(){var e=dl;return dl<<=1,(dl&4194176)===0&&(dl=128),e}function Xc(){var e=pl;return pl<<=1,(pl&62914560)===0&&(pl=4194304),e}function Ku(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function ei(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function U0(e,t,n,i,o,h){var y=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var A=e.entanglements,M=e.expirationTimes,Y=e.hiddenUpdates;for(n=y&~n;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),$0=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),eh={},th={};function k0(e){return Ie.call(th,e)?!0:Ie.call(eh,e)?!1:$0.test(e)?th[e]=!0:(eh[e]=!0,!1)}function yl(e,t,n){if(k0(t))if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var i=t.toLowerCase().slice(0,5);if(i!=="data-"&&i!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+n)}}function gl(e,t,n){if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+n)}}function Or(e,t,n,i){if(i===null)e.removeAttribute(n);else{switch(typeof i){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(n);return}e.setAttributeNS(t,n,""+i)}}function Vt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function rh(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Y0(e){var t=rh(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),i=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,h=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(y){i=""+y,h.call(this,y)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return i},setValue:function(y){i=""+y},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function vl(e){e._valueTracker||(e._valueTracker=Y0(e))}function nh(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),i="";return e&&(i=rh(e)?e.checked?"true":"false":e.value),e=i,e!==n?(t.setValue(e),!0):!1}function bl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var G0=/[\n"\\]/g;function It(e){return e.replace(G0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Ju(e,t,n,i,o,h,y,A){e.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.type=y:e.removeAttribute("type"),t!=null?y==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Vt(t)):e.value!==""+Vt(t)&&(e.value=""+Vt(t)):y!=="submit"&&y!=="reset"||e.removeAttribute("value"),t!=null?Wu(e,y,Vt(t)):n!=null?Wu(e,y,Vt(n)):i!=null&&e.removeAttribute("value"),o==null&&h!=null&&(e.defaultChecked=!!h),o!=null&&(e.checked=o&&typeof o!="function"&&typeof o!="symbol"),A!=null&&typeof A!="function"&&typeof A!="symbol"&&typeof A!="boolean"?e.name=""+Vt(A):e.removeAttribute("name")}function ah(e,t,n,i,o,h,y,A){if(h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.type=h),t!=null||n!=null){if(!(h!=="submit"&&h!=="reset"||t!=null))return;n=n!=null?""+Vt(n):"",t=t!=null?""+Vt(t):n,A||t===e.value||(e.value=t),e.defaultValue=t}i=i??o,i=typeof i!="function"&&typeof i!="symbol"&&!!i,e.checked=A?e.checked:!!i,e.defaultChecked=!!i,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(e.name=y)}function Wu(e,t,n){t==="number"&&bl(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function ra(e,t,n,i){if(e=e.options,t){t={};for(var o=0;o=ui),gh=" ",vh=!1;function bh(e,t){switch(e){case"keyup":return gv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Eh(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var la=!1;function bv(e,t){switch(e){case"compositionend":return Eh(t);case"keypress":return t.which!==32?null:(vh=!0,gh);case"textInput":return e=t.data,e===gh&&vh?null:e;default:return null}}function Ev(e,t){if(la)return e==="compositionend"||!os&&bh(e,t)?(e=ch(),Al=is=Qr=null,la=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=i}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=xh(n)}}function Nh(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nh(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Mh(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=bl(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=bl(e.document)}return t}function ds(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function xv(e,t){var n=Mh(t);t=e.focusedElem;var i=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Nh(t.ownerDocument.documentElement,t)){if(i!==null&&ds(t)){if(e=i.start,n=i.end,n===void 0&&(n=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(n,t.value.length);else if(n=(e=t.ownerDocument||document)&&e.defaultView||window,n.getSelection){n=n.getSelection();var o=t.textContent.length,h=Math.min(i.start,o);i=i.end===void 0?h:Math.min(i.end,o),!n.extend&&h>i&&(o=i,i=h,h=o),o=Dh(t,h);var y=Dh(t,i);o&&y&&(n.rangeCount!==1||n.anchorNode!==o.node||n.anchorOffset!==o.offset||n.focusNode!==y.node||n.focusOffset!==y.offset)&&(e=e.createRange(),e.setStart(o.node,o.offset),n.removeAllRanges(),h>i?(n.addRange(e),n.extend(y.node,y.offset)):(e.setEnd(y.node,y.offset),n.addRange(e)))}}for(e=[],n=t;n=n.parentNode;)n.nodeType===1&&e.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,ua=null,ps=null,ci=null,ms=!1;function jh(e,t,n){var i=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ms||ua==null||ua!==bl(i)||(i=ua,"selectionStart"in i&&ds(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),ci&&oi(ci,i)||(ci=i,i=su(ps,"onSelect"),0>=y,o-=y,Sr=1<<32-zt(t)+o|n<Ae?(pt=ge,ge=null):pt=ge.sibling;var ze=F(V,ge,Q[Ae],le);if(ze===null){ge===null&&(ge=pt);break}e&&ge&&ze.alternate===null&&t(V,ge),H=h(ze,H,Ae),De===null?me=ze:De.sibling=ze,De=ze,ge=pt}if(Ae===Q.length)return n(V,ge),Le&&Cn(V,Ae),me;if(ge===null){for(;AeAe?(pt=ge,ge=null):pt=ge.sibling;var mn=F(V,ge,ze.value,le);if(mn===null){ge===null&&(ge=pt);break}e&&ge&&mn.alternate===null&&t(V,ge),H=h(mn,H,Ae),De===null?me=mn:De.sibling=mn,De=mn,ge=pt}if(ze.done)return n(V,ge),Le&&Cn(V,Ae),me;if(ge===null){for(;!ze.done;Ae++,ze=Q.next())ze=fe(V,ze.value,le),ze!==null&&(H=h(ze,H,Ae),De===null?me=ze:De.sibling=ze,De=ze);return Le&&Cn(V,Ae),me}for(ge=i(ge);!ze.done;Ae++,ze=Q.next())ze=re(ge,V,Ae,ze.value,le),ze!==null&&(e&&ze.alternate!==null&&ge.delete(ze.key===null?Ae:ze.key),H=h(ze,H,Ae),De===null?me=ze:De.sibling=ze,De=ze);return e&&ge.forEach(function(X1){return t(V,X1)}),Le&&Cn(V,Ae),me}function We(V,H,Q,le){if(typeof Q=="object"&&Q!==null&&Q.type===m&&Q.key===null&&(Q=Q.props.children),typeof Q=="object"&&Q!==null){switch(Q.$$typeof){case l:e:{for(var me=Q.key;H!==null;){if(H.key===me){if(me=Q.type,me===m){if(H.tag===7){n(V,H.sibling),le=o(H,Q.props.children),le.return=V,V=le;break e}}else if(H.elementType===me||typeof me=="object"&&me!==null&&me.$$typeof===k&&Kh(me)===H.type){n(V,H.sibling),le=o(H,Q.props),vi(le,Q),le.return=V,V=le;break e}n(V,H);break}else t(V,H);H=H.sibling}Q.type===m?(le=Vn(Q.props.children,V.mode,le,Q.key),le.return=V,V=le):(le=Jl(Q.type,Q.key,Q.props,null,V.mode,le),vi(le,Q),le.return=V,V=le)}return y(V);case d:e:{for(me=Q.key;H!==null;){if(H.key===me)if(H.tag===4&&H.stateNode.containerInfo===Q.containerInfo&&H.stateNode.implementation===Q.implementation){n(V,H.sibling),le=o(H,Q.children||[]),le.return=V,V=le;break e}else{n(V,H);break}else t(V,H);H=H.sibling}le=vf(Q,V.mode,le),le.return=V,V=le}return y(V);case k:return me=Q._init,Q=me(Q._payload),We(V,H,Q,le)}if(se(Q))return ye(V,H,Q,le);if(R(Q)){if(me=R(Q),typeof me!="function")throw Error(f(150));return Q=me.call(Q),Oe(V,H,Q,le)}if(typeof Q.then=="function")return We(V,H,Cl(Q),le);if(Q.$$typeof===j)return We(V,H,Kl(V,Q),le);Ll(V,Q)}return typeof Q=="string"&&Q!==""||typeof Q=="number"||typeof Q=="bigint"?(Q=""+Q,H!==null&&H.tag===6?(n(V,H.sibling),le=o(H,Q),le.return=V,V=le):(n(V,H),le=gf(Q,V.mode,le),le.return=V,V=le),y(V)):n(V,H)}return function(V,H,Q,le){try{gi=0;var me=We(V,H,Q,le);return da=null,me}catch(ge){if(ge===mi)throw ge;var De=Wt(29,ge,null,V.mode);return De.lanes=le,De.return=V,De}finally{}}}var zn=Fh(!0),Ph=Fh(!1),pa=B(null),zl=B(0);function Jh(e,t){e=Br,S(zl,e),S(pa,t),Br=e|t.baseLanes}function ws(){S(zl,Br),S(pa,pa.current)}function Os(){Br=zl.current,b(pa),b(zl)}var Ft=B(null),mr=null;function Fr(e){var t=e.alternate;S(st,st.current&1),S(Ft,e),mr===null&&(t===null||pa.current!==null||t.memoizedState!==null)&&(mr=e)}function Wh(e){if(e.tag===22){if(S(st,st.current),S(Ft,e),mr===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(mr=e)}}else Pr()}function Pr(){S(st,st.current),S(Ft,Ft.current)}function Rr(e){b(Ft),mr===e&&(mr=null),b(st)}var st=B(0);function Ul(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Cv=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(n,i){e.push(i)}};this.abort=function(){t.aborted=!0,e.forEach(function(n){return n()})}},Lv=r.unstable_scheduleCallback,zv=r.unstable_NormalPriority,ft={$$typeof:j,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Ss(){return{controller:new Cv,data:new Map,refCount:0}}function bi(e){e.refCount--,e.refCount===0&&Lv(zv,function(){e.controller.abort()})}var Ei=null,Ts=0,ma=0,ya=null;function Uv(e,t){if(Ei===null){var n=Ei=[];Ts=0,ma=Cf(),ya={status:"pending",value:void 0,then:function(i){n.push(i)}}}return Ts++,t.then(ed,ed),t}function ed(){if(--Ts===0&&Ei!==null){ya!==null&&(ya.status="fulfilled");var e=Ei;Ei=null,ma=0,ya=null;for(var t=0;th?h:8;var y=w.T,A={};w.T=A,Gs(e,!1,t,n);try{var M=o(),Y=w.S;if(Y!==null&&Y(A,M),M!==null&&typeof M=="object"&&typeof M.then=="function"){var ne=Bv(M,i);wi(e,t,ne,$t(e))}else wi(e,t,i,$t(e))}catch(fe){wi(e,t,{then:function(){},status:"rejected",reason:fe},$t())}finally{ie.p=h,w.T=y}}function Yv(){}function ks(e,t,n,i){if(e.tag!==5)throw Error(f(476));var o=Md(e).queue;Nd(e,o,t,he,n===null?Yv:function(){return jd(e),n(i)})}function Md(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:he,baseState:he,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:xr,lastRenderedState:he},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:xr,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function jd(e){var t=Md(e).next.queue;wi(e,t,{},$t())}function Ys(){return Et(Gi)}function Cd(){return it().memoizedState}function Ld(){return it().memoizedState}function Gv(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=$t();e=rn(n);var i=nn(t,e,n);i!==null&&(Tt(i,t,n),Ti(i,t,n)),t={cache:Ss()},e.payload=t;return}t=t.return}}function Vv(e,t,n){var i=$t();n={lane:i,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Il(e)?Ud(t,n):(n=vs(e,t,n,i),n!==null&&(Tt(n,e,i),Bd(n,t,i)))}function zd(e,t,n){var i=$t();wi(e,t,n,i)}function wi(e,t,n,i){var o={lane:i,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Il(e))Ud(t,o);else{var h=e.alternate;if(e.lanes===0&&(h===null||h.lanes===0)&&(h=t.lastRenderedReducer,h!==null))try{var y=t.lastRenderedState,A=h(y,n);if(o.hasEagerState=!0,o.eagerState=A,Ut(A,y))return xl(e,t,o,0),ke===null&&Rl(),!1}catch{}finally{}if(n=vs(e,t,o,i),n!==null)return Tt(n,e,i),Bd(n,t,i),!0}return!1}function Gs(e,t,n,i){if(i={lane:2,revertLane:Cf(),action:i,hasEagerState:!1,eagerState:null,next:null},Il(e)){if(t)throw Error(f(479))}else t=vs(e,n,i,2),t!==null&&Tt(t,e,2)}function Il(e){var t=e.alternate;return e===xe||t!==null&&t===xe}function Ud(e,t){ga=ql=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bd(e,t,n){if((n&4194176)!==0){var i=t.lanes;i&=e.pendingLanes,n|=i,t.lanes=n,Qc(e,n)}}var yr={readContext:Et,use:kl,useCallback:rt,useContext:rt,useEffect:rt,useImperativeHandle:rt,useLayoutEffect:rt,useInsertionEffect:rt,useMemo:rt,useReducer:rt,useRef:rt,useState:rt,useDebugValue:rt,useDeferredValue:rt,useTransition:rt,useSyncExternalStore:rt,useId:rt};yr.useCacheRefresh=rt,yr.useMemoCache=rt,yr.useHostTransitionStatus=rt,yr.useFormState=rt,yr.useActionState=rt,yr.useOptimistic=rt;var qn={readContext:Et,use:kl,useCallback:function(e,t){return Mt().memoizedState=[e,t===void 0?null:t],e},useContext:Et,useEffect:_d,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,Gl(4194308,4,Sd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Gl(4194308,4,e,t)},useInsertionEffect:function(e,t){Gl(4,2,e,t)},useMemo:function(e,t){var n=Mt();t=t===void 0?null:t;var i=e();if(Bn){Xr(!0);try{e()}finally{Xr(!1)}}return n.memoizedState=[i,t],i},useReducer:function(e,t,n){var i=Mt();if(n!==void 0){var o=n(t);if(Bn){Xr(!0);try{n(t)}finally{Xr(!1)}}}else o=t;return i.memoizedState=i.baseState=o,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:o},i.queue=e,e=e.dispatch=Vv.bind(null,xe,e),[i.memoizedState,e]},useRef:function(e){var t=Mt();return e={current:e},t.memoizedState=e},useState:function(e){e=Us(e);var t=e.queue,n=zd.bind(null,xe,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Hs,useDeferredValue:function(e,t){var n=Mt();return $s(n,e,t)},useTransition:function(){var e=Us(!1);return e=Nd.bind(null,xe,e.queue,!0,!1),Mt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var i=xe,o=Mt();if(Le){if(n===void 0)throw Error(f(407));n=n()}else{if(n=t(),ke===null)throw Error(f(349));(je&60)!==0||ld(i,t,n)}o.memoizedState=n;var h={value:n,getSnapshot:t};return o.queue=h,_d(sd.bind(null,i,h,e),[e]),i.flags|=2048,ba(9,ud.bind(null,i,h,n,t),{destroy:void 0},null),n},useId:function(){var e=Mt(),t=ke.identifierPrefix;if(Le){var n=Tr,i=Sr;n=(i&~(1<<32-zt(i)-1)).toString(32)+n,t=":"+t+"R"+n,n=Hl++,0 title"))),gt(h,i,n),h[bt]=e,ct(h),i=h;break e;case"link":var y=om("link","href",o).get(i+(n.href||""));if(y){for(var A=0;A<\/script>",e=e.removeChild(e.firstChild);break;case"select":e=typeof i.is=="string"?o.createElement("select",{is:i.is}):o.createElement("select"),i.multiple?e.multiple=!0:i.size&&(e.size=i.size);break;default:e=typeof i.is=="string"?o.createElement(n,{is:i.is}):o.createElement(n)}}e[bt]=t,e[Dt]=i;e:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)e.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break e;for(;o.sibling===null;){if(o.return===null||o.return===t)break e;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=e;e:switch(gt(e,n,i),n){case"button":case"input":case"select":case"textarea":e=!!i.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&zr(t)}}return Xe(t),t.flags&=-16777217,null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==i&&zr(t);else{if(typeof i!="string"&&t.stateNode===null)throw Error(f(166));if(e=ue.current,hi(t)){if(e=t.stateNode,n=t.memoizedProps,i=null,o=St,o!==null)switch(o.tag){case 27:case 5:i=o.memoizedProps}e[bt]=t,e=!!(e.nodeValue===n||i!==null&&i.suppressHydrationWarning===!0||Jp(e.nodeValue,n)),e||Ln(t)}else e=ou(e).createTextNode(i),e[bt]=t,t.stateNode=e}return Xe(t),null;case 13:if(i=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(o=hi(t),i!==null&&i.dehydrated!==null){if(e===null){if(!o)throw Error(f(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(f(317));o[bt]=t}else di(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Xe(t),o=!1}else lr!==null&&(Tf(lr),lr=null),o=!0;if(!o)return t.flags&256?(Rr(t),t):(Rr(t),null)}if(Rr(t),(t.flags&128)!==0)return t.lanes=n,t;if(n=i!==null,e=e!==null&&e.memoizedState!==null,n){i=t.child,o=null,i.alternate!==null&&i.alternate.memoizedState!==null&&i.alternate.memoizedState.cachePool!==null&&(o=i.alternate.memoizedState.cachePool.pool);var h=null;i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(h=i.memoizedState.cachePool.pool),h!==o&&(i.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),Wl(t,t.updateQueue),Xe(t),null;case 4:return Te(),e===null&&Bf(t.stateNode.containerInfo),Xe(t),null;case 10:return Mr(t.type),Xe(t),null;case 19:if(b(st),o=t.memoizedState,o===null)return Xe(t),null;if(i=(t.flags&128)!==0,h=o.rendering,h===null)if(i)Ci(o,!1);else{if(Je!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(h=Ul(e),h!==null){for(t.flags|=128,Ci(o,!1),e=h.updateQueue,t.updateQueue=e,Wl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Tp(n,e),n=n.sibling;return S(st,st.current&1|2),t.child}e=e.sibling}o.tail!==null&&Ct()>eu&&(t.flags|=128,i=!0,Ci(o,!1),t.lanes=4194304)}else{if(!i)if(e=Ul(h),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Wl(t,e),Ci(o,!0),o.tail===null&&o.tailMode==="hidden"&&!h.alternate&&!Le)return Xe(t),null}else 2*Ct()-o.renderingStartTime>eu&&n!==536870912&&(t.flags|=128,i=!0,Ci(o,!1),t.lanes=4194304);o.isBackwards?(h.sibling=t.child,t.child=h):(e=o.last,e!==null?e.sibling=h:t.child=h,o.last=h)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Ct(),t.sibling=null,e=st.current,S(st,i?e&1|2:e&1),t):(Xe(t),null);case 22:case 23:return Rr(t),Os(),i=t.memoizedState!==null,e!==null?e.memoizedState!==null!==i&&(t.flags|=8192):i&&(t.flags|=8192),i?(n&536870912)!==0&&(t.flags&128)===0&&(Xe(t),t.subtreeFlags&6&&(t.flags|=8192)):Xe(t),n=t.updateQueue,n!==null&&Wl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),i=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(i=t.memoizedState.cachePool.pool),i!==n&&(t.flags|=2048),e!==null&&b(Un),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Mr(ft),Xe(t),null;case 25:return null}throw Error(f(156,t.tag))}function Pv(e,t){switch(Es(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Mr(ft),Te(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ve(t),null;case 13:if(Rr(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(f(340));di()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return b(st),null;case 4:return Te(),null;case 10:return Mr(t.type),null;case 22:case 23:return Rr(t),Os(),e!==null&&b(Un),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Mr(ft),null;case 25:return null;default:return null}}function Dp(e,t){switch(Es(t),t.tag){case 3:Mr(ft),Te();break;case 26:case 27:case 5:Ve(t);break;case 4:Te();break;case 13:Rr(t);break;case 19:b(st);break;case 10:Mr(t.type);break;case 22:case 23:Rr(t),Os(),e!==null&&b(Un);break;case 24:Mr(ft)}}var Jv={getCacheForType:function(e){var t=Et(ft),n=t.data.get(e);return n===void 0&&(n=e(),t.data.set(e,n)),n}},Wv=typeof WeakMap=="function"?WeakMap:Map,Ze=0,ke=null,Ne=null,je=0,Ye=0,Ht=null,Ur=!1,wa=!1,bf=!1,Br=0,Je=0,fn=0,In=0,Ef=0,er=0,Oa=0,Li=null,gr=null,Af=!1,_f=0,eu=1/0,tu=null,on=null,ru=!1,Xn=null,zi=0,wf=0,Of=null,Ui=0,Sf=null;function $t(){if((Ze&2)!==0&&je!==0)return je&-je;if(w.T!==null){var e=ma;return e!==0?e:Cf()}return Fc()}function Np(){er===0&&(er=(je&536870912)===0||Le?Ic():536870912);var e=Ft.current;return e!==null&&(e.flags|=32),er}function Tt(e,t,n){(e===ke&&Ye===2||e.cancelPendingCommit!==null)&&(Sa(e,0),qr(e,je,er,!1)),ei(e,n),((Ze&2)===0||e!==ke)&&(e===ke&&((Ze&2)===0&&(In|=n),Je===4&&qr(e,je,er,!1)),vr(e))}function Mp(e,t,n){if((Ze&6)!==0)throw Error(f(327));var i=!n&&(t&60)===0&&(t&e.expiredLanes)===0||Wa(e,t),o=i?r1(e,t):Df(e,t,!0),h=i;do{if(o===0){wa&&!i&&qr(e,t,0,!1);break}else if(o===6)qr(e,t,0,!Ur);else{if(n=e.current.alternate,h&&!e1(n)){o=Df(e,t,!1),h=!1;continue}if(o===2){if(h=t,e.errorRecoveryDisabledLanes&h)var y=0;else y=e.pendingLanes&-536870913,y=y!==0?y:y&536870912?536870912:0;if(y!==0){t=y;e:{var A=e;o=Li;var M=A.current.memoizedState.isDehydrated;if(M&&(Sa(A,y).flags|=256),y=Df(A,y,!1),y!==2){if(bf&&!M){A.errorRecoveryDisabledLanes|=h,In|=h,o=4;break e}h=gr,gr=o,h!==null&&Tf(h)}o=y}if(h=!1,o!==2)continue}}if(o===1){Sa(e,0),qr(e,t,0,!0);break}e:{switch(i=e,o){case 0:case 1:throw Error(f(345));case 4:if((t&4194176)===t){qr(i,t,er,!Ur);break e}break;case 2:gr=null;break;case 3:case 5:break;default:throw Error(f(329))}if(i.finishedWork=n,i.finishedLanes=t,(t&62914560)===t&&(h=_f+300-Ct(),10n?32:n,w.T=null,Xn===null)var h=!1;else{n=Of,Of=null;var y=Xn,A=zi;if(Xn=null,zi=0,(Ze&6)!==0)throw Error(f(331));var M=Ze;if(Ze|=4,Op(y.current),Ap(y,y.current,A,n),Ze=M,Bi(0,!1),Lt&&typeof Lt.onPostCommitFiberRoot=="function")try{Lt.onPostCommitFiberRoot(Ja,y)}catch{}h=!0}return h}finally{ie.p=o,w.T=i,$p(e,t)}}return!1}function kp(e,t,n){t=Zt(n,t),t=Xs(e.stateNode,t,2),e=nn(e,t,2),e!==null&&(ei(e,2),vr(e))}function $e(e,t,n){if(e.tag===3)kp(e,e,n);else for(;t!==null;){if(t.tag===3){kp(t,e,n);break}else if(t.tag===1){var i=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(on===null||!on.has(i))){e=Zt(n,e),n=Vd(2),i=nn(t,n,2),i!==null&&(Id(n,i,t,e),ei(i,2),vr(i));break}}t=t.return}}function Nf(e,t,n){var i=e.pingCache;if(i===null){i=e.pingCache=new Wv;var o=new Set;i.set(t,o)}else o=i.get(t),o===void 0&&(o=new Set,i.set(t,o));o.has(n)||(bf=!0,o.add(n),e=i1.bind(null,e,t,n),t.then(e,e))}function i1(e,t,n){var i=e.pingCache;i!==null&&i.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,ke===e&&(je&n)===n&&(Je===4||Je===3&&(je&62914560)===je&&300>Ct()-_f?(Ze&2)===0&&Sa(e,0):Ef|=n,Oa===je&&(Oa=0)),vr(e)}function Yp(e,t){t===0&&(t=Xc()),e=Kr(e,t),e!==null&&(ei(e,t),vr(e))}function l1(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yp(e,n)}function u1(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:i=e.stateNode;break;case 22:i=e.stateNode._retryCache;break;default:throw Error(f(314))}i!==null&&i.delete(t),Yp(e,n)}function s1(e,t){return tt(e,t)}var iu=null,xa=null,Mf=!1,lu=!1,jf=!1,Zn=0;function vr(e){e!==xa&&e.next===null&&(xa===null?iu=xa=e:xa=xa.next=e),lu=!0,Mf||(Mf=!0,o1(f1))}function Bi(e,t){if(!jf&&lu){jf=!0;do for(var n=!1,i=iu;i!==null;){if(e!==0){var o=i.pendingLanes;if(o===0)var h=0;else{var y=i.suspendedLanes,A=i.pingedLanes;h=(1<<31-zt(42|e)+1)-1,h&=o&~(y&~A),h=h&201326677?h&201326677|1:h?h|2:0}h!==0&&(n=!0,Ip(i,h))}else h=je,h=ml(i,i===ke?h:0),(h&3)===0||Wa(i,h)||(n=!0,Ip(i,h));i=i.next}while(n);jf=!1}}function f1(){lu=Mf=!1;var e=0;Zn!==0&&(v1()&&(e=Zn),Zn=0);for(var t=Ct(),n=null,i=iu;i!==null;){var o=i.next,h=Gp(i,t);h===0?(i.next=null,n===null?iu=o:n.next=o,o===null&&(xa=n)):(n=i,(e!==0||(h&3)!==0)&&(lu=!0)),i=o}Bi(e)}function Gp(e,t){for(var n=e.suspendedLanes,i=e.pingedLanes,o=e.expirationTimes,h=e.pendingLanes&-62914561;0"u"?null:document;function lm(e,t,n){var i=Na;if(i&&typeof t=="string"&&t){var o=It(t);o='link[rel="'+e+'"][href="'+o+'"]',typeof n=="string"&&(o+='[crossorigin="'+n+'"]'),im.has(o)||(im.add(o),e={rel:e,crossOrigin:n,href:t},i.querySelector(o)===null&&(t=i.createElement("link"),gt(t,"link",e),ct(t),i.head.appendChild(t)))}}function T1(e){Hr.D(e),lm("dns-prefetch",e,null)}function R1(e,t){Hr.C(e,t),lm("preconnect",e,t)}function x1(e,t,n){Hr.L(e,t,n);var i=Na;if(i&&e&&t){var o='link[rel="preload"][as="'+It(t)+'"]';t==="image"&&n&&n.imageSrcSet?(o+='[imagesrcset="'+It(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(o+='[imagesizes="'+It(n.imageSizes)+'"]')):o+='[href="'+It(e)+'"]';var h=o;switch(t){case"style":h=Ma(e);break;case"script":h=ja(e)}tr.has(h)||(e=E({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),tr.set(h,e),i.querySelector(o)!==null||t==="style"&&i.querySelector($i(h))||t==="script"&&i.querySelector(ki(h))||(t=i.createElement("link"),gt(t,"link",e),ct(t),i.head.appendChild(t)))}}function D1(e,t){Hr.m(e,t);var n=Na;if(n&&e){var i=t&&typeof t.as=="string"?t.as:"script",o='link[rel="modulepreload"][as="'+It(i)+'"][href="'+It(e)+'"]',h=o;switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":h=ja(e)}if(!tr.has(h)&&(e=E({rel:"modulepreload",href:e},t),tr.set(h,e),n.querySelector(o)===null)){switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(ki(h)))return}i=n.createElement("link"),gt(i,"link",e),ct(i),n.head.appendChild(i)}}}function N1(e,t,n){Hr.S(e,t,n);var i=Na;if(i&&e){var o=ea(i).hoistableStyles,h=Ma(e);t=t||"default";var y=o.get(h);if(!y){var A={loading:0,preload:null};if(y=i.querySelector($i(h)))A.loading=5;else{e=E({rel:"stylesheet",href:e,"data-precedence":t},n),(n=tr.get(h))&&Xf(e,n);var M=y=i.createElement("link");ct(M),gt(M,"link",e),M._p=new Promise(function(Y,ne){M.onload=Y,M.onerror=ne}),M.addEventListener("load",function(){A.loading|=1}),M.addEventListener("error",function(){A.loading|=2}),A.loading|=4,hu(y,t,i)}y={type:"stylesheet",instance:y,count:1,state:A},o.set(h,y)}}}function M1(e,t){Hr.X(e,t);var n=Na;if(n&&e){var i=ea(n).hoistableScripts,o=ja(e),h=i.get(o);h||(h=n.querySelector(ki(o)),h||(e=E({src:e,async:!0},t),(t=tr.get(o))&&Zf(e,t),h=n.createElement("script"),ct(h),gt(h,"link",e),n.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},i.set(o,h))}}function j1(e,t){Hr.M(e,t);var n=Na;if(n&&e){var i=ea(n).hoistableScripts,o=ja(e),h=i.get(o);h||(h=n.querySelector(ki(o)),h||(e=E({src:e,async:!0,type:"module"},t),(t=tr.get(o))&&Zf(e,t),h=n.createElement("script"),ct(h),gt(h,"link",e),n.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},i.set(o,h))}}function um(e,t,n,i){var o=(o=ue.current)?cu(o):null;if(!o)throw Error(f(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=Ma(n.href),n=ea(o).hoistableStyles,i=n.get(t),i||(i={type:"style",instance:null,count:0,state:null},n.set(t,i)),i):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Ma(n.href);var h=ea(o).hoistableStyles,y=h.get(e);if(y||(o=o.ownerDocument||o,y={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},h.set(e,y),(h=o.querySelector($i(e)))&&!h._p&&(y.instance=h,y.state.loading=5),tr.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},tr.set(e,n),h||C1(o,e,n,y.state))),t&&i===null)throw Error(f(528,""));return y}if(t&&i!==null)throw Error(f(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=ja(n),n=ea(o).hoistableScripts,i=n.get(t),i||(i={type:"script",instance:null,count:0,state:null},n.set(t,i)),i):{type:"void",instance:null,count:0,state:null};default:throw Error(f(444,e))}}function Ma(e){return'href="'+It(e)+'"'}function $i(e){return'link[rel="stylesheet"]['+e+"]"}function sm(e){return E({},e,{"data-precedence":e.precedence,precedence:null})}function C1(e,t,n,i){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?i.loading=1:(t=e.createElement("link"),i.preload=t,t.addEventListener("load",function(){return i.loading|=1}),t.addEventListener("error",function(){return i.loading|=2}),gt(t,"link",n),ct(t),e.head.appendChild(t))}function ja(e){return'[src="'+It(e)+'"]'}function ki(e){return"script[async]"+e}function fm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var i=e.querySelector('style[data-href~="'+It(n.href)+'"]');if(i)return t.instance=i,ct(i),i;var o=E({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return i=(e.ownerDocument||e).createElement("style"),ct(i),gt(i,"style",o),hu(i,n.precedence,e),t.instance=i;case"stylesheet":o=Ma(n.href);var h=e.querySelector($i(o));if(h)return t.state.loading|=4,t.instance=h,ct(h),h;i=sm(n),(o=tr.get(o))&&Xf(i,o),h=(e.ownerDocument||e).createElement("link"),ct(h);var y=h;return y._p=new Promise(function(A,M){y.onload=A,y.onerror=M}),gt(h,"link",i),t.state.loading|=4,hu(h,n.precedence,e),t.instance=h;case"script":return h=ja(n.src),(o=e.querySelector(ki(h)))?(t.instance=o,ct(o),o):(i=n,(o=tr.get(h))&&(i=E({},n),Zf(i,o)),e=e.ownerDocument||e,o=e.createElement("script"),ct(o),gt(o,"link",i),e.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(f(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(i=t.instance,t.state.loading|=4,hu(i,n.precedence,e));return t.instance}function hu(e,t,n){for(var i=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=i.length?i[i.length-1]:null,h=o,y=0;y title"):null)}function L1(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function hm(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}var Yi=null;function z1(){}function U1(e,t,n){if(Yi===null)throw Error(f(475));var i=Yi;if(t.type==="stylesheet"&&(typeof n.media!="string"||matchMedia(n.media).matches!==!1)&&(t.state.loading&4)===0){if(t.instance===null){var o=Ma(n.href),h=e.querySelector($i(o));if(h){e=h._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(i.count++,i=pu.bind(i),e.then(i,i)),t.state.loading|=4,t.instance=h,ct(h);return}h=e.ownerDocument||e,n=sm(n),(o=tr.get(o))&&Xf(n,o),h=h.createElement("link"),ct(h);var y=h;y._p=new Promise(function(A,M){y.onload=A,y.onerror=M}),gt(h,"link",n),t.instance=h}i.stylesheets===null&&(i.stylesheets=new Map),i.stylesheets.set(t,e),(e=t.state.preload)&&(t.state.loading&3)===0&&(i.count++,t=pu.bind(i),e.addEventListener("load",t),e.addEventListener("error",t))}}function B1(){if(Yi===null)throw Error(f(475));var e=Yi;return e.stylesheets&&e.count===0&&Qf(e,e.stylesheets),0"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(a){console.error(a)}}return r(),no.exports=eb(),no.exports}var rb=tb();const nb=bc(rb);var ab=typeof window<"u",ib=function(r,a){return ab?window.matchMedia(r).matches:!1},lb=function(r,a){var s=pe.useState(ib(r)),f=s[0],c=s[1];return pe.useEffect(function(){var u=!0,l=window.matchMedia(r),d=function(){u&&c(!!l.matches)};return l.addEventListener("change",d),c(l.matches),function(){u=!1,l.removeEventListener("change",d)}},[r]),f},br={STATIC:"STATIC",DEFAULT:"DEFAULT",TARGETING_MATCH:"TARGETING_MATCH",ERROR:"ERROR"},Fn=(r=>(r.PROVIDER_NOT_READY="PROVIDER_NOT_READY",r.PROVIDER_FATAL="PROVIDER_FATAL",r.FLAG_NOT_FOUND="FLAG_NOT_FOUND",r.PARSE_ERROR="PARSE_ERROR",r.TYPE_MISMATCH="TYPE_MISMATCH",r.TARGETING_KEY_MISSING="TARGETING_KEY_MISSING",r.INVALID_CONTEXT="INVALID_CONTEXT",r.GENERAL="GENERAL",r))(Fn||{}),fg=class og extends Error{constructor(a,s){super(a),Object.setPrototypeOf(this,og.prototype),this.name="OpenFeatureError",this.cause=s==null?void 0:s.cause}},Lm=class cg extends fg{constructor(a,s){super(a,s),Object.setPrototypeOf(this,cg.prototype),this.name="GeneralError",this.code="GENERAL"}},uo=class hg extends fg{constructor(a,s){super(a,s),Object.setPrototypeOf(this,hg.prototype),this.name="ParseError",this.code="PARSE_ERROR"}},dg=class{error(...r){console.error(...r)}warn(...r){console.warn(...r)}info(){}debug(){}},ub=["error","warn","info","debug"],sb=class{constructor(r){this.fallbackLogger=new dg;try{for(const a of ub)if(!r[a]||typeof r[a]!="function")throw new Error(`The provided logger is missing the ${a} method.`);this.logger=r}catch(a){console.error(a),console.error("Falling back to the default logger."),this.logger=this.fallbackLogger}}error(...r){this.log("error",...r)}warn(...r){this.log("warn",...r)}info(...r){this.log("info",...r)}debug(...r){this.log("debug",...r)}log(r,...a){try{this.logger[r](...a)}catch{this.fallbackLogger[r](...a)}}};function wu(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var so={exports:{}},zm;function fb(){return zm||(zm=1,(function(r,a){(function(s){r.exports=s()})(function(){return(function s(f,c,u){function l(p,g){if(!c[p]){if(!f[p]){var v=typeof wu=="function"&&wu;if(!g&&v)return v(p,!0);if(d)return d(p,!0);throw new Error("Cannot find module '"+p+"'")}g=c[p]={exports:{}},f[p][0].call(g.exports,function(T){var j=f[p][1][T];return l(j||T)},g,g.exports,s,f,c,u)}return c[p].exports}for(var d=typeof wu=="function"&&wu,m=0;mTe||(e.current=de[Te],de[Te]=null,Te--)}function T(e,t){Te++,de[Te]=e.current,e.current=t}var O=te(null),Q=te(null),ie=te(null),fe=te(null);function Ee(e,t){switch(T(ie,t),T(Q,e),T(O,null),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)&&(t=t.namespaceURI)?em(t):0;break;default:if(e=e===8?t.parentNode:t,t=e.tagName,e=e.namespaceURI)e=em(e),t=tm(e,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}E(O),T(O,t)}function De(){E(O),E(Q),E(ie)}function Be(e){e.memoizedState!==null&&T(fe,e);var t=O.current,n=tm(t,e.type);t!==n&&(T(Q,e),T(O,n))}function Ge(e){Q.current===e&&(E(O),E(Q)),fe.current===e&&(E(fe),Vi._currentValue=he)}var qe=Object.prototype.hasOwnProperty,Ze=r.unstable_scheduleCallback,ke=r.unstable_cancelCallback,Pe=r.unstable_shouldYield,Vr=r.unstable_requestPaint,Ct=r.unstable_now,xg=r.unstable_getCurrentPriorityLevel,Gc=r.unstable_ImmediatePriority,Vc=r.unstable_UserBlockingPriority,dl=r.unstable_NormalPriority,Dg=r.unstable_LowPriority,Ic=r.unstable_IdlePriority,Ng=r.log,Mg=r.unstable_setDisableYieldValue,Wa=null,Lt=null;function jg(e){if(Lt&&typeof Lt.onCommitFiberRoot=="function")try{Lt.onCommitFiberRoot(Wa,e,void 0,(e.current.flags&128)===128)}catch{}}function Ir(e){if(typeof Ng=="function"&&Mg(e),Lt&&typeof Lt.setStrictMode=="function")try{Lt.setStrictMode(Wa,e)}catch{}}var zt=Math.clz32?Math.clz32:zg,Cg=Math.log,Lg=Math.LN2;function zg(e){return e>>>=0,e===0?32:31-(Cg(e)/Lg|0)|0}var pl=128,ml=4194304;function On(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194176;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function yl(e,t){var n=e.pendingLanes;if(n===0)return 0;var i=0,f=e.suspendedLanes,h=e.pingedLanes,y=e.warmLanes;e=e.finishedLanes!==0;var A=n&134217727;return A!==0?(n=A&~f,n!==0?i=On(n):(h&=A,h!==0?i=On(h):e||(y=A&~y,y!==0&&(i=On(y))))):(A=n&~f,A!==0?i=On(A):h!==0?i=On(h):e||(y=n&~y,y!==0&&(i=On(y)))),i===0?0:t!==0&&t!==i&&(t&f)===0&&(f=i&-i,y=t&-t,f>=y||f===32&&(y&4194176)!==0)?t:i}function ei(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ug(e,t){switch(e){case 1:case 2:case 4:case 8:return t+250;case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Xc(){var e=pl;return pl<<=1,(pl&4194176)===0&&(pl=128),e}function Zc(){var e=ml;return ml<<=1,(ml&62914560)===0&&(ml=4194304),e}function Pu(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function ti(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Bg(e,t,n,i,f,h){var y=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var A=e.entanglements,M=e.expirationTimes,$=e.hiddenUpdates;for(n=y&~n;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),kg=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),th={},rh={};function Yg(e){return qe.call(rh,e)?!0:qe.call(th,e)?!1:kg.test(e)?rh[e]=!0:(th[e]=!0,!1)}function gl(e,t,n){if(Yg(t))if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var i=t.toLowerCase().slice(0,5);if(i!=="data-"&&i!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+n)}}function vl(e,t,n){if(n===null)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+n)}}function Sr(e,t,n,i){if(i===null)e.removeAttribute(n);else{switch(typeof i){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(n);return}e.setAttributeNS(t,n,""+i)}}function Vt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function nh(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Gg(e){var t=nh(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),i=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var f=n.get,h=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return f.call(this)},set:function(y){i=""+y,h.call(this,y)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return i},setValue:function(y){i=""+y},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function bl(e){e._valueTracker||(e._valueTracker=Gg(e))}function ah(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),i="";return e&&(i=nh(e)?e.checked?"true":"false":e.value),e=i,e!==n?(t.setValue(e),!0):!1}function El(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Vg=/[\n"\\]/g;function It(e){return e.replace(Vg,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function es(e,t,n,i,f,h,y,A){e.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.type=y:e.removeAttribute("type"),t!=null?y==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Vt(t)):e.value!==""+Vt(t)&&(e.value=""+Vt(t)):y!=="submit"&&y!=="reset"||e.removeAttribute("value"),t!=null?ts(e,y,Vt(t)):n!=null?ts(e,y,Vt(n)):i!=null&&e.removeAttribute("value"),f==null&&h!=null&&(e.defaultChecked=!!h),f!=null&&(e.checked=f&&typeof f!="function"&&typeof f!="symbol"),A!=null&&typeof A!="function"&&typeof A!="symbol"&&typeof A!="boolean"?e.name=""+Vt(A):e.removeAttribute("name")}function ih(e,t,n,i,f,h,y,A){if(h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.type=h),t!=null||n!=null){if(!(h!=="submit"&&h!=="reset"||t!=null))return;n=n!=null?""+Vt(n):"",t=t!=null?""+Vt(t):n,A||t===e.value||(e.value=t),e.defaultValue=t}i=i??f,i=typeof i!="function"&&typeof i!="symbol"&&!!i,e.checked=A?e.checked:!!i,e.defaultChecked=!!i,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(e.name=y)}function ts(e,t,n){t==="number"&&El(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function ta(e,t,n,i){if(e=e.options,t){t={};for(var f=0;f=si),vh=" ",bh=!1;function Eh(e,t){switch(e){case"keyup":return vv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ah(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var ia=!1;function Ev(e,t){switch(e){case"compositionend":return Ah(t);case"keypress":return t.which!==32?null:(bh=!0,vh);case"textInput":return e=t.data,e===vh&&bh?null:e;default:return null}}function Av(e,t){if(ia)return e==="compositionend"||!hs&&Eh(e,t)?(e=hh(),_l=us=Zr=null,ia=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=i}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Dh(n)}}function Mh(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Mh(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jh(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=El(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=El(e.document)}return t}function ms(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Dv(e,t){var n=jh(t);t=e.focusedElem;var i=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&Mh(t.ownerDocument.documentElement,t)){if(i!==null&&ms(t)){if(e=i.start,n=i.end,n===void 0&&(n=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(n,t.value.length);else if(n=(e=t.ownerDocument||document)&&e.defaultView||window,n.getSelection){n=n.getSelection();var f=t.textContent.length,h=Math.min(i.start,f);i=i.end===void 0?h:Math.min(i.end,f),!n.extend&&h>i&&(f=i,i=h,h=f),f=Nh(t,h);var y=Nh(t,i);f&&y&&(n.rangeCount!==1||n.anchorNode!==f.node||n.anchorOffset!==f.offset||n.focusNode!==y.node||n.focusOffset!==y.offset)&&(e=e.createRange(),e.setStart(f.node,f.offset),n.removeAllRanges(),h>i?(n.addRange(e),n.extend(y.node,y.offset)):(e.setEnd(y.node,y.offset),n.addRange(e)))}}for(e=[],n=t;n=n.parentNode;)n.nodeType===1&&e.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,la=null,ys=null,hi=null,gs=!1;function Ch(e,t,n){var i=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;gs||la==null||la!==El(i)||(i=la,"selectionStart"in i&&ms(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),hi&&ci(hi,i)||(hi=i,i=ou(ys,"onSelect"),0>=y,f-=y,Or=1<<32-zt(t)+f|n<Ae?(dt=ge,ge=null):dt=ge.sibling;var ze=F(G,ge,Z[Ae],le);if(ze===null){ge===null&&(ge=dt);break}e&&ge&&ze.alternate===null&&t(G,ge),q=h(ze,q,Ae),xe===null?me=ze:xe.sibling=ze,xe=ze,ge=dt}if(Ae===Z.length)return n(G,ge),Le&&jn(G,Ae),me;if(ge===null){for(;AeAe?(dt=ge,ge=null):dt=ge.sibling;var pn=F(G,ge,ze.value,le);if(pn===null){ge===null&&(ge=dt);break}e&&ge&&pn.alternate===null&&t(G,ge),q=h(pn,q,Ae),xe===null?me=pn:xe.sibling=pn,xe=pn,ge=dt}if(ze.done)return n(G,ge),Le&&jn(G,Ae),me;if(ge===null){for(;!ze.done;Ae++,ze=Z.next())ze=oe(G,ze.value,le),ze!==null&&(q=h(ze,q,Ae),xe===null?me=ze:xe.sibling=ze,xe=ze);return Le&&jn(G,Ae),me}for(ge=i(ge);!ze.done;Ae++,ze=Z.next())ze=ne(ge,G,Ae,ze.value,le),ze!==null&&(e&&ze.alternate!==null&&ge.delete(ze.key===null?Ae:ze.key),q=h(ze,q,Ae),xe===null?me=ze:xe.sibling=ze,xe=ze);return e&&ge.forEach(function(Z1){return t(G,Z1)}),Le&&jn(G,Ae),me}function et(G,q,Z,le){if(typeof Z=="object"&&Z!==null&&Z.type===m&&Z.key===null&&(Z=Z.props.children),typeof Z=="object"&&Z!==null){switch(Z.$$typeof){case u:e:{for(var me=Z.key;q!==null;){if(q.key===me){if(me=Z.type,me===m){if(q.tag===7){n(G,q.sibling),le=f(q,Z.props.children),le.return=G,G=le;break e}}else if(q.elementType===me||typeof me=="object"&&me!==null&&me.$$typeof===H&&Fh(me)===q.type){n(G,q.sibling),le=f(q,Z.props),bi(le,Z),le.return=G,G=le;break e}n(G,q);break}else t(G,q);q=q.sibling}Z.type===m?(le=Gn(Z.props.children,G.mode,le,Z.key),le.return=G,G=le):(le=Wl(Z.type,Z.key,Z.props,null,G.mode,le),bi(le,Z),le.return=G,G=le)}return y(G);case d:e:{for(me=Z.key;q!==null;){if(q.key===me)if(q.tag===4&&q.stateNode.containerInfo===Z.containerInfo&&q.stateNode.implementation===Z.implementation){n(G,q.sibling),le=f(q,Z.children||[]),le.return=G,G=le;break e}else{n(G,q);break}else t(G,q);q=q.sibling}le=Eo(Z,G.mode,le),le.return=G,G=le}return y(G);case H:return me=Z._init,Z=me(Z._payload),et(G,q,Z,le)}if(se(Z))return ye(G,q,Z,le);if(x(Z)){if(me=x(Z),typeof me!="function")throw Error(o(150));return Z=me.call(Z),Se(G,q,Z,le)}if(typeof Z.then=="function")return et(G,q,Ll(Z),le);if(Z.$$typeof===C)return et(G,q,Fl(G,Z),le);zl(G,Z)}return typeof Z=="string"&&Z!==""||typeof Z=="number"||typeof Z=="bigint"?(Z=""+Z,q!==null&&q.tag===6?(n(G,q.sibling),le=f(q,Z),le.return=G,G=le):(n(G,q),le=bo(Z,G.mode,le),le.return=G,G=le),y(G)):n(G,q)}return function(G,q,Z,le){try{vi=0;var me=et(G,q,Z,le);return ha=null,me}catch(ge){if(ge===yi)throw ge;var xe=Wt(29,ge,null,G.mode);return xe.lanes=le,xe.return=G,xe}finally{}}}var Ln=Ph(!0),Jh=Ph(!1),da=te(null),Ul=te(0);function Wh(e,t){e=Br,T(Ul,e),T(da,t),Br=e|t.baseLanes}function Os(){T(Ul,Br),T(da,da.current)}function Ts(){Br=Ul.current,E(da),E(Ul)}var Ft=te(null),mr=null;function Kr(e){var t=e.alternate;T(ut,ut.current&1),T(Ft,e),mr===null&&(t===null||da.current!==null||t.memoizedState!==null)&&(mr=e)}function ed(e){if(e.tag===22){if(T(ut,ut.current),T(Ft,e),mr===null){var t=e.alternate;t!==null&&t.memoizedState!==null&&(mr=e)}}else Fr()}function Fr(){T(ut,ut.current),T(Ft,Ft.current)}function Rr(e){E(Ft),mr===e&&(mr=null),E(ut)}var ut=te(0);function Bl(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Lv=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(n,i){e.push(i)}};this.abort=function(){t.aborted=!0,e.forEach(function(n){return n()})}},zv=r.unstable_scheduleCallback,Uv=r.unstable_NormalPriority,st={$$typeof:C,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Rs(){return{controller:new Lv,data:new Map,refCount:0}}function Ei(e){e.refCount--,e.refCount===0&&zv(Uv,function(){e.controller.abort()})}var Ai=null,xs=0,pa=0,ma=null;function Bv(e,t){if(Ai===null){var n=Ai=[];xs=0,pa=zo(),ma={status:"pending",value:void 0,then:function(i){n.push(i)}}}return xs++,t.then(td,td),t}function td(){if(--xs===0&&Ai!==null){ma!==null&&(ma.status="fulfilled");var e=Ai;Ai=null,pa=0,ma=null;for(var t=0;th?h:8;var y=w.T,A={};w.T=A,Is(e,!1,t,n);try{var M=f(),$=w.S;if($!==null&&$(A,M),M!==null&&typeof M=="object"&&typeof M.then=="function"){var ae=qv(M,i);Si(e,t,ae,$t(e))}else Si(e,t,i,$t(e))}catch(oe){Si(e,t,{then:function(){},status:"rejected",reason:oe},$t())}finally{ue.p=h,w.T=y}}function Gv(){}function Gs(e,t,n,i){if(e.tag!==5)throw Error(o(476));var f=jd(e).queue;Md(e,f,t,he,n===null?Gv:function(){return Cd(e),n(i)})}function jd(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:he,baseState:he,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:xr,lastRenderedState:he},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:xr,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Cd(e){var t=jd(e).next.queue;Si(e,t,{},$t())}function Vs(){return _t(Vi)}function Ld(){return at().memoizedState}function zd(){return at().memoizedState}function Vv(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=$t();e=tn(n);var i=rn(t,e,n);i!==null&&(Tt(i,t,n),Ri(i,t,n)),t={cache:Rs()},e.payload=t;return}t=t.return}}function Iv(e,t,n){var i=$t();n={lane:i,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Xl(e)?Bd(t,n):(n=Es(e,t,n,i),n!==null&&(Tt(n,e,i),qd(n,t,i)))}function Ud(e,t,n){var i=$t();Si(e,t,n,i)}function Si(e,t,n,i){var f={lane:i,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Xl(e))Bd(t,f);else{var h=e.alternate;if(e.lanes===0&&(h===null||h.lanes===0)&&(h=t.lastRenderedReducer,h!==null))try{var y=t.lastRenderedState,A=h(y,n);if(f.hasEagerState=!0,f.eagerState=A,Ut(A,y))return Dl(e,t,f,0),Ve===null&&xl(),!1}catch{}finally{}if(n=Es(e,t,f,i),n!==null)return Tt(n,e,i),qd(n,t,i),!0}return!1}function Is(e,t,n,i){if(i={lane:2,revertLane:zo(),action:i,hasEagerState:!1,eagerState:null,next:null},Xl(e)){if(t)throw Error(o(479))}else t=Es(e,n,i,2),t!==null&&Tt(t,e,2)}function Xl(e){var t=e.alternate;return e===Re||t!==null&&t===Re}function Bd(e,t){ya=Hl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function qd(e,t,n){if((n&4194176)!==0){var i=t.lanes;i&=e.pendingLanes,n|=i,t.lanes=n,Kc(e,n)}}var yr={readContext:_t,use:Yl,useCallback:rt,useContext:rt,useEffect:rt,useImperativeHandle:rt,useLayoutEffect:rt,useInsertionEffect:rt,useMemo:rt,useReducer:rt,useRef:rt,useState:rt,useDebugValue:rt,useDeferredValue:rt,useTransition:rt,useSyncExternalStore:rt,useId:rt};yr.useCacheRefresh=rt,yr.useMemoCache=rt,yr.useHostTransitionStatus=rt,yr.useFormState=rt,yr.useActionState=rt,yr.useOptimistic=rt;var Bn={readContext:_t,use:Yl,useCallback:function(e,t){return Mt().memoizedState=[e,t===void 0?null:t],e},useContext:_t,useEffect:wd,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,Vl(4194308,4,Td.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Vl(4194308,4,e,t)},useInsertionEffect:function(e,t){Vl(4,2,e,t)},useMemo:function(e,t){var n=Mt();t=t===void 0?null:t;var i=e();if(Un){Ir(!0);try{e()}finally{Ir(!1)}}return n.memoizedState=[i,t],i},useReducer:function(e,t,n){var i=Mt();if(n!==void 0){var f=n(t);if(Un){Ir(!0);try{n(t)}finally{Ir(!1)}}}else f=t;return i.memoizedState=i.baseState=f,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:f},i.queue=e,e=e.dispatch=Iv.bind(null,Re,e),[i.memoizedState,e]},useRef:function(e){var t=Mt();return e={current:e},t.memoizedState=e},useState:function(e){e=qs(e);var t=e.queue,n=Ud.bind(null,Re,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ks,useDeferredValue:function(e,t){var n=Mt();return Ys(n,e,t)},useTransition:function(){var e=qs(!1);return e=Md.bind(null,Re,e.queue,!0,!1),Mt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var i=Re,f=Mt();if(Le){if(n===void 0)throw Error(o(407));n=n()}else{if(n=t(),Ve===null)throw Error(o(349));(je&60)!==0||ud(i,t,n)}f.memoizedState=n;var h={value:n,getSnapshot:t};return f.queue=h,wd(od.bind(null,i,h,e),[e]),i.flags|=2048,va(9,sd.bind(null,i,h,n,t),{destroy:void 0},null),n},useId:function(){var e=Mt(),t=Ve.identifierPrefix;if(Le){var n=Tr,i=Or;n=(i&~(1<<32-zt(i)-1)).toString(32)+n,t=":"+t+"R"+n,n=$l++,0 title"))),yt(h,i,n),h[At]=e,ft(h),i=h;break e;case"link":var y=cm("link","href",f).get(i+(n.href||""));if(y){for(var A=0;A<\/script>",e=e.removeChild(e.firstChild);break;case"select":e=typeof i.is=="string"?f.createElement("select",{is:i.is}):f.createElement("select"),i.multiple?e.multiple=!0:i.size&&(e.size=i.size);break;default:e=typeof i.is=="string"?f.createElement(n,{is:i.is}):f.createElement(n)}}e[At]=t,e[Dt]=i;e:for(f=t.child;f!==null;){if(f.tag===5||f.tag===6)e.appendChild(f.stateNode);else if(f.tag!==4&&f.tag!==27&&f.child!==null){f.child.return=f,f=f.child;continue}if(f===t)break e;for(;f.sibling===null;){if(f.return===null||f.return===t)break e;f=f.return}f.sibling.return=f.return,f=f.sibling}t.stateNode=e;e:switch(yt(e,n,i),n){case"button":case"input":case"select":case"textarea":e=!!i.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&zr(t)}}return Qe(t),t.flags&=-16777217,null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==i&&zr(t);else{if(typeof i!="string"&&t.stateNode===null)throw Error(o(166));if(e=ie.current,di(t)){if(e=t.stateNode,n=t.memoizedProps,i=null,f=Ot,f!==null)switch(f.tag){case 27:case 5:i=f.memoizedProps}e[At]=t,e=!!(e.nodeValue===n||i!==null&&i.suppressHydrationWarning===!0||Wp(e.nodeValue,n)),e||Cn(t)}else e=cu(e).createTextNode(i),e[At]=t,t.stateNode=e}return Qe(t),null;case 13:if(i=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(f=di(t),i!==null&&i.dehydrated!==null){if(e===null){if(!f)throw Error(o(318));if(f=t.memoizedState,f=f!==null?f.dehydrated:null,!f)throw Error(o(317));f[At]=t}else pi(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Qe(t),f=!1}else lr!==null&&(xo(lr),lr=null),f=!0;if(!f)return t.flags&256?(Rr(t),t):(Rr(t),null)}if(Rr(t),(t.flags&128)!==0)return t.lanes=n,t;if(n=i!==null,e=e!==null&&e.memoizedState!==null,n){i=t.child,f=null,i.alternate!==null&&i.alternate.memoizedState!==null&&i.alternate.memoizedState.cachePool!==null&&(f=i.alternate.memoizedState.cachePool.pool);var h=null;i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(h=i.memoizedState.cachePool.pool),h!==f&&(i.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),eu(t,t.updateQueue),Qe(t),null;case 4:return De(),e===null&&Ho(t.stateNode.containerInfo),Qe(t),null;case 10:return Mr(t.type),Qe(t),null;case 19:if(E(ut),f=t.memoizedState,f===null)return Qe(t),null;if(i=(t.flags&128)!==0,h=f.rendering,h===null)if(i)Li(f,!1);else{if(We!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(h=Bl(e),h!==null){for(t.flags|=128,Li(f,!1),e=h.updateQueue,t.updateQueue=e,eu(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Rp(n,e),n=n.sibling;return T(ut,ut.current&1|2),t.child}e=e.sibling}f.tail!==null&&Ct()>tu&&(t.flags|=128,i=!0,Li(f,!1),t.lanes=4194304)}else{if(!i)if(e=Bl(h),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,eu(t,e),Li(f,!0),f.tail===null&&f.tailMode==="hidden"&&!h.alternate&&!Le)return Qe(t),null}else 2*Ct()-f.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,Li(f,!1),t.lanes=4194304);f.isBackwards?(h.sibling=t.child,t.child=h):(e=f.last,e!==null?e.sibling=h:t.child=h,f.last=h)}return f.tail!==null?(t=f.tail,f.rendering=t,f.tail=t.sibling,f.renderingStartTime=Ct(),t.sibling=null,e=ut.current,T(ut,i?e&1|2:e&1),t):(Qe(t),null);case 22:case 23:return Rr(t),Ts(),i=t.memoizedState!==null,e!==null?e.memoizedState!==null!==i&&(t.flags|=8192):i&&(t.flags|=8192),i?(n&536870912)!==0&&(t.flags&128)===0&&(Qe(t),t.subtreeFlags&6&&(t.flags|=8192)):Qe(t),n=t.updateQueue,n!==null&&eu(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),i=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(i=t.memoizedState.cachePool.pool),i!==n&&(t.flags|=2048),e!==null&&E(zn),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Mr(st),Qe(t),null;case 25:return null}throw Error(o(156,t.tag))}function Jv(e,t){switch(_s(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Mr(st),De(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ge(t),null;case 13:if(Rr(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));pi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return E(ut),null;case 4:return De(),null;case 10:return Mr(t.type),null;case 22:case 23:return Rr(t),Ts(),e!==null&&E(zn),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Mr(st),null;case 25:return null;default:return null}}function Np(e,t){switch(_s(t),t.tag){case 3:Mr(st),De();break;case 26:case 27:case 5:Ge(t);break;case 4:De();break;case 13:Rr(t);break;case 19:E(ut);break;case 10:Mr(t.type);break;case 22:case 23:Rr(t),Ts(),e!==null&&E(zn);break;case 24:Mr(st)}}var Wv={getCacheForType:function(e){var t=_t(st),n=t.data.get(e);return n===void 0&&(n=e(),t.data.set(e,n)),n}},e1=typeof WeakMap=="function"?WeakMap:Map,Ke=0,Ve=null,Ne=null,je=0,Ie=0,Ht=null,Ur=!1,_a=!1,Ao=!1,Br=0,We=0,sn=0,Vn=0,_o=0,er=0,wa=0,zi=null,gr=null,wo=!1,So=0,tu=1/0,ru=null,on=null,nu=!1,In=null,Ui=0,Oo=0,To=null,Bi=0,Ro=null;function $t(){if((Ke&2)!==0&&je!==0)return je&-je;if(w.T!==null){var e=pa;return e!==0?e:zo()}return Pc()}function Mp(){er===0&&(er=(je&536870912)===0||Le?Xc():536870912);var e=Ft.current;return e!==null&&(e.flags|=32),er}function Tt(e,t,n){(e===Ve&&Ie===2||e.cancelPendingCommit!==null)&&(Sa(e,0),qr(e,je,er,!1)),ti(e,n),((Ke&2)===0||e!==Ve)&&(e===Ve&&((Ke&2)===0&&(Vn|=n),We===4&&qr(e,je,er,!1)),vr(e))}function jp(e,t,n){if((Ke&6)!==0)throw Error(o(327));var i=!n&&(t&60)===0&&(t&e.expiredLanes)===0||ei(e,t),f=i?n1(e,t):Mo(e,t,!0),h=i;do{if(f===0){_a&&!i&&qr(e,t,0,!1);break}else if(f===6)qr(e,t,0,!Ur);else{if(n=e.current.alternate,h&&!t1(n)){f=Mo(e,t,!1),h=!1;continue}if(f===2){if(h=t,e.errorRecoveryDisabledLanes&h)var y=0;else y=e.pendingLanes&-536870913,y=y!==0?y:y&536870912?536870912:0;if(y!==0){t=y;e:{var A=e;f=zi;var M=A.current.memoizedState.isDehydrated;if(M&&(Sa(A,y).flags|=256),y=Mo(A,y,!1),y!==2){if(Ao&&!M){A.errorRecoveryDisabledLanes|=h,Vn|=h,f=4;break e}h=gr,gr=f,h!==null&&xo(h)}f=y}if(h=!1,f!==2)continue}}if(f===1){Sa(e,0),qr(e,t,0,!0);break}e:{switch(i=e,f){case 0:case 1:throw Error(o(345));case 4:if((t&4194176)===t){qr(i,t,er,!Ur);break e}break;case 2:gr=null;break;case 3:case 5:break;default:throw Error(o(329))}if(i.finishedWork=n,i.finishedLanes=t,(t&62914560)===t&&(h=So+300-Ct(),10n?32:n,w.T=null,In===null)var h=!1;else{n=To,To=null;var y=In,A=Ui;if(In=null,Ui=0,(Ke&6)!==0)throw Error(o(331));var M=Ke;if(Ke|=4,Op(y.current),_p(y,y.current,A,n),Ke=M,qi(0,!1),Lt&&typeof Lt.onPostCommitFiberRoot=="function")try{Lt.onPostCommitFiberRoot(Wa,y)}catch{}h=!0}return h}finally{ue.p=f,w.T=i,kp(e,t)}}return!1}function Yp(e,t,n){t=Zt(n,t),t=Qs(e.stateNode,t,2),e=rn(e,t,2),e!==null&&(ti(e,2),vr(e))}function Ye(e,t,n){if(e.tag===3)Yp(e,e,n);else for(;t!==null;){if(t.tag===3){Yp(t,e,n);break}else if(t.tag===1){var i=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(on===null||!on.has(i))){e=Zt(n,e),n=Id(2),i=rn(t,n,2),i!==null&&(Xd(n,i,t,e),ti(i,2),vr(i));break}}t=t.return}}function jo(e,t,n){var i=e.pingCache;if(i===null){i=e.pingCache=new e1;var f=new Set;i.set(t,f)}else f=i.get(t),f===void 0&&(f=new Set,i.set(t,f));f.has(n)||(Ao=!0,f.add(n),e=l1.bind(null,e,t,n),t.then(e,e))}function l1(e,t,n){var i=e.pingCache;i!==null&&i.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Ve===e&&(je&n)===n&&(We===4||We===3&&(je&62914560)===je&&300>Ct()-So?(Ke&2)===0&&Sa(e,0):_o|=n,wa===je&&(wa=0)),vr(e)}function Gp(e,t){t===0&&(t=Zc()),e=Qr(e,t),e!==null&&(ti(e,t),vr(e))}function u1(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Gp(e,n)}function s1(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,f=e.memoizedState;f!==null&&(n=f.retryLane);break;case 19:i=e.stateNode;break;case 22:i=e.stateNode._retryCache;break;default:throw Error(o(314))}i!==null&&i.delete(t),Gp(e,n)}function o1(e,t){return Ze(e,t)}var lu=null,Ra=null,Co=!1,uu=!1,Lo=!1,Xn=0;function vr(e){e!==Ra&&e.next===null&&(Ra===null?lu=Ra=e:Ra=Ra.next=e),uu=!0,Co||(Co=!0,c1(f1))}function qi(e,t){if(!Lo&&uu){Lo=!0;do for(var n=!1,i=lu;i!==null;){if(e!==0){var f=i.pendingLanes;if(f===0)var h=0;else{var y=i.suspendedLanes,A=i.pingedLanes;h=(1<<31-zt(42|e)+1)-1,h&=f&~(y&~A),h=h&201326677?h&201326677|1:h?h|2:0}h!==0&&(n=!0,Xp(i,h))}else h=je,h=yl(i,i===Ve?h:0),(h&3)===0||ei(i,h)||(n=!0,Xp(i,h));i=i.next}while(n);Lo=!1}}function f1(){uu=Co=!1;var e=0;Xn!==0&&(b1()&&(e=Xn),Xn=0);for(var t=Ct(),n=null,i=lu;i!==null;){var f=i.next,h=Vp(i,t);h===0?(i.next=null,n===null?lu=f:n.next=f,f===null&&(Ra=n)):(n=i,(e!==0||(h&3)!==0)&&(uu=!0)),i=f}qi(e)}function Vp(e,t){for(var n=e.suspendedLanes,i=e.pingedLanes,f=e.expirationTimes,h=e.pendingLanes&-62914561;0"u"?null:document;function um(e,t,n){var i=Da;if(i&&typeof t=="string"&&t){var f=It(t);f='link[rel="'+e+'"][href="'+f+'"]',typeof n=="string"&&(f+='[crossorigin="'+n+'"]'),lm.has(f)||(lm.add(f),e={rel:e,crossOrigin:n,href:t},i.querySelector(f)===null&&(t=i.createElement("link"),yt(t,"link",e),ft(t),i.head.appendChild(t)))}}function R1(e){Hr.D(e),um("dns-prefetch",e,null)}function x1(e,t){Hr.C(e,t),um("preconnect",e,t)}function D1(e,t,n){Hr.L(e,t,n);var i=Da;if(i&&e&&t){var f='link[rel="preload"][as="'+It(t)+'"]';t==="image"&&n&&n.imageSrcSet?(f+='[imagesrcset="'+It(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(f+='[imagesizes="'+It(n.imageSizes)+'"]')):f+='[href="'+It(e)+'"]';var h=f;switch(t){case"style":h=Na(e);break;case"script":h=Ma(e)}tr.has(h)||(e=b({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),tr.set(h,e),i.querySelector(f)!==null||t==="style"&&i.querySelector(ki(h))||t==="script"&&i.querySelector(Yi(h))||(t=i.createElement("link"),yt(t,"link",e),ft(t),i.head.appendChild(t)))}}function N1(e,t){Hr.m(e,t);var n=Da;if(n&&e){var i=t&&typeof t.as=="string"?t.as:"script",f='link[rel="modulepreload"][as="'+It(i)+'"][href="'+It(e)+'"]',h=f;switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":h=Ma(e)}if(!tr.has(h)&&(e=b({rel:"modulepreload",href:e},t),tr.set(h,e),n.querySelector(f)===null)){switch(i){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Yi(h)))return}i=n.createElement("link"),yt(i,"link",e),ft(i),n.head.appendChild(i)}}}function M1(e,t,n){Hr.S(e,t,n);var i=Da;if(i&&e){var f=Wn(i).hoistableStyles,h=Na(e);t=t||"default";var y=f.get(h);if(!y){var A={loading:0,preload:null};if(y=i.querySelector(ki(h)))A.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},n),(n=tr.get(h))&&Qo(e,n);var M=y=i.createElement("link");ft(M),yt(M,"link",e),M._p=new Promise(function($,ae){M.onload=$,M.onerror=ae}),M.addEventListener("load",function(){A.loading|=1}),M.addEventListener("error",function(){A.loading|=2}),A.loading|=4,du(y,t,i)}y={type:"stylesheet",instance:y,count:1,state:A},f.set(h,y)}}}function j1(e,t){Hr.X(e,t);var n=Da;if(n&&e){var i=Wn(n).hoistableScripts,f=Ma(e),h=i.get(f);h||(h=n.querySelector(Yi(f)),h||(e=b({src:e,async:!0},t),(t=tr.get(f))&&Ko(e,t),h=n.createElement("script"),ft(h),yt(h,"link",e),n.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},i.set(f,h))}}function C1(e,t){Hr.M(e,t);var n=Da;if(n&&e){var i=Wn(n).hoistableScripts,f=Ma(e),h=i.get(f);h||(h=n.querySelector(Yi(f)),h||(e=b({src:e,async:!0,type:"module"},t),(t=tr.get(f))&&Ko(e,t),h=n.createElement("script"),ft(h),yt(h,"link",e),n.head.appendChild(h)),h={type:"script",instance:h,count:1,state:null},i.set(f,h))}}function sm(e,t,n,i){var f=(f=ie.current)?hu(f):null;if(!f)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=Na(n.href),n=Wn(f).hoistableStyles,i=n.get(t),i||(i={type:"style",instance:null,count:0,state:null},n.set(t,i)),i):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Na(n.href);var h=Wn(f).hoistableStyles,y=h.get(e);if(y||(f=f.ownerDocument||f,y={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},h.set(e,y),(h=f.querySelector(ki(e)))&&!h._p&&(y.instance=h,y.state.loading=5),tr.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},tr.set(e,n),h||L1(f,e,n,y.state))),t&&i===null)throw Error(o(528,""));return y}if(t&&i!==null)throw Error(o(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ma(n),n=Wn(f).hoistableScripts,i=n.get(t),i||(i={type:"script",instance:null,count:0,state:null},n.set(t,i)),i):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Na(e){return'href="'+It(e)+'"'}function ki(e){return'link[rel="stylesheet"]['+e+"]"}function om(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function L1(e,t,n,i){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?i.loading=1:(t=e.createElement("link"),i.preload=t,t.addEventListener("load",function(){return i.loading|=1}),t.addEventListener("error",function(){return i.loading|=2}),yt(t,"link",n),ft(t),e.head.appendChild(t))}function Ma(e){return'[src="'+It(e)+'"]'}function Yi(e){return"script[async]"+e}function fm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var i=e.querySelector('style[data-href~="'+It(n.href)+'"]');if(i)return t.instance=i,ft(i),i;var f=b({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return i=(e.ownerDocument||e).createElement("style"),ft(i),yt(i,"style",f),du(i,n.precedence,e),t.instance=i;case"stylesheet":f=Na(n.href);var h=e.querySelector(ki(f));if(h)return t.state.loading|=4,t.instance=h,ft(h),h;i=om(n),(f=tr.get(f))&&Qo(i,f),h=(e.ownerDocument||e).createElement("link"),ft(h);var y=h;return y._p=new Promise(function(A,M){y.onload=A,y.onerror=M}),yt(h,"link",i),t.state.loading|=4,du(h,n.precedence,e),t.instance=h;case"script":return h=Ma(n.src),(f=e.querySelector(Yi(h)))?(t.instance=f,ft(f),f):(i=n,(f=tr.get(h))&&(i=b({},n),Ko(i,f)),e=e.ownerDocument||e,f=e.createElement("script"),ft(f),yt(f,"link",i),e.head.appendChild(f),t.instance=f);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(i=t.instance,t.state.loading|=4,du(i,n.precedence,e));return t.instance}function du(e,t,n){for(var i=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),f=i.length?i[i.length-1]:null,h=f,y=0;y title"):null)}function z1(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function dm(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}var Gi=null;function U1(){}function B1(e,t,n){if(Gi===null)throw Error(o(475));var i=Gi;if(t.type==="stylesheet"&&(typeof n.media!="string"||matchMedia(n.media).matches!==!1)&&(t.state.loading&4)===0){if(t.instance===null){var f=Na(n.href),h=e.querySelector(ki(f));if(h){e=h._p,e!==null&&typeof e=="object"&&typeof e.then=="function"&&(i.count++,i=mu.bind(i),e.then(i,i)),t.state.loading|=4,t.instance=h,ft(h);return}h=e.ownerDocument||e,n=om(n),(f=tr.get(f))&&Qo(n,f),h=h.createElement("link"),ft(h);var y=h;y._p=new Promise(function(A,M){y.onload=A,y.onerror=M}),yt(h,"link",n),t.instance=h}i.stylesheets===null&&(i.stylesheets=new Map),i.stylesheets.set(t,e),(e=t.state.preload)&&(t.state.loading&3)===0&&(i.count++,t=mu.bind(i),e.addEventListener("load",t),e.addEventListener("error",t))}}function q1(){if(Gi===null)throw Error(o(475));var e=Gi;return e.stylesheets&&e.count===0&&Fo(e,e.stylesheets),0"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(a){console.error(a)}}return r(),lf.exports=tb(),lf.exports}var nb=rb();const ab=Ec(nb);var ib=typeof window<"u",lb=function(r,a){return ib?window.matchMedia(r).matches:!1},ub=function(r,a){var s=pe.useState(lb(r)),o=s[0],c=s[1];return pe.useEffect(function(){var l=!0,u=window.matchMedia(r),d=function(){l&&c(!!u.matches)};return u.addEventListener("change",d),c(u.matches),function(){l=!1,u.removeEventListener("change",d)}},[r]),o},br={STATIC:"STATIC",DEFAULT:"DEFAULT",TARGETING_MATCH:"TARGETING_MATCH",ERROR:"ERROR"},Kn=(r=>(r.PROVIDER_NOT_READY="PROVIDER_NOT_READY",r.PROVIDER_FATAL="PROVIDER_FATAL",r.FLAG_NOT_FOUND="FLAG_NOT_FOUND",r.PARSE_ERROR="PARSE_ERROR",r.TYPE_MISMATCH="TYPE_MISMATCH",r.TARGETING_KEY_MISSING="TARGETING_KEY_MISSING",r.INVALID_CONTEXT="INVALID_CONTEXT",r.GENERAL="GENERAL",r))(Kn||{}),f0=class c0 extends Error{constructor(a,s){super(a),Object.setPrototypeOf(this,c0.prototype),this.name="OpenFeatureError",this.cause=s==null?void 0:s.cause}},zm=class h0 extends f0{constructor(a,s){super(a,s),Object.setPrototypeOf(this,h0.prototype),this.name="GeneralError",this.code="GENERAL"}},ff=class d0 extends f0{constructor(a,s){super(a,s),Object.setPrototypeOf(this,d0.prototype),this.name="ParseError",this.code="PARSE_ERROR"}},p0=class{error(...r){console.error(...r)}warn(...r){console.warn(...r)}info(){}debug(){}},sb=["error","warn","info","debug"],ob=class{constructor(r){this.fallbackLogger=new p0;try{for(const a of sb)if(!r[a]||typeof r[a]!="function")throw new Error(`The provided logger is missing the ${a} method.`);this.logger=r}catch(a){console.error(a),console.error("Falling back to the default logger."),this.logger=this.fallbackLogger}}error(...r){this.log("error",...r)}warn(...r){this.log("warn",...r)}info(...r){this.log("info",...r)}debug(...r){this.log("debug",...r)}log(r,...a){try{this.logger[r](...a)}catch{this.fallbackLogger[r](...a)}}};function Su(r){throw new Error('Could not dynamically require "'+r+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var cf={exports:{}},Um;function fb(){return Um||(Um=1,(function(r,a){(function(s){r.exports=s()})(function(){return(function s(o,c,l){function u(p,g){if(!c[p]){if(!o[p]){var v=typeof Su=="function"&&Su;if(!g&&v)return v(p,!0);if(d)return d(p,!0);throw new Error("Cannot find module '"+p+"'")}g=c[p]={exports:{}},o[p][0].call(g.exports,function(R){var C=o[p][1][R];return u(C||R)},g,g.exports,s,o,c,l)}return c[p].exports}for(var d=typeof Su=="function"&&Su,m=0;m>16),z((65280&E)>>8),z(255&E);return q==2?z(255&(E=U(_.charAt(w))<<2|U(_.charAt(w+1))>>4)):q==1&&(z((E=U(_.charAt(w))<<10|U(_.charAt(w+1))<<4|U(_.charAt(w+2))>>2)>>8&255),z(255&E)),G},C.fromByteArray=function(_){var w,E,q,G,ce=_.length%3,K="";function z(x){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(x)}for(w=0,q=_.length-ce;w>18&63)+z(G>>12&63)+z(G>>6&63)+z(63&G);switch(ce){case 1:K=(K+=z((E=_[_.length-1])>>2))+z(E<<4&63)+"==";break;case 2:K=(K=(K+=z((E=(_[_.length-2]<<8)+_[_.length-1])>>10))+z(E>>4&63))+z(E<<2&63)+"="}return K}})(c===void 0?this.base64js={}:c)}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:11}],3:[function(s,f,c){(function(u,l,D,m,p,g,v,T,j){var C=s("base64-js"),N=s("ieee754");function D(b,S,L){if(!(this instanceof D))return new D(b,S,L);var ae,ue,oe,Ee,Te=typeof b;if(S==="base64"&&Te=="string")for(b=(Ee=b).trim?Ee.trim():Ee.replace(/^\s+|\s+$/g,"");b.length%4!=0;)b+="=";if(Te=="number")ae=P(b);else if(Te=="string")ae=D.byteLength(b,S);else{if(Te!="object")throw new Error("First argument needs to be a number, array or string.");ae=P(b.length)}if(D._useTypedArrays?ue=D._augment(new Uint8Array(ae)):((ue=this).length=ae,ue._isBuffer=!0),D._useTypedArrays&&typeof b.byteLength=="number")ue._set(b);else if(J(Ee=b)||D.isBuffer(Ee)||Ee&&typeof Ee=="object"&&typeof Ee.length=="number")for(oe=0;oe>8,Ee=Ee%256,Te.push(Ee),Te.push(oe);return Te})(S),b,L,ae)}function I(b,S,L){var ae="";L=Math.min(b.length,L);for(var ue=S;ue>>0)):(S+1>>0),ue}function R(b,S,L,ae){if(ae||(B(typeof L=="boolean","missing or invalid endian"),B(S!=null,"missing offset"),B(S+1>>8*(ae?oe:1-oe)}function q(b,S,L,ae,ue){if(ue||(B(S!=null,"missing value"),B(typeof ae=="boolean","missing or invalid endian"),B(L!=null,"missing offset"),B(L+3>>8*(ae?oe:3-oe)&255}function G(b,S,L,ae,ue){ue||(B(S!=null,"missing value"),B(typeof ae=="boolean","missing or invalid endian"),B(L!=null,"missing offset"),B(L+1this.length&&(ae=this.length);var ue=(ae=b.length-S=this.length))return this[b]},D.prototype.readUInt16LE=function(b,S){return W(this,b,!0,S)},D.prototype.readUInt16BE=function(b,S){return W(this,b,!1,S)},D.prototype.readUInt32LE=function(b,S){return te(this,b,!0,S)},D.prototype.readUInt32BE=function(b,S){return te(this,b,!1,S)},D.prototype.readInt8=function(b,S){if(S||(B(b!=null,"missing offset"),B(b=this.length))return 128&this[b]?-1*(255-this[b]+1):this[b]},D.prototype.readInt16LE=function(b,S){return R(this,b,!0,S)},D.prototype.readInt16BE=function(b,S){return R(this,b,!1,S)},D.prototype.readInt32LE=function(b,S){return U(this,b,!0,S)},D.prototype.readInt32BE=function(b,S){return U(this,b,!1,S)},D.prototype.readFloatLE=function(b,S){return _(this,b,!0,S)},D.prototype.readFloatBE=function(b,S){return _(this,b,!1,S)},D.prototype.readDoubleLE=function(b,S){return w(this,b,!0,S)},D.prototype.readDoubleBE=function(b,S){return w(this,b,!1,S)},D.prototype.writeUInt8=function(b,S,L){L||(B(b!=null,"missing value"),B(S!=null,"missing offset"),B(S=this.length||(this[S]=b)},D.prototype.writeUInt16LE=function(b,S,L){E(this,b,S,!0,L)},D.prototype.writeUInt16BE=function(b,S,L){E(this,b,S,!1,L)},D.prototype.writeUInt32LE=function(b,S,L){q(this,b,S,!0,L)},D.prototype.writeUInt32BE=function(b,S,L){q(this,b,S,!1,L)},D.prototype.writeInt8=function(b,S,L){L||(B(b!=null,"missing value"),B(S!=null,"missing offset"),B(S=this.length||(0<=b?this.writeUInt8(b,S,L):this.writeUInt8(255+b+1,S,L))},D.prototype.writeInt16LE=function(b,S,L){G(this,b,S,!0,L)},D.prototype.writeInt16BE=function(b,S,L){G(this,b,S,!1,L)},D.prototype.writeInt32LE=function(b,S,L){ce(this,b,S,!0,L)},D.prototype.writeInt32BE=function(b,S,L){ce(this,b,S,!1,L)},D.prototype.writeFloatLE=function(b,S,L){K(this,b,S,!0,L)},D.prototype.writeFloatBE=function(b,S,L){K(this,b,S,!1,L)},D.prototype.writeDoubleLE=function(b,S,L){z(this,b,S,!0,L)},D.prototype.writeDoubleBE=function(b,S,L){z(this,b,S,!1,L)},D.prototype.fill=function(b,S,L){if(S=S||0,L=L||this.length,B(typeof(b=typeof(b=b||0)=="string"?b.charCodeAt(0):b)=="number"&&!isNaN(b),"value is not a number"),B(S<=L,"end < start"),L!==S&&this.length!==0){B(0<=S&&S"},D.prototype.toArrayBuffer=function(){if(typeof Uint8Array>"u")throw new Error("Buffer.toArrayBuffer not supported in this browser");if(D._useTypedArrays)return new D(this).buffer;for(var b=new Uint8Array(this.length),S=0,L=b.length;S=S.length||ue>=b.length);ue++)S[ue+L]=b[ue];return ue}function ie(b){try{return decodeURIComponent(b)}catch{return"�"}}function he(b,S){B(typeof b=="number","cannot write a non-number as a number"),B(0<=b,"specified a negative value for writing an unsigned value"),B(b<=S,"value is larger than maximum value for type"),B(Math.floor(b)===b,"value has a fractional component")}function de(b,S,L){B(typeof b=="number","cannot write a non-number as a number"),B(b<=S,"value larger than maximum allowed value"),B(L<=b,"value smaller than minimum allowed value"),B(Math.floor(b)===b,"value has a fractional component")}function Re(b,S,L){B(typeof b=="number","cannot write a non-number as a number"),B(b<=S,"value larger than maximum allowed value"),B(L<=b,"value smaller than minimum allowed value")}function B(b,S){if(!b)throw new Error(S||"Failed assertion")}D._augment=function(b){return b._isBuffer=!0,b._get=b.get,b._set=b.set,b.get=x.get,b.set=x.set,b.write=x.write,b.toString=x.toString,b.toLocaleString=x.toString,b.toJSON=x.toJSON,b.copy=x.copy,b.slice=x.slice,b.readUInt8=x.readUInt8,b.readUInt16LE=x.readUInt16LE,b.readUInt16BE=x.readUInt16BE,b.readUInt32LE=x.readUInt32LE,b.readUInt32BE=x.readUInt32BE,b.readInt8=x.readInt8,b.readInt16LE=x.readInt16LE,b.readInt16BE=x.readInt16BE,b.readInt32LE=x.readInt32LE,b.readInt32BE=x.readInt32BE,b.readFloatLE=x.readFloatLE,b.readFloatBE=x.readFloatBE,b.readDoubleLE=x.readDoubleLE,b.readDoubleBE=x.readDoubleBE,b.writeUInt8=x.writeUInt8,b.writeUInt16LE=x.writeUInt16LE,b.writeUInt16BE=x.writeUInt16BE,b.writeUInt32LE=x.writeUInt32LE,b.writeUInt32BE=x.writeUInt32BE,b.writeInt8=x.writeInt8,b.writeInt16LE=x.writeInt16LE,b.writeInt16BE=x.writeInt16BE,b.writeInt32LE=x.writeInt32LE,b.writeInt32BE=x.writeInt32BE,b.writeFloatLE=x.writeFloatLE,b.writeFloatBE=x.writeFloatBE,b.writeDoubleLE=x.writeDoubleLE,b.writeDoubleBE=x.writeDoubleBE,b.fill=x.fill,b.inspect=x.inspect,b.toArrayBuffer=x.toArrayBuffer,b}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(s,f,c){(function(u,l,C,m,p,g,v,T,j){var C=s("buffer").Buffer,N=4,D=new C(N);D.fill(0),f.exports={hash:function(X,k,I,W){for(var te=k((function(E,q){E.length%N!=0&&(G=E.length+(N-E.length%N),E=C.concat([E,D],G));for(var G,ce=[],K=q?E.readInt32BE:E.readInt32LE,z=0;zI?Z=x(Z):Z.length>5]|=128<>>9<<4)]=U;for(var _=1732584193,w=-271733879,E=-1732584194,q=271733878,G=0;G>>32-E,_)}function X(R,U,_,w,E,q,G){return D(U&_|~U&w,R,U,E,q,G)}function k(R,U,_,w,E,q,G){return D(U&w|_&~w,R,U,E,q,G)}function I(R,U,_,w,E,q,G){return D(U^_^w,R,U,E,q,G)}function W(R,U,_,w,E,q,G){return D(_^(U|~w),R,U,E,q,G)}function te(R,U){var _=(65535&R)+(65535&U);return(R>>16)+(U>>16)+(_>>16)<<16|65535&_}f.exports=function(R){return C.hash(R,N,16)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],7:[function(s,f,c){(function(u,l,d,m,p,g,v,T,j){f.exports=function(C){for(var N,D=new Array(C),X=0;X>>((3&X)<<3)&255;return D}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:11}],8:[function(s,f,c){(function(u,l,d,m,p,g,v,T,j){var C=s("./helpers");function N(k,I){k[I>>5]|=128<<24-I%32,k[15+(I+64>>9<<4)]=I;for(var W,te,R,U=Array(80),_=1732584193,w=-271733879,E=-1732584194,q=271733878,G=-1009589776,ce=0;ce>16)+(I>>16)+(W>>16)<<16|65535&W}function X(k,I){return k<>>32-I}f.exports=function(k){return C.hash(k,N,20,!0)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],9:[function(s,f,c){(function(u,l,d,m,p,g,v,T,j){function C(I,W){var te=(65535&I)+(65535&W);return(I>>16)+(W>>16)+(te>>16)<<16|65535&te}function N(I,W){var te,R=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),U=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),_=new Array(64);I[W>>5]|=128<<24-W%32,I[15+(W+64>>9<<4)]=W;for(var w,E,q=0;q>>W|I<<32-W},k=function(I,W){return I>>>W};f.exports=function(I){return D.hash(I,N,32,!0)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],10:[function(s,f,c){(function(u,l,d,m,p,g,v,T,j){c.read=function(C,N,D,X,q){var I,W,te=8*q-X-1,R=(1<>1,_=-7,w=D?q-1:0,E=D?-1:1,q=C[N+w];for(w+=E,I=q&(1<<-_)-1,q>>=-_,_+=te;0<_;I=256*I+C[N+w],w+=E,_-=8);for(W=I&(1<<-_)-1,I>>=-_,_+=X;0<_;W=256*W+C[N+w],w+=E,_-=8);if(I===0)I=1-U;else{if(I===R)return W?NaN:1/0*(q?-1:1);W+=Math.pow(2,X),I-=U}return(q?-1:1)*W*Math.pow(2,I-X)},c.write=function(C,N,D,X,k,G){var W,te,R=8*G-k-1,U=(1<>1,w=k===23?Math.pow(2,-24)-Math.pow(2,-77):0,E=X?0:G-1,q=X?1:-1,G=N<0||N===0&&1/N<0?1:0;for(N=Math.abs(N),isNaN(N)||N===1/0?(te=isNaN(N)?1:0,W=U):(W=Math.floor(Math.log(N)/Math.LN2),N*(X=Math.pow(2,-W))<1&&(W--,X*=2),2<=(N+=1<=W+_?w/X:w*Math.pow(2,1-_))*X&&(W++,X/=2),U<=W+_?(te=0,W=U):1<=W+_?(te=(N*X-1)*Math.pow(2,k),W+=_):(te=N*Math.pow(2,_-1)*Math.pow(2,k),W=0));8<=k;C[D+E]=255&te,E+=q,te/=256,k-=8);for(W=W<"u"?1:0;let c=f?r[0]:s;for(let u=f;u/g,""),/\.{3}|=/.test(a))?0:r.length}function pg(r,...a){let s="";const f=this;for(let c=0;cal(f,a,s));if(r&&typeof r=="object"){const f=Object.keys(r)[0],c=r[f];if(a.isData(r,f)||c===void 0)return!0;if(!a.methods[f])throw new Error(`Method '${f}' was not found in the Logic Engine.`);return a.methods[f].traverse===!1?typeof a.methods[f].deterministic=="function"?a.methods[f].deterministic(c,s):a.methods[f].deterministic:typeof a.methods[f].deterministic=="function"?a.methods[f].deterministic(c,s):a.methods[f].deterministic&&al(c,a,s)}return!0}function oc(r,a){if(!a.async)return!0;if(Array.isArray(r))return r.every(s=>oc(s,a));if(typeof r=="object"){const s=Object.keys(r)[0],f=r[s];return cr(a.methods[s])?a.methods[s].traverse===!1?!!(typeof a.methods[s][et]=="function"&&a.methods[s][et](r,{engine:a})):oc(f,a):!1}return!0}function Ce(r,a={}){const{notTraversed:s=[],async:f,processing:c=[],values:u=[],engine:l}=a;function d(v,T=!1){return yb(v,T)?JSON.stringify(v):(u.push(v),`values[${u.length-1}]`)}if(Array.isArray(r)){let v="";for(let T=0;T0&&(v+=","),v+=Ce(r[T],a);return"["+v+"]"}let m=!1;function p(v){return a.asyncDetected=a.asyncDetected||m,f&&m?`await ${v}`:v}const g=r&&Object.keys(r)[0];if(r&&typeof r=="object"){if(!g)return d(r);if(!l.methods[g]){if(l.isData(r,g))return d(r,!0);throw new Error(`Method '${g}' was not found in the Logic Engine.`)}if(!a.engine.disableInline&&l.methods[g]&&al(r,l,a))return oc(r,l)?d((l.fallback||l).run(r),!0):a.avoidInlineAsync?(a.asyncDetected=!0,`(await ${d(l.run(r))})`):(c.push(l.run(r).then(C=>d(C))),`__%%%${c.length-1}%%%__`);let v=r[g];if((!v||typeof v!="object")&&(v=[v]),l.methods[g]&&l.methods[g].compile){let C=l.methods[g].compile(v,a);if(C[el]&&(C=C[el]),(C||"").startsWith("await")&&(a.asyncDetected=!0),C!==!1)return C}let T=l.methods[g].optimizeUnary?"":"coerceArray";!T&&Array.isArray(v)&&v.length===1?v=v[0]:T&&Array.isArray(v)&&(T="");const j=[", context",", context, above",", context, above, engine"];if(typeof l.methods[g]=="function"){m=!cr(l.methods[g]);const C=j[Um(l.methods[g])-1]||j[2];return p(`engine.methods["${g}"](${T}(`+Ce(v,a)+")"+C+")")}else{m=!!(f&&l.methods[g]&&l.methods[g].asyncMethod);const C=Um(m?l.methods[g].asyncMethod:l.methods[g].method),N=j[C-1]||j[2];return l.methods[g]&&(typeof l.methods[g].traverse>"u"||l.methods[g].traverse)?p(`engine.methods["${g}"]${m?".asyncMethod":".method"}(${T}(`+Ce(v,a)+")"+N+")"):(s.push(v),p(`engine.methods["${g}"]${m?".asyncMethod":".method"}(notTraversed[${s.length-1}]`+N+")"))}}return d(r)}function ju(r,a={}){Object.assign(a,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:a.engine.async,asyncDetected:!1,values:[],compile:pg},a));const s=Ce(r,a);return mg(r,s,a)}async function gb(r,a={}){Object.assign(a,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:a.engine.async,asyncDetected:!1,values:[],compile:pg},a));const s=Ce(r,a);return a.processing=await Promise.all(a.processing||[]),mg(r,s,a)}function mg(r,a,s){const{engine:f,methods:c,notTraversed:u,processing:l=[],values:d}=s,m=[];l.forEach((g,v)=>{a=a.replace(`__%%%${v}%%%__`,g)});const p=`(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${s.asyncDetected?"async":""} (context ${s.extraArguments?","+s.extraArguments:""}) => { const result = ${a}; return result }`;return Object.assign((typeof globalThis<"u"?globalThis:global).eval(p)(d,c,u,Mu,f,m,On),{[et]:!s.asyncDetected,aboveDetected:typeof a=="string"&&a.includes(", above")})}const vb=()=>{try{const r={};return(typeof globalThis<"u"?globalThis:global).eval("(test) => test?.foo?.bar")(r)===void 0}catch{return!1}},yg=vb();class Er extends Error{constructor(a){super(),this.message="Built-in control structures are not allowed to receive dynamic inputs, this could allow a lesser version of remote-code execution.",this.input=a}}const Fi=new Map;function Cu(r){if(Fi.has(r))return Fi.get(r);Fi.size>2048&&Fi.clear();const a=bb(r);return Fi.set(r,a),a}function bb(r,a=".",s="\\",f="/"){const c=[];let u="";for(let l=0;lar(f,a,s));if(r&&typeof r=="object"){const f=Object.keys(r)[0],c=r[f];if(a.isData(r,f))return!0;if(!a.methods[f])throw new Error(`Method '${f}' was not found in the Logic Engine.`);return a.methods[f].traverse===!1?typeof a.methods[f].deterministic=="function"?a.methods[f].deterministic(c,s):a.methods[f].deterministic:typeof a.methods[f].deterministic=="function"?a.methods[f].deterministic(c,s):a.methods[f].deterministic&&ar(c,a,s)}return!0}function An(r,a,s){if(Array.isArray(r))return r.every(f=>An(f,a,s));if(r&&typeof r=="object"){const f=Object.keys(r)[0],c=r[f];if(a.isData(r,f))return!0;if(!a.methods[f])throw new Error(`Method '${f}' was not found in the Logic Engine.`);return a.methods[f].traverse===!1?typeof a.methods[f][et]=="function"?a.methods[f][et](c,s):a.methods[f][et]:typeof a.methods[f][et]=="function"?a.methods[f][et](c,s):a.methods[f][et]&&An(c,a,s)}return!0}const _e={"+":r=>{if(typeof r=="string"||typeof r=="number")return+r;let a=0;for(let s=0;s{let a=1;for(let s=0;s{let a=r[0];for(let s=1;s{if(typeof r=="string"||typeof r=="number")return-r;if(r.length===1)return-r[0];let a=r[0];for(let s=1;s{let a=r[0];for(let s=1;sMath.max(...r),min:r=>Math.min(...r),in:([r,a])=>(a||[]).includes(r),">":([r,a])=>r>a,"<":([r,a,s])=>s===void 0?rr,!0),[et]:()=>!0},if:{method:(r,a,s,f)=>{if(!Array.isArray(r))throw new Er(r);if(r.length===1)return f.run(r[0],a,{above:s});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const u=r.shift(),l=r.shift(),d=f.run(u,a,{above:s});if(f.truthy(d))return f.run(l,a,{above:s})}return f.run(c,a,{above:s})},[et]:(r,a)=>An(r,a.engine,a),deterministic:(r,a)=>ar(r,a.engine,a),asyncMethod:async(r,a,s,f)=>{if(!Array.isArray(r))throw new Er(r);if(r.length===1)return f.run(r[0],a,{above:s});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const u=r.shift(),l=r.shift(),d=await f.run(u,a,{above:s});if(f.truthy(d))return f.run(l,a,{above:s})}return f.run(c,a,{above:s})},traverse:!1},"<=":([r,a,s])=>s===void 0?r<=a:r<=a&&a<=s,">=":([r,a])=>r>=a,"==":([r,a])=>r==a,"===":([r,a])=>r===a,"!=":([r,a])=>r!=a,"!==":([r,a])=>r!==a,xor:([r,a])=>r^a,or:{method:(r,a,s,f)=>{const c=Array.isArray(r);c||(r=f.run(r,a,{above:s}));let u;for(let l=0;l{const c=Array.isArray(r);c||(r=await f.run(r,a,{above:s}));let u;for(let l=0;lar(r,a.engine,a),compile:(r,a)=>a.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(s=>Ce(s,a)).join(" || ")})`:`(${Ce(r,a)}).reduce((a,b) => a||b, false)`:!1,traverse:!1},and:{method:(r,a,s,f)=>{const c=Array.isArray(r);c||(r=f.run(r,a,{above:s}));let u;for(let l=0;l{const c=Array.isArray(r);c||(r=await f.run(r,a,{above:s}));let u;for(let l=0;lar(r,a.engine,a),compile:(r,a)=>a.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(s=>Ce(s,a)).join(" && ")})`:`(${Ce(r,a)}).reduce((a,b) => a&&b, true)`:!1},substr:([r,a,s])=>{if(s<0){const f=r.substr(a);return f.substr(0,f.length+s)}return r.substr(a,s)},length:([r])=>typeof r=="string"||Array.isArray(r)?r.length:r&&typeof r=="object"?Object.keys(r).length:0,get:{method:([r,a,s],f,c,u)=>{const l=s===void 0?null:s,d=Cu(String(a));for(let m=0;m{let c;Array.isArray(r)&&(c=r[1],r=r[0]);let u=0;for(;typeof r=="string"&&r.startsWith("../")&&u"u"||r===""||r===null)return f.allowFunctions||typeof a!="function"?a:null;const d=Cu(String(r));for(let m=0;m(Array.isArray(r)?r:[r]).filter(c=>_e.var(c,a,s,f)===null),missing_some:([r,a],s,f,c)=>{const u=_e.missing(a,s,f,c);return a.length-u.length>=r?[]:u},map:Pi("map"),some:Pi("some",!0),all:Pi("every",!0),none:{traverse:!1,method:(r,a,s,f)=>!_e.some.method(r,a,s,f),asyncMethod:async(r,a,s,f)=>!await _e.some.asyncMethod(r,a,s,f),compile:(r,a)=>{const s=_e.some.compile(r,a);return s?a.compile`!(${s})`:!1}},merge:r=>Array.isArray(r)?[].concat(...r):[r],every:Pi("every"),filter:Pi("filter"),reduce:{deterministic:(r,a)=>ar(r[0],a.engine,a)&&ar(r[1],a.engine,{...a,insideIterator:!0}),compile:(r,a)=>{if(!Array.isArray(r))throw new Er(r);const{async:s}=a;let[f,c,u]=r;f=Ce(f,a),typeof u<"u"&&(u=Ce(u,a));const l={...a,extraArguments:"above",avoidInlineAsync:!0};c=ju(c,l);const d=c.aboveDetected?"[null, context, above]":"null";return a.methods.push(c),s&&(!cr(c)||f.includes("await"))?(a.detectAsync=!0,typeof u<"u"?`await asyncIterators.reduce(${f} || [], (a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${u})`:`await asyncIterators.reduce(${f} || [], (a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}))`):typeof u<"u"?`(${f} || []).reduce((a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${u})`:`(${f} || []).reduce((a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}))`},method:(r,a,s,f)=>{if(!Array.isArray(r))throw new Er(r);let[c,u,l]=r;l=f.run(l,a,{above:s}),c=f.run(c,a,{above:s})||[];const d=(m,p)=>f.run(u,{accumulator:m,current:p},{above:[c,a,s]});return typeof l>"u"?c.reduce(d):c.reduce(d,l)},[et]:(r,a)=>An(r,a.engine,a),asyncMethod:async(r,a,s,f)=>{if(!Array.isArray(r))throw new Er(r);let[c,u,l]=r;return l=await f.run(l,a,{above:s}),c=await f.run(c,a,{above:s})||[],Mu.reduce(c,(d,m)=>f.run(u,{accumulator:d,current:m},{above:[c,a,s]}),l)},traverse:!1},"!":(r,a,s,f)=>Array.isArray(r)?!f.truthy(r[0]):!f.truthy(r),"!!":(r,a,s,f)=>!!(Array.isArray(r)?f.truthy(r[0]):f.truthy(r)),cat:r=>{if(typeof r=="string")return r;let a="";for(let s=0;stypeof r=="object"?Object.keys(r):[],pipe:{traverse:!1,[et]:(r,a)=>An(r,a.engine,a),method:(r,a,s,f)=>{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=f.run(r[0],a,{above:[r,a,s]});for(let u=1;u{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=await f.run(r[0],a,{above:[r,a,s]});for(let u=1;u{let s=a.compile`${r[0]}`;for(let f=1;f{if(!Array.isArray(r))return!1;r=[...r];const s=r.shift();return ar(s,a.engine,a)&&ar(r,a.engine,{...a,insideIterator:!0})}},eachKey:{traverse:!1,[et]:(r,a)=>An(Object.values(r[Object.keys(r)[0]]),a.engine,a),method:(r,a,s,f)=>Object.keys(r).reduce((u,l)=>{const d=r[l];return Object.defineProperty(u,l,{enumerable:!0,value:f.run(d,a,{above:s})}),u},{}),deterministic:(r,a)=>{if(r&&typeof r=="object")return Object.values(r).every(s=>ar(s,a.engine,a));throw new Er(r)},compile:(r,a)=>{if(r&&typeof r=="object")return`({ ${Object.keys(r).reduce((f,c)=>(f.push(`${JSON.stringify(c)}: ${Ce(r[c],a)}`),f),[]).join(",")} })`;throw new Er(r)},asyncMethod:async(r,a,s,f)=>await Mu.reduce(Object.keys(r),async(u,l)=>{const d=r[l];return Object.defineProperty(u,l,{enumerable:!0,value:await f.run(d,a,{above:s})}),u},{})}};function Pi(r,a=!1){return{deterministic:(s,f)=>ar(s[0],f.engine,f)&&ar(s[1],f.engine,{...f,insideIterator:!0}),[et]:(s,f)=>An(s,f.engine,f),method:(s,f,c,u)=>{if(!Array.isArray(s))throw new Er(s);let[l,d]=s;return l=u.run(l,f,{above:c})||[],l[r]((m,p)=>{const g=u.run(d,m,{above:[{iterator:l,index:p},f,c]});return a?u.truthy(g):g})},asyncMethod:async(s,f,c,u)=>{if(!Array.isArray(s))throw new Er(s);let[l,d]=s;return l=await u.run(l,f,{above:c})||[],Mu[r](l,(m,p)=>{const g=u.run(d,m,{above:[{iterator:l,index:p},f,c]});return a?u.truthy(g):g})},compile:(s,f)=>{if(!Array.isArray(s))throw new Er(s);const{async:c}=f,[u,l]=s,d={...f,avoidInlineAsync:!0,iteratorCompile:!0,extraArguments:"index, above"},m=ju(l,d),p=m.aboveDetected?f.compile`[{ iterator: z, index: x }, context, above]`:f.compile`null`;return c&&!An(l,f.engine,f)?(f.detectAsync=!0,f.compile`await asyncIterators[${r}](${u} || [], async (i, x, z) => ${m}(i, x, ${p}))`):f.compile`(${u} || [])[${r}]((i, x, z) => ${m}(i, x, ${p}))`},traverse:!1}}_e["?:"]=_e.if;Object.keys(_e).forEach(r=>{typeof _e[r]=="function"&&(_e[r][et]=!0),_e[r].deterministic=typeof _e[r].deterministic>"u"?!0:_e[r].deterministic});_e.var.deterministic=(r,a)=>a.insideIterator&&!String(r).includes("../../");Object.assign(_e.missing,{deterministic:!1});Object.assign(_e.missing_some,{deterministic:!1});_e["<"].compile=function(r,a){return Array.isArray(r)?r.length===2?a.compile`(${r[0]} < ${r[1]})`:r.length===3?a.compile`(${r[0]} < ${r[1]} && ${r[1]} < ${r[2]})`:!1:!1};_e["<="].compile=function(r,a){return Array.isArray(r)?r.length===2?a.compile`(${r[0]} <= ${r[1]})`:r.length===3?a.compile`(${r[0]} <= ${r[1]} && ${r[1]} <= ${r[2]})`:!1:!1};_e.min.compile=function(r,a){return Array.isArray(r)?`Math.min(${r.map(s=>Ce(s,a)).join(", ")})`:!1};_e.max.compile=function(r,a){return Array.isArray(r)?`Math.max(${r.map(s=>Ce(s,a)).join(", ")})`:!1};_e[">"].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} > ${r[1]})`};_e[">="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} >= ${r[1]})`};_e["=="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} == ${r[1]})`};_e["!="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} != ${r[1]})`};_e.if.compile=function(r,a){if(!Array.isArray(r)||r.length<3)return!1;r=[...r],r.length%2!==1&&r.push(null);const s=r.pop();let f=a.compile``;for(;r.length;){const c=r.shift(),u=r.shift();f=a.compile`${f} engine.truthy(${c}) ? ${u} : `}return a.compile`(${f} ${s})`};_e["==="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} === ${r[1]})`};_e["+"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" + ")})`:typeof r=="string"||typeof r=="number"?`(+${Ce(r,a)})`:`([].concat(${Ce(r,a)})).reduce((a,b) => (+a)+(+b), 0)`};_e["%"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" % ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)%(+b))`};_e.in.compile=function(r,a){return Array.isArray(r)?a.compile`(${r[1]} || []).includes(${r[0]})`:!1};_e["-"].compile=function(r,a){return Array.isArray(r)?`${r.length===1?"-":""}(${r.map(s=>`(+${Ce(s,a)})`).join(" - ")})`:typeof r=="string"||typeof r=="number"?`(-${Ce(r,a)})`:`((a=>(a.length===1?a[0]=-a[0]:a)&0||a)([].concat(${Ce(r,a)}))).reduce((a,b) => (+a)-(+b))`};_e["/"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" / ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)/(+b))`};_e["*"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" * ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)*(+b))`};_e.cat.compile=function(r,a){if(typeof r=="string")return JSON.stringify(r);if(!Array.isArray(r))return!1;let s=a.compile`''`;for(let f=0;f"u"?null:r[2],f&&typeof f=="object")return!1;f=f.toString();const u=Cu(f);return yg?`((${Ce(c,a)})${u.map(l=>`?.[${Ce(l,a)}]`).join("")} ?? ${Ce(s,a)})`:`(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${u.reduce((l,d)=>`(${l}||0)[${JSON.stringify(d)}]`,`(${Ce(c,a)}||0)`)}, ${Ce(s,a)}))`}return!1};_e.var.compile=function(r,a){let s=r,f=null;if(a.varTop=a.varTop||new Set,!s||typeof r=="string"||typeof r=="number"||Array.isArray(r)&&r.length<=2){if(Array.isArray(r)&&(s=r[0],f=typeof r[1]>"u"?null:r[1]),s==="../index"&&a.iteratorCompile)return"index";if(typeof s>"u"||s===null||s==="")return"context";if(typeof s!="string"&&typeof s!="number"||(s=s.toString(),s.includes("../")))return!1;const c=Cu(s),[u]=c;return a.varTop.add(u),a.engine.allowFunctions?a.methods.preventFunctions=l=>l:a.methods.preventFunctions=l=>typeof l=="function"?null:l,yg?`(methods.preventFunctions(context${c.map(l=>`?.[${JSON.stringify(l)}]`).join("")} ?? ${Ce(f,a)}))`:`(methods.preventFunctions(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${c.reduce((l,d)=>`(${l}||0)[${JSON.stringify(d)}]`,"(context||0)")}, ${Ce(f,a)})))`}return!1};_e["+"].optimizeUnary=_e["-"].optimizeUnary=_e.var.optimizeUnary=_e["!"].optimizeUnary=_e["!!"].optimizeUnary=_e.cat.optimizeUnary=!0;const _c={..._e},gg=function(a){return Object.keys(a).forEach(s=>{a[s]===void 0&&delete a[s]}),a};function Eb(r,a,s,f){const c=a.methods[s],u=c.method?c.method:c;if(c.traverse===!1){const d=r[s];return(m,p)=>u(d,m,p||f,a)}let l=r[s];if((!l||typeof l!="object")&&(l=[l]),Array.isArray(l)){const d=l.map(m=>Lu(m,a,f));return(m,p)=>{const g=d.map(v=>typeof v=="function"?v(m,p):v);return u(g,m,p||f,a)}}else{const d=Lu(l,a,f);return(m,p)=>u(On(typeof d=="function"?d(m,p):d,c.optimizeUnary),m,p||f,a)}}function Lu(r,a,s=[]){if(Array.isArray(r)){const f=r.map(c=>Lu(c,a,s));return(c,u)=>f.map(l=>typeof l=="function"?l(c,u):l)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(a.isData(r,c))return()=>r;const l=!a.disableInline&&al(r,a,{engine:a});if(c in a.methods){const d=Eb(r,a,c,s);return l?d():d}}return r}const Ou=_c.all,Ab={method:(r,a,s,f)=>{if(Array.isArray(r)){const c=f.run(r[0],a,s);if(Array.isArray(c)&&c.length===0)return!1}return Ou.method(r,a,s,f)},asyncMethod:async(r,a,s,f)=>{if(Array.isArray(r)){const c=await f.run(r[0],a,s);if(Array.isArray(c)&&c.length===0)return!1}return Ou.asyncMethod(r,a,s,f)},deterministic:Ou.deterministic,traverse:Ou.traverse};function _b(r){return Array.isArray(r)&&r.length===0?!1:r}function vg(r){r.methods.all=Ab,r.truthy=_b}class wc{constructor(a=_c,s={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.disableInline=s.disableInline,this.disableInterpretedOptimization=s.disableInterpretedOptimization,this.methods={...a},this.optimizedMap=new WeakMap,this.missesSinceSeen=0,s.compatible&&vg(this),this.options={disableInline:s.disableInline,disableInterpretedOptimization:s.disableInterpretedOptimization},this.isData||(s.permissive?this.isData=(f,c)=>!(c in this.methods):this.isData=()=>!1)}truthy(a){return a}_parse(a,s,f){const[c]=Object.keys(a),u=a[c];if(this.isData(a,c))return a;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const l=!u||typeof u!="object"?[u]:On(this.run(u,s,{above:f}));return this.methods[c](l,s,f,this)}if(typeof this.methods[c]=="object"){const{method:l,traverse:d}=this.methods[c],p=(typeof d>"u"?!0:d)?!u||typeof u!="object"?[u]:On(this.run(u,s,{above:f})):u;return l(p,s,f,this)}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(a,s,{deterministic:f,optimizeUnary:c}={}){typeof s=="function"?s={method:s,traverse:!0}:s={...s},Object.assign(s,gg({deterministic:f,optimizeUnary:c})),this.methods[a]=kr(s)}addModule(a,s,f){Object.getOwnPropertyNames(s).forEach(c=>{(typeof s[c]=="function"||typeof s[c]=="object")&&this.addMethod(`${a}${a?".":""}${c}`,s[c],f)})}run(a,s={},f={}){const{above:c=[]}=f;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof a=="object"&&a&&!this.optimizedMap.has(a))return this.optimizedMap.set(a,Lu(a,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(!this.disableInterpretedOptimization&&a&&typeof a=="object"&&this.optimizedMap.get(a))return this.missesSinceSeen=0,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(Array.isArray(a)){const u=[];for(let l=0;l0?this._parse(a,s,c):a}build(a,s={}){const{above:f=[],top:c=!0}=s;if(c){const u=ju(a,{state:{},engine:this,above:f});return typeof u=="function"||c===!0?(...l)=>typeof u=="function"?u(...l):u:u}return a}}Object.assign(wc.prototype.truthy,{IDENTITY:!0});function wb(r,a,s,f){const c=a.methods[s],u=c.asyncMethod?c.asyncMethod:c.method?c.method:c;if(c.traverse===!1){if(typeof c[et]=="function"&&c[et](r,{engine:a})){const m=c.method?c.method:c;return kr((p,g)=>m(r[s],p,g||f,a.fallback),!0)}const d=r[s];return(m,p)=>u(d,m,p||f,a)}let l=r[s];if((!l||typeof l!="object")&&(l=[l]),Array.isArray(l)){const d=l.map(m=>zu(m,a,f));if(cr(d)&&(c.method||c[et])){const m=c.method?c.method:c;return kr((p,g)=>{const v=d.map(T=>typeof T=="function"?T(p,g):T);return m(v,p,g||f,a.fallback)},!0)}return async(m,p)=>{const g=await Ac(d,v=>typeof v=="function"?v(m,p):v);return u(g,m,p||f,a)}}else{const d=zu(l,a,f);if(cr(d)&&(c.method||c[et])){const m=c.method?c.method:c;return kr((p,g)=>m(On(typeof d=="function"?d(p,g):d,c.optimizeUnary),p,g||f,a),!0)}return async(m,p)=>u(On(typeof d=="function"?await d(m,p):d,c.optimizeUnary),m,p||f,a)}}function zu(r,a,s=[]){if(a.fallback.allowFunctions=a.allowFunctions,Array.isArray(r)){const f=r.map(c=>zu(c,a,s));return cr(f)?kr((c,u)=>f.map(l=>typeof l=="function"?l(c,u):l),!0):async(c,u)=>Ac(f,l=>typeof l=="function"?l(c,u):l)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(a.isData(r,c))return()=>r;const l=!a.disableInline&&al(r,a,{engine:a});if(c in a.methods){const d=wb(r,a,c,s);if(l){let m;return cr(d)?kr(()=>(m||(m=d()),m),!0):async()=>(m||(m=await d()),m)}return d}}return r}class Ob{constructor(a=_c,s={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.methods={...a},this.options={disableInline:s.disableInline,disableInterpretedOptimization:s.disableInterpretedOptimization},this.disableInline=s.disableInline,this.disableInterpretedOptimization=s.disableInterpretedOptimization,this.async=!0,this.fallback=new wc(a,s),s.compatible&&vg(this),this.optimizedMap=new WeakMap,this.missesSinceSeen=0,this.isData||(s.permissive?this.isData=(f,c)=>!(c in this.methods):this.isData=()=>!1),this.fallback.isData=this.isData}truthy(a){return a}async _parse(a,s,f){const[c]=Object.keys(a),u=a[c];if(this.isData(a,c))return a;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const l=!u||typeof u!="object"?[u]:await this.run(u,s,{above:f}),d=await this.methods[c](On(l),s,f,this);return Array.isArray(d)?Promise.all(d):d}if(typeof this.methods[c]=="object"){const{asyncMethod:l,method:d,traverse:m}=this.methods[c],g=(typeof m>"u"?!0:m)?!u||typeof u!="object"?[u]:On(await this.run(u,s,{above:f})):u,v=await(l||d)(g,s,f,this);return Array.isArray(v)?Promise.all(v):v}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(a,s,{deterministic:f,async:c,sync:u,optimizeUnary:l}={}){typeof c>"u"&&typeof u>"u"&&(u=!1),typeof u<"u"&&(c=!u),typeof c<"u"&&(u=!c),typeof s=="function"?c?s={asyncMethod:s,traverse:!0}:s={method:s,traverse:!0}:s={...s},Object.assign(s,gg({deterministic:f,optimizeUnary:l})),this.fallback.addMethod(a,s,{deterministic:f}),this.methods[a]=kr(s,u)}addModule(a,s,f={}){Object.getOwnPropertyNames(s).forEach(c=>{(typeof s[c]=="function"||typeof s[c]=="object")&&this.addMethod(`${a}${a?".":""}${c}`,s[c],f)})}async run(a,s={},f={}){const{above:c=[]}=f;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof a=="object"&&a&&!this.optimizedMap.has(a))return this.optimizedMap.set(a,zu(a,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(!this.disableInterpretedOptimization&&a&&typeof a=="object"&&this.optimizedMap.get(a))return this.missesSinceSeen=0,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(Array.isArray(a)){const u=[];for(let l=0;l0?this._parse(a,s,c):a}async build(a,s={}){const{above:f=[],top:c=!0}=s;if(this.fallback.truthy=this.truthy,this.fallback.allowFunctions=this.allowFunctions,c){const u=await gb(a,{engine:this,above:f,async:!0,state:{}}),l=kr((...d)=>{if(c===!0)try{const m=typeof u=="function"?u(...d):u;return Promise.resolve(m)}catch(m){return Promise.reject(m)}return typeof u=="function"?u(...d):u},c!==!0&&cr(u));return typeof u=="function"||c===!0?l:u}return a}}Object.assign(Ob.prototype.truthy,{IDENTITY:!0});var Su={exports:{}},oo,Bm;function Yu(){if(Bm)return oo;Bm=1;const r="2.0.0",a=256,s=Number.MAX_SAFE_INTEGER||9007199254740991,f=16,c=a-6;return oo={MAX_LENGTH:a,MAX_SAFE_COMPONENT_LENGTH:f,MAX_SAFE_BUILD_LENGTH:c,MAX_SAFE_INTEGER:s,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:r,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},oo}var co,qm;function Gu(){if(qm)return co;qm=1;var r={};return co=typeof process=="object"&&r&&r.NODE_DEBUG&&/\bsemver\b/i.test(r.NODE_DEBUG)?(...s)=>console.error("SEMVER",...s):()=>{},co}var Hm;function ol(){return Hm||(Hm=1,(function(r,a){const{MAX_SAFE_COMPONENT_LENGTH:s,MAX_SAFE_BUILD_LENGTH:f,MAX_LENGTH:c}=Yu(),u=Gu();a=r.exports={};const l=a.re=[],d=a.safeRe=[],m=a.src=[],p=a.safeSrc=[],g=a.t={};let v=0;const T="[a-zA-Z0-9-]",j=[["\\s",1],["\\d",c],[T,f]],C=D=>{for(const[X,k]of j)D=D.split(`${X}*`).join(`${X}{0,${k}}`).split(`${X}+`).join(`${X}{1,${k}}`);return D},N=(D,X,k)=>{const I=C(X),W=v++;u(D,W,X),g[D]=W,m[W]=X,p[W]=I,l[W]=new RegExp(X,k?"g":void 0),d[W]=new RegExp(I,k?"g":void 0)};N("NUMERICIDENTIFIER","0|[1-9]\\d*"),N("NUMERICIDENTIFIERLOOSE","\\d+"),N("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${T}*`),N("MAINVERSION",`(${m[g.NUMERICIDENTIFIER]})\\.(${m[g.NUMERICIDENTIFIER]})\\.(${m[g.NUMERICIDENTIFIER]})`),N("MAINVERSIONLOOSE",`(${m[g.NUMERICIDENTIFIERLOOSE]})\\.(${m[g.NUMERICIDENTIFIERLOOSE]})\\.(${m[g.NUMERICIDENTIFIERLOOSE]})`),N("PRERELEASEIDENTIFIER",`(?:${m[g.NONNUMERICIDENTIFIER]}|${m[g.NUMERICIDENTIFIER]})`),N("PRERELEASEIDENTIFIERLOOSE",`(?:${m[g.NONNUMERICIDENTIFIER]}|${m[g.NUMERICIDENTIFIERLOOSE]})`),N("PRERELEASE",`(?:-(${m[g.PRERELEASEIDENTIFIER]}(?:\\.${m[g.PRERELEASEIDENTIFIER]})*))`),N("PRERELEASELOOSE",`(?:-?(${m[g.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${m[g.PRERELEASEIDENTIFIERLOOSE]})*))`),N("BUILDIDENTIFIER",`${T}+`),N("BUILD",`(?:\\+(${m[g.BUILDIDENTIFIER]}(?:\\.${m[g.BUILDIDENTIFIER]})*))`),N("FULLPLAIN",`v?${m[g.MAINVERSION]}${m[g.PRERELEASE]}?${m[g.BUILD]}?`),N("FULL",`^${m[g.FULLPLAIN]}$`),N("LOOSEPLAIN",`[v=\\s]*${m[g.MAINVERSIONLOOSE]}${m[g.PRERELEASELOOSE]}?${m[g.BUILD]}?`),N("LOOSE",`^${m[g.LOOSEPLAIN]}$`),N("GTLT","((?:<|>)?=?)"),N("XRANGEIDENTIFIERLOOSE",`${m[g.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),N("XRANGEIDENTIFIER",`${m[g.NUMERICIDENTIFIER]}|x|X|\\*`),N("XRANGEPLAIN",`[v=\\s]*(${m[g.XRANGEIDENTIFIER]})(?:\\.(${m[g.XRANGEIDENTIFIER]})(?:\\.(${m[g.XRANGEIDENTIFIER]})(?:${m[g.PRERELEASE]})?${m[g.BUILD]}?)?)?`),N("XRANGEPLAINLOOSE",`[v=\\s]*(${m[g.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[g.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[g.XRANGEIDENTIFIERLOOSE]})(?:${m[g.PRERELEASELOOSE]})?${m[g.BUILD]}?)?)?`),N("XRANGE",`^${m[g.GTLT]}\\s*${m[g.XRANGEPLAIN]}$`),N("XRANGELOOSE",`^${m[g.GTLT]}\\s*${m[g.XRANGEPLAINLOOSE]}$`),N("COERCEPLAIN",`(^|[^\\d])(\\d{1,${s}})(?:\\.(\\d{1,${s}}))?(?:\\.(\\d{1,${s}}))?`),N("COERCE",`${m[g.COERCEPLAIN]}(?:$|[^\\d])`),N("COERCEFULL",m[g.COERCEPLAIN]+`(?:${m[g.PRERELEASE]})?(?:${m[g.BUILD]})?(?:$|[^\\d])`),N("COERCERTL",m[g.COERCE],!0),N("COERCERTLFULL",m[g.COERCEFULL],!0),N("LONETILDE","(?:~>?)"),N("TILDETRIM",`(\\s*)${m[g.LONETILDE]}\\s+`,!0),a.tildeTrimReplace="$1~",N("TILDE",`^${m[g.LONETILDE]}${m[g.XRANGEPLAIN]}$`),N("TILDELOOSE",`^${m[g.LONETILDE]}${m[g.XRANGEPLAINLOOSE]}$`),N("LONECARET","(?:\\^)"),N("CARETTRIM",`(\\s*)${m[g.LONECARET]}\\s+`,!0),a.caretTrimReplace="$1^",N("CARET",`^${m[g.LONECARET]}${m[g.XRANGEPLAIN]}$`),N("CARETLOOSE",`^${m[g.LONECARET]}${m[g.XRANGEPLAINLOOSE]}$`),N("COMPARATORLOOSE",`^${m[g.GTLT]}\\s*(${m[g.LOOSEPLAIN]})$|^$`),N("COMPARATOR",`^${m[g.GTLT]}\\s*(${m[g.FULLPLAIN]})$|^$`),N("COMPARATORTRIM",`(\\s*)${m[g.GTLT]}\\s*(${m[g.LOOSEPLAIN]}|${m[g.XRANGEPLAIN]})`,!0),a.comparatorTrimReplace="$1$2$3",N("HYPHENRANGE",`^\\s*(${m[g.XRANGEPLAIN]})\\s+-\\s+(${m[g.XRANGEPLAIN]})\\s*$`),N("HYPHENRANGELOOSE",`^\\s*(${m[g.XRANGEPLAINLOOSE]})\\s+-\\s+(${m[g.XRANGEPLAINLOOSE]})\\s*$`),N("STAR","(<|>)?=?\\s*\\*"),N("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),N("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")})(Su,Su.exports)),Su.exports}var ho,$m;function Oc(){if($m)return ho;$m=1;const r=Object.freeze({loose:!0}),a=Object.freeze({});return ho=f=>f?typeof f!="object"?r:f:a,ho}var po,km;function bg(){if(km)return po;km=1;const r=/^[0-9]+$/,a=(f,c)=>{if(typeof f=="number"&&typeof c=="number")return f===c?0:fa(c,f)},po}var mo,Ym;function xt(){if(Ym)return mo;Ym=1;const r=Gu(),{MAX_LENGTH:a,MAX_SAFE_INTEGER:s}=Yu(),{safeRe:f,t:c}=ol(),u=Oc(),{compareIdentifiers:l}=bg();class d{constructor(p,g){if(g=u(g),p instanceof d){if(p.loose===!!g.loose&&p.includePrerelease===!!g.includePrerelease)return p;p=p.version}else if(typeof p!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof p}".`);if(p.length>a)throw new TypeError(`version is longer than ${a} characters`);r("SemVer",p,g),this.options=g,this.loose=!!g.loose,this.includePrerelease=!!g.includePrerelease;const v=p.trim().match(g.loose?f[c.LOOSE]:f[c.FULL]);if(!v)throw new TypeError(`Invalid Version: ${p}`);if(this.raw=p,this.major=+v[1],this.minor=+v[2],this.patch=+v[3],this.major>s||this.major<0)throw new TypeError("Invalid major version");if(this.minor>s||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>s||this.patch<0)throw new TypeError("Invalid patch version");v[4]?this.prerelease=v[4].split(".").map(T=>{if(/^[0-9]+$/.test(T)){const j=+T;if(j>=0&&jp.major?1:this.minorp.minor?1:this.patchp.patch?1:0}comparePre(p){if(p instanceof d||(p=new d(p,this.options)),this.prerelease.length&&!p.prerelease.length)return-1;if(!this.prerelease.length&&p.prerelease.length)return 1;if(!this.prerelease.length&&!p.prerelease.length)return 0;let g=0;do{const v=this.prerelease[g],T=p.prerelease[g];if(r("prerelease compare",g,v,T),v===void 0&&T===void 0)return 0;if(T===void 0)return 1;if(v===void 0)return-1;if(v===T)continue;return l(v,T)}while(++g)}compareBuild(p){p instanceof d||(p=new d(p,this.options));let g=0;do{const v=this.build[g],T=p.build[g];if(r("build compare",g,v,T),v===void 0&&T===void 0)return 0;if(T===void 0)return 1;if(v===void 0)return-1;if(v===T)continue;return l(v,T)}while(++g)}inc(p,g,v){if(p.startsWith("pre")){if(!g&&v===!1)throw new Error("invalid increment argument: identifier is empty");if(g){const T=`-${g}`.match(this.options.loose?f[c.PRERELEASELOOSE]:f[c.PRERELEASE]);if(!T||T[1]!==g)throw new Error(`invalid identifier: ${g}`)}}switch(p){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",g,v);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",g,v);break;case"prepatch":this.prerelease.length=0,this.inc("patch",g,v),this.inc("pre",g,v);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",g,v),this.inc("pre",g,v);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{const T=Number(v)?1:0;if(this.prerelease.length===0)this.prerelease=[T];else{let j=this.prerelease.length;for(;--j>=0;)typeof this.prerelease[j]=="number"&&(this.prerelease[j]++,j=-2);if(j===-1){if(g===this.prerelease.join(".")&&v===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(T)}}if(g){let j=[g,T];v===!1&&(j=[g]),l(this.prerelease[0],g)===0?isNaN(this.prerelease[1])&&(this.prerelease=j):this.prerelease=j}break}default:throw new Error(`invalid increment argument: ${p}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return mo=d,mo}var yo,Gm;function Pa(){if(Gm)return yo;Gm=1;const r=xt();return yo=(s,f,c=!1)=>{if(s instanceof r)return s;try{return new r(s,f)}catch(u){if(!c)return null;throw u}},yo}var go,Vm;function Sb(){if(Vm)return go;Vm=1;const r=Pa();return go=(s,f)=>{const c=r(s,f);return c?c.version:null},go}var vo,Im;function Tb(){if(Im)return vo;Im=1;const r=Pa();return vo=(s,f)=>{const c=r(s.trim().replace(/^[=v]+/,""),f);return c?c.version:null},vo}var bo,Xm;function Rb(){if(Xm)return bo;Xm=1;const r=xt();return bo=(s,f,c,u,l)=>{typeof c=="string"&&(l=u,u=c,c=void 0);try{return new r(s instanceof r?s.version:s,c).inc(f,u,l).version}catch{return null}},bo}var Eo,Zm;function xb(){if(Zm)return Eo;Zm=1;const r=Pa();return Eo=(s,f)=>{const c=r(s,null,!0),u=r(f,null,!0),l=c.compare(u);if(l===0)return null;const d=l>0,m=d?c:u,p=d?u:c,g=!!m.prerelease.length;if(!!p.prerelease.length&&!g){if(!p.patch&&!p.minor)return"major";if(p.compareMain(m)===0)return p.minor&&!p.patch?"minor":"patch"}const T=g?"pre":"";return c.major!==u.major?T+"major":c.minor!==u.minor?T+"minor":c.patch!==u.patch?T+"patch":"prerelease"},Eo}var Ao,Qm;function Db(){if(Qm)return Ao;Qm=1;const r=xt();return Ao=(s,f)=>new r(s,f).major,Ao}var _o,Km;function Nb(){if(Km)return _o;Km=1;const r=xt();return _o=(s,f)=>new r(s,f).minor,_o}var wo,Fm;function Mb(){if(Fm)return wo;Fm=1;const r=xt();return wo=(s,f)=>new r(s,f).patch,wo}var Oo,Pm;function jb(){if(Pm)return Oo;Pm=1;const r=Pa();return Oo=(s,f)=>{const c=r(s,f);return c&&c.prerelease.length?c.prerelease:null},Oo}var So,Jm;function hr(){if(Jm)return So;Jm=1;const r=xt();return So=(s,f,c)=>new r(s,c).compare(new r(f,c)),So}var To,Wm;function Cb(){if(Wm)return To;Wm=1;const r=hr();return To=(s,f,c)=>r(f,s,c),To}var Ro,ey;function Lb(){if(ey)return Ro;ey=1;const r=hr();return Ro=(s,f)=>r(s,f,!0),Ro}var xo,ty;function Sc(){if(ty)return xo;ty=1;const r=xt();return xo=(s,f,c)=>{const u=new r(s,c),l=new r(f,c);return u.compare(l)||u.compareBuild(l)},xo}var Do,ry;function zb(){if(ry)return Do;ry=1;const r=Sc();return Do=(s,f)=>s.sort((c,u)=>r(c,u,f)),Do}var No,ny;function Ub(){if(ny)return No;ny=1;const r=Sc();return No=(s,f)=>s.sort((c,u)=>r(u,c,f)),No}var Mo,ay;function Vu(){if(ay)return Mo;ay=1;const r=hr();return Mo=(s,f,c)=>r(s,f,c)>0,Mo}var jo,iy;function Tc(){if(iy)return jo;iy=1;const r=hr();return jo=(s,f,c)=>r(s,f,c)<0,jo}var Co,ly;function Eg(){if(ly)return Co;ly=1;const r=hr();return Co=(s,f,c)=>r(s,f,c)===0,Co}var Lo,uy;function Ag(){if(uy)return Lo;uy=1;const r=hr();return Lo=(s,f,c)=>r(s,f,c)!==0,Lo}var zo,sy;function Rc(){if(sy)return zo;sy=1;const r=hr();return zo=(s,f,c)=>r(s,f,c)>=0,zo}var Uo,fy;function xc(){if(fy)return Uo;fy=1;const r=hr();return Uo=(s,f,c)=>r(s,f,c)<=0,Uo}var Bo,oy;function _g(){if(oy)return Bo;oy=1;const r=Eg(),a=Ag(),s=Vu(),f=Rc(),c=Tc(),u=xc();return Bo=(d,m,p,g)=>{switch(m){case"===":return typeof d=="object"&&(d=d.version),typeof p=="object"&&(p=p.version),d===p;case"!==":return typeof d=="object"&&(d=d.version),typeof p=="object"&&(p=p.version),d!==p;case"":case"=":case"==":return r(d,p,g);case"!=":return a(d,p,g);case">":return s(d,p,g);case">=":return f(d,p,g);case"<":return c(d,p,g);case"<=":return u(d,p,g);default:throw new TypeError(`Invalid operator: ${m}`)}},Bo}var qo,cy;function Bb(){if(cy)return qo;cy=1;const r=xt(),a=Pa(),{safeRe:s,t:f}=ol();return qo=(u,l)=>{if(u instanceof r)return u;if(typeof u=="number"&&(u=String(u)),typeof u!="string")return null;l=l||{};let d=null;if(!l.rtl)d=u.match(l.includePrerelease?s[f.COERCEFULL]:s[f.COERCE]);else{const j=l.includePrerelease?s[f.COERCERTLFULL]:s[f.COERCERTL];let C;for(;(C=j.exec(u))&&(!d||d.index+d[0].length!==u.length);)(!d||C.index+C[0].length!==d.index+d[0].length)&&(d=C),j.lastIndex=C.index+C[1].length+C[2].length;j.lastIndex=-1}if(d===null)return null;const m=d[2],p=d[3]||"0",g=d[4]||"0",v=l.includePrerelease&&d[5]?`-${d[5]}`:"",T=l.includePrerelease&&d[6]?`+${d[6]}`:"";return a(`${m}.${p}.${g}${v}${T}`,l)},qo}var Ho,hy;function qb(){if(hy)return Ho;hy=1;class r{constructor(){this.max=1e3,this.map=new Map}get(s){const f=this.map.get(s);if(f!==void 0)return this.map.delete(s),this.map.set(s,f),f}delete(s){return this.map.delete(s)}set(s,f){if(!this.delete(s)&&f!==void 0){if(this.map.size>=this.max){const u=this.map.keys().next().value;this.delete(u)}this.map.set(s,f)}return this}}return Ho=r,Ho}var $o,dy;function dr(){if(dy)return $o;dy=1;const r=/\s+/g;class a{constructor(z,x){if(x=c(x),z instanceof a)return z.loose===!!x.loose&&z.includePrerelease===!!x.includePrerelease?z:new a(z.raw,x);if(z instanceof u)return this.raw=z.value,this.set=[[z]],this.formatted=void 0,this;if(this.options=x,this.loose=!!x.loose,this.includePrerelease=!!x.includePrerelease,this.raw=z.trim().replace(r," "),this.set=this.raw.split("||").map(Z=>this.parseRange(Z.trim())).filter(Z=>Z.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const Z=this.set[0];if(this.set=this.set.filter(P=>!N(P[0])),this.set.length===0)this.set=[Z];else if(this.set.length>1){for(const P of this.set)if(P.length===1&&D(P[0])){this.set=[P];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let z=0;z0&&(this.formatted+="||");const x=this.set[z];for(let Z=0;Z0&&(this.formatted+=" "),this.formatted+=x[Z].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(z){const Z=((this.options.includePrerelease&&j)|(this.options.loose&&C))+":"+z,P=f.get(Z);if(P)return P;const J=this.options.loose,O=J?m[p.HYPHENRANGELOOSE]:m[p.HYPHENRANGE];z=z.replace(O,G(this.options.includePrerelease)),l("hyphen replace",z),z=z.replace(m[p.COMPARATORTRIM],g),l("comparator trim",z),z=z.replace(m[p.TILDETRIM],v),l("tilde trim",z),z=z.replace(m[p.CARETTRIM],T),l("caret trim",z);let $=z.split(" ").map(he=>k(he,this.options)).join(" ").split(/\s+/).map(he=>q(he,this.options));J&&($=$.filter(he=>(l("loose invalid filter",he,this.options),!!he.match(m[p.COMPARATORLOOSE])))),l("range list",$);const ee=new Map,se=$.map(he=>new u(he,this.options));for(const he of se){if(N(he))return[he];ee.set(he.value,he)}ee.size>1&&ee.has("")&&ee.delete("");const ie=[...ee.values()];return f.set(Z,ie),ie}intersects(z,x){if(!(z instanceof a))throw new TypeError("a Range is required");return this.set.some(Z=>X(Z,x)&&z.set.some(P=>X(P,x)&&Z.every(J=>P.every(O=>J.intersects(O,x)))))}test(z){if(!z)return!1;if(typeof z=="string")try{z=new d(z,this.options)}catch{return!1}for(let x=0;xK.value==="<0.0.0-0",D=K=>K.value==="",X=(K,z)=>{let x=!0;const Z=K.slice();let P=Z.pop();for(;x&&Z.length;)x=Z.every(J=>P.intersects(J,z)),P=Z.pop();return x},k=(K,z)=>(K=K.replace(m[p.BUILD],""),l("comp",K,z),K=R(K,z),l("caret",K),K=W(K,z),l("tildes",K),K=_(K,z),l("xrange",K),K=E(K,z),l("stars",K),K),I=K=>!K||K.toLowerCase()==="x"||K==="*",W=(K,z)=>K.trim().split(/\s+/).map(x=>te(x,z)).join(" "),te=(K,z)=>{const x=z.loose?m[p.TILDELOOSE]:m[p.TILDE];return K.replace(x,(Z,P,J,O,$)=>{l("tilde",K,Z,P,J,O,$);let ee;return I(P)?ee="":I(J)?ee=`>=${P}.0.0 <${+P+1}.0.0-0`:I(O)?ee=`>=${P}.${J}.0 <${P}.${+J+1}.0-0`:$?(l("replaceTilde pr",$),ee=`>=${P}.${J}.${O}-${$} <${P}.${+J+1}.0-0`):ee=`>=${P}.${J}.${O} <${P}.${+J+1}.0-0`,l("tilde return",ee),ee})},R=(K,z)=>K.trim().split(/\s+/).map(x=>U(x,z)).join(" "),U=(K,z)=>{l("caret",K,z);const x=z.loose?m[p.CARETLOOSE]:m[p.CARET],Z=z.includePrerelease?"-0":"";return K.replace(x,(P,J,O,$,ee)=>{l("caret",K,P,J,O,$,ee);let se;return I(J)?se="":I(O)?se=`>=${J}.0.0${Z} <${+J+1}.0.0-0`:I($)?J==="0"?se=`>=${J}.${O}.0${Z} <${J}.${+O+1}.0-0`:se=`>=${J}.${O}.0${Z} <${+J+1}.0.0-0`:ee?(l("replaceCaret pr",ee),J==="0"?O==="0"?se=`>=${J}.${O}.${$}-${ee} <${J}.${O}.${+$+1}-0`:se=`>=${J}.${O}.${$}-${ee} <${J}.${+O+1}.0-0`:se=`>=${J}.${O}.${$}-${ee} <${+J+1}.0.0-0`):(l("no pr"),J==="0"?O==="0"?se=`>=${J}.${O}.${$}${Z} <${J}.${O}.${+$+1}-0`:se=`>=${J}.${O}.${$}${Z} <${J}.${+O+1}.0-0`:se=`>=${J}.${O}.${$} <${+J+1}.0.0-0`),l("caret return",se),se})},_=(K,z)=>(l("replaceXRanges",K,z),K.split(/\s+/).map(x=>w(x,z)).join(" ")),w=(K,z)=>{K=K.trim();const x=z.loose?m[p.XRANGELOOSE]:m[p.XRANGE];return K.replace(x,(Z,P,J,O,$,ee)=>{l("xRange",K,Z,P,J,O,$,ee);const se=I(J),ie=se||I(O),he=ie||I($),de=he;return P==="="&&de&&(P=""),ee=z.includePrerelease?"-0":"",se?P===">"||P==="<"?Z="<0.0.0-0":Z="*":P&&de?(ie&&(O=0),$=0,P===">"?(P=">=",ie?(J=+J+1,O=0,$=0):(O=+O+1,$=0)):P==="<="&&(P="<",ie?J=+J+1:O=+O+1),P==="<"&&(ee="-0"),Z=`${P+J}.${O}.${$}${ee}`):ie?Z=`>=${J}.0.0${ee} <${+J+1}.0.0-0`:he&&(Z=`>=${J}.${O}.0${ee} <${J}.${+O+1}.0-0`),l("xRange return",Z),Z})},E=(K,z)=>(l("replaceStars",K,z),K.trim().replace(m[p.STAR],"")),q=(K,z)=>(l("replaceGTE0",K,z),K.trim().replace(m[z.includePrerelease?p.GTE0PRE:p.GTE0],"")),G=K=>(z,x,Z,P,J,O,$,ee,se,ie,he,de)=>(I(Z)?x="":I(P)?x=`>=${Z}.0.0${K?"-0":""}`:I(J)?x=`>=${Z}.${P}.0${K?"-0":""}`:O?x=`>=${x}`:x=`>=${x}${K?"-0":""}`,I(se)?ee="":I(ie)?ee=`<${+se+1}.0.0-0`:I(he)?ee=`<${se}.${+ie+1}.0-0`:de?ee=`<=${se}.${ie}.${he}-${de}`:K?ee=`<${se}.${ie}.${+he+1}-0`:ee=`<=${ee}`,`${x} ${ee}`.trim()),ce=(K,z,x)=>{for(let Z=0;Z0){const P=K[Z].semver;if(P.major===z.major&&P.minor===z.minor&&P.patch===z.patch)return!0}return!1}return!0};return $o}var ko,py;function Iu(){if(py)return ko;py=1;const r=Symbol("SemVer ANY");class a{static get ANY(){return r}constructor(g,v){if(v=s(v),g instanceof a){if(g.loose===!!v.loose)return g;g=g.value}g=g.trim().split(/\s+/).join(" "),l("comparator",g,v),this.options=v,this.loose=!!v.loose,this.parse(g),this.semver===r?this.value="":this.value=this.operator+this.semver.version,l("comp",this)}parse(g){const v=this.options.loose?f[c.COMPARATORLOOSE]:f[c.COMPARATOR],T=g.match(v);if(!T)throw new TypeError(`Invalid comparator: ${g}`);this.operator=T[1]!==void 0?T[1]:"",this.operator==="="&&(this.operator=""),T[2]?this.semver=new d(T[2],this.options.loose):this.semver=r}toString(){return this.value}test(g){if(l("Comparator.test",g,this.options.loose),this.semver===r||g===r)return!0;if(typeof g=="string")try{g=new d(g,this.options)}catch{return!1}return u(g,this.operator,this.semver,this.options)}intersects(g,v){if(!(g instanceof a))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new m(g.value,v).test(this.value):g.operator===""?g.value===""?!0:new m(this.value,v).test(g.semver):(v=s(v),v.includePrerelease&&(this.value==="<0.0.0-0"||g.value==="<0.0.0-0")||!v.includePrerelease&&(this.value.startsWith("<0.0.0")||g.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&g.operator.startsWith(">")||this.operator.startsWith("<")&&g.operator.startsWith("<")||this.semver.version===g.semver.version&&this.operator.includes("=")&&g.operator.includes("=")||u(this.semver,"<",g.semver,v)&&this.operator.startsWith(">")&&g.operator.startsWith("<")||u(this.semver,">",g.semver,v)&&this.operator.startsWith("<")&&g.operator.startsWith(">")))}}ko=a;const s=Oc(),{safeRe:f,t:c}=ol(),u=_g(),l=Gu(),d=xt(),m=dr();return ko}var Yo,my;function Xu(){if(my)return Yo;my=1;const r=dr();return Yo=(s,f,c)=>{try{f=new r(f,c)}catch{return!1}return f.test(s)},Yo}var Go,yy;function Hb(){if(yy)return Go;yy=1;const r=dr();return Go=(s,f)=>new r(s,f).set.map(c=>c.map(u=>u.value).join(" ").trim().split(" ")),Go}var Vo,gy;function $b(){if(gy)return Vo;gy=1;const r=xt(),a=dr();return Vo=(f,c,u)=>{let l=null,d=null,m=null;try{m=new a(c,u)}catch{return null}return f.forEach(p=>{m.test(p)&&(!l||d.compare(p)===-1)&&(l=p,d=new r(l,u))}),l},Vo}var Io,vy;function kb(){if(vy)return Io;vy=1;const r=xt(),a=dr();return Io=(f,c,u)=>{let l=null,d=null,m=null;try{m=new a(c,u)}catch{return null}return f.forEach(p=>{m.test(p)&&(!l||d.compare(p)===1)&&(l=p,d=new r(l,u))}),l},Io}var Xo,by;function Yb(){if(by)return Xo;by=1;const r=xt(),a=dr(),s=Vu();return Xo=(c,u)=>{c=new a(c,u);let l=new r("0.0.0");if(c.test(l)||(l=new r("0.0.0-0"),c.test(l)))return l;l=null;for(let d=0;d{const v=new r(g.semver.version);switch(g.operator){case">":v.prerelease.length===0?v.patch++:v.prerelease.push(0),v.raw=v.format();case"":case">=":(!p||s(v,p))&&(p=v);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${g.operator}`)}}),p&&(!l||s(l,p))&&(l=p)}return l&&c.test(l)?l:null},Xo}var Zo,Ey;function Gb(){if(Ey)return Zo;Ey=1;const r=dr();return Zo=(s,f)=>{try{return new r(s,f).range||"*"}catch{return null}},Zo}var Qo,Ay;function Dc(){if(Ay)return Qo;Ay=1;const r=xt(),a=Iu(),{ANY:s}=a,f=dr(),c=Xu(),u=Vu(),l=Tc(),d=xc(),m=Rc();return Qo=(g,v,T,j)=>{g=new r(g,j),v=new f(v,j);let C,N,D,X,k;switch(T){case">":C=u,N=d,D=l,X=">",k=">=";break;case"<":C=l,N=m,D=u,X="<",k="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(c(g,v,j))return!1;for(let I=0;I{U.semver===s&&(U=new a(">=0.0.0")),te=te||U,R=R||U,C(U.semver,te.semver,j)?te=U:D(U.semver,R.semver,j)&&(R=U)}),te.operator===X||te.operator===k||(!R.operator||R.operator===X)&&N(g,R.semver))return!1;if(R.operator===k&&D(g,R.semver))return!1}return!0},Qo}var Ko,_y;function Vb(){if(_y)return Ko;_y=1;const r=Dc();return Ko=(s,f,c)=>r(s,f,">",c),Ko}var Fo,wy;function Ib(){if(wy)return Fo;wy=1;const r=Dc();return Fo=(s,f,c)=>r(s,f,"<",c),Fo}var Po,Oy;function Xb(){if(Oy)return Po;Oy=1;const r=dr();return Po=(s,f,c)=>(s=new r(s,c),f=new r(f,c),s.intersects(f,c)),Po}var Jo,Sy;function Zb(){if(Sy)return Jo;Sy=1;const r=Xu(),a=hr();return Jo=(s,f,c)=>{const u=[];let l=null,d=null;const m=s.sort((T,j)=>a(T,j,c));for(const T of m)r(T,f,c)?(d=T,l||(l=T)):(d&&u.push([l,d]),d=null,l=null);l&&u.push([l,null]);const p=[];for(const[T,j]of u)T===j?p.push(T):!j&&T===m[0]?p.push("*"):j?T===m[0]?p.push(`<=${j}`):p.push(`${T} - ${j}`):p.push(`>=${T}`);const g=p.join(" || "),v=typeof f.raw=="string"?f.raw:String(f);return g.length{if(v===T)return!0;v=new r(v,j),T=new r(T,j);let C=!1;e:for(const N of v.set){for(const D of T.set){const X=m(N,D,j);if(C=C||X!==null,X)continue e}if(C)return!1}return!0},l=[new a(">=0.0.0-0")],d=[new a(">=0.0.0")],m=(v,T,j)=>{if(v===T)return!0;if(v.length===1&&v[0].semver===s){if(T.length===1&&T[0].semver===s)return!0;j.includePrerelease?v=l:v=d}if(T.length===1&&T[0].semver===s){if(j.includePrerelease)return!0;T=d}const C=new Set;let N,D;for(const _ of v)_.operator===">"||_.operator===">="?N=p(N,_,j):_.operator==="<"||_.operator==="<="?D=g(D,_,j):C.add(_.semver);if(C.size>1)return null;let X;if(N&&D){if(X=c(N.semver,D.semver,j),X>0)return null;if(X===0&&(N.operator!==">="||D.operator!=="<="))return null}for(const _ of C){if(N&&!f(_,String(N),j)||D&&!f(_,String(D),j))return null;for(const w of T)if(!f(_,String(w),j))return!1;return!0}let k,I,W,te,R=D&&!j.includePrerelease&&D.semver.prerelease.length?D.semver:!1,U=N&&!j.includePrerelease&&N.semver.prerelease.length?N.semver:!1;R&&R.prerelease.length===1&&D.operator==="<"&&R.prerelease[0]===0&&(R=!1);for(const _ of T){if(te=te||_.operator===">"||_.operator===">=",W=W||_.operator==="<"||_.operator==="<=",N){if(U&&_.semver.prerelease&&_.semver.prerelease.length&&_.semver.major===U.major&&_.semver.minor===U.minor&&_.semver.patch===U.patch&&(U=!1),_.operator===">"||_.operator===">="){if(k=p(N,_,j),k===_&&k!==N)return!1}else if(N.operator===">="&&!f(N.semver,String(_),j))return!1}if(D){if(R&&_.semver.prerelease&&_.semver.prerelease.length&&_.semver.major===R.major&&_.semver.minor===R.minor&&_.semver.patch===R.patch&&(R=!1),_.operator==="<"||_.operator==="<="){if(I=g(D,_,j),I===_&&I!==D)return!1}else if(D.operator==="<="&&!f(D.semver,String(_),j))return!1}if(!_.operator&&(D||N)&&X!==0)return!1}return!(N&&W&&!D&&X!==0||D&&te&&!N&&X!==0||U||R)},p=(v,T,j)=>{if(!v)return T;const C=c(v.semver,T.semver,j);return C>0?v:C<0||T.operator===">"&&v.operator===">="?T:v},g=(v,T,j)=>{if(!v)return T;const C=c(v.semver,T.semver,j);return C<0?v:C>0||T.operator==="<"&&v.operator==="<="?T:v};return Wo=u,Wo}var ec,Ry;function Kb(){if(Ry)return ec;Ry=1;const r=ol(),a=Yu(),s=xt(),f=bg(),c=Pa(),u=Sb(),l=Tb(),d=Rb(),m=xb(),p=Db(),g=Nb(),v=Mb(),T=jb(),j=hr(),C=Cb(),N=Lb(),D=Sc(),X=zb(),k=Ub(),I=Vu(),W=Tc(),te=Eg(),R=Ag(),U=Rc(),_=xc(),w=_g(),E=Bb(),q=Iu(),G=dr(),ce=Xu(),K=Hb(),z=$b(),x=kb(),Z=Yb(),P=Gb(),J=Dc(),O=Vb(),$=Ib(),ee=Xb(),se=Zb(),ie=Qb();return ec={parse:c,valid:u,clean:l,inc:d,diff:m,major:p,minor:g,patch:v,prerelease:T,compare:j,rcompare:C,compareLoose:N,compareBuild:D,sort:X,rsort:k,gt:I,lt:W,eq:te,neq:R,gte:U,lte:_,cmp:w,coerce:E,Comparator:q,Range:G,satisfies:ce,toComparators:K,maxSatisfying:z,minSatisfying:x,minVersion:Z,validRange:P,outside:J,gtr:O,ltr:$,intersects:ee,simplifyRange:se,subset:ie,SemVer:s,re:r.re,src:r.src,tokens:r.t,SEMVER_SPEC_VERSION:a.SEMVER_SPEC_VERSION,RELEASE_TYPES:a.RELEASE_TYPES,compareIdentifiers:f.compareIdentifiers,rcompareIdentifiers:f.rcompareIdentifiers},ec}var tc=Kb(),rc={exports:{}};/** +`)},_domwindow:function(){return w("domwindow")},_bigint:function(b){return w("bigint:"+b.toString())},_process:function(){return w("process")},_timer:function(){return w("timer")},_pipe:function(){return w("pipe")},_tcp:function(){return w("tcp")},_udp:function(){return w("udp")},_tty:function(){return w("tty")},_statwatcher:function(){return w("statwatcher")},_securecontext:function(){return w("securecontext")},_connection:function(){return w("connection")},_zlib:function(){return w("zlib")},_context:function(){return w("context")},_nodescript:function(){return w("nodescript")},_httpparser:function(){return w("httpparser")},_dataview:function(){return w("dataview")},_signal:function(){return w("signal")},_fsevent:function(){return w("fsevent")},_tlswrap:function(){return w("tlswrap")}}}function re(){return{buf:"",write:function(x){this.buf+=x},end:function(x){this.buf+=x},read:function(){return this.buf}}}c.writeToStream=function(x,U,_){return _===void 0&&(_=U,U={}),W(U=H(x,U),_).dispatch(x)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/fake_9a5aa49d.js","/")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(s,o,c){(function(l,u,d,m,p,g,v,R,C){(function(L){var j=typeof Uint8Array<"u"?Uint8Array:Array,N=43,V=47,H=48,X=97,W=65,re=45,x=95;function U(_){return _=_.charCodeAt(0),_===N||_===re?62:_===V||_===x?63:_>16),z((65280&b)>>8),z(255&b);return B==2?z(255&(b=U(_.charAt(w))<<2|U(_.charAt(w+1))>>4)):B==1&&(z((b=U(_.charAt(w))<<10|U(_.charAt(w+1))<<4|U(_.charAt(w+2))>>2)>>8&255),z(255&b)),Y},L.fromByteArray=function(_){var w,b,B,Y,ce=_.length%3,K="";function z(D){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(D)}for(w=0,B=_.length-ce;w>18&63)+z(Y>>12&63)+z(Y>>6&63)+z(63&Y);switch(ce){case 1:K=(K+=z((b=_[_.length-1])>>2))+z(b<<4&63)+"==";break;case 2:K=(K=(K+=z((b=(_[_.length-2]<<8)+_[_.length-1])>>10))+z(b>>4&63))+z(b<<2&63)+"="}return K}})(c===void 0?this.base64js={}:c)}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js","/node_modules/gulp-browserify/node_modules/base64-js/lib")},{buffer:3,lYpoI2:11}],3:[function(s,o,c){(function(l,u,N,m,p,g,v,R,C){var L=s("base64-js"),j=s("ieee754");function N(E,T,O){if(!(this instanceof N))return new N(E,T,O);var Q,ie,fe,Ee,De=typeof E;if(T==="base64"&&De=="string")for(E=(Ee=E).trim?Ee.trim():Ee.replace(/^\s+|\s+$/g,"");E.length%4!=0;)E+="=";if(De=="number")Q=J(E);else if(De=="string")Q=N.byteLength(E,T);else{if(De!="object")throw new Error("First argument needs to be a number, array or string.");Q=J(E.length)}if(N._useTypedArrays?ie=N._augment(new Uint8Array(Q)):((ie=this).length=Q,ie._isBuffer=!0),N._useTypedArrays&&typeof E.byteLength=="number")ie._set(E);else if(P(Ee=E)||N.isBuffer(Ee)||Ee&&typeof Ee=="object"&&typeof Ee.length=="number")for(fe=0;fe>8,Ee=Ee%256,De.push(Ee),De.push(fe);return De})(T),E,O,Q)}function X(E,T,O){var Q="";O=Math.min(E.length,O);for(var ie=T;ie>>0)):(T+1>>0),ie}function x(E,T,O,Q){if(Q||(te(typeof O=="boolean","missing or invalid endian"),te(T!=null,"missing offset"),te(T+1>>8*(Q?fe:1-fe)}function B(E,T,O,Q,ie){if(ie||(te(T!=null,"missing value"),te(typeof Q=="boolean","missing or invalid endian"),te(O!=null,"missing offset"),te(O+3>>8*(Q?fe:3-fe)&255}function Y(E,T,O,Q,ie){ie||(te(T!=null,"missing value"),te(typeof Q=="boolean","missing or invalid endian"),te(O!=null,"missing offset"),te(O+1this.length&&(Q=this.length);var ie=(Q=E.length-T=this.length))return this[E]},N.prototype.readUInt16LE=function(E,T){return W(this,E,!0,T)},N.prototype.readUInt16BE=function(E,T){return W(this,E,!1,T)},N.prototype.readUInt32LE=function(E,T){return re(this,E,!0,T)},N.prototype.readUInt32BE=function(E,T){return re(this,E,!1,T)},N.prototype.readInt8=function(E,T){if(T||(te(E!=null,"missing offset"),te(E=this.length))return 128&this[E]?-1*(255-this[E]+1):this[E]},N.prototype.readInt16LE=function(E,T){return x(this,E,!0,T)},N.prototype.readInt16BE=function(E,T){return x(this,E,!1,T)},N.prototype.readInt32LE=function(E,T){return U(this,E,!0,T)},N.prototype.readInt32BE=function(E,T){return U(this,E,!1,T)},N.prototype.readFloatLE=function(E,T){return _(this,E,!0,T)},N.prototype.readFloatBE=function(E,T){return _(this,E,!1,T)},N.prototype.readDoubleLE=function(E,T){return w(this,E,!0,T)},N.prototype.readDoubleBE=function(E,T){return w(this,E,!1,T)},N.prototype.writeUInt8=function(E,T,O){O||(te(E!=null,"missing value"),te(T!=null,"missing offset"),te(T=this.length||(this[T]=E)},N.prototype.writeUInt16LE=function(E,T,O){b(this,E,T,!0,O)},N.prototype.writeUInt16BE=function(E,T,O){b(this,E,T,!1,O)},N.prototype.writeUInt32LE=function(E,T,O){B(this,E,T,!0,O)},N.prototype.writeUInt32BE=function(E,T,O){B(this,E,T,!1,O)},N.prototype.writeInt8=function(E,T,O){O||(te(E!=null,"missing value"),te(T!=null,"missing offset"),te(T=this.length||(0<=E?this.writeUInt8(E,T,O):this.writeUInt8(255+E+1,T,O))},N.prototype.writeInt16LE=function(E,T,O){Y(this,E,T,!0,O)},N.prototype.writeInt16BE=function(E,T,O){Y(this,E,T,!1,O)},N.prototype.writeInt32LE=function(E,T,O){ce(this,E,T,!0,O)},N.prototype.writeInt32BE=function(E,T,O){ce(this,E,T,!1,O)},N.prototype.writeFloatLE=function(E,T,O){K(this,E,T,!0,O)},N.prototype.writeFloatBE=function(E,T,O){K(this,E,T,!1,O)},N.prototype.writeDoubleLE=function(E,T,O){z(this,E,T,!0,O)},N.prototype.writeDoubleBE=function(E,T,O){z(this,E,T,!1,O)},N.prototype.fill=function(E,T,O){if(T=T||0,O=O||this.length,te(typeof(E=typeof(E=E||0)=="string"?E.charCodeAt(0):E)=="number"&&!isNaN(E),"value is not a number"),te(T<=O,"end < start"),O!==T&&this.length!==0){te(0<=T&&T"},N.prototype.toArrayBuffer=function(){if(typeof Uint8Array>"u")throw new Error("Buffer.toArrayBuffer not supported in this browser");if(N._useTypedArrays)return new N(this).buffer;for(var E=new Uint8Array(this.length),T=0,O=E.length;T=T.length||ie>=E.length);ie++)T[ie+O]=E[ie];return ie}function ue(E){try{return decodeURIComponent(E)}catch{return"�"}}function he(E,T){te(typeof E=="number","cannot write a non-number as a number"),te(0<=E,"specified a negative value for writing an unsigned value"),te(E<=T,"value is larger than maximum value for type"),te(Math.floor(E)===E,"value has a fractional component")}function de(E,T,O){te(typeof E=="number","cannot write a non-number as a number"),te(E<=T,"value larger than maximum allowed value"),te(O<=E,"value smaller than minimum allowed value"),te(Math.floor(E)===E,"value has a fractional component")}function Te(E,T,O){te(typeof E=="number","cannot write a non-number as a number"),te(E<=T,"value larger than maximum allowed value"),te(O<=E,"value smaller than minimum allowed value")}function te(E,T){if(!E)throw new Error(T||"Failed assertion")}N._augment=function(E){return E._isBuffer=!0,E._get=E.get,E._set=E.set,E.get=D.get,E.set=D.set,E.write=D.write,E.toString=D.toString,E.toLocaleString=D.toString,E.toJSON=D.toJSON,E.copy=D.copy,E.slice=D.slice,E.readUInt8=D.readUInt8,E.readUInt16LE=D.readUInt16LE,E.readUInt16BE=D.readUInt16BE,E.readUInt32LE=D.readUInt32LE,E.readUInt32BE=D.readUInt32BE,E.readInt8=D.readInt8,E.readInt16LE=D.readInt16LE,E.readInt16BE=D.readInt16BE,E.readInt32LE=D.readInt32LE,E.readInt32BE=D.readInt32BE,E.readFloatLE=D.readFloatLE,E.readFloatBE=D.readFloatBE,E.readDoubleLE=D.readDoubleLE,E.readDoubleBE=D.readDoubleBE,E.writeUInt8=D.writeUInt8,E.writeUInt16LE=D.writeUInt16LE,E.writeUInt16BE=D.writeUInt16BE,E.writeUInt32LE=D.writeUInt32LE,E.writeUInt32BE=D.writeUInt32BE,E.writeInt8=D.writeInt8,E.writeInt16LE=D.writeInt16LE,E.writeInt16BE=D.writeInt16BE,E.writeInt32LE=D.writeInt32LE,E.writeInt32BE=D.writeInt32BE,E.writeFloatLE=D.writeFloatLE,E.writeFloatBE=D.writeFloatBE,E.writeDoubleLE=D.writeDoubleLE,E.writeDoubleBE=D.writeDoubleBE,E.fill=D.fill,E.inspect=D.inspect,E.toArrayBuffer=D.toArrayBuffer,E}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/buffer/index.js","/node_modules/gulp-browserify/node_modules/buffer")},{"base64-js":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(s,o,c){(function(l,u,L,m,p,g,v,R,C){var L=s("buffer").Buffer,j=4,N=new L(j);N.fill(0),o.exports={hash:function(V,H,X,W){for(var re=H((function(b,B){b.length%j!=0&&(Y=b.length+(j-b.length%j),b=L.concat([b,N],Y));for(var Y,ce=[],K=B?b.readInt32BE:b.readInt32LE,z=0;zX?I=D(I):I.length>5]|=128<>>9<<4)]=U;for(var _=1732584193,w=-271733879,b=-1732584194,B=271733878,Y=0;Y>>32-b,_)}function V(x,U,_,w,b,B,Y){return N(U&_|~U&w,x,U,b,B,Y)}function H(x,U,_,w,b,B,Y){return N(U&w|_&~w,x,U,b,B,Y)}function X(x,U,_,w,b,B,Y){return N(U^_^w,x,U,b,B,Y)}function W(x,U,_,w,b,B,Y){return N(_^(U|~w),x,U,b,B,Y)}function re(x,U){var _=(65535&x)+(65535&U);return(x>>16)+(U>>16)+(_>>16)<<16|65535&_}o.exports=function(x){return L.hash(x,j,16)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],7:[function(s,o,c){(function(l,u,d,m,p,g,v,R,C){o.exports=function(L){for(var j,N=new Array(L),V=0;V>>((3&V)<<3)&255;return N}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{buffer:3,lYpoI2:11}],8:[function(s,o,c){(function(l,u,d,m,p,g,v,R,C){var L=s("./helpers");function j(H,X){H[X>>5]|=128<<24-X%32,H[15+(X+64>>9<<4)]=X;for(var W,re,x,U=Array(80),_=1732584193,w=-271733879,b=-1732584194,B=271733878,Y=-1009589776,ce=0;ce>16)+(X>>16)+(W>>16)<<16|65535&W}function V(H,X){return H<>>32-X}o.exports=function(H){return L.hash(H,j,20,!0)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],9:[function(s,o,c){(function(l,u,d,m,p,g,v,R,C){function L(X,W){var re=(65535&X)+(65535&W);return(X>>16)+(W>>16)+(re>>16)<<16|65535&re}function j(X,W){var re,x=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),U=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),_=new Array(64);X[W>>5]|=128<<24-W%32,X[15+(W+64>>9<<4)]=W;for(var w,b,B=0;B>>W|X<<32-W},H=function(X,W){return X>>>W};o.exports=function(X){return N.hash(X,j,32,!0)}}).call(this,s("lYpoI2"),typeof self<"u"?self:typeof window<"u"?window:{},s("buffer").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js","/node_modules/gulp-browserify/node_modules/crypto-browserify")},{"./helpers":4,buffer:3,lYpoI2:11}],10:[function(s,o,c){(function(l,u,d,m,p,g,v,R,C){c.read=function(L,j,N,V,B){var X,W,re=8*B-V-1,x=(1<>1,_=-7,w=N?B-1:0,b=N?-1:1,B=L[j+w];for(w+=b,X=B&(1<<-_)-1,B>>=-_,_+=re;0<_;X=256*X+L[j+w],w+=b,_-=8);for(W=X&(1<<-_)-1,X>>=-_,_+=V;0<_;W=256*W+L[j+w],w+=b,_-=8);if(X===0)X=1-U;else{if(X===x)return W?NaN:1/0*(B?-1:1);W+=Math.pow(2,V),X-=U}return(B?-1:1)*W*Math.pow(2,X-V)},c.write=function(L,j,N,V,H,Y){var W,re,x=8*Y-H-1,U=(1<>1,w=H===23?Math.pow(2,-24)-Math.pow(2,-77):0,b=V?0:Y-1,B=V?1:-1,Y=j<0||j===0&&1/j<0?1:0;for(j=Math.abs(j),isNaN(j)||j===1/0?(re=isNaN(j)?1:0,W=U):(W=Math.floor(Math.log(j)/Math.LN2),j*(V=Math.pow(2,-W))<1&&(W--,V*=2),2<=(j+=1<=W+_?w/V:w*Math.pow(2,1-_))*V&&(W++,V/=2),U<=W+_?(re=0,W=U):1<=W+_?(re=(j*V-1)*Math.pow(2,H),W+=_):(re=j*Math.pow(2,_-1)*Math.pow(2,H),W=0));8<=H;L[N+b]=255&re,b+=B,re/=256,H-=8);for(W=W<"u"?1:0;let c=o?r[0]:s;for(let l=o;l/g,""),/\.{3}|=/.test(a))?0:r.length}function m0(r,...a){let s="";const o=this;for(let c=0;cil(o,a,s));if(r&&typeof r=="object"){const o=Object.keys(r)[0],c=r[o];if(a.isData(r,o)||c===void 0)return!0;if(!a.methods[o])throw new Error(`Method '${o}' was not found in the Logic Engine.`);return a.methods[o].traverse===!1?typeof a.methods[o].deterministic=="function"?a.methods[o].deterministic(c,s):a.methods[o].deterministic:typeof a.methods[o].deterministic=="function"?a.methods[o].deterministic(c,s):a.methods[o].deterministic&&il(c,a,s)}return!0}function hc(r,a){if(!a.async)return!0;if(Array.isArray(r))return r.every(s=>hc(s,a));if(typeof r=="object"){const s=Object.keys(r)[0],o=r[s];return cr(a.methods[s])?a.methods[s].traverse===!1?!!(typeof a.methods[s][tt]=="function"&&a.methods[s][tt](r,{engine:a})):hc(o,a):!1}return!0}function Ce(r,a={}){const{notTraversed:s=[],async:o,processing:c=[],values:l=[],engine:u}=a;function d(v,R=!1){return gb(v,R)?JSON.stringify(v):(l.push(v),`values[${l.length-1}]`)}if(Array.isArray(r)){let v="";for(let R=0;R0&&(v+=","),v+=Ce(r[R],a);return"["+v+"]"}let m=!1;function p(v){return a.asyncDetected=a.asyncDetected||m,o&&m?`await ${v}`:v}const g=r&&Object.keys(r)[0];if(r&&typeof r=="object"){if(!g)return d(r);if(!u.methods[g]){if(u.isData(r,g))return d(r,!0);throw new Error(`Method '${g}' was not found in the Logic Engine.`)}if(!a.engine.disableInline&&u.methods[g]&&il(r,u,a))return hc(r,u)?d((u.fallback||u).run(r),!0):a.avoidInlineAsync?(a.asyncDetected=!0,`(await ${d(u.run(r))})`):(c.push(u.run(r).then(L=>d(L))),`__%%%${c.length-1}%%%__`);let v=r[g];if((!v||typeof v!="object")&&(v=[v]),u.methods[g]&&u.methods[g].compile){let L=u.methods[g].compile(v,a);if(L[tl]&&(L=L[tl]),(L||"").startsWith("await")&&(a.asyncDetected=!0),L!==!1)return L}let R=u.methods[g].optimizeUnary?"":"coerceArray";!R&&Array.isArray(v)&&v.length===1?v=v[0]:R&&Array.isArray(v)&&(R="");const C=[", context",", context, above",", context, above, engine"];if(typeof u.methods[g]=="function"){m=!cr(u.methods[g]);const L=C[Bm(u.methods[g])-1]||C[2];return p(`engine.methods["${g}"](${R}(`+Ce(v,a)+")"+L+")")}else{m=!!(o&&u.methods[g]&&u.methods[g].asyncMethod);const L=Bm(m?u.methods[g].asyncMethod:u.methods[g].method),j=C[L-1]||C[2];return u.methods[g]&&(typeof u.methods[g].traverse>"u"||u.methods[g].traverse)?p(`engine.methods["${g}"]${m?".asyncMethod":".method"}(${R}(`+Ce(v,a)+")"+j+")"):(s.push(v),p(`engine.methods["${g}"]${m?".asyncMethod":".method"}(notTraversed[${s.length-1}]`+j+")"))}}return d(r)}function Lu(r,a={}){Object.assign(a,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:a.engine.async,asyncDetected:!1,values:[],compile:m0},a));const s=Ce(r,a);return y0(r,s,a)}async function vb(r,a={}){Object.assign(a,Object.assign({notTraversed:[],methods:[],state:{},processing:[],async:a.engine.async,asyncDetected:!1,values:[],compile:m0},a));const s=Ce(r,a);return a.processing=await Promise.all(a.processing||[]),y0(r,s,a)}function y0(r,a,s){const{engine:o,methods:c,notTraversed:l,processing:u=[],values:d}=s,m=[];u.forEach((g,v)=>{a=a.replace(`__%%%${v}%%%__`,g)});const p=`(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${s.asyncDetected?"async":""} (context ${s.extraArguments?","+s.extraArguments:""}) => { const result = ${a}; return result }`;return Object.assign((typeof globalThis<"u"?globalThis:global).eval(p)(d,c,l,Cu,o,m,wn),{[tt]:!s.asyncDetected,aboveDetected:typeof a=="string"&&a.includes(", above")})}const bb=()=>{try{const r={};return(typeof globalThis<"u"?globalThis:global).eval("(test) => test?.foo?.bar")(r)===void 0}catch{return!1}},g0=bb();class Er extends Error{constructor(a){super(),this.message="Built-in control structures are not allowed to receive dynamic inputs, this could allow a lesser version of remote-code execution.",this.input=a}}const Pi=new Map;function zu(r){if(Pi.has(r))return Pi.get(r);Pi.size>2048&&Pi.clear();const a=Eb(r);return Pi.set(r,a),a}function Eb(r,a=".",s="\\",o="/"){const c=[];let l="";for(let u=0;unr(o,a,s));if(r&&typeof r=="object"){const o=Object.keys(r)[0],c=r[o];if(a.isData(r,o))return!0;if(!a.methods[o])throw new Error(`Method '${o}' was not found in the Logic Engine.`);return a.methods[o].traverse===!1?typeof a.methods[o].deterministic=="function"?a.methods[o].deterministic(c,s):a.methods[o].deterministic:typeof a.methods[o].deterministic=="function"?a.methods[o].deterministic(c,s):a.methods[o].deterministic&&nr(c,a,s)}return!0}function En(r,a,s){if(Array.isArray(r))return r.every(o=>En(o,a,s));if(r&&typeof r=="object"){const o=Object.keys(r)[0],c=r[o];if(a.isData(r,o))return!0;if(!a.methods[o])throw new Error(`Method '${o}' was not found in the Logic Engine.`);return a.methods[o].traverse===!1?typeof a.methods[o][tt]=="function"?a.methods[o][tt](c,s):a.methods[o][tt]:typeof a.methods[o][tt]=="function"?a.methods[o][tt](c,s):a.methods[o][tt]&&En(c,a,s)}return!0}const _e={"+":r=>{if(typeof r=="string"||typeof r=="number")return+r;let a=0;for(let s=0;s{let a=1;for(let s=0;s{let a=r[0];for(let s=1;s{if(typeof r=="string"||typeof r=="number")return-r;if(r.length===1)return-r[0];let a=r[0];for(let s=1;s{let a=r[0];for(let s=1;sMath.max(...r),min:r=>Math.min(...r),in:([r,a])=>(a||[]).includes(r),">":([r,a])=>r>a,"<":([r,a,s])=>s===void 0?rr,!0),[tt]:()=>!0},if:{method:(r,a,s,o)=>{if(!Array.isArray(r))throw new Er(r);if(r.length===1)return o.run(r[0],a,{above:s});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const l=r.shift(),u=r.shift(),d=o.run(l,a,{above:s});if(o.truthy(d))return o.run(u,a,{above:s})}return o.run(c,a,{above:s})},[tt]:(r,a)=>En(r,a.engine,a),deterministic:(r,a)=>nr(r,a.engine,a),asyncMethod:async(r,a,s,o)=>{if(!Array.isArray(r))throw new Er(r);if(r.length===1)return o.run(r[0],a,{above:s});if(r.length<2)return null;r=[...r],r.length%2!==1&&r.push(null);const c=r.pop();for(;r.length;){const l=r.shift(),u=r.shift(),d=await o.run(l,a,{above:s});if(o.truthy(d))return o.run(u,a,{above:s})}return o.run(c,a,{above:s})},traverse:!1},"<=":([r,a,s])=>s===void 0?r<=a:r<=a&&a<=s,">=":([r,a])=>r>=a,"==":([r,a])=>r==a,"===":([r,a])=>r===a,"!=":([r,a])=>r!=a,"!==":([r,a])=>r!==a,xor:([r,a])=>r^a,or:{method:(r,a,s,o)=>{const c=Array.isArray(r);c||(r=o.run(r,a,{above:s}));let l;for(let u=0;u{const c=Array.isArray(r);c||(r=await o.run(r,a,{above:s}));let l;for(let u=0;unr(r,a.engine,a),compile:(r,a)=>a.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(s=>Ce(s,a)).join(" || ")})`:`(${Ce(r,a)}).reduce((a,b) => a||b, false)`:!1,traverse:!1},and:{method:(r,a,s,o)=>{const c=Array.isArray(r);c||(r=o.run(r,a,{above:s}));let l;for(let u=0;u{const c=Array.isArray(r);c||(r=await o.run(r,a,{above:s}));let l;for(let u=0;unr(r,a.engine,a),compile:(r,a)=>a.engine.truthy.IDENTITY?Array.isArray(r)?`(${r.map(s=>Ce(s,a)).join(" && ")})`:`(${Ce(r,a)}).reduce((a,b) => a&&b, true)`:!1},substr:([r,a,s])=>{if(s<0){const o=r.substr(a);return o.substr(0,o.length+s)}return r.substr(a,s)},length:([r])=>typeof r=="string"||Array.isArray(r)?r.length:r&&typeof r=="object"?Object.keys(r).length:0,get:{method:([r,a,s],o,c,l)=>{const u=s===void 0?null:s,d=zu(String(a));for(let m=0;m{let c;Array.isArray(r)&&(c=r[1],r=r[0]);let l=0;for(;typeof r=="string"&&r.startsWith("../")&&l"u"||r===""||r===null)return o.allowFunctions||typeof a!="function"?a:null;const d=zu(String(r));for(let m=0;m(Array.isArray(r)?r:[r]).filter(c=>_e.var(c,a,s,o)===null),missing_some:([r,a],s,o,c)=>{const l=_e.missing(a,s,o,c);return a.length-l.length>=r?[]:l},map:Ji("map"),some:Ji("some",!0),all:Ji("every",!0),none:{traverse:!1,method:(r,a,s,o)=>!_e.some.method(r,a,s,o),asyncMethod:async(r,a,s,o)=>!await _e.some.asyncMethod(r,a,s,o),compile:(r,a)=>{const s=_e.some.compile(r,a);return s?a.compile`!(${s})`:!1}},merge:r=>Array.isArray(r)?[].concat(...r):[r],every:Ji("every"),filter:Ji("filter"),reduce:{deterministic:(r,a)=>nr(r[0],a.engine,a)&&nr(r[1],a.engine,{...a,insideIterator:!0}),compile:(r,a)=>{if(!Array.isArray(r))throw new Er(r);const{async:s}=a;let[o,c,l]=r;o=Ce(o,a),typeof l<"u"&&(l=Ce(l,a));const u={...a,extraArguments:"above",avoidInlineAsync:!0};c=Lu(c,u);const d=c.aboveDetected?"[null, context, above]":"null";return a.methods.push(c),s&&(!cr(c)||o.includes("await"))?(a.detectAsync=!0,typeof l<"u"?`await asyncIterators.reduce(${o} || [], (a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${l})`:`await asyncIterators.reduce(${o} || [], (a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}))`):typeof l<"u"?`(${o} || []).reduce((a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}), ${l})`:`(${o} || []).reduce((a,b) => methods[${a.methods.length-1}]({ accumulator: a, current: b }, ${d}))`},method:(r,a,s,o)=>{if(!Array.isArray(r))throw new Er(r);let[c,l,u]=r;u=o.run(u,a,{above:s}),c=o.run(c,a,{above:s})||[];const d=(m,p)=>o.run(l,{accumulator:m,current:p},{above:[c,a,s]});return typeof u>"u"?c.reduce(d):c.reduce(d,u)},[tt]:(r,a)=>En(r,a.engine,a),asyncMethod:async(r,a,s,o)=>{if(!Array.isArray(r))throw new Er(r);let[c,l,u]=r;return u=await o.run(u,a,{above:s}),c=await o.run(c,a,{above:s})||[],Cu.reduce(c,(d,m)=>o.run(l,{accumulator:d,current:m},{above:[c,a,s]}),u)},traverse:!1},"!":(r,a,s,o)=>Array.isArray(r)?!o.truthy(r[0]):!o.truthy(r),"!!":(r,a,s,o)=>!!(Array.isArray(r)?o.truthy(r[0]):o.truthy(r)),cat:r=>{if(typeof r=="string")return r;let a="";for(let s=0;stypeof r=="object"?Object.keys(r):[],pipe:{traverse:!1,[tt]:(r,a)=>En(r,a.engine,a),method:(r,a,s,o)=>{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=o.run(r[0],a,{above:[r,a,s]});for(let l=1;l{if(!Array.isArray(r))throw new Error("Data for pipe must be an array");let c=await o.run(r[0],a,{above:[r,a,s]});for(let l=1;l{let s=a.compile`${r[0]}`;for(let o=1;o{if(!Array.isArray(r))return!1;r=[...r];const s=r.shift();return nr(s,a.engine,a)&&nr(r,a.engine,{...a,insideIterator:!0})}},eachKey:{traverse:!1,[tt]:(r,a)=>En(Object.values(r[Object.keys(r)[0]]),a.engine,a),method:(r,a,s,o)=>Object.keys(r).reduce((l,u)=>{const d=r[u];return Object.defineProperty(l,u,{enumerable:!0,value:o.run(d,a,{above:s})}),l},{}),deterministic:(r,a)=>{if(r&&typeof r=="object")return Object.values(r).every(s=>nr(s,a.engine,a));throw new Er(r)},compile:(r,a)=>{if(r&&typeof r=="object")return`({ ${Object.keys(r).reduce((o,c)=>(o.push(`${JSON.stringify(c)}: ${Ce(r[c],a)}`),o),[]).join(",")} })`;throw new Er(r)},asyncMethod:async(r,a,s,o)=>await Cu.reduce(Object.keys(r),async(l,u)=>{const d=r[u];return Object.defineProperty(l,u,{enumerable:!0,value:await o.run(d,a,{above:s})}),l},{})}};function Ji(r,a=!1){return{deterministic:(s,o)=>nr(s[0],o.engine,o)&&nr(s[1],o.engine,{...o,insideIterator:!0}),[tt]:(s,o)=>En(s,o.engine,o),method:(s,o,c,l)=>{if(!Array.isArray(s))throw new Er(s);let[u,d]=s;return u=l.run(u,o,{above:c})||[],u[r]((m,p)=>{const g=l.run(d,m,{above:[{iterator:u,index:p},o,c]});return a?l.truthy(g):g})},asyncMethod:async(s,o,c,l)=>{if(!Array.isArray(s))throw new Er(s);let[u,d]=s;return u=await l.run(u,o,{above:c})||[],Cu[r](u,(m,p)=>{const g=l.run(d,m,{above:[{iterator:u,index:p},o,c]});return a?l.truthy(g):g})},compile:(s,o)=>{if(!Array.isArray(s))throw new Er(s);const{async:c}=o,[l,u]=s,d={...o,avoidInlineAsync:!0,iteratorCompile:!0,extraArguments:"index, above"},m=Lu(u,d),p=m.aboveDetected?o.compile`[{ iterator: z, index: x }, context, above]`:o.compile`null`;return c&&!En(u,o.engine,o)?(o.detectAsync=!0,o.compile`await asyncIterators[${r}](${l} || [], async (i, x, z) => ${m}(i, x, ${p}))`):o.compile`(${l} || [])[${r}]((i, x, z) => ${m}(i, x, ${p}))`},traverse:!1}}_e["?:"]=_e.if;Object.keys(_e).forEach(r=>{typeof _e[r]=="function"&&(_e[r][tt]=!0),_e[r].deterministic=typeof _e[r].deterministic>"u"?!0:_e[r].deterministic});_e.var.deterministic=(r,a)=>a.insideIterator&&!String(r).includes("../../");Object.assign(_e.missing,{deterministic:!1});Object.assign(_e.missing_some,{deterministic:!1});_e["<"].compile=function(r,a){return Array.isArray(r)?r.length===2?a.compile`(${r[0]} < ${r[1]})`:r.length===3?a.compile`(${r[0]} < ${r[1]} && ${r[1]} < ${r[2]})`:!1:!1};_e["<="].compile=function(r,a){return Array.isArray(r)?r.length===2?a.compile`(${r[0]} <= ${r[1]})`:r.length===3?a.compile`(${r[0]} <= ${r[1]} && ${r[1]} <= ${r[2]})`:!1:!1};_e.min.compile=function(r,a){return Array.isArray(r)?`Math.min(${r.map(s=>Ce(s,a)).join(", ")})`:!1};_e.max.compile=function(r,a){return Array.isArray(r)?`Math.max(${r.map(s=>Ce(s,a)).join(", ")})`:!1};_e[">"].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} > ${r[1]})`};_e[">="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} >= ${r[1]})`};_e["=="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} == ${r[1]})`};_e["!="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} != ${r[1]})`};_e.if.compile=function(r,a){if(!Array.isArray(r)||r.length<3)return!1;r=[...r],r.length%2!==1&&r.push(null);const s=r.pop();let o=a.compile``;for(;r.length;){const c=r.shift(),l=r.shift();o=a.compile`${o} engine.truthy(${c}) ? ${l} : `}return a.compile`(${o} ${s})`};_e["==="].compile=function(r,a){return!Array.isArray(r)||r.length!==2?!1:a.compile`(${r[0]} === ${r[1]})`};_e["+"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" + ")})`:typeof r=="string"||typeof r=="number"?`(+${Ce(r,a)})`:`([].concat(${Ce(r,a)})).reduce((a,b) => (+a)+(+b), 0)`};_e["%"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" % ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)%(+b))`};_e.in.compile=function(r,a){return Array.isArray(r)?a.compile`(${r[1]} || []).includes(${r[0]})`:!1};_e["-"].compile=function(r,a){return Array.isArray(r)?`${r.length===1?"-":""}(${r.map(s=>`(+${Ce(s,a)})`).join(" - ")})`:typeof r=="string"||typeof r=="number"?`(-${Ce(r,a)})`:`((a=>(a.length===1?a[0]=-a[0]:a)&0||a)([].concat(${Ce(r,a)}))).reduce((a,b) => (+a)-(+b))`};_e["/"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" / ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)/(+b))`};_e["*"].compile=function(r,a){return Array.isArray(r)?`(${r.map(s=>`(+${Ce(s,a)})`).join(" * ")})`:`(${Ce(r,a)}).reduce((a,b) => (+a)*(+b))`};_e.cat.compile=function(r,a){if(typeof r=="string")return JSON.stringify(r);if(!Array.isArray(r))return!1;let s=a.compile`''`;for(let o=0;o"u"?null:r[2],o&&typeof o=="object")return!1;o=o.toString();const l=zu(o);return g0?`((${Ce(c,a)})${l.map(u=>`?.[${Ce(u,a)}]`).join("")} ?? ${Ce(s,a)})`:`(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${l.reduce((u,d)=>`(${u}||0)[${JSON.stringify(d)}]`,`(${Ce(c,a)}||0)`)}, ${Ce(s,a)}))`}return!1};_e.var.compile=function(r,a){let s=r,o=null;if(a.varTop=a.varTop||new Set,!s||typeof r=="string"||typeof r=="number"||Array.isArray(r)&&r.length<=2){if(Array.isArray(r)&&(s=r[0],o=typeof r[1]>"u"?null:r[1]),s==="../index"&&a.iteratorCompile)return"index";if(typeof s>"u"||s===null||s==="")return"context";if(typeof s!="string"&&typeof s!="number"||(s=s.toString(),s.includes("../")))return!1;const c=zu(s),[l]=c;return a.varTop.add(l),a.engine.allowFunctions?a.methods.preventFunctions=u=>u:a.methods.preventFunctions=u=>typeof u=="function"?null:u,g0?`(methods.preventFunctions(context${c.map(u=>`?.[${JSON.stringify(u)}]`).join("")} ?? ${Ce(o,a)}))`:`(methods.preventFunctions(((a,b) => (typeof a === 'undefined' || a === null) ? b : a)(${c.reduce((u,d)=>`(${u}||0)[${JSON.stringify(d)}]`,"(context||0)")}, ${Ce(o,a)})))`}return!1};_e["+"].optimizeUnary=_e["-"].optimizeUnary=_e.var.optimizeUnary=_e["!"].optimizeUnary=_e["!!"].optimizeUnary=_e.cat.optimizeUnary=!0;const wc={..._e},v0=function(a){return Object.keys(a).forEach(s=>{a[s]===void 0&&delete a[s]}),a};function Ab(r,a,s,o){const c=a.methods[s],l=c.method?c.method:c;if(c.traverse===!1){const d=r[s];return(m,p)=>l(d,m,p||o,a)}let u=r[s];if((!u||typeof u!="object")&&(u=[u]),Array.isArray(u)){const d=u.map(m=>Uu(m,a,o));return(m,p)=>{const g=d.map(v=>typeof v=="function"?v(m,p):v);return l(g,m,p||o,a)}}else{const d=Uu(u,a,o);return(m,p)=>l(wn(typeof d=="function"?d(m,p):d,c.optimizeUnary),m,p||o,a)}}function Uu(r,a,s=[]){if(Array.isArray(r)){const o=r.map(c=>Uu(c,a,s));return(c,l)=>o.map(u=>typeof u=="function"?u(c,l):u)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(a.isData(r,c))return()=>r;const u=!a.disableInline&&il(r,a,{engine:a});if(c in a.methods){const d=Ab(r,a,c,s);return u?d():d}}return r}const Ou=wc.all,_b={method:(r,a,s,o)=>{if(Array.isArray(r)){const c=o.run(r[0],a,s);if(Array.isArray(c)&&c.length===0)return!1}return Ou.method(r,a,s,o)},asyncMethod:async(r,a,s,o)=>{if(Array.isArray(r)){const c=await o.run(r[0],a,s);if(Array.isArray(c)&&c.length===0)return!1}return Ou.asyncMethod(r,a,s,o)},deterministic:Ou.deterministic,traverse:Ou.traverse};function wb(r){return Array.isArray(r)&&r.length===0?!1:r}function b0(r){r.methods.all=_b,r.truthy=wb}class Sc{constructor(a=wc,s={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.disableInline=s.disableInline,this.disableInterpretedOptimization=s.disableInterpretedOptimization,this.methods={...a},this.optimizedMap=new WeakMap,this.missesSinceSeen=0,s.compatible&&b0(this),this.options={disableInline:s.disableInline,disableInterpretedOptimization:s.disableInterpretedOptimization},this.isData||(s.permissive?this.isData=(o,c)=>!(c in this.methods):this.isData=()=>!1)}truthy(a){return a}_parse(a,s,o){const[c]=Object.keys(a),l=a[c];if(this.isData(a,c))return a;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const u=!l||typeof l!="object"?[l]:wn(this.run(l,s,{above:o}));return this.methods[c](u,s,o,this)}if(typeof this.methods[c]=="object"){const{method:u,traverse:d}=this.methods[c],p=(typeof d>"u"?!0:d)?!l||typeof l!="object"?[l]:wn(this.run(l,s,{above:o})):l;return u(p,s,o,this)}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(a,s,{deterministic:o,optimizeUnary:c}={}){typeof s=="function"?s={method:s,traverse:!0}:s={...s},Object.assign(s,v0({deterministic:o,optimizeUnary:c})),this.methods[a]=kr(s)}addModule(a,s,o){Object.getOwnPropertyNames(s).forEach(c=>{(typeof s[c]=="function"||typeof s[c]=="object")&&this.addMethod(`${a}${a?".":""}${c}`,s[c],o)})}run(a,s={},o={}){const{above:c=[]}=o;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof a=="object"&&a&&!this.optimizedMap.has(a))return this.optimizedMap.set(a,Uu(a,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(!this.disableInterpretedOptimization&&a&&typeof a=="object"&&this.optimizedMap.get(a))return this.missesSinceSeen=0,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(Array.isArray(a)){const l=[];for(let u=0;u0?this._parse(a,s,c):a}build(a,s={}){const{above:o=[],top:c=!0}=s;if(c){const l=Lu(a,{state:{},engine:this,above:o});return typeof l=="function"||c===!0?(...u)=>typeof l=="function"?l(...u):l:l}return a}}Object.assign(Sc.prototype.truthy,{IDENTITY:!0});function Sb(r,a,s,o){const c=a.methods[s],l=c.asyncMethod?c.asyncMethod:c.method?c.method:c;if(c.traverse===!1){if(typeof c[tt]=="function"&&c[tt](r,{engine:a})){const m=c.method?c.method:c;return kr((p,g)=>m(r[s],p,g||o,a.fallback),!0)}const d=r[s];return(m,p)=>l(d,m,p||o,a)}let u=r[s];if((!u||typeof u!="object")&&(u=[u]),Array.isArray(u)){const d=u.map(m=>Bu(m,a,o));if(cr(d)&&(c.method||c[tt])){const m=c.method?c.method:c;return kr((p,g)=>{const v=d.map(R=>typeof R=="function"?R(p,g):R);return m(v,p,g||o,a.fallback)},!0)}return async(m,p)=>{const g=await _c(d,v=>typeof v=="function"?v(m,p):v);return l(g,m,p||o,a)}}else{const d=Bu(u,a,o);if(cr(d)&&(c.method||c[tt])){const m=c.method?c.method:c;return kr((p,g)=>m(wn(typeof d=="function"?d(p,g):d,c.optimizeUnary),p,g||o,a),!0)}return async(m,p)=>l(wn(typeof d=="function"?await d(m,p):d,c.optimizeUnary),m,p||o,a)}}function Bu(r,a,s=[]){if(a.fallback.allowFunctions=a.allowFunctions,Array.isArray(r)){const o=r.map(c=>Bu(c,a,s));return cr(o)?kr((c,l)=>o.map(u=>typeof u=="function"?u(c,l):u),!0):async(c,l)=>_c(o,u=>typeof u=="function"?u(c,l):u)}if(r&&typeof r=="object"){const c=Object.keys(r)[0];if(a.isData(r,c))return()=>r;const u=!a.disableInline&&il(r,a,{engine:a});if(c in a.methods){const d=Sb(r,a,c,s);if(u){let m;return cr(d)?kr(()=>(m||(m=d()),m),!0):async()=>(m||(m=await d()),m)}return d}}return r}class Ob{constructor(a=wc,s={disableInline:!1,disableInterpretedOptimization:!1,permissive:!1}){this.methods={...a},this.options={disableInline:s.disableInline,disableInterpretedOptimization:s.disableInterpretedOptimization},this.disableInline=s.disableInline,this.disableInterpretedOptimization=s.disableInterpretedOptimization,this.async=!0,this.fallback=new Sc(a,s),s.compatible&&b0(this),this.optimizedMap=new WeakMap,this.missesSinceSeen=0,this.isData||(s.permissive?this.isData=(o,c)=>!(c in this.methods):this.isData=()=>!1),this.fallback.isData=this.isData}truthy(a){return a}async _parse(a,s,o){const[c]=Object.keys(a),l=a[c];if(this.isData(a,c))return a;if(!this.methods[c])throw new Error(`Method '${c}' was not found in the Logic Engine.`);if(typeof this.methods[c]=="function"){const u=!l||typeof l!="object"?[l]:await this.run(l,s,{above:o}),d=await this.methods[c](wn(u),s,o,this);return Array.isArray(d)?Promise.all(d):d}if(typeof this.methods[c]=="object"){const{asyncMethod:u,method:d,traverse:m}=this.methods[c],g=(typeof m>"u"?!0:m)?!l||typeof l!="object"?[l]:wn(await this.run(l,s,{above:o})):l,v=await(u||d)(g,s,o,this);return Array.isArray(v)?Promise.all(v):v}throw new Error(`Method '${c}' is not set up properly.`)}addMethod(a,s,{deterministic:o,async:c,sync:l,optimizeUnary:u}={}){typeof c>"u"&&typeof l>"u"&&(l=!1),typeof l<"u"&&(c=!l),typeof c<"u"&&(l=!c),typeof s=="function"?c?s={asyncMethod:s,traverse:!0}:s={method:s,traverse:!0}:s={...s},Object.assign(s,v0({deterministic:o,optimizeUnary:u})),this.fallback.addMethod(a,s,{deterministic:o}),this.methods[a]=kr(s,l)}addModule(a,s,o={}){Object.getOwnPropertyNames(s).forEach(c=>{(typeof s[c]=="function"||typeof s[c]=="object")&&this.addMethod(`${a}${a?".":""}${c}`,s[c],o)})}async run(a,s={},o={}){const{above:c=[]}=o;if(this.missesSinceSeen>500&&(this.disableInterpretedOptimization=!0,this.missesSinceSeen=0),!this.disableInterpretedOptimization&&typeof a=="object"&&a&&!this.optimizedMap.has(a))return this.optimizedMap.set(a,Bu(a,this,c)),this.missesSinceSeen++,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(!this.disableInterpretedOptimization&&a&&typeof a=="object"&&this.optimizedMap.get(a))return this.missesSinceSeen=0,typeof this.optimizedMap.get(a)=="function"?this.optimizedMap.get(a)(s,c):this.optimizedMap.get(a);if(Array.isArray(a)){const l=[];for(let u=0;u0?this._parse(a,s,c):a}async build(a,s={}){const{above:o=[],top:c=!0}=s;if(this.fallback.truthy=this.truthy,this.fallback.allowFunctions=this.allowFunctions,c){const l=await vb(a,{engine:this,above:o,async:!0,state:{}}),u=kr((...d)=>{if(c===!0)try{const m=typeof l=="function"?l(...d):l;return Promise.resolve(m)}catch(m){return Promise.reject(m)}return typeof l=="function"?l(...d):l},c!==!0&&cr(l));return typeof l=="function"||c===!0?u:l}return a}}Object.assign(Ob.prototype.truthy,{IDENTITY:!0});var Tu={exports:{}},df,qm;function Vu(){if(qm)return df;qm=1;const r="2.0.0",a=256,s=Number.MAX_SAFE_INTEGER||9007199254740991,o=16,c=a-6;return df={MAX_LENGTH:a,MAX_SAFE_COMPONENT_LENGTH:o,MAX_SAFE_BUILD_LENGTH:c,MAX_SAFE_INTEGER:s,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:r,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},df}var pf,Hm;function Iu(){if(Hm)return pf;Hm=1;var r={};return pf=typeof process=="object"&&r&&r.NODE_DEBUG&&/\bsemver\b/i.test(r.NODE_DEBUG)?(...s)=>console.error("SEMVER",...s):()=>{},pf}var $m;function cl(){return $m||($m=1,(function(r,a){const{MAX_SAFE_COMPONENT_LENGTH:s,MAX_SAFE_BUILD_LENGTH:o,MAX_LENGTH:c}=Vu(),l=Iu();a=r.exports={};const u=a.re=[],d=a.safeRe=[],m=a.src=[],p=a.safeSrc=[],g=a.t={};let v=0;const R="[a-zA-Z0-9-]",C=[["\\s",1],["\\d",c],[R,o]],L=N=>{for(const[V,H]of C)N=N.split(`${V}*`).join(`${V}{0,${H}}`).split(`${V}+`).join(`${V}{1,${H}}`);return N},j=(N,V,H)=>{const X=L(V),W=v++;l(N,W,V),g[N]=W,m[W]=V,p[W]=X,u[W]=new RegExp(V,H?"g":void 0),d[W]=new RegExp(X,H?"g":void 0)};j("NUMERICIDENTIFIER","0|[1-9]\\d*"),j("NUMERICIDENTIFIERLOOSE","\\d+"),j("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${R}*`),j("MAINVERSION",`(${m[g.NUMERICIDENTIFIER]})\\.(${m[g.NUMERICIDENTIFIER]})\\.(${m[g.NUMERICIDENTIFIER]})`),j("MAINVERSIONLOOSE",`(${m[g.NUMERICIDENTIFIERLOOSE]})\\.(${m[g.NUMERICIDENTIFIERLOOSE]})\\.(${m[g.NUMERICIDENTIFIERLOOSE]})`),j("PRERELEASEIDENTIFIER",`(?:${m[g.NONNUMERICIDENTIFIER]}|${m[g.NUMERICIDENTIFIER]})`),j("PRERELEASEIDENTIFIERLOOSE",`(?:${m[g.NONNUMERICIDENTIFIER]}|${m[g.NUMERICIDENTIFIERLOOSE]})`),j("PRERELEASE",`(?:-(${m[g.PRERELEASEIDENTIFIER]}(?:\\.${m[g.PRERELEASEIDENTIFIER]})*))`),j("PRERELEASELOOSE",`(?:-?(${m[g.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${m[g.PRERELEASEIDENTIFIERLOOSE]})*))`),j("BUILDIDENTIFIER",`${R}+`),j("BUILD",`(?:\\+(${m[g.BUILDIDENTIFIER]}(?:\\.${m[g.BUILDIDENTIFIER]})*))`),j("FULLPLAIN",`v?${m[g.MAINVERSION]}${m[g.PRERELEASE]}?${m[g.BUILD]}?`),j("FULL",`^${m[g.FULLPLAIN]}$`),j("LOOSEPLAIN",`[v=\\s]*${m[g.MAINVERSIONLOOSE]}${m[g.PRERELEASELOOSE]}?${m[g.BUILD]}?`),j("LOOSE",`^${m[g.LOOSEPLAIN]}$`),j("GTLT","((?:<|>)?=?)"),j("XRANGEIDENTIFIERLOOSE",`${m[g.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),j("XRANGEIDENTIFIER",`${m[g.NUMERICIDENTIFIER]}|x|X|\\*`),j("XRANGEPLAIN",`[v=\\s]*(${m[g.XRANGEIDENTIFIER]})(?:\\.(${m[g.XRANGEIDENTIFIER]})(?:\\.(${m[g.XRANGEIDENTIFIER]})(?:${m[g.PRERELEASE]})?${m[g.BUILD]}?)?)?`),j("XRANGEPLAINLOOSE",`[v=\\s]*(${m[g.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[g.XRANGEIDENTIFIERLOOSE]})(?:\\.(${m[g.XRANGEIDENTIFIERLOOSE]})(?:${m[g.PRERELEASELOOSE]})?${m[g.BUILD]}?)?)?`),j("XRANGE",`^${m[g.GTLT]}\\s*${m[g.XRANGEPLAIN]}$`),j("XRANGELOOSE",`^${m[g.GTLT]}\\s*${m[g.XRANGEPLAINLOOSE]}$`),j("COERCEPLAIN",`(^|[^\\d])(\\d{1,${s}})(?:\\.(\\d{1,${s}}))?(?:\\.(\\d{1,${s}}))?`),j("COERCE",`${m[g.COERCEPLAIN]}(?:$|[^\\d])`),j("COERCEFULL",m[g.COERCEPLAIN]+`(?:${m[g.PRERELEASE]})?(?:${m[g.BUILD]})?(?:$|[^\\d])`),j("COERCERTL",m[g.COERCE],!0),j("COERCERTLFULL",m[g.COERCEFULL],!0),j("LONETILDE","(?:~>?)"),j("TILDETRIM",`(\\s*)${m[g.LONETILDE]}\\s+`,!0),a.tildeTrimReplace="$1~",j("TILDE",`^${m[g.LONETILDE]}${m[g.XRANGEPLAIN]}$`),j("TILDELOOSE",`^${m[g.LONETILDE]}${m[g.XRANGEPLAINLOOSE]}$`),j("LONECARET","(?:\\^)"),j("CARETTRIM",`(\\s*)${m[g.LONECARET]}\\s+`,!0),a.caretTrimReplace="$1^",j("CARET",`^${m[g.LONECARET]}${m[g.XRANGEPLAIN]}$`),j("CARETLOOSE",`^${m[g.LONECARET]}${m[g.XRANGEPLAINLOOSE]}$`),j("COMPARATORLOOSE",`^${m[g.GTLT]}\\s*(${m[g.LOOSEPLAIN]})$|^$`),j("COMPARATOR",`^${m[g.GTLT]}\\s*(${m[g.FULLPLAIN]})$|^$`),j("COMPARATORTRIM",`(\\s*)${m[g.GTLT]}\\s*(${m[g.LOOSEPLAIN]}|${m[g.XRANGEPLAIN]})`,!0),a.comparatorTrimReplace="$1$2$3",j("HYPHENRANGE",`^\\s*(${m[g.XRANGEPLAIN]})\\s+-\\s+(${m[g.XRANGEPLAIN]})\\s*$`),j("HYPHENRANGELOOSE",`^\\s*(${m[g.XRANGEPLAINLOOSE]})\\s+-\\s+(${m[g.XRANGEPLAINLOOSE]})\\s*$`),j("STAR","(<|>)?=?\\s*\\*"),j("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),j("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")})(Tu,Tu.exports)),Tu.exports}var mf,km;function Oc(){if(km)return mf;km=1;const r=Object.freeze({loose:!0}),a=Object.freeze({});return mf=o=>o?typeof o!="object"?r:o:a,mf}var yf,Ym;function E0(){if(Ym)return yf;Ym=1;const r=/^[0-9]+$/,a=(o,c)=>{if(typeof o=="number"&&typeof c=="number")return o===c?0:oa(c,o)},yf}var gf,Gm;function xt(){if(Gm)return gf;Gm=1;const r=Iu(),{MAX_LENGTH:a,MAX_SAFE_INTEGER:s}=Vu(),{safeRe:o,t:c}=cl(),l=Oc(),{compareIdentifiers:u}=E0();class d{constructor(p,g){if(g=l(g),p instanceof d){if(p.loose===!!g.loose&&p.includePrerelease===!!g.includePrerelease)return p;p=p.version}else if(typeof p!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof p}".`);if(p.length>a)throw new TypeError(`version is longer than ${a} characters`);r("SemVer",p,g),this.options=g,this.loose=!!g.loose,this.includePrerelease=!!g.includePrerelease;const v=p.trim().match(g.loose?o[c.LOOSE]:o[c.FULL]);if(!v)throw new TypeError(`Invalid Version: ${p}`);if(this.raw=p,this.major=+v[1],this.minor=+v[2],this.patch=+v[3],this.major>s||this.major<0)throw new TypeError("Invalid major version");if(this.minor>s||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>s||this.patch<0)throw new TypeError("Invalid patch version");v[4]?this.prerelease=v[4].split(".").map(R=>{if(/^[0-9]+$/.test(R)){const C=+R;if(C>=0&&Cp.major?1:this.minorp.minor?1:this.patchp.patch?1:0}comparePre(p){if(p instanceof d||(p=new d(p,this.options)),this.prerelease.length&&!p.prerelease.length)return-1;if(!this.prerelease.length&&p.prerelease.length)return 1;if(!this.prerelease.length&&!p.prerelease.length)return 0;let g=0;do{const v=this.prerelease[g],R=p.prerelease[g];if(r("prerelease compare",g,v,R),v===void 0&&R===void 0)return 0;if(R===void 0)return 1;if(v===void 0)return-1;if(v===R)continue;return u(v,R)}while(++g)}compareBuild(p){p instanceof d||(p=new d(p,this.options));let g=0;do{const v=this.build[g],R=p.build[g];if(r("build compare",g,v,R),v===void 0&&R===void 0)return 0;if(R===void 0)return 1;if(v===void 0)return-1;if(v===R)continue;return u(v,R)}while(++g)}inc(p,g,v){if(p.startsWith("pre")){if(!g&&v===!1)throw new Error("invalid increment argument: identifier is empty");if(g){const R=`-${g}`.match(this.options.loose?o[c.PRERELEASELOOSE]:o[c.PRERELEASE]);if(!R||R[1]!==g)throw new Error(`invalid identifier: ${g}`)}}switch(p){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",g,v);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",g,v);break;case"prepatch":this.prerelease.length=0,this.inc("patch",g,v),this.inc("pre",g,v);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",g,v),this.inc("pre",g,v);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{const R=Number(v)?1:0;if(this.prerelease.length===0)this.prerelease=[R];else{let C=this.prerelease.length;for(;--C>=0;)typeof this.prerelease[C]=="number"&&(this.prerelease[C]++,C=-2);if(C===-1){if(g===this.prerelease.join(".")&&v===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(R)}}if(g){let C=[g,R];v===!1&&(C=[g]),u(this.prerelease[0],g)===0?isNaN(this.prerelease[1])&&(this.prerelease=C):this.prerelease=C}break}default:throw new Error(`invalid increment argument: ${p}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return gf=d,gf}var vf,Vm;function Ja(){if(Vm)return vf;Vm=1;const r=xt();return vf=(s,o,c=!1)=>{if(s instanceof r)return s;try{return new r(s,o)}catch(l){if(!c)return null;throw l}},vf}var bf,Im;function Tb(){if(Im)return bf;Im=1;const r=Ja();return bf=(s,o)=>{const c=r(s,o);return c?c.version:null},bf}var Ef,Xm;function Rb(){if(Xm)return Ef;Xm=1;const r=Ja();return Ef=(s,o)=>{const c=r(s.trim().replace(/^[=v]+/,""),o);return c?c.version:null},Ef}var Af,Zm;function xb(){if(Zm)return Af;Zm=1;const r=xt();return Af=(s,o,c,l,u)=>{typeof c=="string"&&(u=l,l=c,c=void 0);try{return new r(s instanceof r?s.version:s,c).inc(o,l,u).version}catch{return null}},Af}var _f,Qm;function Db(){if(Qm)return _f;Qm=1;const r=Ja();return _f=(s,o)=>{const c=r(s,null,!0),l=r(o,null,!0),u=c.compare(l);if(u===0)return null;const d=u>0,m=d?c:l,p=d?l:c,g=!!m.prerelease.length;if(!!p.prerelease.length&&!g){if(!p.patch&&!p.minor)return"major";if(p.compareMain(m)===0)return p.minor&&!p.patch?"minor":"patch"}const R=g?"pre":"";return c.major!==l.major?R+"major":c.minor!==l.minor?R+"minor":c.patch!==l.patch?R+"patch":"prerelease"},_f}var wf,Km;function Nb(){if(Km)return wf;Km=1;const r=xt();return wf=(s,o)=>new r(s,o).major,wf}var Sf,Fm;function Mb(){if(Fm)return Sf;Fm=1;const r=xt();return Sf=(s,o)=>new r(s,o).minor,Sf}var Of,Pm;function jb(){if(Pm)return Of;Pm=1;const r=xt();return Of=(s,o)=>new r(s,o).patch,Of}var Tf,Jm;function Cb(){if(Jm)return Tf;Jm=1;const r=Ja();return Tf=(s,o)=>{const c=r(s,o);return c&&c.prerelease.length?c.prerelease:null},Tf}var Rf,Wm;function hr(){if(Wm)return Rf;Wm=1;const r=xt();return Rf=(s,o,c)=>new r(s,c).compare(new r(o,c)),Rf}var xf,ey;function Lb(){if(ey)return xf;ey=1;const r=hr();return xf=(s,o,c)=>r(o,s,c),xf}var Df,ty;function zb(){if(ty)return Df;ty=1;const r=hr();return Df=(s,o)=>r(s,o,!0),Df}var Nf,ry;function Tc(){if(ry)return Nf;ry=1;const r=xt();return Nf=(s,o,c)=>{const l=new r(s,c),u=new r(o,c);return l.compare(u)||l.compareBuild(u)},Nf}var Mf,ny;function Ub(){if(ny)return Mf;ny=1;const r=Tc();return Mf=(s,o)=>s.sort((c,l)=>r(c,l,o)),Mf}var jf,ay;function Bb(){if(ay)return jf;ay=1;const r=Tc();return jf=(s,o)=>s.sort((c,l)=>r(l,c,o)),jf}var Cf,iy;function Xu(){if(iy)return Cf;iy=1;const r=hr();return Cf=(s,o,c)=>r(s,o,c)>0,Cf}var Lf,ly;function Rc(){if(ly)return Lf;ly=1;const r=hr();return Lf=(s,o,c)=>r(s,o,c)<0,Lf}var zf,uy;function A0(){if(uy)return zf;uy=1;const r=hr();return zf=(s,o,c)=>r(s,o,c)===0,zf}var Uf,sy;function _0(){if(sy)return Uf;sy=1;const r=hr();return Uf=(s,o,c)=>r(s,o,c)!==0,Uf}var Bf,oy;function xc(){if(oy)return Bf;oy=1;const r=hr();return Bf=(s,o,c)=>r(s,o,c)>=0,Bf}var qf,fy;function Dc(){if(fy)return qf;fy=1;const r=hr();return qf=(s,o,c)=>r(s,o,c)<=0,qf}var Hf,cy;function w0(){if(cy)return Hf;cy=1;const r=A0(),a=_0(),s=Xu(),o=xc(),c=Rc(),l=Dc();return Hf=(d,m,p,g)=>{switch(m){case"===":return typeof d=="object"&&(d=d.version),typeof p=="object"&&(p=p.version),d===p;case"!==":return typeof d=="object"&&(d=d.version),typeof p=="object"&&(p=p.version),d!==p;case"":case"=":case"==":return r(d,p,g);case"!=":return a(d,p,g);case">":return s(d,p,g);case">=":return o(d,p,g);case"<":return c(d,p,g);case"<=":return l(d,p,g);default:throw new TypeError(`Invalid operator: ${m}`)}},Hf}var $f,hy;function qb(){if(hy)return $f;hy=1;const r=xt(),a=Ja(),{safeRe:s,t:o}=cl();return $f=(l,u)=>{if(l instanceof r)return l;if(typeof l=="number"&&(l=String(l)),typeof l!="string")return null;u=u||{};let d=null;if(!u.rtl)d=l.match(u.includePrerelease?s[o.COERCEFULL]:s[o.COERCE]);else{const C=u.includePrerelease?s[o.COERCERTLFULL]:s[o.COERCERTL];let L;for(;(L=C.exec(l))&&(!d||d.index+d[0].length!==l.length);)(!d||L.index+L[0].length!==d.index+d[0].length)&&(d=L),C.lastIndex=L.index+L[1].length+L[2].length;C.lastIndex=-1}if(d===null)return null;const m=d[2],p=d[3]||"0",g=d[4]||"0",v=u.includePrerelease&&d[5]?`-${d[5]}`:"",R=u.includePrerelease&&d[6]?`+${d[6]}`:"";return a(`${m}.${p}.${g}${v}${R}`,u)},$f}var kf,dy;function Hb(){if(dy)return kf;dy=1;class r{constructor(){this.max=1e3,this.map=new Map}get(s){const o=this.map.get(s);if(o!==void 0)return this.map.delete(s),this.map.set(s,o),o}delete(s){return this.map.delete(s)}set(s,o){if(!this.delete(s)&&o!==void 0){if(this.map.size>=this.max){const l=this.map.keys().next().value;this.delete(l)}this.map.set(s,o)}return this}}return kf=r,kf}var Yf,py;function dr(){if(py)return Yf;py=1;const r=/\s+/g;class a{constructor(z,D){if(D=c(D),z instanceof a)return z.loose===!!D.loose&&z.includePrerelease===!!D.includePrerelease?z:new a(z.raw,D);if(z instanceof l)return this.raw=z.value,this.set=[[z]],this.formatted=void 0,this;if(this.options=D,this.loose=!!D.loose,this.includePrerelease=!!D.includePrerelease,this.raw=z.trim().replace(r," "),this.set=this.raw.split("||").map(I=>this.parseRange(I.trim())).filter(I=>I.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const I=this.set[0];if(this.set=this.set.filter(J=>!j(J[0])),this.set.length===0)this.set=[I];else if(this.set.length>1){for(const J of this.set)if(J.length===1&&N(J[0])){this.set=[J];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted="";for(let z=0;z0&&(this.formatted+="||");const D=this.set[z];for(let I=0;I0&&(this.formatted+=" "),this.formatted+=D[I].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(z){const I=((this.options.includePrerelease&&C)|(this.options.loose&&L))+":"+z,J=o.get(I);if(J)return J;const P=this.options.loose,S=P?m[p.HYPHENRANGELOOSE]:m[p.HYPHENRANGE];z=z.replace(S,Y(this.options.includePrerelease)),u("hyphen replace",z),z=z.replace(m[p.COMPARATORTRIM],g),u("comparator trim",z),z=z.replace(m[p.TILDETRIM],v),u("tilde trim",z),z=z.replace(m[p.CARETTRIM],R),u("caret trim",z);let k=z.split(" ").map(he=>H(he,this.options)).join(" ").split(/\s+/).map(he=>B(he,this.options));P&&(k=k.filter(he=>(u("loose invalid filter",he,this.options),!!he.match(m[p.COMPARATORLOOSE])))),u("range list",k);const ee=new Map,se=k.map(he=>new l(he,this.options));for(const he of se){if(j(he))return[he];ee.set(he.value,he)}ee.size>1&&ee.has("")&&ee.delete("");const ue=[...ee.values()];return o.set(I,ue),ue}intersects(z,D){if(!(z instanceof a))throw new TypeError("a Range is required");return this.set.some(I=>V(I,D)&&z.set.some(J=>V(J,D)&&I.every(P=>J.every(S=>P.intersects(S,D)))))}test(z){if(!z)return!1;if(typeof z=="string")try{z=new d(z,this.options)}catch{return!1}for(let D=0;DK.value==="<0.0.0-0",N=K=>K.value==="",V=(K,z)=>{let D=!0;const I=K.slice();let J=I.pop();for(;D&&I.length;)D=I.every(P=>J.intersects(P,z)),J=I.pop();return D},H=(K,z)=>(K=K.replace(m[p.BUILD],""),u("comp",K,z),K=x(K,z),u("caret",K),K=W(K,z),u("tildes",K),K=_(K,z),u("xrange",K),K=b(K,z),u("stars",K),K),X=K=>!K||K.toLowerCase()==="x"||K==="*",W=(K,z)=>K.trim().split(/\s+/).map(D=>re(D,z)).join(" "),re=(K,z)=>{const D=z.loose?m[p.TILDELOOSE]:m[p.TILDE];return K.replace(D,(I,J,P,S,k)=>{u("tilde",K,I,J,P,S,k);let ee;return X(J)?ee="":X(P)?ee=`>=${J}.0.0 <${+J+1}.0.0-0`:X(S)?ee=`>=${J}.${P}.0 <${J}.${+P+1}.0-0`:k?(u("replaceTilde pr",k),ee=`>=${J}.${P}.${S}-${k} <${J}.${+P+1}.0-0`):ee=`>=${J}.${P}.${S} <${J}.${+P+1}.0-0`,u("tilde return",ee),ee})},x=(K,z)=>K.trim().split(/\s+/).map(D=>U(D,z)).join(" "),U=(K,z)=>{u("caret",K,z);const D=z.loose?m[p.CARETLOOSE]:m[p.CARET],I=z.includePrerelease?"-0":"";return K.replace(D,(J,P,S,k,ee)=>{u("caret",K,J,P,S,k,ee);let se;return X(P)?se="":X(S)?se=`>=${P}.0.0${I} <${+P+1}.0.0-0`:X(k)?P==="0"?se=`>=${P}.${S}.0${I} <${P}.${+S+1}.0-0`:se=`>=${P}.${S}.0${I} <${+P+1}.0.0-0`:ee?(u("replaceCaret pr",ee),P==="0"?S==="0"?se=`>=${P}.${S}.${k}-${ee} <${P}.${S}.${+k+1}-0`:se=`>=${P}.${S}.${k}-${ee} <${P}.${+S+1}.0-0`:se=`>=${P}.${S}.${k}-${ee} <${+P+1}.0.0-0`):(u("no pr"),P==="0"?S==="0"?se=`>=${P}.${S}.${k}${I} <${P}.${S}.${+k+1}-0`:se=`>=${P}.${S}.${k}${I} <${P}.${+S+1}.0-0`:se=`>=${P}.${S}.${k} <${+P+1}.0.0-0`),u("caret return",se),se})},_=(K,z)=>(u("replaceXRanges",K,z),K.split(/\s+/).map(D=>w(D,z)).join(" ")),w=(K,z)=>{K=K.trim();const D=z.loose?m[p.XRANGELOOSE]:m[p.XRANGE];return K.replace(D,(I,J,P,S,k,ee)=>{u("xRange",K,I,J,P,S,k,ee);const se=X(P),ue=se||X(S),he=ue||X(k),de=he;return J==="="&&de&&(J=""),ee=z.includePrerelease?"-0":"",se?J===">"||J==="<"?I="<0.0.0-0":I="*":J&&de?(ue&&(S=0),k=0,J===">"?(J=">=",ue?(P=+P+1,S=0,k=0):(S=+S+1,k=0)):J==="<="&&(J="<",ue?P=+P+1:S=+S+1),J==="<"&&(ee="-0"),I=`${J+P}.${S}.${k}${ee}`):ue?I=`>=${P}.0.0${ee} <${+P+1}.0.0-0`:he&&(I=`>=${P}.${S}.0${ee} <${P}.${+S+1}.0-0`),u("xRange return",I),I})},b=(K,z)=>(u("replaceStars",K,z),K.trim().replace(m[p.STAR],"")),B=(K,z)=>(u("replaceGTE0",K,z),K.trim().replace(m[z.includePrerelease?p.GTE0PRE:p.GTE0],"")),Y=K=>(z,D,I,J,P,S,k,ee,se,ue,he,de)=>(X(I)?D="":X(J)?D=`>=${I}.0.0${K?"-0":""}`:X(P)?D=`>=${I}.${J}.0${K?"-0":""}`:S?D=`>=${D}`:D=`>=${D}${K?"-0":""}`,X(se)?ee="":X(ue)?ee=`<${+se+1}.0.0-0`:X(he)?ee=`<${se}.${+ue+1}.0-0`:de?ee=`<=${se}.${ue}.${he}-${de}`:K?ee=`<${se}.${ue}.${+he+1}-0`:ee=`<=${ee}`,`${D} ${ee}`.trim()),ce=(K,z,D)=>{for(let I=0;I0){const J=K[I].semver;if(J.major===z.major&&J.minor===z.minor&&J.patch===z.patch)return!0}return!1}return!0};return Yf}var Gf,my;function Zu(){if(my)return Gf;my=1;const r=Symbol("SemVer ANY");class a{static get ANY(){return r}constructor(g,v){if(v=s(v),g instanceof a){if(g.loose===!!v.loose)return g;g=g.value}g=g.trim().split(/\s+/).join(" "),u("comparator",g,v),this.options=v,this.loose=!!v.loose,this.parse(g),this.semver===r?this.value="":this.value=this.operator+this.semver.version,u("comp",this)}parse(g){const v=this.options.loose?o[c.COMPARATORLOOSE]:o[c.COMPARATOR],R=g.match(v);if(!R)throw new TypeError(`Invalid comparator: ${g}`);this.operator=R[1]!==void 0?R[1]:"",this.operator==="="&&(this.operator=""),R[2]?this.semver=new d(R[2],this.options.loose):this.semver=r}toString(){return this.value}test(g){if(u("Comparator.test",g,this.options.loose),this.semver===r||g===r)return!0;if(typeof g=="string")try{g=new d(g,this.options)}catch{return!1}return l(g,this.operator,this.semver,this.options)}intersects(g,v){if(!(g instanceof a))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new m(g.value,v).test(this.value):g.operator===""?g.value===""?!0:new m(this.value,v).test(g.semver):(v=s(v),v.includePrerelease&&(this.value==="<0.0.0-0"||g.value==="<0.0.0-0")||!v.includePrerelease&&(this.value.startsWith("<0.0.0")||g.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&g.operator.startsWith(">")||this.operator.startsWith("<")&&g.operator.startsWith("<")||this.semver.version===g.semver.version&&this.operator.includes("=")&&g.operator.includes("=")||l(this.semver,"<",g.semver,v)&&this.operator.startsWith(">")&&g.operator.startsWith("<")||l(this.semver,">",g.semver,v)&&this.operator.startsWith("<")&&g.operator.startsWith(">")))}}Gf=a;const s=Oc(),{safeRe:o,t:c}=cl(),l=w0(),u=Iu(),d=xt(),m=dr();return Gf}var Vf,yy;function Qu(){if(yy)return Vf;yy=1;const r=dr();return Vf=(s,o,c)=>{try{o=new r(o,c)}catch{return!1}return o.test(s)},Vf}var If,gy;function $b(){if(gy)return If;gy=1;const r=dr();return If=(s,o)=>new r(s,o).set.map(c=>c.map(l=>l.value).join(" ").trim().split(" ")),If}var Xf,vy;function kb(){if(vy)return Xf;vy=1;const r=xt(),a=dr();return Xf=(o,c,l)=>{let u=null,d=null,m=null;try{m=new a(c,l)}catch{return null}return o.forEach(p=>{m.test(p)&&(!u||d.compare(p)===-1)&&(u=p,d=new r(u,l))}),u},Xf}var Zf,by;function Yb(){if(by)return Zf;by=1;const r=xt(),a=dr();return Zf=(o,c,l)=>{let u=null,d=null,m=null;try{m=new a(c,l)}catch{return null}return o.forEach(p=>{m.test(p)&&(!u||d.compare(p)===1)&&(u=p,d=new r(u,l))}),u},Zf}var Qf,Ey;function Gb(){if(Ey)return Qf;Ey=1;const r=xt(),a=dr(),s=Xu();return Qf=(c,l)=>{c=new a(c,l);let u=new r("0.0.0");if(c.test(u)||(u=new r("0.0.0-0"),c.test(u)))return u;u=null;for(let d=0;d{const v=new r(g.semver.version);switch(g.operator){case">":v.prerelease.length===0?v.patch++:v.prerelease.push(0),v.raw=v.format();case"":case">=":(!p||s(v,p))&&(p=v);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${g.operator}`)}}),p&&(!u||s(u,p))&&(u=p)}return u&&c.test(u)?u:null},Qf}var Kf,Ay;function Vb(){if(Ay)return Kf;Ay=1;const r=dr();return Kf=(s,o)=>{try{return new r(s,o).range||"*"}catch{return null}},Kf}var Ff,_y;function Nc(){if(_y)return Ff;_y=1;const r=xt(),a=Zu(),{ANY:s}=a,o=dr(),c=Qu(),l=Xu(),u=Rc(),d=Dc(),m=xc();return Ff=(g,v,R,C)=>{g=new r(g,C),v=new o(v,C);let L,j,N,V,H;switch(R){case">":L=l,j=d,N=u,V=">",H=">=";break;case"<":L=u,j=m,N=l,V="<",H="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(c(g,v,C))return!1;for(let X=0;X{U.semver===s&&(U=new a(">=0.0.0")),re=re||U,x=x||U,L(U.semver,re.semver,C)?re=U:N(U.semver,x.semver,C)&&(x=U)}),re.operator===V||re.operator===H||(!x.operator||x.operator===V)&&j(g,x.semver))return!1;if(x.operator===H&&N(g,x.semver))return!1}return!0},Ff}var Pf,wy;function Ib(){if(wy)return Pf;wy=1;const r=Nc();return Pf=(s,o,c)=>r(s,o,">",c),Pf}var Jf,Sy;function Xb(){if(Sy)return Jf;Sy=1;const r=Nc();return Jf=(s,o,c)=>r(s,o,"<",c),Jf}var Wf,Oy;function Zb(){if(Oy)return Wf;Oy=1;const r=dr();return Wf=(s,o,c)=>(s=new r(s,c),o=new r(o,c),s.intersects(o,c)),Wf}var ec,Ty;function Qb(){if(Ty)return ec;Ty=1;const r=Qu(),a=hr();return ec=(s,o,c)=>{const l=[];let u=null,d=null;const m=s.sort((R,C)=>a(R,C,c));for(const R of m)r(R,o,c)?(d=R,u||(u=R)):(d&&l.push([u,d]),d=null,u=null);u&&l.push([u,null]);const p=[];for(const[R,C]of l)R===C?p.push(R):!C&&R===m[0]?p.push("*"):C?R===m[0]?p.push(`<=${C}`):p.push(`${R} - ${C}`):p.push(`>=${R}`);const g=p.join(" || "),v=typeof o.raw=="string"?o.raw:String(o);return g.length{if(v===R)return!0;v=new r(v,C),R=new r(R,C);let L=!1;e:for(const j of v.set){for(const N of R.set){const V=m(j,N,C);if(L=L||V!==null,V)continue e}if(L)return!1}return!0},u=[new a(">=0.0.0-0")],d=[new a(">=0.0.0")],m=(v,R,C)=>{if(v===R)return!0;if(v.length===1&&v[0].semver===s){if(R.length===1&&R[0].semver===s)return!0;C.includePrerelease?v=u:v=d}if(R.length===1&&R[0].semver===s){if(C.includePrerelease)return!0;R=d}const L=new Set;let j,N;for(const _ of v)_.operator===">"||_.operator===">="?j=p(j,_,C):_.operator==="<"||_.operator==="<="?N=g(N,_,C):L.add(_.semver);if(L.size>1)return null;let V;if(j&&N){if(V=c(j.semver,N.semver,C),V>0)return null;if(V===0&&(j.operator!==">="||N.operator!=="<="))return null}for(const _ of L){if(j&&!o(_,String(j),C)||N&&!o(_,String(N),C))return null;for(const w of R)if(!o(_,String(w),C))return!1;return!0}let H,X,W,re,x=N&&!C.includePrerelease&&N.semver.prerelease.length?N.semver:!1,U=j&&!C.includePrerelease&&j.semver.prerelease.length?j.semver:!1;x&&x.prerelease.length===1&&N.operator==="<"&&x.prerelease[0]===0&&(x=!1);for(const _ of R){if(re=re||_.operator===">"||_.operator===">=",W=W||_.operator==="<"||_.operator==="<=",j){if(U&&_.semver.prerelease&&_.semver.prerelease.length&&_.semver.major===U.major&&_.semver.minor===U.minor&&_.semver.patch===U.patch&&(U=!1),_.operator===">"||_.operator===">="){if(H=p(j,_,C),H===_&&H!==j)return!1}else if(j.operator===">="&&!o(j.semver,String(_),C))return!1}if(N){if(x&&_.semver.prerelease&&_.semver.prerelease.length&&_.semver.major===x.major&&_.semver.minor===x.minor&&_.semver.patch===x.patch&&(x=!1),_.operator==="<"||_.operator==="<="){if(X=g(N,_,C),X===_&&X!==N)return!1}else if(N.operator==="<="&&!o(N.semver,String(_),C))return!1}if(!_.operator&&(N||j)&&V!==0)return!1}return!(j&&W&&!N&&V!==0||N&&re&&!j&&V!==0||U||x)},p=(v,R,C)=>{if(!v)return R;const L=c(v.semver,R.semver,C);return L>0?v:L<0||R.operator===">"&&v.operator===">="?R:v},g=(v,R,C)=>{if(!v)return R;const L=c(v.semver,R.semver,C);return L<0?v:L>0||R.operator==="<"&&v.operator==="<="?R:v};return tc=l,tc}var rc,xy;function Fb(){if(xy)return rc;xy=1;const r=cl(),a=Vu(),s=xt(),o=E0(),c=Ja(),l=Tb(),u=Rb(),d=xb(),m=Db(),p=Nb(),g=Mb(),v=jb(),R=Cb(),C=hr(),L=Lb(),j=zb(),N=Tc(),V=Ub(),H=Bb(),X=Xu(),W=Rc(),re=A0(),x=_0(),U=xc(),_=Dc(),w=w0(),b=qb(),B=Zu(),Y=dr(),ce=Qu(),K=$b(),z=kb(),D=Yb(),I=Gb(),J=Vb(),P=Nc(),S=Ib(),k=Xb(),ee=Zb(),se=Qb(),ue=Kb();return rc={parse:c,valid:l,clean:u,inc:d,diff:m,major:p,minor:g,patch:v,prerelease:R,compare:C,rcompare:L,compareLoose:j,compareBuild:N,sort:V,rsort:H,gt:X,lt:W,eq:re,neq:x,gte:U,lte:_,cmp:w,coerce:b,Comparator:B,Range:Y,satisfies:ce,toComparators:K,maxSatisfying:z,minSatisfying:D,minVersion:I,validRange:J,outside:P,gtr:S,ltr:k,intersects:ee,simplifyRange:se,subset:ue,SemVer:s,re:r.re,src:r.src,tokens:r.t,SEMVER_SPEC_VERSION:a.SEMVER_SPEC_VERSION,RELEASE_TYPES:a.RELEASE_TYPES,compareIdentifiers:o.compareIdentifiers,rcompareIdentifiers:o.rcompareIdentifiers},rc}var nc=Fb(),ac={exports:{}};/** * @preserve * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) * @@ -61,39 +61,39 @@ list should be an Array.`),b.length===0)return new D(0);if(b.length===1)return b * @see http://github.com/garycourt/murmurhash-js * @author Austin Appleby * @see http://sites.google.com/site/murmurhash/ - */var xy;function Fb(){return xy||(xy=1,(function(r){(function(){var a;function s(f,c){var u=this instanceof s?this:a;if(u.reset(c),typeof f=="string"&&f.length>0&&u.hash(f),u!==this)return u}s.prototype.hash=function(f){var c,u,l,d,m;switch(m=f.length,this.len+=m,u=this.k1,l=0,this.rem){case 0:u^=m>l?f.charCodeAt(l++)&65535:0;case 1:u^=m>l?(f.charCodeAt(l++)&65535)<<8:0;case 2:u^=m>l?(f.charCodeAt(l++)&65535)<<16:0;case 3:u^=m>l?(f.charCodeAt(l)&255)<<24:0,u^=m>l?(f.charCodeAt(l++)&65280)>>8:0}if(this.rem=m+this.rem&3,m-=this.rem,m>0){for(c=this.h1;u=u*11601+(u&65535)*3432906752&4294967295,u=u<<15|u>>>17,u=u*13715+(u&65535)*461832192&4294967295,c^=u,c=c<<13|c>>>19,c=c*5+3864292196&4294967295,!(l>=m);)u=f.charCodeAt(l++)&65535^(f.charCodeAt(l++)&65535)<<8^(f.charCodeAt(l++)&65535)<<16,d=f.charCodeAt(l++),u^=(d&255)<<24^(d&65280)>>8;switch(u=0,this.rem){case 3:u^=(f.charCodeAt(l+2)&65535)<<16;case 2:u^=(f.charCodeAt(l+1)&65535)<<8;case 1:u^=f.charCodeAt(l)&65535}this.h1=c}return this.k1=u,this},s.prototype.result=function(){var f,c;return f=this.k1,c=this.h1,f>0&&(f=f*11601+(f&65535)*3432906752&4294967295,f=f<<15|f>>>17,f=f*13715+(f&65535)*461832192&4294967295,c^=f),c^=this.len,c^=c>>>16,c=c*51819+(c&65535)*2246770688&4294967295,c^=c>>>13,c=c*44597+(c&65535)*3266445312&4294967295,c^=c>>>16,c>>>0},s.prototype.reset=function(f){return this.h1=typeof f=="number"?f:0,this.rem=this.k1=this.len=0,this},a=new s,r.exports=s})()})(rc)),rc.exports}var Pb=Fb();const Jb=bc(Pb),Du="$flagd",wg="flagKey",Wb="timestamp",e2="targetingKey",Og=Symbol.for("flagd.logger");function Nc(r){const a=r[Og];if(!a)throw new Error("Logger not found in context");return a}const Mc="starts_with",jc="ends_with";function t2(r,a){return Sg(Mc,r,a)}function r2(r,a){return Sg(jc,r,a)}function Sg(r,a,s){const f=Nc(s);if(!Array.isArray(a))return f.debug("Invalid comparison configuration: input is not an array"),!1;if(a.length!=2)return f.debug(`Invalid comparison configuration: invalid array length ${a.length}`),!1;if(typeof a[0]!="string"||typeof a[1]!="string")return f.debug("Invalid comparison configuration: array values are not strings"),!1;switch(r){case Mc:return a[0].startsWith(a[1]);case jc:return a[0].endsWith(a[1]);default:return f.debug(`Invalid comparison configuration: Invalid method '${r}'`),!1}}const Nu="sem_ver";function n2(r,a){const s=Nc(a);if(!Array.isArray(r))return s.debug(`Invalid ${Nu} configuration: Expected an array`),!1;const f=Array.from(r);if(f.length!=3)return s.debug(`Invalid ${Nu} configuration: Expected 3 arguments, got ${f.length}`),!1;const c=tc.parse(f[0]),u=tc.parse(f[2]);if(!c||!u)return s.debug(`Invalid ${Nu} configuration: Unable to parse semver`),!1;const l=String(f[1]),d=tc.compare(c,u);switch(l){case"=":return d==0;case"!=":return d!=0;case"<":return d<0;case"<=":return d<=0;case">=":return d>=0;case">":return d>0;case"^":return c.major==u.major;case"~":return c.major==u.major&&c.minor==u.minor}return!1}const cc="fractional";function a2(r,a){const s=Nc(a);if(!Array.isArray(r))return null;const f=Array.from(r);if(f.length<2)return s.debug(`Invalid ${cc} configuration: Expected at least 2 buckets, got ${f.length}`),null;const c=a[Du];if(!c)return s.debug("Missing flagd properties, cannot perform fractional targeting"),null;let u,l;if(typeof f[0]=="string")u=f[0],l=f.slice(1,f.length);else{const v=a[e2];if(!v)return s.debug("Missing targetingKey property, cannot perform fractional targeting"),null;u=`${c[wg]}${v}`,l=f}let d;try{d=l2(l)}catch(v){return s.debug(`Invalid ${cc} configuration: `,v.message),null}const m=new Jb(u).result()|0,p=Math.abs(m)/2147483648*100;let g=0;for(let v=0;v=p)return T.variant}return null}function i2(r,a){return a==0?0:a*100/r}function l2(r){const a=[];let s=0;for(let f=0;f2)throw new Error("Invalid bucketing entry. Requires at least a variant");if(typeof c[0]!="string")throw new Error("Bucketing require variant to be present in string format");let u=1;if(c.length>=2){if(typeof c[1]!="number")throw new Error("Bucketing require bucketing percentage to be present");u=c[1]}a.push({fraction:u,variant:c[0]}),s+=u}return{fractions:a,totalWeight:s}}class Ua{constructor(a,s,f={}){var c;this.logger=s,this._useInterpreter=(c=f.disableDynamicCodeGeneration)!==null&&c!==void 0?c:!1;const u=new wc;u.addMethod(Mc,t2),u.addMethod(jc,r2),u.addMethod(Nu,n2),u.addMethod(cc,a2),this._useInterpreter?(Ua.validateMethods(a,u),this._engine=u,this._logic=a):this._compiledLogic=u.build(a)}static validateMethods(a,s){if(a===null||typeof a!="object")return;if(Array.isArray(a)){for(const l of a)Ua.validateMethods(l,s);return}const f=Object.keys(a);if(f.length===0)return;const c=f[0];if(!(c in s.methods)&&!s.isData(a,c))throw new Error(`Method '${c}' was not found in the Logic Engine.`);const u=a[c];if(Array.isArray(u))for(const l of u)Ua.validateMethods(l,s);else Ua.validateMethods(u,s)}evaluate(a,s,f=this.logger){Object.hasOwn(s,Du)&&f.debug(`overwriting ${Du} property in the context`);const c=Object.assign(Object.assign({},s),{[Du]:{[wg]:a,[Wb]:Math.floor(Date.now()/1e3)},[Og]:f});return this._useInterpreter?this._engine.run(this._logic,c):this._compiledLogic(c)}}class u2{constructor(a,s,f,c={}){var u;if(this.logger=f,this._key=a,this._state=s.state,this._defaultVariant=s.defaultVariant||void 0,this._variants=new Map(Object.entries(s.variants)),this._metadata=(u=s.metadata)!==null&&u!==void 0?u:{},s.targeting&&Object.keys(s.targeting).length>0)try{this._targeting=new Ua(s.targeting,f,c)}catch{const d=`Invalid targeting configuration for flag '${a}'`;this.logger.warn(d),this._targetingParseErrorMessage=d}this._hash=ob.sha1(s),this.validateStructure()}get key(){return this._key}get hash(){return this._hash}get state(){return this._state}get defaultVariant(){return this._defaultVariant}get variants(){return this._variants}get metadata(){return this._metadata}evaluate(a,s=this.logger){let f,c;if(this._targetingParseErrorMessage)return{reason:br.ERROR,errorCode:Fn.PARSE_ERROR,errorMessage:this._targetingParseErrorMessage,flagMetadata:this.metadata};if(!this._targeting)f=this._defaultVariant,c=br.STATIC;else{let d;try{d=this._targeting.evaluate(this._key,a,s)}catch(m){return s.debug(`Error evaluating targeting rule for flag '${this._key}': ${m.message}`),{reason:br.ERROR,errorCode:Fn.GENERAL,errorMessage:`Error evaluating targeting rule for flag '${this._key}'`,flagMetadata:this.metadata}}d==null?(f=this._defaultVariant,c=br.DEFAULT):(f=d.toString(),c=br.TARGETING_MATCH)}if(f==null&&(this.defaultVariant===null||this.defaultVariant===void 0))return{reason:br.DEFAULT,flagMetadata:this.metadata};const u=f,l=this._variants.get(u);return l===void 0?{reason:br.ERROR,errorCode:Fn.GENERAL,errorMessage:`Variant '${f}' not found in flag with key '${this._key}'`,flagMetadata:this.metadata}:{value:l,reason:c,variant:u,flagMetadata:this.metadata}}validateStructure(){if(this._state!=="ENABLED"&&this._state!=="DISABLED")throw new Lm(`Invalid flag state: ${JSON.stringify(this._state,void 0,2)}`);if(this._defaultVariant&&!this._variants.has(this._defaultVariant))throw new Lm(`Default variant ${this._defaultVariant} missing from variants ${JSON.stringify(this._variants,void 0,2)}`)}}function s2(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var Cc={exports:{}};Cc.exports=Lc;Cc.exports.default=Lc;const Tg={additionalProperties:{type:["string","number","boolean"]}},Gt=new RegExp("^.{1,}$","u"),hc=new RegExp("^\\$flagd\\.((timestamp)|(flagKey))$","u"),dc=new RegExp("^\\$flagd\\..*$","u"),f2={properties:{if:{title:"If Operator",description:'The if statement takes 1 or more arguments: a condition ("if"), what to do if its true ("then", optional, defaults to returning true), and what to do if its false ("else", optional, defaults to returning false). Note that the else condition can be used as an else-if statement by adding additional arguments.',$ref:"#/definitions/variadicOp"},"==":{title:"Lose Equality Operation",description:"Tests equality, with type coercion. Requires two arguments.",$ref:"#/definitions/binaryOp"},"===":{title:"Strict Equality Operation",description:"Tests strict equality. Requires two arguments.",$ref:"#/definitions/binaryOp"},"!=":{title:"Lose Inequality Operation",description:"Tests not-equal, with type coercion.",$ref:"#/definitions/binaryOp"},"!==":{title:"Strict Inequality Operation",description:"Tests strict not-equal.",$ref:"#/definitions/binaryOp"},">":{title:"Greater-Than Operation",$ref:"#/definitions/binaryOp"},">=":{title:"Greater-Than-Or-Equal-To Operation",$ref:"#/definitions/binaryOp"},"%":{title:"Modulo Operation",description:"Finds the remainder after the first argument is divided by the second argument.",$ref:"#/definitions/binaryOp"},"/":{title:"Division Operation",$ref:"#/definitions/binaryOp"},map:{title:"Map Operation",description:"Perform an action on every member of an array. Note, that inside the logic being used to map, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},filter:{title:"Filter Operation",description:"Keep only elements of the array that pass a test. Note, that inside the logic being used to filter, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},all:{title:"All Operation",description:"Perform a test on each member of that array, returning true if all pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},none:{title:"None Operation",description:"Perform a test on each member of that array, returning true if none pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},some:{title:"Some Operation",description:"Perform a test on each member of that array, returning true if some pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},in:{title:"In Operation",description:"If the second argument is an array, tests that the first argument is a member of the array.",$ref:"#/definitions/binaryOp"}}},o2=Object.prototype.hasOwnProperty,Dy=new RegExp("^\\$ref$","u"),Yr={validate:Za};function Ke(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;const d=l;let m=!1,p=null;const g=l;if(l===l)if(r&&typeof r=="object"&&!Array.isArray(r)){const D=l;for(const X in r)if(!Dy.test(X)){const k={instancePath:a,schemaPath:"#/definitions/reference/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:X},message:"must NOT have additional properties"};u===null?u=[k]:u.push(k),l++;break}if(D===l){var T=!0;for(const X in r)if(Dy.test(X)){const k=l;if(typeof r[X]!="string"){const W={instancePath:a+"/"+X.replace(/~/g,"~0").replace(/\//g,"~1"),schemaPath:"#/definitions/reference/patternProperties/%5E%5C%24ref%24/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[W]:u.push(W),l++}var T=k===l;if(!T)break}}}else{const D={instancePath:a,schemaPath:"#/definitions/reference/type",keyword:"type",params:{type:"object"},message:"must be object"};u===null?u=[D]:u.push(D),l++}var C=g===l;C&&(m=!0,p=0);const j=l;Yr.validate(r,{instancePath:a,parentData:s,parentDataProperty:f,rootData:c})||(u=u===null?Yr.validate.errors:u.concat(Yr.validate.errors),l=u.length);var C=j===l;if(C&&m)m=!1,p=[p,1];else{C&&(m=!0,p=1);const D=l,X=l;let k=!1,I=null;const W=l;if(r!==null){const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/0/type",keyword:"type",params:{type:"null"},message:"must be null"};u===null?u=[U]:u.push(U),l++}var N=W===l;N&&(k=!0,I=0);const te=l;if(typeof r!="boolean"){const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/1/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"};u===null?u=[U]:u.push(U),l++}var N=te===l;if(N&&k)k=!1,I=[I,1];else{N&&(k=!0,I=1);const U=l;if(typeof r!="number"){const w={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/2/type",keyword:"type",params:{type:"number"},message:"must be number"};u===null?u=[w]:u.push(w),l++}var N=U===l;if(N&&k)k=!1,I=[I,2];else{N&&(k=!0,I=2);const w=l;if(typeof r!="string"){const q={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/3/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[q]:u.push(q),l++}var N=w===l;if(N&&k)k=!1,I=[I,3];else{N&&(k=!0,I=3);const q=l;if(!Array.isArray(r)){const ce={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/4/type",keyword:"type",params:{type:"array"},message:"must be array"};u===null?u=[ce]:u.push(ce),l++}var N=q===l;N&&k?(k=!1,I=[I,4]):N&&(k=!0,I=4)}}}if(k)l=X,u!==null&&(X?u.length=X:u=null);else{const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf",keyword:"oneOf",params:{passingSchemas:I},message:"must match exactly one schema in oneOf"};u===null?u=[U]:u.push(U),l++}var C=D===l;C&&m?(m=!1,p=[p,2]):C&&(m=!0,p=2)}if(m)l=d,u!==null&&(d?u.length=d:u=null);else{const D={instancePath:a,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:p},message:"must match exactly one schema in oneOf"};return u===null?u=[D]:u.push(D),l++,Ke.errors=u,!1}return Ke.errors=u,l===0}function Be(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(l===0)if(Array.isArray(r)){if(r.length<1)return Be.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p2)return we.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(r.length<2)return we.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p"]!==void 0){const p=l;we(r[">"],{instancePath:a+"/>",parentData:r,parentDataProperty:">",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r[">="]!==void 0){const p=l;we(r[">="],{instancePath:a+"/>=",parentData:r,parentDataProperty:">=",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r["%"]!==void 0){const p=l;we(r["%"],{instancePath:a+"/%",parentData:r,parentDataProperty:"%",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r["/"]!==void 0){const p=l;we(r["/"],{instancePath:a+"/~1",parentData:r,parentDataProperty:"/",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r.map!==void 0){const p=l;we(r.map,{instancePath:a+"/map",parentData:r,parentDataProperty:"map",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r.filter!==void 0){const p=l;we(r.filter,{instancePath:a+"/filter",parentData:r,parentDataProperty:"filter",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r.all!==void 0){const p=l;we(r.all,{instancePath:a+"/all",parentData:r,parentDataProperty:"all",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r.none!==void 0){const p=l;we(r.none,{instancePath:a+"/none",parentData:r,parentDataProperty:"none",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d){if(r.some!==void 0){const p=l;we(r.some,{instancePath:a+"/some",parentData:r,parentDataProperty:"some",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0;if(d)if(r.in!==void 0){const p=l;we(r.in,{instancePath:a+"/in",parentData:r,parentDataProperty:"in",rootData:c})||(u=u===null?we.errors:u.concat(we.errors),l=u.length);var d=p===l}else var d=!0}}}}}}}}}}}}}}}else return $a.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return $a.errors=u,l===0}function kt(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(l===0)if(Array.isArray(r)){if(r.length>3)return kt.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(r.length<2)return kt.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p1){const T={instancePath:a,schemaPath:"#/anyOf/0/maxItems",keyword:"maxItems",params:{limit:1},message:"must NOT have more than 1 items"};u===null?u=[T]:u.push(T),l++}else if(r.length<1){const T={instancePath:a,schemaPath:"#/anyOf/0/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};u===null?u=[T]:u.push(T),l++}else{var g=!0;const T=r.length;for(let j=0;j3)return $r.errors=[{instancePath:a+"/reduce",schemaPath:"#/properties/reduce/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(p.length<3)return $r.errors=[{instancePath:a+"/reduce",schemaPath:"#/properties/reduce/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{var d=!0;const v=p.length;for(let T=0;T2)return Ar.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(r.length<2)return Ar.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',enum:["=","!=",">","<",">=","<=","~","^"]},{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]}]}}},Ny=new RegExp("^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$","u");function nr(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(l===0)if(r&&typeof r=="object"&&!Array.isArray(r)){const k=l;for(const I in r)if(I!=="sem_ver")return nr.errors=[{instancePath:a,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:I},message:"must NOT have additional properties"}],!1;if(k===l&&r.sem_ver!==void 0){let I=r.sem_ver;if(l===l)if(Array.isArray(I)){if(I.length>3)return nr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(I.length<3)return nr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{const te=I.length;if(te>0){let R=I[0];const U=l,_=l;let w=!1,E=null;const q=l;if(l===l)if(typeof R=="string"){if(!Ny.test(R)){const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/semVerString/pattern",keyword:"pattern",params:{pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},message:'must match pattern "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"'};u===null?u=[z]:u.push(z),l++}}else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/semVerString/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[z]:u.push(z),l++}var v=q===l;v&&(w=!0,E=0);const ce=l;if(l===l)if(R&&typeof R=="object"&&!Array.isArray(R)){const z=l;for(const x in R)if(x!=="var"){const Z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/varRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:x},message:"must NOT have additional properties"};u===null?u=[Z]:u.push(Z),l++;break}if(z===l&&R.var!==void 0){let x=R.var;const Z=l;let P=!1;const J=l;if(l===J)if(typeof x=="string"){if(!hc.test(x)){const O={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/pattern",keyword:"pattern",params:{pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},message:'must match pattern "^\\$flagd\\.((timestamp)|(flagKey))$"'};u===null?u=[O]:u.push(O),l++}}else{const O={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[O]:u.push(O),l++}var d=J===l;if(P=P||d,!P){const O=l,$=l,ee=l;if(l===ee)if(typeof x=="string"){if(!dc.test(x)){const ie={};u===null?u=[ie]:u.push(ie),l++}}else{const ie={};u===null?u=[ie]:u.push(ie),l++}var m=ee===l;if(m){const ie={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};u===null?u=[ie]:u.push(ie),l++}else l=$,u!==null&&($?u.length=$:u=null);var d=O===l;if(P=P||d,!P){const ie=l;if(l===ie)if(Array.isArray(x))if(x.length<1){const de={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};u===null?u=[de]:u.push(de),l++}else{const de=x.length;var p=de<=1;if(!p)for(let Re=1;Re0&&typeof x[0]!="string"){const B={instancePath:a+"/sem_ver/0/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[B]:u.push(B),l++}}else{const de={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};u===null?u=[de]:u.push(de),l++}var d=ie===l;P=P||d}}if(P)l=Z,u!==null&&(Z?u.length=Z:u=null);else{const O={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};u===null?u=[O]:u.push(O),l++}}}else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};u===null?u=[z]:u.push(z),l++}var v=ce===l;if(v&&w?(w=!1,E=[E,1]):v&&(w=!0,E=1),w)l=_,u!==null&&(_?u.length=_:u=null);else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/properties/sem_ver/items/0/oneOf",keyword:"oneOf",params:{passingSchemas:E},message:"must match exactly one schema in oneOf"};return u===null?u=[z]:u.push(z),l++,nr.errors=u,!1}var T=U===l}if(T){if(te>1){let R=I[1];const U=l;if(!(R==="="||R==="!="||R===">"||R==="<"||R===">="||R==="<="||R==="~"||R==="^"))return nr.errors=[{instancePath:a+"/sem_ver/1",schemaPath:"#/properties/sem_ver/items/1/enum",keyword:"enum",params:{allowedValues:c2.properties.sem_ver.items[1].enum},message:"must be equal to one of the allowed values"}],!1;var T=U===l}if(T&&te>2){let R=I[2];const U=l,_=l;let w=!1,E=null;const q=l;if(l===l)if(typeof R=="string"){if(!Ny.test(R)){const x={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/semVerString/pattern",keyword:"pattern",params:{pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},message:'must match pattern "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"'};u===null?u=[x]:u.push(x),l++}}else{const x={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/semVerString/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[x]:u.push(x),l++}var X=q===l;X&&(w=!0,E=0);const ce=l;if(l===l)if(R&&typeof R=="object"&&!Array.isArray(R)){const x=l;for(const Z in R)if(Z!=="var"){const P={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/varRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:Z},message:"must NOT have additional properties"};u===null?u=[P]:u.push(P),l++;break}if(x===l&&R.var!==void 0){let Z=R.var;const P=l;let J=!1;const O=l;if(l===O)if(typeof Z=="string"){if(!hc.test(Z)){const $={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/pattern",keyword:"pattern",params:{pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},message:'must match pattern "^\\$flagd\\.((timestamp)|(flagKey))$"'};u===null?u=[$]:u.push($),l++}}else{const $={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[$]:u.push($),l++}var j=O===l;if(J=J||j,!J){const $=l,ee=l,se=l;if(l===se)if(typeof Z=="string"){if(!dc.test(Z)){const he={};u===null?u=[he]:u.push(he),l++}}else{const he={};u===null?u=[he]:u.push(he),l++}var C=se===l;if(C){const he={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};u===null?u=[he]:u.push(he),l++}else l=ee,u!==null&&(ee?u.length=ee:u=null);var j=$===l;if(J=J||j,!J){const he=l;if(l===he)if(Array.isArray(Z))if(Z.length<1){const Re={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};u===null?u=[Re]:u.push(Re),l++}else{const Re=Z.length;var N=Re<=1;if(!N)for(let B=1;B0&&typeof Z[0]!="string"){const b={instancePath:a+"/sem_ver/2/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[b]:u.push(b),l++}}else{const Re={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};u===null?u=[Re]:u.push(Re),l++}var j=he===l;J=J||j}}if(J)l=P,u!==null&&(P?u.length=P:u=null);else{const $={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};u===null?u=[$]:u.push($),l++}}}else{const x={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};u===null?u=[x]:u.push(x),l++}var X=ce===l;if(X&&w?(w=!1,E=[E,1]):X&&(w=!0,E=1),w)l=_,u!==null&&(_?u.length=_:u=null);else{const x={instancePath:a+"/sem_ver/2",schemaPath:"#/properties/sem_ver/items/2/oneOf",keyword:"oneOf",params:{passingSchemas:E},message:"must match exactly one schema in oneOf"};return u===null?u=[x]:u.push(x),l++,nr.errors=u,!1}var T=U===l}}}}else return nr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1}}else return nr.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return nr.errors=u,l===0}function nt(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(l===0)if(Array.isArray(r)){if(r.length<3)return nt.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{const T=r.length;var d=T<=3;if(!d)for(let j=3;j2)return nt.errors=[{instancePath:a+"/"+j,schemaPath:"#/definitions/fractionalWeightArg/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(C.length<1)return nt.errors=[{instancePath:a+"/"+j,schemaPath:"#/definitions/fractionalWeightArg/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const k=C.length;if(k>0){const I=l;if(typeof C[0]!="string")return nt.errors=[{instancePath:a+"/"+j+"/0",schemaPath:"#/definitions/fractionalWeightArg/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var m=I===l}if(m&&k>1){const I=l;if(typeof C[1]!="number")return nt.errors=[{instancePath:a+"/"+j+"/1",schemaPath:"#/definitions/fractionalWeightArg/items/1/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var m=I===l}}}else return nt.errors=[{instancePath:a+"/"+j,schemaPath:"#/definitions/fractionalWeightArg/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;var d=N===l;if(!d)break}if(d){const j=r.length;if(j>0){const C=l;Yr.validate(r[0],{instancePath:a+"/0",parentData:r,parentDataProperty:0,rootData:c})||(u=u===null?Yr.validate.errors:u.concat(Yr.validate.errors),l=u.length);var p=C===l}if(p){if(j>1){let C=r[1];const N=l;if(l===l)if(Array.isArray(C)){if(C.length>2)return nt.errors=[{instancePath:a+"/1",schemaPath:"#/definitions/fractionalWeightArg/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(C.length<1)return nt.errors=[{instancePath:a+"/1",schemaPath:"#/definitions/fractionalWeightArg/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const k=C.length;if(k>0){const I=l;if(typeof C[0]!="string")return nt.errors=[{instancePath:a+"/1/0",schemaPath:"#/definitions/fractionalWeightArg/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var g=I===l}if(g&&k>1){const I=l;if(typeof C[1]!="number")return nt.errors=[{instancePath:a+"/1/1",schemaPath:"#/definitions/fractionalWeightArg/items/1/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var g=I===l}}}else return nt.errors=[{instancePath:a+"/1",schemaPath:"#/definitions/fractionalWeightArg/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;var p=N===l}if(p&&j>2){let C=r[2];const N=l;if(l===l)if(Array.isArray(C)){if(C.length>2)return nt.errors=[{instancePath:a+"/2",schemaPath:"#/definitions/fractionalWeightArg/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(C.length<1)return nt.errors=[{instancePath:a+"/2",schemaPath:"#/definitions/fractionalWeightArg/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const k=C.length;if(k>0){const I=l;if(typeof C[0]!="string")return nt.errors=[{instancePath:a+"/2/0",schemaPath:"#/definitions/fractionalWeightArg/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var v=I===l}if(v&&k>1){const I=l;if(typeof C[1]!="number")return nt.errors=[{instancePath:a+"/2/1",schemaPath:"#/definitions/fractionalWeightArg/items/1/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var v=I===l}}}else return nt.errors=[{instancePath:a+"/2",schemaPath:"#/definitions/fractionalWeightArg/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;var p=N===l}}}}}else return nt.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;return nt.errors=u,l===0}function fr(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(Array.isArray(r)){if(r.length<2)return fr.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const p=r.length;for(let g=0;g2)return fr.errors=[{instancePath:a+"/"+g,schemaPath:"#/definitions/fractionalWeightArg/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(v.length<1)return fr.errors=[{instancePath:a+"/"+g,schemaPath:"#/definitions/fractionalWeightArg/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const C=v.length;if(C>0){const N=l;if(typeof v[0]!="string")return fr.errors=[{instancePath:a+"/"+g+"/0",schemaPath:"#/definitions/fractionalWeightArg/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"}],!1;var m=N===l}if(m&&C>1){const N=l;if(typeof v[1]!="number")return fr.errors=[{instancePath:a+"/"+g+"/1",schemaPath:"#/definitions/fractionalWeightArg/items/1/type",keyword:"type",params:{type:"number"},message:"must be number"}],!1;var m=N===l}}}else return fr.errors=[{instancePath:a+"/"+g,schemaPath:"#/definitions/fractionalWeightArg/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;var d=T===l;if(!d)break}}}else return fr.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;return fr.errors=u,l===0}function Qn(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;if(l===0)if(r&&typeof r=="object"&&!Array.isArray(r)){const m=l;for(const p in r)if(p!=="fractional")return Qn.errors=[{instancePath:a,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:p},message:"must NOT have additional properties"}],!1;if(m===l&&r.fractional!==void 0){let p=r.fractional;const g=l;let v=!1,T=null;const j=l;nt(p,{instancePath:a+"/fractional",parentData:r,parentDataProperty:"fractional",rootData:c})||(u=u===null?nt.errors:u.concat(nt.errors),l=u.length);var d=j===l;d&&(v=!0,T=0);const C=l;fr(p,{instancePath:a+"/fractional",parentData:r,parentDataProperty:"fractional",rootData:c})||(u=u===null?fr.errors:u.concat(fr.errors),l=u.length);var d=C===l;if(d&&v?(v=!1,T=[T,1]):d&&(v=!0,T=1),v)l=g,u!==null&&(g?u.length=g:u=null);else{const N={instancePath:a+"/fractional",schemaPath:"#/properties/fractional/oneOf",keyword:"oneOf",params:{passingSchemas:T},message:"must match exactly one schema in oneOf"};return u===null?u=[N]:u.push(N),l++,Qn.errors=u,!1}}}else return Qn.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return Qn.errors=u,l===0}function Za(r,{instancePath:a="",parentData:s,parentDataProperty:f,rootData:c=r}={}){let u=null,l=0;const d=l;let m=!1;const p=l;if(l===l)if(r&&typeof r=="object"&&!Array.isArray(r)){const I=l;for(const W in r)if(W!=="var"){const te={instancePath:a,schemaPath:"#/definitions/varRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:W},message:"must NOT have additional properties"};u===null?u=[te]:u.push(te),l++;break}if(I===l&&r.var!==void 0){let W=r.var;const te=l;let R=!1;const U=l;if(l===U)if(typeof W=="string"){if(!hc.test(W)){const _={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/pattern",keyword:"pattern",params:{pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},message:'must match pattern "^\\$flagd\\.((timestamp)|(flagKey))$"'};u===null?u=[_]:u.push(_),l++}}else{const _={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[_]:u.push(_),l++}var v=U===l;if(R=R||v,!R){const _=l,w=l,E=l;if(l===E)if(typeof W=="string"){if(!dc.test(W)){const G={};u===null?u=[G]:u.push(G),l++}}else{const G={};u===null?u=[G]:u.push(G),l++}var T=E===l;if(T){const G={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};u===null?u=[G]:u.push(G),l++}else l=w,u!==null&&(w?u.length=w:u=null);var v=_===l;if(R=R||v,!R){const G=l;if(l===G)if(Array.isArray(W))if(W.length<1){const K={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};u===null?u=[K]:u.push(K),l++}else{const K=W.length;var j=K<=1;if(!j)for(let z=1;z0&&typeof W[0]!="string"){const x={instancePath:a+"/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};u===null?u=[x]:u.push(x),l++}}else{const K={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};u===null?u=[K]:u.push(K),l++}var v=G===l;R=R||v}}if(R)l=te,u!==null&&(te?u.length=te:u=null);else{const _={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};u===null?u=[_]:u.push(_),l++}}}else{const I={instancePath:a,schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};u===null?u=[I]:u.push(I),l++}var N=p===l;if(m=m||N,!m){const I=l;if(l===l)if(r&&typeof r=="object"&&!Array.isArray(r)){const R=l;for(const U in r)if(U!=="missing"){const _={instancePath:a,schemaPath:"#/definitions/missingRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:U},message:"must NOT have additional properties"};u===null?u=[_]:u.push(_),l++;break}if(R===l&&r.missing!==void 0){let U=r.missing;if(l===l)if(Array.isArray(U)){var D=!0;const w=U.length;for(let E=0;E2){const G={instancePath:a+"/missing_some",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"};u===null?u=[G]:u.push(G),l++}else if(E.length<2){const G={instancePath:a+"/missing_some",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"};u===null?u=[G]:u.push(G),l++}else{const G=E.length;if(G>0){const ce=l;if(typeof E[0]!="number"){const K={instancePath:a+"/missing_some/0",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/items/0/type",keyword:"type",params:{type:"number"},message:"must be number"};u===null?u=[K]:u.push(K),l++}var X=ce===l}if(X&&G>1){let ce=E[1];const K=l;if(l===K)if(Array.isArray(ce)){var k=!0;const x=ce.length;for(let Z=0;Z{var v;u.has(g)?((v=u.get(g))===null||v===void 0?void 0:v.hash)!==p.hash&&m.push(g):l.push(g)}),u.forEach((p,g)=>{f.has(g)||d.push(g)}),this._flags=f,this._flagSetMetadata=c,[...l,...d,...m]}}class g2{constructor(a,s,f){this._logger=s?new sb(s):new dg,this._storage=a||new Rg(this._logger,f)}setConfigurations(a){return this._storage.setConfigurations(a)}getFlag(a){return this._storage.getFlag(a)}getFlags(){return this._storage.getFlags()}getFlagSetMetadata(){return this._storage.getFlagSetMetadata()}resolveBooleanEvaluation(a,s,f,c=this._logger){return this.resolve("boolean",a,s,f,c)}resolveStringEvaluation(a,s,f,c=this._logger){return this.resolve("string",a,s,f,c)}resolveNumberEvaluation(a,s,f,c=this._logger){return this.resolve("number",a,s,f,c)}resolveObjectEvaluation(a,s,f,c=this._logger){return this.resolve("object",a,s,f,c)}resolveAll(a={},s=this._logger){const f=[];for(const[c,u]of this.getFlags())try{if(u.state==="DISABLED")continue;const l=u.evaluate(a,s);l.value!==void 0?f.push(Object.assign(Object.assign({},l),{flagKey:c,value:l.value})):s.debug(`Flag ${c} omitted because ${l.errorCode}: ${l.errorMessage}`)}catch(l){s.debug(`Error resolving flag ${c}: ${l.message}`)}return f}resolve(a,s,f,c={},u=this._logger){const l=this._storage.getFlag(s);if(!l)return{value:f,reason:br.ERROR,errorCode:Fn.FLAG_NOT_FOUND,errorMessage:`flag '${s}' not found`,flagMetadata:this._storage.getFlagSetMetadata()};if(l.state==="DISABLED")return{value:f,reason:br.ERROR,errorCode:Fn.FLAG_NOT_FOUND,errorMessage:`flag '${s}' is disabled`,flagMetadata:l.metadata};const d=l.evaluate(c,u);return d.value===void 0?Object.assign(Object.assign({},d),{value:f}):typeof d.value!==a?{value:f,reason:br.ERROR,errorCode:Fn.TYPE_MISMATCH,errorMessage:`Evaluated type of the flag ${s} does not match. Expected ${a}, got ${typeof d.value}`,flagMetadata:l.metadata}:Object.assign(Object.assign({},d),{value:d.value})}}/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function xg(r){return typeof r>"u"||r===null}function v2(r){return typeof r=="object"&&r!==null}function b2(r){return Array.isArray(r)?r:xg(r)?[]:[r]}function E2(r,a){var s,f,c,u;if(a)for(u=Object.keys(a),s=0,f=u.length;s0&&l.hash(o),l!==this)return l}s.prototype.hash=function(o){var c,l,u,d,m;switch(m=o.length,this.len+=m,l=this.k1,u=0,this.rem){case 0:l^=m>u?o.charCodeAt(u++)&65535:0;case 1:l^=m>u?(o.charCodeAt(u++)&65535)<<8:0;case 2:l^=m>u?(o.charCodeAt(u++)&65535)<<16:0;case 3:l^=m>u?(o.charCodeAt(u)&255)<<24:0,l^=m>u?(o.charCodeAt(u++)&65280)>>8:0}if(this.rem=m+this.rem&3,m-=this.rem,m>0){for(c=this.h1;l=l*11601+(l&65535)*3432906752&4294967295,l=l<<15|l>>>17,l=l*13715+(l&65535)*461832192&4294967295,c^=l,c=c<<13|c>>>19,c=c*5+3864292196&4294967295,!(u>=m);)l=o.charCodeAt(u++)&65535^(o.charCodeAt(u++)&65535)<<8^(o.charCodeAt(u++)&65535)<<16,d=o.charCodeAt(u++),l^=(d&255)<<24^(d&65280)>>8;switch(l=0,this.rem){case 3:l^=(o.charCodeAt(u+2)&65535)<<16;case 2:l^=(o.charCodeAt(u+1)&65535)<<8;case 1:l^=o.charCodeAt(u)&65535}this.h1=c}return this.k1=l,this},s.prototype.result=function(){var o,c;return o=this.k1,c=this.h1,o>0&&(o=o*11601+(o&65535)*3432906752&4294967295,o=o<<15|o>>>17,o=o*13715+(o&65535)*461832192&4294967295,c^=o),c^=this.len,c^=c>>>16,c=c*51819+(c&65535)*2246770688&4294967295,c^=c>>>13,c=c*44597+(c&65535)*3266445312&4294967295,c^=c>>>16,c>>>0},s.prototype.reset=function(o){return this.h1=typeof o=="number"?o:0,this.rem=this.k1=this.len=0,this},a=new s,r.exports=s})()})(ac)),ac.exports}var Jb=Pb();const Wb=Ec(Jb),Nu="$flagd",S0="flagKey",e2="timestamp",t2="targetingKey",O0=Symbol.for("flagd.logger");function Mc(r){const a=r[O0];if(!a)throw new Error("Logger not found in context");return a}const jc="starts_with",Cc="ends_with";function r2(r,a){return T0(jc,r,a)}function n2(r,a){return T0(Cc,r,a)}function T0(r,a,s){const o=Mc(s);if(!Array.isArray(a))return o.debug("Invalid comparison configuration: input is not an array"),!1;if(a.length!=2)return o.debug(`Invalid comparison configuration: invalid array length ${a.length}`),!1;if(typeof a[0]!="string"||typeof a[1]!="string")return o.debug("Invalid comparison configuration: array values are not strings"),!1;switch(r){case jc:return a[0].startsWith(a[1]);case Cc:return a[0].endsWith(a[1]);default:return o.debug(`Invalid comparison configuration: Invalid method '${r}'`),!1}}const Mu="sem_ver";function a2(r,a){const s=Mc(a);if(!Array.isArray(r))return s.debug(`Invalid ${Mu} configuration: Expected an array`),!1;const o=Array.from(r);if(o.length!=3)return s.debug(`Invalid ${Mu} configuration: Expected 3 arguments, got ${o.length}`),!1;const c=nc.parse(o[0]),l=nc.parse(o[2]);if(!c||!l)return s.debug(`Invalid ${Mu} configuration: Unable to parse semver`),!1;const u=String(o[1]),d=nc.compare(c,l);switch(u){case"=":return d==0;case"!=":return d!=0;case"<":return d<0;case"<=":return d<=0;case">=":return d>=0;case">":return d>0;case"^":return c.major==l.major;case"~":return c.major==l.major&&c.minor==l.minor}return!1}const ju="fractional";function i2(r,a){const s=Mc(a);if(!Array.isArray(r))return null;const o=Array.from(r);if(o.length<1)return s.debug(`Invalid ${ju} configuration: Expected at least 1 bucket, got ${o.length}`),null;const c=a[Nu];if(!c)return s.debug("Missing flagd properties, cannot perform fractional targeting"),null;let l,u;if(typeof o[0]=="string")l=o[0],u=o.slice(1,o.length);else{const R=a[t2];if(!R)return s.debug("Missing targetingKey property, cannot perform fractional targeting"),null;l=`${c[S0]}${R}`,u=o}let d;try{d=l2(u)}catch(R){return s.debug(`Invalid ${ju} configuration: `,R.message),null}const m=2147483647;if(d.totalWeight>m)return s.debug(`Invalid ${ju} configuration: sum of weights exceeds Math.MaxInt32 (${m}), got ${d.totalWeight}`),null;const g=BigInt(new Wb(l).result()>>>0)*BigInt(d.totalWeight)>>BigInt(32);let v=BigInt(0);for(let R=0;Rg)return C.variant}return null}function l2(r){const a=[];let s=0;for(let o=0;o2)throw new Error("Invalid bucketing entry. Requires at least a variant");let l;if(typeof c[0]=="string"||typeof c[0]=="number"||typeof c[0]=="boolean")l=c[0];else if(c[0]===null||c[0]===void 0)l=null;else throw new Error("Bucketing requires variant to be a string, number, or boolean (or a JSONLogic expression that evaluates to one)");let u=1;if(c.length>=2){const d=c[1];if(typeof d!="number"||!Number.isInteger(d))throw new Error("Bucketing requires weight to be an integer");u=Math.max(0,d)}a.push({fraction:u,variant:l}),s+=u}return{fractions:a,totalWeight:s}}class za{constructor(a,s,o={}){var c;this.logger=s,this._useInterpreter=(c=o.disableDynamicCodeGeneration)!==null&&c!==void 0?c:!1;const l=new Sc;l.addMethod(jc,r2),l.addMethod(Cc,n2),l.addMethod(Mu,a2),l.addMethod(ju,i2),this._useInterpreter?(za.validateMethods(a,l),this._engine=l,this._logic=a):this._compiledLogic=l.build(a)}static validateMethods(a,s){if(a===null||typeof a!="object")return;if(Array.isArray(a)){for(const u of a)za.validateMethods(u,s);return}const o=Object.keys(a);if(o.length===0)return;const c=o[0];if(!(c in s.methods)&&!s.isData(a,c))throw new Error(`Method '${c}' was not found in the Logic Engine.`);const l=a[c];if(Array.isArray(l))for(const u of l)za.validateMethods(u,s);else za.validateMethods(l,s)}evaluate(a,s,o=this.logger){Object.hasOwn(s,Nu)&&o.debug(`overwriting ${Nu} property in the context`);const c=Object.assign(Object.assign({},s),{[Nu]:{[S0]:a,[e2]:Math.floor(Date.now()/1e3)},[O0]:o});return this._useInterpreter?this._engine.run(this._logic,c):this._compiledLogic(c)}}class u2{constructor(a,s,o,c={}){var l;if(this.logger=o,this._key=a,this._state=s.state,this._defaultVariant=s.defaultVariant||void 0,this._variants=new Map(Object.entries(s.variants)),this._metadata=(l=s.metadata)!==null&&l!==void 0?l:{},s.targeting&&Object.keys(s.targeting).length>0)try{this._targeting=new za(s.targeting,o,c)}catch{const d=`Invalid targeting configuration for flag '${a}'`;this.logger.warn(d),this._targetingParseErrorMessage=d}this._hash=cb.sha1(s),this.validateStructure()}get key(){return this._key}get hash(){return this._hash}get state(){return this._state}get defaultVariant(){return this._defaultVariant}get variants(){return this._variants}get metadata(){return this._metadata}evaluate(a,s=this.logger){let o,c;if(this._targetingParseErrorMessage)return{reason:br.ERROR,errorCode:Kn.PARSE_ERROR,errorMessage:this._targetingParseErrorMessage,flagMetadata:this.metadata};if(!this._targeting)o=this._defaultVariant,c=br.STATIC;else{let d;try{d=this._targeting.evaluate(this._key,a,s)}catch(m){return s.debug(`Error evaluating targeting rule for flag '${this._key}': ${m.message}`),{reason:br.ERROR,errorCode:Kn.GENERAL,errorMessage:`Error evaluating targeting rule for flag '${this._key}'`,flagMetadata:this.metadata}}d==null?(o=this._defaultVariant,c=br.DEFAULT):(o=d.toString(),c=br.TARGETING_MATCH)}if(o==null&&(this.defaultVariant===null||this.defaultVariant===void 0))return{reason:br.DEFAULT,flagMetadata:this.metadata};const l=o,u=this._variants.get(l);return u===void 0?{reason:br.ERROR,errorCode:Kn.GENERAL,errorMessage:`Variant '${o}' not found in flag with key '${this._key}'`,flagMetadata:this.metadata}:{value:u,reason:c,variant:l,flagMetadata:this.metadata}}validateStructure(){if(this._state!=="ENABLED"&&this._state!=="DISABLED")throw new zm(`Invalid flag state: ${JSON.stringify(this._state,void 0,2)}`);if(this._defaultVariant&&!this._variants.has(this._defaultVariant))throw new zm(`Default variant ${this._defaultVariant} missing from variants ${JSON.stringify(this._variants,void 0,2)}`)}}function s2(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var Lc={exports:{}};Lc.exports=zc;Lc.exports.default=zc;const R0={additionalProperties:{type:["string","number","boolean"]}},Gt=new RegExp("^.{1,}$","u"),dc=new RegExp("^\\$flagd\\.((timestamp)|(flagKey))$","u"),pc=new RegExp("^\\$flagd\\..*$","u"),o2={properties:{if:{title:"If Operator",description:'The if statement takes 1 or more arguments: a condition ("if"), what to do if its true ("then", optional, defaults to returning true), and what to do if its false ("else", optional, defaults to returning false). Note that the else condition can be used as an else-if statement by adding additional arguments.',$ref:"#/definitions/variadicOp"},"==":{title:"Lose Equality Operation",description:"Tests equality, with type coercion. Requires two arguments.",$ref:"#/definitions/binaryOp"},"===":{title:"Strict Equality Operation",description:"Tests strict equality. Requires two arguments.",$ref:"#/definitions/binaryOp"},"!=":{title:"Lose Inequality Operation",description:"Tests not-equal, with type coercion.",$ref:"#/definitions/binaryOp"},"!==":{title:"Strict Inequality Operation",description:"Tests strict not-equal.",$ref:"#/definitions/binaryOp"},">":{title:"Greater-Than Operation",$ref:"#/definitions/binaryOp"},">=":{title:"Greater-Than-Or-Equal-To Operation",$ref:"#/definitions/binaryOp"},"%":{title:"Modulo Operation",description:"Finds the remainder after the first argument is divided by the second argument.",$ref:"#/definitions/binaryOp"},"/":{title:"Division Operation",$ref:"#/definitions/binaryOp"},map:{title:"Map Operation",description:"Perform an action on every member of an array. Note, that inside the logic being used to map, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},filter:{title:"Filter Operation",description:"Keep only elements of the array that pass a test. Note, that inside the logic being used to filter, var operations are relative to the array element being worked on.",$ref:"#/definitions/binaryOp"},all:{title:"All Operation",description:"Perform a test on each member of that array, returning true if all pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},none:{title:"None Operation",description:"Perform a test on each member of that array, returning true if none pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},some:{title:"Some Operation",description:"Perform a test on each member of that array, returning true if some pass. Inside the test code, var operations are relative to the array element being tested.",$ref:"#/definitions/binaryOp"},in:{title:"In Operation",description:"If the second argument is an array, tests that the first argument is a member of the array.",$ref:"#/definitions/binaryOp"}}},f2=Object.prototype.hasOwnProperty,Ny=new RegExp("^\\$ref$","u"),ar={validate:Qa};function Xe(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;const d=u;let m=!1,p=null;const g=u;if(u===u)if(r&&typeof r=="object"&&!Array.isArray(r)){const N=u;for(const V in r)if(!Ny.test(V)){const H={instancePath:a,schemaPath:"#/definitions/reference/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:V},message:"must NOT have additional properties"};l===null?l=[H]:l.push(H),u++;break}if(N===u){var R=!0;for(const V in r)if(Ny.test(V)){const H=u;if(typeof r[V]!="string"){const W={instancePath:a+"/"+V.replace(/~/g,"~0").replace(/\//g,"~1"),schemaPath:"#/definitions/reference/patternProperties/%5E%5C%24ref%24/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[W]:l.push(W),u++}var R=H===u;if(!R)break}}}else{const N={instancePath:a,schemaPath:"#/definitions/reference/type",keyword:"type",params:{type:"object"},message:"must be object"};l===null?l=[N]:l.push(N),u++}var L=g===u;L&&(m=!0,p=0);const C=u;ar.validate(r,{instancePath:a,parentData:s,parentDataProperty:o,rootData:c})||(l=l===null?ar.validate.errors:l.concat(ar.validate.errors),u=l.length);var L=C===u;if(L&&m)m=!1,p=[p,1];else{L&&(m=!0,p=1);const N=u,V=u;let H=!1,X=null;const W=u;if(r!==null){const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/0/type",keyword:"type",params:{type:"null"},message:"must be null"};l===null?l=[U]:l.push(U),u++}var j=W===u;j&&(H=!0,X=0);const re=u;if(typeof r!="boolean"){const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/1/type",keyword:"type",params:{type:"boolean"},message:"must be boolean"};l===null?l=[U]:l.push(U),u++}var j=re===u;if(j&&H)H=!1,X=[X,1];else{j&&(H=!0,X=1);const U=u;if(typeof r!="number"){const w={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/2/type",keyword:"type",params:{type:"number"},message:"must be number"};l===null?l=[w]:l.push(w),u++}var j=U===u;if(j&&H)H=!1,X=[X,2];else{j&&(H=!0,X=2);const w=u;if(typeof r!="string"){const B={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/3/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[B]:l.push(B),u++}var j=w===u;if(j&&H)H=!1,X=[X,3];else{j&&(H=!0,X=3);const B=u;if(!Array.isArray(r)){const ce={instancePath:a,schemaPath:"#/definitions/primitive/oneOf/4/type",keyword:"type",params:{type:"array"},message:"must be array"};l===null?l=[ce]:l.push(ce),u++}var j=B===u;j&&H?(H=!1,X=[X,4]):j&&(H=!0,X=4)}}}if(H)u=V,l!==null&&(V?l.length=V:l=null);else{const U={instancePath:a,schemaPath:"#/definitions/primitive/oneOf",keyword:"oneOf",params:{passingSchemas:X},message:"must match exactly one schema in oneOf"};l===null?l=[U]:l.push(U),u++}var L=N===u;L&&m?(m=!1,p=[p,2]):L&&(m=!0,p=2)}if(m)u=d,l!==null&&(d?l.length=d:l=null);else{const N={instancePath:a,schemaPath:"#/oneOf",keyword:"oneOf",params:{passingSchemas:p},message:"must match exactly one schema in oneOf"};return l===null?l=[N]:l.push(N),u++,Xe.errors=l,!1}return Xe.errors=l,u===0}function Ue(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(Array.isArray(r)){if(r.length<1)return Ue.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p2)return we.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(r.length<2)return we.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p"]!==void 0){const p=u;we(r[">"],{instancePath:a+"/>",parentData:r,parentDataProperty:">",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r[">="]!==void 0){const p=u;we(r[">="],{instancePath:a+"/>=",parentData:r,parentDataProperty:">=",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r["%"]!==void 0){const p=u;we(r["%"],{instancePath:a+"/%",parentData:r,parentDataProperty:"%",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r["/"]!==void 0){const p=u;we(r["/"],{instancePath:a+"/~1",parentData:r,parentDataProperty:"/",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r.map!==void 0){const p=u;we(r.map,{instancePath:a+"/map",parentData:r,parentDataProperty:"map",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r.filter!==void 0){const p=u;we(r.filter,{instancePath:a+"/filter",parentData:r,parentDataProperty:"filter",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r.all!==void 0){const p=u;we(r.all,{instancePath:a+"/all",parentData:r,parentDataProperty:"all",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r.none!==void 0){const p=u;we(r.none,{instancePath:a+"/none",parentData:r,parentDataProperty:"none",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d){if(r.some!==void 0){const p=u;we(r.some,{instancePath:a+"/some",parentData:r,parentDataProperty:"some",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0;if(d)if(r.in!==void 0){const p=u;we(r.in,{instancePath:a+"/in",parentData:r,parentDataProperty:"in",rootData:c})||(l=l===null?we.errors:l.concat(we.errors),u=l.length);var d=p===u}else var d=!0}}}}}}}}}}}}}}}else return Ha.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return Ha.errors=l,u===0}function kt(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(Array.isArray(r)){if(r.length>3)return kt.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(r.length<2)return kt.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p1){const R={instancePath:a,schemaPath:"#/anyOf/0/maxItems",keyword:"maxItems",params:{limit:1},message:"must NOT have more than 1 items"};l===null?l=[R]:l.push(R),u++}else if(r.length<1){const R={instancePath:a,schemaPath:"#/anyOf/0/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};l===null?l=[R]:l.push(R),u++}else{var g=!0;const R=r.length;for(let C=0;C3)return $r.errors=[{instancePath:a+"/reduce",schemaPath:"#/properties/reduce/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(p.length<3)return $r.errors=[{instancePath:a+"/reduce",schemaPath:"#/properties/reduce/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{var d=!0;const v=p.length;for(let R=0;R2)return Ar.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(r.length<2)return Ar.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p", "<", ">=", "<=", "~" (match minor version), "^" (match major version).',enum:["=","!=",">","<",">=","<=","~","^"]},{oneOf:[{$ref:"#/definitions/semVerString"},{$ref:"#/definitions/varRule"}]}]}}},My=new RegExp("^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$","u");function rr(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(r&&typeof r=="object"&&!Array.isArray(r)){const H=u;for(const X in r)if(X!=="sem_ver")return rr.errors=[{instancePath:a,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:X},message:"must NOT have additional properties"}],!1;if(H===u&&r.sem_ver!==void 0){let X=r.sem_ver;if(u===u)if(Array.isArray(X)){if(X.length>3)return rr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/maxItems",keyword:"maxItems",params:{limit:3},message:"must NOT have more than 3 items"}],!1;if(X.length<3)return rr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/minItems",keyword:"minItems",params:{limit:3},message:"must NOT have fewer than 3 items"}],!1;{const re=X.length;if(re>0){let x=X[0];const U=u,_=u;let w=!1,b=null;const B=u;if(u===u)if(typeof x=="string"){if(!My.test(x)){const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/semVerString/pattern",keyword:"pattern",params:{pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},message:'must match pattern "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"'};l===null?l=[z]:l.push(z),u++}}else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/semVerString/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[z]:l.push(z),u++}var v=B===u;v&&(w=!0,b=0);const ce=u;if(u===u)if(x&&typeof x=="object"&&!Array.isArray(x)){const z=u;for(const D in x)if(D!=="var"){const I={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/varRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:D},message:"must NOT have additional properties"};l===null?l=[I]:l.push(I),u++;break}if(z===u&&x.var!==void 0){let D=x.var;const I=u;let J=!1;const P=u;if(u===P)if(typeof D=="string"){if(!dc.test(D)){const S={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/pattern",keyword:"pattern",params:{pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},message:'must match pattern "^\\$flagd\\.((timestamp)|(flagKey))$"'};l===null?l=[S]:l.push(S),u++}}else{const S={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[S]:l.push(S),u++}var d=P===u;if(J=J||d,!J){const S=u,k=u,ee=u;if(u===ee)if(typeof D=="string"){if(!pc.test(D)){const ue={};l===null?l=[ue]:l.push(ue),u++}}else{const ue={};l===null?l=[ue]:l.push(ue),u++}var m=ee===u;if(m){const ue={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};l===null?l=[ue]:l.push(ue),u++}else u=k,l!==null&&(k?l.length=k:l=null);var d=S===u;if(J=J||d,!J){const ue=u;if(u===ue)if(Array.isArray(D))if(D.length<1){const de={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};l===null?l=[de]:l.push(de),u++}else{const de=D.length;var p=de<=1;if(!p)for(let Te=1;Te0&&typeof D[0]!="string"){const te={instancePath:a+"/sem_ver/0/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[te]:l.push(te),u++}}else{const de={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};l===null?l=[de]:l.push(de),u++}var d=ue===u;J=J||d}}if(J)u=I,l!==null&&(I?l.length=I:l=null);else{const S={instancePath:a+"/sem_ver/0/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};l===null?l=[S]:l.push(S),u++}}}else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};l===null?l=[z]:l.push(z),u++}var v=ce===u;if(v&&w?(w=!1,b=[b,1]):v&&(w=!0,b=1),w)u=_,l!==null&&(_?l.length=_:l=null);else{const z={instancePath:a+"/sem_ver/0",schemaPath:"#/properties/sem_ver/items/0/oneOf",keyword:"oneOf",params:{passingSchemas:b},message:"must match exactly one schema in oneOf"};return l===null?l=[z]:l.push(z),u++,rr.errors=l,!1}var R=U===u}if(R){if(re>1){let x=X[1];const U=u;if(!(x==="="||x==="!="||x===">"||x==="<"||x===">="||x==="<="||x==="~"||x==="^"))return rr.errors=[{instancePath:a+"/sem_ver/1",schemaPath:"#/properties/sem_ver/items/1/enum",keyword:"enum",params:{allowedValues:c2.properties.sem_ver.items[1].enum},message:"must be equal to one of the allowed values"}],!1;var R=U===u}if(R&&re>2){let x=X[2];const U=u,_=u;let w=!1,b=null;const B=u;if(u===u)if(typeof x=="string"){if(!My.test(x)){const D={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/semVerString/pattern",keyword:"pattern",params:{pattern:"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},message:'must match pattern "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"'};l===null?l=[D]:l.push(D),u++}}else{const D={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/semVerString/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[D]:l.push(D),u++}var V=B===u;V&&(w=!0,b=0);const ce=u;if(u===u)if(x&&typeof x=="object"&&!Array.isArray(x)){const D=u;for(const I in x)if(I!=="var"){const J={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/varRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:I},message:"must NOT have additional properties"};l===null?l=[J]:l.push(J),u++;break}if(D===u&&x.var!==void 0){let I=x.var;const J=u;let P=!1;const S=u;if(u===S)if(typeof I=="string"){if(!dc.test(I)){const k={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/pattern",keyword:"pattern",params:{pattern:"^\\$flagd\\.((timestamp)|(flagKey))$"},message:'must match pattern "^\\$flagd\\.((timestamp)|(flagKey))$"'};l===null?l=[k]:l.push(k),u++}}else{const k={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/0/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[k]:l.push(k),u++}var C=S===u;if(P=P||C,!P){const k=u,ee=u,se=u;if(u===se)if(typeof I=="string"){if(!pc.test(I)){const he={};l===null?l=[he]:l.push(he),u++}}else{const he={};l===null?l=[he]:l.push(he),u++}var L=se===u;if(L){const he={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/1/not",keyword:"not",params:{},message:"must NOT be valid"};l===null?l=[he]:l.push(he),u++}else u=ee,l!==null&&(ee?l.length=ee:l=null);var C=k===u;if(P=P||C,!P){const he=u;if(u===he)if(Array.isArray(I))if(I.length<1){const Te={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"};l===null?l=[Te]:l.push(Te),u++}else{const Te=I.length;var j=Te<=1;if(!j)for(let te=1;te0&&typeof I[0]!="string"){const E={instancePath:a+"/sem_ver/2/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[E]:l.push(E),u++}}else{const Te={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};l===null?l=[Te]:l.push(Te),u++}var C=he===u;P=P||C}}if(P)u=J,l!==null&&(J?l.length=J:l=null);else{const k={instancePath:a+"/sem_ver/2/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};l===null?l=[k]:l.push(k),u++}}}else{const D={instancePath:a+"/sem_ver/2",schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};l===null?l=[D]:l.push(D),u++}var V=ce===u;if(V&&w?(w=!1,b=[b,1]):V&&(w=!0,b=1),w)u=_,l!==null&&(_?l.length=_:l=null);else{const D={instancePath:a+"/sem_ver/2",schemaPath:"#/properties/sem_ver/items/2/oneOf",keyword:"oneOf",params:{passingSchemas:b},message:"must match exactly one schema in oneOf"};return l===null?l=[D]:l.push(D),u++,rr.errors=l,!1}var R=U===u}}}}else return rr.errors=[{instancePath:a+"/sem_ver",schemaPath:"#/properties/sem_ver/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1}}else return rr.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"object"},message:"must be object"}],!1;return rr.errors=l,u===0}function gt(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(Array.isArray(r)){if(r.length>2)return gt.errors=[{instancePath:a,schemaPath:"#/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"}],!1;if(r.length<1)return gt.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const p=r.length;if(p>0){const g=u;Xe(r[0],{instancePath:a+"/0",parentData:r,parentDataProperty:0,rootData:c})||(l=l===null?Xe.errors:l.concat(Xe.errors),u=l.length);var d=g===u}if(d&&p>1){let g=r[1];const v=u,R=u;let C=!1,L=null;const j=u;if(!(typeof g=="number"&&!(g%1)&&!isNaN(g))){const H={instancePath:a+"/1",schemaPath:"#/items/1/oneOf/0/type",keyword:"type",params:{type:"integer"},message:"must be integer"};l===null?l=[H]:l.push(H),u++}if(u===j&&typeof g=="number"&&(g<0||isNaN(g))){const H={instancePath:a+"/1",schemaPath:"#/items/1/oneOf/0/minimum",keyword:"minimum",params:{comparison:">=",limit:0},message:"must be >= 0"};l===null?l=[H]:l.push(H),u++}var m=j===u;m&&(C=!0,L=0);const N=u;ar.validate(g,{instancePath:a+"/1",parentData:r,parentDataProperty:1,rootData:c})||(l=l===null?ar.validate.errors:l.concat(ar.validate.errors),u=l.length);var m=N===u;if(m&&C?(C=!1,L=[L,1]):m&&(C=!0,L=1),C)u=R,l!==null&&(R?l.length=R:l=null);else{const H={instancePath:a+"/1",schemaPath:"#/items/1/oneOf",keyword:"oneOf",params:{passingSchemas:L},message:"must match exactly one schema in oneOf"};return l===null?l=[H]:l.push(H),u++,gt.errors=l,!1}var d=v===u}}}else return gt.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;return gt.errors=l,u===0}function Xa(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(Array.isArray(r)){if(r.length<1)return Xa.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{const p=r.length;var d=p<=3;if(!d)for(let g=3;g0){const v=u;ar.validate(r[0],{instancePath:a+"/0",parentData:r,parentDataProperty:0,rootData:c})||(l=l===null?ar.validate.errors:l.concat(ar.validate.errors),u=l.length);var m=v===u}if(m){if(g>1){const v=u;gt(r[1],{instancePath:a+"/1",parentData:r,parentDataProperty:1,rootData:c})||(l=l===null?gt.errors:l.concat(gt.errors),u=l.length);var m=v===u}if(m&&g>2){const v=u;gt(r[2],{instancePath:a+"/2",parentData:r,parentDataProperty:2,rootData:c})||(l=l===null?gt.errors:l.concat(gt.errors),u=l.length);var m=v===u}}}}}else return Xa.errors=[{instancePath:a,schemaPath:"#/type",keyword:"type",params:{type:"array"},message:"must be array"}],!1;return Xa.errors=l,u===0}function Za(r,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:c=r}={}){let l=null,u=0;if(u===0)if(Array.isArray(r)){if(r.length<1)return Za.errors=[{instancePath:a,schemaPath:"#/minItems",keyword:"minItems",params:{limit:1},message:"must NOT have fewer than 1 items"}],!1;{var d=!0;const m=r.length;for(let p=0;p0&&typeof W[0]!="string"){const D={instancePath:a+"/var/0",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/items/0/type",keyword:"type",params:{type:"string"},message:"must be string"};l===null?l=[D]:l.push(D),u++}}else{const K={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf/2/type",keyword:"type",params:{type:"array"},message:"must be array"};l===null?l=[K]:l.push(K),u++}var v=Y===u;x=x||v}}if(x)u=re,l!==null&&(re?l.length=re:l=null);else{const _={instancePath:a+"/var",schemaPath:"#/definitions/varRule/properties/var/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};l===null?l=[_]:l.push(_),u++}}}else{const X={instancePath:a,schemaPath:"#/definitions/varRule/type",keyword:"type",params:{type:"object"},message:"must be object"};l===null?l=[X]:l.push(X),u++}var j=p===u;if(m=m||j,!m){const X=u;if(u===u)if(r&&typeof r=="object"&&!Array.isArray(r)){const x=u;for(const U in r)if(U!=="missing"){const _={instancePath:a,schemaPath:"#/definitions/missingRule/additionalProperties",keyword:"additionalProperties",params:{additionalProperty:U},message:"must NOT have additional properties"};l===null?l=[_]:l.push(_),u++;break}if(x===u&&r.missing!==void 0){let U=r.missing;if(u===u)if(Array.isArray(U)){var N=!0;const w=U.length;for(let b=0;b2){const Y={instancePath:a+"/missing_some",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/maxItems",keyword:"maxItems",params:{limit:2},message:"must NOT have more than 2 items"};l===null?l=[Y]:l.push(Y),u++}else if(b.length<2){const Y={instancePath:a+"/missing_some",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/minItems",keyword:"minItems",params:{limit:2},message:"must NOT have fewer than 2 items"};l===null?l=[Y]:l.push(Y),u++}else{const Y=b.length;if(Y>0){const ce=u;if(typeof b[0]!="number"){const K={instancePath:a+"/missing_some/0",schemaPath:"#/definitions/missingSomeRule/properties/missing_some/items/0/type",keyword:"type",params:{type:"number"},message:"must be number"};l===null?l=[K]:l.push(K),u++}var V=ce===u}if(V&&Y>1){let ce=b[1];const K=u;if(u===K)if(Array.isArray(ce)){var H=!0;const D=ce.length;for(let I=0;I{var v;l.has(g)?((v=l.get(g))===null||v===void 0?void 0:v.hash)!==p.hash&&m.push(g):u.push(g)}),l.forEach((p,g)=>{o.has(g)||d.push(g)}),this._flags=o,this._flagSetMetadata=c,[...u,...d,...m]}}class g2{constructor(a,s,o){this._logger=s?new ob(s):new p0,this._storage=a||new x0(this._logger,o)}setConfigurations(a){return this._storage.setConfigurations(a)}getFlag(a){return this._storage.getFlag(a)}getFlags(){return this._storage.getFlags()}getFlagSetMetadata(){return this._storage.getFlagSetMetadata()}resolveBooleanEvaluation(a,s,o,c=this._logger){return this.resolve("boolean",a,s,o,c)}resolveStringEvaluation(a,s,o,c=this._logger){return this.resolve("string",a,s,o,c)}resolveNumberEvaluation(a,s,o,c=this._logger){return this.resolve("number",a,s,o,c)}resolveObjectEvaluation(a,s,o,c=this._logger){return this.resolve("object",a,s,o,c)}resolveAll(a={},s=this._logger){const o=[];for(const[c,l]of this.getFlags())try{if(l.state==="DISABLED")continue;const u=l.evaluate(a,s);u.value!==void 0?o.push(Object.assign(Object.assign({},u),{flagKey:c,value:u.value})):s.debug(`Flag ${c} omitted because ${u.errorCode}: ${u.errorMessage}`)}catch(u){s.debug(`Error resolving flag ${c}: ${u.message}`)}return o}resolve(a,s,o,c={},l=this._logger){const u=this._storage.getFlag(s);if(!u)return{value:o,reason:br.ERROR,errorCode:Kn.FLAG_NOT_FOUND,errorMessage:`flag '${s}' not found`,flagMetadata:this._storage.getFlagSetMetadata()};if(u.state==="DISABLED")return{value:o,reason:br.ERROR,errorCode:Kn.FLAG_NOT_FOUND,errorMessage:`flag '${s}' is disabled`,flagMetadata:u.metadata};const d=u.evaluate(c,l);return d.value===void 0?Object.assign(Object.assign({},d),{value:o}):typeof d.value!==a?{value:o,reason:br.ERROR,errorCode:Kn.TYPE_MISMATCH,errorMessage:`Evaluated type of the flag ${s} does not match. Expected ${a}, got ${typeof d.value}`,flagMetadata:u.metadata}:Object.assign(Object.assign({},d),{value:d.value})}}/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function D0(r){return typeof r>"u"||r===null}function v2(r){return typeof r=="object"&&r!==null}function b2(r){return Array.isArray(r)?r:D0(r)?[]:[r]}function E2(r,a){var s,o,c,l;if(a)for(l=Object.keys(a),s=0,o=l.length;sd&&(u=" ... ",a=f-d+u.length),s-f>d&&(l=" ...",s=f+d-l.length),{str:u+r.slice(a,s).replace(/\t/g,"→")+l,pos:f-a+u.length}}function ac(r,a){return ot.repeat(" ",a-r.length)+r}function D2(r,a){if(a=Object.create(a||null),!r.buffer)return null;a.maxLength||(a.maxLength=79),typeof a.indent!="number"&&(a.indent=1),typeof a.linesBefore!="number"&&(a.linesBefore=3),typeof a.linesAfter!="number"&&(a.linesAfter=2);for(var s=/\r?\n|\r|\0/g,f=[0],c=[],u,l=-1;u=s.exec(r.buffer);)c.push(u.index),f.push(u.index+u[0].length),r.position<=u.index&&l<0&&(l=f.length-2);l<0&&(l=f.length-1);var d="",m,p,g=Math.min(r.line+a.linesAfter,c.length).toString().length,v=a.maxLength-(a.indent+g+3);for(m=1;m<=a.linesBefore&&!(l-m<0);m++)p=nc(r.buffer,f[l-m],c[l-m],r.position-(f[l]-f[l-m]),v),d=ot.repeat(" ",a.indent)+ac((r.line-m+1).toString(),g)+" | "+p.str+` -`+d;for(p=nc(r.buffer,f[l],c[l],r.position,v),d+=ot.repeat(" ",a.indent)+ac((r.line+1).toString(),g)+" | "+p.str+` +`+r.mark.snippet),o+" "+s):o}function ll(r,a){Error.call(this),this.name="YAMLException",this.reason=r,this.mark=a,this.message=N0(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}ll.prototype=Object.create(Error.prototype);ll.prototype.constructor=ll;ll.prototype.toString=function(a){return this.name+": "+N0(this,a)};var Rt=ll;function ic(r,a,s,o,c){var l="",u="",d=Math.floor(c/2)-1;return o-a>d&&(l=" ... ",a=o-d+l.length),s-o>d&&(u=" ...",s=o+d-u.length),{str:l+r.slice(a,s).replace(/\t/g,"→")+u,pos:o-a+l.length}}function lc(r,a){return ot.repeat(" ",a-r.length)+r}function D2(r,a){if(a=Object.create(a||null),!r.buffer)return null;a.maxLength||(a.maxLength=79),typeof a.indent!="number"&&(a.indent=1),typeof a.linesBefore!="number"&&(a.linesBefore=3),typeof a.linesAfter!="number"&&(a.linesAfter=2);for(var s=/\r?\n|\r|\0/g,o=[0],c=[],l,u=-1;l=s.exec(r.buffer);)c.push(l.index),o.push(l.index+l[0].length),r.position<=l.index&&u<0&&(u=o.length-2);u<0&&(u=o.length-1);var d="",m,p,g=Math.min(r.line+a.linesAfter,c.length).toString().length,v=a.maxLength-(a.indent+g+3);for(m=1;m<=a.linesBefore&&!(u-m<0);m++)p=ic(r.buffer,o[u-m],c[u-m],r.position-(o[u]-o[u-m]),v),d=ot.repeat(" ",a.indent)+lc((r.line-m+1).toString(),g)+" | "+p.str+` +`+d;for(p=ic(r.buffer,o[u],c[u],r.position,v),d+=ot.repeat(" ",a.indent)+lc((r.line+1).toString(),g)+" | "+p.str+` `,d+=ot.repeat("-",a.indent+g+3+p.pos)+`^ -`,m=1;m<=a.linesAfter&&!(l+m>=c.length);m++)p=nc(r.buffer,f[l+m],c[l+m],r.position-(f[l]-f[l+m]),v),d+=ot.repeat(" ",a.indent)+ac((r.line+m+1).toString(),g)+" | "+p.str+` -`;return d.replace(/\n$/,"")}var N2=D2,M2=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],j2=["scalar","sequence","mapping"];function C2(r){var a={};return r!==null&&Object.keys(r).forEach(function(s){r[s].forEach(function(f){a[String(f)]=s})}),a}function L2(r,a){if(a=a||{},Object.keys(a).forEach(function(s){if(M2.indexOf(s)===-1)throw new Rt('Unknown option "'+s+'" is met in definition of "'+r+'" YAML type.')}),this.options=a,this.tag=r,this.kind=a.kind||null,this.resolve=a.resolve||function(){return!0},this.construct=a.construct||function(s){return s},this.instanceOf=a.instanceOf||null,this.predicate=a.predicate||null,this.represent=a.represent||null,this.representName=a.representName||null,this.defaultStyle=a.defaultStyle||null,this.multi=a.multi||!1,this.styleAliases=C2(a.styleAliases||null),j2.indexOf(this.kind)===-1)throw new Rt('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}var vt=L2;function Ly(r,a){var s=[];return r[a].forEach(function(f){var c=s.length;s.forEach(function(u,l){u.tag===f.tag&&u.kind===f.kind&&u.multi===f.multi&&(c=l)}),s[c]=f}),s}function z2(){var r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},a,s;function f(c){c.multi?(r.multi[c.kind].push(c),r.multi.fallback.push(c)):r[c.kind][c.tag]=r.fallback[c.tag]=c}for(a=0,s=arguments.length;a=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0o"+r.toString(8):"-0o"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),Q2=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function K2(r){return!(r===null||!Q2.test(r)||r[r.length-1]==="_")}function F2(r){var a,s;return a=r.replace(/_/g,"").toLowerCase(),s=a[0]==="-"?-1:1,"+-".indexOf(a[0])>=0&&(a=a.slice(1)),a===".inf"?s===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:a===".nan"?NaN:s*parseFloat(a,10)}var P2=/^[-+]?[0-9]+e/;function J2(r,a){var s;if(isNaN(r))switch(a){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(a){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(a){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ot.isNegativeZero(r))return"-0.0";return s=r.toString(10),P2.test(s)?s.replace("e",".e"):s}function W2(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||ot.isNegativeZero(r))}var qg=new vt("tag:yaml.org,2002:float",{kind:"scalar",resolve:K2,construct:F2,predicate:W2,represent:J2,defaultStyle:"lowercase"}),Hg=Lg.extend({implicit:[zg,Ug,Bg,qg]}),$g=Hg,kg=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Yg=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function eE(r){return r===null?!1:kg.exec(r)!==null||Yg.exec(r)!==null}function tE(r){var a,s,f,c,u,l,d,m=0,p=null,g,v,T;if(a=kg.exec(r),a===null&&(a=Yg.exec(r)),a===null)throw new Error("Date resolve error");if(s=+a[1],f=+a[2]-1,c=+a[3],!a[4])return new Date(Date.UTC(s,f,c));if(u=+a[4],l=+a[5],d=+a[6],a[7]){for(m=a[7].slice(0,3);m.length<3;)m+="0";m=+m}return a[9]&&(g=+a[10],v=+(a[11]||0),p=(g*60+v)*6e4,a[9]==="-"&&(p=-p)),T=new Date(Date.UTC(s,f,c,u,l,d,m)),p&&T.setTime(T.getTime()-p),T}function rE(r){return r.toISOString()}var Gg=new vt("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:eE,construct:tE,instanceOf:Date,represent:rE});function nE(r){return r==="<<"||r===null}var Vg=new vt("tag:yaml.org,2002:merge",{kind:"scalar",resolve:nE}),zc=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function aE(r){if(r===null)return!1;var a,s,f=0,c=r.length,u=zc;for(s=0;s64)){if(a<0)return!1;f+=6}return f%8===0}function iE(r){var a,s,f=r.replace(/[\r\n=]/g,""),c=f.length,u=zc,l=0,d=[];for(a=0;a>16&255),d.push(l>>8&255),d.push(l&255)),l=l<<6|u.indexOf(f.charAt(a));return s=c%4*6,s===0?(d.push(l>>16&255),d.push(l>>8&255),d.push(l&255)):s===18?(d.push(l>>10&255),d.push(l>>2&255)):s===12&&d.push(l>>4&255),new Uint8Array(d)}function lE(r){var a="",s=0,f,c,u=r.length,l=zc;for(f=0;f>18&63],a+=l[s>>12&63],a+=l[s>>6&63],a+=l[s&63]),s=(s<<8)+r[f];return c=u%3,c===0?(a+=l[s>>18&63],a+=l[s>>12&63],a+=l[s>>6&63],a+=l[s&63]):c===2?(a+=l[s>>10&63],a+=l[s>>4&63],a+=l[s<<2&63],a+=l[64]):c===1&&(a+=l[s>>2&63],a+=l[s<<4&63],a+=l[64],a+=l[64]),a}function uE(r){return Object.prototype.toString.call(r)==="[object Uint8Array]"}var Ig=new vt("tag:yaml.org,2002:binary",{kind:"scalar",resolve:aE,construct:iE,predicate:uE,represent:lE}),sE=Object.prototype.hasOwnProperty,fE=Object.prototype.toString;function oE(r){if(r===null)return!0;var a=[],s,f,c,u,l,d=r;for(s=0,f=d.length;s>10)+55296,(r-65536&1023)+56320)}function Wg(r,a,s){a==="__proto__"?Object.defineProperty(r,a,{configurable:!0,enumerable:!0,writable:!0,value:s}):r[a]=s}var e0=new Array(256),t0=new Array(256);for(var Ca=0;Ca<256;Ca++)e0[Ca]=By(Ca)?1:0,t0[Ca]=By(Ca);function TE(r,a){this.input=r,this.filename=a.filename||null,this.schema=a.schema||Uc,this.onWarning=a.onWarning||null,this.legacy=a.legacy||!1,this.json=a.json||!1,this.listener=a.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function r0(r,a){var s={name:r.filename,buffer:r.input.slice(0,-1),position:r.position,line:r.line,column:r.position-r.lineStart};return s.snippet=N2(s),new Rt(a,s)}function be(r,a){throw r0(r,a)}function qu(r,a){r.onWarning&&r.onWarning.call(null,r0(r,a))}var qy={YAML:function(a,s,f){var c,u,l;a.version!==null&&be(a,"duplication of %YAML directive"),f.length!==1&&be(a,"YAML directive accepts exactly one argument"),c=/^([0-9]+)\.([0-9]+)$/.exec(f[0]),c===null&&be(a,"ill-formed argument of the YAML directive"),u=parseInt(c[1],10),l=parseInt(c[2],10),u!==1&&be(a,"unacceptable YAML version of the document"),a.version=f[0],a.checkLineBreaks=l<2,l!==1&&l!==2&&qu(a,"unsupported YAML version of the document")},TAG:function(a,s,f){var c,u;f.length!==2&&be(a,"TAG directive accepts exactly two arguments"),c=f[0],u=f[1],Pg.test(c)||be(a,"ill-formed tag handle (first argument) of the TAG directive"),Sn.call(a.tagMap,c)&&be(a,'there is a previously declared suffix for "'+c+'" tag handle'),Jg.test(u)||be(a,"ill-formed tag prefix (second argument) of the TAG directive");try{u=decodeURIComponent(u)}catch{be(a,"tag prefix is malformed: "+u)}a.tagMap[c]=u}};function _n(r,a,s,f){var c,u,l,d;if(a1&&(r.result+=ot.repeat(` -`,a-1))}function RE(r,a,s){var f,c,u,l,d,m,p,g,v=r.kind,T=r.result,j;if(j=r.input.charCodeAt(r.position),jt(j)||Ba(j)||j===35||j===38||j===42||j===33||j===124||j===62||j===39||j===34||j===37||j===64||j===96||(j===63||j===45)&&(c=r.input.charCodeAt(r.position+1),jt(c)||s&&Ba(c)))return!1;for(r.kind="scalar",r.result="",u=l=r.position,d=!1;j!==0;){if(j===58){if(c=r.input.charCodeAt(r.position+1),jt(c)||s&&Ba(c))break}else if(j===35){if(f=r.input.charCodeAt(r.position-1),jt(f))break}else{if(r.position===r.lineStart&&Zu(r)||s&&Ba(j))break;if(_r(j))if(m=r.line,p=r.lineStart,g=r.lineIndent,ut(r,!1,-1),r.lineIndent>=a){d=!0,j=r.input.charCodeAt(r.position);continue}else{r.position=l,r.line=m,r.lineStart=p,r.lineIndent=g;break}}d&&(_n(r,u,l,!1),qc(r,r.line-m),u=l=r.position,d=!1),Pn(j)||(l=r.position+1),j=r.input.charCodeAt(++r.position)}return _n(r,u,l,!1),r.result?!0:(r.kind=v,r.result=T,!1)}function xE(r,a){var s,f,c;if(s=r.input.charCodeAt(r.position),s!==39)return!1;for(r.kind="scalar",r.result="",r.position++,f=c=r.position;(s=r.input.charCodeAt(r.position))!==0;)if(s===39)if(_n(r,f,r.position,!0),s=r.input.charCodeAt(++r.position),s===39)f=r.position,r.position++,c=r.position;else return!0;else _r(s)?(_n(r,f,c,!0),qc(r,ut(r,!1,a)),f=c=r.position):r.position===r.lineStart&&Zu(r)?be(r,"unexpected end of the document within a single quoted scalar"):(r.position++,c=r.position);be(r,"unexpected end of the stream within a single quoted scalar")}function DE(r,a){var s,f,c,u,l,d;if(d=r.input.charCodeAt(r.position),d!==34)return!1;for(r.kind="scalar",r.result="",r.position++,s=f=r.position;(d=r.input.charCodeAt(r.position))!==0;){if(d===34)return _n(r,s,r.position,!0),r.position++,!0;if(d===92){if(_n(r,s,r.position,!0),d=r.input.charCodeAt(++r.position),_r(d))ut(r,!1,a);else if(d<256&&e0[d])r.result+=t0[d],r.position++;else if((l=wE(d))>0){for(c=l,u=0;c>0;c--)d=r.input.charCodeAt(++r.position),(l=_E(d))>=0?u=(u<<4)+l:be(r,"expected hexadecimal character");r.result+=SE(u),r.position++}else be(r,"unknown escape sequence");s=f=r.position}else _r(d)?(_n(r,s,f,!0),qc(r,ut(r,!1,a)),s=f=r.position):r.position===r.lineStart&&Zu(r)?be(r,"unexpected end of the document within a double quoted scalar"):(r.position++,f=r.position)}be(r,"unexpected end of the stream within a double quoted scalar")}function NE(r,a){var s=!0,f,c,u,l=r.tag,d,m=r.anchor,p,g,v,T,j,C=Object.create(null),N,D,X,k;if(k=r.input.charCodeAt(r.position),k===91)g=93,j=!1,d=[];else if(k===123)g=125,j=!0,d={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=d),k=r.input.charCodeAt(++r.position);k!==0;){if(ut(r,!0,a),k=r.input.charCodeAt(r.position),k===g)return r.position++,r.tag=l,r.anchor=m,r.kind=j?"mapping":"sequence",r.result=d,!0;s?k===44&&be(r,"expected the node content, but found ','"):be(r,"missed comma between flow collection entries"),D=N=X=null,v=T=!1,k===63&&(p=r.input.charCodeAt(r.position+1),jt(p)&&(v=T=!0,r.position++,ut(r,!0,a))),f=r.line,c=r.lineStart,u=r.position,Fa(r,a,Uu,!1,!0),D=r.tag,N=r.result,ut(r,!0,a),k=r.input.charCodeAt(r.position),(T||r.line===f)&&k===58&&(v=!0,k=r.input.charCodeAt(++r.position),ut(r,!0,a),Fa(r,a,Uu,!1,!0),X=r.result),j?qa(r,d,C,D,N,X,f,c,u):v?d.push(qa(r,null,C,D,N,X,f,c,u)):d.push(N),ut(r,!0,a),k=r.input.charCodeAt(r.position),k===44?(s=!0,k=r.input.charCodeAt(++r.position)):s=!1}be(r,"unexpected end of the stream within a flow collection")}function ME(r,a){var s,f,c=ic,u=!1,l=!1,d=a,m=0,p=!1,g,v;if(v=r.input.charCodeAt(r.position),v===124)f=!1;else if(v===62)f=!0;else return!1;for(r.kind="scalar",r.result="";v!==0;)if(v=r.input.charCodeAt(++r.position),v===43||v===45)ic===c?c=v===43?zy:vE:be(r,"repeat of a chomping mode identifier");else if((g=OE(v))>=0)g===0?be(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?be(r,"repeat of an indentation width identifier"):(d=a+g-1,l=!0);else break;if(Pn(v)){do v=r.input.charCodeAt(++r.position);while(Pn(v));if(v===35)do v=r.input.charCodeAt(++r.position);while(!_r(v)&&v!==0)}for(;v!==0;){for(Bc(r),r.lineIndent=0,v=r.input.charCodeAt(r.position);(!l||r.lineIndentd&&(d=r.lineIndent),_r(v)){m++;continue}if(r.lineIndent=c.length);m++)p=ic(r.buffer,o[u+m],c[u+m],r.position-(o[u]-o[u+m]),v),d+=ot.repeat(" ",a.indent)+lc((r.line+m+1).toString(),g)+" | "+p.str+` +`;return d.replace(/\n$/,"")}var N2=D2,M2=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],j2=["scalar","sequence","mapping"];function C2(r){var a={};return r!==null&&Object.keys(r).forEach(function(s){r[s].forEach(function(o){a[String(o)]=s})}),a}function L2(r,a){if(a=a||{},Object.keys(a).forEach(function(s){if(M2.indexOf(s)===-1)throw new Rt('Unknown option "'+s+'" is met in definition of "'+r+'" YAML type.')}),this.options=a,this.tag=r,this.kind=a.kind||null,this.resolve=a.resolve||function(){return!0},this.construct=a.construct||function(s){return s},this.instanceOf=a.instanceOf||null,this.predicate=a.predicate||null,this.represent=a.represent||null,this.representName=a.representName||null,this.defaultStyle=a.defaultStyle||null,this.multi=a.multi||!1,this.styleAliases=C2(a.styleAliases||null),j2.indexOf(this.kind)===-1)throw new Rt('Unknown kind "'+this.kind+'" is specified for "'+r+'" YAML type.')}var vt=L2;function zy(r,a){var s=[];return r[a].forEach(function(o){var c=s.length;s.forEach(function(l,u){l.tag===o.tag&&l.kind===o.kind&&l.multi===o.multi&&(c=u)}),s[c]=o}),s}function z2(){var r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},a,s;function o(c){c.multi?(r.multi[c.kind].push(c),r.multi.fallback.push(c)):r[c.kind][c.tag]=r.fallback[c.tag]=c}for(a=0,s=arguments.length;a=0?"0b"+r.toString(2):"-0b"+r.toString(2).slice(1)},octal:function(r){return r>=0?"0o"+r.toString(8):"-0o"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?"0x"+r.toString(16).toUpperCase():"-0x"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),Q2=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function K2(r){return!(r===null||!Q2.test(r)||r[r.length-1]==="_")}function F2(r){var a,s;return a=r.replace(/_/g,"").toLowerCase(),s=a[0]==="-"?-1:1,"+-".indexOf(a[0])>=0&&(a=a.slice(1)),a===".inf"?s===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:a===".nan"?NaN:s*parseFloat(a,10)}var P2=/^[-+]?[0-9]+e/;function J2(r,a){var s;if(isNaN(r))switch(a){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===r)switch(a){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===r)switch(a){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(ot.isNegativeZero(r))return"-0.0";return s=r.toString(10),P2.test(s)?s.replace("e",".e"):s}function W2(r){return Object.prototype.toString.call(r)==="[object Number]"&&(r%1!==0||ot.isNegativeZero(r))}var H0=new vt("tag:yaml.org,2002:float",{kind:"scalar",resolve:K2,construct:F2,predicate:W2,represent:J2,defaultStyle:"lowercase"}),$0=z0.extend({implicit:[U0,B0,q0,H0]}),k0=$0,Y0=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),G0=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function eE(r){return r===null?!1:Y0.exec(r)!==null||G0.exec(r)!==null}function tE(r){var a,s,o,c,l,u,d,m=0,p=null,g,v,R;if(a=Y0.exec(r),a===null&&(a=G0.exec(r)),a===null)throw new Error("Date resolve error");if(s=+a[1],o=+a[2]-1,c=+a[3],!a[4])return new Date(Date.UTC(s,o,c));if(l=+a[4],u=+a[5],d=+a[6],a[7]){for(m=a[7].slice(0,3);m.length<3;)m+="0";m=+m}return a[9]&&(g=+a[10],v=+(a[11]||0),p=(g*60+v)*6e4,a[9]==="-"&&(p=-p)),R=new Date(Date.UTC(s,o,c,l,u,d,m)),p&&R.setTime(R.getTime()-p),R}function rE(r){return r.toISOString()}var V0=new vt("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:eE,construct:tE,instanceOf:Date,represent:rE});function nE(r){return r==="<<"||r===null}var I0=new vt("tag:yaml.org,2002:merge",{kind:"scalar",resolve:nE}),Uc=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function aE(r){if(r===null)return!1;var a,s,o=0,c=r.length,l=Uc;for(s=0;s64)){if(a<0)return!1;o+=6}return o%8===0}function iE(r){var a,s,o=r.replace(/[\r\n=]/g,""),c=o.length,l=Uc,u=0,d=[];for(a=0;a>16&255),d.push(u>>8&255),d.push(u&255)),u=u<<6|l.indexOf(o.charAt(a));return s=c%4*6,s===0?(d.push(u>>16&255),d.push(u>>8&255),d.push(u&255)):s===18?(d.push(u>>10&255),d.push(u>>2&255)):s===12&&d.push(u>>4&255),new Uint8Array(d)}function lE(r){var a="",s=0,o,c,l=r.length,u=Uc;for(o=0;o>18&63],a+=u[s>>12&63],a+=u[s>>6&63],a+=u[s&63]),s=(s<<8)+r[o];return c=l%3,c===0?(a+=u[s>>18&63],a+=u[s>>12&63],a+=u[s>>6&63],a+=u[s&63]):c===2?(a+=u[s>>10&63],a+=u[s>>4&63],a+=u[s<<2&63],a+=u[64]):c===1&&(a+=u[s>>2&63],a+=u[s<<4&63],a+=u[64],a+=u[64]),a}function uE(r){return Object.prototype.toString.call(r)==="[object Uint8Array]"}var X0=new vt("tag:yaml.org,2002:binary",{kind:"scalar",resolve:aE,construct:iE,predicate:uE,represent:lE}),sE=Object.prototype.hasOwnProperty,oE=Object.prototype.toString;function fE(r){if(r===null)return!0;var a=[],s,o,c,l,u,d=r;for(s=0,o=d.length;s>10)+55296,(r-65536&1023)+56320)}function eg(r,a,s){a==="__proto__"?Object.defineProperty(r,a,{configurable:!0,enumerable:!0,writable:!0,value:s}):r[a]=s}var tg=new Array(256),rg=new Array(256);for(var ja=0;ja<256;ja++)tg[ja]=qy(ja)?1:0,rg[ja]=qy(ja);function TE(r,a){this.input=r,this.filename=a.filename||null,this.schema=a.schema||Bc,this.onWarning=a.onWarning||null,this.legacy=a.legacy||!1,this.json=a.json||!1,this.listener=a.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ng(r,a){var s={name:r.filename,buffer:r.input.slice(0,-1),position:r.position,line:r.line,column:r.position-r.lineStart};return s.snippet=N2(s),new Rt(a,s)}function be(r,a){throw ng(r,a)}function $u(r,a){r.onWarning&&r.onWarning.call(null,ng(r,a))}var Hy={YAML:function(a,s,o){var c,l,u;a.version!==null&&be(a,"duplication of %YAML directive"),o.length!==1&&be(a,"YAML directive accepts exactly one argument"),c=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),c===null&&be(a,"ill-formed argument of the YAML directive"),l=parseInt(c[1],10),u=parseInt(c[2],10),l!==1&&be(a,"unacceptable YAML version of the document"),a.version=o[0],a.checkLineBreaks=u<2,u!==1&&u!==2&&$u(a,"unsupported YAML version of the document")},TAG:function(a,s,o){var c,l;o.length!==2&&be(a,"TAG directive accepts exactly two arguments"),c=o[0],l=o[1],J0.test(c)||be(a,"ill-formed tag handle (first argument) of the TAG directive"),Sn.call(a.tagMap,c)&&be(a,'there is a previously declared suffix for "'+c+'" tag handle'),W0.test(l)||be(a,"ill-formed tag prefix (second argument) of the TAG directive");try{l=decodeURIComponent(l)}catch{be(a,"tag prefix is malformed: "+l)}a.tagMap[c]=l}};function An(r,a,s,o){var c,l,u,d;if(a1&&(r.result+=ot.repeat(` +`,a-1))}function RE(r,a,s){var o,c,l,u,d,m,p,g,v=r.kind,R=r.result,C;if(C=r.input.charCodeAt(r.position),jt(C)||Ua(C)||C===35||C===38||C===42||C===33||C===124||C===62||C===39||C===34||C===37||C===64||C===96||(C===63||C===45)&&(c=r.input.charCodeAt(r.position+1),jt(c)||s&&Ua(c)))return!1;for(r.kind="scalar",r.result="",l=u=r.position,d=!1;C!==0;){if(C===58){if(c=r.input.charCodeAt(r.position+1),jt(c)||s&&Ua(c))break}else if(C===35){if(o=r.input.charCodeAt(r.position-1),jt(o))break}else{if(r.position===r.lineStart&&Ku(r)||s&&Ua(C))break;if(_r(C))if(m=r.line,p=r.lineStart,g=r.lineIndent,lt(r,!1,-1),r.lineIndent>=a){d=!0,C=r.input.charCodeAt(r.position);continue}else{r.position=u,r.line=m,r.lineStart=p,r.lineIndent=g;break}}d&&(An(r,l,u,!1),Hc(r,r.line-m),l=u=r.position,d=!1),Fn(C)||(u=r.position+1),C=r.input.charCodeAt(++r.position)}return An(r,l,u,!1),r.result?!0:(r.kind=v,r.result=R,!1)}function xE(r,a){var s,o,c;if(s=r.input.charCodeAt(r.position),s!==39)return!1;for(r.kind="scalar",r.result="",r.position++,o=c=r.position;(s=r.input.charCodeAt(r.position))!==0;)if(s===39)if(An(r,o,r.position,!0),s=r.input.charCodeAt(++r.position),s===39)o=r.position,r.position++,c=r.position;else return!0;else _r(s)?(An(r,o,c,!0),Hc(r,lt(r,!1,a)),o=c=r.position):r.position===r.lineStart&&Ku(r)?be(r,"unexpected end of the document within a single quoted scalar"):(r.position++,c=r.position);be(r,"unexpected end of the stream within a single quoted scalar")}function DE(r,a){var s,o,c,l,u,d;if(d=r.input.charCodeAt(r.position),d!==34)return!1;for(r.kind="scalar",r.result="",r.position++,s=o=r.position;(d=r.input.charCodeAt(r.position))!==0;){if(d===34)return An(r,s,r.position,!0),r.position++,!0;if(d===92){if(An(r,s,r.position,!0),d=r.input.charCodeAt(++r.position),_r(d))lt(r,!1,a);else if(d<256&&tg[d])r.result+=rg[d],r.position++;else if((u=wE(d))>0){for(c=u,l=0;c>0;c--)d=r.input.charCodeAt(++r.position),(u=_E(d))>=0?l=(l<<4)+u:be(r,"expected hexadecimal character");r.result+=OE(l),r.position++}else be(r,"unknown escape sequence");s=o=r.position}else _r(d)?(An(r,s,o,!0),Hc(r,lt(r,!1,a)),s=o=r.position):r.position===r.lineStart&&Ku(r)?be(r,"unexpected end of the document within a double quoted scalar"):(r.position++,o=r.position)}be(r,"unexpected end of the stream within a double quoted scalar")}function NE(r,a){var s=!0,o,c,l,u=r.tag,d,m=r.anchor,p,g,v,R,C,L=Object.create(null),j,N,V,H;if(H=r.input.charCodeAt(r.position),H===91)g=93,C=!1,d=[];else if(H===123)g=125,C=!0,d={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=d),H=r.input.charCodeAt(++r.position);H!==0;){if(lt(r,!0,a),H=r.input.charCodeAt(r.position),H===g)return r.position++,r.tag=u,r.anchor=m,r.kind=C?"mapping":"sequence",r.result=d,!0;s?H===44&&be(r,"expected the node content, but found ','"):be(r,"missed comma between flow collection entries"),N=j=V=null,v=R=!1,H===63&&(p=r.input.charCodeAt(r.position+1),jt(p)&&(v=R=!0,r.position++,lt(r,!0,a))),o=r.line,c=r.lineStart,l=r.position,Pa(r,a,qu,!1,!0),N=r.tag,j=r.result,lt(r,!0,a),H=r.input.charCodeAt(r.position),(R||r.line===o)&&H===58&&(v=!0,H=r.input.charCodeAt(++r.position),lt(r,!0,a),Pa(r,a,qu,!1,!0),V=r.result),C?Ba(r,d,L,N,j,V,o,c,l):v?d.push(Ba(r,null,L,N,j,V,o,c,l)):d.push(j),lt(r,!0,a),H=r.input.charCodeAt(r.position),H===44?(s=!0,H=r.input.charCodeAt(++r.position)):s=!1}be(r,"unexpected end of the stream within a flow collection")}function ME(r,a){var s,o,c=uc,l=!1,u=!1,d=a,m=0,p=!1,g,v;if(v=r.input.charCodeAt(r.position),v===124)o=!1;else if(v===62)o=!0;else return!1;for(r.kind="scalar",r.result="";v!==0;)if(v=r.input.charCodeAt(++r.position),v===43||v===45)uc===c?c=v===43?Uy:vE:be(r,"repeat of a chomping mode identifier");else if((g=SE(v))>=0)g===0?be(r,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?be(r,"repeat of an indentation width identifier"):(d=a+g-1,u=!0);else break;if(Fn(v)){do v=r.input.charCodeAt(++r.position);while(Fn(v));if(v===35)do v=r.input.charCodeAt(++r.position);while(!_r(v)&&v!==0)}for(;v!==0;){for(qc(r),r.lineIndent=0,v=r.input.charCodeAt(r.position);(!u||r.lineIndentd&&(d=r.lineIndent),_r(v)){m++;continue}if(r.lineIndenta)&&m!==0)be(r,"bad indentation of a sequence entry");else if(r.lineIndenta)&&(D&&(l=r.line,d=r.lineStart,m=r.position),Fa(r,a,Bu,!0,c)&&(D?C=r.result:N=r.result),D||(qa(r,v,T,j,C,N,l,d,m),j=C=N=null),ut(r,!0,-1),k=r.input.charCodeAt(r.position)),(r.line===u||r.lineIndent>a)&&k!==0)be(r,"bad indentation of a mapping entry");else if(r.lineIndenta?m=1:r.lineIndent===a?m=0:r.lineIndenta?m=1:r.lineIndent===a?m=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),v=0,T=r.implicitTypes.length;v"),r.result!==null&&C.kind!==r.kind&&be(r,"unacceptable node kind for !<"+r.tag+'> tag; it should be "'+C.kind+'", not "'+r.kind+'"'),C.resolve(r.result,r.tag)?(r.result=C.construct(r.result,r.tag),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):be(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")}return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||g}function UE(r){var a=r.position,s,f,c,u=!1,l;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap=Object.create(null),r.anchorMap=Object.create(null);(l=r.input.charCodeAt(r.position))!==0&&(ut(r,!0,-1),l=r.input.charCodeAt(r.position),!(r.lineIndent>0||l!==37));){for(u=!0,l=r.input.charCodeAt(++r.position),s=r.position;l!==0&&!jt(l);)l=r.input.charCodeAt(++r.position);for(f=r.input.slice(s,r.position),c=[],f.length<1&&be(r,"directive name must not be less than one character in length");l!==0;){for(;Pn(l);)l=r.input.charCodeAt(++r.position);if(l===35){do l=r.input.charCodeAt(++r.position);while(l!==0&&!_r(l));break}if(_r(l))break;for(s=r.position;l!==0&&!jt(l);)l=r.input.charCodeAt(++r.position);c.push(r.input.slice(s,r.position))}l!==0&&Bc(r),Sn.call(qy,f)?qy[f](r,f,c):qu(r,'unknown document directive "'+f+'"')}if(ut(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,ut(r,!0,-1)):u&&be(r,"directives end mark is expected"),Fa(r,r.lineIndent-1,Bu,!1,!0),ut(r,!0,-1),r.checkLineBreaks&&EE.test(r.input.slice(a,r.position))&&qu(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&Zu(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,ut(r,!0,-1));return}if(r.position"u"&&(s=a,a=null);var f=n0(r,s);if(typeof a!="function")return f;for(var c=0,u=f.length;c=55296&&s<=56319&&a+1=56320&&f<=57343)?(s-55296)*1024+f-56320+65536:s}function h0(r){var a=/^\n* /;return a.test(r)}var d0=1,gc=2,p0=3,m0=4,za=5;function hA(r,a,s,f,c,u,l,d){var m,p=0,g=null,v=!1,T=!1,j=f!==-1,C=-1,N=oA(Ji(r,0))&&cA(Ji(r,r.length-1));if(a||l)for(m=0;m=65536?m+=2:m++){if(p=Ji(r,m),!sl(p))return za;N=N&&Gy(p,g,d),g=p}else{for(m=0;m=65536?m+=2:m++){if(p=Ji(r,m),p===ll)v=!0,j&&(T=T||m-C-1>f&&r[C+1]!==" ",C=m);else if(!sl(p))return za;N=N&&Gy(p,g,d),g=p}T=T||j&&m-C-1>f&&r[C+1]!==" "}return!v&&!T?N&&!l&&!c(r)?d0:u===ul?za:gc:s>9&&h0(r)?za:l?u===ul?za:gc:T?m0:p0}function dA(r,a,s,f,c){r.dump=(function(){if(a.length===0)return r.quotingType===ul?'""':"''";if(!r.noCompatMode&&(nA.indexOf(a)!==-1||aA.test(a)))return r.quotingType===ul?'"'+a+'"':"'"+a+"'";var u=r.indent*Math.max(1,s),l=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-u),d=f||r.flowLevel>-1&&s>=r.flowLevel;function m(p){return fA(r,p)}switch(hA(a,d,r.indent,l,m,r.quotingType,r.forceQuotes&&!f,c)){case d0:return a;case gc:return"'"+a.replace(/'/g,"''")+"'";case p0:return"|"+Vy(a,r.indent)+Iy(ky(a,u));case m0:return">"+Vy(a,r.indent)+Iy(ky(pA(a,l),u));case za:return'"'+mA(a)+'"';default:throw new Rt("impossible error: invalid scalar style")}})()}function Vy(r,a){var s=h0(r)?String(a):"",f=r[r.length-1]===` -`,c=f&&(r[r.length-2]===` +`,l?1+m:m),l=!0,u=!0,m=0,s=r.position;!_r(v)&&v!==0;)v=r.input.charCodeAt(++r.position);An(r,s,r.position,!1)}return!0}function ky(r,a){var s,o=r.tag,c=r.anchor,l=[],u,d=!1,m;if(r.firstTabInLine!==-1)return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=l),m=r.input.charCodeAt(r.position);m!==0&&(r.firstTabInLine!==-1&&(r.position=r.firstTabInLine,be(r,"tab characters must not be used in indentation")),!(m!==45||(u=r.input.charCodeAt(r.position+1),!jt(u))));){if(d=!0,r.position++,lt(r,!0,-1)&&r.lineIndent<=a){l.push(null),m=r.input.charCodeAt(r.position);continue}if(s=r.line,Pa(r,a,P0,!1,!0),l.push(r.result),lt(r,!0,-1),m=r.input.charCodeAt(r.position),(r.line===s||r.lineIndent>a)&&m!==0)be(r,"bad indentation of a sequence entry");else if(r.lineIndenta)&&(N&&(u=r.line,d=r.lineStart,m=r.position),Pa(r,a,Hu,!0,c)&&(N?L=r.result:j=r.result),N||(Ba(r,v,R,C,L,j,u,d,m),C=L=j=null),lt(r,!0,-1),H=r.input.charCodeAt(r.position)),(r.line===l||r.lineIndent>a)&&H!==0)be(r,"bad indentation of a mapping entry");else if(r.lineIndenta?m=1:r.lineIndent===a?m=0:r.lineIndenta?m=1:r.lineIndent===a?m=0:r.lineIndent tag; it should be "scalar", not "'+r.kind+'"'),v=0,R=r.implicitTypes.length;v"),r.result!==null&&L.kind!==r.kind&&be(r,"unacceptable node kind for !<"+r.tag+'> tag; it should be "'+L.kind+'", not "'+r.kind+'"'),L.resolve(r.result,r.tag)?(r.result=L.construct(r.result,r.tag),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):be(r,"cannot resolve a node with !<"+r.tag+"> explicit tag")}return r.listener!==null&&r.listener("close",r),r.tag!==null||r.anchor!==null||g}function UE(r){var a=r.position,s,o,c,l=!1,u;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap=Object.create(null),r.anchorMap=Object.create(null);(u=r.input.charCodeAt(r.position))!==0&&(lt(r,!0,-1),u=r.input.charCodeAt(r.position),!(r.lineIndent>0||u!==37));){for(l=!0,u=r.input.charCodeAt(++r.position),s=r.position;u!==0&&!jt(u);)u=r.input.charCodeAt(++r.position);for(o=r.input.slice(s,r.position),c=[],o.length<1&&be(r,"directive name must not be less than one character in length");u!==0;){for(;Fn(u);)u=r.input.charCodeAt(++r.position);if(u===35){do u=r.input.charCodeAt(++r.position);while(u!==0&&!_r(u));break}if(_r(u))break;for(s=r.position;u!==0&&!jt(u);)u=r.input.charCodeAt(++r.position);c.push(r.input.slice(s,r.position))}u!==0&&qc(r),Sn.call(Hy,o)?Hy[o](r,o,c):$u(r,'unknown document directive "'+o+'"')}if(lt(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,lt(r,!0,-1)):l&&be(r,"directives end mark is expected"),Pa(r,r.lineIndent-1,Hu,!1,!0),lt(r,!0,-1),r.checkLineBreaks&&EE.test(r.input.slice(a,r.position))&&$u(r,"non-ASCII line breaks are interpreted as content"),r.documents.push(r.result),r.position===r.lineStart&&Ku(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,lt(r,!0,-1));return}if(r.position"u"&&(s=a,a=null);var o=ag(r,s);if(typeof a!="function")return o;for(var c=0,l=o.length;c=55296&&s<=56319&&a+1=56320&&o<=57343)?(s-55296)*1024+o-56320+65536:s}function dg(r){var a=/^\n* /;return a.test(r)}var pg=1,vc=2,mg=3,yg=4,La=5;function hA(r,a,s,o,c,l,u,d){var m,p=0,g=null,v=!1,R=!1,C=o!==-1,L=-1,j=fA(Wi(r,0))&&cA(Wi(r,r.length-1));if(a||u)for(m=0;m=65536?m+=2:m++){if(p=Wi(r,m),!ol(p))return La;j=j&&Vy(p,g,d),g=p}else{for(m=0;m=65536?m+=2:m++){if(p=Wi(r,m),p===ul)v=!0,C&&(R=R||m-L-1>o&&r[L+1]!==" ",L=m);else if(!ol(p))return La;j=j&&Vy(p,g,d),g=p}R=R||C&&m-L-1>o&&r[L+1]!==" "}return!v&&!R?j&&!u&&!c(r)?pg:l===sl?La:vc:s>9&&dg(r)?La:u?l===sl?La:vc:R?yg:mg}function dA(r,a,s,o,c){r.dump=(function(){if(a.length===0)return r.quotingType===sl?'""':"''";if(!r.noCompatMode&&(nA.indexOf(a)!==-1||aA.test(a)))return r.quotingType===sl?'"'+a+'"':"'"+a+"'";var l=r.indent*Math.max(1,s),u=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-l),d=o||r.flowLevel>-1&&s>=r.flowLevel;function m(p){return oA(r,p)}switch(hA(a,d,r.indent,u,m,r.quotingType,r.forceQuotes&&!o,c)){case pg:return a;case vc:return"'"+a.replace(/'/g,"''")+"'";case mg:return"|"+Iy(a,r.indent)+Xy(Yy(a,l));case yg:return">"+Iy(a,r.indent)+Xy(Yy(pA(a,u),l));case La:return'"'+mA(a)+'"';default:throw new Rt("impossible error: invalid scalar style")}})()}function Iy(r,a){var s=dg(r)?String(a):"",o=r[r.length-1]===` +`,c=o&&(r[r.length-2]===` `||r===` -`),u=c?"+":f?"":"-";return s+u+` -`}function Iy(r){return r[r.length-1]===` -`?r.slice(0,-1):r}function pA(r,a){for(var s=/(\n+)([^\n]*)/g,f=(function(){var p=r.indexOf(` -`);return p=p!==-1?p:r.length,s.lastIndex=p,Xy(r.slice(0,p),a)})(),c=r[0]===` -`||r[0]===" ",u,l;l=s.exec(r);){var d=l[1],m=l[2];u=m[0]===" ",f+=d+(!c&&!u&&m!==""?` -`:"")+Xy(m,a),c=u}return f}function Xy(r,a){if(r===""||r[0]===" ")return r;for(var s=/ [^ ]/g,f,c=0,u,l=0,d=0,m="";f=s.exec(r);)d=f.index,d-c>a&&(u=l>c?l:d,m+=` -`+r.slice(c,u),c=u+1),l=d;return m+=` -`,r.length-c>a&&l>c?m+=r.slice(c,l)+` -`+r.slice(l+1):m+=r.slice(c),m.slice(1)}function mA(r){for(var a="",s=0,f,c=0;c=65536?c+=2:c++)s=Ji(r,c),f=_t[s],!f&&sl(s)?(a+=r[c],s>=65536&&(a+=r[c+1])):a+=f||lA(s);return a}function yA(r,a,s){var f="",c=r.tag,u,l,d;for(u=0,l=s.length;u"u"&&Vr(r,a,null,!1,!1))&&(f!==""&&(f+=","+(r.condenseFlow?"":" ")),f+=r.dump);r.tag=c,r.dump="["+f+"]"}function Zy(r,a,s,f){var c="",u=r.tag,l,d,m;for(l=0,d=s.length;l"u"&&Vr(r,a+1,null,!0,!0,!1,!0))&&((!f||c!=="")&&(c+=yc(r,a)),r.dump&&ll===r.dump.charCodeAt(0)?c+="-":c+="- ",c+=r.dump);r.tag=u,r.dump=c||"[]"}function gA(r,a,s){var f="",c=r.tag,u=Object.keys(s),l,d,m,p,g;for(l=0,d=u.length;l1024&&(g+="? "),g+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Vr(r,a,p,!1,!1)&&(g+=r.dump,f+=g));r.tag=c,r.dump="{"+f+"}"}function vA(r,a,s,f){var c="",u=r.tag,l=Object.keys(s),d,m,p,g,v,T;if(r.sortKeys===!0)l.sort();else if(typeof r.sortKeys=="function")l.sort(r.sortKeys);else if(r.sortKeys)throw new Rt("sortKeys must be a boolean or a function");for(d=0,m=l.length;d1024,v&&(r.dump&&ll===r.dump.charCodeAt(0)?T+="?":T+="? "),T+=r.dump,v&&(T+=yc(r,a)),Vr(r,a+1,g,!0,v)&&(r.dump&&ll===r.dump.charCodeAt(0)?T+=":":T+=": ",T+=r.dump,c+=T));r.tag=u,r.dump=c||"{}"}function Qy(r,a,s){var f,c,u,l,d,m;for(c=s?r.explicitTypes:r.implicitTypes,u=0,l=c.length;u tag resolver accepts not "'+m+'" style');r.dump=f}return!0}return!1}function Vr(r,a,s,f,c,u,l){r.tag=null,r.dump=s,Qy(r,s,!1)||Qy(r,s,!0);var d=i0.call(r.dump),m=f,p;f&&(f=r.flowLevel<0||r.flowLevel>a);var g=d==="[object Object]"||d==="[object Array]",v,T;if(g&&(v=r.duplicates.indexOf(s),T=v!==-1),(r.tag!==null&&r.tag!=="?"||T||r.indent!==2&&a>0)&&(c=!1),T&&r.usedDuplicates[v])r.dump="*ref_"+v;else{if(g&&T&&!r.usedDuplicates[v]&&(r.usedDuplicates[v]=!0),d==="[object Object]")f&&Object.keys(r.dump).length!==0?(vA(r,a,r.dump,c),T&&(r.dump="&ref_"+v+r.dump)):(gA(r,a,r.dump),T&&(r.dump="&ref_"+v+" "+r.dump));else if(d==="[object Array]")f&&r.dump.length!==0?(r.noArrayIndent&&!l&&a>0?Zy(r,a-1,r.dump,c):Zy(r,a,r.dump,c),T&&(r.dump="&ref_"+v+r.dump)):(yA(r,a,r.dump),T&&(r.dump="&ref_"+v+" "+r.dump));else if(d==="[object String]")r.tag!=="?"&&dA(r,r.dump,a,u,m);else{if(d==="[object Undefined]")return!1;if(r.skipInvalid)return!1;throw new Rt("unacceptable kind of an object to dump "+d)}r.tag!==null&&r.tag!=="?"&&(p=encodeURI(r.tag[0]==="!"?r.tag.slice(1):r.tag).replace(/!/g,"%21"),r.tag[0]==="!"?p="!"+p:p.slice(0,18)==="tag:yaml.org,2002:"?p="!!"+p.slice(18):p="!<"+p+">",r.dump=p+" "+r.dump)}return!0}function bA(r,a){var s=[],f=[],c,u;for(vc(r,s,f),c=0,u=f.length;c=":[{var:"age"},18]}}}}),flagKey:"feature-1",returnType:"boolean",context:Ot({age:20}),codeDefault:"false"},VA={description:["In this scenario, we have a feature flag with the key 'acceptable-feature-stability' with three variants: alpha, beta, and ga.","The flag has a targeting rule that enables the flag based on the customer ID.","The flag is enabled for customer-A in the alpha variant, for customer-B1 and customer-B2 in the beta variant, and for all other customers in the ga variant.","Experiment by changing the 'customerId' in the context."].join(" "),flagDefinition:wt({flags:{"acceptable-feature-stability":{state:"ENABLED",defaultVariant:"ga",variants:{alpha:"alpha",beta:"beta",ga:"ga"},targeting:{if:[{"===":[{var:"customerId"},"customer-A"]},"alpha",{in:[{var:"customerId"},["customer-B1","customer-B2"]]},"beta","ga"]}}}}),flagKey:"acceptable-feature-stability",returnType:"string",context:Ot({targetingKey:"sessionId-123",customerId:"customer-A"}),codeDefault:'""'},IA={description:['In this scenario, we have a feature flag with the key "enable-mainframe-access" that is enabled and has two variants: on and off.','This flag has a targeting rule defined that enables the flag for users with an email address that ends with "@ingen.com".',"Experiment with changing the email address in the context or in the targeting rule."].join(" "),flagDefinition:wt({flags:{"enable-mainframe-access":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{ends_with:[{var:"email"},"@ingen.com"]},"on"]}}}}),flagKey:"enable-mainframe-access",returnType:"boolean",context:Ot({email:"john.arnold@ingen.com"}),codeDefault:"false"},XA={description:['In this scenario, we have a feature flag with the key "supports-one-hour-delivery" that is enabled and has two variants: on and off.','This flag has a targeting rule defined that enables the flag for users with a locale of "us" or "ca".',"Experiment with changing the locale in the context or in the locale list in the targeting rule."].join(" "),flagDefinition:wt({flags:{"supports-one-hour-delivery":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{in:[{var:"locale"},["us","ca"]]},"on"]}}}}),context:Ot({locale:"us"}),flagKey:"supports-one-hour-delivery",returnType:"boolean",codeDefault:"false"},ZA={description:['In this scenario, we have a feature flag with the key "enable-announcement-banner" that is enabled and has two variants: on and off.',"This flag has a targeting rule defined that enables the flag after a specified time.",'The current time (epoch) can be accessed using "$flagd.timestamp" which is automatically provided by flagd.','Five seconds after loading this scenario, the response will change to "on".'].join(" "),flagDefinition:()=>wt({flags:{"enable-announcement-banner":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{">":[{var:"$flagd.timestamp"},Math.floor(Date.now()/1e3)+5]},"on"]}}}}),flagKey:"enable-announcement-banner",returnType:"boolean",context:()=>Ot({}),codeDefault:"false"},QA={description:['In this scenario, we have a feature flag with the key "enable-performance-mode" that is enabled and has two variants: on and off.','This rule looks for the evaluation context "version". If the version is greater or equal to "1.7.0" the feature is enabled.','Otherwise, the "defaultVariant" is return. Experiment by changing the version in the context.'].join(" "),flagDefinition:wt({flags:{"enable-performance-mode":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{sem_ver:[{var:"version"},">=","1.7.0"]},"on"]}}}}),flagKey:"enable-performance-mode",returnType:"boolean",context:Ot({version:"1.6.0"}),codeDefault:"false"},KA={description:['In this scenario, we have a feature flag with the key "color-palette-experiment" that is enabled and has four variants: red, blue, green, and grey.','The targeting rule uses the "fractional" operator, which deterministically splits the traffic based on the configuration.','This configuration splits the traffic evenly between the four variants by bucketing evaluations pseudorandomly using the "targetingKey" and feature flag key.','Experiment by changing the "targetingKey" to another value.'].join(" "),flagDefinition:wt({flags:{"color-palette-experiment":{state:"ENABLED",defaultVariant:"grey",variants:{red:"#b91c1c",blue:"#0284c7",green:"#16a34a",grey:"#4b5563"},targeting:{fractional:[["red",25],["blue",25],["green",25],["grey",25]]}}}}),flagKey:"color-palette-experiment",returnType:"string",context:Ot({targetingKey:"sessionId-123"}),codeDefault:'"grey"'},FA={description:['In this scenario, we have a feature flag with the key "enable-new-llm-model" with multiple variant for illustrative purposes.',"This flag has a targeting rule defined that enables the flag for a percentage of users based on the release phase.",'The "targetingKey" ensures that the user always sees the same results during a each phase of the rollout process.'].join(" "),flagDefinition:()=>{const r=Math.floor(Date.now()/1e3)+5,a=Math.floor(Date.now()/1e3)+10,s=Math.floor(Date.now()/1e3)+15,f=Math.floor(Date.now()/1e3)+20;return wt({flags:{"enable-new-llm-model":{state:"ENABLED",defaultVariant:"disabled",variants:{disabled:!1,phase1Enabled:!0,phase1Disabled:!1,phase2Enabled:!0,phase2Disabled:!1,phase3Enabled:!0,phase3Disabled:!1,enabled:!0},targeting:{if:[{">=":[r,{var:"$flagd.timestamp"}]},"disabled",{"<=":[r,{var:"$flagd.timestamp"},a]},{fractional:[["phase1Enabled",10],["phase1Disabled",90]]},{"<=":[a,{var:"$flagd.timestamp"},s]},{fractional:[["phase2Enabled",25],["phase2Disabled",75]]},{"<=":[s,{var:"$flagd.timestamp"},f]},{fractional:[["phase3Enabled",50],["phase3Disabled",50]]},"enabled"]}}}})},flagKey:"enable-new-llm-model",returnType:"boolean",context:()=>Ot({targetingKey:"sessionId-12345"}),codeDefault:"false"},PA={description:["In this scenario, we have two feature flags that share targeting rule logic.","This is accomplished by defining a $evaluators object in the feature flag definition and referencing it by name in a targeting rule.","Experiment with changing the email domain in the shared evaluator."].join(" "),flagDefinition:wt({flags:{"feature-1":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}},"feature-2":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}}},$evaluators:{emailWithFaas:{ends_with:[{var:"email"},"@faas.com"]}}}),flagKey:"feature-1",returnType:"boolean",context:Ot({email:"example@faas.com"}),codeDefault:"false"},JA={description:["In this scenario, we have a feature flag that is evaluated based on its targeting key.","The targeting key is contain a string uniquely identifying the subject of the flag evaluation, such as a user's email, or a session identifier.",`In this case, null is returned from targeting if the targeting key doesn't match; this results in a reason of "DEFAULT", since no variant was matched by the targeting rule.`].join(" "),flagDefinition:wt({flags:{"targeting-key-flag":{state:"ENABLED",variants:{miss:"miss",hit:"hit"},defaultVariant:"miss",targeting:{if:[{"==":[{var:"targetingKey"},"5c3d8535-f81a-4478-a6d3-afaa4d51199e"]},"hit",null]}}}}),flagKey:"targeting-key-flag",returnType:"string",context:Ot({targetingKey:"5c3d8535-f81a-4478-a6d3-afaa4d51199e"}),codeDefault:'"miss"'},WA={description:["In this scenario, we have a feature flag with metadata about the flag.","There is top-level metadata for the flag set and metadata specific to the flag.","These values are merged together, with the flag metadata taking precedence."].join(" "),flagDefinition:wt({flags:{"flag-with-metadata":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:"on",metadata:{version:"1"}}},metadata:{flagSetId:"playground/dev"}}),flagKey:"flag-with-metadata",returnType:"boolean",context:Ot({}),codeDefault:"false"},e_={description:["This scenario demonstrates code defaults in flagd. When defaultVariant is omitted or set to null, flagd falls back to the code-defined default value.","In this example, the flag has two variants (on and off) with defaultVariant set to null.","When evaluated, flagd returns reason=DEFAULT and omits the value and variant fields, allowing the client to use its own code default.","Note: Omitting defaultVariant entirely has the same effect as setting it to null - both trigger code default behavior.","Compare this with the basic boolean flag which has an explicit defaultVariant set to false."].join(" "),flagDefinition:wt({flags:{"code-default-flag":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:null}}}),flagKey:"code-default-flag",returnType:"boolean",context:Ot({}),codeDefault:"true"},rr={"Basic boolean flag":HA,"Basic numeric flag":$A,"Basic string flag":YA,"Basic object flag":kA,"Enable for a specific email domain":IA,"Enable based on users locale":XA,"Enable based on release version":QA,"Enable based on the current time":ZA,"Chainable if/else/then":VA,"Multi-variant experiment":KA,"Progressive rollout":FA,"Shared evaluators":PA,"Boolean variant shorthand":GA,"Targeting key":JA,"Flag metadata":WA,"Code default":e_};function t_(r,a,s){return a in r?Object.defineProperty(r,a,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[a]=s,r}function Py(r,a){var s=Object.keys(r);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(r);a&&(f=f.filter(function(c){return Object.getOwnPropertyDescriptor(r,c).enumerable})),s.push.apply(s,f)}return s}function Jy(r){for(var a=1;a=0)&&(s[c]=r[c]);return s}function n_(r,a){if(r==null)return{};var s=r_(r,a),f,c;if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(r);for(c=0;c=0)&&Object.prototype.propertyIsEnumerable.call(r,f)&&(s[f]=r[f])}return s}function a_(r,a){return i_(r)||l_(r,a)||u_(r,a)||s_()}function i_(r){if(Array.isArray(r))return r}function l_(r,a){if(!(typeof Symbol>"u"||!(Symbol.iterator in Object(r)))){var s=[],f=!0,c=!1,u=void 0;try{for(var l=r[Symbol.iterator](),d;!(f=(d=l.next()).done)&&(s.push(d.value),!(a&&s.length===a));f=!0);}catch(m){c=!0,u=m}finally{try{!f&&l.return!=null&&l.return()}finally{if(c)throw u}}return s}}function u_(r,a){if(r){if(typeof r=="string")return Wy(r,a);var s=Object.prototype.toString.call(r).slice(8,-1);if(s==="Object"&&r.constructor&&(s=r.constructor.name),s==="Map"||s==="Set")return Array.from(r);if(s==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s))return Wy(r,a)}}function Wy(r,a){(a==null||a>r.length)&&(a=r.length);for(var s=0,f=new Array(a);s=r.length?r.apply(this,c):function(){for(var l=arguments.length,d=new Array(l),m=0;m1&&arguments[1]!==void 0?arguments[1]:{};Tu.initial(r),Tu.handler(a);var s={current:r},f=Wi(__)(s,a),c=Wi(A_)(s),u=Wi(Tu.changes)(r),l=Wi(E_)(s);function d(){var p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(g){return g};return Tu.selector(p),p(s.current)}function m(p){o_(f,c,u,l)(p)}return[d,m]}function E_(r,a){return fl(a)?a(r.current):a}function A_(r,a){return r.current=tg(tg({},r.current),a),a}function __(r,a,s){return fl(a)?a(r.current):Object.keys(s).forEach(function(f){var c;return(c=a[f])===null||c===void 0?void 0:c.call(a,r.current[f])}),s}var w_={create:b_},O_={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.43.0/min/vs"}};function S_(r){return function a(){for(var s=this,f=arguments.length,c=new Array(f),u=0;u=r.length?r.apply(this,c):function(){for(var l=arguments.length,d=new Array(l),m=0;ma&&(l=u>c?u:d,m+=` +`+r.slice(c,l),c=l+1),u=d;return m+=` +`,r.length-c>a&&u>c?m+=r.slice(c,u)+` +`+r.slice(u+1):m+=r.slice(c),m.slice(1)}function mA(r){for(var a="",s=0,o,c=0;c=65536?c+=2:c++)s=Wi(r,c),o=St[s],!o&&ol(s)?(a+=r[c],s>=65536&&(a+=r[c+1])):a+=o||lA(s);return a}function yA(r,a,s){var o="",c=r.tag,l,u,d;for(l=0,u=s.length;l"u"&&Gr(r,a,null,!1,!1))&&(o!==""&&(o+=","+(r.condenseFlow?"":" ")),o+=r.dump);r.tag=c,r.dump="["+o+"]"}function Qy(r,a,s,o){var c="",l=r.tag,u,d,m;for(u=0,d=s.length;u"u"&&Gr(r,a+1,null,!0,!0,!1,!0))&&((!o||c!=="")&&(c+=gc(r,a)),r.dump&&ul===r.dump.charCodeAt(0)?c+="-":c+="- ",c+=r.dump);r.tag=l,r.dump=c||"[]"}function gA(r,a,s){var o="",c=r.tag,l=Object.keys(s),u,d,m,p,g;for(u=0,d=l.length;u1024&&(g+="? "),g+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),Gr(r,a,p,!1,!1)&&(g+=r.dump,o+=g));r.tag=c,r.dump="{"+o+"}"}function vA(r,a,s,o){var c="",l=r.tag,u=Object.keys(s),d,m,p,g,v,R;if(r.sortKeys===!0)u.sort();else if(typeof r.sortKeys=="function")u.sort(r.sortKeys);else if(r.sortKeys)throw new Rt("sortKeys must be a boolean or a function");for(d=0,m=u.length;d1024,v&&(r.dump&&ul===r.dump.charCodeAt(0)?R+="?":R+="? "),R+=r.dump,v&&(R+=gc(r,a)),Gr(r,a+1,g,!0,v)&&(r.dump&&ul===r.dump.charCodeAt(0)?R+=":":R+=": ",R+=r.dump,c+=R));r.tag=l,r.dump=c||"{}"}function Ky(r,a,s){var o,c,l,u,d,m;for(c=s?r.explicitTypes:r.implicitTypes,l=0,u=c.length;l tag resolver accepts not "'+m+'" style');r.dump=o}return!0}return!1}function Gr(r,a,s,o,c,l,u){r.tag=null,r.dump=s,Ky(r,s,!1)||Ky(r,s,!0);var d=lg.call(r.dump),m=o,p;o&&(o=r.flowLevel<0||r.flowLevel>a);var g=d==="[object Object]"||d==="[object Array]",v,R;if(g&&(v=r.duplicates.indexOf(s),R=v!==-1),(r.tag!==null&&r.tag!=="?"||R||r.indent!==2&&a>0)&&(c=!1),R&&r.usedDuplicates[v])r.dump="*ref_"+v;else{if(g&&R&&!r.usedDuplicates[v]&&(r.usedDuplicates[v]=!0),d==="[object Object]")o&&Object.keys(r.dump).length!==0?(vA(r,a,r.dump,c),R&&(r.dump="&ref_"+v+r.dump)):(gA(r,a,r.dump),R&&(r.dump="&ref_"+v+" "+r.dump));else if(d==="[object Array]")o&&r.dump.length!==0?(r.noArrayIndent&&!u&&a>0?Qy(r,a-1,r.dump,c):Qy(r,a,r.dump,c),R&&(r.dump="&ref_"+v+r.dump)):(yA(r,a,r.dump),R&&(r.dump="&ref_"+v+" "+r.dump));else if(d==="[object String]")r.tag!=="?"&&dA(r,r.dump,a,l,m);else{if(d==="[object Undefined]")return!1;if(r.skipInvalid)return!1;throw new Rt("unacceptable kind of an object to dump "+d)}r.tag!==null&&r.tag!=="?"&&(p=encodeURI(r.tag[0]==="!"?r.tag.slice(1):r.tag).replace(/!/g,"%21"),r.tag[0]==="!"?p="!"+p:p.slice(0,18)==="tag:yaml.org,2002:"?p="!!"+p.slice(18):p="!<"+p+">",r.dump=p+" "+r.dump)}return!0}function bA(r,a){var s=[],o=[],c,l;for(bc(r,s,o),c=0,l=o.length;c=":[{var:"age"},18]}}}}),flagKey:"feature-1",returnType:"boolean",context:Et({age:20}),codeDefault:"false"},VA={description:["In this scenario, we have a feature flag with the key 'acceptable-feature-stability' with three variants: alpha, beta, and ga.","The flag has a targeting rule that enables the flag based on the customer ID.","The flag is enabled for customer-A in the alpha variant, for customer-B1 and customer-B2 in the beta variant, and for all other customers in the ga variant.","Experiment by changing the 'customerId' in the context."].join(" "),flagDefinition:bt({flags:{"acceptable-feature-stability":{state:"ENABLED",defaultVariant:"ga",variants:{alpha:"alpha",beta:"beta",ga:"ga"},targeting:{if:[{"===":[{var:"customerId"},"customer-A"]},"alpha",{in:[{var:"customerId"},["customer-B1","customer-B2"]]},"beta","ga"]}}}}),flagKey:"acceptable-feature-stability",returnType:"string",context:Et({targetingKey:"sessionId-123",customerId:"customer-A"}),codeDefault:'""'},IA={description:['In this scenario, we have a feature flag with the key "enable-mainframe-access" that is enabled and has two variants: on and off.','This flag has a targeting rule defined that enables the flag for users with an email address that ends with "@ingen.com".',"Experiment with changing the email address in the context or in the targeting rule."].join(" "),flagDefinition:bt({flags:{"enable-mainframe-access":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{ends_with:[{var:"email"},"@ingen.com"]},"on"]}}}}),flagKey:"enable-mainframe-access",returnType:"boolean",context:Et({email:"john.arnold@ingen.com"}),codeDefault:"false"},XA={description:['In this scenario, we have a feature flag with the key "supports-one-hour-delivery" that is enabled and has two variants: on and off.','This flag has a targeting rule defined that enables the flag for users with a locale of "us" or "ca".',"Experiment with changing the locale in the context or in the locale list in the targeting rule."].join(" "),flagDefinition:bt({flags:{"supports-one-hour-delivery":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{in:[{var:"locale"},["us","ca"]]},"on"]}}}}),context:Et({locale:"us"}),flagKey:"supports-one-hour-delivery",returnType:"boolean",codeDefault:"false"},ZA={description:['In this scenario, we have a feature flag with the key "enable-announcement-banner" that is enabled and has two variants: on and off.',"This flag has a targeting rule defined that enables the flag after a specified time.",'The current time (epoch) can be accessed using "$flagd.timestamp" which is automatically provided by flagd.','Five seconds after loading this scenario, the response will change to "on".'].join(" "),flagDefinition:()=>bt({flags:{"enable-announcement-banner":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{">":[{var:"$flagd.timestamp"},Math.floor(Date.now()/1e3)+5]},"on"]}}}}),flagKey:"enable-announcement-banner",returnType:"boolean",context:()=>Et({}),codeDefault:"false"},QA={description:['In this scenario, we have a feature flag with the key "enable-performance-mode" that is enabled and has two variants: on and off.','This rule looks for the evaluation context "version". If the version is greater or equal to "1.7.0" the feature is enabled.','Otherwise, the "defaultVariant" is return. Experiment by changing the version in the context.'].join(" "),flagDefinition:bt({flags:{"enable-performance-mode":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{if:[{sem_ver:[{var:"version"},">=","1.7.0"]},"on"]}}}}),flagKey:"enable-performance-mode",returnType:"boolean",context:Et({version:"1.6.0"}),codeDefault:"false"},KA={description:['In this scenario, we have a feature flag with the key "color-palette-experiment" that is enabled and has four variants: red, blue, green, and grey.','The targeting rule uses the "fractional" operator, which deterministically splits the traffic based on the configuration.','This configuration splits the traffic evenly between the four variants by bucketing evaluations pseudorandomly using the "targetingKey" and feature flag key.','Experiment by changing the "targetingKey" to another value.'].join(" "),flagDefinition:bt({flags:{"color-palette-experiment":{state:"ENABLED",defaultVariant:"grey",variants:{red:"#b91c1c",blue:"#0284c7",green:"#16a34a",grey:"#4b5563"},targeting:{fractional:[["red",25],["blue",25],["green",25],["grey",25]]}}}}),flagKey:"color-palette-experiment",returnType:"string",context:Et({targetingKey:"sessionId-123"}),codeDefault:'"grey"'},FA={description:['In this scenario, we have a feature flag with the key "stepped-rollout-feature" with multiple variants for illustrative purposes.',"This flag has a targeting rule defined that enables the flag for a percentage of users based on the release phase.",'The "targetingKey" ensures that the user always sees the same results during each phase of the rollout process.'].join(" "),flagDefinition:()=>{const r=Math.floor(Date.now()/1e3)+5,a=Math.floor(Date.now()/1e3)+10,s=Math.floor(Date.now()/1e3)+15,o=Math.floor(Date.now()/1e3)+20;return bt({flags:{"stepped-rollout-feature":{state:"ENABLED",defaultVariant:"disabled",variants:{disabled:!1,phase1Enabled:!0,phase1Disabled:!1,phase2Enabled:!0,phase2Disabled:!1,phase3Enabled:!0,phase3Disabled:!1,enabled:!0},targeting:{if:[{">=":[r,{var:"$flagd.timestamp"}]},"disabled",{"<=":[r,{var:"$flagd.timestamp"},a]},{fractional:[["phase1Enabled",10],["phase1Disabled",90]]},{"<=":[a,{var:"$flagd.timestamp"},s]},{fractional:[["phase2Enabled",25],["phase2Disabled",75]]},{"<=":[s,{var:"$flagd.timestamp"},o]},{fractional:[["phase3Enabled",50],["phase3Disabled",50]]},"enabled"]}}}})},flagKey:"stepped-rollout-feature",returnType:"boolean",context:()=>Et({targetingKey:"sessionId-12345"}),codeDefault:"false"},PA={description:["In this scenario, we have two feature flags that share targeting rule logic.","This is accomplished by defining a $evaluators object in the feature flag definition and referencing it by name in a targeting rule.","Experiment with changing the email domain in the shared evaluator."].join(" "),flagDefinition:bt({flags:{"feature-1":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}},"feature-2":{state:"ENABLED",defaultVariant:"false",variants:{true:!0,false:!1},targeting:{if:[{$ref:"emailWithFaas"},"true"]}}},$evaluators:{emailWithFaas:{ends_with:[{var:"email"},"@faas.com"]}}}),flagKey:"feature-1",returnType:"boolean",context:Et({email:"example@faas.com"}),codeDefault:"false"},JA={description:["In this scenario, we have a feature flag that is evaluated based on its targeting key.","The targeting key is contain a string uniquely identifying the subject of the flag evaluation, such as a user's email, or a session identifier.",`In this case, null is returned from targeting if the targeting key doesn't match; this results in a reason of "DEFAULT", since no variant was matched by the targeting rule.`].join(" "),flagDefinition:bt({flags:{"targeting-key-flag":{state:"ENABLED",variants:{miss:"miss",hit:"hit"},defaultVariant:"miss",targeting:{if:[{"==":[{var:"targetingKey"},"5c3d8535-f81a-4478-a6d3-afaa4d51199e"]},"hit",null]}}}}),flagKey:"targeting-key-flag",returnType:"string",context:Et({targetingKey:"5c3d8535-f81a-4478-a6d3-afaa4d51199e"}),codeDefault:'"miss"'},WA={description:["In this scenario, we have a feature flag with metadata about the flag.","There is top-level metadata for the flag set and metadata specific to the flag.","These values are merged together, with the flag metadata taking precedence."].join(" "),flagDefinition:bt({flags:{"flag-with-metadata":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:"on",metadata:{version:"1"}}},metadata:{flagSetId:"playground/dev"}}),flagKey:"flag-with-metadata",returnType:"boolean",context:Et({}),codeDefault:"false"},e_={description:["This scenario demonstrates code defaults in flagd. When defaultVariant is omitted or set to null, flagd falls back to the code-defined default value.","In this example, the flag has two variants (on and off) with defaultVariant set to null.","When evaluated, flagd returns reason=DEFAULT and omits the value and variant fields, allowing the client to use its own code default.","Note: Omitting defaultVariant entirely has the same effect as setting it to null - both trigger code default behavior.","Compare this with the basic boolean flag which has an explicit defaultVariant set to false."].join(" "),flagDefinition:bt({flags:{"code-default-flag":{state:"ENABLED",variants:{on:!0,off:!1},defaultVariant:null}}}),flagKey:"code-default-flag",returnType:"boolean",context:Et({}),codeDefault:"true"},t_={description:["This scenario demonstrates a gradual rollout using dynamic weights computed from timestamps.","The feature flag 'gradual-rollout-feature' uses fractional evaluation with weights that change over time.","The 'on' weight increases as time passes (current timestamp minus start time).","The 'off' weight decreases as time passes (end time minus current timestamp).","This creates a smooth linear transition of users from 0% to 100% rollout over 30 seconds.","For example, user-1 will transition to true at ~t=+6s, while user-2 will transition at ~t=+13s","By t=+30s, all users will see the flag as true, no matter their targeting key."].join(" "),flagDefinition:()=>{const r=Math.floor(Date.now()/1e3),a=r,s=r+30;return bt({flags:{"gradual-rollout-feature":{state:"ENABLED",defaultVariant:"off",variants:{on:!0,off:!1},targeting:{fractional:[["on",{"-":[{var:"$flagd.timestamp"},a]}],["off",{"-":[s,{var:"$flagd.timestamp"}]}]]}}}})},flagKey:"gradual-rollout-feature",returnType:"boolean",context:()=>Et({targetingKey:"user-1"}),codeDefault:"false"},or={"Basic boolean flag":HA,"Basic numeric flag":$A,"Basic string flag":YA,"Basic object flag":kA,"Enable for a specific email domain":IA,"Enable based on users locale":XA,"Enable based on release version":QA,"Enable based on the current time":ZA,"Chainable if/else/then":VA,"Multi-variant experiment":KA,"Stepped rollout":FA,"Gradual rollout":t_,"Shared evaluators":PA,"Boolean variant shorthand":GA,"Targeting key":JA,"Flag metadata":WA,"Code default":e_};function r_(r,a,s){return a in r?Object.defineProperty(r,a,{value:s,enumerable:!0,configurable:!0,writable:!0}):r[a]=s,r}function Jy(r,a){var s=Object.keys(r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);a&&(o=o.filter(function(c){return Object.getOwnPropertyDescriptor(r,c).enumerable})),s.push.apply(s,o)}return s}function Wy(r){for(var a=1;a=0)&&(s[c]=r[c]);return s}function a_(r,a){if(r==null)return{};var s=n_(r,a),o,c;if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(r);for(c=0;c=0)&&Object.prototype.propertyIsEnumerable.call(r,o)&&(s[o]=r[o])}return s}function i_(r,a){return l_(r)||u_(r,a)||s_(r,a)||o_()}function l_(r){if(Array.isArray(r))return r}function u_(r,a){if(!(typeof Symbol>"u"||!(Symbol.iterator in Object(r)))){var s=[],o=!0,c=!1,l=void 0;try{for(var u=r[Symbol.iterator](),d;!(o=(d=u.next()).done)&&(s.push(d.value),!(a&&s.length===a));o=!0);}catch(m){c=!0,l=m}finally{try{!o&&u.return!=null&&u.return()}finally{if(c)throw l}}return s}}function s_(r,a){if(r){if(typeof r=="string")return e0(r,a);var s=Object.prototype.toString.call(r).slice(8,-1);if(s==="Object"&&r.constructor&&(s=r.constructor.name),s==="Map"||s==="Set")return Array.from(r);if(s==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s))return e0(r,a)}}function e0(r,a){(a==null||a>r.length)&&(a=r.length);for(var s=0,o=new Array(a);s=r.length?r.apply(this,c):function(){for(var u=arguments.length,d=new Array(u),m=0;m1&&arguments[1]!==void 0?arguments[1]:{};Ru.initial(r),Ru.handler(a);var s={current:r},o=el(w_)(s,a),c=el(__)(s),l=el(Ru.changes)(r),u=el(A_)(s);function d(){var p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(g){return g};return Ru.selector(p),p(s.current)}function m(p){c_(o,c,l,u)(p)}return[d,m]}function A_(r,a){return fl(a)?a(r.current):a}function __(r,a){return r.current=r0(r0({},r.current),a),a}function w_(r,a,s){return fl(a)?a(r.current):Object.keys(s).forEach(function(o){var c;return(c=a[o])===null||c===void 0?void 0:c.call(a,r.current[o])}),s}var S_={create:E_},O_={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.43.0/min/vs"}};function T_(r){return function a(){for(var s=this,o=arguments.length,c=new Array(o),l=0;l=r.length?r.apply(this,c):function(){for(var u=arguments.length,d=new Array(u),m=0;m{f.current=!1}:r,a)}var Yt=F_;function nl(){}function Ha(r,a,s,f){return P_(r,f)||J_(r,a,s,f)}function P_(r,a){return r.editor.getModel(T0(r,a))}function J_(r,a,s,f){return r.editor.createModel(a,s,f?T0(r,f):void 0)}function T0(r,a){return r.Uri.parse(a)}function W_({original:r,modified:a,language:s,originalLanguage:f,modifiedLanguage:c,originalModelPath:u,modifiedModelPath:l,keepCurrentOriginalModel:d=!1,keepCurrentModifiedModel:m=!1,theme:p="light",loading:g="Loading...",options:v={},height:T="100%",width:j="100%",className:C,wrapperProps:N={},beforeMount:D=nl,onMount:X=nl}){let[k,I]=pe.useState(!1),[W,te]=pe.useState(!0),R=pe.useRef(null),U=pe.useRef(null),_=pe.useRef(null),w=pe.useRef(X),E=pe.useRef(D),q=pe.useRef(!1);S0(()=>{let z=w0.init();return z.then(x=>(U.current=x)&&te(!1)).catch(x=>(x==null?void 0:x.type)!=="cancelation"&&console.error("Monaco initialization: error:",x)),()=>R.current?K():z.cancel()}),Yt(()=>{if(R.current&&U.current){let z=R.current.getOriginalEditor(),x=Ha(U.current,r||"",f||s||"text",u||"");x!==z.getModel()&&z.setModel(x)}},[u],k),Yt(()=>{if(R.current&&U.current){let z=R.current.getModifiedEditor(),x=Ha(U.current,a||"",c||s||"text",l||"");x!==z.getModel()&&z.setModel(x)}},[l],k),Yt(()=>{let z=R.current.getModifiedEditor();z.getOption(U.current.editor.EditorOption.readOnly)?z.setValue(a||""):a!==z.getValue()&&(z.executeEdits("",[{range:z.getModel().getFullModelRange(),text:a||"",forceMoveMarkers:!0}]),z.pushUndoStop())},[a],k),Yt(()=>{var z,x;(x=(z=R.current)==null?void 0:z.getModel())==null||x.original.setValue(r||"")},[r],k),Yt(()=>{let{original:z,modified:x}=R.current.getModel();U.current.editor.setModelLanguage(z,f||s||"text"),U.current.editor.setModelLanguage(x,c||s||"text")},[s,f,c],k),Yt(()=>{var z;(z=U.current)==null||z.editor.setTheme(p)},[p],k),Yt(()=>{var z;(z=R.current)==null||z.updateOptions(v)},[v],k);let G=pe.useCallback(()=>{var Z;if(!U.current)return;E.current(U.current);let z=Ha(U.current,r||"",f||s||"text",u||""),x=Ha(U.current,a||"",c||s||"text",l||"");(Z=R.current)==null||Z.setModel({original:z,modified:x})},[s,a,c,r,f,u,l]),ce=pe.useCallback(()=>{var z;!q.current&&_.current&&(R.current=U.current.editor.createDiffEditor(_.current,{automaticLayout:!0,...v}),G(),(z=U.current)==null||z.editor.setTheme(p),I(!0),q.current=!0)},[v,p,G]);pe.useEffect(()=>{k&&w.current(R.current,U.current)},[k]),pe.useEffect(()=>{!W&&!k&&ce()},[W,k,ce]);function K(){var x,Z,P,J;let z=(x=R.current)==null?void 0:x.getModel();d||((Z=z==null?void 0:z.original)==null||Z.dispose()),m||((P=z==null?void 0:z.modified)==null||P.dispose()),(J=R.current)==null||J.dispose()}return Kn.createElement(O0,{width:j,height:T,isEditorReady:k,loading:g,_ref:_,className:C,wrapperProps:N})}var ew=W_;pe.memo(ew);function tw(r){let a=pe.useRef();return pe.useEffect(()=>{a.current=r},[r]),a.current}var rw=tw,Ru=new Map;function nw({defaultValue:r,defaultLanguage:a,defaultPath:s,value:f,language:c,path:u,theme:l="light",line:d,loading:m="Loading...",options:p={},overrideServices:g={},saveViewState:v=!0,keepCurrentModel:T=!1,width:j="100%",height:C="100%",className:N,wrapperProps:D={},beforeMount:X=nl,onMount:k=nl,onChange:I,onValidate:W=nl}){let[te,R]=pe.useState(!1),[U,_]=pe.useState(!0),w=pe.useRef(null),E=pe.useRef(null),q=pe.useRef(null),G=pe.useRef(k),ce=pe.useRef(X),K=pe.useRef(),z=pe.useRef(f),x=rw(u),Z=pe.useRef(!1),P=pe.useRef(!1);S0(()=>{let $=w0.init();return $.then(ee=>(w.current=ee)&&_(!1)).catch(ee=>(ee==null?void 0:ee.type)!=="cancelation"&&console.error("Monaco initialization: error:",ee)),()=>E.current?O():$.cancel()}),Yt(()=>{var ee,se,ie,he;let $=Ha(w.current,r||f||"",a||c||"",u||s||"");$!==((ee=E.current)==null?void 0:ee.getModel())&&(v&&Ru.set(x,(se=E.current)==null?void 0:se.saveViewState()),(ie=E.current)==null||ie.setModel($),v&&((he=E.current)==null||he.restoreViewState(Ru.get(u))))},[u],te),Yt(()=>{var $;($=E.current)==null||$.updateOptions(p)},[p],te),Yt(()=>{!E.current||f===void 0||(E.current.getOption(w.current.editor.EditorOption.readOnly)?E.current.setValue(f):f!==E.current.getValue()&&(P.current=!0,E.current.executeEdits("",[{range:E.current.getModel().getFullModelRange(),text:f,forceMoveMarkers:!0}]),E.current.pushUndoStop(),P.current=!1))},[f],te),Yt(()=>{var ee,se;let $=(ee=E.current)==null?void 0:ee.getModel();$&&c&&((se=w.current)==null||se.editor.setModelLanguage($,c))},[c],te),Yt(()=>{var $;d!==void 0&&(($=E.current)==null||$.revealLine(d))},[d],te),Yt(()=>{var $;($=w.current)==null||$.editor.setTheme(l)},[l],te);let J=pe.useCallback(()=>{var $;if(!(!q.current||!w.current)&&!Z.current){ce.current(w.current);let ee=u||s,se=Ha(w.current,f||r||"",a||c||"",ee||"");E.current=($=w.current)==null?void 0:$.editor.create(q.current,{model:se,automaticLayout:!0,...p},g),v&&E.current.restoreViewState(Ru.get(ee)),w.current.editor.setTheme(l),d!==void 0&&E.current.revealLine(d),R(!0),Z.current=!0}},[r,a,s,f,c,u,p,g,v,l,d]);pe.useEffect(()=>{te&&G.current(E.current,w.current)},[te]),pe.useEffect(()=>{!U&&!te&&J()},[U,te,J]),z.current=f,pe.useEffect(()=>{var $,ee;te&&I&&(($=K.current)==null||$.dispose(),K.current=(ee=E.current)==null?void 0:ee.onDidChangeModelContent(se=>{P.current||I(E.current.getValue(),se)}))},[te,I]),pe.useEffect(()=>{if(te){let $=w.current.editor.onDidChangeMarkers(ee=>{var ie;let se=(ie=E.current.getModel())==null?void 0:ie.uri;if(se&&ee.find(he=>he.path===se.path)){let he=w.current.editor.getModelMarkers({resource:se});W==null||W(he)}});return()=>{$==null||$.dispose()}}return()=>{}},[te,W]);function O(){var $,ee;($=K.current)==null||$.dispose(),T?v&&Ru.set(u,E.current.saveViewState()):(ee=E.current.getModel())==null||ee.dispose(),E.current.dispose()}return Kn.createElement(O0,{width:j,height:C,isEditorReady:te,loading:m,_ref:q,className:N,wrapperProps:D})}var aw=nw,ng=pe.memo(aw);const La="json",xu="yaml",ag="data-md-color-scheme",iw="[data-md-component=palette]",ig=()=>document.body.getAttribute(ag)&&document.body.getAttribute(ag)!=="default"?"custom-dark":"custom",lg=r=>{r==null||r.editor.defineTheme("custom-dark",{base:"vs-dark",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.editor.defineTheme("custom",{base:"vs",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.languages.json.jsonDefaults.setDiagnosticsOptions({enableSchemaRequest:!0,allowComments:!1})};function ug(r){const a=JSON.parse(r);return JSON.stringify(a,null,2)}function lw(){const[r,a]=pe.useState("Basic boolean flag"),[s,f]=pe.useState(rr[r].flagDefinition),[c,u]=pe.useState(rr[r].flagKey),[l,d]=pe.useState(rr[r].returnType),[m,p]=pe.useState(rr[r].codeDefault),[g,v]=pe.useState(null),[T,j]=pe.useState(Ky(rr[r].context)),[C,N]=pe.useState(!1),[D,X]=pe.useState(""),[k,I]=pe.useState([]),[W,te]=pe.useState(rr[r].description),[R,U]=pe.useState(!0),[_,w]=pe.useState(!0),[E,q]=pe.useState(!1),[G,ce]=pe.useState("success"),[K,z]=pe.useState(ig()),[x,Z]=pe.useState(La),P=pe.useCallback(()=>{try{const B=x===La?xu:La;f(B===xu?Fy(s):qA(s)),Z(B);const b=new URL(window.location.href);b.searchParams.set("lang",B),window.history.replaceState({},"",b.href)}catch(B){console.error("Failed to convert",B)}},[s,x]),J=pe.useCallback(()=>{X(""),N(!1);const B=rr[r];f(B.flagDefinition),Z(La),u(B.flagKey),d(B.returnType),p(B.codeDefault),j(Ky(B.context)),te(B.description),U(!0),w(!0),q(!1),ce("success")},[r]);pe.useEffect(()=>{J()},[r,J]);const O=pe.useMemo(()=>new Rg(console),[]),$=pe.useMemo(()=>new g2(O,console),[O]);pe.useEffect(()=>{if(BA(s))try{const B=lc(s);$.setConfigurations(B),I(Array.from($.getFlags().keys())),U(!0)}catch(B){console.error("Invalid flagd configuration",B),U(!1)}else U(!1)},[s,$]),pe.useEffect(()=>{try{JSON.parse(T),w(!0)}catch(B){console.error("Invalid JSON input",B),w(!1)}},[T]),pe.useEffect(()=>{var S;const B=document.querySelector(iw),b=(S=window.component$)==null?void 0:S.subscribe(L=>{(L==null?void 0:L.ref)===B&&z(ig())});return()=>{b==null||b.unsubscribe()}}),pe.useEffect(()=>{const B=new URLSearchParams(window.location.search),b=B.get("flags"),S=B.get("flag-key"),L=B.get("return-type"),ae=B.get("code-default"),ue=B.get("eval-context"),oe=B.get("lang"),Ee=B.get("scenario-name");if(b)try{let Te=ug(b),Ue=La;if(oe===xu&&(Te=Fy(Te),Ue=xu),f(Te),Z(Ue),S&&u(S),L&&d(L),ae&&p(ae),ue){const Ve=ug(ue);j(Ve)}}catch(Te){console.error("Error decoding URL parameters: ",Te)}else Ee&&rr[Ee]&&(a(Ee),f(rr[Ee].flagDefinition))},[]);function ee(B,b){switch(b){case"boolean":return B==="true"||B==="True"||B==="TRUE";case"number":const S=parseFloat(B);return isNaN(S)?0:S;case"object":try{return JSON.parse(B)}catch{return{}}case"string":default:return B}}const se=()=>{N(!0);try{let B;const b=JSON.parse(T),S=ee(m,l);switch(l){case"boolean":B=$.resolveBooleanEvaluation(c,S,b,console);break;case"string":B=$.resolveStringEvaluation(c,S,b,console);break;case"number":B=$.resolveNumberEvaluation(c,S,b,console);break;case"object":B=$.resolveObjectEvaluation(c,S,b,console);break}B.variant||(B.value=void 0),ce("success"),v(m),X(JSON.stringify(B,null,2))}catch(B){console.error("Invalid JSON input",B),ce("failure"),X(B.message)}},ie=pe.useMemo(()=>{try{return JSON.parse(D)}catch{return D}},[D]),he=lb("(max-width: 1220px)"),de={border:"none",backgroundColor:"var(--md-code-bg-color)",color:"var(--md-code-fg-color)",fontFeatureSettings:"kern",fontFamily:"var(--md-code-font-family)"},Re=()=>{const B=window.location.origin+window.location.pathname,b=new URL(B),S=lc(s),L=lc(T);Object.keys(rr).includes(r)&&rr[r].flagDefinition===s?b.searchParams.set("scenario-name",r):(b.searchParams.delete("scenario-name"),b.searchParams.set("flags",S),b.searchParams.set("flag-key",c),b.searchParams.set("return-type",l),b.searchParams.set("code-default",m),b.searchParams.set("eval-context",L),b.searchParams.set("lang",x)),window.history.pushState({},"",b.href),navigator.clipboard.writeText(b.href).then(()=>{console.log("URL copied to clipboard"),q(!0),setTimeout(()=>{q(!1)},5e3)}).catch(ae=>{console.error("Failed to copy URL: ",ae)})};return ve.jsxs("div",{style:{maxWidth:"100%"},children:[ve.jsxs("div",{children:[ve.jsx("a",{href:"../",className:"playground-back",children:"Back to docs"}),ve.jsxs("p",{style:{lineHeight:"1.4",fontSize:"medium"},children:["Explore flagd flag definitions in your browser. Begin by selecting an example below; these are merely starting points, so customize the flag definition as you wish. Find an overview of the flag definition structure ",ve.jsx("a",{href:"/reference/flag-definitions/",children:"here"}),"."]})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Select a scenario"}),ve.jsxs("div",{style:{display:"flex",flexDirection:he?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[ve.jsx("div",{style:{flex:"2"},children:ve.jsx("select",{style:{width:"100%",minWidth:"250px",padding:"8px",...de},value:r,onChange:B=>a(B.target.value),children:Object.keys(rr).map(B=>ve.jsx("option",{value:B,children:B},B))})}),ve.jsx("div",{style:{flex:"3"},children:ve.jsx("p",{style:{lineHeight:"1.4",margin:"-4px 0 0 0",fontSize:"small"},children:W})})]}),ve.jsxs("div",{style:{display:"flex",flexDirection:he?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[ve.jsxs("div",{style:{flex:"3"},children:[ve.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[ve.jsx("h4",{style:{margin:0},children:"Feature definition"}),ve.jsxs("button",{className:"md-button",style:{padding:"2px 8px",fontSize:"small"},disabled:!R,onClick:P,children:["Switch to ",x===La?"YAML":"JSON"]})]}),ve.jsx("div",{style:{backgroundColor:de.backgroundColor},children:ve.jsx(ng,{theme:K,width:"100%",height:"500px",language:x,value:s,options:{minimap:{enabled:!1},lineNumbers:"off"},beforeMount:lg,onChange:B=>{B&&f(B)}})})]}),ve.jsxs("div",{style:{flex:"2"},children:[ve.jsxs("div",{children:[ve.jsx("h4",{children:"Flag key"}),ve.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...de},name:"flag-key",list:"flag-keys",value:c,onChange:B=>u(B.target.value)}),ve.jsx("datalist",{id:"flag-keys",children:k.map((B,b)=>ve.jsx("option",{value:B},b))})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Return type"}),ve.jsxs("select",{style:{width:"100%",padding:"8px 0 8px 0",...de},value:l,onChange:B=>d(B.target.value),children:[ve.jsx("option",{value:"boolean",children:"boolean"}),ve.jsx("option",{value:"string",children:"string"}),ve.jsx("option",{value:"number",children:"number"}),ve.jsx("option",{value:"object",children:"object"})]})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Code default"}),ve.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...de},name:"code-default",value:m,onChange:B=>p(B.target.value)}),ve.jsx("p",{style:{fontSize:"small",color:"var(--md-code-fg-color)",marginTop:"4px"},children:"The default value to use when defaultVariant is null/omitted, or when errors occur during evaluation."})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Evaluation context"}),ve.jsx("div",{style:{backgroundColor:de.backgroundColor},children:ve.jsx(ng,{theme:K,width:"100%",height:"80px",language:"json",options:{minimap:{enabled:!1},lineNumbers:"off",folding:!1},beforeMount:lg,value:T,onChange:B=>{B&&j(B)}})})]}),ve.jsxs("div",{style:{display:"flex",gap:"8px",paddingTop:"8px"},children:[ve.jsx("button",{className:"md-button md-button--primary",onClick:se,disabled:!R||!_,children:"Evaluate"}),ve.jsx("button",{className:"md-button",onClick:J,children:"Reset"}),ve.jsx("button",{className:"md-button",onClick:Re,disabled:!R||!_,children:"Share"})]}),ve.jsxs("div",{className:`output ${C?"visible":""} admonition ${G==="success"?"success":"failure"}`,children:[ve.jsx("p",{className:"admonition-title",children:G==="success"?"Success":"Failure"}),typeof ie=="object"?ve.jsxs("div",{style:{margin:"0.6rem 0 0.6rem 0"},children:[Object.entries(ie).map(([B,b])=>ve.jsxs("div",{children:[ve.jsxs("strong",{children:[B,":"]})," ",JSON.stringify(b)]},B)),g&&ie.value===void 0&&ve.jsxs("div",{children:[ve.jsx("strong",{children:"value:"})," ",g]})]}):ve.jsx("p",{children:ie})]}),E&&ve.jsx("h4",{className:"admonition-title",style:{paddingLeft:"45px",borderLeftWidth:"0rem",borderLeftStyle:"solid",left:"15px"},children:"URL copied to clipboard"})]})]})]})]})}nb.createRoot(document.getElementById("playground")).render(ve.jsx(Kn.StrictMode,{children:ve.jsx(lw,{})}));let sg=!1;new MutationObserver(()=>{document.getElementById("playground")?sg&&window.location.reload():sg=!0}).observe(document.body,{childList:!0,subtree:!0}); + `},n0=T_(N_)(Eg),M_={config:x_},j_=function(){for(var a=arguments.length,s=new Array(a),o=0;o{o.current=!1}:r,a)}var Yt=P_;function al(){}function qa(r,a,s,o){return J_(r,o)||W_(r,a,s,o)}function J_(r,a){return r.editor.getModel(Rg(r,a))}function W_(r,a,s,o){return r.editor.createModel(a,s,o?Rg(r,o):void 0)}function Rg(r,a){return r.Uri.parse(a)}function ew({original:r,modified:a,language:s,originalLanguage:o,modifiedLanguage:c,originalModelPath:l,modifiedModelPath:u,keepCurrentOriginalModel:d=!1,keepCurrentModifiedModel:m=!1,theme:p="light",loading:g="Loading...",options:v={},height:R="100%",width:C="100%",className:L,wrapperProps:j={},beforeMount:N=al,onMount:V=al}){let[H,X]=pe.useState(!1),[W,re]=pe.useState(!0),x=pe.useRef(null),U=pe.useRef(null),_=pe.useRef(null),w=pe.useRef(V),b=pe.useRef(N),B=pe.useRef(!1);Tg(()=>{let z=Sg.init();return z.then(D=>(U.current=D)&&re(!1)).catch(D=>(D==null?void 0:D.type)!=="cancelation"&&console.error("Monaco initialization: error:",D)),()=>x.current?K():z.cancel()}),Yt(()=>{if(x.current&&U.current){let z=x.current.getOriginalEditor(),D=qa(U.current,r||"",o||s||"text",l||"");D!==z.getModel()&&z.setModel(D)}},[l],H),Yt(()=>{if(x.current&&U.current){let z=x.current.getModifiedEditor(),D=qa(U.current,a||"",c||s||"text",u||"");D!==z.getModel()&&z.setModel(D)}},[u],H),Yt(()=>{let z=x.current.getModifiedEditor();z.getOption(U.current.editor.EditorOption.readOnly)?z.setValue(a||""):a!==z.getValue()&&(z.executeEdits("",[{range:z.getModel().getFullModelRange(),text:a||"",forceMoveMarkers:!0}]),z.pushUndoStop())},[a],H),Yt(()=>{var z,D;(D=(z=x.current)==null?void 0:z.getModel())==null||D.original.setValue(r||"")},[r],H),Yt(()=>{let{original:z,modified:D}=x.current.getModel();U.current.editor.setModelLanguage(z,o||s||"text"),U.current.editor.setModelLanguage(D,c||s||"text")},[s,o,c],H),Yt(()=>{var z;(z=U.current)==null||z.editor.setTheme(p)},[p],H),Yt(()=>{var z;(z=x.current)==null||z.updateOptions(v)},[v],H);let Y=pe.useCallback(()=>{var I;if(!U.current)return;b.current(U.current);let z=qa(U.current,r||"",o||s||"text",l||""),D=qa(U.current,a||"",c||s||"text",u||"");(I=x.current)==null||I.setModel({original:z,modified:D})},[s,a,c,r,o,l,u]),ce=pe.useCallback(()=>{var z;!B.current&&_.current&&(x.current=U.current.editor.createDiffEditor(_.current,{automaticLayout:!0,...v}),Y(),(z=U.current)==null||z.editor.setTheme(p),X(!0),B.current=!0)},[v,p,Y]);pe.useEffect(()=>{H&&w.current(x.current,U.current)},[H]),pe.useEffect(()=>{!W&&!H&&ce()},[W,H,ce]);function K(){var D,I,J,P;let z=(D=x.current)==null?void 0:D.getModel();d||((I=z==null?void 0:z.original)==null||I.dispose()),m||((J=z==null?void 0:z.modified)==null||J.dispose()),(P=x.current)==null||P.dispose()}return Qn.createElement(Og,{width:C,height:R,isEditorReady:H,loading:g,_ref:_,className:L,wrapperProps:j})}var tw=ew;pe.memo(tw);function rw(r){let a=pe.useRef();return pe.useEffect(()=>{a.current=r},[r]),a.current}var nw=rw,xu=new Map;function aw({defaultValue:r,defaultLanguage:a,defaultPath:s,value:o,language:c,path:l,theme:u="light",line:d,loading:m="Loading...",options:p={},overrideServices:g={},saveViewState:v=!0,keepCurrentModel:R=!1,width:C="100%",height:L="100%",className:j,wrapperProps:N={},beforeMount:V=al,onMount:H=al,onChange:X,onValidate:W=al}){let[re,x]=pe.useState(!1),[U,_]=pe.useState(!0),w=pe.useRef(null),b=pe.useRef(null),B=pe.useRef(null),Y=pe.useRef(H),ce=pe.useRef(V),K=pe.useRef(),z=pe.useRef(o),D=nw(l),I=pe.useRef(!1),J=pe.useRef(!1);Tg(()=>{let k=Sg.init();return k.then(ee=>(w.current=ee)&&_(!1)).catch(ee=>(ee==null?void 0:ee.type)!=="cancelation"&&console.error("Monaco initialization: error:",ee)),()=>b.current?S():k.cancel()}),Yt(()=>{var ee,se,ue,he;let k=qa(w.current,r||o||"",a||c||"",l||s||"");k!==((ee=b.current)==null?void 0:ee.getModel())&&(v&&xu.set(D,(se=b.current)==null?void 0:se.saveViewState()),(ue=b.current)==null||ue.setModel(k),v&&((he=b.current)==null||he.restoreViewState(xu.get(l))))},[l],re),Yt(()=>{var k;(k=b.current)==null||k.updateOptions(p)},[p],re),Yt(()=>{!b.current||o===void 0||(b.current.getOption(w.current.editor.EditorOption.readOnly)?b.current.setValue(o):o!==b.current.getValue()&&(J.current=!0,b.current.executeEdits("",[{range:b.current.getModel().getFullModelRange(),text:o,forceMoveMarkers:!0}]),b.current.pushUndoStop(),J.current=!1))},[o],re),Yt(()=>{var ee,se;let k=(ee=b.current)==null?void 0:ee.getModel();k&&c&&((se=w.current)==null||se.editor.setModelLanguage(k,c))},[c],re),Yt(()=>{var k;d!==void 0&&((k=b.current)==null||k.revealLine(d))},[d],re),Yt(()=>{var k;(k=w.current)==null||k.editor.setTheme(u)},[u],re);let P=pe.useCallback(()=>{var k;if(!(!B.current||!w.current)&&!I.current){ce.current(w.current);let ee=l||s,se=qa(w.current,o||r||"",a||c||"",ee||"");b.current=(k=w.current)==null?void 0:k.editor.create(B.current,{model:se,automaticLayout:!0,...p},g),v&&b.current.restoreViewState(xu.get(ee)),w.current.editor.setTheme(u),d!==void 0&&b.current.revealLine(d),x(!0),I.current=!0}},[r,a,s,o,c,l,p,g,v,u,d]);pe.useEffect(()=>{re&&Y.current(b.current,w.current)},[re]),pe.useEffect(()=>{!U&&!re&&P()},[U,re,P]),z.current=o,pe.useEffect(()=>{var k,ee;re&&X&&((k=K.current)==null||k.dispose(),K.current=(ee=b.current)==null?void 0:ee.onDidChangeModelContent(se=>{J.current||X(b.current.getValue(),se)}))},[re,X]),pe.useEffect(()=>{if(re){let k=w.current.editor.onDidChangeMarkers(ee=>{var ue;let se=(ue=b.current.getModel())==null?void 0:ue.uri;if(se&&ee.find(he=>he.path===se.path)){let he=w.current.editor.getModelMarkers({resource:se});W==null||W(he)}});return()=>{k==null||k.dispose()}}return()=>{}},[re,W]);function S(){var k,ee;(k=K.current)==null||k.dispose(),R?v&&xu.set(l,b.current.saveViewState()):(ee=b.current.getModel())==null||ee.dispose(),b.current.dispose()}return Qn.createElement(Og,{width:C,height:L,isEditorReady:re,loading:m,_ref:B,className:j,wrapperProps:N})}var iw=aw,a0=pe.memo(iw);const Ca="json",Du="yaml",i0="data-md-color-scheme",lw="[data-md-component=palette]",l0=()=>document.body.getAttribute(i0)&&document.body.getAttribute(i0)!=="default"?"custom-dark":"custom",u0=r=>{r==null||r.editor.defineTheme("custom-dark",{base:"vs-dark",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.editor.defineTheme("custom",{base:"vs",inherit:!0,rules:[],colors:{"editor.background":"#00000000"}}),r==null||r.languages.json.jsonDefaults.setDiagnosticsOptions({enableSchemaRequest:!0,allowComments:!1})};function s0(r){const a=JSON.parse(r);return JSON.stringify(a,null,2)}function uw(){const[r,a]=pe.useState("Basic boolean flag"),[s,o]=pe.useState(or[r].flagDefinition),[c,l]=pe.useState(or[r].flagKey),[u,d]=pe.useState(or[r].returnType),[m,p]=pe.useState(or[r].codeDefault),[g,v]=pe.useState(null),[R,C]=pe.useState(Fy(or[r].context)),[L,j]=pe.useState(!1),[N,V]=pe.useState(""),[H,X]=pe.useState([]),[W,re]=pe.useState(or[r].description),[x,U]=pe.useState(!0),[_,w]=pe.useState(!0),[b,B]=pe.useState(!1),[Y,ce]=pe.useState("success"),[K,z]=pe.useState(l0()),[D,I]=pe.useState(Ca),[J,P]=pe.useState(!1),S=pe.useCallback(()=>{try{const O=D===Ca?Du:Ca;o(O===Du?Py(s):qA(s)),I(O),P(!0);const Q=new URL(window.location.href);Q.searchParams.set("lang",O),window.history.replaceState({},"",Q.href)}catch(O){console.error("Failed to convert",O)}},[s,D]),k=pe.useCallback(()=>{V(""),j(!1);const O=or[r];o(O.flagDefinition),I(Ca),l(O.flagKey),d(O.returnType),p(O.codeDefault),C(Fy(O.context)),re(O.description),U(!0),w(!0),B(!1),ce("success"),P(!1)},[r]);pe.useEffect(()=>{k()},[r,k]);const ee=pe.useMemo(()=>new x0(console),[]),se=pe.useMemo(()=>new g2(ee,console),[ee]);pe.useEffect(()=>{if(BA(s))try{const O=sc(s);se.setConfigurations(O),X(Array.from(se.getFlags().keys())),U(!0)}catch(O){console.error("Invalid flagd configuration",O),U(!1)}else U(!1)},[s,se]),pe.useEffect(()=>{try{JSON.parse(R),w(!0)}catch(O){console.error("Invalid JSON input",O),w(!1)}},[R]),pe.useEffect(()=>{var ie;const O=document.querySelector(lw),Q=(ie=window.component$)==null?void 0:ie.subscribe(fe=>{(fe==null?void 0:fe.ref)===O&&z(l0())});return()=>{Q==null||Q.unsubscribe()}}),pe.useEffect(()=>{const O=new URLSearchParams(window.location.search),Q=O.get("flags"),ie=O.get("flag-key"),fe=O.get("return-type"),Ee=O.get("code-default"),De=O.get("eval-context"),Be=O.get("lang"),Ge=O.get("scenario-name");if(Q)try{let qe=s0(Q),Ze=Ca;if(Be===Du&&(qe=Py(qe),Ze=Du),o(qe),I(Ze),P(!0),ie&&l(ie),fe&&d(fe),Ee&&p(Ee),De){const ke=s0(De);C(ke)}}catch(qe){console.error("Error decoding URL parameters: ",qe)}else Ge&&or[decodeURIComponent(Ge)]&&(a(decodeURIComponent(Ge)),o(or[decodeURIComponent(Ge)].flagDefinition))},[]);function ue(O,Q){switch(Q){case"boolean":return O==="true"||O==="True"||O==="TRUE";case"number":const ie=parseFloat(O);return isNaN(ie)?0:ie;case"object":try{return JSON.parse(O)}catch{return{}}case"string":default:return O}}const he=()=>{j(!0);try{let O;const Q=JSON.parse(R),ie=ue(m,u);switch(u){case"boolean":O=se.resolveBooleanEvaluation(c,ie,Q,console);break;case"string":O=se.resolveStringEvaluation(c,ie,Q,console);break;case"number":O=se.resolveNumberEvaluation(c,ie,Q,console);break;case"object":O=se.resolveObjectEvaluation(c,ie,Q,console);break}O.variant||(O.value=void 0),ce("success"),v(m),V(JSON.stringify(O,null,2))}catch(O){console.error("Invalid JSON input",O),ce("failure"),V(O.message)}},de=pe.useMemo(()=>{try{return JSON.parse(N)}catch{return N}},[N]),Te=ub("(max-width: 1220px)"),te={border:"none",backgroundColor:"var(--md-code-bg-color)",color:"var(--md-code-fg-color)",fontFeatureSettings:"kern",fontFamily:"var(--md-code-font-family)"},E=()=>{const O=window.location.origin+window.location.pathname,Q=new URL(O),ie=sc(s),fe=sc(R);Object.keys(or).includes(r)&&!J?Q.searchParams.set("scenario-name",r):(Q.searchParams.delete("scenario-name"),Q.searchParams.set("flags",ie),Q.searchParams.set("flag-key",c),Q.searchParams.set("return-type",u),Q.searchParams.set("code-default",m),Q.searchParams.set("eval-context",fe),Q.searchParams.set("lang",D)),window.history.pushState({},"",Q.href),navigator.clipboard.writeText(Q.href).then(()=>{console.log("URL copied to clipboard"),B(!0),setTimeout(()=>{B(!1)},5e3)}).catch(Ee=>{console.error("Failed to copy URL: ",Ee)})},T=O=>{const Q=O.currentTarget,ie=Q.style.backgroundColor;Q.style.backgroundColor="rgba(0, 0, 0, 0.2)",Q.style.transform="scale(0.95)",setTimeout(()=>{Q.style.backgroundColor=ie,Q.style.transform=""},150)};return ve.jsxs("div",{style:{maxWidth:"100%"},children:[ve.jsxs("div",{children:[ve.jsx("a",{href:"../",className:"playground-back",children:"Back to docs"}),ve.jsxs("p",{style:{lineHeight:"1.4",fontSize:"medium"},children:["Explore flagd flag definitions in your browser. Begin by selecting an example below; these are merely starting points, so customize the flag definition as you wish. Find an overview of the flag definition structure ",ve.jsx("a",{href:"/reference/flag-definitions/",children:"here"}),"."]})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Select a scenario"}),ve.jsxs("div",{style:{display:"flex",flexDirection:Te?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[ve.jsx("div",{style:{flex:"2"},children:ve.jsx("select",{style:{width:"100%",minWidth:"250px",padding:"8px",...te},value:r,onChange:O=>a(O.target.value),children:Object.keys(or).map(O=>ve.jsx("option",{value:O,children:O},O))})}),ve.jsx("div",{style:{flex:"3"},children:ve.jsx("p",{style:{lineHeight:"1.4",margin:"-4px 0 0 0",fontSize:"small"},children:W})})]}),ve.jsxs("div",{style:{display:"flex",flexDirection:Te?"column":"row",textAlign:"left",gap:"16px",height:"100%"},children:[ve.jsxs("div",{style:{flex:"3"},children:[ve.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px"},children:[ve.jsx("h4",{style:{margin:0},children:"Feature definition"}),ve.jsxs("button",{className:"md-button",style:{padding:"2px 8px",fontSize:"small"},disabled:!x,onClick:O=>{T(O),S()},children:["Switch to ",D===Ca?"YAML":"JSON"]})]}),ve.jsx("div",{style:{backgroundColor:te.backgroundColor},children:ve.jsx(a0,{theme:K,width:"100%",height:"500px",language:D,value:s,options:{minimap:{enabled:!1},lineNumbers:"off"},beforeMount:u0,onChange:O=>{O&&(o(O),P(!0))}})})]}),ve.jsxs("div",{style:{flex:"2"},children:[ve.jsxs("div",{children:[ve.jsx("h4",{children:"Flag key"}),ve.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...te},name:"flag-key",list:"flag-keys",value:c,onChange:O=>{l(O.target.value),P(!0)}}),ve.jsx("datalist",{id:"flag-keys",children:H.map((O,Q)=>ve.jsx("option",{value:O},Q))})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Return type"}),ve.jsxs("select",{style:{width:"100%",padding:"8px 0 8px 0",...te},value:u,onChange:O=>{d(O.target.value),P(!0)},children:[ve.jsx("option",{value:"boolean",children:"boolean"}),ve.jsx("option",{value:"string",children:"string"}),ve.jsx("option",{value:"number",children:"number"}),ve.jsx("option",{value:"object",children:"object"})]})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Code default"}),ve.jsx("input",{style:{width:"100%",maxWidth:"800px",padding:"8px",boxSizing:"border-box",...te},name:"code-default",value:m,onChange:O=>{p(O.target.value),P(!0)}}),ve.jsx("p",{style:{fontSize:"small",color:"var(--md-code-fg-color)",marginTop:"4px"},children:"The default value to use when defaultVariant is null/omitted, or when errors occur during evaluation."})]}),ve.jsxs("div",{children:[ve.jsx("h4",{children:"Evaluation context"}),ve.jsx("div",{style:{backgroundColor:te.backgroundColor},children:ve.jsx(a0,{theme:K,width:"100%",height:"80px",language:"json",options:{minimap:{enabled:!1},lineNumbers:"off",folding:!1},beforeMount:u0,value:R,onChange:O=>{O&&(C(O),P(!0))}})})]}),ve.jsxs("div",{style:{display:"flex",gap:"8px",paddingTop:"8px"},children:[ve.jsx("button",{className:"md-button md-button--primary",onClick:O=>{T(O),he()},disabled:!x||!_,children:"Evaluate"}),ve.jsx("button",{className:"md-button",onClick:O=>{T(O),k()},children:"Reset"}),ve.jsx("button",{className:"md-button",onClick:O=>{T(O),E()},disabled:!x||!_,children:"Share"})]}),ve.jsxs("div",{className:`output ${L?"visible":""} admonition ${Y==="success"?"success":"failure"}`,children:[ve.jsx("p",{className:"admonition-title",children:Y==="success"?"Success":"Failure"}),typeof de=="object"?ve.jsxs("div",{style:{margin:"0.6rem 0 0.6rem 0"},children:[Object.entries(de).map(([O,Q])=>ve.jsxs("div",{children:[ve.jsxs("strong",{children:[O,":"]})," ",JSON.stringify(Q)]},O)),g&&de.value===void 0&&ve.jsxs("div",{children:[ve.jsx("strong",{children:"value:"})," ",g]})]}):ve.jsx("p",{children:de})]}),b&&ve.jsx("h4",{className:"admonition-title",style:{paddingLeft:"45px",borderLeftWidth:"0rem",borderLeftStyle:"solid",left:"15px"},children:"URL copied to clipboard"})]})]})]})]})}ab.createRoot(document.getElementById("playground")).render(ve.jsx(Qn.StrictMode,{children:ve.jsx(uw,{})}));let o0=!1;new MutationObserver(()=>{document.getElementById("playground")?o0&&window.location.reload():o0=!0}).observe(document.body,{childList:!0,subtree:!0}); diff --git a/docs/reference/custom-operations/fractional-operation.md b/docs/reference/custom-operations/fractional-operation.md index b57809f10..75db3c911 100644 --- a/docs/reference/custom-operations/fractional-operation.md +++ b/docs/reference/custom-operations/fractional-operation.md @@ -72,9 +72,9 @@ The bucketing value expression can be omitted, in which case a concatenation of The `fractional` operation is a custom JsonLogic operation which deterministically selects a variant based on the defined distribution of each variant (as a relative weight). This works by hashing ([murmur3](https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp)) -the given data point, converting it into an int in the range [0, 99]. -Whichever range this int falls in decides which variant -is selected. +the given data point and using an algorithm leveraging pure integer arithmetic, with `math.MaxInt32` (2,147,483,647) as the maximum weight sum. +This provides consistent, efficient, sub-percent granularity (down to ~0.00000005%) for high-throughput environments. +Whichever bucket this falls in decides which variant is selected. As hashing is deterministic we can be sure to get the same result every time for the same data point. The `fractional` operation can be added as part of a targeting definition. @@ -86,7 +86,7 @@ The other elements in the array are nested arrays with the first element represe There is no limit to the number of elements. > [!NOTE] -> Older versions of the `fractional` operation were percentage based, and required all variants weights to sum to 100. +> Previous versions of the `fractional` operation used percentage-based weights that had to sum to 100 and were limited to 1% precision. ## Example @@ -160,6 +160,117 @@ Result: Notice that rerunning either curl command will always return the same variant and value. The only way to get a different value is to change the email or update the `fractional` configuration. +## Nested Fractional Evaluation + +The `fractional` operation supports nested JSONLogic expressions within its arguments, enabling advanced use cases. + +### Nested Conditional Variants + +Conditional logic within each bucket: + +```json +"fractional": [ + [ + { + "if": [ + { "in": [{ "var": "locale" }, ["us", "ca"]] }, + "red", + "grey" + ] + }, + 25 + ], + [ + "blue", + 25 + ], + [ + "green", + 25 + ], + [ + "grey", + 25 + ] +] +``` + +### Computed Weights with JSONLogic + +Weight values can be JSONLogic expressions, enabling progressive rollouts and dynamic traffic splitting without a dedicated operator. +This allows you to use arbitrary JSONLogic expressions to compute weights at runtime. +This is especially useful for time-based weight calculations. + +#### Time-Based Rollout Example + +Use flagd's built-in `$flagd.timestamp` variable to create time-based progressive rollouts. +The timestamp is in Unix epoch seconds. + +```jsonc +{ + "fractional": [ + ["on", { "-": [{ "var": "$flagd.timestamp" }, 1743360000] }], + ["off", { "-": [1743964800, { "var": "$flagd.timestamp" }] }] + ] +} +``` + +As time advances, the weight of `"on"` grows and `"off"` shrinks, producing a deterministic progressive rollout. +This example: + +- Starts on Mar 30, 2025 (timestamp `1743360000`) +- Completes on Apr 6, 2025 (timestamp `1743964800`, 7 days later) + +#### Environment-Based Rollout Example + +Roll out differently based on environment: + +```json +"fractional": [ + { "var": "email" }, + ["new-feature", { + "if": [ + { "==": [{ "var": "environment" }, "production"] }, + 10, + { + "if": [ + { "==": [{ "var": "environment" }, "staging"] }, + 50, + 100 + ] + } + ] + }], + ["control", { + "if": [ + { "==": [{ "var": "environment" }, "production"] }, + 90, + { + "if": [ + { "==": [{ "var": "environment" }, "staging"] }, + 50, + 0 + ] + } + ] + }] +] +``` + +#### High Precision Example + +Use large weight values for sub-percent granularity in high-traffic environments: + +```json +"fractional": [ + { "var": "user_id" }, + ["canary", 1], + ["control", 1000000] +] +``` + +This splits approximately 1/1,000,000 of traffic to `canary` and the remaining to `control`. + ### Migrating from legacy "fractionalEvaluation" If you are using a legacy fractional evaluation (`fractionalEvaluation`), it's recommended you migrate to `fractional`. diff --git a/docs/reference/specifications/protos.md b/docs/reference/specifications/protos.md index 9840f2306..4cf1bae25 100644 --- a/docs/reference/specifications/protos.md +++ b/docs/reference/specifications/protos.md @@ -321,7 +321,9 @@ FetchAllFlagsRequest is the request to fetch all flags. Clients send this reques | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider_id | [string](#string) | | Optional: A unique identifier for clients initiating the request. The server implementations may utilize this identifier to uniquely identify, validate(ex:- enforce authentication/authorization) and filter flag configurations that it can expose to this request. This field is intended to be optional. However server implementations may enforce it. ex:- provider_id: flagd-weatherapp-sidecar | -| selector | [string](#string) | | Optional: A selector for the flag configuration request. The server implementation may utilize this to select flag configurations from a collection, select the source of the flag or combine this to any desired underlying filtering mechanism. ex:- selector: 'source=database,app=weatherapp' | +| selector | [string](#string) | | **Deprecated.** Optional: A selector for the flag configuration request. The server implementation may utilize this to select flag configurations from a collection, select the source of the flag or combine this to any desired underlying filtering mechanism. ex:- selector: 'source=database,app=weatherapp' + +Deprecated: Use the 'Flagd-Selector' header instead. Remember to reserve field number 2 if this is removed; | @@ -379,7 +381,9 @@ Implementations of Flagd providers and Flagd itself send this request, acting as | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | provider_id | [string](#string) | | Optional: A unique identifier for flagd(grpc client) initiating the request. The server implementations may utilize this identifier to uniquely identify, validate(ex:- enforce authentication/authorization) and filter flag configurations that it can expose to this request. This field is intended to be optional. However server implementations may enforce it. ex:- provider_id: flagd-weatherapp-sidecar | -| selector | [string](#string) | | Optional: A selector for the flag configuration request. The server implementation may utilize this to select flag configurations from a collection, select the source of the flag or combine this to any desired underlying filtering mechanism. ex:- selector: 'source=database,app=weatherapp' | +| selector | [string](#string) | | **Deprecated.** Optional: A selector for the flag configuration request. The server implementation may utilize this to select flag configurations from a collection, select the source of the flag or combine this to any desired underlying filtering mechanism. ex:- selector: 'source=database,app=weatherapp' + +Deprecated: Use the 'Flagd-Selector' header instead. Remember to reserve field number 2 if this is removed; | diff --git a/docs/schema/v0/targeting.json b/docs/schema/v0/targeting.json index 4409c3e37..f8dd7544f 100644 --- a/docs/schema/v0/targeting.json +++ b/docs/schema/v0/targeting.json @@ -35,7 +35,7 @@ "type": "string" }, { - "description": "When returned from rules, strings are used to as keys to retrieve the associated value from the \"variants\" object. Be sure that the returned string is present as a key in the variants!.", + "description": "When returned from rules, the behavior of arrays is not defined.", "type": "array" } ] @@ -461,18 +461,26 @@ "maxItems": 2, "items": [ { - "description": "If this bucket is randomly selected, this string is used to as a key to retrieve the associated value from the \"variants\" object.", - "type": "string" + "description": "If this bucket is randomly selected, this JSONLogic will be evaluated, and the result will be used as the variant key to return from the variants map.", + "$ref": "#/definitions/args" }, { - "description": "Weighted distribution for this variant key.", - "type": "number" + "description": "Weighted distribution for this variant key. Must be a non-negative integer. Can be a JSONLogic expression that evaluates to a number (e.g. for time-based progressive rollouts); computed negative weights are clamped to 0 at evaluation time. The total weight sum across all variants must not exceed 2,147,483,647.", + "oneOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "$ref": "#/definitions/anyRule" + } + ] } ] }, "fractionalOp": { "type": "array", - "minItems": 3, + "minItems": 1, "$comment": "there seems to be a bug here, where ajv gives a warning (not an error) because maxItems doesn't equal the number of entries in items, though this is valid in this case", "items": [ { @@ -492,7 +500,7 @@ }, "fractionalShorthandOp": { "type": "array", - "minItems": 2, + "minItems": 1, "items": { "$ref": "#/definitions/fractionalWeightArg" } diff --git a/playground-app/package-lock.json b/playground-app/package-lock.json index 9a120b4ab..e9c8413a1 100644 --- a/playground-app/package-lock.json +++ b/playground-app/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "dependencies": { "@monaco-editor/react": "^4.7.0-rc.0", - "@openfeature/flagd-core": "^2.0.0", + "@openfeature/flagd-core": "^3.0.0", "js-yaml": "^4.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -816,9 +816,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -890,9 +890,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -1138,9 +1138,9 @@ "peer": true }, "node_modules/@openfeature/flagd-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@openfeature/flagd-core/-/flagd-core-2.0.0.tgz", - "integrity": "sha512-9H3FOFQTtQ/I1sOKTwowXMJg+qYisWZMebfkJb35q/V9dOIkKEdvC5MAmoLn7OF0JfpuMteQLuBJ08R133Mpog==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@openfeature/flagd-core/-/flagd-core-3.0.0.tgz", + "integrity": "sha512-K8QFN+7lMUTqHX1nK/1YiS0CR7NX9UyrfFu9MI1hFGzPtJKf0ohFad4q8buwEre0e3jIWBDbxKqFIRBrtr4qLw==", "license": "Apache-2.0", "dependencies": { "imurmurhash": "^0.1.4", @@ -1862,9 +1862,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -2250,9 +2250,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -2479,10 +2479,11 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2951,10 +2952,11 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3387,9 +3389,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -3597,9 +3599,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { diff --git a/playground-app/package.json b/playground-app/package.json index 09a4243b9..34f35f640 100644 --- a/playground-app/package.json +++ b/playground-app/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@monaco-editor/react": "^4.7.0-rc.0", - "@openfeature/flagd-core": "^2.0.0", + "@openfeature/flagd-core": "^3.0.0", "js-yaml": "^4.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/playground-app/src/App.tsx b/playground-app/src/App.tsx index 11816b283..dd0bfb3a0 100644 --- a/playground-app/src/App.tsx +++ b/playground-app/src/App.tsx @@ -84,6 +84,7 @@ function App() { getPalette() ); const [featureDefinitionLanguage, setFeatureDefinitionLanguage] = useState(LANG_JSON); + const [isCustomScenario, setIsCustomScenario] = useState(false); const handleLanguageSwitch = useCallback(() => { try { @@ -94,6 +95,7 @@ function App() { setFeatureDefinition(yamlToPrettyJson(featureDefinition)); } setFeatureDefinitionLanguage(newLang); + setIsCustomScenario(true); const url = new URL(window.location.href); url.searchParams.set('lang', newLang); window.history.replaceState({}, '', url.href); @@ -115,8 +117,9 @@ function App() { setDescription(template.description); setValidFeatureDefinition(true); setValidEvaluationContext(true); - setShowCopyNotification(false) + setShowCopyNotification(false); setStatus("success"); + setIsCustomScenario(false); }, [selectedTemplate]); useEffect(() => { @@ -187,6 +190,7 @@ function App() { } setFeatureDefinition(formattedFeatureDefinition); setFeatureDefinitionLanguage(lang); + setIsCustomScenario(true); if (flagKeyParam) setFlagKey(flagKeyParam); if (returnTypeParam) setReturnType(returnTypeParam as FlagValueType); if (codeDefaultParam) setCodeDefault(codeDefaultParam); @@ -198,9 +202,9 @@ function App() { } catch (error) { console.error("Error decoding URL parameters: ", error); } - } else if (scenarioParam && scenarios[scenarioParam as keyof typeof scenarios]) { - setSelectedTemplate(scenarioParam as keyof typeof scenarios); - setFeatureDefinition(scenarios[scenarioParam as keyof typeof scenarios].flagDefinition); + } else if (scenarioParam && scenarios[decodeURIComponent(scenarioParam) as keyof typeof scenarios]) { + setSelectedTemplate(decodeURIComponent(scenarioParam) as keyof typeof scenarios); + setFeatureDefinition(scenarios[decodeURIComponent(scenarioParam) as keyof typeof scenarios].flagDefinition); } }, []); @@ -304,8 +308,7 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { const encodedFeatureDefinition = yamlToCompactJson(featureDefinition); const encodedEvaluationContext = yamlToCompactJson(evaluationContext); - if (Object.keys(scenarios).includes(selectedTemplate) && - scenarios[selectedTemplate].flagDefinition === featureDefinition) { + if (Object.keys(scenarios).includes(selectedTemplate) && !isCustomScenario) { newUrl.searchParams.set('scenario-name', selectedTemplate); } else { newUrl.searchParams.delete('scenario-name'); @@ -329,6 +332,19 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { }); }; + const handleButtonClick = (e: React.MouseEvent) => { + + // resize and darken the button briefly to give click feedback + const button = e.currentTarget; + const originalBg = button.style.backgroundColor; + button.style.backgroundColor = 'rgba(0, 0, 0, 0.2)'; + button.style.transform = 'scale(0.95)'; + setTimeout(() => { + button.style.backgroundColor = originalBg; + button.style.transform = ''; + }, 150); + }; + return (
{ + handleButtonClick(e); + handleLanguageSwitch(); + }} > Switch to {featureDefinitionLanguage === LANG_JSON ? "YAML" : "JSON"} @@ -432,6 +451,7 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { onChange={(value) => { if (value) { setFeatureDefinition(value); + setIsCustomScenario(true); } }} /> @@ -455,7 +475,10 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { name="flag-key" list="flag-keys" value={flagKey} - onChange={(e) => setFlagKey(e.target.value)} + onChange={(e) => { + setFlagKey(e.target.value); + setIsCustomScenario(true); + }} /> {autocompleteFlagKeys.map((key, index) => ( @@ -472,7 +495,10 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { ...codeStyle, }} value={returnType} - onChange={(e) => setReturnType(e.target.value as FlagValueType)} + onChange={(e) => { + setReturnType(e.target.value as FlagValueType); + setIsCustomScenario(true); + }} > @@ -492,7 +518,10 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { }} name="code-default" value={codeDefault} - onChange={(e) => setCodeDefault(e.target.value)} + onChange={(e) => { + setCodeDefault(e.target.value); + setIsCustomScenario(true); + }} />

The default value to use when defaultVariant is null/omitted, or when errors occur during evaluation. @@ -517,6 +546,7 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any { onChange={(value) => { if (value) { setEvaluationContext(value); + setIsCustomScenario(true); } }} /> @@ -525,17 +555,26 @@ function parseCodeDefault(codeDefault: string, returnType: FlagValueType): any {

-