From 6c3b099c25661e9517c9d0d2e3a5aa37dd380d1a Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Tue, 1 Apr 2025 17:08:05 +0200 Subject: [PATCH 001/172] Add acme.httpChallenge.delay option --- docs/content/https/acme.md | 28 ++++++++++++ .../tls/certificate-resolvers/acme.md | 43 ++++++++++--------- .../reference/static-configuration/cli-ref.md | 3 ++ .../reference/static-configuration/env-ref.md | 3 ++ .../reference/static-configuration/file.toml | 2 + .../reference/static-configuration/file.yaml | 2 + pkg/provider/acme/provider.go | 6 ++- 7 files changed, 64 insertions(+), 23 deletions(-) diff --git a/docs/content/https/acme.md b/docs/content/https/acme.md index 0a662e373..f8c8d996b 100644 --- a/docs/content/https/acme.md +++ b/docs/content/https/acme.md @@ -250,6 +250,34 @@ when using the `HTTP-01` challenge, `certificatesresolvers.myresolver.acme.httpc !!! info "" Redirection is fully compatible with the `HTTP-01` challenge. +#### `Delay` + +The delay between the creation of the challenge and the validation. +A value lower than or equal to zero means no delay. + +```yaml tab="File (YAML)" +certificatesResolvers: + myresolver: + acme: + # ... + httpChallenge: + # ... + delay: 12 +``` + +```toml tab="File (TOML)" +[certificatesResolvers.myresolver.acme] + # ... + [certificatesResolvers.myresolver.acme.httpChallenge] + # ... + delay = 12 +``` + +```bash tab="CLI" +# ... +--certificatesresolvers.myresolver.acme.httpchallenge.delay=12 +``` + ### `dnsChallenge` Use the `DNS-01` challenge to generate and renew ACME certificates by provisioning a DNS record. diff --git a/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md b/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md index 1b05bde5a..ec425f38a 100644 --- a/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md +++ b/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md @@ -73,27 +73,28 @@ certificatesResolvers: ACME certificate resolvers have the following configuration options: -| Field | Description | Default | Required | -|:------------------|:--------------------|:-----------------------------------------------|:---------| -| `acme.email` | Email address used for registration. | "" | Yes | -| `acme.caServer` | CA server to use. | https://acme-v02.api.letsencrypt.org/directory | No | -| `acme.preferredChain` | Preferred chain to use. If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. If no match, the default offered chain will be used. | "" | No | -| `acme.keyType` | KeyType to use. | "RSA4096" | No | -| `acme.eab` | Enable external account binding.| | No | -| `acme.eab.kid` | Key identifier from External CA. | "" | No | -| `acme.eab.hmacEncoded` | HMAC key from External CA, should be in Base64 URL Encoding without padding format. | "" | No | -| `acme.certificatesDuration` | The certificates' duration in hours, exclusively used to determine renewal dates. | 2160 | No | -| `acme.dnsChallenge` | Enable DNS-01 challenge. More information [here](#dnschallenge). | - | No | -| `acme.dnsChallenge.provider` | DNS provider to use. | "" | No | -| `acme.dnsChallenge.resolvers` | DNS servers to resolve the FQDN authority. | [] | No | -| `acme.dnsChallenge.propagation.delayBeforeChecks` | By default, the provider will verify the TXT DNS challenge record before letting ACME verify. If `delayBeforeCheck` is greater than zero, this check is delayed for the configured duration in seconds. This is Useful if internal networks block external DNS queries. | 0s | No | -| `acme.dnsChallenge.propagation.disableChecks` | Disables the challenge TXT record propagation checks, before notifying ACME that the DNS challenge is ready. Please note that disabling checks can prevent the challenge from succeeding. | false | No | -| `acme.dnsChallenge.propagation.requireAllRNS` | Enables the challenge TXT record to be propagated to all recursive nameservers. If you have disabled authoritative nameservers checks (with `propagation.disableANSChecks`), it is recommended to check all recursive nameservers instead. | false | No | -| `acme.dnsChallenge.propagation.disableANSChecks` | Disables the challenge TXT record propagation checks against authoritative nameservers. This option will skip the propagation check against the nameservers of the authority (SOA). It should be used only if the nameservers of the authority are not reachable. | false | No | -| `acme.httpChallenge` | Enable HTTP-01 challenge. More information [here](#httpchallenge). | | No | -| `acme.httpChallenge.entryPoint` | EntryPoint to use for the HTTP-01 challenges. Must be reachable by Let's Encrypt through port 80 | "" | Yes | -| `acme.tlsChallenge` | Enable TLS-ALPN-01 challenge. Traefik must be reachable by Let's Encrypt through port 443. More information [here](#tlschallenge). | - | No | -| `acme.storage` | File path used for certificates storage. | "acme.json" | Yes | +| Field | Description | Default | Required | +|:--------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------|:---------| +| `acme.email` | Email address used for registration. | "" | Yes | +| `acme.caServer` | CA server to use. | https://acme-v02.api.letsencrypt.org/directory | No | +| `acme.preferredChain` | Preferred chain to use. If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. If no match, the default offered chain will be used. | "" | No | +| `acme.keyType` | KeyType to use. | "RSA4096" | No | +| `acme.eab` | Enable external account binding. | | No | +| `acme.eab.kid` | Key identifier from External CA. | "" | No | +| `acme.eab.hmacEncoded` | HMAC key from External CA, should be in Base64 URL Encoding without padding format. | "" | No | +| `acme.certificatesDuration` | The certificates' duration in hours, exclusively used to determine renewal dates. | 2160 | No | +| `acme.dnsChallenge` | Enable DNS-01 challenge. More information [here](#dnschallenge). | - | No | +| `acme.dnsChallenge.provider` | DNS provider to use. | "" | No | +| `acme.dnsChallenge.resolvers` | DNS servers to resolve the FQDN authority. | [] | No | +| `acme.dnsChallenge.propagation.delayBeforeChecks` | By default, the provider will verify the TXT DNS challenge record before letting ACME verify. If `delayBeforeCheck` is greater than zero, this check is delayed for the configured duration in seconds. This is Useful if internal networks block external DNS queries. | 0s | No | +| `acme.dnsChallenge.propagation.disableChecks` | Disables the challenge TXT record propagation checks, before notifying ACME that the DNS challenge is ready. Please note that disabling checks can prevent the challenge from succeeding. | false | No | +| `acme.dnsChallenge.propagation.requireAllRNS` | Enables the challenge TXT record to be propagated to all recursive nameservers. If you have disabled authoritative nameservers checks (with `propagation.disableANSChecks`), it is recommended to check all recursive nameservers instead. | false | No | +| `acme.dnsChallenge.propagation.disableANSChecks` | Disables the challenge TXT record propagation checks against authoritative nameservers. This option will skip the propagation check against the nameservers of the authority (SOA). It should be used only if the nameservers of the authority are not reachable. | false | No | +| `acme.httpChallenge` | Enable HTTP-01 challenge. More information [here](#httpchallenge). | | No | +| `acme.httpChallenge.entryPoint` | EntryPoint to use for the HTTP-01 challenges. Must be reachable by Let's Encrypt through port 80 | "" | Yes | +| `acme.httpChallenge.delay` | The delay between the creation of the challenge and the validation. A value lower than or equal to zero means no delay. | 0 | No | +| `acme.tlsChallenge` | Enable TLS-ALPN-01 challenge. Traefik must be reachable by Let's Encrypt through port 443. More information [here](#tlschallenge). | - | No | +| `acme.storage` | File path used for certificates storage. | "acme.json" | Yes | ## Automatic Certificate Renewal diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index dac410d21..b31e7db7d 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -174,6 +174,9 @@ CSR email addresses to use. `--certificatesresolvers..acme.httpchallenge`: Activate HTTP-01 Challenge. (Default: ```false```) +`--certificatesresolvers..acme.httpchallenge.delay`: +Delay between the creation of the challenge and the validation. (Default: ```0```) + `--certificatesresolvers..acme.httpchallenge.entrypoint`: HTTP challenge EntryPoint diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index b67909baa..159af8c16 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -174,6 +174,9 @@ CSR email addresses to use. `TRAEFIK_CERTIFICATESRESOLVERS__ACME_HTTPCHALLENGE`: Activate HTTP-01 Challenge. (Default: ```false```) +`TRAEFIK_CERTIFICATESRESOLVERS__ACME_HTTPCHALLENGE_DELAY`: +Delay between the creation of the challenge and the validation. (Default: ```0```) + `TRAEFIK_CERTIFICATESRESOLVERS__ACME_HTTPCHALLENGE_ENTRYPOINT`: HTTP challenge EntryPoint diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index d35cf897d..cee1df4b5 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -528,6 +528,7 @@ delayBeforeChecks = "42s" [certificatesResolvers.CertificateResolver0.acme.httpChallenge] entryPoint = "foobar" + delay = "42s" [certificatesResolvers.CertificateResolver0.acme.tlsChallenge] [certificatesResolvers.CertificateResolver0.tailscale] [certificatesResolvers.CertificateResolver1] @@ -558,6 +559,7 @@ delayBeforeChecks = "42s" [certificatesResolvers.CertificateResolver1.acme.httpChallenge] entryPoint = "foobar" + delay = "42s" [certificatesResolvers.CertificateResolver1.acme.tlsChallenge] [certificatesResolvers.CertificateResolver1.tailscale] diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 5b8361e08..e218b43e4 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -575,6 +575,7 @@ certificatesResolvers: disablePropagationCheck: true httpChallenge: entryPoint: foobar + delay: 42s tlsChallenge: {} tailscale: {} CertificateResolver1: @@ -611,6 +612,7 @@ certificatesResolvers: disablePropagationCheck: true httpChallenge: entryPoint: foobar + delay: 42s tlsChallenge: {} tailscale: {} experimental: diff --git a/pkg/provider/acme/provider.go b/pkg/provider/acme/provider.go index 9120ead27..2ff220100 100644 --- a/pkg/provider/acme/provider.go +++ b/pkg/provider/acme/provider.go @@ -20,6 +20,7 @@ import ( "github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/challenge" "github.com/go-acme/lego/v4/challenge/dns01" + "github.com/go-acme/lego/v4/challenge/http01" "github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/providers/dns" "github.com/go-acme/lego/v4/registration" @@ -106,7 +107,8 @@ type Propagation struct { // HTTPChallenge contains HTTP challenge configuration. type HTTPChallenge struct { - EntryPoint string `description:"HTTP challenge EntryPoint" json:"entryPoint,omitempty" toml:"entryPoint,omitempty" yaml:"entryPoint,omitempty" export:"true"` + EntryPoint string `description:"HTTP challenge EntryPoint" json:"entryPoint,omitempty" toml:"entryPoint,omitempty" yaml:"entryPoint,omitempty" export:"true"` + Delay ptypes.Duration `description:"Delay between the creation of the challenge and the validation." json:"delay,omitempty" toml:"delay,omitempty" yaml:"delay,omitempty" export:"true"` } // TLSChallenge contains TLS challenge configuration. @@ -351,7 +353,7 @@ func (p *Provider) getClient() (*lego.Client, error) { if p.HTTPChallenge != nil && len(p.HTTPChallenge.EntryPoint) > 0 { logger.Debug().Msg("Using HTTP Challenge provider.") - err = client.Challenge.SetHTTP01Provider(p.HTTPChallengeProvider) + err = client.Challenge.SetHTTP01Provider(p.HTTPChallengeProvider, http01.SetDelay(time.Duration(p.HTTPChallenge.Delay))) if err != nil { return nil, err } From d7d00175452f0929b699fca633aa8b077c313f6c Mon Sep 17 00:00:00 2001 From: Swastik Sarkar <40518186+sswastik02@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:40:05 +0530 Subject: [PATCH 002/172] Add unhealthy Interval to the health check configuration --- .../dynamic-configuration/docker-labels.yml | 1 + .../reference/dynamic-configuration/file.toml | 1 + .../reference/dynamic-configuration/file.yaml | 1 + .../kubernetes-crd-definition-v1.yml | 55 ++++- .../reference/dynamic-configuration/kv-ref.md | 1 + .../traefik.io_ingressroutes.yaml | 11 +- .../traefik.io_middlewares.yaml | 11 +- .../traefik.io_traefikservices.yaml | 33 ++- .../http/load-balancing/service.md | 60 +++--- .../kubernetes/crd/http/ingressroute.md | 101 ++++----- .../kubernetes/crd/http/traefikservice.md | 199 +++++++++--------- .../other-providers/consul-catalog.md | 8 + .../other-providers/docker.md | 8 + .../other-providers/ecs.md | 8 + .../other-providers/kv.md | 8 + .../other-providers/nomad.md | 8 + .../other-providers/swarm.md | 8 + .../routing/providers/consul-catalog.md | 8 + docs/content/routing/providers/docker.md | 8 + docs/content/routing/providers/ecs.md | 8 + docs/content/routing/providers/kv.md | 8 + docs/content/routing/providers/nomad.md | 8 + docs/content/routing/providers/swarm.md | 8 + docs/content/routing/services/index.md | 5 +- integration/fixtures/k8s/01-traefik-crd.yml | 55 ++++- pkg/config/dynamic/http_config.go | 23 +- pkg/config/dynamic/zz_generated.deepcopy.go | 5 + pkg/config/label/label_test.go | 76 ++++--- pkg/healthcheck/healthcheck.go | 107 +++++++--- pkg/healthcheck/healthcheck_test.go | 62 +++++- .../kubernetes/crd/kubernetes_http.go | 12 ++ .../kubernetes/crd/kubernetes_test.go | 36 ++-- .../crd/traefikio/v1alpha1/ingressroute.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 5 + pkg/provider/kv/kv_test.go | 18 +- .../components/_commons/PanelHealthCheck.vue | 16 +- 36 files changed, 701 insertions(+), 295 deletions(-) diff --git a/docs/content/reference/dynamic-configuration/docker-labels.yml b/docs/content/reference/dynamic-configuration/docker-labels.yml index d6534790b..b2af3def6 100644 --- a/docs/content/reference/dynamic-configuration/docker-labels.yml +++ b/docs/content/reference/dynamic-configuration/docker-labels.yml @@ -209,6 +209,7 @@ - "traefik.http.services.service02.loadbalancer.healthcheck.scheme=foobar" - "traefik.http.services.service02.loadbalancer.healthcheck.status=42" - "traefik.http.services.service02.loadbalancer.healthcheck.timeout=42s" +- "traefik.http.services.service02.loadbalancer.healthcheck.unhealthyinterval=42s" - "traefik.http.services.service02.loadbalancer.passhostheader=true" - "traefik.http.services.service02.loadbalancer.responseforwarding.flushinterval=42s" - "traefik.http.services.service02.loadbalancer.serverstransport=foobar" diff --git a/docs/content/reference/dynamic-configuration/file.toml b/docs/content/reference/dynamic-configuration/file.toml index 9915ff223..202815c39 100644 --- a/docs/content/reference/dynamic-configuration/file.toml +++ b/docs/content/reference/dynamic-configuration/file.toml @@ -84,6 +84,7 @@ status = 42 port = 42 interval = "42s" + unhealthyInterval = "42s" timeout = "42s" hostname = "foobar" followRedirects = true diff --git a/docs/content/reference/dynamic-configuration/file.yaml b/docs/content/reference/dynamic-configuration/file.yaml index 30f0afa59..e8210ef85 100644 --- a/docs/content/reference/dynamic-configuration/file.yaml +++ b/docs/content/reference/dynamic-configuration/file.yaml @@ -89,6 +89,7 @@ http: status: 42 port: 42 interval: 42s + unhealthyInterval: 42s timeout: 42s hostname: foobar followRedirects: true diff --git a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml index f14cce498..0541d1607 100644 --- a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml +++ b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml @@ -136,7 +136,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -172,6 +172,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -1070,7 +1079,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -1106,6 +1115,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -2743,7 +2761,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -2779,6 +2797,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -2828,7 +2855,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -2864,6 +2891,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -3167,7 +3203,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -3203,6 +3239,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. diff --git a/docs/content/reference/dynamic-configuration/kv-ref.md b/docs/content/reference/dynamic-configuration/kv-ref.md index 65f3b8760..c40c0545d 100644 --- a/docs/content/reference/dynamic-configuration/kv-ref.md +++ b/docs/content/reference/dynamic-configuration/kv-ref.md @@ -281,6 +281,7 @@ THIS FILE MUST NOT BE EDITED BY HAND | `traefik/http/services/Service02/loadBalancer/healthCheck/scheme` | `foobar` | | `traefik/http/services/Service02/loadBalancer/healthCheck/status` | `42` | | `traefik/http/services/Service02/loadBalancer/healthCheck/timeout` | `42s` | +| `traefik/http/services/Service02/loadBalancer/healthCheck/unhealthyInterval` | `42s` | | `traefik/http/services/Service02/loadBalancer/passHostHeader` | `true` | | `traefik/http/services/Service02/loadBalancer/responseForwarding/flushInterval` | `42s` | | `traefik/http/services/Service02/loadBalancer/servers/0/preservePath` | `true` | diff --git a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml index ed13f3d51..c01206e14 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_ingressroutes.yaml @@ -136,7 +136,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -172,6 +172,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. diff --git a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml index 0f576eb39..798caa505 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml @@ -301,7 +301,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -337,6 +337,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. diff --git a/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml b/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml index 340b36f68..3494097bd 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_traefikservices.yaml @@ -71,7 +71,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -107,6 +107,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -156,7 +165,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -192,6 +201,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -495,7 +513,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -531,6 +549,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. diff --git a/docs/content/reference/routing-configuration/http/load-balancing/service.md b/docs/content/reference/routing-configuration/http/load-balancing/service.md index eaa665417..43b94d88d 100644 --- a/docs/content/reference/routing-configuration/http/load-balancing/service.md +++ b/docs/content/reference/routing-configuration/http/load-balancing/service.md @@ -1,7 +1,7 @@ --- title: "Traefik HTTP Services Documentation" description: "A service is in charge of connecting incoming requests to the Servers that can handle them. Read the technical documentation." ---- +--- ## Service Load Balancer @@ -70,7 +70,6 @@ labels: ```json tab="Tags" { - // ... "Tags": [ "traefik.http.services.my-service.loadBalancer.servers[0].url=http://private-ip-server-1/", "traefik.http.services.my-service.loadBalancer.servers[0].weight=2", @@ -88,15 +87,15 @@ labels: ### Configuration Options -| Field | Description | Required | -|----------|------------------------------------------|----------| -|`servers`| Represents individual backend instances for your service | Yes | -|`sticky`| Defines a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response. | No | -|`healthcheck`| Configures health check to remove unhealthy servers from the load balancing rotation. | No | -|`passHostHeader`| Allows forwarding of the client Host header to server. By default, `passHostHeader` is true. | No | -|`serversTransport`| Allows to reference an [HTTP ServersTransport](./serverstransport.md) configuration for the communication between Traefik and your servers. If no `serversTransport` is specified, the `default@internal` will be used. | No | -| `responseForwarding` | Configures how Traefik forwards the response from the backend server to the client.| No | -| `responseForwarding.FlushInterval` | Specifies the interval in between flushes to the client while copying the response body. It is a duration in milliseconds, defaulting to 100ms. A negative value means to flush immediately after each write to the client. The `FlushInterval` is ignored when ReverseProxy recognizes a response as a streaming response; for such responses, writes are flushed to the client immediately. | No | +| Field | Description | Required | +|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------| +| `servers` | Represents individual backend instances for your service | Yes | +| `sticky` | Defines a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response. | No | +| `healthcheck` | Configures health check to remove unhealthy servers from the load balancing rotation. | No | +| `passHostHeader` | Allows forwarding of the client Host header to server. By default, `passHostHeader` is true. | No | +| `serversTransport` | Allows to reference an [HTTP ServersTransport](./serverstransport.md) configuration for the communication between Traefik and your servers. If no `serversTransport` is specified, the `default@internal` will be used. | No | +| `responseForwarding` | Configures how Traefik forwards the response from the backend server to the client. | No | +| `responseForwarding.FlushInterval` | Specifies the interval in between flushes to the client while copying the response body. It is a duration in milliseconds, defaulting to 100ms. A negative value means to flush immediately after each write to the client. The `FlushInterval` is ignored when ReverseProxy recognizes a response as a streaming response; for such responses, writes are flushed to the client immediately. | No | #### Servers @@ -104,11 +103,11 @@ Servers represent individual backend instances for your service. The [service lo ##### Configuration Options -| Field | Description | Required | -|----------|------------------------------------------|----------| -|`url`| Points to a specific instance. | Yes for File provider, No for [Docker provider](../../other-providers/docker.md) | -|`weight`| Allows for weighted load balancing on the servers. | No | -|`preservePath`| Allows to preserve the URL path. | No | +| Field | Description | Required | +|----------------|----------------------------------------------------|----------------------------------------------------------------------------------| +| `url` | Points to a specific instance. | Yes for File provider, No for [Docker provider](../../other-providers/docker.md) | +| `weight` | Allows for weighted load balancing on the servers. | No | +| `preservePath` | Allows to preserve the URL path. | No | #### Health Check @@ -118,20 +117,21 @@ To propagate status changes (e.g. all servers of this service are down) upwards, Below are the available options for the health check mechanism: -| Field | Description | Default | Required | -|----------|------------------------------------------|----------|--------| -|`path`| Defines the server URL path for the health check endpoint. | "" | Yes | -|`scheme`| Replaces the server URL scheme for the health check endpoint. | | No | -|`mode`| If defined to `grpc`, will use the gRPC health check protocol to probe the server. | http | No | -|`hostname`| Defines the value of hostname in the Host header of the health check request. | "" | No | -|`port`| Replaces the server URL port for the health check endpoint. | | No | -|`interval`| Defines the frequency of the health check calls. | 30s | No | -|`timeout`| Defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. | 5s | No | -|`headers`| Defines custom headers to be sent to the health check endpoint. | | No | -|`followRedirects`| Defines whether redirects should be followed during the health check calls. | true | No | -|`hostname`| Defines the value of hostname in the Host header of the health check request. | "" | No | -|`method`| Defines the HTTP method that will be used while connecting to the endpoint. | GET | No | -|`status`| Defines the expected HTTP status code of the response to the health check request. | | No | +| Field | Description | Default | Required | +|---------------------|-------------------------------------------------------------------------------------------------------------------------------|---------|----------| +| `path` | Defines the server URL path for the health check endpoint. | "" | Yes | +| `scheme` | Replaces the server URL scheme for the health check endpoint. | | No | +| `mode` | If defined to `grpc`, will use the gRPC health check protocol to probe the server. | http | No | +| `hostname` | Defines the value of hostname in the Host header of the health check request. | "" | No | +| `port` | Replaces the server URL port for the health check endpoint. | | No | +| `interval` | Defines the frequency of the health check calls for healthy targets. | 30s | No | +| `unhealthyInterval` | Defines the frequency of the health check calls for unhealthy targets. When not defined, it defaults to the `interval` value. | 30s | No | +| `timeout` | Defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. | 5s | No | +| `headers` | Defines custom headers to be sent to the health check endpoint. | | No | +| `followRedirects` | Defines whether redirects should be followed during the health check calls. | true | No | +| `hostname` | Defines the value of hostname in the Host header of the health check request. | "" | No | +| `method` | Defines the HTTP method that will be used while connecting to the endpoint. | GET | No | +| `status` | Defines the expected HTTP status code of the response to the health check request. | | No | ## Weighted Round Robin (WRR) diff --git a/docs/content/reference/routing-configuration/kubernetes/crd/http/ingressroute.md b/docs/content/reference/routing-configuration/kubernetes/crd/http/ingressroute.md index f1ceb293c..255f75212 100644 --- a/docs/content/reference/routing-configuration/kubernetes/crd/http/ingressroute.md +++ b/docs/content/reference/routing-configuration/kubernetes/crd/http/ingressroute.md @@ -74,56 +74,57 @@ spec: ## Configuration Options -| Field | Description | Default | Required | -|:------|:----------------------------------------------------------|:---------------------|:---------| -| `entryPoints` | List of [entry points](../../../../install-configuration/entrypoints.md) names.
If not specified, HTTP routers will accept requests from all EntryPoints in the list of default EntryPoints. | | No | -| `routes` | List of routes. | | Yes | -| `routes[n].kind` | Kind of router matching, only `Rule` is allowed yet. | "Rule" | No | -| `routes[n].match` | Defines the [rule](../../../http/router/rules-and-priority.md#rules) corresponding to an underlying router. | | Yes | -| `routes[n].priority` | Defines the [priority](../../../http/router/rules-and-priority.md#priority-calculation) to disambiguate rules of the same length, for route matching.
If not set, the priority is directly equal to the length of the rule, and so the longest length has the highest priority.
A value of `0` for the priority is ignored, the default rules length sorting is used. | 0 | No | -| `routes[n].middlewares` | List of middlewares to attach to the IngressRoute.
More information [here](#middleware). | "" | No | -| `routes[n].`
`middlewares[m].`
`name` | Middleware name.
The character `@` is not authorized.
More information [here](#middleware). | | Yes | -| `routes[n].`
`middlewares[m].`
`namespace` | Middleware namespace.
Can be empty if the middleware belongs to the same namespace as the IngressRoute.
More information [here](#middleware). | | No | -| `routes[n].`
`observability.`
`accesslogs` | Defines whether the route will produce [access-logs](../../../../install-configuration/observability/logs-and-accesslogs.md). See [here](../../../http/router/observability.md) for more information. | false | No | -| `routes[n].`
`observability.`
`metrics` | Defines whether the route will produce [metrics](../../../../install-configuration/observability/metrics.md). See [here](../../../http/router/observability.md) for more information. | false | No | -| `routes[n].`
`observability.`
`tracing` | Defines whether the route will produce [traces](../../../../install-configuration/observability/tracing.md). See [here](../../../http/router/observability.md) for more information. | false | No | -| `routes[n].`
`services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
More information [here](#externalname-service). | | No | -| `routes[n].`
`services[m].`
`kind` | Kind of the service targeted.
Two values allowed:
- **Service**: Kubernetes Service
**TraefikService**: Traefik Service.
More information [here](#externalname-service). | "Service" | No | -| `routes[n].`
`services[m].`
`name` | Service name.
The character `@` is not authorized.
More information [here](#middleware). | | Yes | -| `routes[n].`
`services[m].`
`namespace` | Service namespace.
Can be empty if the service belongs to the same namespace as the IngressRoute.
More information [here](#externalname-service). | | No | -| `routes[n].`
`services[m].`
`port` | Service port (number or port name).
Evaluated only if the kind is **Service**. | | No | -| `routes[n].`
`services[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind is **Service**. | 100ms | No | -| `routes[n].`
`services[m].`
`scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | -| `routes[n].`
`services[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and your servers.
Evaluated only if the kind is **Service**. | "" | No | -| `routes[n].`
`services[m].`
`passHostHeader` | Forward client Host header to server.
Evaluated only if the kind is **Service**. | true | No | -| `routes[n].`
`services[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | -| `routes[n].`
`services[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "http" | No | -| `routes[n].`
`services[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | -| `routes[n].`
`services[m].`
`healthCheck.interval` | Frequency of the health check calls.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No | -| `routes[n].`
`services[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "GET" | No | -| `routes[n].`
`services[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind is **Service**. | | No | -| `routes[n].`
`services[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | | No | -| `routes[n].`
`services[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "5s" | No | -| `routes[n].`
`services[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | -| `routes[n].`
`services[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | true | No | -| `routes[n].`
`services[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service)). | | No | -| `routes[n].`
`services[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
Evaluated only if the kind is **Service**. | "" | No | -| `routes[n].`
`services[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind is **Service**. | false | No | -| `routes[n].`
`services[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind is **Service**. | false | No | -| `routes[n].`
`services[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind is **Service**. | "" | No | -| `routes[n].`
`services[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind is **Service**. | 0 | No | -| `routes[n].`
`services[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind is **Service**. | "RoundRobin" | No | -| `routes[n].`
`services[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | -| `routes[n].`
`services[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind is **Service**. | false | No | -| `routes[n].`
`services[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind is **Service**. | false | No | -| `tls` | TLS configuration.
Can be an empty value(`{}`):
A self signed is generated in such a case
(or the [default certificate](tlsstore.md) is used if it is defined.) | | No | -| `tls.secretName` | [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) name used to store the certificate (in the same namesapce as the `IngressRoute`) | "" | No | -| `tls.`
`options.name` | Name of the [`TLSOption`](tlsoption.md) to use.
More information [here](#tls-options). | "" | No | -| `tls.`
`options.namespace` | Namespace of the [`TLSOption`](tlsoption.md) to use. | "" | No | -| `tls.certResolver` | Name of the [Certificate Resolver](../../../../install-configuration/tls/certificate-resolvers/overview.md) to use to generate automatic TLS certificates. | "" | No | -| `tls.domains` | List of domains to serve using the certificates generates (one `tls.domain`= one certificate).
More information in the [dedicated section](../../../../install-configuration/tls/certificate-resolvers/acme.md#domain-definition). | | No | -| `tls.`
`domains[n].main` | Main domain name | "" | Yes | -| `tls.`
`domains[n].sans` | List of alternative domains (SANs) | | No | +| Field | Description | Default | Required | +|:---------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| +| `entryPoints` | List of [entry points](../../../../install-configuration/entrypoints.md) names.
If not specified, HTTP routers will accept requests from all EntryPoints in the list of default EntryPoints. | | No | +| `routes` | List of routes. | | Yes | +| `routes[n].kind` | Kind of router matching, only `Rule` is allowed yet. | "Rule" | No | +| `routes[n].match` | Defines the [rule](../../../http/router/rules-and-priority.md#rules) corresponding to an underlying router. | | Yes | +| `routes[n].priority` | Defines the [priority](../../../http/router/rules-and-priority.md#priority-calculation) to disambiguate rules of the same length, for route matching.
If not set, the priority is directly equal to the length of the rule, and so the longest length has the highest priority.
A value of `0` for the priority is ignored, the default rules length sorting is used. | 0 | No | +| `routes[n].middlewares` | List of middlewares to attach to the IngressRoute.
More information [here](#middleware). | "" | No | +| `routes[n].`
`middlewares[m].`
`name` | Middleware name.
The character `@` is not authorized.
More information [here](#middleware). | | Yes | +| `routes[n].`
`middlewares[m].`
`namespace` | Middleware namespace.
Can be empty if the middleware belongs to the same namespace as the IngressRoute.
More information [here](#middleware). | | No | +| `routes[n].`
`observability.`
`accesslogs` | Defines whether the route will produce [access-logs](../../../../install-configuration/observability/logs-and-accesslogs.md). See [here](../../../http/router/observability.md) for more information. | false | No | +| `routes[n].`
`observability.`
`metrics` | Defines whether the route will produce [metrics](../../../../install-configuration/observability/metrics.md). See [here](../../../http/router/observability.md) for more information. | false | No | +| `routes[n].`
`observability.`
`tracing` | Defines whether the route will produce [traces](../../../../install-configuration/observability/tracing.md). See [here](../../../http/router/observability.md) for more information. | false | No | +| `routes[n].`
`services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
More information [here](#externalname-service). | | No | +| `routes[n].`
`services[m].`
`kind` | Kind of the service targeted.
Two values allowed:
- **Service**: Kubernetes Service
**TraefikService**: Traefik Service.
More information [here](#externalname-service). | "Service" | No | +| `routes[n].`
`services[m].`
`name` | Service name.
The character `@` is not authorized.
More information [here](#middleware). | | Yes | +| `routes[n].`
`services[m].`
`namespace` | Service namespace.
Can be empty if the service belongs to the same namespace as the IngressRoute.
More information [here](#externalname-service). | | No | +| `routes[n].`
`services[m].`
`port` | Service port (number or port name).
Evaluated only if the kind is **Service**. | | No | +| `routes[n].`
`services[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind is **Service**. | 100ms | No | +| `routes[n].`
`services[m].`
`scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | +| `routes[n].`
`services[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and your servers.
Evaluated only if the kind is **Service**. | "" | No | +| `routes[n].`
`services[m].`
`passHostHeader` | Forward client Host header to server.
Evaluated only if the kind is **Service**. | true | No | +| `routes[n].`
`services[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | +| `routes[n].`
`services[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "http" | No | +| `routes[n].`
`services[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | +| `routes[n].`
`services[m].`
`healthCheck.interval` | Frequency of the health check calls for healthy targets.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No | +| `routes[n].`
`services[m].`
`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.
When not defined, it defaults to the `interval` value.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "100ms" | No | +| `routes[n].`
`services[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "GET" | No | +| `routes[n].`
`services[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind is **Service**. | | No | +| `routes[n].`
`services[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | | No | +| `routes[n].`
`services[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "5s" | No | +| `routes[n].`
`services[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | "" | No | +| `routes[n].`
`services[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service). | true | No | +| `routes[n].`
`services[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#externalname-service)). | | No | +| `routes[n].`
`services[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
Evaluated only if the kind is **Service**. | "" | No | +| `routes[n].`
`services[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind is **Service**. | false | No | +| `routes[n].`
`services[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind is **Service**. | false | No | +| `routes[n].`
`services[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind is **Service**. | "" | No | +| `routes[n].`
`services[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind is **Service**. | 0 | No | +| `routes[n].`
`services[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind is **Service**. | "RoundRobin" | No | +| `routes[n].`
`services[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | +| `routes[n].`
`services[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind is **Service**. | false | No | +| `routes[n].`
`services[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind is **Service**. | false | No | +| `tls` | TLS configuration.
Can be an empty value(`{}`):
A self signed is generated in such a case
(or the [default certificate](tlsstore.md) is used if it is defined.) | | No | +| `tls.secretName` | [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) name used to store the certificate (in the same namesapce as the `IngressRoute`) | "" | No | +| `tls.`
`options.name` | Name of the [`TLSOption`](tlsoption.md) to use.
More information [here](#tls-options). | "" | No | +| `tls.`
`options.namespace` | Namespace of the [`TLSOption`](tlsoption.md) to use. | "" | No | +| `tls.certResolver` | Name of the [Certificate Resolver](../../../../install-configuration/tls/certificate-resolvers/overview.md) to use to generate automatic TLS certificates. | "" | No | +| `tls.domains` | List of domains to serve using the certificates generates (one `tls.domain`= one certificate).
More information in the [dedicated section](../../../../install-configuration/tls/certificate-resolvers/acme.md#domain-definition). | | No | +| `tls.`
`domains[n].main` | Main domain name | "" | Yes | +| `tls.`
`domains[n].sans` | List of alternative domains (SANs) | | No | ### ExternalName Service diff --git a/docs/content/reference/routing-configuration/kubernetes/crd/http/traefikservice.md b/docs/content/reference/routing-configuration/kubernetes/crd/http/traefikservice.md index acda27c48..71bd5b2f4 100644 --- a/docs/content/reference/routing-configuration/kubernetes/crd/http/traefikservice.md +++ b/docs/content/reference/routing-configuration/kubernetes/crd/http/traefikservice.md @@ -148,42 +148,43 @@ data: ### Configuration Options -| Field | Description | Default | Required | -|:------|:----------------------------------------------------------|:---------------------|:---------| -| `services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
. | | No | -| `services[m].`
`kind` | Kind of the service targeted.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service. | "" | No | -| `services[m].`
`name` | Service name.
The character `@` is not authorized. | "" | Yes | -| `services[m].`
`namespace` | Service namespace. | "" | No | -| `services[m].`
`port` | Service port (number or port name).
Evaluated only if the kind is **Service**. | "" | No | -| `services[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind is **Service**. | 100ms | No | -| `services[m].`
`scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | -| `services[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and your servers.
Evaluated only if the kind is **Service**. | "" | No | -| `services[m].`
`passHostHeader` | Forward client Host header to server.
Evaluated only if the kind is **Service**. | true | No | -| `services[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | -| `services[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "http" | No | -| `services[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | -| `services[m].`
`healthCheck.interval` | Frequency of the health check calls.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No | -| `services[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "GET" | No | -| `services[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind is **Service**. | | No | -| `services[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No | -| `services[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "5s" | No | -| `services[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | -| `services[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | true | No | -| `services[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No | -| `services[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
Evaluated only if the kind is **Service**. | Abbreviation of a sha1
(ex: `_1d52e`). | No | -| `services[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind is **Service**. | false | No | -| `services[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind is **Service**. | false | No | -| `services[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind is **Service**. | "" | No | -| `services[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind is **Service**. | 0 | No | -| `services[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind is **Service**. | "RoundRobin" | No | -| `services[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | -| `services[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind is **Service**. | false | No | -| `services[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind is **Service**. | false | No | -| `sticky.`
`cookie.name` | Name of the cookie used for the stickiness at the WRR service level.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | Abbreviation of a sha1
(ex: `_1d52e`). | No | -| `sticky.`
`cookie.httpOnly` | Allow the cookie used for the stickiness at the WRR service level to be accessed by client-side APIs, such as JavaScript.
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | false | No | -| `sticky.`
`cookie.secure` | Allow the cookie used for the stickiness at the WRR service level to be only transmitted over an encrypted connection (i.e. HTTPS).
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | false | No | -| `sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy for the cookie used for the stickiness at the WRR service level.
Allowed values:
-`none`
-`lax`
`strict`
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | "" | No | -| `sticky.`
`cookie.maxAge` | Number of seconds until the cookie used for the stickiness at the WRR service level expires.
Negative number, the cookie expires immediately.
0, the cookie never expires. | 0 | No | +| Field | Description | Default | Required | +|:---------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| +| `services` | List of any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
. | | No | +| `services[m].`
`kind` | Kind of the service targeted.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service. | "" | No | +| `services[m].`
`name` | Service name.
The character `@` is not authorized. | "" | Yes | +| `services[m].`
`namespace` | Service namespace. | "" | No | +| `services[m].`
`port` | Service port (number or port name).
Evaluated only if the kind is **Service**. | "" | No | +| `services[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind is **Service**. | 100ms | No | +| `services[m].`
`scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | +| `services[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and your servers.
Evaluated only if the kind is **Service**. | "" | No | +| `services[m].`
`passHostHeader` | Forward client Host header to server.
Evaluated only if the kind is **Service**. | true | No | +| `services[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | +| `services[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "http" | No | +| `services[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | +| `services[m].`
`healthCheck.interval` | Frequency of the health check calls for healthy targets.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No | +| `services[m].`
`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.
When not defined, it defaults to the `interval` value.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName]`ExternalName`. | "100ms" | No | +| `services[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "GET" | No | +| `services[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind is **Service**. | | No | +| `services[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No | +| `services[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "5s" | No | +| `services[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | "" | No | +| `services[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | true | No | +| `services[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type `ExternalName`. | | No | +| `services[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
Evaluated only if the kind is **Service**. | Abbreviation of a sha1
(ex: `_1d52e`). | No | +| `services[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind is **Service**. | false | No | +| `services[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind is **Service**. | false | No | +| `services[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind is **Service**. | "" | No | +| `services[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind is **Service**. | 0 | No | +| `services[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind is **Service**. | "RoundRobin" | No | +| `services[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | +| `services[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind is **Service**. | false | No | +| `services[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind is **Service**. | false | No | +| `sticky.`
`cookie.name` | Name of the cookie used for the stickiness at the WRR service level.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | Abbreviation of a sha1
(ex: `_1d52e`). | No | +| `sticky.`
`cookie.httpOnly` | Allow the cookie used for the stickiness at the WRR service level to be accessed by client-side APIs, such as JavaScript.
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | false | No | +| `sticky.`
`cookie.secure` | Allow the cookie used for the stickiness at the WRR service level to be only transmitted over an encrypted connection (i.e. HTTPS).
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | false | No | +| `sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy for the cookie used for the stickiness at the WRR service level.
Allowed values:
-`none`
-`lax`
`strict`
More information about WRR stickiness [here](#stickiness-on-multiple-levels) | "" | No | +| `sticky.`
`cookie.maxAge` | Number of seconds until the cookie used for the stickiness at the WRR service level expires.
Negative number, the cookie expires immediately.
0, the cookie never expires. | 0 | No | #### Stickiness on multiple levels @@ -372,65 +373,67 @@ spec: The mirrored services properties are set in the `mirrors` list. -| Field | Description | Default | Required | -|:------|:----------------------------------------------------------|:---------------------|:---------| -| `kind` | Kind of the main service.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service.
More information [here](#services) | "" | No | -| `name` | Main service name.
The character `@` is not authorized. | "" | Yes | -| `namespace` | Main service namespace.
More information [here](#services). | "" | No | -| `port` | Main service port (number or port name).
Evaluated only if the kind of the main service is **Service**. | "" | No | -| `responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind of the main service is **Service**. | 100ms | No | -| `scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind of the main service is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | -| `serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and the main service's servers.
Evaluated only if the kind of the main service is **Service**. | "" | No | -| `passHostHeader` | Forward client Host header to main service's server.
Evaluated only if the kind of the main service is **Service**. | true | No | -| `healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | -| `healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `healthCheck.interval` | Frequency of the health check calls.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | -| `healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | -| `healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind of the main service is **Service**. | | No | -| `healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | -| `healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "5s" | No | -| `healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | true | No | -| `healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | -| `sticky.`
`cookie.name` | Name of the cookie used for the stickiness on the main service.
Evaluated only if the kind of the main service is **Service**. | Abbreviation of a sha1
(ex: `_1d52e`). | No | -| `sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind of the main service is **Service**. | false | No | -| `sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind of the main service is **Service**. | false | No | -| `sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind of the main service is **Service**. | "" | No | -| `sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind of the main service is **Service**. | 0 | No | -| `strategy` | Load balancing strategy between the main service's servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind of the main service is **Service**. | "RoundRobin" | No | -| `weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | -| `nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind of the main service is **Service**. | false | No | -| `nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind of the main service is **Service**. | false | No | -| `maxBodySize` | Maximum size allowed for the body of the request.
If the body is larger, the request is not mirrored.
-1 means unlimited size. | -1 | No | -| `mirrors` | List of mirrored services to target.
It can be any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
More information [here](#services). | | No | -| `mirrors[m].`
`kind` | Kind of the mirrored service targeted.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service.
More information [here](#services) | "" | No | -| `mirrors[m].`
`name` | Mirrored service name.
The character `@` is not authorized. | "" | Yes | -| `mirrors[m].`
`namespace` | Mirrored service namespace.
More information [here](#services). | "" | No | -| `mirrors[m].`
`port` | Mirrored service port (number or port name).
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | -| `mirrors[m].`
`percent` | Part of the traffic to mirror in percent (from 0 to 100) | 0 | No | -| `mirrors[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind of the mirrored service is **Service**. | 100ms | No | -| `mirrors[m].`
`scheme` | Scheme to use for the request to the mirrored service.
Evaluated only if the kind of the mirrored service is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | -| `mirrors[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and the mirrored service servers.
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | -| `mirrors[m].`
`passHostHeader` | Forward client Host header to the mirrored service servers.
Evaluated only if the kind of the mirrored service is **Service**. | true | No | -| `mirrors[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `mirrors[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | -| `mirrors[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `mirrors[m].`
`healthCheck.interval` | Frequency of the health check calls.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | -| `mirrors[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | -| `mirrors[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind of the mirrored service is **Service**. | | No | -| `mirrors[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | -| `mirrors[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "5s" | No | -| `mirrors[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | -| `mirrors[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | true | No | -| `mirrors[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | -| `mirrors[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | -| `mirrors[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | -| `mirrors[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind of the mirrored service is **Service**. | false | No | -| `mirrors[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | -| `mirrors[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind of the mirrored service is **Service**. | 0 | No | -| `mirrors[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind of the mirrored service is **Service**. | "RoundRobin" | No | -| `mirrors[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | -| `mirrors[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | -| `mirrors[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | -| `mirrorBody` | Defines whether the request body should be mirrored. | true | No | +| Field | Description | Default | Required | +|:--------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------|:---------| +| `kind` | Kind of the main service.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service.
More information [here](#services) | "" | No | +| `name` | Main service name.
The character `@` is not authorized. | "" | Yes | +| `namespace` | Main service namespace.
More information [here](#services). | "" | No | +| `port` | Main service port (number or port name).
Evaluated only if the kind of the main service is **Service**. | "" | No | +| `responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind of the main service is **Service**. | 100ms | No | +| `scheme` | Scheme to use for the request to the upstream Kubernetes Service.
Evaluated only if the kind of the main service is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | +| `serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and the main service's servers.
Evaluated only if the kind of the main service is **Service**. | "" | No | +| `passHostHeader` | Forward client Host header to main service's server.
Evaluated only if the kind of the main service is **Service**. | true | No | +| `healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | +| `healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `healthCheck.interval` | Frequency of the health check calls for healthy targets.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | +| `healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.
When not defined, it defaults to the `interval` value.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | +| `healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | +| `healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind of the main service is **Service**. | | No | +| `healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | +| `healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "5s" | No | +| `healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | true | No | +| `healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind of the main service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | +| `sticky.`
`cookie.name` | Name of the cookie used for the stickiness on the main service.
Evaluated only if the kind of the main service is **Service**. | Abbreviation of a sha1
(ex: `_1d52e`). | No | +| `sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind of the main service is **Service**. | false | No | +| `sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind of the main service is **Service**. | false | No | +| `sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind of the main service is **Service**. | "" | No | +| `sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind of the main service is **Service**. | 0 | No | +| `strategy` | Load balancing strategy between the main service's servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind of the main service is **Service**. | "RoundRobin" | No | +| `weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | +| `nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind of the main service is **Service**. | false | No | +| `nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind of the main service is **Service**. | false | No | +| `maxBodySize` | Maximum size allowed for the body of the request.
If the body is larger, the request is not mirrored.
-1 means unlimited size. | -1 | No | +| `mirrors` | List of mirrored services to target.
It can be any combination of TraefikService and [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/).
More information [here](#services). | | No | +| `mirrors[m].`
`kind` | Kind of the mirrored service targeted.
Two values allowed:
- **Service**: Kubernetes Service
- **TraefikService**: Traefik Service.
More information [here](#services) | "" | No | +| `mirrors[m].`
`name` | Mirrored service name.
The character `@` is not authorized. | "" | Yes | +| `mirrors[m].`
`namespace` | Mirrored service namespace.
More information [here](#services). | "" | No | +| `mirrors[m].`
`port` | Mirrored service port (number or port name).
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | +| `mirrors[m].`
`percent` | Part of the traffic to mirror in percent (from 0 to 100) | 0 | No | +| `mirrors[m].`
`responseForwarding.`
`flushInterval` | Interval, in milliseconds, in between flushes to the client while copying the response body.
A negative value means to flush immediately after each write to the client.
This configuration is ignored when a response is a streaming response; for such responses, writes are flushed to the client immediately.
Evaluated only if the kind of the mirrored service is **Service**. | 100ms | No | +| `mirrors[m].`
`scheme` | Scheme to use for the request to the mirrored service.
Evaluated only if the kind of the mirrored service is **Service**. | "http"
"https" if `port` is 443 or contains the string *https*. | No | +| `mirrors[m].`
`serversTransport` | Name of ServersTransport resource to use to configure the transport between Traefik and the mirrored service servers.
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | +| `mirrors[m].`
`passHostHeader` | Forward client Host header to the mirrored service servers.
Evaluated only if the kind of the mirrored service is **Service**. | true | No | +| `mirrors[m].`
`healthCheck.scheme` | Server URL scheme for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `mirrors[m].`
`healthCheck.mode` | Health check mode.
If defined to grpc, will use the gRPC health check protocol to probe the server.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "http" | No | +| `mirrors[m].`
`healthCheck.path` | Server URL path for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `mirrors[m].`
`healthCheck.interval` | Frequency of the health check calls.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | +| `mirrors[m].`
`healthCheck.unhealthyInterval` | Frequency of the health check calls for unhealthy targets.
When not defined, it defaults to the `interval` value.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "100ms" | No | +| `mirrors[m].`
`healthCheck.method` | HTTP method for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "GET" | No | +| `mirrors[m].`
`healthCheck.status` | Expected HTTP status code of the response to the health check request.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type ExternalName.
If not set, expect a status between 200 and 399.
Evaluated only if the kind of the mirrored service is **Service**. | | No | +| `mirrors[m].`
`healthCheck.port` | URL port for the health check endpoint.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | +| `mirrors[m].`
`healthCheck.timeout` | Maximum duration to wait before considering the server unhealthy.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "5s" | No | +| `mirrors[m].`
`healthCheck.hostname` | Value in the Host header of the health check request.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | "" | No | +| `mirrors[m].`
`healthCheck.`
`followRedirect` | Follow the redirections during the healtchcheck.
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | true | No | +| `mirrors[m].`
`healthCheck.headers` | Map of header to send to the health check endpoint
Evaluated only if the kind of the mirrored service is **Service**.
Only for [Kubernetes service](https://kubernetes.io/docs/concepts/services-networking/service/) of type [ExternalName](#services). | | No | +| `mirrors[m].`
`sticky.`
`cookie.name` | Name of the cookie used for the stickiness.
When sticky sessions are enabled, a `Set-Cookie` header is set on the initial response to let the client know which server handles the first response.
On subsequent requests, to keep the session alive with the same server, the client should send the cookie with the value set.
If the server pecified in the cookie becomes unhealthy, the request will be forwarded to a new server (and the cookie will keep track of the new server).
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | +| `mirrors[m].`
`sticky.`
`cookie.httpOnly` | Allow the cookie can be accessed by client-side APIs, such as JavaScript.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | +| `mirrors[m].`
`sticky.`
`cookie.secure` | Allow the cookie can only be transmitted over an encrypted connection (i.e. HTTPS).
Evaluated only if the kind of the mirrored service is **Service**. | false | No | +| `mirrors[m].`
`sticky.`
`cookie.sameSite` | [SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) policy.
Allowed values:
-`none`
-`lax`
`strict`
Evaluated only if the kind of the mirrored service is **Service**. | "" | No | +| `mirrors[m].`
`sticky.`
`cookie.maxAge` | Number of seconds until the cookie expires.
Negative number, the cookie expires immediately.
0, the cookie never expires.
Evaluated only if the kind of the mirrored service is **Service**. | 0 | No | +| `mirrors[m].`
`strategy` | Load balancing strategy between the servers.
RoundRobin is the only supported value yet.
Evaluated only if the kind of the mirrored service is **Service**. | "RoundRobin" | No | +| `mirrors[m].`
`weight` | Service weight.
To use only to refer to WRR TraefikService | "" | No | +| `mirrors[m].`
`nativeLB` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | +| `mirrors[m].`
`nodePortLB` | Use the nodePort IP address when the service type is NodePort.
It allows services to be reachable when Traefik runs externally from the Kubernetes cluster but within the same network of the nodes.
Evaluated only if the kind of the mirrored service is **Service**. | false | No | +| `mirrorBody` | Defines whether the request body should be mirrored. | true | No | diff --git a/docs/content/reference/routing-configuration/other-providers/consul-catalog.md b/docs/content/reference/routing-configuration/other-providers/consul-catalog.md index 534891cf3..77f4f3f18 100644 --- a/docs/content/reference/routing-configuration/other-providers/consul-catalog.md +++ b/docs/content/reference/routing-configuration/other-providers/consul-catalog.md @@ -222,6 +222,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/reference/routing-configuration/other-providers/docker.md b/docs/content/reference/routing-configuration/other-providers/docker.md index e17c9fc91..f6e07620c 100644 --- a/docs/content/reference/routing-configuration/other-providers/docker.md +++ b/docs/content/reference/routing-configuration/other-providers/docker.md @@ -327,6 +327,14 @@ you'd add the label `traefik.http.services..loadbalancer.pa "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + ```yaml + "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s" + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/reference/routing-configuration/other-providers/ecs.md b/docs/content/reference/routing-configuration/other-providers/ecs.md index b17d9330a..128da324b 100644 --- a/docs/content/reference/routing-configuration/other-providers/ecs.md +++ b/docs/content/reference/routing-configuration/other-providers/ecs.md @@ -218,6 +218,14 @@ you'd add the label `traefik.http.services.{name-of-your-choice}.loadbalancer.pa traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/reference/routing-configuration/other-providers/kv.md b/docs/content/reference/routing-configuration/other-providers/kv.md index 963d83cb0..b6aeb9c7b 100644 --- a/docs/content/reference/routing-configuration/other-providers/kv.md +++ b/docs/content/reference/routing-configuration/other-providers/kv.md @@ -203,6 +203,14 @@ description: "Read the technical documentation to learn the Traefik Routing Conf |---------------------------------------------------------------------|-------| | `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` | +??? info "`traefik/http/services//loadbalancer/healthcheck/unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + | Key (Path) | Value | + |------------------------------------------------------------------------------|-------| + | `traefik/http/services/myservice/loadbalancer/healthcheck/unhealthyinterval` | `10` | + ??? info "`traefik/http/services//loadbalancer/healthcheck/path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/reference/routing-configuration/other-providers/nomad.md b/docs/content/reference/routing-configuration/other-providers/nomad.md index b8cc400c9..37bd6a4b8 100644 --- a/docs/content/reference/routing-configuration/other-providers/nomad.md +++ b/docs/content/reference/routing-configuration/other-providers/nomad.md @@ -222,6 +222,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/reference/routing-configuration/other-providers/swarm.md b/docs/content/reference/routing-configuration/other-providers/swarm.md index 51b2371c0..59f21aed9 100644 --- a/docs/content/reference/routing-configuration/other-providers/swarm.md +++ b/docs/content/reference/routing-configuration/other-providers/swarm.md @@ -351,6 +351,14 @@ you'd add the label `traefik.http.services..loadbalancer.pa - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../http/load-balancing/service.md#health-check) for more information. + + ```yaml + - "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s" + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../http/load-balancing/service.md#health-check) for more information. diff --git a/docs/content/routing/providers/consul-catalog.md b/docs/content/routing/providers/consul-catalog.md index 76b326b55..d8d07bc0a 100644 --- a/docs/content/routing/providers/consul-catalog.md +++ b/docs/content/routing/providers/consul-catalog.md @@ -218,6 +218,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/providers/docker.md b/docs/content/routing/providers/docker.md index aedbfe09f..d1fac0b27 100644 --- a/docs/content/routing/providers/docker.md +++ b/docs/content/routing/providers/docker.md @@ -333,6 +333,14 @@ you'd add the label `traefik.http.services..loadbalancer.pa - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + ```yaml + - "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s" + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/providers/ecs.md b/docs/content/routing/providers/ecs.md index e85975409..c740a5ff9 100644 --- a/docs/content/routing/providers/ecs.md +++ b/docs/content/routing/providers/ecs.md @@ -220,6 +220,14 @@ you'd add the label `traefik.http.services.{name-of-your-choice}.loadbalancer.pa traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/providers/kv.md b/docs/content/routing/providers/kv.md index 37e6148f5..88ed9bf8a 100644 --- a/docs/content/routing/providers/kv.md +++ b/docs/content/routing/providers/kv.md @@ -180,6 +180,14 @@ A Story of key & values |---------------------------------------------------------------------|-------| | `traefik/http/services/myservice/loadbalancer/healthcheck/interval` | `10` | +??? info "`traefik/http/services//loadbalancer/healthcheck/unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + | Key (Path) | Value | + |------------------------------------------------------------------------------|-------| + | `traefik/http/services/myservice/loadbalancer/healthcheck/unhealthyinterval` | `10` | + ??? info "`traefik/http/services//loadbalancer/healthcheck/path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/providers/nomad.md b/docs/content/routing/providers/nomad.md index 613f35a7b..50ac7451b 100644 --- a/docs/content/routing/providers/nomad.md +++ b/docs/content/routing/providers/nomad.md @@ -218,6 +218,14 @@ you'd add the tag `traefik.http.services.{name-of-your-choice}.loadbalancer.pass traefik.http.services.myservice.loadbalancer.healthcheck.interval=10 ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + ```yaml + traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10 + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/providers/swarm.md b/docs/content/routing/providers/swarm.md index bd9685ef6..13ef3ffaa 100644 --- a/docs/content/routing/providers/swarm.md +++ b/docs/content/routing/providers/swarm.md @@ -347,6 +347,14 @@ you'd add the label `traefik.http.services..loadbalancer.pa - "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10s" ``` +??? info "`traefik.http.services..loadbalancer.healthcheck.unhealthyinterval`" + + See [health check](../services/index.md#health-check) for more information. + + ```yaml + - "traefik.http.services.myservice.loadbalancer.healthcheck.unhealthyinterval=10s" + ``` + ??? info "`traefik.http.services..loadbalancer.healthcheck.path`" See [health check](../services/index.md#health-check) for more information. diff --git a/docs/content/routing/services/index.md b/docs/content/routing/services/index.md index 199fb81a3..e2745e4c4 100644 --- a/docs/content/routing/services/index.md +++ b/docs/content/routing/services/index.md @@ -415,7 +415,8 @@ Below are the available options for the health check mechanism: - `mode` (default: http), if defined to `grpc`, will use the gRPC health check protocol to probe the server. - `hostname` (optional), sets the value of `hostname` in the `Host` header of the health check request. - `port` (optional), replaces the server URL `port` for the health check endpoint. -- `interval` (default: 30s), defines the frequency of the health check calls. +- `interval` (default: 30s), defines the frequency of the health check calls for healthy targets. +- `unhealthyInterval` (default: 30s), defines the frequency of the health check calls for unhealthy targets. When not defined, it defaults to the `interval` value. - `timeout` (default: 5s), defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. - `headers` (optional), defines custom headers to be sent to the health check endpoint. - `followRedirects` (default: true), defines whether redirects should be followed during the health check calls. @@ -424,7 +425,7 @@ Below are the available options for the health check mechanism: !!! info "Interval & Timeout Format" - Interval and timeout are to be given in a format understood by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration). + Interval, UnhealthyInterval and Timeout are to be given in a format understood by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration). !!! info "Recovering Servers" diff --git a/integration/fixtures/k8s/01-traefik-crd.yml b/integration/fixtures/k8s/01-traefik-crd.yml index f14cce498..0541d1607 100644 --- a/integration/fixtures/k8s/01-traefik-crd.yml +++ b/integration/fixtures/k8s/01-traefik-crd.yml @@ -136,7 +136,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -172,6 +172,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -1070,7 +1079,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -1106,6 +1115,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -2743,7 +2761,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -2779,6 +2797,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -2828,7 +2855,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -2864,6 +2891,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. @@ -3167,7 +3203,7 @@ spec: - type: integer - type: string description: |- - Interval defines the frequency of the health check calls. + Interval defines the frequency of the health check calls for healthy targets. Default: 30s x-kubernetes-int-or-string: true method: @@ -3203,6 +3239,15 @@ spec: Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. Default: 5s x-kubernetes-int-or-string: true + unhealthyInterval: + anyOf: + - type: integer + - type: string + description: |- + UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + When UnhealthyInterval is not defined, it defaults to the Interval value. + Default: 30s + x-kubernetes-int-or-string: true type: object kind: description: Kind defines the kind of the Service. diff --git a/pkg/config/dynamic/http_config.go b/pkg/config/dynamic/http_config.go index d91f60340..a867c882b 100644 --- a/pkg/config/dynamic/http_config.go +++ b/pkg/config/dynamic/http_config.go @@ -299,17 +299,18 @@ type Server struct { // ServerHealthCheck holds the HealthCheck configuration. type ServerHealthCheck struct { - Scheme string `json:"scheme,omitempty" toml:"scheme,omitempty" yaml:"scheme,omitempty" export:"true"` - Mode string `json:"mode,omitempty" toml:"mode,omitempty" yaml:"mode,omitempty" export:"true"` - Path string `json:"path,omitempty" toml:"path,omitempty" yaml:"path,omitempty" export:"true"` - Method string `json:"method,omitempty" toml:"method,omitempty" yaml:"method,omitempty" export:"true"` - Status int `json:"status,omitempty" toml:"status,omitempty" yaml:"status,omitempty" export:"true"` - Port int `json:"port,omitempty" toml:"port,omitempty,omitzero" yaml:"port,omitempty" export:"true"` - Interval ptypes.Duration `json:"interval,omitempty" toml:"interval,omitempty" yaml:"interval,omitempty" export:"true"` - Timeout ptypes.Duration `json:"timeout,omitempty" toml:"timeout,omitempty" yaml:"timeout,omitempty" export:"true"` - Hostname string `json:"hostname,omitempty" toml:"hostname,omitempty" yaml:"hostname,omitempty"` - FollowRedirects *bool `json:"followRedirects,omitempty" toml:"followRedirects,omitempty" yaml:"followRedirects,omitempty" export:"true"` - Headers map[string]string `json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty" export:"true"` + Scheme string `json:"scheme,omitempty" toml:"scheme,omitempty" yaml:"scheme,omitempty" export:"true"` + Mode string `json:"mode,omitempty" toml:"mode,omitempty" yaml:"mode,omitempty" export:"true"` + Path string `json:"path,omitempty" toml:"path,omitempty" yaml:"path,omitempty" export:"true"` + Method string `json:"method,omitempty" toml:"method,omitempty" yaml:"method,omitempty" export:"true"` + Status int `json:"status,omitempty" toml:"status,omitempty" yaml:"status,omitempty" export:"true"` + Port int `json:"port,omitempty" toml:"port,omitempty,omitzero" yaml:"port,omitempty" export:"true"` + Interval ptypes.Duration `json:"interval,omitempty" toml:"interval,omitempty" yaml:"interval,omitempty" export:"true"` + UnhealthyInterval *ptypes.Duration `json:"unhealthyInterval,omitempty" toml:"unhealthyInterval,omitempty" yaml:"unhealthyInterval,omitempty" export:"true"` + Timeout ptypes.Duration `json:"timeout,omitempty" toml:"timeout,omitempty" yaml:"timeout,omitempty" export:"true"` + Hostname string `json:"hostname,omitempty" toml:"hostname,omitempty" yaml:"hostname,omitempty"` + FollowRedirects *bool `json:"followRedirects,omitempty" toml:"followRedirects,omitempty" yaml:"followRedirects,omitempty" export:"true"` + Headers map[string]string `json:"headers,omitempty" toml:"headers,omitempty" yaml:"headers,omitempty" export:"true"` } // SetDefaults Default values for a HealthCheck. diff --git a/pkg/config/dynamic/zz_generated.deepcopy.go b/pkg/config/dynamic/zz_generated.deepcopy.go index 2a680897c..9cf39ba40 100644 --- a/pkg/config/dynamic/zz_generated.deepcopy.go +++ b/pkg/config/dynamic/zz_generated.deepcopy.go @@ -1428,6 +1428,11 @@ func (in *Server) DeepCopy() *Server { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) { *out = *in + if in.UnhealthyInterval != nil { + in, out := &in.UnhealthyInterval, &out.UnhealthyInterval + *out = new(paersertypes.Duration) + **out = **in + } if in.FollowRedirects != nil { in, out := &in.FollowRedirects, &out.FollowRedirects *out = new(bool) diff --git a/pkg/config/label/label_test.go b/pkg/config/label/label_test.go index bd763ba08..b17222410 100644 --- a/pkg/config/label/label_test.go +++ b/pkg/config/label/label_test.go @@ -162,6 +162,7 @@ func TestDecodeConfiguration(t *testing.T) { "traefik.http.services.Service0.loadbalancer.healthcheck.headers.name1": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.hostname": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.interval": "1s", + "traefik.http.services.Service0.loadbalancer.healthcheck.unhealthyinterval": "1s", "traefik.http.services.Service0.loadbalancer.healthcheck.path": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.method": "foobar", "traefik.http.services.Service0.loadbalancer.healthcheck.status": "401", @@ -186,6 +187,7 @@ func TestDecodeConfiguration(t *testing.T) { "traefik.http.services.Service1.loadbalancer.healthcheck.headers.name1": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.hostname": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.interval": "1s", + "traefik.http.services.Service1.loadbalancer.healthcheck.unhealthyinterval": "1s", "traefik.http.services.Service1.loadbalancer.healthcheck.path": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.method": "foobar", "traefik.http.services.Service1.loadbalancer.healthcheck.status": "401", @@ -701,15 +703,16 @@ func TestDecodeConfiguration(t *testing.T) { }, }, HealthCheck: &dynamic.ServerHealthCheck{ - Scheme: "foobar", - Mode: "foobar", - Path: "foobar", - Method: "foobar", - Status: 401, - Port: 42, - Interval: ptypes.Duration(time.Second), - Timeout: ptypes.Duration(time.Second), - Hostname: "foobar", + Scheme: "foobar", + Mode: "foobar", + Path: "foobar", + Method: "foobar", + Status: 401, + Port: 42, + Interval: ptypes.Duration(time.Second), + UnhealthyInterval: pointer(ptypes.Duration(time.Second)), + Timeout: ptypes.Duration(time.Second), + Hostname: "foobar", Headers: map[string]string{ "name0": "foobar", "name1": "foobar", @@ -735,15 +738,16 @@ func TestDecodeConfiguration(t *testing.T) { }, }, HealthCheck: &dynamic.ServerHealthCheck{ - Scheme: "foobar", - Mode: "foobar", - Path: "foobar", - Method: "foobar", - Status: 401, - Port: 42, - Interval: ptypes.Duration(time.Second), - Timeout: ptypes.Duration(time.Second), - Hostname: "foobar", + Scheme: "foobar", + Mode: "foobar", + Path: "foobar", + Method: "foobar", + Status: 401, + Port: 42, + Interval: ptypes.Duration(time.Second), + UnhealthyInterval: pointer(ptypes.Duration(time.Second)), + Timeout: ptypes.Duration(time.Second), + Hostname: "foobar", Headers: map[string]string{ "name0": "foobar", "name1": "foobar", @@ -1244,14 +1248,15 @@ func TestEncodeConfiguration(t *testing.T) { }, }, HealthCheck: &dynamic.ServerHealthCheck{ - Scheme: "foobar", - Path: "foobar", - Method: "foobar", - Status: 401, - Port: 42, - Interval: ptypes.Duration(time.Second), - Timeout: ptypes.Duration(time.Second), - Hostname: "foobar", + Scheme: "foobar", + Path: "foobar", + Method: "foobar", + Status: 401, + Port: 42, + Interval: ptypes.Duration(time.Second), + UnhealthyInterval: pointer(ptypes.Duration(time.Second)), + Timeout: ptypes.Duration(time.Second), + Hostname: "foobar", Headers: map[string]string{ "name0": "foobar", "name1": "foobar", @@ -1276,14 +1281,15 @@ func TestEncodeConfiguration(t *testing.T) { }, }, HealthCheck: &dynamic.ServerHealthCheck{ - Scheme: "foobar", - Path: "foobar", - Method: "foobar", - Status: 401, - Port: 42, - Interval: ptypes.Duration(time.Second), - Timeout: ptypes.Duration(time.Second), - Hostname: "foobar", + Scheme: "foobar", + Path: "foobar", + Method: "foobar", + Status: 401, + Port: 42, + Interval: ptypes.Duration(time.Second), + UnhealthyInterval: pointer(ptypes.Duration(time.Second)), + Timeout: ptypes.Duration(time.Second), + Hostname: "foobar", Headers: map[string]string{ "name0": "foobar", "name1": "foobar", @@ -1471,6 +1477,7 @@ func TestEncodeConfiguration(t *testing.T) { "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Headers.name1": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Hostname": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Interval": "1000000000", + "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.UnhealthyInterval": "1000000000", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Path": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Method": "foobar", "traefik.HTTP.Services.Service0.LoadBalancer.HealthCheck.Status": "401", @@ -1495,6 +1502,7 @@ func TestEncodeConfiguration(t *testing.T) { "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Headers.name1": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Hostname": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Interval": "1000000000", + "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.UnhealthyInterval": "1000000000", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Path": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Method": "foobar", "traefik.HTTP.Services.Service1.LoadBalancer.HealthCheck.Status": "401", diff --git a/pkg/healthcheck/healthcheck.go b/pkg/healthcheck/healthcheck.go index c9d3e7e36..e2679d73c 100644 --- a/pkg/healthcheck/healthcheck.go +++ b/pkg/healthcheck/healthcheck.go @@ -40,18 +40,27 @@ type metricsHealthCheck interface { ServiceServerUpGauge() gokitmetrics.Gauge } +type target struct { + targetURL *url.URL + name string +} + type ServiceHealthChecker struct { balancer StatusSetter info *runtime.ServiceInfo - config *dynamic.ServerHealthCheck - interval time.Duration - timeout time.Duration + config *dynamic.ServerHealthCheck + interval time.Duration + unhealthyInterval time.Duration + timeout time.Duration metrics metricsHealthCheck - client *http.Client - targets map[string]*url.URL + client *http.Client + + healthyTargets chan target + unhealthyTargets chan target + serviceName string } @@ -60,13 +69,26 @@ func NewServiceHealthChecker(ctx context.Context, metrics metricsHealthCheck, co interval := time.Duration(config.Interval) if interval <= 0 { - logger.Error().Msg("Health check interval smaller than zero") + logger.Error().Msg("Health check interval smaller than zero, default value will be used instead.") interval = time.Duration(dynamic.DefaultHealthCheckInterval) } + // If the unhealthyInterval option is not set, we use the interval option value, + // to check the unhealthy targets as often as the healthy ones. + var unhealthyInterval time.Duration + if config.UnhealthyInterval == nil { + unhealthyInterval = interval + } else { + unhealthyInterval = time.Duration(*config.UnhealthyInterval) + if unhealthyInterval <= 0 { + logger.Error().Msg("Health check unhealthy interval smaller than zero, default value will be used instead.") + unhealthyInterval = time.Duration(dynamic.DefaultHealthCheckInterval) + } + } + timeout := time.Duration(config.Timeout) if timeout <= 0 { - logger.Error().Msg("Health check timeout smaller than zero") + logger.Error().Msg("Health check timeout smaller than zero, default value will be used instead.") timeout = time.Duration(dynamic.DefaultHealthCheckTimeout) } @@ -80,21 +102,38 @@ func NewServiceHealthChecker(ctx context.Context, metrics metricsHealthCheck, co } } + healthyTargets := make(chan target, len(targets)) + for name, targetURL := range targets { + healthyTargets <- target{ + targetURL: targetURL, + name: name, + } + } + unhealthyTargets := make(chan target, len(targets)) + return &ServiceHealthChecker{ - balancer: service, - info: info, - config: config, - interval: interval, - timeout: timeout, - targets: targets, - serviceName: serviceName, - client: client, - metrics: metrics, + balancer: service, + info: info, + config: config, + interval: interval, + unhealthyInterval: unhealthyInterval, + timeout: timeout, + healthyTargets: healthyTargets, + unhealthyTargets: unhealthyTargets, + serviceName: serviceName, + client: client, + metrics: metrics, } } func (shc *ServiceHealthChecker) Launch(ctx context.Context) { - ticker := time.NewTicker(shc.interval) + go shc.healthcheck(ctx, shc.unhealthyTargets, shc.unhealthyInterval) + + shc.healthcheck(ctx, shc.healthyTargets, shc.interval) +} + +func (shc *ServiceHealthChecker) healthcheck(ctx context.Context, targets chan target, interval time.Duration) { + ticker := time.NewTicker(interval) defer ticker.Stop() for { @@ -103,7 +142,23 @@ func (shc *ServiceHealthChecker) Launch(ctx context.Context) { return case <-ticker.C: - for proxyName, target := range shc.targets { + // We collect the targets to check once for all, + // to avoid rechecking a target that has been moved during the health check. + var targetsToCheck []target + hasMoreTargets := true + for hasMoreTargets { + select { + case <-ctx.Done(): + return + case target := <-targets: + targetsToCheck = append(targetsToCheck, target) + default: + hasMoreTargets = false + } + } + + // Now we can check the targets. + for _, target := range targetsToCheck { select { case <-ctx.Done(): return @@ -113,14 +168,14 @@ func (shc *ServiceHealthChecker) Launch(ctx context.Context) { up := true serverUpMetricValue := float64(1) - if err := shc.executeHealthCheck(ctx, shc.config, target); err != nil { + if err := shc.executeHealthCheck(ctx, shc.config, target.targetURL); err != nil { // The context is canceled when the dynamic configuration is refreshed. if errors.Is(err, context.Canceled) { return } log.Ctx(ctx).Warn(). - Str("targetURL", target.String()). + Str("targetURL", target.targetURL.String()). Err(err). Msg("Health check failed.") @@ -128,17 +183,21 @@ func (shc *ServiceHealthChecker) Launch(ctx context.Context) { serverUpMetricValue = float64(0) } - shc.balancer.SetStatus(ctx, proxyName, up) + shc.balancer.SetStatus(ctx, target.name, up) - statusStr := runtime.StatusDown + var statusStr string if up { statusStr = runtime.StatusUp + shc.healthyTargets <- target + } else { + statusStr = runtime.StatusDown + shc.unhealthyTargets <- target } - shc.info.UpdateServerStatus(target.String(), statusStr) + shc.info.UpdateServerStatus(target.targetURL.String(), statusStr) shc.metrics.ServiceServerUpGauge(). - With("service", shc.serviceName, "url", target.String()). + With("service", shc.serviceName, "url", target.targetURL.String()). Set(serverUpMetricValue) } } diff --git a/pkg/healthcheck/healthcheck_test.go b/pkg/healthcheck/healthcheck_test.go index a977635d1..a8df9bcdf 100644 --- a/pkg/healthcheck/healthcheck_test.go +++ b/pkg/healthcheck/healthcheck_test.go @@ -419,11 +419,12 @@ func TestServiceHealthChecker_Launch(t *testing.T) { lb := &testLoadBalancer{RWMutex: &sync.RWMutex{}} config := &dynamic.ServerHealthCheck{ - Mode: test.mode, - Status: test.status, - Path: "/path", - Interval: ptypes.Duration(500 * time.Millisecond), - Timeout: ptypes.Duration(499 * time.Millisecond), + Mode: test.mode, + Status: test.status, + Path: "/path", + Interval: ptypes.Duration(500 * time.Millisecond), + UnhealthyInterval: pointer(ptypes.Duration(500 * time.Millisecond)), + Timeout: ptypes.Duration(499 * time.Millisecond), } gauge := &testhelpers.CollectingGauge{} @@ -456,3 +457,54 @@ func TestServiceHealthChecker_Launch(t *testing.T) { }) } } + +func TestDifferentIntervals(t *testing.T) { + // The context is passed to the health check and + // canonically canceled by the test server once all expected requests have been received. + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + healthyServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(http.StatusOK) + })) + healthyURL := testhelpers.MustParseURL(healthyServer.URL) + + unhealthyServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(http.StatusServiceUnavailable) + })) + unhealthyURL := testhelpers.MustParseURL(unhealthyServer.URL) + + lb := &testLoadBalancer{RWMutex: &sync.RWMutex{}} + + config := &dynamic.ServerHealthCheck{ + Mode: "http", + Path: "/path", + Interval: ptypes.Duration(500 * time.Millisecond), + UnhealthyInterval: pointer(ptypes.Duration(50 * time.Millisecond)), + Timeout: ptypes.Duration(499 * time.Millisecond), + } + + gauge := &testhelpers.CollectingGauge{} + serviceInfo := &runtime.ServiceInfo{} + hc := NewServiceHealthChecker(ctx, &MetricsMock{gauge}, config, lb, serviceInfo, http.DefaultTransport, map[string]*url.URL{"healthy": healthyURL, "unhealthy": unhealthyURL}, "foobar") + + wg := sync.WaitGroup{} + wg.Add(1) + + go func() { + hc.Launch(ctx) + wg.Done() + }() + + select { + case <-time.After(2 * time.Second): + break + case <-ctx.Done(): + wg.Wait() + } + + lb.Lock() + defer lb.Unlock() + + assert.Greater(t, lb.numRemovedServers, lb.numUpsertedServers, "removed servers greater than upserted servers") +} diff --git a/pkg/provider/kubernetes/crd/kubernetes_http.go b/pkg/provider/kubernetes/crd/kubernetes_http.go index a2d89dd42..67989818c 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_http.go +++ b/pkg/provider/kubernetes/crd/kubernetes_http.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/rs/zerolog/log" + ptypes "github.com/traefik/paerser/types" "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/logs" "github.com/traefik/traefik/v3/pkg/provider" @@ -373,6 +374,17 @@ func (c configBuilder) buildServersLB(namespace string, svc traefikv1alpha1.Load return nil, err } } + // If the UnhealthyInterval option is not set, we use the Interval option value, + // to check the unhealthy targets as often as the healthy ones. + if svc.HealthCheck.UnhealthyInterval == nil { + lb.HealthCheck.UnhealthyInterval = &lb.HealthCheck.Interval + } else { + var unhealthyInterval ptypes.Duration + if err := unhealthyInterval.Set(svc.HealthCheck.UnhealthyInterval.String()); err != nil { + return nil, err + } + lb.HealthCheck.UnhealthyInterval = &unhealthyInterval + } if svc.HealthCheck.Timeout != nil { if err := lb.HealthCheck.Timeout.Set(svc.HealthCheck.Timeout.String()); err != nil { return nil, err diff --git a/pkg/provider/kubernetes/crd/kubernetes_test.go b/pkg/provider/kubernetes/crd/kubernetes_test.go index 93b43fdfb..239d3cdae 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_test.go +++ b/pkg/provider/kubernetes/crd/kubernetes_test.go @@ -2647,10 +2647,11 @@ func TestLoadIngressRoutes(t *testing.T) { FlushInterval: ptypes.Duration(100 * time.Millisecond), }, HealthCheck: &dynamic.ServerHealthCheck{ - Path: "/health", - Timeout: 5000000000, - Interval: 15000000000, - FollowRedirects: pointer(true), + Path: "/health", + Timeout: 5000000000, + Interval: 15000000000, + UnhealthyInterval: pointer(ptypes.Duration(15000000000)), + FollowRedirects: pointer(true), }, }, }, @@ -2712,10 +2713,11 @@ func TestLoadIngressRoutes(t *testing.T) { FlushInterval: ptypes.Duration(100 * time.Millisecond), }, HealthCheck: &dynamic.ServerHealthCheck{ - Path: "/health1", - Timeout: 5000000000, - Interval: 15000000000, - FollowRedirects: pointer(true), + Path: "/health1", + Timeout: 5000000000, + Interval: 15000000000, + UnhealthyInterval: pointer(ptypes.Duration(15000000000)), + FollowRedirects: pointer(true), }, }, }, @@ -2732,10 +2734,11 @@ func TestLoadIngressRoutes(t *testing.T) { FlushInterval: ptypes.Duration(100 * time.Millisecond), }, HealthCheck: &dynamic.ServerHealthCheck{ - Path: "/health2", - Timeout: 5000000000, - Interval: 20000000000, - FollowRedirects: pointer(true), + Path: "/health2", + Timeout: 5000000000, + Interval: 20000000000, + UnhealthyInterval: pointer(ptypes.Duration(20000000000)), + FollowRedirects: pointer(true), }, }, }, @@ -2776,10 +2779,11 @@ func TestLoadIngressRoutes(t *testing.T) { FlushInterval: ptypes.Duration(100 * time.Millisecond), }, HealthCheck: &dynamic.ServerHealthCheck{ - Path: "/health1", - Timeout: 5000000000, - Interval: 15000000000, - FollowRedirects: pointer(true), + Path: "/health1", + Timeout: 5000000000, + Interval: 15000000000, + UnhealthyInterval: pointer(ptypes.Duration(15000000000)), + FollowRedirects: pointer(true), }, }, }, diff --git a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go index 6186207e2..5a8fa67c0 100644 --- a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go +++ b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/ingressroute.go @@ -170,9 +170,13 @@ type ServerHealthCheck struct { Status int `json:"status,omitempty"` // Port defines the server URL port for the health check endpoint. Port int `json:"port,omitempty"` - // Interval defines the frequency of the health check calls. + // Interval defines the frequency of the health check calls for healthy targets. // Default: 30s Interval *intstr.IntOrString `json:"interval,omitempty"` + // UnhealthyInterval defines the frequency of the health check calls for unhealthy targets. + // When UnhealthyInterval is not defined, it defaults to the Interval value. + // Default: 30s + UnhealthyInterval *intstr.IntOrString `json:"unhealthyInterval,omitempty"` // Timeout defines the maximum duration Traefik will wait for a health check request before considering the server unhealthy. // Default: 5s Timeout *intstr.IntOrString `json:"timeout,omitempty"` diff --git a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go index f975a8bfb..3e53cfae5 100644 --- a/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/provider/kubernetes/crd/traefikio/v1alpha1/zz_generated.deepcopy.go @@ -1280,6 +1280,11 @@ func (in *ServerHealthCheck) DeepCopyInto(out *ServerHealthCheck) { *out = new(intstr.IntOrString) **out = **in } + if in.UnhealthyInterval != nil { + in, out := &in.UnhealthyInterval, &out.UnhealthyInterval + *out = new(intstr.IntOrString) + **out = **in + } if in.Timeout != nil { in, out := &in.Timeout, &out.Timeout *out = new(intstr.IntOrString) diff --git a/pkg/provider/kv/kv_test.go b/pkg/provider/kv/kv_test.go index b439f38ae..08ff286ef 100644 --- a/pkg/provider/kv/kv_test.go +++ b/pkg/provider/kv/kv_test.go @@ -45,6 +45,7 @@ func Test_buildConfiguration(t *testing.T) { "traefik/http/services/Service01/loadBalancer/healthCheck/path": "foobar", "traefik/http/services/Service01/loadBalancer/healthCheck/port": "42", "traefik/http/services/Service01/loadBalancer/healthCheck/interval": "1s", + "traefik/http/services/Service01/loadBalancer/healthCheck/unhealthyinterval": "1s", "traefik/http/services/Service01/loadBalancer/healthCheck/timeout": "1s", "traefik/http/services/Service01/loadBalancer/healthCheck/hostname": "foobar", "traefik/http/services/Service01/loadBalancer/healthCheck/headers/name0": "foobar", @@ -665,14 +666,15 @@ func Test_buildConfiguration(t *testing.T) { }, }, HealthCheck: &dynamic.ServerHealthCheck{ - Scheme: "foobar", - Mode: "foobar", - Path: "foobar", - Port: 42, - Interval: ptypes.Duration(time.Second), - Timeout: ptypes.Duration(time.Second), - Hostname: "foobar", - FollowRedirects: pointer(true), + Scheme: "foobar", + Mode: "foobar", + Path: "foobar", + Port: 42, + Interval: ptypes.Duration(time.Second), + UnhealthyInterval: pointer(ptypes.Duration(time.Second)), + Timeout: ptypes.Duration(time.Second), + Hostname: "foobar", + FollowRedirects: pointer(true), Headers: map[string]string{ "name0": "foobar", "name1": "foobar", diff --git a/webui/src/components/_commons/PanelHealthCheck.vue b/webui/src/components/_commons/PanelHealthCheck.vue index 7ac03a7bc..918b06302 100644 --- a/webui/src/components/_commons/PanelHealthCheck.vue +++ b/webui/src/components/_commons/PanelHealthCheck.vue @@ -8,7 +8,7 @@ :thumb-style="appThumbStyle" style="height:100%;" > - +
+
+
+ UNHEALTHY INTERVAL +
+ + {{ data.unhealthyInterval }} + +
From 8f37c8f0c54d5bba62eadbb7cd633267de939c32 Mon Sep 17 00:00:00 2001 From: Ryan Melendez Date: Fri, 25 Apr 2025 05:26:04 -0400 Subject: [PATCH 003/172] Ability to enable unsafe in yaegi through plugin manifest --- .../reference/static-configuration/cli-ref.md | 6 ++++++ .../reference/static-configuration/env-ref.md | 6 ++++++ .../reference/static-configuration/file.toml | 4 ++++ .../reference/static-configuration/file.yaml | 4 ++++ pkg/plugins/builder.go | 10 +++++----- pkg/plugins/middlewareyaegi.go | 19 ++++++++++++++++--- pkg/plugins/types.go | 6 ++++-- 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index 8aff56bd9..92902ec2e 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -348,6 +348,9 @@ Environment variables to forward to the wasm guest. `--experimental.localplugins..settings.mounts`: Directory to mount to the wasm guest. +`--experimental.localplugins..settings.useunsafe`: +Allow the plugin to use unsafe package. (Default: ```false```) + `--experimental.otlplogs`: Enables the OpenTelemetry logs integration. (Default: ```false```) @@ -363,6 +366,9 @@ Environment variables to forward to the wasm guest. `--experimental.plugins..settings.mounts`: Directory to mount to the wasm guest. +`--experimental.plugins..settings.useunsafe`: +Allow the plugin to use unsafe package. (Default: ```false```) + `--experimental.plugins..version`: plugin's version. diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index 172f457a6..c0f46f53d 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -348,6 +348,9 @@ Environment variables to forward to the wasm guest. `TRAEFIK_EXPERIMENTAL_LOCALPLUGINS__SETTINGS_MOUNTS`: Directory to mount to the wasm guest. +`TRAEFIK_EXPERIMENTAL_LOCALPLUGINS__SETTINGS_USEUNSAFE`: +Allow the plugin to use unsafe package. (Default: ```false```) + `TRAEFIK_EXPERIMENTAL_OTLPLOGS`: Enables the OpenTelemetry logs integration. (Default: ```false```) @@ -363,6 +366,9 @@ Environment variables to forward to the wasm guest. `TRAEFIK_EXPERIMENTAL_PLUGINS__SETTINGS_MOUNTS`: Directory to mount to the wasm guest. +`TRAEFIK_EXPERIMENTAL_PLUGINS__SETTINGS_USEUNSAFE`: +Allow the plugin to use unsafe package. (Default: ```false```) + `TRAEFIK_EXPERIMENTAL_PLUGINS__VERSION`: plugin's version. diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 28dbd6bf3..204fead53 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -575,23 +575,27 @@ [experimental.plugins.Descriptor0.settings] envs = ["foobar", "foobar"] mounts = ["foobar", "foobar"] + useUnsafe = true [experimental.plugins.Descriptor1] moduleName = "foobar" version = "foobar" [experimental.plugins.Descriptor1.settings] envs = ["foobar", "foobar"] mounts = ["foobar", "foobar"] + useUnsafe = true [experimental.localPlugins] [experimental.localPlugins.LocalDescriptor0] moduleName = "foobar" [experimental.localPlugins.LocalDescriptor0.settings] envs = ["foobar", "foobar"] mounts = ["foobar", "foobar"] + useUnsafe = true [experimental.localPlugins.LocalDescriptor1] moduleName = "foobar" [experimental.localPlugins.LocalDescriptor1.settings] envs = ["foobar", "foobar"] mounts = ["foobar", "foobar"] + useUnsafe = true [experimental.fastProxy] debug = true diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index c57ea5186..2c9fb3223 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -628,6 +628,7 @@ experimental: mounts: - foobar - foobar + useUnsafe: true Descriptor1: moduleName: foobar version: foobar @@ -638,6 +639,7 @@ experimental: mounts: - foobar - foobar + useUnsafe: true localPlugins: LocalDescriptor0: moduleName: foobar @@ -648,6 +650,7 @@ experimental: mounts: - foobar - foobar + useUnsafe: true LocalDescriptor1: moduleName: foobar settings: @@ -657,6 +660,7 @@ experimental: mounts: - foobar - foobar + useUnsafe: true abortOnPluginFailure: true fastProxy: debug: true diff --git a/pkg/plugins/builder.go b/pkg/plugins/builder.go index 9e47d134b..8559dec90 100644 --- a/pkg/plugins/builder.go +++ b/pkg/plugins/builder.go @@ -60,7 +60,7 @@ func NewBuilder(client *Client, plugins map[string]Descriptor, localPlugins map[ pb.middlewareBuilders[pName] = middleware case typeProvider: - pBuilder, err := newProviderBuilder(logCtx, manifest, client.GoPath()) + pBuilder, err := newProviderBuilder(logCtx, manifest, client.GoPath(), desc.Settings) if err != nil { return nil, fmt.Errorf("%s: %w", desc.ModuleName, err) } @@ -95,7 +95,7 @@ func NewBuilder(client *Client, plugins map[string]Descriptor, localPlugins map[ pb.middlewareBuilders[pName] = middleware case typeProvider: - builder, err := newProviderBuilder(logCtx, manifest, localGoPath) + builder, err := newProviderBuilder(logCtx, manifest, localGoPath, desc.Settings) if err != nil { return nil, fmt.Errorf("%s: %w", desc.ModuleName, err) } @@ -139,7 +139,7 @@ func newMiddlewareBuilder(ctx context.Context, goPath string, manifest *Manifest return newWasmMiddlewareBuilder(goPath, moduleName, wasmPath, settings) case runtimeYaegi, "": - i, err := newInterpreter(ctx, goPath, manifest.Import) + i, err := newInterpreter(ctx, goPath, manifest, settings) if err != nil { return nil, fmt.Errorf("failed to create Yaegi interpreter: %w", err) } @@ -151,10 +151,10 @@ func newMiddlewareBuilder(ctx context.Context, goPath string, manifest *Manifest } } -func newProviderBuilder(ctx context.Context, manifest *Manifest, goPath string) (providerBuilder, error) { +func newProviderBuilder(ctx context.Context, manifest *Manifest, goPath string, settings Settings) (providerBuilder, error) { switch manifest.Runtime { case runtimeYaegi, "": - i, err := newInterpreter(ctx, goPath, manifest.Import) + i, err := newInterpreter(ctx, goPath, manifest, settings) if err != nil { return providerBuilder{}, err } diff --git a/pkg/plugins/middlewareyaegi.go b/pkg/plugins/middlewareyaegi.go index 452f8713b..a23db53e7 100644 --- a/pkg/plugins/middlewareyaegi.go +++ b/pkg/plugins/middlewareyaegi.go @@ -2,6 +2,7 @@ package plugins import ( "context" + "errors" "fmt" "net/http" "os" @@ -15,6 +16,7 @@ import ( "github.com/traefik/traefik/v3/pkg/logs" "github.com/traefik/yaegi/interp" "github.com/traefik/yaegi/stdlib" + "github.com/traefik/yaegi/stdlib/unsafe" ) type yaegiMiddlewareBuilder struct { @@ -119,7 +121,7 @@ func (m *YaegiMiddleware) NewHandler(ctx context.Context, next http.Handler) (ht return m.builder.newHandler(ctx, next, m.config, m.middlewareName) } -func newInterpreter(ctx context.Context, goPath string, manifestImport string) (*interp.Interpreter, error) { +func newInterpreter(ctx context.Context, goPath string, manifest *Manifest, settings Settings) (*interp.Interpreter, error) { i := interp.New(interp.Options{ GoPath: goPath, Env: os.Environ(), @@ -132,14 +134,25 @@ func newInterpreter(ctx context.Context, goPath string, manifestImport string) ( return nil, fmt.Errorf("failed to load symbols: %w", err) } + if manifest.UseUnsafe && !settings.UseUnsafe { + return nil, errors.New("this plugin uses unsafe import. If you want to use it, you need to allow useUnsafe in the settings") + } + + if settings.UseUnsafe && manifest.UseUnsafe { + err := i.Use(unsafe.Symbols) + if err != nil { + return nil, fmt.Errorf("failed to load unsafe symbols: %w", err) + } + } + err = i.Use(ppSymbols()) if err != nil { return nil, fmt.Errorf("failed to load provider symbols: %w", err) } - _, err = i.Eval(fmt.Sprintf(`import "%s"`, manifestImport)) + _, err = i.Eval(fmt.Sprintf(`import "%s"`, manifest.Import)) if err != nil { - return nil, fmt.Errorf("failed to import plugin code %q: %w", manifestImport, err) + return nil, fmt.Errorf("failed to import plugin code %q: %w", manifest.Import, err) } return i, nil diff --git a/pkg/plugins/types.go b/pkg/plugins/types.go index 23254f7f7..ccae8dce4 100644 --- a/pkg/plugins/types.go +++ b/pkg/plugins/types.go @@ -11,8 +11,9 @@ const ( ) type Settings struct { - Envs []string `description:"Environment variables to forward to the wasm guest." json:"envs,omitempty" toml:"envs,omitempty" yaml:"envs,omitempty"` - Mounts []string `description:"Directory to mount to the wasm guest." json:"mounts,omitempty" toml:"mounts,omitempty" yaml:"mounts,omitempty"` + Envs []string `description:"Environment variables to forward to the wasm guest." json:"envs,omitempty" toml:"envs,omitempty" yaml:"envs,omitempty"` + Mounts []string `description:"Directory to mount to the wasm guest." json:"mounts,omitempty" toml:"mounts,omitempty" yaml:"mounts,omitempty"` + UseUnsafe bool `description:"Allow the plugin to use unsafe package." json:"useUnsafe,omitempty" toml:"useUnsafe,omitempty" yaml:"useUnsafe,omitempty"` } // Descriptor The static part of a plugin configuration. @@ -46,6 +47,7 @@ type Manifest struct { BasePkg string `yaml:"basePkg"` Compatibility string `yaml:"compatibility"` Summary string `yaml:"summary"` + UseUnsafe bool `yaml:"useUnsafe"` TestData map[string]interface{} `yaml:"testData"` } From dddb68cd5f02ba87769ec719f68e60a3cb25c16e Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Mon, 28 Apr 2025 14:30:06 +0200 Subject: [PATCH 004/172] Allow configuration of ACME provider http timeout --- docs/content/https/acme.md | 65 +++++++++++++++++++ docs/content/https/ref-acme.toml | 14 ++++ docs/content/https/ref-acme.txt | 14 ++++ docs/content/https/ref-acme.yaml | 14 ++++ .../tls/certificate-resolvers/acme.md | 2 + .../reference/static-configuration/cli-ref.md | 6 ++ .../reference/static-configuration/env-ref.md | 6 ++ .../reference/static-configuration/file.toml | 4 ++ .../reference/static-configuration/file.yaml | 4 ++ pkg/provider/acme/provider.go | 13 +++- 10 files changed, 140 insertions(+), 2 deletions(-) diff --git a/docs/content/https/acme.md b/docs/content/https/acme.md index 96c337342..764b4b30c 100644 --- a/docs/content/https/acme.md +++ b/docs/content/https/acme.md @@ -835,6 +835,71 @@ certificatesResolvers: # ... ``` +### `clientTimeout` + +_Optional, Default=2m_ + +`clientTimeout` is the total timeout for a complete HTTP transaction (including TCP connection, sending request and receiving response) with the ACME server. +It defaults to 2 minutes. + +!!! warning "This timeout encompasses the entire request-response cycle, including the response headers timeout. It must be at least `clientResponseHeaderTimeout`, otherwise the certificate resolver will fail to start." + +```yaml tab="File (YAML)" +certificatesResolvers: + myresolver: + acme: + # ... + clientTimeout: 1m + # ... +``` + +```toml tab="File (TOML)" +[certificatesResolvers.myresolver.acme] + # ... + clientTimeout=1m + # ... +``` + +```bash tab="CLI" +# ... +--certificatesresolvers.myresolver.acme.clientTimeout=1m +# ... +``` + +!!! warning + This should not be confused with any timeouts used for validating challenges. + +### `clientResponseHeaderTimeout` + +_Optional, Default=30s_ + +`clientResponseHeaderTimeout` defines how long the HTTP client waits for response headers when communicating with the `caServer`. +It defaults to 30 seconds. + +!!! warning "It must be lower than `clientTimeout`, otherwise the certificate resolver will fail to start." + +```yaml tab="File (YAML)" +certificatesResolvers: + myresolver: + acme: + # ... + clientResponseHeaderTimeout: 1m + # ... +``` + +```toml tab="File (TOML)" +[certificatesResolvers.myresolver.acme] + # ... + clientResponseHeaderTimeout=1m + # ... +``` + +```bash tab="CLI" +# ... +--certificatesresolvers.myresolver.acme.clientResponseHeaderTimeout=1m +# ... +``` + ### `preferredChain` _Optional, Default=""_ diff --git a/docs/content/https/ref-acme.toml b/docs/content/https/ref-acme.toml index e5db57a53..a93f4775c 100644 --- a/docs/content/https/ref-acme.toml +++ b/docs/content/https/ref-acme.toml @@ -30,6 +30,20 @@ # # certificatesDuration=2160 + # Timeout for a complete HTTP transaction with the ACME server. + # + # Optional + # Default: 2m + # + # clientTimeout="2m" + + # Timeout for receiving the response headers when communicating with the ACME server. + # + # Optional + # Default: 30s + # + # clientResponseHeaderTimeout="30s" + # Preferred chain to use. # # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. diff --git a/docs/content/https/ref-acme.txt b/docs/content/https/ref-acme.txt index d817a4dbe..10aa3b5d6 100644 --- a/docs/content/https/ref-acme.txt +++ b/docs/content/https/ref-acme.txt @@ -29,6 +29,20 @@ # --certificatesresolvers.myresolver.acme.certificatesDuration=2160 +# Timeout for a complete HTTP transaction with the ACME server. +# +# Optional +# Default: 2m +# +--certificatesresolvers.myresolver.acme.clientTimeout=2m + +# Timeout for receiving the response headers when communicating with the ACME server. +# +# Optional +# Default: 30s +# +--certificatesresolvers.myresolver.acme.clientResponseHeaderTimeout=30s + # Preferred chain to use. # # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. diff --git a/docs/content/https/ref-acme.yaml b/docs/content/https/ref-acme.yaml index 044c7ff9b..65cd2462b 100644 --- a/docs/content/https/ref-acme.yaml +++ b/docs/content/https/ref-acme.yaml @@ -32,6 +32,20 @@ certificatesResolvers: # # certificatesDuration: 2160 + # Timeout for a complete HTTP transaction with the ACME server. + # + # Optional + # Default: 2m + # + # clientTimeout: "2m" + + # Timeout for receiving the response headers when communicating with the ACME server. + # + # Optional + # Default: 30s + # + # clientResponseHeaderTimeout: "30s" + # Preferred chain to use. # # If the CA offers multiple certificate chains, prefer the chain with an issuer matching this Subject Common Name. diff --git a/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md b/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md index ec425f38a..3a14f3493 100644 --- a/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md +++ b/docs/content/reference/install-configuration/tls/certificate-resolvers/acme.md @@ -83,6 +83,8 @@ ACME certificate resolvers have the following configuration options: | `acme.eab.kid` | Key identifier from External CA. | "" | No | | `acme.eab.hmacEncoded` | HMAC key from External CA, should be in Base64 URL Encoding without padding format. | "" | No | | `acme.certificatesDuration` | The certificates' duration in hours, exclusively used to determine renewal dates. | 2160 | No | +| `acme.clientTimeout` | Timeout for HTTP Client used to communicate with the ACME server. | 2m | No | +| `acme.clientResponseHeaderTimeout` | Timeout for response headers for HTTP Client used to communicate with the ACME server. | 30s | No | | `acme.dnsChallenge` | Enable DNS-01 challenge. More information [here](#dnschallenge). | - | No | | `acme.dnsChallenge.provider` | DNS provider to use. | "" | No | | `acme.dnsChallenge.resolvers` | DNS servers to resolve the FQDN authority. | [] | No | diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index 92902ec2e..6d7e180a7 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -129,6 +129,12 @@ Define if the certificates pool must use a copy of the system cert pool. (Defaul `--certificatesresolvers..acme.certificatesduration`: Certificates' duration in hours. (Default: ```2160```) +`--certificatesresolvers..acme.clientresponseheadertimeout`: +Timeout for receiving the response headers when communicating with the ACME server. (Default: ```30```) + +`--certificatesresolvers..acme.clienttimeout`: +Timeout for a complete HTTP transaction with the ACME server. (Default: ```120```) + `--certificatesresolvers..acme.dnschallenge`: Activate DNS-01 Challenge. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index c0f46f53d..884fa4aaa 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -129,6 +129,12 @@ Define if the certificates pool must use a copy of the system cert pool. (Defaul `TRAEFIK_CERTIFICATESRESOLVERS__ACME_CERTIFICATESDURATION`: Certificates' duration in hours. (Default: ```2160```) +`TRAEFIK_CERTIFICATESRESOLVERS__ACME_CLIENTRESPONSEHEADERTIMEOUT`: +Timeout for receiving the response headers when communicating with the ACME server. (Default: ```30```) + +`TRAEFIK_CERTIFICATESRESOLVERS__ACME_CLIENTTIMEOUT`: +Timeout for a complete HTTP transaction with the ACME server. (Default: ```120```) + `TRAEFIK_CERTIFICATESRESOLVERS__ACME_DNSCHALLENGE`: Activate DNS-01 Challenge. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 204fead53..964cd8a7b 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -511,6 +511,8 @@ storage = "foobar" keyType = "foobar" certificatesDuration = 42 + clientTimeout = "42s" + clientResponseHeaderTimeout = "42s" caCertificates = ["foobar", "foobar"] caSystemCertPool = true caServerName = "foobar" @@ -542,6 +544,8 @@ storage = "foobar" keyType = "foobar" certificatesDuration = 42 + clientTimeout = "42s" + clientResponseHeaderTimeout = "42s" caCertificates = ["foobar", "foobar"] caSystemCertPool = true caServerName = "foobar" diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 2c9fb3223..691101e01 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -557,6 +557,8 @@ certificatesResolvers: kid: foobar hmacEncoded: foobar certificatesDuration: 42 + clientTimeout: 42s + clientResponseHeaderTimeout: 42s caCertificates: - foobar - foobar @@ -594,6 +596,8 @@ certificatesResolvers: kid: foobar hmacEncoded: foobar certificatesDuration: 42 + clientTimeout: 42s + clientResponseHeaderTimeout: 42s caCertificates: - foobar - foobar diff --git a/pkg/provider/acme/provider.go b/pkg/provider/acme/provider.go index 2ff220100..35ea148f8 100644 --- a/pkg/provider/acme/provider.go +++ b/pkg/provider/acme/provider.go @@ -50,6 +50,9 @@ type Configuration struct { EAB *EAB `description:"External Account Binding to use." json:"eab,omitempty" toml:"eab,omitempty" yaml:"eab,omitempty"` CertificatesDuration int `description:"Certificates' duration in hours." json:"certificatesDuration,omitempty" toml:"certificatesDuration,omitempty" yaml:"certificatesDuration,omitempty" export:"true"` + ClientTimeout ptypes.Duration `description:"Timeout for a complete HTTP transaction with the ACME server." json:"clientTimeout,omitempty" toml:"clientTimeout,omitempty" yaml:"clientTimeout,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + ClientResponseHeaderTimeout ptypes.Duration `description:"Timeout for receiving the response headers when communicating with the ACME server." json:"clientResponseHeaderTimeout,omitempty" toml:"clientResponseHeaderTimeout,omitempty" yaml:"clientResponseHeaderTimeout,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` + CACertificates []string `description:"Specify the paths to PEM encoded CA Certificates that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caCertificates,omitempty" toml:"caCertificates,omitempty" yaml:"caCertificates,omitempty"` CASystemCertPool bool `description:"Define if the certificates pool must use a copy of the system cert pool." json:"caSystemCertPool,omitempty" toml:"caSystemCertPool,omitempty" yaml:"caSystemCertPool,omitempty" export:"true"` CAServerName string `description:"Specify the CA server name that can be used to authenticate an ACME server with an HTTPS certificate not issued by a CA in the system-wide trusted root list." json:"caServerName,omitempty" toml:"caServerName,omitempty" yaml:"caServerName,omitempty" export:"true"` @@ -65,6 +68,8 @@ func (a *Configuration) SetDefaults() { a.Storage = "acme.json" a.KeyType = "RSA4096" a.CertificatesDuration = 3 * 30 * 24 // 90 Days + a.ClientTimeout = ptypes.Duration(2 * time.Minute) + a.ClientResponseHeaderTimeout = ptypes.Duration(30 * time.Second) } // CertAndStore allows mapping a TLS certificate to a TLS store. @@ -164,6 +169,10 @@ func (p *Provider) Init() error { return errors.New("cannot manage certificates with duration lower than 1 hour") } + if p.ClientTimeout < p.ClientResponseHeaderTimeout { + return errors.New("clientTimeout must be at least clientResponseHeaderTimeout") + } + var err error p.account, err = p.Store.GetAccount(p.ResolverName) if err != nil { @@ -379,7 +388,7 @@ func (p *Provider) createHTTPClient() (*http.Client, error) { } return &http.Client{ - Timeout: 2 * time.Minute, + Timeout: time.Duration(p.ClientTimeout), Transport: &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ @@ -387,7 +396,7 @@ func (p *Provider) createHTTPClient() (*http.Client, error) { KeepAlive: 30 * time.Second, }).DialContext, TLSHandshakeTimeout: 30 * time.Second, - ResponseHeaderTimeout: 30 * time.Second, + ResponseHeaderTimeout: time.Duration(p.ClientResponseHeaderTimeout), TLSClientConfig: tlsConfig, }, }, nil From 4790e4910ff5034b1b5d43aa95eea0d862589fd3 Mon Sep 17 00:00:00 2001 From: Charlie Chiang Date: Tue, 20 May 2025 20:40:05 +0800 Subject: [PATCH 005/172] Make the behavior of prefix matching in Ingress consistent with Kubernetes doc --- docs/content/providers/kubernetes-ingress.md | 23 +++ .../kubernetes/kubernetes-ingress.md | 1 + .../reference/static-configuration/cli-ref.md | 3 + .../reference/static-configuration/env-ref.md | 3 + .../reference/static-configuration/file.toml | 1 + .../reference/static-configuration/file.yaml | 1 + .../routing/providers/kubernetes-ingress.md | 2 +- .../Ingress-with-strict-prefix-matching.yml | 49 ++++++ pkg/provider/kubernetes/ingress/kubernetes.go | 38 ++++- .../kubernetes/ingress/kubernetes_test.go | 143 ++++++++++++++++++ 10 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 pkg/provider/kubernetes/ingress/fixtures/Ingress-with-strict-prefix-matching.yml diff --git a/docs/content/providers/kubernetes-ingress.md b/docs/content/providers/kubernetes-ingress.md index 08c77b888..dd9061de1 100644 --- a/docs/content/providers/kubernetes-ingress.md +++ b/docs/content/providers/kubernetes-ingress.md @@ -529,6 +529,29 @@ providers: --providers.kubernetesingress.nativeLBByDefault=true ``` +### `strictPrefixMatching` + +_Optional, Default: false_ + +Make prefix matching strictly comply with the Kubernetes Ingress specification (path-element-wise matching instead of character-by-character string matching). For example, a PathPrefix of `/foo` will match `/foo`, `/foo/`, and `/foo/bar` but not `/foobar`. + +```yaml tab="File (YAML)" +providers: + kubernetesIngress: + strictPrefixMatching: true + # ... +``` + +```toml tab="File (TOML)" +[providers.kubernetesIngress] + strictPrefixMatching = true + # ... +``` + +```bash tab="CLI" +--providers.kubernetesingress.strictPrefixMatching=true +``` + ### Further To learn more about the various aspects of the Ingress specification that Traefik supports, diff --git a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md index adf102e64..ceed9b222 100644 --- a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md +++ b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md @@ -58,6 +58,7 @@ which in turn creates the resulting routers, services, handlers, etc. | `providers.kubernetesIngress.allowExternalNameServices` | Allows the `Ingress` to reference ExternalName services. | false | No | | `providers.kubernetesIngress.nativeLBByDefault` | Allow using the Kubernetes Service load balancing between the pods instead of the one provided by Traefik for every `Ingress` by default.
It can br overridden in the [`ServerTransport`](../../../../routing/services/index.md#serverstransport). | false | No | | `providers.kubernetesIngress.disableClusterScopeResources` | Prevent from discovering cluster scope resources (`IngressClass` and `Nodes`).
By doing so, it alleviates the requirement of giving Traefik the rights to look up for cluster resources.
Furthermore, Traefik will not handle Ingresses with IngressClass references, therefore such Ingresses will be ignored (please note that annotations are not affected by this option).
This will also prevent from using the `NodePortLB` options on services. | false | No | +| `providers.kubernetesIngress.strictPrefixMatching` | Make prefix matching strictly comply with the Kubernetes Ingress specification (path-element-wise matching instead of character-by-character string matching). For example, a PathPrefix of `/foo` will match `/foo`, `/foo/`, and `/foo/bar` but not `/foobar`. | false | No | diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index 6d7e180a7..cd98f99af 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -1032,6 +1032,9 @@ Kubernetes namespaces. `--providers.kubernetesingress.nativelbbydefault`: Defines whether to use Native Kubernetes load-balancing mode by default. (Default: ```false```) +`--providers.kubernetesingress.strictprefixmatching`: +Make prefix matching strictly comply with the Kubernetes Ingress specification (path-element-wise matching instead of character-by-character string matching). (Default: ```false```) + `--providers.kubernetesingress.throttleduration`: Ingress refresh throttle duration (Default: ```0```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index 884fa4aaa..4eac71881 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -1032,6 +1032,9 @@ Kubernetes namespaces. `TRAEFIK_PROVIDERS_KUBERNETESINGRESS_NATIVELBBYDEFAULT`: Defines whether to use Native Kubernetes load-balancing mode by default. (Default: ```false```) +`TRAEFIK_PROVIDERS_KUBERNETESINGRESS_STRICTPREFIXMATCHING`: +Make prefix matching strictly comply with the Kubernetes Ingress specification (path-element-wise matching instead of character-by-character string matching). (Default: ```false```) + `TRAEFIK_PROVIDERS_KUBERNETESINGRESS_THROTTLEDURATION`: Ingress refresh throttle duration (Default: ```0```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 964cd8a7b..4e9e45ebe 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -138,6 +138,7 @@ disableIngressClassLookup = true disableClusterScopeResources = true nativeLBByDefault = true + strictPrefixMatching = true [providers.kubernetesIngress.ingressEndpoint] ip = "foobar" hostname = "foobar" diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 691101e01..77310bd39 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -157,6 +157,7 @@ providers: disableIngressClassLookup: true disableClusterScopeResources: true nativeLBByDefault: true + strictPrefixMatching: true kubernetesCRD: endpoint: foobar token: foobar diff --git a/docs/content/routing/providers/kubernetes-ingress.md b/docs/content/routing/providers/kubernetes-ingress.md index 5a82d8433..2cd511c27 100644 --- a/docs/content/routing/providers/kubernetes-ingress.md +++ b/docs/content/routing/providers/kubernetes-ingress.md @@ -439,7 +439,7 @@ If the Kubernetes cluster version is 1.18+, the new `pathType` property can be leveraged to define the rules matchers: - `Exact`: This path type forces the rule matcher to `Path` -- `Prefix`: This path type forces the rule matcher to `PathPrefix` +- `Prefix`: This path type forces the rule matcher to `PathPrefix`. Note that if you want the matching behavior to strictly comply with Kubernetes Ingress specification (request path is matched on an element-by-element basis), consider enabling [`strictPrefixMatching`](../../providers/kubernetes-ingress.md#strictprefixmatching) in the Ingress Provider configuration. Please see [this documentation](https://kubernetes.io/docs/concepts/services-networking/ingress/#path-types) for more information. diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-strict-prefix-matching.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-strict-prefix-matching.yml new file mode 100644 index 000000000..c52467d71 --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-strict-prefix-matching.yml @@ -0,0 +1,49 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: "" + namespace: testing + +spec: + rules: + - http: + paths: + - path: /bar + backend: + service: + name: service1 + port: + number: 80 + pathType: Prefix + +--- +kind: Service +apiVersion: v1 +metadata: + name: service1 + namespace: testing + +spec: + ports: + - port: 80 + clusterIP: 10.0.0.1 + +--- +kind: EndpointSlice +apiVersion: discovery.k8s.io/v1 +metadata: + name: service1-abc + namespace: testing + labels: + kubernetes.io/service-name: service1 + +addressType: IPv4 +ports: + - port: 8080 + name: "" +endpoints: + - addresses: + - 10.10.0.1 + - 10.21.0.1 + conditions: + ready: true diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index d83f29cbd..e8416fb8f 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -56,6 +56,7 @@ type Provider struct { DisableIngressClassLookup bool `description:"Disables the lookup of IngressClasses (Deprecated, please use DisableClusterScopeResources)." json:"disableIngressClassLookup,omitempty" toml:"disableIngressClassLookup,omitempty" yaml:"disableIngressClassLookup,omitempty" export:"true"` DisableClusterScopeResources bool `description:"Disables the lookup of cluster scope resources (incompatible with IngressClasses and NodePortLB enabled services)." json:"disableClusterScopeResources,omitempty" toml:"disableClusterScopeResources,omitempty" yaml:"disableClusterScopeResources,omitempty" export:"true"` NativeLBByDefault bool `description:"Defines whether to use Native Kubernetes load-balancing mode by default." json:"nativeLBByDefault,omitempty" toml:"nativeLBByDefault,omitempty" yaml:"nativeLBByDefault,omitempty" export:"true"` + StrictPrefixMatching bool `description:"Make prefix matching strictly comply with the Kubernetes Ingress specification (path-element-wise matching instead of character-by-character string matching)." json:"strictPrefixMatching,omitempty" toml:"strictPrefixMatching,omitempty" yaml:"strictPrefixMatching,omitempty" export:"true"` // The default rule syntax is initialized with the configuration defined by the user with the core.DefaultRuleSyntax option. DefaultRuleSyntax string `json:"-" toml:"-" yaml:"-" label:"-" file:"-"` @@ -698,7 +699,7 @@ func (p *Provider) loadRouter(rule netv1.IngressRule, pa netv1.HTTPIngressPath, matcher = "Path" } - rules = append(rules, fmt.Sprintf("%s(`%s`)", matcher, pa.Path)) + rules = append(rules, buildRule(p.StrictPrefixMatching, matcher, pa.Path)) } rt.Rule = strings.Join(rules, " && ") @@ -844,6 +845,41 @@ func makeRouterKeyWithHash(key, rule string) (string, error) { return dupKey, nil } +func buildRule(strictPrefixMatching bool, matcher string, path string) string { + // When enabled, strictPrefixMatching ensures that prefix matching follows + // the Kubernetes Ingress spec (path-element-wise instead of character-wise). + if strictPrefixMatching && matcher == "PathPrefix" { + // According to + // https://kubernetes.io/docs/concepts/services-networking/ingress/#examples, + // "/v12" should not match "/v1". + // + // Traefik's default PathPrefix matcher performs a character-wise prefix match, + // unlike Kubernetes which matches path elements. To mimic Kubernetes behavior, + // we will use Path and PathPrefix to replicate element-wise behavior. + // + // "PathPrefix" in Kubernetes Gateway API is semantically equivalent to the "Prefix" path type in the + // Kubernetes Ingress API. + return buildStrictPrefixMatchingRule(path) + } + + return fmt.Sprintf("%s(`%s`)", matcher, path) +} + +// buildStrictPrefixMatchingRule is a helper function to build a path prefix rule that matches path prefix split by `/`. +// For example, the paths `/abc`, `/abc/`, and `/abc/def` would all match the prefix `/abc`, +// but the path `/abcd` would not. See TestStrictPrefixMatchingRule() for more examples. +// +// "PathPrefix" in Kubernetes Gateway API is semantically equivalent to the "Prefix" path type in the +// Kubernetes Ingress API. +func buildStrictPrefixMatchingRule(path string) string { + if path == "/" { + return "PathPrefix(`/`)" + } + + path = strings.TrimSuffix(path, "/") + return fmt.Sprintf("(Path(`%[1]s`) || PathPrefix(`%[1]s/`))", path) +} + func throttleEvents(ctx context.Context, throttleDuration time.Duration, pool *safe.Pool, eventsChan <-chan interface{}) chan interface{} { if throttleDuration == 0 { return nil diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index f6019b63c..79f130391 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -3,7 +3,10 @@ package ingress import ( "context" "errors" + "fmt" "math" + "net/http" + "net/http/httptest" "os" "path/filepath" "strings" @@ -14,6 +17,7 @@ import ( "github.com/stretchr/testify/require" ptypes "github.com/traefik/paerser/types" "github.com/traefik/traefik/v3/pkg/config/dynamic" + traefikhttp "github.com/traefik/traefik/v3/pkg/muxer/http" "github.com/traefik/traefik/v3/pkg/provider" "github.com/traefik/traefik/v3/pkg/provider/kubernetes/k8s" "github.com/traefik/traefik/v3/pkg/tls" @@ -38,6 +42,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { disableIngressClassLookup bool disableClusterScopeResources bool defaultRuleSyntax string + strictPrefixMatching bool }{ { desc: "Empty ingresses", @@ -1621,6 +1626,40 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { }, }, }, + { + desc: "Ingress with strict prefix matching", + expected: &dynamic.Configuration{ + HTTP: &dynamic.HTTPConfiguration{ + Middlewares: map[string]*dynamic.Middleware{}, + Routers: map[string]*dynamic.Router{ + "testing-bar": { + Rule: "(Path(`/bar`) || PathPrefix(`/bar/`))", + Service: "testing-service1-80", + }, + }, + Services: map[string]*dynamic.Service{ + "testing-service1-80": { + LoadBalancer: &dynamic.ServersLoadBalancer{ + Strategy: dynamic.BalancerStrategyWRR, + PassHostHeader: pointer(true), + ResponseForwarding: &dynamic.ResponseForwarding{ + FlushInterval: ptypes.Duration(100 * time.Millisecond), + }, + Servers: []dynamic.Server{ + { + URL: "http://10.10.0.1:8080", + }, + { + URL: "http://10.21.0.1:8080", + }, + }, + }, + }, + }, + }, + }, + strictPrefixMatching: true, + }, } for _, test := range testCases { @@ -1634,6 +1673,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { DisableIngressClassLookup: test.disableIngressClassLookup, DisableClusterScopeResources: test.disableClusterScopeResources, DefaultRuleSyntax: test.defaultRuleSyntax, + StrictPrefixMatching: test.strictPrefixMatching, } conf := p.loadConfigurationFromIngresses(context.Background(), clientMock) @@ -2256,3 +2296,106 @@ func readResources(t *testing.T, paths []string) []runtime.Object { return k8sObjects } + +func TestStrictPrefixMatchingRule(t *testing.T) { + tests := []struct { + path string + requestPath string + match bool + }{ // The tests are taken from https://kubernetes.io/docs/concepts/services-networking/ingress/#examples + { + path: "/foo", + requestPath: "/foo", + match: true, + }, + { + path: "/foo", + requestPath: "/foo/", + match: true, + }, + { + path: "/foo/", + requestPath: "/foo", + match: true, + }, + { + path: "/foo/", + requestPath: "/foo/", + match: true, + }, + { + path: "/aaa/bb", + requestPath: "/aaa/bbb", + match: false, + }, + { + path: "/aaa/bbb", + requestPath: "/aaa/bbb", + match: true, + }, + { + path: "/aaa/bbb/", + requestPath: "/aaa/bbb", + match: true, + }, + { + path: "/aaa/bbb", + requestPath: "/aaa/bbb/", + match: true, + }, + { + path: "/aaa/bbb", + requestPath: "/aaa/bbb/ccc", + match: true, + }, + { + path: "/aaa/bbb", + requestPath: "/aaa/bbbxyz", + match: false, + }, + { + path: "/", + requestPath: "/aaa/ccc", + match: true, + }, + { + path: "/aaa", + requestPath: "/aaa/ccc", + match: true, + }, + { + path: "/...", + requestPath: "/aaa", + match: false, + }, + { + path: "/...", + requestPath: "/.../", + match: true, + }, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("Prefix match case %s", tt.path), func(t *testing.T) { + t.Parallel() + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) + muxer, err := traefikhttp.NewMuxer() + require.NoError(t, err) + + rule := buildStrictPrefixMatchingRule(tt.path) + err = muxer.AddRoute(rule, "", 0, handler) + require.NoError(t, err) + + w := httptest.NewRecorder() + req := httptest.NewRequest(http.MethodGet, tt.requestPath, http.NoBody) + muxer.ServeHTTP(w, req) + + if tt.match { + assert.Equal(t, http.StatusOK, w.Code) + } else { + assert.Equal(t, http.StatusNotFound, w.Code) + } + }) + } +} From f16fff577a31d3836ace5c9bbeb5d6ac4a84bd61 Mon Sep 17 00:00:00 2001 From: "Gina A." <70909035+gndz07@users.noreply.github.com> Date: Wed, 28 May 2025 11:26:04 +0200 Subject: [PATCH 006/172] Migrate Traefik Proxy dashboard UI to React --- .github/workflows/template-webui.yaml | 3 + .github/workflows/test-conformance.yaml | 4 +- .github/workflows/test-integration.yaml | 8 +- .github/workflows/test-unit.yaml | 15 +- .github/workflows/validate.yaml | 9 +- Makefile | 8 +- docs/content/assets/img/webui-dashboard.png | Bin 127729 -> 246976 bytes webui/.dockerignore | 5 - webui/.editorconfig | 15 +- webui/.env.sample | 2 + webui/.eslintignore | 7 - webui/.eslintrc.cjs | 68 - webui/.gitignore | 81 +- webui/.nvmrc | 2 +- webui/.postcssrc.cjs | 8 - webui/.prettierrc.json | 6 + webui/.stylintrc | 35 - webui/.yarnrc.yml | 1 + webui/Dockerfile | 17 - webui/babel.config.cjs | 16 - webui/buildx.Dockerfile | 18 + webui/dev/scripts/transfer.js | 17 - webui/eslint.config.mjs | 57 + webui/index.dev.html | 25 + webui/index.html | 39 +- webui/jsconfig.json | 39 - webui/package.json | 139 +- webui/postcss.config.cjs | 27 - webui/public/app-logo-128x128.png | Bin 18503 -> 0 bytes webui/public/browserconfig.xml | 9 + webui/public/favicon-16x16.png | Bin 0 -> 664 bytes webui/public/favicon-32x32.png | Bin 0 -> 1514 bytes webui/public/favicon.ico | Bin 0 -> 15406 bytes webui/public/manifest.json | 25 + webui/public/mockServiceWorker.js | 307 + webui/public/providers/consul.svg | 6 - webui/public/providers/consulcatalog.svg | 10 - webui/public/providers/docker.svg | 6 - webui/public/providers/ecs.svg | 36 - webui/public/providers/etcd.svg | 6 - webui/public/providers/file.svg | 6 - webui/public/providers/http.svg | 11 - webui/public/providers/hub.svg | 10 - webui/public/providers/internal.svg | 4 - webui/public/providers/kubernetes.svg | 6 - webui/public/providers/kubernetescrd.svg | 6 - webui/public/providers/kubernetesgateway.svg | 6 - webui/public/providers/kubernetesingress.svg | 6 - webui/public/providers/marathon.svg | 19 - webui/public/providers/nomad.svg | 7 - webui/public/providers/plugin.svg | 10 - webui/public/providers/rancher.svg | 6 - webui/public/providers/redis.svg | 17 - webui/public/providers/rest.svg | 6 - webui/public/providers/swarm.svg | 6 - webui/public/providers/zookeeper.svg | 128 - webui/public/robots.txt | 2 + .../traefiklabs-hub-button-app/main-v1.js | 2 +- .../traefiklabs-hub-button-app/main-v1.js.map | 2 +- webui/quasar.conf.js | 263 - webui/quasar.extensions.json | 5 - webui/readme.md | 28 +- webui/src-pwa/custom-service-worker.js | 5 - webui/src-pwa/pwa-flag.d.ts | 10 - webui/src-pwa/register-service-worker.js | 42 - webui/src/App.spec.tsx | 10 + webui/src/App.tsx | 113 + webui/src/App.vue | 44 - webui/src/_helpers/APP.js | 8 - webui/src/_helpers/Errors.js | 41 - webui/src/_helpers/Helps.js | 132 - webui/src/_helpers/Mutations.js | 45 - webui/src/_middleware/Boot.js | 44 - webui/src/_mixins/GetTableProps.js | 175 - webui/src/_mixins/Pagination.js | 74 - webui/src/_services/CoreService.js | 24 - webui/src/_services/EntrypointsService.js | 24 - webui/src/_services/HttpService.js | 67 - webui/src/_services/TcpService.js | 67 - webui/src/_services/UdpService.js | 47 - webui/src/_services/utils.js | 8 - webui/src/assets/logo.svg | 6 - webui/src/assets/middlewares-empty-dark.svg | 7 - webui/src/assets/middlewares-empty.svg | 7 - webui/src/assets/traefik.avatar.svg | 90 - webui/src/boot/api.js | 16 - webui/src/components/ClickableRow.tsx | 28 + webui/src/components/ScrollTopButton.tsx | 29 + webui/src/components/SpinnerLoader.tsx | 18 + webui/src/components/TableFilter.tsx | 116 + webui/src/components/ThemeSwitcher.tsx | 29 + webui/src/components/Toast.tsx | 102 + webui/src/components/ToastPool.spec.tsx | 79 + webui/src/components/ToastPool.tsx | 37 + webui/src/components/Tooltip.tsx | 47 + webui/src/components/TooltipText.tsx | 28 + webui/src/components/_commons/AvatarState.vue | 43 - .../src/components/_commons/BooleanState.vue | 71 - .../src/components/_commons/ChartDoughnut.vue | 34 - webui/src/components/_commons/Chips.vue | 22 - webui/src/components/_commons/MainTable.vue | 216 - webui/src/components/_commons/NavBar.vue | 316 - webui/src/components/_commons/PageDefault.vue | 15 - .../components/_commons/PanelHealthCheck.vue | 192 - .../components/_commons/PanelMiddlewares.vue | 1784 -- .../_commons/PanelMirroringServices.vue | 178 - .../_commons/PanelRouterDetails.vue | 274 - .../src/components/_commons/PanelServers.vue | 200 - .../_commons/PanelServiceDetails.vue | 279 - webui/src/components/_commons/PanelTLS.vue | 189 - .../_commons/PanelWeightedServices.vue | 165 - .../src/components/_commons/ProviderIcon.vue | 46 - webui/src/components/_commons/SidePanel.vue | 79 - webui/src/components/_commons/SkeletonBox.vue | 90 - .../_commons/StickyServiceDetails.vue | 85 - webui/src/components/_commons/TLSState.vue | 33 - webui/src/components/_commons/ToolBar.vue | 159 - .../src/components/_commons/ToolBarTable.vue | 126 - webui/src/components/buttons/IconButton.tsx | 33 + webui/src/components/buttons/SortButton.tsx | 49 + webui/src/components/dashboard/PanelChart.vue | 257 - webui/src/components/dashboard/PanelEntry.vue | 73 - .../src/components/dashboard/PanelFeature.vue | 108 - .../components/dashboard/PanelProvider.vue | 75 - webui/src/components/icons/AutoThemeIcon.tsx | 17 + webui/src/components/icons/EmptyIcon.tsx | 26 + webui/src/components/icons/Logo.tsx | 78 + webui/src/components/icons/PluginsIcon.tsx | 14 + webui/src/components/icons/SortIcon.tsx | 75 + webui/src/components/icons/index.tsx | 13 + .../src/components/icons/providers/Consul.tsx | 19 + .../src/components/icons/providers/Docker.tsx | 27 + webui/src/components/icons/providers/ECS.tsx | 27 + webui/src/components/icons/providers/Etcd.tsx | 19 + webui/src/components/icons/providers/File.tsx | 27 + webui/src/components/icons/providers/Http.tsx | 19 + webui/src/components/icons/providers/Hub.tsx | 19 + .../components/icons/providers/Internal.tsx | 19 + .../components/icons/providers/Kubernetes.tsx | 19 + .../src/components/icons/providers/Nomad.tsx | 19 + .../src/components/icons/providers/Plugin.tsx | 19 + .../src/components/icons/providers/Redis.tsx | 19 + .../components/icons/providers/Zookeeper.tsx | 19 + .../src/components/icons/providers/index.tsx | 74 + .../resources/AdditionalFeatures.spec.tsx | 53 + .../resources/AdditionalFeatures.tsx | 73 + .../components/resources/DetailSections.tsx | 352 + .../src/components/resources/FeatureCard.tsx | 45 + .../src/components/resources/GenericTable.tsx | 45 + .../components/resources/IpStrategyTable.tsx | 45 + .../components/resources/MiddlewarePanel.tsx | 113 + .../src/components/resources/ProviderIcon.tsx | 74 + .../resources/RenderUnknownProp.spec.tsx | 162 + .../resources/RenderUnknownProp.tsx | 76 + .../src/components/resources/ResourceCard.tsx | 26 + .../components/resources/ResourceStatus.tsx | 71 + .../src/components/resources/RouterPanel.tsx | 76 + webui/src/components/resources/Status.tsx | 68 + webui/src/components/resources/TlsPanel.tsx | 77 + .../TraefikResourceStatsCard.spec.tsx | 53 + .../resources/TraefikResourceStatsCard.tsx | 216 + .../resources/UsedByRoutersSection.tsx | 146 + webui/src/components/tables/SortableTh.tsx | 56 + webui/src/contexts/toasts.tsx | 40 + webui/src/css/fonts/nunito-v11-latin-600.eot | Bin 23216 -> 0 bytes webui/src/css/fonts/nunito-v11-latin-600.svg | 438 - webui/src/css/fonts/nunito-v11-latin-600.ttf | Bin 48128 -> 0 bytes webui/src/css/fonts/nunito-v11-latin-600.woff | Bin 24668 -> 0 bytes .../src/css/fonts/nunito-v11-latin-600.woff2 | Bin 20084 -> 0 bytes webui/src/css/fonts/nunito-v11-latin-700.eot | Bin 23311 -> 0 bytes webui/src/css/fonts/nunito-v11-latin-700.svg | 439 - webui/src/css/fonts/nunito-v11-latin-700.ttf | Bin 47456 -> 0 bytes webui/src/css/fonts/nunito-v11-latin-700.woff | Bin 24656 -> 0 bytes .../src/css/fonts/nunito-v11-latin-700.woff2 | Bin 20128 -> 0 bytes .../css/fonts/nunito-v11-latin-regular.eot | Bin 23037 -> 0 bytes .../css/fonts/nunito-v11-latin-regular.svg | 437 - .../css/fonts/nunito-v11-latin-regular.ttf | Bin 47680 -> 0 bytes .../css/fonts/nunito-v11-latin-regular.woff | Bin 24528 -> 0 bytes .../css/fonts/nunito-v11-latin-regular.woff2 | Bin 19976 -> 0 bytes webui/src/css/quasar.variables.scss | 22 - webui/src/css/sass/_fonts.scss | 39 - webui/src/css/sass/_mixins.scss | 31 - webui/src/css/sass/_variables.scss | 31 - webui/src/css/sass/app.scss | 212 - .../hooks/use-fetch-with-pagination.spec.tsx | 195 + webui/src/hooks/use-fetch-with-pagination.tsx | 89 + webui/src/hooks/use-overview-totals.tsx | 36 + webui/src/hooks/use-previous.tsx | 13 + webui/src/hooks/use-resource-detail.spec.tsx | 60 + webui/src/hooks/use-resource-detail.tsx | 180 + webui/src/hooks/use-theme.ts | 49 + webui/src/hooks/use-version.tsx | 13 + webui/src/index.tsx | 21 + webui/src/layout/Container.tsx | 13 + webui/src/layout/EmptyPlaceholder.tsx | 9 + webui/src/layout/ErrorFallback.tsx | 20 + webui/src/layout/ErrorSuspenseWrapper.tsx | 26 + webui/src/layout/Navigation.spec.tsx | 21 + webui/src/layout/Navigation.tsx | 357 + webui/src/layout/Page.spec.tsx | 10 + webui/src/layout/Page.tsx | 70 + webui/src/layouts/Default.vue | 30 - webui/src/libs/fetch.ts | 24 + webui/src/libs/fetchMany.ts | 16 + webui/src/libs/objectHandlers.ts | 8 + webui/src/libs/parsers.ts | 14 + webui/src/libs/utils.ts | 8 + webui/src/mocks/browser.ts | 5 + webui/src/mocks/data/api-entrypoints.json | 144 + .../src/mocks/data/api-http_middlewares.json | 418 + webui/src/mocks/data/api-http_routers.json | 171 + webui/src/mocks/data/api-http_services.json | 245 + webui/src/mocks/data/api-overview.json | 73 + webui/src/mocks/data/api-tcp_middlewares.json | 32 + webui/src/mocks/data/api-tcp_routers.json | 18 + webui/src/mocks/data/api-tcp_services.json | 19 + webui/src/mocks/data/api-udp_routers.json | 15 + webui/src/mocks/data/api-udp_services.json | 52 + webui/src/mocks/data/api-version.json | 6 + webui/src/mocks/data/ee-api-errors.json | 23 + webui/src/mocks/handlers.ts | 32 + webui/src/mocks/server.ts | 5 + webui/src/mocks/utils.ts | 66 + webui/src/pages/NotFound.tsx | 24 + webui/src/pages/_commons/Error404.vue | 23 - webui/src/pages/_commons/MiddlewareDetail.vue | 239 - webui/src/pages/_commons/RouterDetail.vue | 428 - webui/src/pages/_commons/ServiceDetail.vue | 353 - webui/src/pages/dashboard/Dashboard.tsx | 234 + webui/src/pages/dashboard/Index.vue | 386 - webui/src/pages/http/HttpMiddleware.spec.tsx | 481 + webui/src/pages/http/HttpMiddleware.tsx | 73 + webui/src/pages/http/HttpMiddlewares.spec.tsx | 129 + webui/src/pages/http/HttpMiddlewares.tsx | 125 + webui/src/pages/http/HttpRouter.spec.tsx | 121 + webui/src/pages/http/HttpRouter.tsx | 152 + webui/src/pages/http/HttpRouters.spec.tsx | 109 + webui/src/pages/http/HttpRouters.tsx | 146 + webui/src/pages/http/HttpService.spec.tsx | 220 + webui/src/pages/http/HttpService.tsx | 314 + webui/src/pages/http/HttpServices.spec.tsx | 101 + webui/src/pages/http/HttpServices.tsx | 124 + webui/src/pages/http/Middlewares.vue | 109 - webui/src/pages/http/Routers.vue | 111 - webui/src/pages/http/Services.vue | 109 - webui/src/pages/http/index.ts | 6 + webui/src/pages/index.ts | 7 + webui/src/pages/tcp/Middlewares.vue | 109 - webui/src/pages/tcp/Routers.vue | 111 - webui/src/pages/tcp/Services.vue | 108 - webui/src/pages/tcp/TcpMiddleware.spec.tsx | 128 + webui/src/pages/tcp/TcpMiddleware.tsx | 73 + webui/src/pages/tcp/TcpMiddlewares.spec.tsx | 67 + webui/src/pages/tcp/TcpMiddlewares.tsx | 125 + webui/src/pages/tcp/TcpRouter.spec.tsx | 102 + webui/src/pages/tcp/TcpRouter.tsx | 82 + webui/src/pages/tcp/TcpRouters.spec.tsx | 85 + webui/src/pages/tcp/TcpRouters.tsx | 142 + webui/src/pages/tcp/TcpService.spec.tsx | 163 + webui/src/pages/tcp/TcpService.tsx | 66 + webui/src/pages/tcp/TcpServices.spec.tsx | 82 + webui/src/pages/tcp/TcpServices.tsx | 124 + webui/src/pages/tcp/index.ts | 6 + webui/src/pages/udp/Routers.vue | 111 - webui/src/pages/udp/Services.vue | 109 - webui/src/pages/udp/UdpRouter.spec.tsx | 80 + webui/src/pages/udp/UdpRouter.tsx | 79 + webui/src/pages/udp/UdpRouters.spec.tsx | 85 + webui/src/pages/udp/UdpRouters.tsx | 127 + webui/src/pages/udp/UdpService.spec.tsx | 163 + webui/src/pages/udp/UdpService.tsx | 66 + webui/src/pages/udp/UdpServices.spec.tsx | 82 + webui/src/pages/udp/UdpServices.tsx | 124 + webui/src/pages/udp/index.ts | 4 + webui/src/router/index.js | 18 - webui/src/router/routes.js | 262 - webui/src/routes.tsx | 94 + webui/src/store/core/actions.js | 25 - webui/src/store/core/getters.js | 13 - webui/src/store/core/index.js | 12 - webui/src/store/core/mutations.js | 26 - webui/src/store/core/state.js | 4 - webui/src/store/entrypoints/actions.js | 27 - webui/src/store/entrypoints/getters.js | 13 - webui/src/store/entrypoints/index.js | 12 - webui/src/store/entrypoints/mutations.js | 37 - webui/src/store/entrypoints/state.js | 4 - webui/src/store/http/actions.js | 79 - webui/src/store/http/getters.js | 41 - webui/src/store/http/index.js | 12 - webui/src/store/http/mutations.js | 158 - webui/src/store/http/mutations.vitest.spec.js | 292 - webui/src/store/http/state.js | 8 - webui/src/store/index.js | 33 - webui/src/store/platform/index.js | 49 - webui/src/store/store-flag.d.ts | 10 - webui/src/store/tcp/actions.js | 79 - webui/src/store/tcp/getters.js | 41 - webui/src/store/tcp/index.js | 12 - webui/src/store/tcp/mutations.js | 157 - webui/src/store/tcp/mutations.vitest.spec.js | 292 - webui/src/store/tcp/state.js | 8 - webui/src/store/udp/actions.js | 53 - webui/src/store/udp/getters.js | 27 - webui/src/store/udp/index.js | 12 - webui/src/store/udp/mutations.js | 105 - webui/src/store/udp/mutations.vitest.spec.js | 197 - webui/src/store/udp/state.js | 6 - webui/src/types/global.d.ts | 9 + webui/src/utils/breakpoints.ts | 9 + webui/src/utils/mocks.ts | 11 + webui/src/utils/position.ts | 37 + webui/src/utils/string.ts | 5 + webui/src/utils/test.tsx | 45 + webui/src/utils/wait.ts | 1 + webui/src/vite-env.d.ts | 1 + .../DONT-EDIT-FILES-IN-THIS-DIRECTORY.md | 1 - webui/test/setup.ts | 76 + webui/test/vitest/setup-file.js | 1 - webui/tsconfig.json | 34 + webui/tsconfig.node.json | 11 + webui/vite.config.ts | 28 + webui/vitest.config.mjs | 24 - webui/yarn.lock | 23500 +++++++++++----- 324 files changed, 28303 insertions(+), 19567 deletions(-) delete mode 100644 webui/.dockerignore create mode 100644 webui/.env.sample delete mode 100644 webui/.eslintignore delete mode 100644 webui/.eslintrc.cjs delete mode 100644 webui/.postcssrc.cjs create mode 100644 webui/.prettierrc.json delete mode 100644 webui/.stylintrc create mode 100644 webui/.yarnrc.yml delete mode 100644 webui/Dockerfile delete mode 100644 webui/babel.config.cjs create mode 100644 webui/buildx.Dockerfile delete mode 100644 webui/dev/scripts/transfer.js create mode 100644 webui/eslint.config.mjs create mode 100644 webui/index.dev.html delete mode 100644 webui/jsconfig.json delete mode 100644 webui/postcss.config.cjs delete mode 100755 webui/public/app-logo-128x128.png create mode 100644 webui/public/browserconfig.xml create mode 100644 webui/public/favicon-16x16.png create mode 100644 webui/public/favicon-32x32.png create mode 100644 webui/public/favicon.ico create mode 100644 webui/public/manifest.json create mode 100644 webui/public/mockServiceWorker.js delete mode 100644 webui/public/providers/consul.svg delete mode 100644 webui/public/providers/consulcatalog.svg delete mode 100644 webui/public/providers/docker.svg delete mode 100644 webui/public/providers/ecs.svg delete mode 100644 webui/public/providers/etcd.svg delete mode 100644 webui/public/providers/file.svg delete mode 100644 webui/public/providers/http.svg delete mode 100644 webui/public/providers/hub.svg delete mode 100644 webui/public/providers/internal.svg delete mode 100644 webui/public/providers/kubernetes.svg delete mode 100644 webui/public/providers/kubernetescrd.svg delete mode 100644 webui/public/providers/kubernetesgateway.svg delete mode 100644 webui/public/providers/kubernetesingress.svg delete mode 100644 webui/public/providers/marathon.svg delete mode 100755 webui/public/providers/nomad.svg delete mode 100644 webui/public/providers/plugin.svg delete mode 100644 webui/public/providers/rancher.svg delete mode 100644 webui/public/providers/redis.svg delete mode 100644 webui/public/providers/rest.svg delete mode 100644 webui/public/providers/swarm.svg delete mode 100644 webui/public/providers/zookeeper.svg create mode 100644 webui/public/robots.txt delete mode 100644 webui/quasar.conf.js delete mode 100644 webui/quasar.extensions.json delete mode 100644 webui/src-pwa/custom-service-worker.js delete mode 100644 webui/src-pwa/pwa-flag.d.ts delete mode 100644 webui/src-pwa/register-service-worker.js create mode 100644 webui/src/App.spec.tsx create mode 100644 webui/src/App.tsx delete mode 100644 webui/src/App.vue delete mode 100644 webui/src/_helpers/APP.js delete mode 100644 webui/src/_helpers/Errors.js delete mode 100644 webui/src/_helpers/Helps.js delete mode 100644 webui/src/_helpers/Mutations.js delete mode 100644 webui/src/_middleware/Boot.js delete mode 100644 webui/src/_mixins/GetTableProps.js delete mode 100644 webui/src/_mixins/Pagination.js delete mode 100644 webui/src/_services/CoreService.js delete mode 100644 webui/src/_services/EntrypointsService.js delete mode 100644 webui/src/_services/HttpService.js delete mode 100644 webui/src/_services/TcpService.js delete mode 100644 webui/src/_services/UdpService.js delete mode 100644 webui/src/_services/utils.js delete mode 100644 webui/src/assets/logo.svg delete mode 100644 webui/src/assets/middlewares-empty-dark.svg delete mode 100644 webui/src/assets/middlewares-empty.svg delete mode 100644 webui/src/assets/traefik.avatar.svg delete mode 100644 webui/src/boot/api.js create mode 100644 webui/src/components/ClickableRow.tsx create mode 100644 webui/src/components/ScrollTopButton.tsx create mode 100644 webui/src/components/SpinnerLoader.tsx create mode 100644 webui/src/components/TableFilter.tsx create mode 100644 webui/src/components/ThemeSwitcher.tsx create mode 100644 webui/src/components/Toast.tsx create mode 100644 webui/src/components/ToastPool.spec.tsx create mode 100644 webui/src/components/ToastPool.tsx create mode 100644 webui/src/components/Tooltip.tsx create mode 100644 webui/src/components/TooltipText.tsx delete mode 100644 webui/src/components/_commons/AvatarState.vue delete mode 100644 webui/src/components/_commons/BooleanState.vue delete mode 100644 webui/src/components/_commons/ChartDoughnut.vue delete mode 100644 webui/src/components/_commons/Chips.vue delete mode 100644 webui/src/components/_commons/MainTable.vue delete mode 100644 webui/src/components/_commons/NavBar.vue delete mode 100644 webui/src/components/_commons/PageDefault.vue delete mode 100644 webui/src/components/_commons/PanelHealthCheck.vue delete mode 100644 webui/src/components/_commons/PanelMiddlewares.vue delete mode 100644 webui/src/components/_commons/PanelMirroringServices.vue delete mode 100644 webui/src/components/_commons/PanelRouterDetails.vue delete mode 100644 webui/src/components/_commons/PanelServers.vue delete mode 100644 webui/src/components/_commons/PanelServiceDetails.vue delete mode 100644 webui/src/components/_commons/PanelTLS.vue delete mode 100644 webui/src/components/_commons/PanelWeightedServices.vue delete mode 100644 webui/src/components/_commons/ProviderIcon.vue delete mode 100644 webui/src/components/_commons/SidePanel.vue delete mode 100644 webui/src/components/_commons/SkeletonBox.vue delete mode 100644 webui/src/components/_commons/StickyServiceDetails.vue delete mode 100644 webui/src/components/_commons/TLSState.vue delete mode 100644 webui/src/components/_commons/ToolBar.vue delete mode 100644 webui/src/components/_commons/ToolBarTable.vue create mode 100644 webui/src/components/buttons/IconButton.tsx create mode 100644 webui/src/components/buttons/SortButton.tsx delete mode 100644 webui/src/components/dashboard/PanelChart.vue delete mode 100644 webui/src/components/dashboard/PanelEntry.vue delete mode 100644 webui/src/components/dashboard/PanelFeature.vue delete mode 100644 webui/src/components/dashboard/PanelProvider.vue create mode 100644 webui/src/components/icons/AutoThemeIcon.tsx create mode 100644 webui/src/components/icons/EmptyIcon.tsx create mode 100644 webui/src/components/icons/Logo.tsx create mode 100644 webui/src/components/icons/PluginsIcon.tsx create mode 100644 webui/src/components/icons/SortIcon.tsx create mode 100644 webui/src/components/icons/index.tsx create mode 100644 webui/src/components/icons/providers/Consul.tsx create mode 100644 webui/src/components/icons/providers/Docker.tsx create mode 100644 webui/src/components/icons/providers/ECS.tsx create mode 100644 webui/src/components/icons/providers/Etcd.tsx create mode 100644 webui/src/components/icons/providers/File.tsx create mode 100644 webui/src/components/icons/providers/Http.tsx create mode 100644 webui/src/components/icons/providers/Hub.tsx create mode 100644 webui/src/components/icons/providers/Internal.tsx create mode 100644 webui/src/components/icons/providers/Kubernetes.tsx create mode 100644 webui/src/components/icons/providers/Nomad.tsx create mode 100644 webui/src/components/icons/providers/Plugin.tsx create mode 100644 webui/src/components/icons/providers/Redis.tsx create mode 100644 webui/src/components/icons/providers/Zookeeper.tsx create mode 100644 webui/src/components/icons/providers/index.tsx create mode 100644 webui/src/components/resources/AdditionalFeatures.spec.tsx create mode 100644 webui/src/components/resources/AdditionalFeatures.tsx create mode 100644 webui/src/components/resources/DetailSections.tsx create mode 100644 webui/src/components/resources/FeatureCard.tsx create mode 100644 webui/src/components/resources/GenericTable.tsx create mode 100644 webui/src/components/resources/IpStrategyTable.tsx create mode 100644 webui/src/components/resources/MiddlewarePanel.tsx create mode 100644 webui/src/components/resources/ProviderIcon.tsx create mode 100644 webui/src/components/resources/RenderUnknownProp.spec.tsx create mode 100644 webui/src/components/resources/RenderUnknownProp.tsx create mode 100644 webui/src/components/resources/ResourceCard.tsx create mode 100644 webui/src/components/resources/ResourceStatus.tsx create mode 100644 webui/src/components/resources/RouterPanel.tsx create mode 100644 webui/src/components/resources/Status.tsx create mode 100644 webui/src/components/resources/TlsPanel.tsx create mode 100644 webui/src/components/resources/TraefikResourceStatsCard.spec.tsx create mode 100644 webui/src/components/resources/TraefikResourceStatsCard.tsx create mode 100644 webui/src/components/resources/UsedByRoutersSection.tsx create mode 100644 webui/src/components/tables/SortableTh.tsx create mode 100644 webui/src/contexts/toasts.tsx delete mode 100644 webui/src/css/fonts/nunito-v11-latin-600.eot delete mode 100644 webui/src/css/fonts/nunito-v11-latin-600.svg delete mode 100644 webui/src/css/fonts/nunito-v11-latin-600.ttf delete mode 100644 webui/src/css/fonts/nunito-v11-latin-600.woff delete mode 100644 webui/src/css/fonts/nunito-v11-latin-600.woff2 delete mode 100644 webui/src/css/fonts/nunito-v11-latin-700.eot delete mode 100644 webui/src/css/fonts/nunito-v11-latin-700.svg delete mode 100644 webui/src/css/fonts/nunito-v11-latin-700.ttf delete mode 100644 webui/src/css/fonts/nunito-v11-latin-700.woff delete mode 100644 webui/src/css/fonts/nunito-v11-latin-700.woff2 delete mode 100644 webui/src/css/fonts/nunito-v11-latin-regular.eot delete mode 100644 webui/src/css/fonts/nunito-v11-latin-regular.svg delete mode 100644 webui/src/css/fonts/nunito-v11-latin-regular.ttf delete mode 100644 webui/src/css/fonts/nunito-v11-latin-regular.woff delete mode 100644 webui/src/css/fonts/nunito-v11-latin-regular.woff2 delete mode 100644 webui/src/css/quasar.variables.scss delete mode 100644 webui/src/css/sass/_fonts.scss delete mode 100644 webui/src/css/sass/_mixins.scss delete mode 100644 webui/src/css/sass/_variables.scss delete mode 100644 webui/src/css/sass/app.scss create mode 100644 webui/src/hooks/use-fetch-with-pagination.spec.tsx create mode 100644 webui/src/hooks/use-fetch-with-pagination.tsx create mode 100644 webui/src/hooks/use-overview-totals.tsx create mode 100644 webui/src/hooks/use-previous.tsx create mode 100644 webui/src/hooks/use-resource-detail.spec.tsx create mode 100644 webui/src/hooks/use-resource-detail.tsx create mode 100644 webui/src/hooks/use-theme.ts create mode 100644 webui/src/hooks/use-version.tsx create mode 100644 webui/src/index.tsx create mode 100644 webui/src/layout/Container.tsx create mode 100644 webui/src/layout/EmptyPlaceholder.tsx create mode 100644 webui/src/layout/ErrorFallback.tsx create mode 100644 webui/src/layout/ErrorSuspenseWrapper.tsx create mode 100644 webui/src/layout/Navigation.spec.tsx create mode 100644 webui/src/layout/Navigation.tsx create mode 100644 webui/src/layout/Page.spec.tsx create mode 100644 webui/src/layout/Page.tsx delete mode 100644 webui/src/layouts/Default.vue create mode 100644 webui/src/libs/fetch.ts create mode 100644 webui/src/libs/fetchMany.ts create mode 100644 webui/src/libs/objectHandlers.ts create mode 100644 webui/src/libs/parsers.ts create mode 100644 webui/src/libs/utils.ts create mode 100644 webui/src/mocks/browser.ts create mode 100644 webui/src/mocks/data/api-entrypoints.json create mode 100644 webui/src/mocks/data/api-http_middlewares.json create mode 100644 webui/src/mocks/data/api-http_routers.json create mode 100644 webui/src/mocks/data/api-http_services.json create mode 100644 webui/src/mocks/data/api-overview.json create mode 100644 webui/src/mocks/data/api-tcp_middlewares.json create mode 100644 webui/src/mocks/data/api-tcp_routers.json create mode 100644 webui/src/mocks/data/api-tcp_services.json create mode 100644 webui/src/mocks/data/api-udp_routers.json create mode 100644 webui/src/mocks/data/api-udp_services.json create mode 100644 webui/src/mocks/data/api-version.json create mode 100644 webui/src/mocks/data/ee-api-errors.json create mode 100644 webui/src/mocks/handlers.ts create mode 100644 webui/src/mocks/server.ts create mode 100644 webui/src/mocks/utils.ts create mode 100644 webui/src/pages/NotFound.tsx delete mode 100644 webui/src/pages/_commons/Error404.vue delete mode 100644 webui/src/pages/_commons/MiddlewareDetail.vue delete mode 100644 webui/src/pages/_commons/RouterDetail.vue delete mode 100644 webui/src/pages/_commons/ServiceDetail.vue create mode 100644 webui/src/pages/dashboard/Dashboard.tsx delete mode 100644 webui/src/pages/dashboard/Index.vue create mode 100644 webui/src/pages/http/HttpMiddleware.spec.tsx create mode 100644 webui/src/pages/http/HttpMiddleware.tsx create mode 100644 webui/src/pages/http/HttpMiddlewares.spec.tsx create mode 100644 webui/src/pages/http/HttpMiddlewares.tsx create mode 100644 webui/src/pages/http/HttpRouter.spec.tsx create mode 100644 webui/src/pages/http/HttpRouter.tsx create mode 100644 webui/src/pages/http/HttpRouters.spec.tsx create mode 100644 webui/src/pages/http/HttpRouters.tsx create mode 100644 webui/src/pages/http/HttpService.spec.tsx create mode 100644 webui/src/pages/http/HttpService.tsx create mode 100644 webui/src/pages/http/HttpServices.spec.tsx create mode 100644 webui/src/pages/http/HttpServices.tsx delete mode 100644 webui/src/pages/http/Middlewares.vue delete mode 100644 webui/src/pages/http/Routers.vue delete mode 100644 webui/src/pages/http/Services.vue create mode 100644 webui/src/pages/http/index.ts create mode 100644 webui/src/pages/index.ts delete mode 100644 webui/src/pages/tcp/Middlewares.vue delete mode 100644 webui/src/pages/tcp/Routers.vue delete mode 100644 webui/src/pages/tcp/Services.vue create mode 100644 webui/src/pages/tcp/TcpMiddleware.spec.tsx create mode 100644 webui/src/pages/tcp/TcpMiddleware.tsx create mode 100644 webui/src/pages/tcp/TcpMiddlewares.spec.tsx create mode 100644 webui/src/pages/tcp/TcpMiddlewares.tsx create mode 100644 webui/src/pages/tcp/TcpRouter.spec.tsx create mode 100644 webui/src/pages/tcp/TcpRouter.tsx create mode 100644 webui/src/pages/tcp/TcpRouters.spec.tsx create mode 100644 webui/src/pages/tcp/TcpRouters.tsx create mode 100644 webui/src/pages/tcp/TcpService.spec.tsx create mode 100644 webui/src/pages/tcp/TcpService.tsx create mode 100644 webui/src/pages/tcp/TcpServices.spec.tsx create mode 100644 webui/src/pages/tcp/TcpServices.tsx create mode 100644 webui/src/pages/tcp/index.ts delete mode 100644 webui/src/pages/udp/Routers.vue delete mode 100644 webui/src/pages/udp/Services.vue create mode 100644 webui/src/pages/udp/UdpRouter.spec.tsx create mode 100644 webui/src/pages/udp/UdpRouter.tsx create mode 100644 webui/src/pages/udp/UdpRouters.spec.tsx create mode 100644 webui/src/pages/udp/UdpRouters.tsx create mode 100644 webui/src/pages/udp/UdpService.spec.tsx create mode 100644 webui/src/pages/udp/UdpService.tsx create mode 100644 webui/src/pages/udp/UdpServices.spec.tsx create mode 100644 webui/src/pages/udp/UdpServices.tsx create mode 100644 webui/src/pages/udp/index.ts delete mode 100644 webui/src/router/index.js delete mode 100644 webui/src/router/routes.js create mode 100644 webui/src/routes.tsx delete mode 100644 webui/src/store/core/actions.js delete mode 100644 webui/src/store/core/getters.js delete mode 100644 webui/src/store/core/index.js delete mode 100644 webui/src/store/core/mutations.js delete mode 100644 webui/src/store/core/state.js delete mode 100644 webui/src/store/entrypoints/actions.js delete mode 100644 webui/src/store/entrypoints/getters.js delete mode 100644 webui/src/store/entrypoints/index.js delete mode 100644 webui/src/store/entrypoints/mutations.js delete mode 100644 webui/src/store/entrypoints/state.js delete mode 100644 webui/src/store/http/actions.js delete mode 100644 webui/src/store/http/getters.js delete mode 100644 webui/src/store/http/index.js delete mode 100644 webui/src/store/http/mutations.js delete mode 100644 webui/src/store/http/mutations.vitest.spec.js delete mode 100644 webui/src/store/http/state.js delete mode 100644 webui/src/store/index.js delete mode 100644 webui/src/store/platform/index.js delete mode 100644 webui/src/store/store-flag.d.ts delete mode 100644 webui/src/store/tcp/actions.js delete mode 100644 webui/src/store/tcp/getters.js delete mode 100644 webui/src/store/tcp/index.js delete mode 100644 webui/src/store/tcp/mutations.js delete mode 100644 webui/src/store/tcp/mutations.vitest.spec.js delete mode 100644 webui/src/store/tcp/state.js delete mode 100644 webui/src/store/udp/actions.js delete mode 100644 webui/src/store/udp/getters.js delete mode 100644 webui/src/store/udp/index.js delete mode 100644 webui/src/store/udp/mutations.js delete mode 100644 webui/src/store/udp/mutations.vitest.spec.js delete mode 100644 webui/src/store/udp/state.js create mode 100644 webui/src/types/global.d.ts create mode 100644 webui/src/utils/breakpoints.ts create mode 100644 webui/src/utils/mocks.ts create mode 100644 webui/src/utils/position.ts create mode 100644 webui/src/utils/string.ts create mode 100644 webui/src/utils/test.tsx create mode 100644 webui/src/utils/wait.ts create mode 100644 webui/src/vite-env.d.ts delete mode 100644 webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md create mode 100644 webui/test/setup.ts delete mode 100644 webui/test/vitest/setup-file.js create mode 100644 webui/tsconfig.json create mode 100644 webui/tsconfig.node.json create mode 100644 webui/vite.config.ts delete mode 100644 webui/vitest.config.mjs diff --git a/.github/workflows/template-webui.yaml b/.github/workflows/template-webui.yaml index df52d75c1..e8e039fa3 100644 --- a/.github/workflows/template-webui.yaml +++ b/.github/workflows/template-webui.yaml @@ -12,6 +12,9 @@ jobs: with: fetch-depth: 0 + - name: Enable corepack + run: corepack enable + - name: Setup node uses: actions/setup-node@v4 with: diff --git a/.github/workflows/test-conformance.yaml b/.github/workflows/test-conformance.yaml index f1f02709b..f7bcf3c7b 100644 --- a/.github/workflows/test-conformance.yaml +++ b/.github/workflows/test-conformance.yaml @@ -31,7 +31,9 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: Avoid generating webui - run: touch webui/static/index.html + run: | + mkdir webui/static + touch webui/static/index.html - name: K8s Gateway API conformance test and report run: | diff --git a/.github/workflows/test-integration.yaml b/.github/workflows/test-integration.yaml index f8eac5dc6..b7bbb91c3 100644 --- a/.github/workflows/test-integration.yaml +++ b/.github/workflows/test-integration.yaml @@ -31,7 +31,9 @@ jobs: check-latest: true - name: Avoid generating webui - run: touch webui/static/index.html + run: | + mkdir webui/static + touch webui/static/index.html - name: Build binary run: make binary @@ -59,7 +61,9 @@ jobs: check-latest: true - name: Avoid generating webui - run: touch webui/static/index.html + run: | + mkdir webui/static + touch webui/static/index.html - name: Build binary run: make binary diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index 7d4a0fa66..b7104431e 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -13,7 +13,6 @@ env: GO_VERSION: '1.23' jobs: - test-unit: runs-on: ubuntu-latest @@ -30,7 +29,9 @@ jobs: check-latest: true - name: Avoid generating webui - run: touch webui/static/index.html + run: | + mkdir webui/static + touch webui/static/index.html - name: Tests run: make test-unit @@ -44,6 +45,9 @@ jobs: with: fetch-depth: 0 + - name: Enable corepack + run: corepack enable + - name: Set up Node.js ${{ env.NODE_VERSION }} uses: actions/setup-node@v4 with: @@ -52,6 +56,9 @@ jobs: cache-dependency-path: webui/yarn.lock - name: UI unit tests + working-directory: ./webui + env: + VITE_APP_BASE_API_URL: "/api" run: | - yarn --cwd webui install - yarn --cwd webui test:unit:ci + yarn install + yarn test:unit:ci diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml index 4ed5faec5..4b5ec44de 100644 --- a/.github/workflows/validate.yaml +++ b/.github/workflows/validate.yaml @@ -27,6 +27,11 @@ jobs: go-version: ${{ env.GO_VERSION }} check-latest: true + - name: Avoid generating webui + run: | + mkdir webui/static + touch webui/static/index.html + - name: golangci-lint uses: golangci/golangci-lint-action@v7 with: @@ -51,7 +56,9 @@ jobs: run: curl -sfL https://raw.githubusercontent.com/golangci/misspell/HEAD/install-misspell.sh | sh -s -- -b $(go env GOPATH)/bin ${MISSPELL_VERSION} - name: Avoid generating webui - run: touch webui/static/index.html + run: | + mkdir webui/static + touch webui/static/index.html - name: Validate run: make validate-files diff --git a/Makefile b/Makefile index 570a04199..ba75e539d 100644 --- a/Makefile +++ b/Makefile @@ -30,18 +30,16 @@ dist: .PHONY: build-webui-image #? build-webui-image: Build WebUI Docker image build-webui-image: - docker build -t traefik-webui -f webui/Dockerfile webui + docker build -t traefik-webui -f webui/buildx.Dockerfile webui .PHONY: clean-webui #? clean-webui: Clean WebUI static generated assets clean-webui: - rm -r webui/static - mkdir -p webui/static - printf 'For more information see `webui/readme.md`' > webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md + rm -rf webui/static webui/static/index.html: $(MAKE) build-webui-image - docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' traefik-webui npm run build:nc + docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' traefik-webui yarn build:prod docker run --rm -v "$(PWD)/webui/static":'/src/webui/static' traefik-webui chown -R $(shell id -u):$(shell id -g) ./static .PHONY: generate-webui diff --git a/docs/content/assets/img/webui-dashboard.png b/docs/content/assets/img/webui-dashboard.png index 80a5178b0857e30b86defcac1d4f2615531e21cf..084d287eb628371362db197df8aca15413badfb1 100644 GIT binary patch literal 246976 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 JR_fZm30}?{PK@B$1IB&1-9#XpKqg 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
l7Y8fz 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 Pe2|w`k}AAw;P-z3i?lHD literal 127729 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

H5{VW#< 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

xCL}X{)S0X+wSqs?s>4i^$!A^*xJcQ^4KZ&{toY zen|5~2-qo#`iBxRX4Ph-c~$Q7j|<4bo<9W`+3ZtIF6s}vl7Y4yHe;>=FV*e$MKVlC zY{(@C+XS0k_d7C>h5O{?5qIyvH(BuXDdfG&yacD#O9$nr)tUFJ(l7O)W*WFzz6;uA zHZK*+u=HZW#_{#x7Cz^V8zEam(j0`kOFd@Ri#NiT%^J;tL#cjon0h=QB|c8(A-x-< zayy?FgyYP3*?T4NGQN#B;rXpvvt@5x^hdqORmCymu%+J-n)>(!oOmD!NtY(KnwKLg z@=U)sKHc2-lI6O;Lc&iO4J)(mRZr@dp4deDDz}Gm2RBTIYV=>dlLo%=Tfe^uc=^@3 zoC_}1hA%W0v?QkvKl&hmFBeX6ko2tk)tR&Pgmd}@W4B3{|DQ}ETr}HGS*SV0SZILv zbM^4kbQuv&)_di}yrT71j6kc#THx!`s-SHmvnA@IT6O}g`4JS{@w+tU=ZEHo=Kc`3 zR!l_Q2^Z$sF!Gl3UIbQR1xa3OuU?qXE&0CK^i1{@dg{w2g!& z`P*2Q8P}h+esNp6rxk#15K4>{7%?tXq5NZ8FR`8uU7&6aySx^vPZr=&v%Dwd@&{!E(mOek}TT8p!F5H z4K|GW&(mfs?x*ad`)J0rGdB)#p0@tuZ|z(P_kmbwl7TTv zIYaOPmgQL>Is!-1BSY@NdUyhTI3(Lc*4{#df;dh`_>BB#Lmfc)rbI2W%3sG;Q!iaTc43+|)s}p|}koT@hae@yz(nobq(;+Z>9)Nr0?tgZ+c}E@T9AX$dJ5HnQ)gP8eMC>!c(h zKr!$paNFZEmv7_0VDIhnPDxO{g+c$)MBk0cjO4?SKfK%mmcFy_Uw)IEBl=0l!1JrM zN?S6bEpO&^SqRCXKEg-s%6W1i)G1+W7DU$c!A8eGut5(+B>OZ*p(AuL+--5fPsMO_ zfj{!^OW=0qE)iK|WJTal0^n)h7+7U5Djkk5lf zfOP&J`=W;>7sVcjgFG;=3?UT~=+MVLwJWfBfII5>RkAVAnyt^(Nin)^bvVTdjLf(k zH_F+!7d7zK{NNwy`Za(yR^q$S;!=usna7q^ssP#+jPjl?Y}mfoZy;)D;SsIxdd%eK zXgHcUV#Wi@U!hxX0Ztx+U!cg*Yi2?`Ni$G(@u?C> zj@kr94%|X}%H8rN8=PbV0?i|LL=XItg!4H6`}=);wXg40N0638=vGK=df<241qR(0 zWKRz&!h_qs2l?>$AHx4C&Vx$&s4~mSE{_N_Er5z;^H^x$o}6Ws5z0Is)Fqq8_BP2l zz$1N>2N@(B)qCYK>noXBRCks**m}L{0~l?k?$izv@~7=_c*x{9+c0t7-O^-Xq=Q6M zy{v*(=lVn6#u9^V?5QyV2V2a~U7-pAv8L;mK%f7qPqsSLR@OsNWn-_k*BdwF9Qlip zY*=Rd0scgIXYybLi9eS|CV=g|$rQ>PL2;C;dxRm1=;m!0DUT5n^tOc-O-Mi? zm3VPGKana=VAEbHBk(OJR)(=$sqOKVi9?Z_XE_F)t*qwg>P*@a6OSiq@X2D!Bxj$` z)SXT18l(=UNa}wCR!_FP=e+|Q*iT-zh7_H=XSHlg8lKH1eGAIujW=1AKR&o0-Ix0} zvcN{p$lx$*dN3~inRBNFtJxP9V{r0MRw<-XET-rfp)jVzd^^&K1%&vT`D??Gw`P5J z8uA{}z~vZ%lQ{^x5hEjU4@?0G1|aurmpK(=BsSbt6_TFyQNS`#V&nlLYMMT6bCZa!^rC%8QIVG>ooh!Yc7wF8l;)K|CIMvxY5D50Wa=qZW?f|ccJyt#rF zHJah*q=(MR!aG@mD!uDU>pvAuTkl_^@I|#{kXq9`4O_&gjiOEw`f*HcYL*g)UU~r@r^qa7`?Q~tee1!AD+#m4qJIh?OzgZ~p3WJsH#)31}#v&%?}qA@L$9 zXZEh+ZqvDLQ|D}d=LSPzHX#h~y~Tzi7D)W>bir_yVdO0fseZKdly6J=)wnwn*;gR*8EfDXv#imF`U?XekbkekF zp78aCLPqoQWz|j`I!hTR$8n4F7Q4hCmEKf)S;rqN>l2;o?=QXUr!5CpOeB*99 zo1Lr3dh>{1UMf3*%(@^!kFEy zV6L}xlyV1kgfNmVc2}QhFiVA&x!i_#Bn%jEzMHd@#4teBeef$0ymbIFg?|R6ty>hTWEbi@7N>l=>Tf+3#8=rZd;WV9?{T7^CC|z~5;$`T&a=pDiiN!}u>FkH=e!8g+ot zX;`r|mJq@j?KU^DK_iKj-#89xcOq_! z0iFY@SmMNzA%nFR(LiIj^}kgiVU!~34X$q%jT$?*rRNjK73V>BHcF||SF=w~K$82f zs_Ayc(b$(3;Zd=2LrJv4<(Faa=FrP94`Y=JIK=fJhmy=oV+gm(wG!X6BzI6%JxyHu zB9;v5%h5_pH#L1dyyh;n{LcIA$a~CL#mU(01@OPK!uIxBc?nUz>L7&X4mLsqPZmaa zaRHIJeWma4(9<35O%>^RF1M|M$us+Mp6k_h79@qCr}+Mb^`1sKKy1@cOJEocd}-HJ zO%XXhz8=bp99x{KW|2EO1lTK-SBVuIJN*O8wxsTJ)LzG7&Y?v1d>dBqn&kpFjhiLZ zA<@_u5i=CQKYbo29x<}hkf8gh@ELr@_##7|OcscyG9L})fNX6L@OY_&ejbz^K?@*R z4ZWq4Uu*yr6(k2UDraNdNNGiFBRfI%x1~Ypv<$G{-*doFg44=X?yFjF2=!w;)=-N2 zk8o!;JMKu6{Dv|FylNM-KE?ori{a_DQ|B9{Gz2bfEs+@J2++REIMN(3Mzp{_2AB{D z6(2XtDovsabkD+xG>Q=pGNCM{kui*rA7jNkMN!9E$WGKy1TPP$EX2IAL_egl1}5a= z<%}HBcTPXLdRg9GZpi~r?)D(b4oyy7Y19W*#ejSp9$-bBciy6n7+`4y3;rcItg6($ z?tfTa7ymng;iDqY8M#9_9Ax{!0LXGdb3D)pG4DevE( zDiPLF2YyxpI8Smbf+vjLW>|*laq9AztECqGYfwAY{jfHiKbD+OX!0yj@z6A`;*Jyu z`33;LDZLKGL${1pMzeCMOP4FG2C`U>|B{jfj_w~^MWcY6U+3mo0(DtOJoEyQz6{~& z#0+9pQIQ+TTq9feA0D)q*jdIPe?V$RTaEztlU7oq7vU`h?%DB6U|6GbA zoRjRN#@BTk>_D&iC{LRUnsZ9gYvqJ*o+uTiSvZq#rWKI${=!m%o?W=*&VXk7)f!YExqpq!tKTj?H4Zy8dqKRfaET@=88{Eb7=ahqW|A?UZ@mTs^S*{$MxX&m&W zIY6u4#j=O5PXUkiA&QB*iJk!TB?4}OjShF&U|nB@l%P~_Bxz3)rsx49AAb=e>Lb**b{fN)$xZuvt?}PYjlMSTT#2ULs~oxh`xk%q zne)Xbmo0A6OT2+Zz@OIi9Hp*L>(*yGn0cPm-vXL|PHzD+3)J;f*?&k+8o@`BZa!xl zvOHXc$6Y-6k<+tmsK_CGrM9rUN&ls%REf#L;6b7j?9{RNu0^)>a;Amh0w3g|TiAE+ zK^FWE48}a6kHHeskN2oqEG(u4P3MMP2Kh$MFGDz|ZqP#q?UAwuHv0w2C#7B`e>da_ zq<{iW`bDW`8kT`qpaXBZFeL#x%MJ5^>QCkR@tb2xB^pC~`z}*feP8qOuHuvee$xKc zI@N$bXnLPMcC^U6&wz!&wFKZ;4qD7xoCQ~F`tjp6z@|u#Clbc9bZwr#GM_A<8-o$9 zpMDoV&>OLAG81KoU^V@W=mjlJqjTsoTA~y9QZ{W;CPtKVPH1Ex`xKapV_)n|=oG!W z^UHi%0ndeHACxFP40hMj#Nj@&awU^;nY@b37q=|9N)Lk1DLV9)X|H=(6W;MNA+w~U zZ?UV839vY=%~u`1m)ZmfAdI+Vv}yPa2!d`j7eI^L!o+T^ouHo&ED8w?EQe&_&5-5vB3U0G_tsY1S9>*nPF-8Fe`Y*g^rgfKOowp~RDf!Rl}S;8{c$HD_9Rq=~&= z3M&k!PLu)LE(ahR)N|%uGhD14#nn76Eu!d7dY3$aX({HAPu#trTkOcTk5i(^QK?zH z+iWewAEmR~aC9~^Em>IpJYwu%#>Vm4-jL2}`}@L6v~nmNI}0X&x0%3|IZF=?C*rrF zDO*XwB=IHW_T+>kXHkveo}h+DY);J?ESQH7dv{4LUoi^Pt=HTwX~0h}14P{DcMH40 zwM+^W2~s%^3*Q}mY~(pGNghmzm<7dxK73{Ay)0cwVoOZP3>ZtLe;uKCtJH?)yK`q^ zuc;kg=96VHarOmsxocNa8nJKB>9+4q8xN&t`*{6fiBDmUUS8#59~e3}$#Rrf5GUf+ z0^$tym(#7Y_+lXn2I(=jP#>aCx@Sb(phq}9i^FQ>8`t&>x!T}4W@GC{~o~Xki-9A@V@=uWAOfmMgNa5#s7b@C?%jW-;l}}oQVqZ#K=#cJ@f3A zeu{NWd4Z>DOHVC0oX00%-#q7Y0aPuWknU!XhtLP%(F#c2ovPcL6~>bhy%`7>w&0#9 zx|U3VcI}MY2^yQU*7bFF4Y$=Y1y&kjpqb?h*qqe6?%vEI*uv0`F_>8y4Py8;328N` zu*8Es6fQ~b8l=ioqmEqJJKp&{(=#d`#=aO*lqtZkYw8p44M;OiSfPEZ^Vm44F8w0+ z*z}P+4G*eXzMO2WLP*(k*?>VL$lpl!Nv;xFqxK)s{{(@j38{)I=B8B+Jjr@g=0(;G zo!5F$!Gw}8)^iq8PpPt^bx`k``$lZH&PTWzg$&EwbSKIfAf zsEUGO!dt?r%#eaMKU$Zsq~7hh;;}-eF_Rc(86lWDmCEc6KTMueQuusVoOY$Y?v|38 zC*3a2+m4$P8M-7mw#S(KR*iVwOwOo4rdQ!>7R)rUB52OX{zc>5<2vN^49*w#hO3;! z@5a`tE(oep5evMMx1?iuC#FWOI{(v0xQtT^S+;Oa~wSGhTmisu|y*?(|oVd&xsW$i3WUZf;-{7-P{e~N3ST#OqN$^zV zFUgF|eo2X=G)-)s*}Trgq9`j_X${;SPb8B>Pg5|_rGfA$V%yqKTV&S*Yn7Ne&(?$M z%tcKp_VnpyWLvH6WtDm^fSaK1l{^yP4H}xawttBK{5k(i>5Yr{1P_dVMxwDB(gkWM z>SwsaW={W)^M3`9WUkI>Mn$wMidY1opvs45pXFbk?)py5YkdcM9Ynj~+B8 zs4i*sB*Efn%$#|hXZcfjc2=1oRnpdKcn#YB6|{w}DAVT6*-phkm}#9Jaar+- zFpclqIld-s!*@Ihef;*uSQ-_k%yO*xTD9-?#eosSB&tp0$+LPI0`cf*?Lw;;G^>ae z&x)1Fvzbp#LoV7+Gh(@v9bF5{S+l-=645Y5-ot)~W?2pyiwae1;WM}|j*Ij5#UJ6a z3Og6}4&?Xd@iPv6VIYO&89@cZMAko zqioqcjk`K(bINX8sCQapFt4~qnkrL`-B;$2YB3$AhG}9(Iv?N6Os1YbR?;P5EG0Ks>8d&*M%EenpDK>KDtsW8`b|e|kH>yb1?D6Er;icq zyxQ9;s1U!lPWE`H0$-wm@txZ;i^DHzHHFdl%JW2(c>CITk+WyEbd~xV*K*nY{>gGE zo47UQ6OsAWOh9HpC$C`pHA9-QeGPSw=CZ7#DBWZ2(U8r=-tpxSA7@E7lL`CGhxztv z(;l=v=jP88{V<8qxnXAf@35vFBx@6>bR}7?m(4x)Af5fjqKy` zw;ikSm+LP-1+hnzr2tOw(I+aZe2bqOI#5>Ysj2Yrkk;Oy6Y!l({t$2ITI2NF4fyVD z@jJm$HB077u%?mp#-E2KkrGw66J6q0R#tR0AEgeiw>yS}ELC_<-dnI~ez_9Vq?z`J zF*r`e=LO9ZJID%V_`1^-T#j{m$ID+kgNVC)_Q5)it{LT4Yu9SU87()(1s@u_H;cXU zJ-0a+ygInd^z63V$Ex4^^E5MW;OX!E*=3K;s*CutMqc^I>=^6uHkIDwA!mf3_&9O% z2(9)bkut@|0!}ztHq1L#t6y7Kv{wt4$8Ux)(iyXfhvsTe9p|CJZ-a+n2{SB>q;c=15b zY|{NfjNa$DeEVnj*cHYuh7eC}w`B6sbJ))qE1nu!bDt0tpvBvy$9?40|Gi-w{m3-E zTC=WWPpHcBeNni`SGE9iy&4>d4!6z}4r>F4+zmbtF30rxqZHPdvQp)|6EH!da06@R zOc&D>YqscmR?vG^J{uZZ`(bdIRFN^<^kD?`5!^tK6S<;d)7?#o=*|te>p$L-6R=#L z_L%Vwtn$-W-Im0s_d?8u5_p^REE90Y;Fy&F8%bz>=988$VPY4&Uzd&~&FMZF1&`W2 zqIBn$_T`Lg7k>q9+`cnm!()G|DEc;4%HuiajCL7p&M)ToAAF(8Vs#G@EvaOmNOxK8 zk{m@rcDvKesKAJ7ViqP}@h#KG^lZ0^cBIi>nrEm{rr>d3`Ky}xi!&o}x!gS;6$S1> zPbR@$Z%Q`LuBz^O-tedRG{p7|OTr`j&d=L7`n+jUcVkbM({Gx)GNL@yD@#Vf=_bma zsw!9ds9UI};YyT?bW`Dz$M&1{_v_RmdmGeU+bc6H<>M-XAv>+mG^!-XYIrYC>0W2e zxAcq)KdZfbGOP_Qa!LD~xFWvDXvx|8@m0K*cFOv3DyMQ1a}nEbk4FrAmY{51*XyVz zgj4fWy)E%cKiuPDHJ+&`%k!&LSml=o4)7be5#nPCxZSST2Eu{w@X0axw ztS>Ysn0c$Vgpuhs=#M`sdV>0CBQZ&;J~Do7)-Hrv9x%gNshv9hI!PLHGpSyiJ{1rtj%i*5aR&3q@eJ5oK# zKKx0J>QW=X9R8>Ja2&36X)z@%x+xs;I2P4=7lOSTK9b5l=4oln+JD4a^#uHiczB@2 zoaY;D9kj?Ar-U2V@QtzDO8uhA6h5I7cu8T;=3wEx$Qm#G&Y=$<=;29A8H;%jmSF#LVUOSWsq?*xd=5&8QXFNpVegIz5gLn3yBngsjNt7k z?&4x>z;JP&L-N{Ym1VknH|QbtHvO;g@#pCxR%;~5yw&(KZI0iQ9hdaf9Qpbr6{e#m z#$&4}c3z$w!y?yvDZ*UcZgV^`fw4SVr{s&sS12X6;@%T36c8mk@quV6?4$8c?9WK` za{I}d5gJduhCglK(im1H#DTYwuH%9nJ2i1%-VbH3%qYUN?!1o`QF>Ee`EbKvZ}_&L z^=nV#8VMCXw(j0F7-MjY=lC#&2Q_dkwMV%oi;>;v%J09I+;m6r= z#o*@~_*xEFZvW^>L(zx&9Oi^*B5rB5Y+MOU%h= z>a`uy9WI5>cIvJVOioLPXW3r3GzRN5J6!-uLd~L5xbSY{oS*qa#|66GV_Ere99*J| zmegYD%@Nk6F^$ESGmKNz{n1_es3-^c>9Vr~<%j4wW~Shl>#Jw=GM;6h4E7dOH7u^o zN_BTJXb|p^=6o8AElF9!PMC~_t!$aTT)q)P()INUv#xUW9^M$abgv4ZyPS|xA>f={ zY07e=&4nvM=y!{O^arUn4N_cl&nYeO9^t`q9keJVVMjv%6PH1DVj9c6I z%yde>fdhauQF4l@M?12$k?I-t;Z<(4M*EspV=(Jr=5GH?TbQ1g*ALVbw|KX1X12q2 z%r}n|*Ha?}>sdmwG7SdlcZq_DRV7)xKMjVcSofOe^cI2hja<=r+?6a;dD-_ZYbJAM z@|Qb_!YuVyEzqoA(;c>r)oa5;lJ2_oZAe@~-ts9D)3$k_l=!BR&CH(hVO6R{xZqRZ z5dXGuPXf>%9$PExXliD!1pGj0W;?(u8e$}SZ?0rz6j)_T#e4t7X8p+|X#5J3j#^$> zoTA#zQnmyfE&NJ`O337R-d+2#i~h_{pBbKmtubd-TwANoO|=f6@HkB^51f>8X3sgk zt33}(H2ud0Osto3zJ+y)J%v z+gEvqz1~9IgH~I&kG*`#NG+3>BjJ0LOX>WYN2-I|Uuw*`+tSQA&*(!~zMA)U;_w-j z3K9qHOtEbb$P-1Pb^>EGKW+VPo3i!LC7*bh{dc+a2>c~{Uz8cqIW}5i5vxl3IHrkOU+;|=bWuLGXEDKD zI4z%HchU8fsF&P|JLVLLYvqR?6W_WSjPXMqh2g=-ohLn)^B+28UpwP$ctwi)0yupF zlBk}$ykgLcRrr8kZ6Ns(<9xY6L!%S96jmRTR`ILZ?=_2K&`8t6A=Kp}?R&VwwwSb+ zpQ$pR#Xo_b5@mRkdC@2AiQ2oBb-}6$2lzH7<$jpG&a|GhYs1V+7N^JCdkRrgjrjvo z@5w8xlQCiz7mZ~${rT2v-7%YQcz_Z89h#w5Y$R$))py3PW!T+qZeMkmT_LY<;{rvT zQZ*~~(muB3rzqCu?=r|z@tqK^=UkqQ;GK8mX%qFIA3H-)3s=!P@(g%%qbX}!x>t<) zj#Q%3+bT2JC#k=_deREr!YptCH^iQmz!*IHbxT*vHe#4^%Hu!vcaUQLt{)7ay9@5_ zQ}Oa*_{Z?9;%m2*X6+x^d1Sm@`7Fn!oRjUlAi%D%^5Zt~r*@Zhzlyt_ju%r`Id^1x{=g`IH z6?^QSii@q@vd3+*-8=PLtbDZRLh_+@duYGNW7hi30-0CNXZE~osa?(UckP1m zsWM2dHHLG^p_{oB+`+qk-P(6EOj;rq+Lj)zyJBnFQ9i=EduKRR$Ik5XIu#OkdBL=e zoY+|;*kzNWX`6q3 zO5gt4@8Y(%m*m5LnQhILjxGQ7DZPC2&5DaUwMn6&N6*g>|GsI81`rzq@n*|+sSgSz z${%)$yw>tte)-b&wlBI_v((CdAD(W%{rPE$)W~Ch>*9YYd%xU$|9#-J)H(X`|M$-< z|LttzyZMXzw0*9%_m4j;=t!J%=XB5_Al?VW=br7E-grFWPOEy+EB(MVr+3`V^S&<= z^y=5X{^`5sy}g;+ADgrNc13-C{IA8{nbr06{cp>p-)@}!_GazM?EU+Le;v--9(|=$ z_Oj1?rviQN`ID<7PfZ8nn|Hn&eURwc{UPOByII#)t9933U)tV2Wz)X*kDo5>`P9wc}nQh)~R1+$F9G=VwF}~;+(HHOZC0$ zr@>4P`fjwr=CPj5!fzE_n{*cEM(@Ax^2_1-Z`)&qJ-gN|UiUh(&gJU*w!*G$wr-)J z7fa{ni+IYvDBJCNy)-a1ROVLMMEStdeLaEKXRml|b*%8qp~znjmrY!6ZwtI$y2tmj z()o4Ok-zG9PG33)gl!M)<dEm6A&&B>Z2Z{h=V9&mHX@8$x*l$_3{D#?C`}*ZNf1fk=uhQtc zkz;mo+i{8e(`r4R#O1?rOFi*&;=9xY%VVH>X@Q`Dr3Z98H3)D@fUa}{0U-m> zVbLIFgQeb=xI`|U^9GFH81ck#O3&VOw4bAsvb%s2g PAjf&S`njxgN@xNAvadyV diff --git a/webui/.dockerignore b/webui/.dockerignore deleted file mode 100644 index 8e8fdce7b..000000000 --- a/webui/.dockerignore +++ /dev/null @@ -1,5 +0,0 @@ -# compiled output -/dist - -# dependencies -/node_modules diff --git a/webui/.editorconfig b/webui/.editorconfig index 9d08a1a82..cb5b5bbaa 100644 --- a/webui/.editorconfig +++ b/webui/.editorconfig @@ -1,9 +1,22 @@ +# Editor configuration, see http://editorconfig.org root = true [*] charset = utf-8 + +[*.{js,ts,tsx}] indent_style = space indent_size = 2 -end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab + +[{package.json}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/webui/.env.sample b/webui/.env.sample new file mode 100644 index 000000000..0fe8436ee --- /dev/null +++ b/webui/.env.sample @@ -0,0 +1,2 @@ +VITE_APP_BASE_API_URL=/api +VITE_APP_BASE_URL= diff --git a/webui/.eslintignore b/webui/.eslintignore deleted file mode 100644 index 9f81cf845..000000000 --- a/webui/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -/dist -/src-capacitor -/src-cordova -/.quasar -/node_modules -.eslintrc.cjs -/quasar.config.*.temporary.compiled* diff --git a/webui/.eslintrc.cjs b/webui/.eslintrc.cjs deleted file mode 100644 index 331093689..000000000 --- a/webui/.eslintrc.cjs +++ /dev/null @@ -1,68 +0,0 @@ -module.exports = { - root: true, - - parserOptions: { - parser: '@babel/eslint-parser', - ecmaVersion: 2021, // Allows for the parsing of modern ECMAScript features - }, - - env: { - node: true, - browser: true, - 'vue/setup-compiler-macros': true - }, - - extends: [ - // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention - // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. - 'plugin:vue/vue3-essential', - 'plugin:vue/vue3-recommended', - 'standard' - ], - - // required to lint *.vue files - plugins: [ - 'vue', - ], - - globals: { - ga: 'readonly', // Google Analytics - cordova: 'readonly', - __statics: 'readonly', - __QUASAR_SSR__: 'readonly', - __QUASAR_SSR_SERVER__: 'readonly', - __QUASAR_SSR_CLIENT__: 'readonly', - __QUASAR_SSR_PWA__: 'readonly', - process: 'readonly', - Capacitor: 'readonly', - chrome: 'readonly' - }, - - // add your custom rules here - rules: { - // allow async-await - 'generator-star-spacing': 'off', - // allow paren-less arrow functions - 'arrow-parens': 'off', - 'one-var': 'off', - 'no-void': 'off', - 'multiline-ternary': 'off', - - 'import/first': 'off', - 'import/named': 'error', - 'import/namespace': 'error', - 'import/default': 'error', - 'import/export': 'error', - 'import/extensions': 'off', - 'import/no-unresolved': 'off', - 'import/no-extraneous-dependencies': 'off', - 'prefer-promise-reject-errors': 'off', - 'vue/multi-word-component-names': 'off', - - // allow console.log during development only - //'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - // allow debugger during development only - //'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' - } -} - diff --git a/webui/.gitignore b/webui/.gitignore index db32ba46c..7f7b4c885 100644 --- a/webui/.gitignore +++ b/webui/.gitignore @@ -1,32 +1,61 @@ -.quasar -.DS_Store -.thumbs.db -node_modules +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output /dist -/dev_local -/src-cordova/node_modules -/src-cordova/platforms -/src-cordova/plugins -/src-cordova/www +/build +/dist-server +/tmp +/out-tsc -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* +# dependencies +/node_modules +.yalc -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace -# local env files -.env.local -.env.*.local +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json -# static assets (ignore all except the DO NOT EDIT file) +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db + +# env +.env + +# yarn berry with no zero-installs +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# static assets static/* -!static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md diff --git a/webui/.nvmrc b/webui/.nvmrc index 8b0beab16..26600046d 100644 --- a/webui/.nvmrc +++ b/webui/.nvmrc @@ -1 +1 @@ -20.11.0 +v22.15.1 diff --git a/webui/.postcssrc.cjs b/webui/.postcssrc.cjs deleted file mode 100644 index 1174fe52b..000000000 --- a/webui/.postcssrc.cjs +++ /dev/null @@ -1,8 +0,0 @@ -// https://github.com/michael-ciniawsky/postcss-load-config - -module.exports = { - plugins: [ - // to edit target browsers: use "browserslist" field in package.json - require('autoprefixer') - ] -} diff --git a/webui/.prettierrc.json b/webui/.prettierrc.json new file mode 100644 index 000000000..7933dbd7b --- /dev/null +++ b/webui/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": false, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120 +} \ No newline at end of file diff --git a/webui/.stylintrc b/webui/.stylintrc deleted file mode 100644 index ce38d777e..000000000 --- a/webui/.stylintrc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "blocks": "never", - "brackets": "never", - "colons": "never", - "colors": "always", - "commaSpace": "always", - "commentSpace": "always", - "cssLiteral": "never", - "depthLimit": false, - "duplicates": true, - "efficient": "always", - "extendPref": false, - "globalDupe": true, - "indentPref": 2, - "leadingZero": "never", - "maxErrors": false, - "maxWarnings": false, - "mixed": false, - "namingConvention": false, - "namingConventionStrict": false, - "none": "never", - "noImportant": false, - "parenSpace": "never", - "placeholder": false, - "prefixVarsWithDollar": "always", - "quotePref": "single", - "semicolons": "never", - "sortOrder": false, - "stackedProperties": "never", - "trailingWhitespace": "never", - "universal": "never", - "valid": true, - "zeroUnits": "never", - "zIndexNormalize": false -} diff --git a/webui/.yarnrc.yml b/webui/.yarnrc.yml new file mode 100644 index 000000000..3186f3f07 --- /dev/null +++ b/webui/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/webui/Dockerfile b/webui/Dockerfile deleted file mode 100644 index 283101452..000000000 --- a/webui/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM node:22.9-alpine3.20 -# Current Active LTS release according to (https://nodejs.org/en/about/releases/) - -ENV WEBUI_DIR=/src/webui -RUN mkdir -p $WEBUI_DIR - -COPY package.json $WEBUI_DIR/ -COPY yarn.lock $WEBUI_DIR/ - -WORKDIR $WEBUI_DIR -RUN yarn install - -COPY . $WEBUI_DIR/ - -EXPOSE 8080 - -RUN yarn lint diff --git a/webui/babel.config.cjs b/webui/babel.config.cjs deleted file mode 100644 index cd63d3933..000000000 --- a/webui/babel.config.cjs +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable */ - -module.exports = api => { - return { - presets: [ - [ - '@quasar/babel-preset-app', - api.caller(caller => caller && caller.target === 'node') - ? { targets: { node: 'current' } } - : {} - ] - ] - } -} - - diff --git a/webui/buildx.Dockerfile b/webui/buildx.Dockerfile new file mode 100644 index 000000000..09b65ab81 --- /dev/null +++ b/webui/buildx.Dockerfile @@ -0,0 +1,18 @@ +FROM node:22.15.1-alpine3.20 + +ENV WEBUI_DIR=/src/webui +RUN mkdir -p $WEBUI_DIR + +COPY package.json yarn.lock .yarnrc.yml $WEBUI_DIR/ + +ENV VITE_APP_BASE_URL="" +ENV VITE_APP_BASE_API_URL="/api" + +WORKDIR $WEBUI_DIR + +RUN corepack enable +RUN yarn workspaces focus --all --production + +COPY . $WEBUI_DIR/ + +EXPOSE 8080 diff --git a/webui/dev/scripts/transfer.js b/webui/dev/scripts/transfer.js deleted file mode 100644 index eaa02bceb..000000000 --- a/webui/dev/scripts/transfer.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs-extra') - -const folder = process.argv[2] - -async function execute () { - try { - await fs.emptyDir('./static') - await fs.outputFile('./static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md', 'For more information see `webui/readme.md`') - console.log('Deleted static folder contents!') - await fs.copy(`./dist/${folder}`, './static', { overwrite: true }) - console.log('Installed new files in static folder!') - } catch (err) { - console.error(err) - } -} - -execute() diff --git a/webui/eslint.config.mjs b/webui/eslint.config.mjs new file mode 100644 index 000000000..51edbb887 --- /dev/null +++ b/webui/eslint.config.mjs @@ -0,0 +1,57 @@ +import js from '@eslint/js' +import eslintConfigPrettier from 'eslint-config-prettier' +import importPlugin from 'eslint-plugin-import' +import jsxA11y from 'eslint-plugin-jsx-a11y' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import globals from 'globals' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + plugins: { + react: react, + 'react-hooks': reactHooks, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "@typescript-eslint/no-explicit-any": "warn", + }, + }, + eslintConfigPrettier, + { + files: ['**/*.{ts,tsx}'], + extends: [importPlugin.flatConfigs.recommended, importPlugin.flatConfigs.typescript], + rules: { + 'import/order': [ + 'error', + { + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + 'newlines-between': 'always', + }, + ], + }, + settings: { + 'import/resolver': { + typescript: true, + node: true, + }, + }, + }, + jsxA11y.flatConfigs.recommended, +) diff --git a/webui/index.dev.html b/webui/index.dev.html new file mode 100644 index 000000000..215a1a4a8 --- /dev/null +++ b/webui/index.dev.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + Traefik Proxy + + + +
+ + + diff --git a/webui/index.html b/webui/index.html index 654437a27..4b5b2e2a0 100644 --- a/webui/index.html +++ b/webui/index.html @@ -1,32 +1,31 @@ - + {{if .APIUrl}} {{end}} - <%= productName %> - - - - - - - - - - - - - - - - + + + + + + + + Traefik Proxy - + +
+ diff --git a/webui/jsconfig.json b/webui/jsconfig.json deleted file mode 100644 index 456944a5e..000000000 --- a/webui/jsconfig.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "src/*": [ - "src/*" - ], - "app/*": [ - "*" - ], - "components/*": [ - "src/components/*" - ], - "layouts/*": [ - "src/layouts/*" - ], - "pages/*": [ - "src/pages/*" - ], - "assets/*": [ - "src/assets/*" - ], - "boot/*": [ - "src/boot/*" - ], - "stores/*": [ - "src/stores/*" - ], - "vue$": [ - "node_modules/vue/dist/vue.runtime.esm-bundler.js" - ] - } - }, - "exclude": [ - "dist", - ".quasar", - "node_modules" - ] -} \ No newline at end of file diff --git a/webui/package.json b/webui/package.json index 7cd74012b..d74a586b8 100644 --- a/webui/package.json +++ b/webui/package.json @@ -1,62 +1,101 @@ { - "name": "traefik-ui", - "version": "2.0.0", - "description": "Traefik UI", - "productName": "Traefik", - "cordovaId": "io.traefik.traefik", + "name": "traefik-proxy-dashboard", + "version": "0.1.0", "private": true, + "homepage": ".", "scripts": { - "transfer": "node dev/scripts/transfer.js", - "lint": "eslint src/**/*.{js,vue}", - "dev": "APP_ENV=development quasar dev", - "build-quasar": "quasar build", - "build-staging": "NODE_ENV=production APP_ENV=development yarn build-quasar", - "build": "NODE_ENV=production APP_ENV=production yarn build-quasar && yarn transfer spa", - "build:nc": "yarn build", - "test": "echo \"See package.json => scripts for available tests.\" && exit 0", - "test:unit": "vitest", + "build": "vite build", + "build:prod": "yarn test && yarn tsc && yarn lint && yarn build", + "dev": "vite", + "format": "prettier './src/**/*.{ts,tsx}' --config .prettierrc.json --write", + "lint": "eslint './src/**/*.{ts,tsx}'", + "lint:fix": "eslint --fix './src/**/*.{ts,tsx}'", + "preview": "vite preview", + "test": "vitest run", + "test:coverage": "vitest run --coverage", + "test:watch": "vitest", "test:unit:ci": "vitest run" }, + "lint-staged": { + "**/*.{ts,tsx}": [ + "yarn format", + "eslint --fix", + "git add" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "type": "module", "dependencies": { - "@quasar/extras": "^1.16.12", - "axios": "^1.7.4", + "@eslint/js": "^9.23.0", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.1", + "@testing-library/user-event": "^14.5.2", + "@traefiklabs/faency": "11.1.4", + "@types/lodash": "^4.17.16", + "@types/node": "^22.15.18", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.19", + "@types/react-router-dom": "^5.1.3", + "@typescript-eslint/parser": "^8.29.0", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.3.1", "chart.js": "^4.4.1", - "core-js": "^3.35.1", - "dot-prop": "^8.0.2", - "lodash.isequal": "4.5.0", - "moment": "^2.30.1", - "quasar": "^2.16.6", - "query-string": "^8.1.0", - "vue": "^3.0.0", - "vue-chartjs": "^5.3.0", - "vue-router": "^4.0.12", - "vuex": "^4.1.0", - "vuex-map-fields": "^1.4.1" + "eslint": "^9.23.0", + "eslint-config-prettier": "^10.0.2", + "eslint-import-resolver-typescript": "^3.8.3", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.1.0", + "framer-motion": "^11.18.2", + "globals": "^16.0.0", + "jest-extended": "^4.0.2", + "jsdom": "^24.0.0", + "lodash": "^4.17.21", + "msw": "^2.1.7", + "query-string": "^6.9.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.12", + "react-helmet-async": "^2.0.4", + "react-icons": "^5.0.1", + "react-infinite-scroll-hook": "^4.1.1", + "react-router-dom": "6.22.1", + "swr": "^2.2.4", + "typescript": "^5.2.2", + "typescript-eslint": "^8.24.1", + "usehooks-ts": "^2.14.0", + "vite": "^5.1.4", + "vite-tsconfig-paths": "^4.3.1", + "vitest": "^1.3.1", + "vitest-canvas-mock": "^0.3.3" }, "devDependencies": { - "@babel/core": "^7.23.9", - "@babel/eslint-parser": "^7.23.10", - "@quasar/app-vite": "^2.0.0-beta.15", - "@quasar/babel-preset-app": "^2.0.3", - "@quasar/quasar-app-extension-testing-unit-vitest": "^1.0.0", - "@vue/test-utils": "^2.4.4", - "autoprefixer": "^10.4.2", - "eslint": "^8.11.0", - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.19.1", - "eslint-plugin-n": "^16.6.2", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-vue": "^9.0.0", - "postcss": "^8.4.14", - "vitest": "^1.6.0" + "husky": "^3.1.0", + "lint-staged": "^9.5.0", + "prettier": "^3.5.3" }, - "resolutions": { - "cookie": "^0.7.0" + "msw": { + "workerDirectory": [ + "public" + ] }, - "engines": { - "node": "^22 || ^20 || ^18 || ^16", - "npm": ">= 6.13.4", - "yarn": ">= 1.22.22" - }, - "packageManager": "yarn@1.22.22" + "packageManager": "yarn@4.9.1" } diff --git a/webui/postcss.config.cjs b/webui/postcss.config.cjs deleted file mode 100644 index 94b7b1c85..000000000 --- a/webui/postcss.config.cjs +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable */ -// https://github.com/michael-ciniawsky/postcss-load-config - -module.exports = { - plugins: [ - // https://github.com/postcss/autoprefixer - require('autoprefixer')({ - overrideBrowserslist: [ - 'last 4 Chrome versions', - 'last 4 Firefox versions', - 'last 4 Edge versions', - 'last 4 Safari versions', - 'last 4 Android versions', - 'last 4 ChromeAndroid versions', - 'last 4 FirefoxAndroid versions', - 'last 4 iOS versions' - ] - }) - - // https://github.com/elchininet/postcss-rtlcss - // If you want to support RTL css, then - // 1. yarn/npm install postcss-rtlcss - // 2. optionally set quasar.config.js > framework > lang to an RTL language - // 3. uncomment the following line: - // require('postcss-rtlcss') - ] -} diff --git a/webui/public/app-logo-128x128.png b/webui/public/app-logo-128x128.png deleted file mode 100755 index af9348b104c3a5504549aaeb1283486f9cb13c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18503 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

{middleware.name}

} + + {(middleware.type || middleware.plugin) && ( + + {parseMiddlewareType(middleware)} + + )} + {middleware.provider && ( + + + {middleware.provider} + + )} + + {middleware.status && ( + + + + )} + {middleware.error && ( + + + + )} + {middleware.plugin && + Object.keys(middleware.plugin).map((pluginName) => ( + + ))} + {filterMiddlewareProps(middleware).map((propName) => ( + + ))} + +) + +const MiddlewarePanel = ({ data }: { data: RouterDetailType }) => ( + } title="Middlewares"> + {data.middlewares ? ( + data.middlewares.map((middleware, index) => ( + + + {data.middlewares && index < data.middlewares.length - 1 && } + + )) + ) : ( + + + + + + There are no +
+ Middlewares configured +
+
+ )} +
+) + +export default MiddlewarePanel diff --git a/webui/src/components/resources/ProviderIcon.tsx b/webui/src/components/resources/ProviderIcon.tsx new file mode 100644 index 000000000..949d1f390 --- /dev/null +++ b/webui/src/components/resources/ProviderIcon.tsx @@ -0,0 +1,74 @@ +import { useMemo } from 'react' + +import Consul from 'components/icons/providers/Consul' +import Docker from 'components/icons/providers/Docker' +import ECS from 'components/icons/providers/ECS' +import Etcd from 'components/icons/providers/Etcd' +import File from 'components/icons/providers/File' +import Http from 'components/icons/providers/Http' +import Hub from 'components/icons/providers/Hub' +import Internal from 'components/icons/providers/Internal' +import Kubernetes from 'components/icons/providers/Kubernetes' +import Nomad from 'components/icons/providers/Nomad' +import Plugin from 'components/icons/providers/Plugin' +import Redis from 'components/icons/providers/Redis' +import Zookeeper from 'components/icons/providers/Zookeeper' + +type ProviderIconProps = { + name: string + size?: number +} + +export const ProviderIcon = ({ name, size = 32 }: ProviderIconProps) => { + const Icon = useMemo(() => { + if (!name || typeof name !== 'string') return Internal + + const nameLowerCase = name.toLowerCase() + + if (['consul', 'consul-', 'consulcatalog-'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Consul + } + if (['docker', 'swarm'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Docker + } + if (['ecs'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return ECS + } + if (['etcd'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Etcd + } + if (['file'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return File + } + if (['http'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Http + } + if (['hub'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Hub + } + if (['kubernetes'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Kubernetes + } + if (['nomad', 'nomad-'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Nomad + } + if (['plugin', 'plugin-'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Plugin + } + if (['redis'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Redis + } + if (['zookeeper'].some((prefix) => nameLowerCase.startsWith(prefix))) { + return Zookeeper + } + return Internal + }, [name]) + + return ( + + ) +} diff --git a/webui/src/components/resources/RenderUnknownProp.spec.tsx b/webui/src/components/resources/RenderUnknownProp.spec.tsx new file mode 100644 index 000000000..917936547 --- /dev/null +++ b/webui/src/components/resources/RenderUnknownProp.spec.tsx @@ -0,0 +1,162 @@ +import { RenderUnknownProp } from './RenderUnknownProp' + +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('renders a string correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('StringPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('string prop value') + }) + + it('renders a number correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('NumberPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('123123') + }) + + it('renders false correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('BooleanPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-false') + expect(container.querySelector('div > div')?.innerHTML).toContain('False') + }) + + it('renders boolean true correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('BooleanPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-true') + expect(container.querySelector('div > div')?.innerHTML).toContain('True') + }) + + it('renders boolean false correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('BooleanPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-false') + expect(container.querySelector('div > div')?.innerHTML).toContain('False') + }) + + it('renders string `true` correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('StringBoolPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-true') + expect(container.querySelector('div > div')?.innerHTML).toContain('True') + }) + + it('renders string `false` correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('StringBoolPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-false') + expect(container.querySelector('div > div')?.innerHTML).toContain('False') + }) + + it('renders empty object correctly', () => { + const { container } = renderWithProviders() + + expect(container.querySelector('div > span')?.innerHTML).toContain('EmptyObjectPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('enabled-true') + expect(container.querySelector('div > div')?.innerHTML).toContain('True') + }) + + it('renders list of strings correctly', () => { + const { container } = renderWithProviders( + , + ) + + expect(container.querySelector('div > span')?.innerHTML).toContain('StringListPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('string1') + expect(container.querySelector('div > div')?.innerHTML).toContain('string2') + expect(container.querySelector('div > div')?.innerHTML).toContain('string3') + }) + + it('renders list of objects correctly', () => { + const { container } = renderWithProviders( + , + ) + + expect(container.querySelector('div > span')?.innerHTML).toContain('ObjectListPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('{"array":[]}') + expect(container.querySelector('div > div')?.innerHTML).toContain('{"otherObject":{}}') + expect(container.querySelector('div > div')?.innerHTML).toContain('{"word":"test"}') + expect(container.querySelector('div > div')?.innerHTML).toContain('{"number":123}') + expect(container.querySelector('div > div')?.innerHTML).toContain('{"boolean":false,"or":true}') + }) + + it('renders recursive objects correctly', () => { + const { container } = renderWithProviders( + , + ) + + expect(container.querySelector('div:first-child > span')?.innerHTML).toContain( + 'RecursiveObjectPropName > parent Property > child Property > value Property1', + ) + expect(container.querySelector('div:first-child > div')?.innerHTML).toContain('test') + expect(container.querySelector('div:first-child ~ div > span')?.innerHTML).toContain( + 'RecursiveObjectPropName > parent Property > child Property > value Property2', + ) + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item1') + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item2') + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item3') + }) + + it('renders recursive objects removing title prefix correctly', () => { + const { container } = renderWithProviders( + , + ) + + expect(container.querySelector('div:first-child > span')?.innerHTML).toContain( + 'parent Property > child Property > value Property1', + ) + expect(container.querySelector('div:first-child > div')?.innerHTML).toContain('test') + expect(container.querySelector('div:first-child ~ div > span')?.innerHTML).toContain( + 'parent Property > child Property > value Property2', + ) + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item1') + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item2') + expect(container.querySelector('div:first-child ~ div > div')?.innerHTML).toContain('item3') + }) + + it(`renders should not remove prefix if there's no child`, () => { + const { container } = renderWithProviders( + , + ) + + expect(container.querySelector('div > span')?.innerHTML).toContain('RecursiveObjectPropName') + expect(container.querySelector('div > div')?.innerHTML).toContain('DummyValue') + }) +}) diff --git a/webui/src/components/resources/RenderUnknownProp.tsx b/webui/src/components/resources/RenderUnknownProp.tsx new file mode 100644 index 000000000..580c89f2c --- /dev/null +++ b/webui/src/components/resources/RenderUnknownProp.tsx @@ -0,0 +1,76 @@ +import { Text } from '@traefiklabs/faency' +import { ReactNode } from 'react' + +import { BooleanState, ItemBlock } from './DetailSections' +import GenericTable from './GenericTable' +import IpStrategyTable, { IpStrategy } from './IpStrategyTable' + +import Tooltip from 'components/Tooltip' + +type RenderUnknownPropProps = { + name: string + prop?: unknown + removeTitlePrefix?: string +} + +export const RenderUnknownProp = ({ name, prop, removeTitlePrefix }: RenderUnknownPropProps) => { + const wrap = (children: ReactNode, altName?: string, key?: string) => ( + + {children} + + ) + try { + if (typeof prop !== 'undefined') { + if (typeof prop === 'boolean') { + return wrap() + } + + if (typeof prop === 'string' && ['true', 'false'].includes((prop as string).toLowerCase())) { + return wrap() + } + + if (['string', 'number'].includes(typeof prop)) { + return wrap( + + {prop as string} + , + ) + } + + if (JSON.stringify(prop) === '{}') { + return wrap() + } + + if (prop instanceof Array) { + return wrap( + (['number', 'string'].includes(typeof p) ? p : JSON.stringify(p)))} />, + ) + } + + if (prop?.constructor === Object) { + return ( + <> + {Object.entries(prop).map(([childName, childProp]) => { + const spacedChildName = childName.replace(/([a-z0-9])([A-Z])/g, '$1 $2') + let title = `${name} > ${spacedChildName}` + if (removeTitlePrefix) { + title = title.replace(new RegExp(`^${removeTitlePrefix} > `, 'i'), '') + } + + switch (childName) { + case 'ipStrategy': + return wrap(, title, title) + default: + return + } + })} + + ) + } + } + } catch (error) { + console.log('Unable to render plugin property:', { name, prop }, { error }) + } + + return null +} diff --git a/webui/src/components/resources/ResourceCard.tsx b/webui/src/components/resources/ResourceCard.tsx new file mode 100644 index 000000000..4e6b040be --- /dev/null +++ b/webui/src/components/resources/ResourceCard.tsx @@ -0,0 +1,26 @@ +import { Card, CSS, Flex, Text } from '@traefiklabs/faency' +import { ReactNode } from 'react' + +type ResourceCardProps = { + children: ReactNode + css?: CSS + title?: string + titleCSS?: CSS +} + +const ResourceCard = ({ children, css, title, titleCSS = {} }: ResourceCardProps) => { + return ( + + + {title && ( + + {title.toUpperCase()} + + )} + {children} + + + ) +} + +export default ResourceCard diff --git a/webui/src/components/resources/ResourceStatus.tsx b/webui/src/components/resources/ResourceStatus.tsx new file mode 100644 index 000000000..51e3a7e81 --- /dev/null +++ b/webui/src/components/resources/ResourceStatus.tsx @@ -0,0 +1,71 @@ +import { Flex, styled, Text } from '@traefiklabs/faency' +import { ReactNode } from 'react' + +import { colorByStatus, iconByStatus, StatusType } from 'components/resources/Status' + +export const StatusWrapper = styled(Flex, { + height: '32px', + width: '32px', + padding: 0, + borderRadius: '4px', +}) + +type Props = { + status: StatusType + label?: string + withLabel?: boolean +} + +type Value = { color: string; icon: ReactNode; label: string } + +export const ResourceStatus = ({ status, withLabel = false }: Props) => { + const valuesByStatus: { [key in StatusType]: Value } = { + info: { + color: colorByStatus.info, + icon: iconByStatus.info, + label: 'Info', + }, + success: { + color: colorByStatus.success, + icon: iconByStatus.success, + label: 'Success', + }, + warning: { + color: colorByStatus.warning, + icon: iconByStatus.warning, + label: 'Warning', + }, + error: { + color: colorByStatus.error, + icon: iconByStatus.error, + label: 'Error', + }, + enabled: { + color: colorByStatus.enabled, + icon: iconByStatus.enabled, + label: 'Success', + }, + disabled: { + color: colorByStatus.disabled, + icon: iconByStatus.disabled, + label: 'Error', + }, + } + + const values = valuesByStatus[status] + + if (!values) { + return null + } + + return ( + + + {values.icon} + + {withLabel && values.label && ( + {values.label} + )} + + ) +} diff --git a/webui/src/components/resources/RouterPanel.tsx b/webui/src/components/resources/RouterPanel.tsx new file mode 100644 index 000000000..c380df50e --- /dev/null +++ b/webui/src/components/resources/RouterPanel.tsx @@ -0,0 +1,76 @@ +import { Badge, Text } from '@traefiklabs/faency' +import { FiInfo } from 'react-icons/fi' + +import { DetailSection, ItemBlock, LayoutTwoCols, ProviderName } from './DetailSections' +import GenericTable from './GenericTable' +import { ResourceStatus } from './ResourceStatus' + +import ProviderIcon from 'components/icons/providers' +import Tooltip from 'components/Tooltip' +import { ResourceDetailDataType } from 'hooks/use-resource-detail' + +type Props = { + data: ResourceDetailDataType +} + +const RouterPanel = ({ data }: Props) => ( + } title="Router Details"> + + {data.status && ( + + + + )} + {data.provider && ( + + + {data.provider} + + )} + {data.priority && ( + + + {data.priority.toString()} + + + )} + + {data.rule ? ( + + + {data.rule} + + + ) : null} + {data.name && ( + + + {data.name} + + + )} + {!!data.using && data.using && data.using.length > 0 && ( + + {data.using.map((ep) => ( + + {ep} + + ))} + + )} + {data.service && ( + + + {data.service} + + + )} + {data.error && ( + + + + )} + +) + +export default RouterPanel diff --git a/webui/src/components/resources/Status.tsx b/webui/src/components/resources/Status.tsx new file mode 100644 index 000000000..d67c126e9 --- /dev/null +++ b/webui/src/components/resources/Status.tsx @@ -0,0 +1,68 @@ +import { Box, CSS } from '@traefiklabs/faency' +import { ReactNode } from 'react' +import { FiAlertCircle, FiAlertTriangle, FiCheckCircle } from 'react-icons/fi' + +export type StatusType = 'info' | 'success' | 'warning' | 'error' | 'enabled' | 'disabled' + +export const iconByStatus: { [key in StatusType]: ReactNode } = { + info: , + success: , + warning: , + error: , + enabled: , + disabled: , +} + +// Please notice: dark and light colors have the same values. +export const colorByStatus: { [key in StatusType]: string } = { + info: 'hsl(220, 67%, 51%)', + success: '#30A46C', + warning: 'hsl(24 94.0% 50.0%)', + error: 'hsl(347, 100%, 60.0%)', + enabled: '#30A46C', + disabled: 'hsl(347, 100%, 60.0%)', +} + +type StatusProps = { + css?: CSS + size?: number + status: StatusType +} + +export default function Status({ css = {}, size = 20, status }: StatusProps) { + const Icon = ({ size }: { size: number }) => { + switch (status) { + case 'info': + return + case 'success': + return + case 'warning': + return + case 'error': + return + case 'enabled': + return + case 'disabled': + return + default: + return null + } + } + + return ( + + + + ) +} diff --git a/webui/src/components/resources/TlsPanel.tsx b/webui/src/components/resources/TlsPanel.tsx new file mode 100644 index 000000000..a5890d707 --- /dev/null +++ b/webui/src/components/resources/TlsPanel.tsx @@ -0,0 +1,77 @@ +import { Badge, Box, Flex, Text } from '@traefiklabs/faency' +import { FiShield } from 'react-icons/fi' + +import { BooleanState, DetailSection, EmptyPlaceholder, ItemBlock } from './DetailSections' + +import { EmptyIcon } from 'components/icons/EmptyIcon' +import { RouterDetailType } from 'hooks/use-resource-detail' + +type Props = { + data: RouterDetailType +} + +const TlsPanel = ({ data }: Props) => ( + } title="TLS"> + {data.tls ? ( + + + + + {data.tls.options && ( + + {data.tls.options} + + )} + + + + {data.tls.certResolver && ( + + {data.tls.certResolver} + + )} + {data.tls.domains && ( + + + {data.tls.domains?.map((domain) => ( + +
+ + {domain.main} + + + {domain.sans?.map((sub) => ( + + {sub} + + ))} + + ))} + + + )} + + ) : ( + + + + + + There is no +
+ TLS configured +
+
+ )} + +) + +export default TlsPanel diff --git a/webui/src/components/resources/TraefikResourceStatsCard.spec.tsx b/webui/src/components/resources/TraefikResourceStatsCard.spec.tsx new file mode 100644 index 000000000..c5ca06117 --- /dev/null +++ b/webui/src/components/resources/TraefikResourceStatsCard.spec.tsx @@ -0,0 +1,53 @@ +import TraefikResourceStatsCard from './TraefikResourceStatsCard' + +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the component and show the expected data (success count is zero)', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('success-pc').innerHTML).toContain('0%') + expect(getByTestId('success-count').innerHTML).toContain('0') + expect(getByTestId('warnings-pc').innerHTML).toContain('60%') + expect(getByTestId('warnings-count').innerHTML).toContain('3') + expect(getByTestId('errors-pc').innerHTML).toContain('40%') + expect(getByTestId('errors-count').innerHTML).toContain('2') + }) + + it('should render the component and show the expected data (success count is not zero)', async () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('success-pc').innerHTML).toContain('14%') + expect(getByTestId('success-count').innerHTML).toContain('1') + expect(getByTestId('warnings-pc').innerHTML).toContain('57%') + expect(getByTestId('warnings-count').innerHTML).toContain('4') + expect(getByTestId('errors-pc').innerHTML).toContain('29%') + expect(getByTestId('errors-count').innerHTML).toContain('2') + }) + + it('should not render the component when everything is zero', async () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(() => { + getByTestId('success-pc') + }).toThrow('Unable to find an element by: [data-testid="success-pc"]') + expect(() => { + getByTestId('success-count') + }).toThrow('Unable to find an element by: [data-testid="success-count"]') + expect(() => { + getByTestId('warnings-pc') + }).toThrow('Unable to find an element by: [data-testid="warnings-pc"]') + expect(() => { + getByTestId('warnings-count') + }).toThrow('Unable to find an element by: [data-testid="warnings-count"]') + expect(() => { + getByTestId('errors-pc') + }).toThrow('Unable to find an element by: [data-testid="errors-pc"]') + expect(() => { + getByTestId('errors-count') + }).toThrow('Unable to find an element by: [data-testid="errors-count"]') + }) +}) diff --git a/webui/src/components/resources/TraefikResourceStatsCard.tsx b/webui/src/components/resources/TraefikResourceStatsCard.tsx new file mode 100644 index 000000000..15dfa4508 --- /dev/null +++ b/webui/src/components/resources/TraefikResourceStatsCard.tsx @@ -0,0 +1,216 @@ +import { Box, Card, Flex, H3, Skeleton, styled, Text } from '@traefiklabs/faency' +import { Chart as ChartJs, ArcElement, Tooltip } from 'chart.js' +import { ReactNode, useEffect, useMemo, useState } from 'react' +import { Doughnut } from 'react-chartjs-2' +import { FaArrowRightLong } from 'react-icons/fa6' +import { Link as RouterLink, useNavigate } from 'react-router-dom' + +import Status, { colorByStatus, StatusType } from './Status' + +import { capitalizeFirstLetter } from 'utils/string' + +ChartJs.register(ArcElement, Tooltip) + +const Link = styled(RouterLink, { + textDecoration: 'none', + + '&:hover': { + textDecoration: 'none', + }, +}) + +type StatsCardType = { + children: ReactNode +} + +const StatsCard = ({ children, ...props }: StatsCardType) => ( + + {children} + +) + +export type TraefikResourceStatsType = { + title?: string + errors: number + total: number + warnings: number +} + +export type TraefikResourceStatsCardProps = TraefikResourceStatsType & { + linkTo: string +} + +export type DataType = { + datasets: { + backgroundColor: string[] + data: (string | number)[] + }[] + labels?: string[] +} + +const getPercent = (total: number, value: number) => (total > 0 ? ((value * 100) / total).toFixed(0) : 0) + +const STATS_ATTRIBUTES: { status: StatusType; label: string }[] = [ + { + status: 'enabled', + label: 'success', + }, + { + status: 'warning', + label: 'warnings', + }, + { + status: 'disabled', + label: 'errors', + }, +] + +const CustomLegend = ({ + status, + label, + count, + total, + linkTo, +}: { + status: StatusType + label: string + count: number + total: number + linkTo: string +}) => { + return ( + + + + + {capitalizeFirstLetter(label)} + + {getPercent(total, count)}% + + + + {count} + + + + ) +} + +const TraefikResourceStatsCard = ({ title, errors, total, warnings, linkTo }: TraefikResourceStatsCardProps) => { + const navigate = useNavigate() + + const defaultData = { + datasets: [ + { + backgroundColor: [colorByStatus.enabled], + data: [1], + }, + ], + } + const [data, setData] = useState(defaultData) + + const counts = useMemo( + () => ({ + success: total - (errors + warnings), + warnings, + errors, + }), + [errors, total, warnings], + ) + + useEffect(() => { + if (counts.success + counts.warnings + counts.errors === 0) { + setData(defaultData) + return + } + + const newData = { + datasets: [ + { + backgroundColor: [colorByStatus.enabled, colorByStatus.warning, colorByStatus.error], + data: [counts.success, counts.warnings, counts.errors], + }, + ], + labels: ['Success', 'Warnings', 'Errors'], + } + + setData(newData) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [errors, warnings, total, counts]) + + const options = { + animation: { + duration: 1000, + }, + plugins: { + legend: { + display: false, + }, + }, + tooltips: { + enabled: true, + }, + maintainAspectRatio: false, + onClick: (_, activeEl) => { + navigate(`${linkTo}?status=${STATS_ATTRIBUTES[activeEl[0].index].status}`) + }, + } + + if (!errors && !total && !warnings) return null + + return ( + + {title && ( + + {title && ( + +

{title}

+ + + + Explore + + + +
+ )} +
+ )} + + + + + + {STATS_ATTRIBUTES.map((i) => ( + + ))} + + +
+ ) +} + +export const StatsCardSkeleton = () => { + return ( + + + + + + + + + + + ) +} + +export default TraefikResourceStatsCard diff --git a/webui/src/components/resources/UsedByRoutersSection.tsx b/webui/src/components/resources/UsedByRoutersSection.tsx new file mode 100644 index 000000000..5eec1e465 --- /dev/null +++ b/webui/src/components/resources/UsedByRoutersSection.tsx @@ -0,0 +1,146 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTh, AriaThead, AriaTr, Box, Flex, styled } from '@traefiklabs/faency' +import { orderBy } from 'lodash' +import { useContext, useEffect, useMemo } from 'react' +import { useSearchParams } from 'react-router-dom' + +import { SectionHeader } from 'components/resources/DetailSections' +import SortableTh from 'components/tables/SortableTh' +import { ToastContext } from 'contexts/toasts' +import { MiddlewareDetailType, ServiceDetailType } from 'hooks/use-resource-detail' +import { makeRowRender } from 'pages/http/HttpRouters' + +type UsedByRoutersSectionProps = { + data: ServiceDetailType | MiddlewareDetailType + protocol?: string +} + +const SkeletonContent = styled(Box, { + backgroundColor: '$slate5', + height: '14px', + minWidth: '50px', + borderRadius: '4px', + margin: '8px', +}) + +export const UsedByRoutersSkeleton = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +export const UsedByRoutersSection = ({ data, protocol = 'http' }: UsedByRoutersSectionProps) => { + const renderRow = makeRowRender(protocol) + const [searchParams] = useSearchParams() + const { addToast } = useContext(ToastContext) + + const routersFound = useMemo(() => { + let routers = data.routers?.filter((r) => !r.message) + const direction = (searchParams.get('direction') as 'asc' | 'desc' | null) || 'asc' + const sortBy = searchParams.get('sortBy') || 'name' + if (sortBy) routers = orderBy(routers, [sortBy], [direction || 'asc']) + return routers + }, [data, searchParams]) + + const routersNotFound = useMemo(() => data.routers?.filter((r) => !!r.message), [data]) + + useEffect(() => { + routersNotFound?.map((error) => + addToast({ + message: error.message, + severity: 'error', + }), + ) + }, [addToast, routersNotFound]) + + if (!routersFound || routersFound.length <= 0) { + return null + } + + return ( + + + + + + + + {protocol !== 'udp' ? : null} + {protocol !== 'udp' ? : null} + + + + + + + + {routersFound.map(renderRow)} + + + ) +} diff --git a/webui/src/components/tables/SortableTh.tsx b/webui/src/components/tables/SortableTh.tsx new file mode 100644 index 000000000..831e9df0a --- /dev/null +++ b/webui/src/components/tables/SortableTh.tsx @@ -0,0 +1,56 @@ +import { AriaTh, CSS, Flex, Label } from '@traefiklabs/faency' +import { useCallback, useMemo } from 'react' +import { useSearchParams } from 'react-router-dom' + +import SortButton from 'components/buttons/SortButton' + +const STYLE_BY_ALIGN_VALUE = { + left: {}, + center: { + justifyContent: 'center', + }, + right: { + justifyContent: 'flex-end', + }, +} + +type SortableThProps = { + label: string + isSortable?: boolean + sortByValue?: string + align?: 'left' | 'center' | 'right' + css?: CSS +} + +export default function SortableTh({ label, isSortable = false, sortByValue, align = 'left', css }: SortableThProps) { + const wrapperStyle = useMemo(() => STYLE_BY_ALIGN_VALUE[align], [align]) + + const [searchParams, setSearchParams] = useSearchParams() + + const isActive = useMemo(() => (searchParams.get('sortBy') || 'name') === sortByValue, [searchParams, sortByValue]) + + const order = useMemo(() => (searchParams.get('direction') as 'asc' | 'desc' | '') || 'asc', [searchParams]) + + const onSort = useCallback(() => { + if (!sortByValue) return + const direction = searchParams.get('direction') || 'asc' + const sortBy = searchParams.get('sortBy') || 'name' + if (!sortBy || sortBy !== sortByValue || direction === 'desc') { + setSearchParams({ ...Object.fromEntries(searchParams.entries()), sortBy: sortByValue, direction: 'asc' }) + } else { + setSearchParams({ ...Object.fromEntries(searchParams.entries()), sortBy: sortByValue, direction: 'desc' }) + } + }, [sortByValue, searchParams, setSearchParams]) + + return ( + + + {isSortable ? ( + + ) : ( + + )} + + + ) +} diff --git a/webui/src/contexts/toasts.tsx b/webui/src/contexts/toasts.tsx new file mode 100644 index 000000000..f28ac82cc --- /dev/null +++ b/webui/src/contexts/toasts.tsx @@ -0,0 +1,40 @@ +import * as React from 'react' + +import { ToastState } from 'components/Toast' + +function handleHideToast(toast: ToastState): (t: ToastState) => ToastState { + return (t: ToastState): ToastState => { + if (t === toast) { + t.isVisible = false + } + return t + } +} + +interface ToastProviderProps { + children: React.ReactNode +} + +interface ToastContextProps { + toasts: ToastState[] + addToast: (toast: ToastState) => void + hideToast: (toast: ToastState) => void +} + +export const ToastContext = React.createContext({} as ToastContextProps) + +export const ToastProvider = (props: ToastProviderProps) => { + const [toasts, setToastList] = React.useState([]) + + const addToast = React.useCallback((toast: ToastState) => { + setToastList((toasts) => [...toasts, toast]) + }, []) + + const hideToast = React.useCallback((toast: ToastState) => { + setToastList((toasts) => toasts.map(handleHideToast(toast))) + }, []) + + const value: ToastContextProps = { toasts, addToast, hideToast } + + return {props.children} +} diff --git a/webui/src/css/fonts/nunito-v11-latin-600.eot b/webui/src/css/fonts/nunito-v11-latin-600.eot deleted file mode 100644 index 0c44db500b594d5e711f0b40ba894838ec4af40a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23216 zcmagERZtwx6D_=pF0i=!;_mM5?h@P`7I$}dcbDL|9{T`0Kft=F#s|(0F`}!FbHem zB7WNJo8F9_lDn%Llu}2~f|)IwCu6F+=5Qow7v|Hoei~pqT`^S13KwvG{V9oMdN#}l z$H;TsYI~Skx`wjI@Gtnq1UT`F3fE~0r9MQ5Tw+EmO^;*am=T7vRH#kP0CxIb z-i=Z`izgUUV1McQTtLsA@k45oBvNZM-!^i|Cg;iv!iV^M@MtAh_YSs4>5J7*jDJK} zSlE5=;1jc_i_OMM(ZzZsE(MppDM zv<8w>>*Es?mNSlOLD=~YK?zh8L)0P>5K_0>AFErB0Xg;kb7guk!d7An$#DXLoMSE!emIuCLJG7GkoFnf{o9 zOC!3PCtDh!07hJJyjWvUjCbLE7%~=y1Z-d_mqI5p_}R8qn!f~6vmq-exFXxhI3XnB zSxMA6%93YyxFwoaQV^Ha&HORVLaOo?sApP*pM4Bh#v^EDEuI$X?@cJ$Vw)RS@bTRq zft)%)QnDMc>78M(Hb1XXVT$6l$%gbFl1D@(pi@*e()}{aXkiQqOI#Uuf$K2}C3zOY zM+!b^D^L50Y^H^qO}{00{}s1$0B^whymt}=7{c6+wB(bRrotcPeHUkm^bI2ve$-)l z)Uh+)iEWB|FFs%`q1T;Psmz7SC(~JTuG$%iWKe~r zb>s_fxMVnvE-SF~r58%x@1P(D2 zun;PXQs8XfBW^wE@9T~iYf%Gghc&PAIV6a%;>LdSD+?a%yO?xKCX!Bo6fuSyh_R(X z{yjC_MRs;G6&x|`^Qyn<(mxq8I8CKz( zO7Wrcn!1dB2VFOd_?-(14!}whUjVe2il8(qGKK-A4x7ultZZAcLT$mwxzrsi`d-|mDQ>DvL zhOK_h$&NKSAx%_3t4`jXAMbZ20nMac)!0`i4k^7Dozfl(ja$*kDY|%ZqGE_M^aFIl z{lg(yh#SZ5nJ#n~7`}d9j5ZZZU<4LGM!yUjKdF&%Mnle%hixi1{~K1)Fg$e_jD~t! zCKh2~gPN%K89rxdO!NISTGR_P+2j&c=80XIt~KI*0il2keC3Q)Up0_FgdH!j*<7Ja z^d)Ybrf2xKA2bierw8a$?9eQIM)RFJwMpBSoO#AQ$wjYO7Kvu!T;JzR-{FFpX2gg_ zF`kRjPdT>By9>$C5QWZ>rEa^wWYNq~`-9&+=Wi3qxxk%VX}cDD$vVQ`B}inQsDCZ* zVy`~Cg@fTy2tZP8{$l_wKPl;JN0RN?%{(MLCfOjy?Svj)Wi$-HOpk2rQ(_a;XIxcXNY z_ou4^qGsBYoYW&`DpV2TTWF-Up5CcJ&!7#`8ZwOsN)!^wHzw;USM$HZ2+&2>f0FQr zUMrn1?&^(-afl`O;c7oe=q5%dXSHMgq|mV6omB6j(qx2LI42Mku+)xk`I__g;#nG7 z{4|MmR{}~(nAu0`Uv=iisV^fJ-PwR#RvfwT<#B3=W3^H$873RXN*5?(_%O-~Lg_yu zJI}eq**K_jYGc^6W!T(9O;Cf$u%gf{Z7hhFuRy^J@RR)`&>?`4Ye zH<}XHO5mw{Rkwf$rkOpACwT3F%P)S^zB&;&WkRWG`~_HW6+`78jWjY9VNfd;+<0R~ z_oROu7g9YbEB`DT(uW)Vit`C~w>>8DiCU4fTs9$|u>?N~=HIU&g#?!lguW!rZ^Pyd zQs}fNTlR_~{ha%)@^naXiXf4EEUDSnX8 zN^661ElKFV?)Xr%RxjSbt;K=-k@;bFHc>c7B^+hJAxZY4h9E;a>CzQ_-h&?{T6lp% z1_LL0_8scTe)VznceE4yv}3nY*yeF?n-^pR7XHAR=50k7Po!a_?8@`sU?1O6RiHB+ zB{cFxx3U}aeLc-XQ>V{WP7wD!JF+KzMINbBSE1}op>%J3S$KT8dVD1=uJi~cdqEB8s=P_2(YNS8>3VfrDUu8Z8+-RNEn~15s_=c8aM zs(Yi$j!18Yrha>)OWdE8NIX02cv6jWQjMG+@jWyd2ML+d1iU)>UGV_oWF9IcX$Bu? z{R6K*hG|=CnS$QDcVoz=jN~SK2&tgnI)S??mtBb+3ok`p*~ibQVSMnVi=%vAzsh8G zV7nuPj}z(UjP%qr38}Tb7mNGO|?)1lL!jb)5yW@DJAQIcUaq{F#Le=wr&E?|y?fJB0+3@4)0QSauEJOz!L)^_ta&`^kSa@=!0>Bc&8?LPgbl%g@=c4} z$Oz~8&gf3U=ox7oi7k-i21zC!Mr22coR^T_RJD<$k? zY;1OxzYagH$tdF-@C#4o6ZP8^!ZEho&3YI#!kMa2K%qPeEY;ZUM&~Q{bf$G|odEw) z!Ajezj&yFIrFeM{wgOpqJ#3Ut`D6+kb>+6gCh|T9R_8a28OzHm?F{KkO4_D|k=}+# zFS@^0GAXpTYAD99iKJ45BPFsPh-u0Db)q2+ zV|i=HuADE1&xB9UWyY0cx2gy;k8{Ew_my=j+0_QwFqH;8^ZD@NuI91NV4wYi`olUS zYKm>DT&yvI0sWXx&NuOg=?}JWW!yp2^}_W9R|{KIiG^{Yy*c`p2$2VrqT1xf&^RwI z?Ml{OtEiN$F!G$z%%g_Q)Du4<*-9E{Bi6wBbq}s(G*Gb*Wr9qwFu3xs<-TPCiN?x9 zaPEOs=p2Qh-6EAbD%Ih*Xr!PsyYOa2a;e0+Syl~QZvDCQ2uBkFbcQ$86jRq>I2Y}6 zg+IcqH@7b?!^*QbKdX*^UI8I9V^{2{tY@IcFQ*mCI{@ zX~L)fr%!e(XyI0TDE7V@aIEPw%b+WsJtAW`G0sGoNI#=5X{?~wp)J~)dG`CMu!9nl z#sa8VG);WztfeH zk6B}aA{;02Q1(SHF5%+vR!t>hTkf~-{-KaFk+KU(xVub*+ZLx(6=JTH5haQji>AEp z0RHD#voyEdBP3``z9ba9MeffQ86Y8z)^jRvNSM|FCrR3B1_hxqolngqO+y;%6-Ot|jMQdFn7&+3nk2+4%AS-b;LwmCO>%=4Z7B&J$TJ$;d@{4C; z5|;f&T0Wz9g#Hm2J&xhc5kc@O(lNu=9GKrSMPY?K%(6tUK#jwGi(7NM5}Jw=@-?qX z7Ue$XMgvdJib|ot1A%WeuLAzD%HOR+TQ*h@z`N?4jDLu^4H8^ohx~tyIrAeB1Qn5%* zw3Ct9_1yrm*aQ|`9ujUs*aNcGSeym4ENWN`_tDa8*|LR^{h&dDRISqUS=n2*TsSXV zj5?-HX0(g3>!aJaMMiGFs(O;eO%i!0?5e1?Sm{i43f>hR1^fU=lyQ2Kd zE3M6*STF+kXY)mV}InNFCQ2gP$%^~* z7a)poAPJ0GX$n->CPox*<=G6guyhGCF%yC5nizy>pEQPP`TiNEe1;BC3nd$_<=wuO z$)Uq2Nh~R$-R*jj7%0)9z3CvW{ zIu4*lueU6ERLGNB1Ybe`5qMonhutOI{qf+C4~npXXwOA0NL zOhtleF9b+ihEpLsM7?}H!b0?%#Uq%DN%1VLm~Jh7j>TX_nTpVCwco@8+KdKxOK4vq zk^Ea6)>l2ATxMM&+(PddCh&DMP+76C89wXqFN&uPlFOlcG-@`py|u(3c-Iu-Vw@5i z{Hi*sB2i&L&^N37`gF*zT|TvbfP)sunr!lzsI zCWtv>sB>U5#-lSj=VHK|MjUKdYlJmIen+sU?J@gp$5L^*unEiT3gk8$UulE(f6 zA^<`in`?L-t~Eki-u2%Quci5#mz4^BHMX3lc%kcLSe`h*{_pKpS+89*WX$(wr6*TA z2RiXR!f$4%WFjHa>8P6&YwNUzO&2H|yph-awD-p`>hZ_X&}IQOoKKT&pEIC$rUo|4 z-l?Y+;iiozB3i z$bbq8$6IYcB?H9qG1lg<`#QxCcJR)w)`hM^-2N1sqi@7C6gyM*U`OV zMql27d3k!AZVxCk;|C(coNkJdgIjbYFgUIXrv&CT(p&TAqHln$YJ8}KX|M(cv3lF_ zv1L{K#pIxwsH`BioHsIIT~)^A4o|8H{aw?%dItP!jtFXTDU7S(8BqW+E)aSz#!k1? zr`Yxbn*u9;(G%Au!s3+x1r_#Xf2BoxV6Up;Q+%*m8=9rRxfUVHZEaxJwZ@q(QDj%* zUF&lo=g3b?lVMFI@U;p@>nom7Rdecc+vTn{S(9jSK*Tk_zKn@w=27VUU4FHmL+o$uXh+jcg9H?gD3`6jHxJryUnbuq;V5z zO?E+RuZhIh>`Z&(Wa6I5sr{iUJNF{og**z3WI&6)QDheD9e&mA-1th}~7(7ZgnLirA zQ5HvM_R7e(W9nXB`O-&3*(jppx^*1m+VekRrp73ktdbKk5Vnb?%n6t@h1g4(nHA>! zQS{kgH|u4L#mba*-kzE2tHyWZT`^=POd?o9?4CY34JE3pjT1V-H%+e?QmGQrdgg7a zR76E?G~96)t1_HFhQ~H%CNfKQ*v{CgHY;fEd*G{Z7)$W{TEb&&>}Q;(%C#)k%ox(j zybZ%M&_A~h@el+X`2Jm-T^Php-o6MaizSUe< zE`?>mtBdJ>&w=7)s10W`)WZyqwiWqOt8Bf>Hj(j8X^6O#Qnqiy%7Pu)%O~yC z7Mm}7zp{#H{+(CLbH+=mAeM;)p>9kYwP8P;UADf9@|W*iC%3*GbI#7w_KhyGTS=lX z>}Dw5+L%7>bAW_tGnA2YxIXH*V18R!2Y^ws1#8Ml(ClT85a=&sbbl9W$5)iFD9^~x zCrDwTne+Y!*gc&ilIJdL0J=rVxH? zLs9pQiZ#fLJ-7QFUy5$Eg+CVgoWml#m;L@q9%;HOP6h66MCCdlZRIzsoIYofrBfd8 z6e@9PYK9@;q8SrJy65wl(p{>u0KZ|DQ^*HPW`xK&=ef$PXxANLkpLg%_w*yE&HjZBxWFN| z94V5E1WDB3Vf$*%dQ(p5Th34$PInQA$mnK~wdJ%{?qaTE{-UCDD`(#Fwgt&7x6JlY zvcN%74GPc&(yVU|Ce;hFn8Tyqe}JFf7C3ss$z;n+avQE8sldurSBAB`K|ZVLu@xbeu4W4YLWvaB&R zwf0b|O0Z^L0~4p3UtXr^DTF(Tms83kb?-?YvfFHKEV=05W7Q;i>Kwrw@uQgr4OYXjp6o42>q8o$+MM0$CNL3MiabuBx@f8g<04ec)L zS18WEb!a@Sn!~RKa@uR)xXO$0^j#LuRAr5Y!LI>i?`tn@>RHYon5}@2NvV%=mu{Ad zp;<-r-a`uw>z^8Z5MF;li$4z?AQC6f#x>i?Z2S}H%0_hKmO)=Le{WQSAj z_{2g5x}drG0n>qOt4e>2`28EqqVQy*C z9_xs09XJvkkgKS7N0oC6Hi2<8o5qqq{>tw8O)2^6&RhDRZVF92b%x*Y^YtBJlE`0e zHO5F)7(rVz2T*HjctFQmy4>sc_$mmTm`EW^WY{E14_6$o=*vi*W;4jK2 zWMjI3vOvni9pzfa4=#)@al`lqkJrZ$@%1#{kS7X^tIYFyLlq8}pDk7mHtG!?ShYq= zEeA3wxsh_rN`;LRW}Nr$IXVCvKHV^@6XNx*$W43|UCF^#wl%fli~#MowuNNt`5;3z5*b;-a#cn{q37{|?5)B>ZjG}Z^J(55wO-wu zL=&9o5d;R)$6u?YS}&1YJ2z|OU`=M7 zbrqP&@#3So!I9mwp7{gx@6Rg5nv|ri$fVEy3mb55{cs{TmoowP{Iryi@F=nFN%aNb z<@}V6%~LUVQ(XXyQr-%^9+CjPQzD}+MP07k*7j*lepTvZN%_r-UjPSrzUU)Yx+`)2 z`d?1!ZU%c$V$Wd?=JlZU2}D)(=9W?crkrfZA|88)x#A zK-?VUF*N2Y=Inu79+PD^x_lBb+R5kg0`v&wfzz8O6ljLknh_dR;FY{2+Fh(fJ!W>F zCpgt1(frZ$TLN5S1GbWeVx`U3R$ea2UpwW=cA2hcWRo(yzXAquCs!Z$>JD;QT5Hzu zaJOq!bw*XxzvABDtX=+@2d%xi+9%sX0TUyK9MA2|ZUBNbCsa(Ls@=V^M4F^!)dozu zDwHa^6bjQzZ7Fp6{FDafAZjn1^<0jsbM8p~g6pYoIXtYfYP@-0!U*0Ywsvt(7!S}W zs|}W;Inz@Qr-<@?A_~F*f}|+nh^X$;Dk<(dY(zCVkwdVq)^mmPxu29vC}(G;u_@3G zAn4xoW?k@gEMC;DUa@B=-=*6O=O+bixcA1TtTzz})fsX}3}?&RCAmOBNFZ%OY1S%L zcc%a&$$OoQ`IJZXNh|_3&WUS7oJKtzT-ay(&TtJar7pZ>UNZA;Cky1MSySlyvTY-Z zYWbjEHpP6ic{&#_ZkBUT&JbqZ=tdk)1xT`)8vulxg+@(=PBWkJ_K#F|{2jJXB5l%C zIFbVyzN~l~h2y0W2Wj83(cx;uQUsaXp4fcb@Y*36Pu)+#mOEW_Z)yn2MWqhSe`UrR zbPk`UKRG&slX9rN9R_oJ{E(KgwzJBNw`9=R_;Y~dN6oq+_-!j@Mj*R5h9v>^S_a?Z z+QC!g^Fwn{m|pc9gE+x>ZsQd4Q~3&J zMzGzB*chK?BQ$R!V^4q-JQs#CbW^2~nMSJzx%C3a60BFt>xW0_06JWk*QCcZLBkcj z{D|Yna)H-4;2Ryn!xZChh8&eovJeSo{xIbxp|I)-!Y2K(F;UxwnM0h3KP@f!#`Odm==3=Xh{?~}=p&+u&O7ZJ^g{oFnA zJ3xrp@{nW9ChTv$g2XEbJGj)wzXt+8^VamQ>f{clB3Q*MYeSnP*~sboZ!AJZTLsyz zT9D9Ug?~%SNv;sNb!1?=9Qf#isyf#7rgd#P*`bjK89?JiK8h+1OV=8Sx@wV6V)n2xceLnZZ$qo{%f!h<^7O2S)2HlJwZ{4FV*5dz$E*a3Pcq+l;?N)`x}ocY z_Fduh+{Orq{TV|&baDBr*R}KnVP;mlp9r|JQT1|)^wXDM+*U#w2H`?kB90x9s~&S3 z-%V8zQQgOu(atR`m zHkiK~i9xo8gt4_r;^>tO8W)Ulfng5*7!LC~=qV)J*Y~R({^P8}^cKg*+o?pn`O4Q{ zt=teoNhnbJ5SQhdTJO6M9-ZMbqv4r{vok3govzh&FI3#k=j$(l2%vSlUnHvK)Xgf) z7A)1H1N9vpgP6Ij*b|$+sww)}wUHSsp+yDHN8f|Rbq!HHf!$vLRKegBaeSdD{zCwq z;Bc8=7p1I7Cd2TC#maf=^QtZmxAMPL&f z(fd3SQ<+PvhPLKyR|6b_{&8$CG72Y>{yUv`LQ z5-WJVjCk!pl-TkOUfS{TBlyz<37vZ;gph`FNAZJ*?Idv|q<^t@9l?tW%ZCJ0Q%Ms_ zsBdj8t>P0_eKj!9O6`G0z{=4Vot|+FgcrM);wMV3Tga= z7AEFNM;IvH0EQRb#rZ#(NYu)?-<;D_kkjw*E>v<7Am4D_Ac@c%hyLa42zxqhxsOlQ zpzDBSZ@u0*9R&pP&%$-~_+hSN%eeAz;JFnTK1Xyvnn`O^t%T7;1#z2c4C+!` z|Kxj2RcgY3tkY6+TlzIhCvoKWYB<+lBk$Pie^QYZIV!uzmzK@`jE8xw5k3`{oiOWH zAjGp^PgS_J2GzNwF?6=-O?YY+93{x!pRM-8iRlT(bBKxBzsCgOvCtoNvu z?5m59UTzS|U;LYWKZOD12f9$j1xAVemOEPRa}EK-q)L|+ zty9LU?wK9OMo!*uTf9c6)>0++eQ^Jt-G?tELPL}-bNxQE>tEVr5IJ7_f_~ z2If$qguwzLQ!RngnK|*HcxBzyJPu)2bG+7tc_ajHSh9{An{?DDmVBqsN7)f9=~mSvjg}K?g6j`OGfymg zTvB}3I*H+f%TjC>0IJ=)U?pqb?saFmlpGCEzSQ%j)9L=pLJuqAWEWZ&bI<506QAbA z0rG?Fe(OBC+iBqUKp3ZD`GwZ{)G28~gNmB2LMA_};ZHO;LG3VPm>A;<$4(RGkCw*S z(+l_tFc|55gT--|&0)>ul1n*VEyJ?FbhPcR=)Fxap=og1`KYL2t^fq%jNH!$hDoqS zD5;M#rD#bs7$vgd0(A>Szdsp_VE+nMQSMV$l8gvOPpc}*5or5Ds*f@5

s6onGMkk<4DmvbHcU{=+rf9tKql<2V- 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 C#lkKC diff --git a/webui/src/css/fonts/nunito-v11-latin-600.svg b/webui/src/css/fonts/nunito-v11-latin-600.svg deleted file mode 100644 index 5c546d9a0..000000000 --- a/webui/src/css/fonts/nunito-v11-latin-600.svg +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/src/css/fonts/nunito-v11-latin-600.ttf b/webui/src/css/fonts/nunito-v11-latin-600.ttf deleted file mode 100644 index 967721db56d535108b7a0bf2706f74100428082a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48128 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

}FPT)S$It*huJLeAKJ4n5owzg2R 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 diff --git a/webui/src/css/fonts/nunito-v11-latin-600.woff b/webui/src/css/fonts/nunito-v11-latin-600.woff deleted file mode 100644 index 8185efb42cbc5ae5f73f403a9e8544eddeeb4e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24668 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 diff --git a/webui/src/css/fonts/nunito-v11-latin-600.woff2 b/webui/src/css/fonts/nunito-v11-latin-600.woff2 deleted file mode 100644 index e6e9d35ecdafb22ba1af8be5eea4dc2ffcf300f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20084 zcmV)EK)}CuPew8T0RR9108VrO5dZ)H0KDh`08S790RR9100000000000000000000 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/src/css/fonts/nunito-v11-latin-700.ttf b/webui/src/css/fonts/nunito-v11-latin-700.ttf deleted file mode 100644 index 9282bf63a749f3a057095a9e2f697cf3ad022f05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47456 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 diff --git a/webui/src/css/fonts/nunito-v11-latin-700.woff b/webui/src/css/fonts/nunito-v11-latin-700.woff deleted file mode 100644 index 7d113391c146a84f6e436f61477137cb4c1be984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24656 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 t6X#eU*zDBrIV<&qp_({B0Hc*_6) diff --git a/webui/src/css/fonts/nunito-v11-latin-regular.svg b/webui/src/css/fonts/nunito-v11-latin-regular.svg deleted file mode 100644 index 399883392..000000000 --- a/webui/src/css/fonts/nunito-v11-latin-regular.svg +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/src/css/fonts/nunito-v11-latin-regular.ttf b/webui/src/css/fonts/nunito-v11-latin-regular.ttf deleted file mode 100644 index fad846cecb11716bf289da346293812e5d42e749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47680 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 diff --git a/webui/src/css/fonts/nunito-v11-latin-regular.woff2 b/webui/src/css/fonts/nunito-v11-latin-regular.woff2 deleted file mode 100644 index 3d2b9e75cff278f856d777ab15da10c4e9cb320e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19976 zcmV)2K+L~)Pew8T0RR9108R)15dZ)H0J{tT08OO;0RR9100000000000000000000 z0000QE*q^v9EV&6U;u>x2!R+0nidfV3W9XT_ILzvsH@RKS(zd+eF!ebh9^Duud*+?SwEOGU zlBh$}#ZP{vAP><)3&oCKAgJ@W8y-IYKG!wquIT=wgPmoU3g3;uAT>sNZndWTO%^{a zOvsYu?vnjq7j{w_YQN`$hfcQ=vPxz^W(g8RA}L9sHE9vpxQvmkoV-xMVb1KQ)Xt@9 zZ^FRwmUqB2NG3mtrw55Q(!wNj*8)!E`h7IY+fa}YQ6qJtYlqt%Ly6R~SsB?M> z(xOi3z4PB^G6dYl1;zwJv+3p_7?K*y$^)-X`yp9HOjuANzm9OQd05WFe22|dXk`^^ zAyWbY#R6=<%j5aIqB}f4x8Ok7_Wyss7KALCF<20T-WrySHH^p+Qi>qjrx+QS7j|Ht zmuX*{7pZ3L{at>k)EY`ACoXFg`=3xK`m5tXD1-s2(GFkOZ@ty6qAFik$^=Y%V*0jml0nlN(l%S3svnEb0_hil)z1soHl2AVoNnmM>&G^HQikgD%CF@8`$=(xRtl!|W~yEU?rP zAXy+t*%Y9_ppeeOVgVT-sXK~Nx#$qX69jn{Ma#wDa4F_rO0SsefAzobKV&FlHhX(X z+5)ObjaC0IERLx#2LD;p@=*uVBm}WB@C9V+Y47VhU#r!4OABQ7%9d(^F9;)q7=(EU z;Vb`lj4gNHy>LIG1Ox<(MIB?U&eD5o@BKBO4-yh|1{e@)A=27za4UyzC1ElBd|Ko` z7y*3%fM6iyK=KTO3^xik+8D@Pe*i&%9&RGx8@K9x2wvUKLzp4~)PDr8yCeAJ<1~a| zaR364seaM#XL0KG3braC!N7ye!XpBLrvC9)^>RwpVO8%a!@1>9_>~pXKx}}sP*-X) zB>-ow-ivp+-xm3C#Gvz~P>mi6vvNqzOf(dm_g!Z#ey^jJu6OF?v zLD^E(T}VHtsP~uJL(Kt`EkK(^69PIcBTT_P$M3|#27ovJCoshM18kPiw-3=TPNFA+hE(BOgrpE z*v%|^nXr#Z`V_flZG1;*LA6J<21ZFRuiVka6cjBUy$_I^pqN`yCRNJm!Q` zu5`AUEUCknP5q9zWQQ}NB$X+JkRcl87ydI6-o$!o8{(3xj7ZEmM!6yqVYCrzA1-p7SJe4NQ#VSs6nb(Ikp zumz-XK?mU+B0LUGktzicYp%?vtBaWdG1f9->?v>5R4K-TEEZw}nDJW6+O*a(?&INN zj!HcU7?hOO9-u8{RJ2w%NvXA0!#Ge{*9e3`Zmbbav|ZWqhy`i#h`O165Y5!c0NtJ? zS76YT{Ma_bT|l}EX`}bN)F!3ay_704PAb=wxRt3;mojqTmoAnIBpCU+yWY~5TDfsS zMQj+$@ORWPe*@W=@ARHnQvdz3J=2;b`)mtD>$O}gmUJb8|by3s={0oj2mcN&$e9iA-5 zL%mdQYT3Ka@F?5uA^om}>ys<((%?}faQpMIwa$%soMy!fF@xh zkddL5-Hl|m52Jhd;ww*>Iqtv&-YZ4;1TY~HHUm-w85!4dFoPviteA;*veJC9|oR%Z+*5lYDC4gb^8v_`+$xk3X>hHWVn7Oh`b1O>7QC24(`a9N;8k!x`=< zxEBbJV1NP>tfykrieN5E5(~+ec~aOydP%N8kuTS)WT6TySHl)+S+0%^H9VD6qh^*` z3}9s7u+G>ZLkv%v7;Xe!J{Mua0S5vomKND%7aAfl$TmwWvi{UFg$3%fN|jr9z<&#Kc5QGKU1$ zB29>_K>_D@Vi5PjoZtb3R^fvW3_kb}LjXe%Ai)3?E|Cx+1csJ0seA||X(V0nrAsZGN6Ie<4hGp9dz_}2QIBzkVLNyqAD%XC&-dj zK+|A7ZE7nvgP)BLk+~Y+98sT2-PuQn zAc174RFjS-FoYsB0384TOgz{SwsZ%^u{SSu&xV*rn*5pDDp-ooJhfCXFL*S`8+X@Mj>b7u%ro7X)@$I zS8&)MAQFi3F%9%Xl3yj$Ktg$vt@lJ5AzB?6gVR3W#{p+^>Uh9&1`&3=|~3 zw(A;#>8&=iiA?!Qjc%`np} zv&}KrJo7DZ6e2>hp_N8&p+y#3VyR`8TVbVDwj%55EDVsh%>vw%C-e?=YyfDt4(UuK z@9X{JQ6Hzk${ynHUkS8b)^G{X7XbXNrvXa{K)_+{7y@FlwQ>j#PY~ljqx4hpHNty* zZT_s(w6D%T&G=s4+hq-)rA?Wulh_S{=1+s>Ta%qMlm6BGRqD&L$X(H_=F6|7%^tTk`;{%TIt4wm9h*90>(lk)p(ilPpE5G&%C*D^N(UN{w1|8Z=)1qa0|E zp^o|CxHoRu?XHLJdE}?hVZaxoUGUa^QOaj3aLzJbCfws$Qrd!NP?I6CqlXcnK0^|NG_-pjbu9 z6f04o)N|#U_0wOI!Kw}6tTG4zd^zK)Ypy7eJL6%(yt>Eyl8>OGEU5K8mnV!5`CBBn z1hUapJEvQxhZL?Sj_EU9$nsg>$0?0Ld}$jF*tvxJw8PBfcgyu92Ty*0_@yQDaAl?i zT~|6vYvM%QOT7X?Z!!`X)`N@;=z+f+Qp?|~fmm#G8_ZNzle;T_SS?z`Z@^Cut>wFu zIJNrrEA~$giLop6IAFXWm3(tCXClA!!2t1tej}FV6A_|?_2}D@ZP>dhsYu}+AyTy; z-ryNI&;T_LJy7SNrEZ29GfHbmsxxX3EgHR~w+2YC)==8v?2y++8Y4xYI7GBB*Pl_O z`Ls(dA6b8>Lg}nH?ZD*NjzU!nbqB?kI%sgY0t*t!s0K?42;CdV+JV$M<4`XqZUAQX zx7oeaQhOeJ#1roz>g&VZnW&6)V#6%yu#>Di4u++mjY6m-HTTiV*ly4Zm4#Y3!wlz^ zBtQjlp<9S4B z<1f_DBf&fQrh0x8Qe)_at4x}?Nn$~r4M-;fa=(k@xiGcwiTHsov#n^kB0n37L|D+V zRbNNJ799kM9QBk>?cHhuPNYsEab1zf@&llNp#(c?TY6^Dplybhk=F*E)STt^hq1$h zi9e_OEasn_FQ2=N5($Onj722666Is0gz_`z!3YxHQJ;N8d9Y#sx+cX+f-?XD(zCGJ*u=% zl@6$OkAWgZ$)vw$u0~CcdaWK+dWdnJhNmc~Vbro-FEaowL@*^`ReHnxi9$I}=6p6e zop4r?F2@b~(p64h1SLOQ_Y!z#tF~&{iB$;+Qk3k8ni1+0z~4`@nwC0NYW$>V{^jtoN3sp$4Cfh zLJD64ZMp}SlOj$nJEOY+0r%KVX6aGgGjtvT4TP;{aHLqx*IYztlGG-kM2KAI63r^Y zgS#=lusI6RDv{^oK;8e5j7KF~AM99jo+-_vBrLB(S6dc%z7qcZKWBC2x^=E0Ef7G- zP4Ckls?u2$E>BaD%Z0`_&s?g*;S;gEnJ@S43inakrgtkmix}P(xwVUNPuGtcb51$A zk3!|8KV$MH1qHOZs<6+)N-`%to~%&wzlv7Qf&Zj38ljH*(f${t3o?gr>VfY7&pty_jM(K4mWPZ_N~0z%{u&pY6x;PW4j5`{kW38 zHy*aZ`$|Phz^S5Xq}G@~+en=ra7Nciy)l8l(QvRAz>#DaNTUgXaUe~m0GS5TY(iij zXur_MiI?+%R$~HdBPl)L9MwqLn1F6{Fl^#D%=z$O!5pvy9UPbgZlHq)bHESu3wFb= z_6}j;wyW}$5!HR{@x_4JHp!kyR$7d#sQd$eg>2HFZTjzbu-vd;ZFDH=SlpeSZ2;#C z;F1AcGl1I)R1|eD?jC3Zd1fH54CI}Gd{&@uQNLn0uJhk3lK7LV8al2klzpoIk%*zWH7?aH82 zug8MLXyRu7tj=$dn3qKu#kIBW?q27nn5s>+@y=i8L?%+1*WC9T{%E2r(!MXIc{iQU z>vg5vfm>2i%JYr?bnGwlp<9T7D3?Q*3PWFgx%b_Xh=VKN_dDnpWu^4R1yM#zaYl)> z=iVmn$YT3<8DYrO!xRAIGMHi*x`sQDQ4ny>ey+ym2w8Md|Csc`F95|N6!C$qV!;p( zn$wXYapTM=lcQe-!bbdF%XBghIO8h!i&X`CQ&<(dz>nEDHnubc4WFiAa0$o3<;=ASQ}_1VgMc%S=^78e&?T z7bP9v6CwBLStUNUV+Bs~MrSS6Ih+6ZgcO(8*=2^utZIi)Ip@j{nZiO^6{MeN_Mw=$ zWYs5xQ8Pjk`kSSxZ ze6%6eDZYh@xQQD9qNj83H%dxd<@}_@U%ckc=5&M5j#7L)K~{Ej+xeUHnKP}y)C$5h zi;ALP&;7qy)gKzXB6bbjI51=(f#*lNTxyI*Od%(C1jrOA(jk?7-*}aa2;Qj10{a2D zK<1-49loCcRvYi;JGocEt9MTgqBLV$JiIMLLB-Kz>mu0A3U`S26}UlQ8yxMWHV_> zz1^G2&MHmUG!bgAvn1m}oW zB3b~{0|nw)4|R-#MP{7tuaq9j>c30^#Zb5~K)z&j+B>Sf2g9IEk!{r^vX%`v}NN z73=AsgByf-yTIaQ(Ocx21J(`oF4gzJl`v*8lBCIFQTvk9SE!!|&KEbT@e404oTLlf zWu+*G`pXO>8!ffdX4c3WSPP!oiu)!;V^lk6zpsP>u|*^a#fTcaSx9_+BazMYN#7wl zJvK-*Y>HT{C}=b1{^EPTnSTc(7_TzeBIz~>`4f%EiPoKH1Ax;EakD8y! zZ1m(UwQw#jP5^*K=Bfz9)|x}tSne5UbO91j1v@7Qq*MBO^Z9?UoXD2hF2E|Y<7hw? zhMQY6CL#3_`nKp{VFoemexrmd@Xm5nAwM>PD8z~Y1uO%1kNWoB3B{TmT0}bMYNvOur zZYZy{Dh?Kx`0Avr(0vntvuG4iSgguMB7dj7sFE8q$0F5SEqX3=kCF~CHHD6tI7XR) zwayOFjFutTbNzyE<4A#50H|!5u3y+(8|o@myhv=I(BJnGzk`P+uw@+=>tT`Do3^U_ z?kqp!jk=%F;A^+H!Hx?qMG9?QIGPEf3JGigOqA-I59gPm`7o)_5aaQFCvg(YA&}@2 zZLakAgaDZ(8MT$#ro!uX^2-^0&?s5}S`)$Dvkq$hMpR(Mg4a#nAeKxMaMtW5j0k&CGfEQ{k^f?WxA-vUg%91#DtV!qjDc z`l259TzI<(S9!QySLx!1E3T#8Q8oOgSRx3dNH$HFYMb}VIs#rv; z)`v9iRBIrbwFc?3Sb#RmUP-0Ttz8%)-sd`I7)J1pq_I&C${zU@Vh9woW9BiMcD~|= zM}kz6^IZ~`Wr`)wYAR%>>$wcuudA)os#USGOiT`9#YrRKgHCb>SuRpqQcCFE)O4u0 z%_x3K0~$V!AYGI@PLmQ>F7aq`LBa_}kyr+9Y#VThYi%ASC0Hl|nr_~urbw?9aS@hL z`W^#e1wQH~QxV)YDcpd&d3|qOd%{8+X?uK}A>!)5#LUNA5%fnU$wp|v|8)5Y!(1tGpGy6kO8~i7EL?(q{Mu|#AlrE5ofqPw@c414aQo1x z6<=y3G$lmhMtyGvIBn&(71TKiIU^xsvEUU%FYf0-+-!fC zD#SwpmIedt($HVIw}E&Flhe$Nq~HP+M}Ai=h!n(zWvafsv-emQNrqw{W13JML!{Qo z-PUvBhEHP7x(Gj(N47=;vBwM=I1k&e74gj|9%nJl7P{MV;sWHzAT^Rd4tHT?oh!eo zCZ6aTB*g#L>gWVh(tTHhgp||cqkwXAV}^lPmaSS;bq0b#E?yJ{qjSVw)`e4Lh>|T; zMU=#pMyMmoV#-P(>69U|>}6C$loDEAmeT0bNNHtRP(<0INVT6VH_|^cMb^|lt}ax& zaCqa(Nm0ssB9%`rs*2Cc7P6V>!weN|#1hw-w+&jhtx3fCP>LpHQuP#oP7R0a`2FRg z%`GkDjo6bmJYmcB$leb7$%dwN7%wOX7z~JPD(ZPTkLGhtDjZW0DokI@ULLOB_LnKD z1W^0jNe|^$2o=wFEy;ReUJ3TL&&_$s*mqc9Z5$MY^Z|YKU_;M;WHZrAG?ULd2Wo?P z`EEmT$~jkgNzsI@=Qz2}Lfz}zZ%5U2H!O7{H zyn4Yxl<&*-a3nMsdV$hk9xtX0IgzDLzu@+D$v(_H1UTFIqHl7A|BhW4Pd!5$#oe7U z`XY|}k3tEtl$-JK`e6LDD&vNT^w_>GWAEDKy(fj%t;vrP z^^0(r|FIUXEZ(6cz4eb1$M^0%acqy2P+@#=`R|4Gw!APZSg*cnA(MGMY}>YI!M3vr6YkoMZ>*{sXzI8N&dq);2~Q`^iFWOH6k%5MrNDc-{=@KhO#v&*wQWF;da zG?o%_3E5&>#kmU> zFP+D$JDmn$v-+UkDd8yqd|oFhQzY@&N-SYG+8kvrEq?7(A&fO(@zT4K9aB*-)p6Nz zBz2`Aa&K7E2kuM^wijN}TvIt~5Tw?5MSV4|utNc`@fdddKK}v#4Fc^)(Rokg_fpoQ zXfukR`-1$OJcpzG7?^iI<*__3`3eqv7&`B{I)mO!5Y2SObJco)jR)W7-{Y5!Hg;}X zo+k__`qq-XzP?U7a{M?0Z!OKAF1r5wf`~8?gpW|l92uDkrzqW!s+l}3X)Kdh7_Tv! zgj*r_833^|L69j=I%zN0rVzm@(7>0xo_0W0*LzoxBp{s(ku_4XUsk2ntKA}nUZ$Bm zJ!u?^U7Vm%{T{t4J`S$=TbfxWtC=MB-^h~Z6jtV{A|`q?kssrA`>kTbvsJ0_Kk99+ zxKes_nbBF8KGEjUCXvBv(7=~&%V?hVyuK*A*JjTiTVJBh^Qx+I2op*Ah{?E*B#i`I z?N#OF9CI{;0*+dX#aE#`L{pMgYSmWwX#eSN6kmN&Mw#8BHksh$3e&{OuWm-Ic`Ont1kyW&cd zqsvUrl9FF0R~B%)aU4ZCc=s%_2`8G!Sq7X7P#$g|Dnl)vQOlNf5-EaZ-XDJXh&`R% zU0ogK)XXGs7p86E85jzS#ailj`c(zmhJu{V($bvHh5~KAuMVdh*z5{dxSe5(r9AAe zC=c_Wy85}Ut_~%=1nDIaog?4ia+`l6jpWgpj5ib08;Q6{zI07beQXmsOg0gO-s>>k zLzvXZr{l?jgO}dYd<=KwJ+IZ{9CeWVPKl!?6!|Ll&WP#iq&Yy~Gp&C7u#mvvc%W+cpWm}n+&FQKe-q-T!h*V=rU zn%>8M`k1{t(2V8>D<|`jgbB}_?90$JrKdC2Zg*1XFqzt(Nn06<-dhy%r2TIyu2I>AiAh;b_Z#wL+8LCxW;ZzY>s`R1^_rYcx- zDD!~Sp0%{8-bSX2A+$8-pV-|{pf^RzBN0^}hgTnSn`*@_oYvs)F$%`2mXDf#I$X*2!~@3YnGO z`~YDq(WEJKUQv#ulzxbnggk@bo`a-FF;Bp>#(rS{R>2EtNt->8(-G%lemMF8K<>cM zlDEBLWs88PZ}@iFxKyE9|KAU0yccqlwZeWm0p4P#y80(}xI)I_)OqgXhZ$U+?z`=4 z(zMOaiXo>a1)n}+n`@NK!az&lLT}eO3k^nBRmx#Q^#Cfn?pf&VYD>saQ|>$ z^5e&>v)XvcF48ryD?G1eZjGI)UU=7bNgVdFC#;#MlfDwm%;h1?{{6{Jr^`Y49 zZ6~&#xQ(IB??*hd>(u5WX93pi++KfBNCdPg_4Hk$LV0C>9SPOeG#c7~QZ%O3Bm2wW zd& zV+XIQ=e*pa)oYv!d|ubW)vNcoSN{L|Zkk8hNZ#k+c}`9kWA3AXGL-Sxng$wy`{;ow zN`(Jw6o}{IUX=XiDTO5urswO6ij)EV;hz!cH0(xVf9tw#A`TOYldAbj*bDUpeSt>({fGx72C^R`9La=Yi9Y|`X3>GcII z?YZXS@p?WG4hQ&3tH)Dn_V_GSxu$O=fQyE36In;-Fib~i{yk+KEjQ0S)u_=l>vegN zNSuo<55Dz%kq=oToG#Awj7DHl<0D&xP2B&h1Y2E`%Px|Ix?Fm z7x*ZcZtFS9!iF%YU1JUrJPhX%t2y`m#wu;q%$C8yVVWwPsp^BUB456La#MHrP|lxU zFizqh)=@#kj|Gw7Y=S8fotc z8?KXBJ#L9jCPUcm*?dC{=(Zw@DRme z{F^zeHY{ePq;OI*KZBr45OHINC4paJDb5tW8eQnwDd)cXx>V!TnuONGnKy`H1=X{mBQ*A-K#^RN}Sk1f>ZpZ{T`9(C2!YoR|5i;xA#43#_T9E(d$1+aQ`2MP>X=7wVbCQAIlgQeBR$&@<@|95pZ?i?k#N62 za7!pUE$lN5MMI_fc)WXq-h< z?hhees-^Cx4`6hJ51^_kD@Paz4~5&8H#oU6i-*Acr~NU-O(81Gh4E#YHck6799F^9 zptgBJ%pC$oqMuHP(KZEXu!^L%>*R6*#-LWV@3B9oih7n#MGYWf{x5eEW0$uyBrjrB zzW=`x@-l(-I5F`Fi~UK!lc6kEWn{Q3RGG?(3{|;WsVuKhsMwX$U$S&PX0e72&DuMlatw z-j|9%NZbJMjq0qciX1$ay(titPV%Cy>_BRYQ4GCDAEiIq`Yt_V{_ECsdCzyCSRPoB z1c}n#&rY}TUqBH20MK8KA1lubwEN82a{EWCGOSwKSCHv`l8|s`AT7yFA5MG1_IZ*J zj9$4&e!IscoFM&mufm|EeoceF18FRs{2Uo8O8rh|y?+4TN6Bw`Z(4pyX@{egVfr=RYUKTJ$GjjU_SJoj80WkAwV)zsbUi!oqR9wCFJ|h0Hhd!*Ut+!r&hm;Ba zgk9CxFuFC_MS2L}_0RVFAV*O?@ioauQ6Bj(!&omN5ITs3ke?1$@HF2L(l?MZ2|& z6MUY>+GXm<>$8Z79wZ7Zid}%i0rq8bh9Vwv;*6P*tPbhiuL%=iH-~H-+0v8~Yw2K7 zxap+N-d_Pk(VBd6x!BC5)8K&M*9qgwuZD5sD?8(qC}Lj_Y>8AAcBZZVjdO~B;+@>I ztZ(&0n@KZmes!*-U%^oy2G-w>o&Cl}Pr=UcPVfrsv7PgO35m?#dDDQAvS?rX?AxP$ zMcL}juamw`T>PQ3skIa~zX{{u0v>`8;OG&6heMGgM-hI6hs2a1z>$~zHy#P|kUe0c zI7&N=?2Eu){qVHOJQSHbfPl5neKtVIy1B3eQ1_Go#RgwDmv#6wlX;5H*vDj^rhj!z zR?o>VPBYLiGh;tPi=&1=QS7fz<{p~~0VRSb&V6g{+bjZbQOc3DH;Yq`BU=EPx%`vA zF!axwSNI48y>e=Xt-@VTrBc}36&pn_vd5o6$#+CgN=`ul3P!yq z{jq?;|Cc*@qok?aWm~Y$-`%pkvU=aRF5k{=!S1zQ_t!%B8G@a9XL(j-3{qMss?E-A zS18SS!mzqPqfPyBu^2&&0PL%(z1);O zN*T(}h9*&~CwWg|BD@%R=exkneUC&08nqjqc zh*FzTE;e`yglxkakWt=VQyCgyCLzzi$G#55xg(jXOT(+jsFJI&?UlItEFAkAF5OgtF(l_X>>m1kA z=;jc%Z~TIQFTvE$F7}Kr);ewWpq+?h7o78@QyuEB9 z6)6YI%gzah-ejrf5o#P)6ZNZc*bJS&RRq zsJAH8mLc+#%+G}}t(XWBYT5YuNeNQ-*6uS;SjRVQ*Gy+7#G8|%@3V`@$?06 z(r9NO+&du=Pddf#fyp<_Uw-v>L-CgVfchnc8d+Qv&Ai5BoM4pi-4K@VWhCDboK*dT zN2xa{v`B|5y8JtbKYZU9Eu7nZ2n=KiD3E}LUW@?>?ml<7yGQ+p!FhYp6L+7xTlK)? zyuC=~?sIpmo{CV{cHNS zgX>^A@L*6g)oe9K%~kW%e6?V>8KOgGskjP-MH&xTpJ4}{Sw{e&W}o;HIauI>E=6%} zg-g*T`vI5LW!yaErVY5RuHy!7ly7*twltIxX1x zN_%0CKBqD+Xk=z=j`0d~RDJ*1Gf8bApAYJV^|cn)&Q+pwA611hZNsm%bXp0UAB!BD zw^V>_@4H2*k4Lt0uM^$)S78$4nX6Z1VOoDb&D`+%Ru_0&FXrPcHe&QzY^;?`cL_?< z{W-byFOkqd7@tu+KQKV(SfiVI@y}@BwIJa)<#hVjRLL=TIggDvgOL-aW5NJD>89R` zP8vI!l~w?SKiJNzl0HcY&7(AS3|qy_d7cu#d8n&{K9rS~V+eB|Kk7=2FRI=^edvh7 zqf>xcuw$khs>g?{OtcJ8)U-V@(>s3ypx8lV$yR-m2jY7%G{`yja?-|m7MrECOxO^Z zi*;1FK^`A6+`;WQ2Ggdv0|f5cz`w8P3M3}9fvK2oiJ%2g@1W`}-=?*`0`&EGEDqcw zp^tPkpEH={xGcuQuJNcGkG44ev{rhrEVGq)e!ysi7C_i(RHY>{XRB%QB=(&oTs?H4 z=4xAnhmua1jXntbL;-lkcaQfsSFCe{Im-D<*0C9aD>eXRrxW33jGWTy&;#W0aO%&5 zi^BQ+9fLu!QahxsG|YUn(Wl;f zlu%=hId+)G!&KM@>CBc|4(Exbb-tVx`cvWrpr%^ZE9K`&Y%Y41IUAy(5rp z73YSskXnI7YG$&j>19Qjr$bY<)U$UX%M`8jCeR=s9Wiuk}t^xA=L~hRFpM4f9l}&h_6H+KK=*gRa;LRh)uq)Ck6TmvpMI;bS z-ELAb*rmaZpn>}pDx{*WrYgL&EgH6WOP37LJZMe)$^2=yo==5`-B%voBF|Mad4100 zx)p?LlgJLp<$Ef6iQttVSd{uX=*Sv1*?3&v>stvGP!ihdE(vlL&lXuPRdMD;L!eRj zlpjQ(w#Iy!$vU!GHA4kOK{9)B+e;>d{7Pw^Z&MJ?Oa(a+D4$PO)0N1}t=HrEl}11D$qLbGF0b<$kIZfv|Q|W8=({nU^q+hLB&$EEaA#)m(-Pjieo2c zKo6boxwB{)o}6+Eu*lt@c#2p1LQYMdKJoUbR8oWP03pZ|Td@c?n8HV!!CO9VLmrmi zSSLP7!-Ajh(wL*H3FuyOS=B0}x@J|Qw^|xeZXqc)7}sX6wyi1^JA5v@V*cohnuF`} zRQW&Exj(&G=>LaOxiiQkWP3PtBNm>n)j%ySilZKZmr9@*WmAS?I=H2F)gxj?Dh95=p=vV7L`w82jpl;1xDaQX z)TKee)fALknCdHm{=2%?TJ&@`z=W|lZ|T=VG99r@X}Z$(qXiUM7Q;4~FiXk)ph>^} zu-bQ|D6&`h@$vdv;PI2kkKbOdAFl6j6MXD)LqG_OJfaP$eI*te$JQl~fqmMLSR4#U zBW`kbGx68aFuytyA0Px z6ngD3M4TPR+0^^dyjLVG1{Z69xin~^DSZYGF+{pp%dnlPjNFKge|Xx-<6+%3 z5=VK0ue;|Y(Q1HF2UF-(NNcaE;C1%wo1$*_AQRgq`%t z3YRMePaP;tao-}l8qoFy4NHMxTi%< zpR=9M=9*13m#Ep-2MAYavRGM)cFx>R#X+=kI0=A=OEYul(!i@?(aAAA>B;ihp4ZwI zaa?hl@Kh|JcsX91ggfsN8hGcTe5qfzwhHR2$0*O@$NrY;1*^>{ulsg-=F`BtGQW*= zEg{8hI@_?h1k0^nLlS+lYCE-Gj002PyCl4M-C)s7IMbJ9%3?$hX?BEpSPK{=EYiBI zMT$b&kq*W?RbWM3VXn2n>g)df{#xJaYjYN{(FT$2_(7hUA>be$qP(gxK(%*ePREg5 zTCl>K?!vx2Dq(=c1?&xpqaTZ#Y}g2<++5ecG;m)`pH6?LYT4xHYBpH-m$h4)XQ)Bl zb`xL}a3EqWGZ&G0p`3OWRE5?Blp-Oexs7k}*=$m9e)t1`Z4tJpc*)^cD+1K6k5q+Y z0a~{%{XC5yF*T5@E9k~S-USL?`84n-@CLLBrd+ZJHbbv;#64m+eL|RN_Vxp#vy8U- zn`EjLwS>o}7R@Y@rdrKt_n2f(@7+Xn$tq?3QklrszF5Zx(Q)HZQo%$)RcKH^DW{pY zC$0qI&#JpNVq};BCiLQ3CYI#)gjL(htR@mqT-P~$HTr8$p!dd?suW$F4bWu8r83f4 zsDww|4+jl`sf73xn>D#=mMrCy%Phk89Z*aFQHfbT6E;RKWy)!wp0ge#nTbo$Eg!-t z2P=4SJqao9!3{wLZ1rUG7>q`-LAO~H7wlzr&Dx&se)?`*?>QdW2se-VXzU|QP_y0R zb@CGlVVK@KForoW0tcGLl^)J=1~ha$x_lh(5?XubqJ1Nt70i^Wy#n~H>H8^Zf|yXA z;{&p4Z6h_QvTN`S_v7YGXCG28*w4Jz_6>2?ep>|)Xub7g_=-lOk#J6D?SHpQAmHR zVQs@K^FC@tLV`>D=86EALVE2Y(_yDYWa*`(G_8>(T(q7H22ty3eyFXg>?dzEL)?-X zs(%{P(XLY0i$3}jayfLYdG!(=>0ATx388A+)WnUCYiA!3ws)zhO+8@?t?+!}-p) z4EasV4lbALX!C-Xu#{S(>ry%s5!V*iH3uL5P>zMx@lFd|x>VY{OF; zAUuxEmGUFBsOGL;Y~gra0xIkWtLESxW$L@>QC(K^3IBk5uD(8wW(!m!uFh8BUH zV-@6!p7*o1qBiE#aC7NZNNcaEFn+vRUcLgoAHCo5;mc;SwN!Bsa|+f1L#MC}9wTcR32ciei1h+T@YEat(BJ=?>+K?r7U3g7eZ;LMBIGOB{K=+lJsx;d% z(0-_5;e}z*#kT>uCA!bUhRoSbb>0xKU+iXFEv7}yj0r50a6(Zc3E2xYVa64_Y@1Ls zN}i|;C&s5(i0AYqQFJ}(Q3=6I!0-Dlj9B)^fBF{*eE0nudi`Dw#%~3S6!{}b&vIbV zc_YNVWUG}bhfrmgHPd!TZE~+=)k5&R8(>ZzSg6U!C?R-I*r09NerT515hloL;2n_a zdARZcNZ5%8cQtb*YAab{D-$wp)V($1@oiLTP$c6wsrbkFOXwsl>8U#-IVb`a(%5}( zP}ATBu(3rN8-=|33%o^`GwjptK#y6uWC&RnnidYZK>aHyTe)uvOiVNJgb(52kXG9| zMr$!ZTi;LDwZ>bV*=JtY)#e0^<|x(J4!pFC+%jIDC`VJ9Dcx*RWh0%mS+Wi0HAStT zkc)xkEVFRy#Cn3r0fH?A2b|6%X+(kQF4+;M!Xozlsh~Hrdx9|{nGEBejn7B%5U3e{S9^%e*_5fG6 zd?BtZXiNEaNl2>9Dxywj#=PeEM5yq!AgnsHXkZSxB~~F>W1}QO^wt6 zC@eMa>mn2Mw&QTSY}o*?)jJ5s&KNN&wwEg)LkifF%|EAbdJj3PnO=W=icV=b?qPKnx)XapLs^;DX?xRo8b#Ep@Th z?`R)mF=p)v2Ddl`a>bkPzHc+hbpUy}7F>^lRHFOBXrh-lXvKn>@D0+UZim#fY*CPB zGyc4#haTt`LNXQ`5djpHii;gSqL!{kAI;1Z=Lbhwq7~(S35TWan^h-yg3M)%e7MyK z>d8@YuNJ`VE7DoFMX}vxS^K;F_3>8Ri`%*0sx8aoy^wCr$3euE&L+1zjdYo}eI(8F zuWB=TiM}cem`oNq>@{&A3+IKLu*?#u69695Ly}=HEW|FnQ4{K9NH+D`&8kF~f=@HI z_jlm^+xOEKpJ9b-QIAU|@?ro}3%#F_+WY%rzZ(VVDh)L^HRFm9-FJp(-fp$-fA_z1 zr(0bigbSJUuZD|4h6gPZdJ+w(1gNW>P(Sf&4L*CiZrR3Nly;{_Zv1ZeHmhq#bjsD@ zTq^=*KdaSK_6K+r;l-fHMNhYzSg6N(CJj~P=KT&Ob-fdvBipZ>^5!bcGJ)_B;^8u$<<&d3SgE zqTjvUy}mr1ZLdwOU#$5LEj`F|Q->(fqV_V$+;!h|*r9((=FGP| z`pi8oPH^BJWe@~CC6^)jPjtYMHbDV_1~yLg8J$y$$x@SO`o_zj=dvxtXHaSk<;E?P z+*3%6{)%+gID7&ntum9Od^LrLI)9e&nao`^aI~*ICICrvvn^z~2re5v4TwN+!1^f_ zUQIcRsX^t>ad1~0M#^E<>FP|%8{%%@6Hw@uIPfZCqJU>MzcP4#~O{)@i$g&OnfOK*BlbGP>a7!Uve0kI5p=uq(K z!lY`tFCe{?(NU@SiViPPeq}N4@)ECW=(=8DX5a1y{|n?69pq~7l~ZlK0T}+bQ)l^m zBgacK3g(!!#7ytoi_{}<(n@-C$J1r8JHmHe#ig0Z-jiB*roDKp1h$>PwArXEN@RO% z4@!(5la`E3xj!y1DVf|zQk{sfEYTzShH?#YKGC8%Zt^Hr+eu3)|Aij^xjL3~Ot0o5 zIisAkOwz}ZqfZ%qSS+u&w({W9M|439V_^_3u`Eh~)jZEeY3Gz%J(H_iH7{`uGV$oz z#Ij5#S+jU?8X5%8$vGWg9Uls?Dx}>qjDmFJKytDmSF$79z)Bi;NLBY9wokLJrz<|a zJZG52v|QfvFAq{ob}lcUuafv?$y0eM-b-48v-?75ah>n%{8feunSy(Wge=IA=T zP2KFO3|UK8=t92zGkJ9$*phw8y>!lPCEb4VO*<~@(IyVrm~}xsv{djE7z~4ugCb!8u?LCX;N~X z!bZ)zD3zjG%JUw#f=ZG|@vz>d)qd1Ib2kE5zz8-jyQtW9C3cv_mYq`eK66m!k}Ixq z3HXIpT}XkodYMgaL_?Bug+bzux=`v)R zOef0-ql`9Ewj8_^A2g$}hUTQ8O!moTRh z7dIvoIx>~H#T_-&|Lqhc6P*pz>km1XO|`iO9ks7*OjFCwf)(J;F|~jiE~17E_p4H) ziVWU+TW>IXTW2%$UE)8bO(egLlomk6zX`_i>GPXsqbS`iFU}Xesr(dQ)F13&;&q}v zF|l=g>;9E4b3s{Z;#f%fNO_(%sUv?pvP}Me!%6S!^|>~`hp6op|4rN4H8;)W;&L&V Xl2d%ET+;t|l0OM&2cGEtgiRd)hK-8b diff --git a/webui/src/css/quasar.variables.scss b/webui/src/css/quasar.variables.scss deleted file mode 100644 index a5bb5d289..000000000 --- a/webui/src/css/quasar.variables.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Quasar Stylus Variables -// -------------------------------------------------- -// To customize the look and feel of this app, you can override -// the Stylus variables found in Quasar's source Stylus files. - -// Check documentation for full list of Quasar variables - -// It's highly recommended to change the default colors -// to match your app's branding. -// Tip: Use the "Theme Builder" on Quasar's documentation website. - -$primary : #06102a; -$secondary : #2A2A2B; -$accent : #1e54d5; - -$positive : #00a697; -$negative : #ff0039; -$info : #31CCEC; -$warning : #db7d11; - -$separator-color : rgba(0, 0, 0, .12); -$separator-dark-color : rgba(255, 255, 255, .28); diff --git a/webui/src/css/sass/_fonts.scss b/webui/src/css/sass/_fonts.scss deleted file mode 100644 index 45346f514..000000000 --- a/webui/src/css/sass/_fonts.scss +++ /dev/null @@ -1,39 +0,0 @@ -/* nunito-regular - latin */ -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 400; - src: url('../fonts/nunito-v11-latin-regular.eot'); /* IE9 Compat Modes */ - src: local('Nunito Regular'), local('Nunito-Regular'), - url('../fonts/nunito-v11-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/nunito-v11-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/nunito-v11-latin-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/nunito-v11-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/nunito-v11-latin-regular.svg#Nunito') format('svg'); /* Legacy iOS */ -} -/* nunito-600 - latin */ -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 600; - src: url('../fonts/nunito-v11-latin-600.eot'); /* IE9 Compat Modes */ - src: local('Nunito SemiBold'), local('Nunito-SemiBold'), - url('../fonts/nunito-v11-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/nunito-v11-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/nunito-v11-latin-600.woff') format('woff'), /* Modern Browsers */ - url('../fonts/nunito-v11-latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/nunito-v11-latin-600.svg#Nunito') format('svg'); /* Legacy iOS */ -} -/* nunito-700 - latin */ -@font-face { - font-family: 'Nunito'; - font-style: normal; - font-weight: 700; - src: url('../fonts/nunito-v11-latin-700.eot'); /* IE9 Compat Modes */ - src: local('Nunito Bold'), local('Nunito-Bold'), - url('../fonts/nunito-v11-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/nunito-v11-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/nunito-v11-latin-700.woff') format('woff'), /* Modern Browsers */ - url('../fonts/nunito-v11-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/nunito-v11-latin-700.svg#Nunito') format('svg'); /* Legacy iOS */ -} diff --git a/webui/src/css/sass/_mixins.scss b/webui/src/css/sass/_mixins.scss deleted file mode 100644 index efbef0dd1..000000000 --- a/webui/src/css/sass/_mixins.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import "./variables"; - -$breakpoints: ( - 'xs': 0, - 'sm': $screen-xs-min, - 'md': $screen-sm-min, - 'lg': $screen-md-min, - 'xl': $screen-lg-min -); - -@mixin respond-to($breakpoint, $type:'min') { - // Retrieves the value from the key - $value: map-get($breakpoints, $breakpoint); - - @if $type == 'max' { - $value: $value - 1 - } - - // If the key exists in the map - @if $value != null { - // Prints a media query based on the value - @media (#{$type}-width: $value) { - @content; - } - } - // If the key doesn't exist in the map - @else { - @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " - + "Please make sure it is defined in `$breakpoints` map."; - } -} diff --git a/webui/src/css/sass/_variables.scss b/webui/src/css/sass/_variables.scss deleted file mode 100644 index 1a25552f6..000000000 --- a/webui/src/css/sass/_variables.scss +++ /dev/null @@ -1,31 +0,0 @@ -// App -$screen-xs-min: 600px; -$screen-sm-min: 1024px; -$screen-md-min: 1440px; -$screen-lg-min: 1920px; - -$app-bg: #f2f3f5; -$app-bg-dark: #1A1A1A; -$app-text-dark: #fafafa; -$app-text-caption-dark: rgba(255,255,255,0.7); - -// Custom colors -$app-text-white: #ffffff; -$app-text-grey: #737373; -$app-text-purple: #9d0fb0; -$app-text-green: #24a1c1; -$app-text-green-2: #06a21d; -$app-text-marine: #06102a; - -// Quasar -$primary: #06102a; -$secondary: #2A2A2B; -$accent: #1e54d5; - -$positive: #00a697; -$negative: #ff0039; -$info: #31CCEC; -$warning: #db7d11; - -$separator-color: rgba(0, 0, 0, .12); -$separator-dark-color: rgba(255, 255, 255, .28); diff --git a/webui/src/css/sass/app.scss b/webui/src/css/sass/app.scss deleted file mode 100644 index 7157a171f..000000000 --- a/webui/src/css/sass/app.scss +++ /dev/null @@ -1,212 +0,0 @@ -@import "./fonts"; -@import "./variables"; -@import "./mixins"; - -// width -::-webkit-scrollbar { - width: 8px; -} - -// Track -::-webkit-scrollbar-track { - border-left: 1px solid #404141; - background: #2E2E2E; -} - -// Handle -::-webkit-scrollbar-thumb { - border-radius: 4px; - background: #6D6D6D; -} - -// Handle on hover -::-webkit-scrollbar-thumb:hover { - background: #979797; -} - -body { - /* If you need to support browser without CSS var support (<= IE11) */ - min-height: calc(100vh - var(--vh-offset, 0px)); - /* enable vh fix */ - - font-family: 'Nunito', 'Roboto', sans-serif; - - background-color: $app-bg; -} - -// Custom colors -.text-app-grey { - color: $app-text-grey; -} - -.bg-app-toggle { - background-color: rgba( $accent, .1 ); -} -.body--dark .bg-app-toggle { - background-color: rgba( $accent, .3 ); -} - -// Helps -.xs-text-center { - @include respond-to(sm, max) { - text-align: center; - } -} - -// Commons -.q-icon.eva{ - margin-bottom: 1.5px; -} - -.app-title { - font-size: 20px; - font-weight: 700; - .q-icon { - font-size: 24px; - } - &-label { - font-size: inherit; - font-weight: inherit; - &-sub { - font-size: 16px; - font-weight: 600; - } - } - .q-icon + &-label { - margin-left: 8px; - } -} - -// Boxed -.app-boxed { - margin-left: auto; - margin-right: auto; - &-md { - max-width: 100%; - @include respond-to(sm) { - max-width: 600px; - } - } - &-lg { - max-width: 100%; - @include respond-to(md) { - max-width: 1024px; - } - } - &-xl { - max-width: 100%; - @include respond-to(lg) { - max-width: 1440px; - } - } -} - -// Section -.app-section { - display: block; - &-wrap { - display: block; - } -} - -// Toolbar -.q-toolbar { - padding: 0 16px; - overflow-x: auto; - overflow-y: hidden; -} - -// Card -.q-card { - border-radius: 8px; -} - -.app-card-as-chip { - box-shadow: none; - - .q-card__section { - padding: 5px !important; - } -} - -// Chips -.app-chip { - border-radius: 8px; - font-weight: 600; - font-size: 14px; - &-wrap { - height: 100%; - flex-wrap: wrap; - .q-chip__content{ - white-space: normal; - } - } - &-overflow { - max-width: 90%; - - .q-chip__content{ - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - &-accent, &-rule { - color: $accent; - background-color: rgba($accent, 0.1); - } - &-green, &-entry-points { - color: $app-text-green; - background-color: rgba($app-text-green, 0.1); - } - &-purple, &-name { - color: $app-text-purple; - background-color: rgba($app-text-purple, 0.1); - } - &-warning, &-service { - color: $warning; - background-color: rgba($warning, 0.1); - } - &-negative, &-error { - color: $negative; - background-color: rgba($negative, 0.1); - } - &-green-2, &-options { - color: $app-text-green-2; - background-color: rgba($app-text-green-2, 0.1); - } - &-marine, &-interval { - color: $app-text-marine; - background-color: rgba($app-text-grey, 0.1); - } -} -.body--dark .app-chip { - &-accent, &-rule { - background-color: rgba($accent, 0.25); - color: lighten($accent, 25%); - } - &-green, &-entry-points { - background-color: rgba($app-text-green, 0.25); - color: lighten($app-text-green, 25%); - } - &-purple, &-name { - background-color: rgba($app-text-purple, 0.25); - color: lighten($app-text-purple, 25%); - } - &-warning, &-service { - background-color: rgba($warning, 0.25); - color: lighten($warning, 25%); - } - &-negative, &-error { - background-color: rgba($negative, 0.25); - color: lighten($negative, 25%); - } - &-green-2, &-options { - background-color: rgba($app-text-green-2, 0.25); - color: lighten($app-text-green-2, 25%); - } - &-marine, &-interval { - background-color: rgba($app-text-grey, 0.25); - color: lighten($app-text-grey, 25%); - } -} diff --git a/webui/src/hooks/use-fetch-with-pagination.spec.tsx b/webui/src/hooks/use-fetch-with-pagination.spec.tsx new file mode 100644 index 000000000..3ad3c1aed --- /dev/null +++ b/webui/src/hooks/use-fetch-with-pagination.spec.tsx @@ -0,0 +1,195 @@ +import { act, fireEvent, renderHook, waitFor } from '@testing-library/react' +import { http, HttpResponse } from 'msw' +import { SWRConfig } from 'swr' + +import useFetchWithPagination from './use-fetch-with-pagination' + +import { server } from 'mocks/server' +import { renderWithProviders } from 'utils/test' + +const renderRow = (row) => ( +

  • + {row.id} +
  • +) + +const wrapper = ({ children }) => ( + + {children} + +) + +describe('useFetchWithPagination Hook', () => { + it('should fetch 1st page per default', async () => { + server.use( + http.get('/api/http/routers', () => { + return HttpResponse.json([{ id: 1 }], { status: 200 }) + }), + ) + + const { result } = renderHook(() => useFetchWithPagination('/http/routers', { renderRow }), { + wrapper, + }) + + await waitFor(() => { + expect(result.current.pages).not.toBeUndefined() + }) + }) + + it('should work as expected passing rowsPerPage property', async () => { + let perPage + + server.use( + http.get('/api/http/routers', ({ request }) => { + const url = new URL(request.url) + perPage = url.searchParams.get('per_page') + return HttpResponse.json([{ id: 1 }], { status: 200 }) + }), + ) + + const { result } = renderHook(() => useFetchWithPagination('/http/routers', { renderRow, rowsPerPage: 3 }), { + wrapper, + }) + + await waitFor(() => { + expect(result.current.pages).not.toBeUndefined() + }) + + expect(perPage).toBe('3') + }) + + it('should work as expected requesting page 2', async () => { + server.use( + http.get('/api/http/routers', ({ request }) => { + const url = new URL(request.url) + const page = url.searchParams.get('page') + if (page === '2') { + return HttpResponse.json([{ id: 3 }], { + headers: { + 'X-Next-Page': '1', + }, + status: 200, + }) + } + return HttpResponse.json([{ id: 1 }, { id: 2 }], { + headers: { + 'X-Next-Page': '2', + }, + status: 200, + }) + }), + ) + + const TestComponent = () => { + const { pages, pageCount, loadMore, isLoadingMore } = useFetchWithPagination('/http/routers', { + renderLoader: () => null, + renderRow, + rowsPerPage: 2, + }) + + return ( + <> +
      {pages}
    + {isLoadingMore ?
    Loading...
    : } +
    {pageCount}
    + + ) + } + + const { queryAllByTestId, getByTestId, getByText } = renderWithProviders() + + await waitFor(() => { + expect(() => { + getByTestId('loading') + }).toThrow('Unable to find an element by: [data-testid="loading"]') + }) + + act(() => { + fireEvent.click(getByText(/Load More/)) + }) + + await waitFor(() => { + expect(() => { + getByTestId('loading') + }).toThrow('Unable to find an element by: [data-testid="loading"]') + }) + + expect(getByTestId('pageCount').innerHTML).toBe('2') + + const items = await queryAllByTestId('listRow') + expect(items).toHaveLength(3) + }) + + it('should work as expected requesting an empty page', async () => { + server.use( + http.get('/api/http/routers', ({ request }) => { + const url = new URL(request.url) + const page = url.searchParams.get('page') + if (page === '2') { + return HttpResponse.json( + // Response body should be { message: 'invalid request: page: 2, per_page: 4' }, resulting in a type error. + // If I type the response body accordingly, allowing both an array and an object, MSW breaks, so I replaced + // the object with an empty array, and that'd be enough for testing purpose. + [], + { + headers: { + 'X-Next-Page': '1', + }, + status: 200, + }, + ) + } + return HttpResponse.json([{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }], { + headers: { + 'X-Next-Page': '2', + }, + status: 200, + }) + }), + ) + + const TestComponent = () => { + const { pages, pageCount, loadMore, isLoadingMore } = useFetchWithPagination('/http/routers', { + renderLoader: () => null, + renderRow, + rowsPerPage: 4, + }) + + return ( + <> +
      {pages}
    + {isLoadingMore ?
    Loading...
    : } +
    {pageCount}
    + + ) + } + + const { queryAllByTestId, getByTestId, getByText } = renderWithProviders() + + await waitFor(() => { + expect(() => { + getByTestId('loading') + }).toThrow('Unable to find an element by: [data-testid="loading"]') + }) + + act(() => { + fireEvent.click(getByText(/Load More/)) + }) + + await waitFor(() => { + expect(() => { + getByTestId('loading') + }).toThrow('Unable to find an element by: [data-testid="loading"]') + }) + + expect(getByTestId('pageCount').innerHTML).toBe('2') + + const items = await queryAllByTestId('listRow') + expect(items).toHaveLength(4) + }) +}) diff --git a/webui/src/hooks/use-fetch-with-pagination.tsx b/webui/src/hooks/use-fetch-with-pagination.tsx new file mode 100644 index 000000000..83f0a2e6f --- /dev/null +++ b/webui/src/hooks/use-fetch-with-pagination.tsx @@ -0,0 +1,89 @@ +import { AriaTd, AriaTr } from '@traefiklabs/faency' +import { stringify } from 'query-string' +import { ReactNode } from 'react' +import useSWRInfinite, { SWRInfiniteConfiguration } from 'swr/infinite' + +import { fetchPage } from 'libs/fetch' + +export type RenderRowType = (row: Record) => ReactNode + +export type pagesResponseInterface = { + pages: ReactNode + pageCount: number + error?: Error | null + isLoadingMore: boolean + isReachingEnd: boolean + isEmpty: boolean + loadMore: () => void +} +type useFetchWithPaginationType = ( + path: string, + opts: SWRInfiniteConfiguration & { + rowsPerPage?: number + renderRow: RenderRowType + renderLoader?: () => ReactNode + listContextKey?: string + query?: Record + }, +) => pagesResponseInterface + +const useFetchWithPagination: useFetchWithPaginationType = (path, opts) => { + const defaultLoadingFunction = () => ( + + Loading... + + ) + const { rowsPerPage = 10, renderLoader = defaultLoadingFunction, renderRow, query } = opts + + const getKey = ( + pageIndex: number, + previousPageData: { data?: unknown[]; nextPage?: number } | null, + ): string | null => { + if (previousPageData && (!previousPageData.data?.length || previousPageData.nextPage === 1)) return null + + return `${path}?${stringify({ + page: pageIndex + 1, + per_page: rowsPerPage, + ...query, + })}` + } + + const { data: res, error, size, setSize } = useSWRInfinite<{ data?: unknown[]; nextPage?: number }>(getKey, fetchPage) + + const isLoadingInitialData = !res && !error + const isEmpty = !res?.[0]?.data || (Array.isArray(res?.[0]?.data) && res?.[0]?.data.length === 0) + const isLoadingMore = isLoadingInitialData || (size > 0 && res && typeof res[size - 1] === 'undefined') || false + const nextPage = res?.[size - 1]?.nextPage + const isReachingEnd = !nextPage || nextPage === 1 + + const loadMore = (): void => { + if (!isLoadingMore) { + setSize(size + 1) + } + } + + const data = res?.reduce((acc: unknown[], req) => { + if (req.data) { + acc.push(...req.data) + } + return acc + }, [] as unknown[]) + + let pages: ReactNode = null + + if (!error) { + pages = !data ? renderLoader() : (data as Record[]).map(renderRow) + } + + return { + pages, + pageCount: size, + isEmpty, + error, + isLoadingMore, + isReachingEnd, + loadMore, + } +} + +export default useFetchWithPagination diff --git a/webui/src/hooks/use-overview-totals.tsx b/webui/src/hooks/use-overview-totals.tsx new file mode 100644 index 000000000..42d896cf4 --- /dev/null +++ b/webui/src/hooks/use-overview-totals.tsx @@ -0,0 +1,36 @@ +import useSWR from 'swr' + +type TotalsResultItem = { + routers: number + services: number + middlewares?: number +} + +type TotalsResult = { + http: TotalsResultItem + tcp: TotalsResultItem + udp: TotalsResultItem +} + +const useTotals = (): TotalsResult => { + const { data } = useSWR('/overview') + + return { + http: { + routers: data?.http?.routers?.total, + services: data?.http?.services?.total, + middlewares: data?.http?.middlewares?.total, + }, + tcp: { + routers: data?.tcp?.routers?.total, + services: data?.tcp?.services?.total, + middlewares: data?.tcp?.middlewares?.total, + }, + udp: { + routers: data?.udp?.routers?.total, + services: data?.udp?.services?.total, + }, + } +} + +export default useTotals diff --git a/webui/src/hooks/use-previous.tsx b/webui/src/hooks/use-previous.tsx new file mode 100644 index 000000000..946d00805 --- /dev/null +++ b/webui/src/hooks/use-previous.tsx @@ -0,0 +1,13 @@ +import { useEffect, useRef } from 'react' + +function usePrevious(value: T): T | undefined { + const ref = useRef() + + useEffect(() => { + ref.current = value + }, [value]) + + return ref.current +} + +export default usePrevious diff --git a/webui/src/hooks/use-resource-detail.spec.tsx b/webui/src/hooks/use-resource-detail.spec.tsx new file mode 100644 index 000000000..d78ddc89e --- /dev/null +++ b/webui/src/hooks/use-resource-detail.spec.tsx @@ -0,0 +1,60 @@ +import { renderHook, waitFor } from '@testing-library/react' +import { SWRConfig } from 'swr' + +import { useResourceDetail } from './use-resource-detail' + +import fetch from 'libs/fetch' + +describe('useResourceDetail', () => { + it('should fetch information about entrypoints and middlewares', async () => { + const { result } = renderHook(() => useResourceDetail('server-redirect@docker', 'routers'), { + wrapper: ({ children }) => ( + + {children} + + ), + }) + + await waitFor(() => { + expect(result.current.data).not.toBeUndefined() + }) + + const { data } = result.current + expect(data?.name).toBe('server-redirect@docker') + expect(data?.service).toBe('api2_v2-example-beta1') + expect(data?.status).toBe('enabled') + expect(data?.provider).toBe('docker') + expect(data?.rule).toBe('Host(`server`)') + expect(data?.tls).toBeUndefined() + expect(data?.error).toBeUndefined() + expect(data?.middlewares?.length).toBe(1) + expect(data?.middlewares?.[0]).toEqual({ + redirectScheme: { + scheme: 'https', + }, + status: 'enabled', + usedBy: ['server-mtls@docker', 'server-redirect@docker', 'orphan-router@file'], + name: 'redirect@file', + type: 'redirectscheme', + provider: 'file', + }) + expect(data?.hasValidMiddlewares).toBeTrue() + expect(data?.entryPointsData?.length).toBe(1) + expect(data?.entryPointsData?.[0]).toEqual({ + address: ':80', + transport: { + lifeCycle: { graceTimeOut: 10000000000 }, + respondingTimeouts: { idleTimeout: 180000000000 }, + }, + forwardedHeaders: {}, + name: 'web-redirect', + }) + expect(data?.using?.length).toBe(1) + expect(data?.using?.[0]).toEqual('web-redirect') + }) +}) diff --git a/webui/src/hooks/use-resource-detail.tsx b/webui/src/hooks/use-resource-detail.tsx new file mode 100644 index 000000000..df6e38941 --- /dev/null +++ b/webui/src/hooks/use-resource-detail.tsx @@ -0,0 +1,180 @@ +import useSWR from 'swr' + +import fetchMany from 'libs/fetchMany' + +export type EntryPoint = { + name: string + address: string + message?: string +} + +type JSONObject = { + [x: string]: string | number +} +export type ValuesMapType = { + [key: string]: string | number | JSONObject +} + +export type MiddlewareProps = { + [prop: string]: ValuesMapType +} + +export type Middleware = { + name: string + status: 'enabled' | 'disabled' | 'warning' + provider: string + type?: string + plugin?: Record + error?: string[] + routers?: string[] + usedBy?: string[] +} & MiddlewareProps + +type Router = { + name: string + service?: string + status: 'enabled' | 'disabled' | 'warning' + rule?: string + priority?: number + provider: string + tls?: { + options: string + certResolver: string + domains: TlsDomain[] + passthrough: boolean + } + error?: string[] + entryPoints?: string[] + message?: string +} + +type TlsDomain = { + main: string + sans: string[] +} + +export type RouterDetailType = Router & { + middlewares?: Middleware[] + hasValidMiddlewares?: boolean + entryPointsData?: EntryPoint[] + using?: string[] +} + +type Mirror = { + name: string + percent: number +} + +export type ServiceDetailType = { + name: string + status: 'enabled' | 'disabled' | 'warning' + provider: string + type: string + usedBy?: string[] + routers?: Router[] + serverStatus?: { + [server: string]: string + } + mirroring?: { + service: string + mirrors?: Mirror[] + } + loadBalancer?: { + servers?: { url: string }[] + passHostHeader?: boolean + terminationDelay?: number + healthCheck?: { + scheme: string + path: string + port: number + interval: string + timeout: string + hostname: string + headers?: { + [header: string]: string + } + } + } + weighted?: { + services?: { + name: string + weight: number + }[] + } +} + +export type MiddlewareDetailType = Middleware & { + routers?: Router[] +} + +export type ResourceDetailDataType = RouterDetailType & ServiceDetailType & MiddlewareDetailType + +type ResourceDetailType = { + data?: ResourceDetailDataType + error?: Error +} + +export const useResourceDetail = (name: string, resource: string, protocol = 'http'): ResourceDetailType => { + const { data: routeDetail, error } = useSWR(`/${protocol}/${resource}/${name}`) + const { data: entryPoints, error: entryPointsError } = useSWR(() => ['/entrypoints/', routeDetail.using], fetchMany) + const { data: middlewares, error: middlewaresError } = useSWR( + () => [`/${protocol}/middlewares/`, routeDetail.middlewares], + fetchMany, + ) + const { data: routers, error: routersError } = useSWR(() => [`/${protocol}/routers/`, routeDetail.usedBy], fetchMany) + + if (!routeDetail) { + return { error } + } + + const firstError = error || entryPointsError || middlewaresError || routersError + const validMiddlewares = (middlewares as Middleware[] | undefined)?.filter((mw) => !!mw.name) + const hasMiddlewares = validMiddlewares + ? validMiddlewares.length > 0 + : routeDetail.middlewares && routeDetail.middlewares.length > 0 + + if (resource === 'routers') { + return { + data: { + name: routeDetail.name, + service: routeDetail.service, + status: routeDetail.status, + provider: routeDetail.provider, + rule: routeDetail.rule, + tls: routeDetail.tls, + error: routeDetail.error, + middlewares: validMiddlewares, + hasValidMiddlewares: hasMiddlewares, + entryPointsData: entryPoints, + using: routeDetail.using, + }, + error: firstError, + } as ResourceDetailType + } + + if (resource === 'middlewares') { + return { + data: { + ...routeDetail, + routers, + }, + error: firstError, + } as ResourceDetailType + } + + return { + data: { + name: routeDetail.name, + status: routeDetail.status, + provider: routeDetail.provider, + type: routeDetail.type, + loadBalancer: routeDetail.loadBalancer, + mirroring: routeDetail.mirroring, + serverStatus: routeDetail.serverStatus, + usedBy: routeDetail.usedBy, + weighted: routeDetail.weighted, + routers, + }, + error: firstError, + } as ResourceDetailType +} diff --git a/webui/src/hooks/use-theme.ts b/webui/src/hooks/use-theme.ts new file mode 100644 index 000000000..4eccbc911 --- /dev/null +++ b/webui/src/hooks/use-theme.ts @@ -0,0 +1,49 @@ +import { useMemo } from 'react' +import { useLocalStorage } from 'usehooks-ts' + +const SYSTEM = 'system' +const DARK = 'dark' +const LIGHT = 'light' + +type ThemeOptions = 'system' | 'dark' | 'light' +const THEME_OPTIONS: ThemeOptions[] = [SYSTEM, DARK, LIGHT] + +type UseThemeRes = { + selectedTheme: ThemeOptions + appliedTheme: ThemeOptions + setTheme: () => void +} + +export const useTheme = (): UseThemeRes => { + const [selectedTheme, setSelectedTheme] = useLocalStorage('selected-theme', SYSTEM) + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches + + const appliedTheme = useMemo(() => { + if (selectedTheme === SYSTEM) { + if (prefersDark) return DARK + return LIGHT + } + + return selectedTheme + }, [selectedTheme, prefersDark]) + + return { + selectedTheme, + appliedTheme, + setTheme: () => { + setSelectedTheme((curr: ThemeOptions): ThemeOptions => { + const currIdx = THEME_OPTIONS.indexOf(curr) + const nextIdx = currIdx + 1 + if (nextIdx === THEME_OPTIONS.length) return SYSTEM + + return THEME_OPTIONS[nextIdx] + }) + }, + } +} + +export const useIsDarkMode = () => { + const { appliedTheme } = useTheme() + + return appliedTheme === DARK +} diff --git a/webui/src/hooks/use-version.tsx b/webui/src/hooks/use-version.tsx new file mode 100644 index 000000000..a00b97acd --- /dev/null +++ b/webui/src/hooks/use-version.tsx @@ -0,0 +1,13 @@ +import { useMemo } from 'react' +import useSWR from 'swr' + +export default function useVersion() { + const { data: version } = useSWR('/version') + + const showHubButton = useMemo(() => { + if (!version) return false + return !version?.disableDashboardAd + }, [version]) + + return { showHubButton, version } +} diff --git a/webui/src/index.tsx b/webui/src/index.tsx new file mode 100644 index 000000000..a1f1b753d --- /dev/null +++ b/webui/src/index.tsx @@ -0,0 +1,21 @@ +import { createRoot } from 'react-dom/client' + +import App from './App' + +async function enableMocking() { + if (import.meta.env.MODE !== 'development') { + return + } + + const { worker } = await import('./mocks/browser') + + // `worker.start()` returns a Promise that resolves + // once the Service Worker is up and ready to intercept requests. + return worker.start() +} + +enableMocking().then(() => { + const container = document.getElementById('root') + const root = createRoot(container!) + root.render() +}) diff --git a/webui/src/layout/Container.tsx b/webui/src/layout/Container.tsx new file mode 100644 index 000000000..b3330c652 --- /dev/null +++ b/webui/src/layout/Container.tsx @@ -0,0 +1,13 @@ +import { Flex, styled } from '@traefiklabs/faency' + +import breakpoints from 'utils/breakpoints' + +export default styled(Flex, { + flexGrow: 1, + margin: '0 24px', + + [`@media (min-width: ${breakpoints.laptopL})`]: { + maxWidth: `calc(${breakpoints.laptopL} - 96px)`, + margin: '0 auto', + }, +}) diff --git a/webui/src/layout/EmptyPlaceholder.tsx b/webui/src/layout/EmptyPlaceholder.tsx new file mode 100644 index 000000000..e81ace9df --- /dev/null +++ b/webui/src/layout/EmptyPlaceholder.tsx @@ -0,0 +1,9 @@ +import { Flex, Text } from '@traefiklabs/faency' +import { FiAlertTriangle } from 'react-icons/fi' + +export const EmptyPlaceholder = ({ message = 'No data available' }: { message?: string }) => ( + + + {message} + +) diff --git a/webui/src/layout/ErrorFallback.tsx b/webui/src/layout/ErrorFallback.tsx new file mode 100644 index 000000000..f5a591ea9 --- /dev/null +++ b/webui/src/layout/ErrorFallback.tsx @@ -0,0 +1,20 @@ +import { Box, Button, Text } from '@traefiklabs/faency' +import { FallbackProps } from 'react-error-boundary' + +const ErrorFallback = ({ error, resetErrorBoundary }: FallbackProps) => { + return ( + + + Something went wrong: + + + {error.message} + + + + ) +} + +export default ErrorFallback diff --git a/webui/src/layout/ErrorSuspenseWrapper.tsx b/webui/src/layout/ErrorSuspenseWrapper.tsx new file mode 100644 index 000000000..aec0e35cc --- /dev/null +++ b/webui/src/layout/ErrorSuspenseWrapper.tsx @@ -0,0 +1,26 @@ +import { ComponentType, ReactNode, Suspense } from 'react' +import { ErrorBoundary, FallbackProps } from 'react-error-boundary' + +import ErrorFallback from './ErrorFallback' + +type SuspenseWrapperProps = { + suspenseFallback?: ReactNode + errorFallback?: ComponentType + silentFail?: boolean + children?: ReactNode +} + +const ErrorSuspenseWrapper = ({ + errorFallback = ErrorFallback, + suspenseFallback = null, + silentFail = false, + children, +}: SuspenseWrapperProps) => { + return ( + null : errorFallback}> + {children} + + ) +} + +export default ErrorSuspenseWrapper diff --git a/webui/src/layout/Navigation.spec.tsx b/webui/src/layout/Navigation.spec.tsx new file mode 100644 index 000000000..d19ab884a --- /dev/null +++ b/webui/src/layout/Navigation.spec.tsx @@ -0,0 +1,21 @@ +import { SideNav, TopNav } from './Navigation' + +import { renderWithProviders } from 'utils/test' + +describe('Navigation', () => { + it('should render the side navigation bar', async () => { + const { container } = renderWithProviders( {}} />) + + expect(container.innerHTML).toContain('HTTP') + expect(container.innerHTML).toContain('TCP') + expect(container.innerHTML).toContain('UDP') + expect(container.innerHTML).toContain('Plugins') + }) + + it('should render the top navigation bar', async () => { + const { container } = renderWithProviders() + + expect(container.innerHTML).toContain('theme-switcher') + expect(container.innerHTML).toContain('help-menu') + }) +}) diff --git a/webui/src/layout/Navigation.tsx b/webui/src/layout/Navigation.tsx new file mode 100644 index 000000000..778ba3cab --- /dev/null +++ b/webui/src/layout/Navigation.tsx @@ -0,0 +1,357 @@ +import { + Badge, + Box, + Button, + DialogTitle, + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuPortal, + DropdownMenuTrigger, + elevationVariants, + Flex, + Link, + NavigationLink, + SidePanel, + styled, + Text, + Tooltip, + VisuallyHidden, +} from '@traefiklabs/faency' +import { useEffect, useMemo, useState } from 'react' +import { BsChevronDoubleRight, BsChevronDoubleLeft } from 'react-icons/bs' +import { FiBookOpen, FiGithub, FiHelpCircle } from 'react-icons/fi' +import { matchPath, useHref } from 'react-router' +import { useLocation } from 'react-router-dom' +import { useWindowSize } from 'usehooks-ts' + +import Container from './Container' +import { DARK_PRIMARY_COLOR, LIGHT_PRIMARY_COLOR } from './Page' + +import IconButton from 'components/buttons/IconButton' +import Logo from 'components/icons/Logo' +import { PluginsIcon } from 'components/icons/PluginsIcon' +import ThemeSwitcher from 'components/ThemeSwitcher' +import TooltipText from 'components/TooltipText' +import useTotals from 'hooks/use-overview-totals' +import { useIsDarkMode } from 'hooks/use-theme' +import useVersion from 'hooks/use-version' +import { Route, ROUTES } from 'routes' + +export const LAPTOP_BP = 1025 + +const NavigationDrawer = styled(Flex, { + width: '100%', + maxWidth: '100%', + height: 64, + p: 0, + variants: { + elevation: elevationVariants, + }, + defaultVariants: { + elevation: 1, + }, +}) + +const BasicNavigationItem = ({ + route, + count, + isSmallScreen, + isExpanded, +}: { + route: Route + count?: number + isSmallScreen: boolean + isExpanded: boolean +}) => { + const { pathname } = useLocation() + const href = useHref(route.path) + + const isActiveRoute = useMemo(() => { + const mainPath = matchPath(route.path, pathname) + + if (mainPath) return true + + if (route.activeMatches) { + return route.activeMatches.some((path) => matchPath(path, pathname)) + } + }, [pathname, route.activeMatches, route.path]) + + if (isSmallScreen && !isExpanded) { + return ( + {route.label}} side="right"> + + + + + ) + } + + return ( + + {route.label} + {!!count && ( + + {count} + + )} + + ) +} + +export const SideBarPanel = ({ + isOpen, + onOpenChange, +}: { + isOpen: boolean + onOpenChange: (isOpen: boolean) => void +}) => { + const windowSize = useWindowSize() + + return ( + + + side navigation + + onOpenChange(false)} /> + + ) +} + +export const SideNav = ({ + isExpanded, + onSidePanelToggle, + isResponsive = false, +}: { + isExpanded: boolean + onSidePanelToggle: () => void + isResponsive?: boolean +}) => { + const windowSize = useWindowSize() + const { version } = useVersion() + + const { http, tcp, udp } = useTotals() + + const [isSmallScreen, setIsSmallScreen] = useState(false) + + useEffect(() => { + setIsSmallScreen(isResponsive && windowSize.width < LAPTOP_BP) + }, [isExpanded, isResponsive, windowSize.width]) + + const totalValueByPath = useMemo<{ [key: string]: number }>( + () => ({ + '/http/routers': http?.routers, + '/http/services': http?.services, + '/http/middlewares': http?.middlewares as number, + '/tcp/routers': tcp?.routers, + '/tcp/services': tcp?.services, + '/tcp/middlewares': tcp?.middlewares as number, + '/udp/routers': udp?.routers, + '/udp/services': udp?.services, + }), + [http, tcp, udp], + ) + + return ( + div:nth-child(1)': { + marginLeft: 0, + paddingRight: 0, + }, + } + : undefined, + transition: '150ms cubic-bezier(0.22, 1, 0.36, 1)', + '&[data-collapsed="true"]': { + marginLeft: -32, + }, + }} + > + : } + onClick={onSidePanelToggle} + css={{ + display: 'none', + position: 'absolute', + top: 3, + right: isExpanded ? 12 : 4, + color: '$hiContrast', + [`@media (max-width:${LAPTOP_BP}px)`]: { display: 'inherit' }, + p: '$1', + '&:before, &:after': { borderRadius: '10px' }, + height: 16, + }} + /> + + + + {!!version && !isSmallScreen && ( + + )} + + {ROUTES.map((section, index) => ( + + {section.sectionLabel && ( + + {section.sectionLabel} + + )} + {section.items.map((item, idx) => ( + + ))} + + ))} + + } + css={{ + mt: '$3', + whiteSpace: 'nowrap', + }} + href="https://plugins.traefik.io/" + target="_blank" + > + {!isSmallScreen || isExpanded ? 'Plugins' : ''} + + + + + ) +} + +export const TopNav = () => { + const { showHubButton, version } = useVersion() + const isDarkMode = useIsDarkMode() + + const parsedVersion = useMemo(() => { + if (!version?.Version) { + return 'master' + } + if (version.Version === 'dev') { + return 'master' + } + const matches = version.Version.match(/^(v?\d+\.\d+)/) + return matches ? 'v' + matches[1] : 'master' + }, [version]) + + return ( + + {showHubButton && ( + + + + )} + + + + + + + + + + + + + + Documentation + + + + + + + + Github Repository + + + + + + + + + ) +} diff --git a/webui/src/layout/Page.spec.tsx b/webui/src/layout/Page.spec.tsx new file mode 100644 index 000000000..2334cdc31 --- /dev/null +++ b/webui/src/layout/Page.spec.tsx @@ -0,0 +1,10 @@ +import Page from './Page' + +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render an empty page', () => { + const { getByTestId } = renderWithProviders() + expect(getByTestId('Test page')).toBeInTheDocument() + }) +}) diff --git a/webui/src/layout/Page.tsx b/webui/src/layout/Page.tsx new file mode 100644 index 000000000..f11afa091 --- /dev/null +++ b/webui/src/layout/Page.tsx @@ -0,0 +1,70 @@ +import { Flex, globalCss, styled } from '@traefiklabs/faency' +import { ReactNode, useState } from 'react' +import { Helmet } from 'react-helmet-async' + +import Container from './Container' +import { LAPTOP_BP, SideBarPanel, SideNav, TopNav } from './Navigation' + +import { ToastPool } from 'components/ToastPool' +import { ToastProvider } from 'contexts/toasts' + +export const LIGHT_PRIMARY_COLOR = '#217F97' +export const DARK_PRIMARY_COLOR = '#2AA2C1' + +export const globalStyles = globalCss({ + '.light': { + '--colors-primary': LIGHT_PRIMARY_COLOR, + }, + + '.dark': { + '--colors-primary': DARK_PRIMARY_COLOR, + }, + + body: { + backgroundColor: '$contentBg', + m: 0, + }, +}) + +const PageContainer = styled(Container, { + py: '$5', + px: '$5', + m: 0, + '@media (max-width:1440px)': { + maxWidth: '100%', + }, +}) + +export interface Props { + title?: string + children?: ReactNode +} + +const Page = ({ children, title }: Props) => { + const [isSideBarPanelOpen, setIsSideBarPanelOpen] = useState(false) + + return ( + + {globalStyles()} + + {title ? `${title} - ` : ''}Traefik Proxy + + + + setIsSideBarPanelOpen(true)} isResponsive /> + + + + {children} + + + + + + ) +} + +export default Page diff --git a/webui/src/layouts/Default.vue b/webui/src/layouts/Default.vue deleted file mode 100644 index 83b50598a..000000000 --- a/webui/src/layouts/Default.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - diff --git a/webui/src/libs/fetch.ts b/webui/src/libs/fetch.ts new file mode 100644 index 000000000..8a03fd87b --- /dev/null +++ b/webui/src/libs/fetch.ts @@ -0,0 +1,24 @@ +import { BASE_PATH } from './utils' + +export default async function (input: RequestInfo, init?: RequestInit): Promise { + const res = await fetch(`${BASE_PATH}${input}`, init) + if (!res.ok) throw new Error(res.statusText) + return await res.json() +} + +export const fetchPage = async function ( + input: RequestInfo, + init?: RequestInit, +): Promise { + const res = await fetch(`${BASE_PATH}${input}`, init) + + if (!res.ok) throw new Error(res.statusText) + + return res.json().then((data) => { + return { + ...res, + data, + nextPage: parseInt(res.headers.get('X-Next-Page') || '1'), + } + }) +} diff --git a/webui/src/libs/fetchMany.ts b/webui/src/libs/fetchMany.ts new file mode 100644 index 000000000..0771c1932 --- /dev/null +++ b/webui/src/libs/fetchMany.ts @@ -0,0 +1,16 @@ +import { Key } from 'swr' + +import { BASE_PATH } from './utils' + +export default async function (key: Key): Promise { + const [baseUrl, params, init] = key as Array + + if (!params || !Array.isArray(params)) return + + const requests = params.map((param) => { + const apiUrl = `${BASE_PATH}${baseUrl}${param}` + return fetch(apiUrl, init as RequestInit).then((res) => res.json()) + }) + + return await Promise.all(requests) +} diff --git a/webui/src/libs/objectHandlers.ts b/webui/src/libs/objectHandlers.ts new file mode 100644 index 000000000..59c3bcf0c --- /dev/null +++ b/webui/src/libs/objectHandlers.ts @@ -0,0 +1,8 @@ +type ObjectWithMessage = { + message?: string +} + +export const getValidData = (data?: T[]): T[] => + data ? data.filter((item) => !item.message) : [] +export const getErrorData = (data?: T[]): T[] => + data ? data.filter((item) => !!item.message) : [] diff --git a/webui/src/libs/parsers.ts b/webui/src/libs/parsers.ts new file mode 100644 index 000000000..26f2ed107 --- /dev/null +++ b/webui/src/libs/parsers.ts @@ -0,0 +1,14 @@ +import { Middleware } from 'hooks/use-resource-detail' + +export const parseMiddlewareType = (middleware: Middleware): string | undefined => { + if (middleware.plugin) { + const pluginObject = middleware.plugin || {} + const [pluginName] = Object.keys(pluginObject) + + if (pluginName) { + return pluginName + } + } + + return middleware.type +} diff --git a/webui/src/libs/utils.ts b/webui/src/libs/utils.ts new file mode 100644 index 000000000..e149fc1d8 --- /dev/null +++ b/webui/src/libs/utils.ts @@ -0,0 +1,8 @@ +const getBasePath = () => { + const { VITE_APP_BASE_API_URL } = import.meta.env + const basePath = window.APIUrl || VITE_APP_BASE_API_URL || '' + + return basePath.endsWith('/') ? basePath.slice(0, -1) : basePath +} + +export const BASE_PATH = getBasePath() diff --git a/webui/src/mocks/browser.ts b/webui/src/mocks/browser.ts new file mode 100644 index 000000000..49b16dbde --- /dev/null +++ b/webui/src/mocks/browser.ts @@ -0,0 +1,5 @@ +import { setupWorker } from 'msw/browser' + +import { getHandlers } from './handlers' + +export const worker = setupWorker(...getHandlers(false)) diff --git a/webui/src/mocks/data/api-entrypoints.json b/webui/src/mocks/data/api-entrypoints.json new file mode 100644 index 000000000..456477530 --- /dev/null +++ b/webui/src/mocks/data/api-entrypoints.json @@ -0,0 +1,144 @@ +[ + { + "address": ":8080", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "traefik" + }, + { + "address": ":8000", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "web" + }, + { + "address": ":8443", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "web-mtls" + }, + { + "address": ":80", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "web-redirect" + }, + { + "address": ":443", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "web-secured" + }, + { + "address": ":8100", + "transport": { + "lifeCycle": { + "graceTimeOut": 10000000000 + }, + "respondingTimeouts": { + "idleTimeout": 180000000000 + } + }, + "forwardedHeaders": {}, + "name": "web-tcp" + }, + { + "address": ":8002", + "transport": { + "lifeCycle": { + "requestAcceptGraceTimeout": 42000000000, + "graceTimeOut": 42000000000 + }, + "respondingTimeouts": { + "readTimeout": 42000000000, + "writeTimeout": 42000000000, + "idleTimeout": 42000000000 + } + }, + "forwardedHeaders": {}, + "name": "web2" + }, + { + "address": ":8003", + "transport": { + "lifeCycle": { + "requestAcceptGraceTimeout": 42000000000, + "graceTimeOut": 42000000000 + }, + "respondingTimeouts": { + "readTimeout": 42000000000, + "writeTimeout": 42000000000, + "idleTimeout": 42000000000 + } + }, + "forwardedHeaders": {}, + "name": "web3" + }, + { + "address": ":65535/udp", + "transport": { + "lifeCycle": { + "requestAcceptGraceTimeout": 42000000000, + "graceTimeOut": 42000000000 + }, + "respondingTimeouts": { + "readTimeout": 42000000000, + "writeTimeout": 42000000000, + "idleTimeout": 42000000000 + } + }, + "forwardedHeaders": {}, + "name": "a-port-with-a-very-long-name" + }, + { + "address": ":65535/tcp", + "transport": { + "lifeCycle": { + "requestAcceptGraceTimeout": 42000000000, + "graceTimeOut": 42000000000 + }, + "respondingTimeouts": { + "readTimeout": 42000000000, + "writeTimeout": 42000000000, + "idleTimeout": 42000000000 + } + }, + "forwardedHeaders": {}, + "name": "supercalifragilisticexpialidocious" + } +] diff --git a/webui/src/mocks/data/api-http_middlewares.json b/webui/src/mocks/data/api-http_middlewares.json new file mode 100644 index 000000000..a8737d28e --- /dev/null +++ b/webui/src/mocks/data/api-http_middlewares.json @@ -0,0 +1,418 @@ +[ + { + "addPrefix": { + "prefix": "/foo" + }, + "status": "enabled", + "usedBy": ["web@docker"], + "name": "add-foo@docker", + "type": "addprefix", + "provider": "docker" + }, + { + "redirectScheme": { + "scheme": "https" + }, + "status": "enabled", + "usedBy": ["server-mtls@docker", "server-redirect@docker", "orphan-router@file"], + "name": "redirect@file", + "type": "redirectscheme", + "provider": "file" + }, + { + "chain": { + "middlewares": ["whitelist", "simple-auth"] + }, + "status": "enabled", + "name": "secure-chain@file", + "type": "chain", + "provider": "file" + }, + { + "basicAuth": { + "usersFile": ".htpasswd", + "removeHeader": true + }, + "status": "enabled", + "name": "simple-auth@file", + "type": "basicauth", + "provider": "file" + }, + { + "ipWhiteList": { + "sourceRange": ["127.0.0.1/6", "172.8.8.1"], + "ipStrategy": { + "depth": 3, + "excludedIPs": ["172.0.0.1/31"] + } + }, + "status": "enabled", + "name": "whitelist@file", + "type": "ipwhitelist", + "provider": "file" + }, + { + "addPrefix": { + "prefix": "/path", + "aCustomObject": { + "array of arrays": [[1, 2], [3, 4]], + "array of objects": [{ "some": "value" }, { "another": "value" }], + "array of booleans": [true, false, true], + "array of numbers": [10, 100, 1000], + "array of strings": ["value1", "value2"] + } + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware00@docker", + "provider": "docker", + "type": "addprefix" + }, + { + "buffering": { + "maxRequestBodyBytes": 42, + "memRequestBodyBytes": 42, + "maxResponseBodyBytes": 42, + "memResponseBodyBytes": 42, + "retryExpression": "IsNetworkError() && Attempts() < 2", + "oauthIntrospection > clientConfig > url": "https://keycloak.traefiklabs.tech/realms/keycloak-demo/protocol/openid-connect/token/introspect", + "oauthIntrospection > clientConfig > headers > authorization": "Basic UZShXHjj2XcRSL8PZjuVDRqyqJ7ThjaZiSwJMoQeMJ2yHTgRyhAgLmfT4A1PvHGh" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware02@docker", + "provider": "docker", + "type": "buffering" + }, + { + "errors": { + "status": ["500-599", "400-405", "300"], + "service": "service@docker", + "query": "/{status}.html" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware07@docker", + "provider": "docker", + "type": "errors" + }, + { + "inFlightReq": { + "amount": 42, + "sourceCriterion": { + "ipStrategy": { + "depth": 42, + "excludedIPs": ["10.0.0.1", "11.0.0.1", "12.0.0.1", "13.0.0.1"] + }, + "requestHeaderName": "X-Host-IP", + "requestHost": true + } + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware11@docker", + "provider": "docker", + "type": "inflightreq" + }, + { + "redirectScheme": { + "scheme": "https", + "port": "80", + "permanent": true + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware15@docker", + "provider": "docker", + "type": "redirectscheme" + }, + { + "retry": { + "attempts": 42 + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware18@docker", + "provider": "docker", + "type": "retry" + }, + { + "basicAuth": { + "users": ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP4HxwgUir3HP4EsggP/QNo0"], + "usersFile": "/etc/foo/my/file/path/.htpasswd", + "realm": "Hello you are here", + "removeHeader": true, + "headerField": "X-WebAuth-User" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware01@docker", + "provider": "docker", + "type": "basicauth" + }, + { + "chain": { + "middlewares": [ + "middleware01@docker", + "middleware021@docker", + "middleware03@docker", + "middleware06@docker", + "middleware10@docker" + ] + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware03@docker", + "provider": "docker", + "type": "chain" + }, + { + "compress": {}, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware05@docker", + "provider": "docker", + "type": "compress" + }, + { + "digestAuth": { + "users": ["test:traefik:a2688e031edb4be6a3797f3882655c05", "test2:traefik:518845800f9e2bfb1f1f740ec24f074e"], + "usersFile": "/etc/foo/my/file/path/.htpasswd", + "realm": "Hello you are here", + "removeHeader": true, + "headerField": "X-WebAuth-User" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware06@docker", + "provider": "docker", + "type": "digestauth" + }, + { + "forwardAuth": { + "address": "https://authserver.com/auth", + "tls": { + "ca": "path/to/local.crt", + "caOptional": true, + "cert": "path/to/foo.cert", + "key": "path/to/foo.key", + "insecureSkipVerify": true + }, + "trustForwardHeader": true, + "authResponseHeaders": ["X-Auth-User", "X-Secret"] + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware08@docker", + "provider": "docker", + "type": "forwardauth" + }, + { + "passTLSClientCert": { + "pem": true, + "info": { + "notAfter": true, + "notBefore": true, + "sans": true, + "subject": { + "country": true, + "province": true, + "locality": true, + "organization": true, + "commonName": true, + "serialNumber": true, + "domainComponent": true + }, + "issuer": { + "country": true, + "province": true, + "locality": true, + "organization": true, + "commonName": true, + "serialNumber": true, + "domainComponent": true + } + } + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware12@docker", + "provider": "docker", + "type": "passtlsclientcert" + }, + { + "stripPrefix": { + "prefixes": ["/foobar", "/fiibar"] + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware19@docker", + "provider": "docker", + "type": "stripprefix" + }, + { + "stripPrefixRegex": { + "regex": ["^/foo/(.*)", "/b/{regex}/", "/c/{category}/{id:[0-9]+}/"] + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware20@docker", + "provider": "docker", + "type": "stripprefixregex" + }, + { + "redirectRegex": { + "regex": "^http://localhost/(.*)", + "replacement": "http://mydomain/${1}", + "permanent": true + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware14@docker", + "provider": "docker", + "type": "redirectregex" + }, + { + "replacePathRegex": { + "regex": "^/foo/(.*)", + "replacement": "/bar/$1" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware17@docker", + "provider": "docker", + "type": "replacepathregex" + }, + { + "circuitBreaker": { + "expression": "LatencyAtQuantileMS(50.0) > 100" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware04@docker", + "provider": "docker", + "type": "circuitbreaker" + }, + { + "headers": { + "customRequestHeaders": { + "X-Script-Name1": "test", + "X-Script-Name2": "test" + }, + "customResponseHeaders": { + "X-Script-Name1": "test", + "X-Script-Name2": "test" + }, + "accessControlAllowCredentials": true, + "accessControlAllowHeaders": ["origin", "X-Forwarded-For"], + "accessControlAllowMethods": ["GET", "OPTIONS"], + "accessControlAllowOrigin": "origin-list-or-null", + "accessControlExposeHeaders": ["origin", "X-Forwarded-For"], + "accessControlMaxAge": 42, + "addVaryHeader": true, + "allowedHosts": ["foo.com", "bar.com"], + "hostsProxyHeaders": ["X-Forwarded-Host", "X-Foo"], + "sslRedirect": true, + "sslTemporaryRedirect": true, + "sslHost": "ssl.example.com", + "sslProxyHeaders": { + "X-Forwarded-Proto": "https", + "X-Name1": "foobar" + }, + "sslForceHost": true, + "stsSeconds": 42, + "stsIncludeSubdomains": true, + "stsPreload": true, + "forceSTSHeader": true, + "frameDeny": true, + "customFrameOptionsValue": "foobar", + "contentTypeNosniff": true, + "browserXssFilter": true, + "customBrowserXSSValue": "1; report=https://example.com/xss-report", + "contentSecurityPolicy": "default-src 'self'", + "publicKey": "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=5184000; includeSubdomains; report-uri=\"https://www.example.com/hpkp-report\"", + "referrerPolicy": "same-origin", + "featurePolicy": "vibrate 'none';", + "isDevelopment": true + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware09@docker", + "provider": "docker", + "type": "headers" + }, + { + "ipWhiteList": { + "sourceRange": ["127.0.0.1/32", "192.168.1.7"], + "ipStrategy": { + "depth": 42, + "excludedIPs": ["10.0.0.1", "11.0.0.1", "12.0.0.1", "13.0.0.1"] + } + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware10@docker", + "provider": "docker", + "type": "ipwhitelist" + }, + { + "rateLimit": { + "average": 42, + "burst": 42, + "sourceCriterion": { + "ipStrategy": { + "depth": 42, + "excludedIPs": ["10.0.0.1", "11.0.0.1", "12.0.0.1", "13.0.0.1"] + }, + "requestHeaderName": "X_Foo_Host", + "requestHost": true + } + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware13@docker", + "provider": "docker", + "type": "ratelimit" + }, + { + "replacePath": { + "path": "/foobar/goo" + }, + "error": ["message 1", "message 2"], + "status": "enabled", + "usedBy": ["foo@docker", "bar@file"], + "name": "middleware16@docker", + "provider": "docker", + "type": "replacepath" + }, + { + "addPrefix": { + "prefix": "/foo" + }, + "status": "enabled", + "usedBy": ["web@docker"], + "name": "whoami-app-hello-tls-jwt-ef36e528ebdc93bc4f2a-service-middleware", + "type": "whoami-app-hello-tls-jwt-ef36e528ebdc93bc4f2a-service-middleware", + "provider": "docker" + } +] diff --git a/webui/src/mocks/data/api-http_routers.json b/webui/src/mocks/data/api-http_routers.json new file mode 100644 index 000000000..227aa7cc3 --- /dev/null +++ b/webui/src/mocks/data/api-http_routers.json @@ -0,0 +1,171 @@ +[ + { + "service": "jaeger_v2-example-beta1", + "rule": "Host(`jaeger-v2-example-beta1`)", + "status": "enabled", + "name": "jaeger_v2-example-beta1@docker", + "using": [ + "web-secured", + "web" + ], + "priority": 10, + "provider": "docker" + }, + { + "service": "unexistingservice", + "rule": "Path(`somethingreallyunexpectedbutalsoverylongitgetsoutofthecontainermaybe`)", + "error": [ + "the service \"unexistingservice@file\" does not exist", + "the service \"unexistingservicewithaveryveryveryveryveryverylongname@file2\" does not exist and the error message is really long" + ], + "status": "disabled", + "name": "orphan-router@file", + "middlewares": [ + "middleware00@docker", + "middleware01@docker", + "middleware02@docker", + "middleware03@docker", + "middleware04@docker", + "middleware05@docker", + "middleware06@docker", + "middleware07@docker", + "middleware08@docker", + "middleware09@docker", + "middleware10@docker", + "middleware11@docker", + "middleware12@docker", + "middleware13@docker", + "middleware14@docker", + "middleware15@docker", + "middleware16@docker", + "middleware17@docker", + "middleware18@docker", + "middleware19@docker", + "middleware20@docker" + ], + "using": [ + "web-secured", + "web", + "traefik", + "web2", + "web3" + ], + "priority": 30, + "provider": "file" + }, + { + "entryPoints": [ + "web-mtls" + ], + "service": "api3_v2-example-beta1", + "rule": "Host(`server`) \u0026\u0026 Path(`/mtls`)", + "tls": { + "options": "foo@file", + "certResolver": "acme-dns-challenge", + "domains": [ + { + "main": "example.com", + "sans": [ + "foo.example.com", + "bar.example.com" + ] + }, + { + "main": "domain.com", + "sans": [ + "foo.domain.com", + "bar.domain.com" + ] + }, + { + "main": "my.domain.com", + "sans": [ + "foo.my.domain.com", + "bar.my.domain.com" + ] + } + ] + }, + "status": "enabled", + "priority": 42, + "name": "server-mtls@docker", + "provider": "docker", + "using": [ + "web-mtls" + ] + }, + { + "entryPoints": [ + "web-redirect" + ], + "middlewares": [ + "redirect@file" + ], + "service": "api2_v2-example-beta1", + "rule": "Host(`server`)", + "status": "enabled", + "name": "server-redirect@docker", + "using": [ + "web-redirect" + ], + "priority": 9223372036854776000, + "provider": "docker" + }, + { + "entryPoints": [ + "web-secured" + ], + "service": "api2_v2-example-beta1", + "rule": "Host(`server`)", + "tls": {}, + "status": "enabled", + "name": "server-secured@docker", + "using": [ + "web-secured" + ], + "provider": "docker" + }, + { + "service": "traefik_v2-example-beta1", + "rule": "Host(`traefik-v2-example-beta1`)", + "status": "enabled", + "name": "traefik_v2-example-beta1@docker", + "using": [ + "web-secured", + "web" + ], + "provider": "docker" + }, + { + "entryPoints": [ + "web" + ], + "middlewares": [ + "add-foo" + ], + "service": "api_v2-example-beta1", + "rule": "Host(`jorge.dockeree.containous.cloud`)", + "status": "enabled", + "name": "web@docker", + "using": [ + "web" + ], + "provider": "docker" + }, + { + "entryPoints": [ + "web" + ], + "middlewares": [ + "whoami-app-hello-tls-jwt-ef36e528ebdc93bc4f2a-service-middleware" + ], + "service": "whoami-app-hello-tls-jwt-ef36e528ebdc93bc4f2a-service", + "rule": "Host(`jorge.dockeree.containous.cloud`)", + "status": "enabled", + "name": "whoami-app-hello-tls-jwt-ef36e528ebdc93bc4f2a@kubernetescrd", + "using": [ + "web" + ], + "provider": "docker" + } +] diff --git a/webui/src/mocks/data/api-http_services.json b/webui/src/mocks/data/api-http_services.json new file mode 100644 index 000000000..41edc7076 --- /dev/null +++ b/webui/src/mocks/data/api-http_services.json @@ -0,0 +1,245 @@ +[ + { + "loadBalancer": { + "servers": [ + { + "url": "http://10.0.1.12:80" + } + ], + "passHostHeader": true + }, + "status": "enabled", + "usedBy": [ + "server-redirect@docker", + "server-secured@docker" + ], + "serverStatus": { + "http://10.0.1.12:80": "UP" + }, + "name": "api2_v2-example-beta1@docker", + "type": "loadbalancer", + "provider": "docker" + }, + { + "loadBalancer": { + "servers": [ + { + "url": "http://10.0.1.20:80" + }, + { + "url": "http://10.0.1.21:80" + }, + { + "url": "http://10.0.1.22:80" + }, + { + "url": "http://10.0.1.23:80" + }, + { + "url": "http://10.0.1.24:80" + }, + { + "url": "http://10.0.1.25:80" + }, + { + "url": "http://10.0.1.26:80" + }, + { + "url": "http://10.0.1.27:80" + }, + { + "url": "http://10.0.1.28:80" + }, + { + "url": "http://10.0.1.29:80" + }, + { + "url": "http://10.0.1.30:80" + }, + { + "url": "http://10.0.1.31:80" + }, + { + "url": "http://10.0.1.32:80" + }, + { + "url": "http://10.0.1.33:80" + }, + { + "url": "http://10.0.1.34:80" + }, + { + "url": "http://10.0.1.35:80" + } + ], + "passHostHeader": true, + "responseForwarding": { + "flushInterval": "6s" + }, + "stickiness": { + "cookieName": "mycoockie", + "secureCookie": true, + "httpOnlyCookie": true + }, + "healthCheck": { + "scheme": "https", + "path": "/health", + "port": 80, + "interval": "5s", + "timeout": "10s", + "hostname": "domain.com", + "headers": { + "X-Custom-A": "foobar,gi,ji;ji,ok", + "X-Custom-B": "foobar foobar foobar foobar foobar" + } + } + }, + "status": "enabled", + "usedBy": [ + "server-mtls@docker" + ], + "serverStatus": { + "http://10.0.1.20:80": "UP", + "http://10.0.1.21:80": "UP", + "http://10.0.1.22:80": "UP", + "http://10.0.1.23:80": "UP", + "http://10.0.1.24:80": "UP", + "http://10.0.1.25:80": "UP" + }, + "name": "api3_v2-example-beta1@docker", + "type": "loadbalancer", + "provider": "docker" + }, + { + "loadBalancer": { + "servers": [ + { + "url": "http://10.0.1.11:80" + } + ], + "passHostHeader": true + }, + "status": "enabled", + "usedBy": [ + "web@docker" + ], + "serverStatus": { + "http://10.0.1.11:80": "UP" + }, + "name": "api_v2-example-beta1@docker", + "type": "loadbalancer", + "provider": "docker" + }, + { + "loadBalancer": { + "servers": [ + { + "url": "http://10.0.1.20:5775" + } + ], + "passHostHeader": true + }, + "status": "enabled", + "usedBy": [ + "jaeger_v2-example-beta1@docker" + ], + "serverStatus": { + "http://10.0.1.20:5775": "UP" + }, + "name": "jaeger_v2-example-beta1@docker", + "type": "loadbalancer", + "provider": "docker" + }, + { + "loadBalancer": { + "servers": [ + { + "url": "foo" + } + ], + "passHostHeader": false + }, + "status": "enabled", + "name": "orphan-service@file", + "type": "loadbalancer", + "provider": "file" + }, + { + "loadBalancer": { + "servers": [ + { + "url": "http://10.0.1.10:80" + } + ], + "passHostHeader": true + }, + "status": "enabled", + "usedBy": [ + "traefik_v2-example-beta1@docker" + ], + "serverStatus": { + "http://10.0.1.10:80": "UP" + }, + "name": "traefik_v2-example-beta1@docker", + "type": "loadbalancer", + "provider": "docker" + }, + { + "name": "canary1@docker", + "provider": "docker", + "status": "enabled", + "type": "weighted", + "usedBy": [ + "foo@docker" + ], + "weighted": { + "sticky": { + "cookie": { + "httpOnly": true, + "name": "chocolat", + "secure": true + } + } + } + }, + { + "name": "canary2@docker", + "provider": "docker", + "status": "enabled", + "type": "weighted", + "usedBy": [ + "fii@docker" + ], + "weighted": { + "sticky": { + "cookie": {} + } + } + }, + { + "mirroring": { + "mirrors": [ + { + "name": "two@docker", + "percent": 10 + }, + { + "name": "three@docker", + "percent": 15 + }, + { + "name": "four@docker", + "percent": 80 + } + ], + "service": "one@docker" + }, + "name": "mirror@docker", + "provider": "docker", + "status": "enabled", + "type": "mirroring", + "usedBy": [ + "foo@docker" + ] + } +] diff --git a/webui/src/mocks/data/api-overview.json b/webui/src/mocks/data/api-overview.json new file mode 100644 index 000000000..d01f3b403 --- /dev/null +++ b/webui/src/mocks/data/api-overview.json @@ -0,0 +1,73 @@ +{ + "http": { + "routers": { + "total": 126, + "warnings": 42, + "errors": 42 + }, + "services": { + "total": 126, + "warnings": 38, + "errors": 5 + }, + "middlewares": { + "total": 126, + "warnings": 10, + "errors": 15 + } + }, + "tcp": { + "routers": { + "total": 126, + "warnings": 20, + "errors": 32 + }, + "services": { + "total": 126, + "warnings": 8, + "errors": 7 + }, + "middlewares": { + "total": 126, + "warnings": 23, + "errors": 11 + } + }, + "udp": { + "routers": { + "total": 0, + "warnings": 0, + "errors": 0 + }, + "services": { + "total": 0, + "warnings": 0, + "errors": 0 + } + }, + "features": { + "tracing": "Prometheus", + "metrics": "", + "accessLog": true + }, + "providers": [ + "Consul", + "ConsulCatalog", + "Docker", + "ECS", + "etcd", + "File", + "Http", + "Hub", + "Internal", + "Kubernetes", + "KubernetesCRD", + "KubernetesGateway", + "KubernetesIngress", + "Nomad", + "Plugin", + "Redis", + "Swarm", + "ZooKeeper" + ] +} diff --git a/webui/src/mocks/data/api-tcp_middlewares.json b/webui/src/mocks/data/api-tcp_middlewares.json new file mode 100644 index 000000000..be0cd8029 --- /dev/null +++ b/webui/src/mocks/data/api-tcp_middlewares.json @@ -0,0 +1,32 @@ +[ + { + "inFlightConn": { + "amount": 10 + }, + "status": "enabled", + "usedBy": ["tcp-all@docker"], + "name": "test-inflightconn", + "type": "inflightconn", + "provider": "docker" + }, + { + "ipWhiteList": { + "sourceRange": ["127.0.0.1/32", "192.168.1.7"] + }, + "status": "enabled", + "usedBy": ["tcp-all@docker"], + "name": "test-ipwhitelist", + "type": "ipwhitelist", + "provider": "docker" + }, + { + "ipAllowList": { + "sourceRange": ["127.0.0.1/32", "192.168.1.7"] + }, + "status": "enabled", + "usedBy": ["tcp-all@docker"], + "name": "test-ipallowlist", + "type": "ipallowlist", + "provider": "docker" + } +] diff --git a/webui/src/mocks/data/api-tcp_routers.json b/webui/src/mocks/data/api-tcp_routers.json new file mode 100644 index 000000000..f908f66a8 --- /dev/null +++ b/webui/src/mocks/data/api-tcp_routers.json @@ -0,0 +1,18 @@ +[ + { + "entryPoints": [ + "web-tcp" + ], + "service": "tcp-all", + "rule": "HostSNI(`*`)", + "status": "enabled", + "middlewares": ["test-inflightconn", "test-ipwhitelist", "test-ipallowlist"], + "name": "tcp-all@docker", + "using": [ + "web-secured", + "web" + ], + "priority": 10, + "provider": "docker" + } +] diff --git a/webui/src/mocks/data/api-tcp_services.json b/webui/src/mocks/data/api-tcp_services.json new file mode 100644 index 000000000..0912dc1b6 --- /dev/null +++ b/webui/src/mocks/data/api-tcp_services.json @@ -0,0 +1,19 @@ +[ + { + "loadBalancer": { + "terminationDelay": 10, + "servers": [ + { + "address": "10.0.1.14:8080" + } + ] + }, + "status": "enabled", + "usedBy": [ + "tcp-all@docker" + ], + "name": "tcp-all@docker", + "type": "loadbalancer", + "provider": "docker" + } +] diff --git a/webui/src/mocks/data/api-udp_routers.json b/webui/src/mocks/data/api-udp_routers.json new file mode 100644 index 000000000..4135dfc12 --- /dev/null +++ b/webui/src/mocks/data/api-udp_routers.json @@ -0,0 +1,15 @@ +[ + { + "entryPoints": [ + "udp" + ], + "service": "whoami", + "status": "enabled", + "using": [ + "udp" + ], + "name": "to-whoami-a@file", + "priority": 10, + "provider": "file" + } +] diff --git a/webui/src/mocks/data/api-udp_services.json b/webui/src/mocks/data/api-udp_services.json new file mode 100644 index 000000000..5a24ab917 --- /dev/null +++ b/webui/src/mocks/data/api-udp_services.json @@ -0,0 +1,52 @@ +[ + { + "loadBalancer": { + "servers": [ + { + "address": "172.17.0.6:8080" + }, + { + "address": "172.17.0.4:8080" + } + ] + }, + "status": "enabled", + "name": "whoami-a@file", + "provider": "file", + "type": "loadbalancer" + }, + { + "loadBalancer": { + "servers": [ + { + "address": "172.17.0.5:8080" + } + ] + }, + "status": "enabled", + "name": "whoami-b@file", + "provider": "file", + "type": "loadbalancer" + }, + { + "weighted": { + "services": [ + { + "name": "whoami-a", + "weight": 3 + }, + { + "name": "whoami-b", + "weight": 1 + } + ] + }, + "status": "enabled", + "usedBy": [ + "to-whoami-a@file" + ], + "name": "whoami@file", + "provider": "file", + "type": "weighted" + } +] diff --git a/webui/src/mocks/data/api-version.json b/webui/src/mocks/data/api-version.json new file mode 100644 index 000000000..d4577bdbf --- /dev/null +++ b/webui/src/mocks/data/api-version.json @@ -0,0 +1,6 @@ +{ + "Version": "3.4.0", + "Codename": "montdor", + "disableDashboardAd": false, + "startDate": "2025-03-28T14:58:25.8937758+01:00" +} \ No newline at end of file diff --git a/webui/src/mocks/data/ee-api-errors.json b/webui/src/mocks/data/ee-api-errors.json new file mode 100644 index 000000000..682b976f0 --- /dev/null +++ b/webui/src/mocks/data/ee-api-errors.json @@ -0,0 +1,23 @@ +[ + { + "status": "error", + "protocol": "tcp", + "type": "service", + "name": "service-one", + "message": "Error message" + }, + { + "status": "warning", + "protocol": "tcp", + "type": "service", + "name": "service-two", + "message": "Warning message" + }, + { + "status": "error", + "protocol": "http", + "type": "service", + "name": "service-three", + "message": "Error message" + } +] \ No newline at end of file diff --git a/webui/src/mocks/handlers.ts b/webui/src/mocks/handlers.ts new file mode 100644 index 000000000..505506730 --- /dev/null +++ b/webui/src/mocks/handlers.ts @@ -0,0 +1,32 @@ +import { http, passthrough } from 'msw' + +import apiEntrypoints from './data/api-entrypoints.json' +import apiHttpMiddlewares from './data/api-http_middlewares.json' +import apiHttpRouters from './data/api-http_routers.json' +import apiHttpServices from './data/api-http_services.json' +import apiOverview from './data/api-overview.json' +import apiTcpMiddlewares from './data/api-tcp_middlewares.json' +import apiTcpRouters from './data/api-tcp_routers.json' +import apiTcpServices from './data/api-tcp_services.json' +import apiUdpRouters from './data/api-udp_routers.json' +import apiUdpServices from './data/api-udp_services.json' +import apiVersion from './data/api-version.json' +import eeApiErrors from './data/ee-api-errors.json' +import { listHandlers } from './utils' + +export const getHandlers = (noDelay: boolean = false) => [ + ...listHandlers('/api/entrypoints', apiEntrypoints, noDelay, true), + ...listHandlers('/api/errors', eeApiErrors, noDelay), + ...listHandlers('/api/http/middlewares', apiHttpMiddlewares, noDelay), + ...listHandlers('/api/http/routers', apiHttpRouters, noDelay), + ...listHandlers('/api/http/services', apiHttpServices, noDelay), + ...listHandlers('/api/overview', apiOverview, noDelay), + ...listHandlers('/api/tcp/middlewares', apiTcpMiddlewares, noDelay), + ...listHandlers('/api/tcp/routers', apiTcpRouters, noDelay), + ...listHandlers('/api/tcp/services', apiTcpServices, noDelay), + ...listHandlers('/api/udp/routers', apiUdpRouters, noDelay), + ...listHandlers('/api/udp/services', apiUdpServices, noDelay), + ...listHandlers('/api/version', apiVersion, noDelay), + http.get('*.tsx', () => passthrough()), + http.get('/img/*', () => passthrough()), +] diff --git a/webui/src/mocks/server.ts b/webui/src/mocks/server.ts new file mode 100644 index 000000000..ebbd4971e --- /dev/null +++ b/webui/src/mocks/server.ts @@ -0,0 +1,5 @@ +import { setupServer } from 'msw/node' + +import { getHandlers } from './handlers' + +export const server = setupServer(...getHandlers(true)) diff --git a/webui/src/mocks/utils.ts b/webui/src/mocks/utils.ts new file mode 100644 index 000000000..472128e4f --- /dev/null +++ b/webui/src/mocks/utils.ts @@ -0,0 +1,66 @@ +import { chunk, cloneDeep, orderBy } from 'lodash' +import { http, HttpResponse } from 'msw' + +const waitAsync = (noDelay = false) => { + if (noDelay) return Promise.resolve() + let delay = Math.random() + 0.5 + if (delay > 1) delay = 1 + return new Promise((res) => setTimeout(res, delay * 1000)) +} + +interface DataItem { + name: string + status?: string +} + +export const listHandlers = ( + route: string, + data: DataItem[] | Record | null = null, + noDelay: boolean = false, + skipPagination = false, +) => [ + http.get(route, async ({ request }) => { + await waitAsync(noDelay) + const url = new URL(request.url) + const direction = (url.searchParams.get('direction') as 'asc' | 'desc' | null) || 'asc' + const search = url.searchParams.get('search') + const sortBy = url.searchParams.get('sortBy') || 'name' + const status = url.searchParams.get('status') + let results = cloneDeep(data) + if (Array.isArray(results)) { + if (search) results = results.filter((x) => x.name.toLowerCase().includes(search.toLowerCase())) + if (status) results = results.filter((x) => x.status === status) + if (!results.length) return HttpResponse.json([], { headers: { 'X-Next-Page': '1' }, status: 200 }) + + if (sortBy) results = orderBy(results as DataItem[], [sortBy], [direction || 'asc']) + const page = +(url.searchParams.get('page') || 1) + const pageSize = +(url.searchParams.get('per_page') || 10) + const chunks = skipPagination ? [results] : chunk(results, pageSize) + const totalPages = chunks.length + const nextPage = page + 1 <= totalPages ? page + 1 : 1 // 1 means "no more pages". + return HttpResponse.json(chunks[page - 1], { headers: { 'X-Next-Page': nextPage.toString() }, status: 200 }) + } + return HttpResponse.json(results, { status: 200 }) + }), + http.get(`${route}/:name`, async ({ params }) => { + await waitAsync(noDelay) + + if (!Array.isArray(data)) { + return HttpResponse.json({}, { status: 501 }) + } + + const { name } = params + const res = data.find((x) => x.name === name) + if (!res) { + const parts = route.split('/') + const lastPart = parts[parts.length - 1] + return HttpResponse.json( + { + message: `${lastPart.substring(0, lastPart.length - 1)} not found: ${name}`, + }, + { status: 404 }, + ) + } + return HttpResponse.json(res, { status: 200 }) + }), +] diff --git a/webui/src/pages/NotFound.tsx b/webui/src/pages/NotFound.tsx new file mode 100644 index 000000000..51a130c4c --- /dev/null +++ b/webui/src/pages/NotFound.tsx @@ -0,0 +1,24 @@ +import { Box, Button, Flex, H1, Text } from '@traefiklabs/faency' +import { useNavigate } from 'react-router-dom' + +import Page from 'layout/Page' + +export const NotFound = () => { + const navigate = useNavigate() + + return ( + + + +

    404

    +
    + + I'm sorry, nothing around here... + + +
    +
    + ) +} diff --git a/webui/src/pages/_commons/Error404.vue b/webui/src/pages/_commons/Error404.vue deleted file mode 100644 index 67db5cd01..000000000 --- a/webui/src/pages/_commons/Error404.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - diff --git a/webui/src/pages/_commons/MiddlewareDetail.vue b/webui/src/pages/_commons/MiddlewareDetail.vue deleted file mode 100644 index 912e9971f..000000000 --- a/webui/src/pages/_commons/MiddlewareDetail.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - - - diff --git a/webui/src/pages/_commons/RouterDetail.vue b/webui/src/pages/_commons/RouterDetail.vue deleted file mode 100644 index c2bfd317b..000000000 --- a/webui/src/pages/_commons/RouterDetail.vue +++ /dev/null @@ -1,428 +0,0 @@ - - - - - diff --git a/webui/src/pages/_commons/ServiceDetail.vue b/webui/src/pages/_commons/ServiceDetail.vue deleted file mode 100644 index ef925d757..000000000 --- a/webui/src/pages/_commons/ServiceDetail.vue +++ /dev/null @@ -1,353 +0,0 @@ - - - - - diff --git a/webui/src/pages/dashboard/Dashboard.tsx b/webui/src/pages/dashboard/Dashboard.tsx new file mode 100644 index 000000000..9100823eb --- /dev/null +++ b/webui/src/pages/dashboard/Dashboard.tsx @@ -0,0 +1,234 @@ +import { Card, CSS, Flex, Grid, H2, Text } from '@traefiklabs/faency' +import { ReactNode, useMemo } from 'react' +import useSWR from 'swr' + +import ProviderIcon from 'components/icons/providers' +import FeatureCard, { FeatureCardSkeleton } from 'components/resources/FeatureCard' +import ResourceCard from 'components/resources/ResourceCard' +import TraefikResourceStatsCard, { StatsCardSkeleton } from 'components/resources/TraefikResourceStatsCard' +import Page from 'layout/Page' +import { capitalizeFirstLetter } from 'utils/string' + +const RESOURCES = ['routers', 'services', 'middlewares'] + +const SectionContainer = ({ + title, + children, + childrenContainerCss, + css, +}: { + title: string + children: ReactNode + childrenContainerCss?: CSS + css?: CSS +}) => { + return ( + + +

    {title}

    +
    + + {children} + +
    + ) +} + +type ResourceData = { + errors: number + warnings: number + total: number +} + +export const Dashboard = () => { + const { data: entrypoints } = useSWR('/entrypoints') + const { data: overview } = useSWR('/overview') + + const features = useMemo( + () => + overview?.features + ? Object.keys(overview?.features).map((key: string) => { + return { name: key, value: overview.features[key] } + }) + : [], + [overview?.features], + ) + + const hasResources = useMemo(() => { + const filterFn = (x: ResourceData) => !x.errors && !x.total && !x.warnings + return { + http: Object.values(overview?.http || {}).filter(filterFn).length !== 3, + tcp: Object.values(overview?.tcp || {}).filter(filterFn).length !== 3, + udp: Object.values(overview?.udp || {}).filter(filterFn).length !== 2, + } + }, [overview]) + + // @FIXME skeleton not correctly displayed if only using suspense + if (!entrypoints || !overview) { + return + } + + return ( + + + + {entrypoints?.map((i, idx) => ( + + {i.address} + + ))} + + + + {overview?.http && hasResources.http ? ( + RESOURCES.map((i) => ( + + )) + ) : ( + No related objects to show. + )} + + + + {overview?.tcp && hasResources.tcp ? ( + RESOURCES.map((i) => ( + + )) + ) : ( + No related objects to show. + )} + + + + {overview?.udp && hasResources.udp ? ( + RESOURCES.map((i) => ( + + )) + ) : ( + No related objects to show. + )} + + + + {features.length + ? features.map((i, idx) => { + return + }) + : null} + + + + {overview?.providers?.length ? ( + overview.providers.map((p, idx) => ( + + + + {p} + + + )) + ) : ( + No related objects to show. + )} + + + + ) +} + +export const DashboardSkeleton = () => { + return ( + + + + {[...Array(5)].map((_, i) => ( + + ))} + + + + {[...Array(3)].map((_, i) => ( + + ))} + + + + {[...Array(3)].map((_, i) => ( + + ))} + + + + {[...Array(3)].map((_, i) => ( + + ))} + + + + {[...Array(3)].map((_, i) => ( + + ))} + + + + {[...Array(3)].map((_, i) => ( + + ))} + + + + ) +} diff --git a/webui/src/pages/dashboard/Index.vue b/webui/src/pages/dashboard/Index.vue deleted file mode 100644 index 806cb6da0..000000000 --- a/webui/src/pages/dashboard/Index.vue +++ /dev/null @@ -1,386 +0,0 @@ - - - - - diff --git a/webui/src/pages/http/HttpMiddleware.spec.tsx b/webui/src/pages/http/HttpMiddleware.spec.tsx new file mode 100644 index 000000000..d7a7c39bb --- /dev/null +++ b/webui/src/pages/http/HttpMiddleware.spec.tsx @@ -0,0 +1,481 @@ +import { HttpMiddlewareRender } from './HttpMiddleware' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render a simple middleware', () => { + const mockMiddleware = { + addPrefix: { + prefix: '/foo', + }, + status: 'enabled', + usedBy: ['router-test-simple@docker'], + name: 'middleware-simple', + provider: 'docker', + type: 'addprefix', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['middleware-simple'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test-simple@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-simple') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.innerHTML).toContain('addprefix') + expect(middlewareCard.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(middlewareCard.innerHTML).toContain('Success') + expect(middlewareCard.innerHTML).toContain('/foo') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test-simple@docker') + }) + + it('should render a plugin middleware', () => { + const mockMiddleware = { + plugin: { + jwtAuth: {}, + }, + status: 'enabled', + usedBy: ['router-test-plugin@docker'], + name: 'middleware-plugin', + provider: 'docker', + type: 'plugin', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['middleware-plugin'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test-plugin@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-plugin') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.innerHTML).toContain('jwtAuth') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test-plugin@docker') + }) + + it('should render a complex middleware', async () => { + const mockMiddleware = { + name: 'middleware-complex', + type: 'sample-middleware', + status: 'enabled', + provider: 'the-provider', + usedBy: ['router-test-complex@docker'], + redirectScheme: { + scheme: 'redirect-scheme', + }, + addPrefix: { + prefix: 'add-prefix-sample', + }, + basicAuth: { + users: ['user1', 'user2'], + usersFile: 'users/file', + realm: 'realm-sample', + removeHeader: true, + headerField: 'basic-auth-header', + }, + chain: { + middlewares: ['chain-middleware-1', 'chain-middleware-2', 'chain-middleware-3'], + }, + buffering: { + maxRequestBodyBytes: 10000, + memRequestBodyBytes: 10001, + maxResponseBodyBytes: 10002, + memResponseBodyBytes: 10003, + retryExpression: 'buffer-retry-expression', + }, + circuitBreaker: { + expression: 'circuit-breaker', + }, + compress: {}, + error: ['error-sample'], + errors: { + status: ['status-1', 'status-2'], + service: 'errors-service', + query: 'errors-query', + }, + forwardAuth: { + address: 'forward-auth-address', + tls: { + ca: 'tls-ca', + caOptional: true, + cert: 'tls-certificate', + key: 'tls-key', + insecureSkipVerify: true, + }, + trustForwardHeader: true, + authResponseHeaders: ['auth-response-header-1', 'auth-response-header-2'], + }, + headers: { + customRequestHeaders: { + 'req-header-a': 'custom-req-headers-a', + 'req-header-b': 'custom-req-headers-b', + }, + customResponseHeaders: { + 'res-header-a': 'custom-res-headers-a', + 'res-header-b': 'custom-res-headers-b', + }, + accessControlAllowCredentials: true, + accessControlAllowHeaders: ['allowed-header-1', 'allowed-header-2'], + accessControlAllowMethods: ['GET', 'POST', 'PUT'], + accessControlAllowOrigin: 'allowed.origin', + accessControlExposeHeaders: ['exposed-header-1', 'exposed-header-2'], + accessControlMaxAge: 10004, + addVaryHeader: true, + allowedHosts: ['allowed-host-1', 'allowed-host-2'], + hostsProxyHeaders: ['host-proxy-header-a', 'host-proxy-header-b'], + sslRedirect: true, + sslTemporaryRedirect: true, + sslHost: 'ssl.host', + sslProxyHeaders: { + 'proxy-header-a': 'ssl-proxy-header-a', + 'proxy-header-b': 'ssl-proxy-header-b', + }, + sslForceHost: true, + stsSeconds: 10005, + stsIncludeSubdomains: true, + stsPreload: true, + forceSTSHeader: true, + frameDeny: true, + customFrameOptionsValue: 'custom-frame-options', + contentTypeNosniff: true, + browserXssFilter: true, + customBrowserXSSValue: 'custom-xss-value', + contentSecurityPolicy: 'content-security-policy', + publicKey: 'public-key', + referrerPolicy: 'referrer-policy', + featurePolicy: 'feature-policy', + isDevelopment: true, + }, + ipWhiteList: { + sourceRange: ['125.0.0.1', '125.0.0.4'], + ipStrategy: { + depth: 10006, + excludedIPs: ['125.0.0.2', '125.0.0.3'], + }, + }, + inFlightReq: { + amount: 10007, + sourceCriterion: { + ipStrategy: { + depth: 10008, + excludedIPs: ['126.0.0.1', '126.0.0.2'], + }, + requestHeaderName: 'inflight-req-header', + requestHost: true, + }, + }, + rateLimit: { + average: 10009, + burst: 10010, + sourceCriterion: { + ipStrategy: { + depth: 10011, + excludedIPs: ['127.0.0.1', '127.0.0.2'], + }, + requestHeaderName: 'rate-limit-req-header', + requestHost: true, + }, + }, + passTLSClientCert: { + pem: true, + info: { + notAfter: true, + notBefore: true, + sans: true, + subject: { + country: true, + province: true, + locality: true, + organization: true, + commonName: true, + serialNumber: true, + domainComponent: true, + }, + issuer: { + country: true, + province: true, + locality: true, + organization: true, + commonName: true, + serialNumber: true, + domainComponent: true, + }, + }, + }, + redirectRegex: { + regex: '/redirect-from-regex', + replacement: '/redirect-to', + permanent: true, + }, + replacePath: { + path: '/replace-path', + }, + replacePathRegex: { + regex: 'replace-path-regex', + replacement: 'replace-path-replacement', + }, + retry: { + attempts: 10012, + }, + stripPrefix: { + prefixes: ['strip-prefix1', 'strip-prefix2'], + }, + stripPrefixRegex: { + regex: ['strip-prefix-regex1', 'strip-prefix-regex2'], + }, + plugin: { + ldapAuth: { + source: 'plugin-ldap-source', + baseDN: 'plugin-ldap-base-dn', + attribute: 'plugin-ldap-attribute', + searchFilter: 'plugin-ldap-search-filter', + forwardUsername: true, + forwardUsernameHeader: 'plugin-ldap-forward-username-header', + forwardAuthorization: true, + wwwAuthenticateHeader: true, + wwwAuthenticateHeaderRealm: 'plugin-ldap-www-authenticate-realm', + }, + inFlightReq: { + amount: 10013, + sourceCriterion: { + ipStrategy: { + depth: 10014, + excludedIPs: ['128.0.0.1', '128.0.0.2'], + }, + requestHeaderName: 'plugin-inflight-req-header', + requestHost: true, + }, + }, + rateLimit: { + average: 10015, + burst: 10016, + sourceCriterion: { + ipStrategy: { + depth: 10017, + excludedIPs: ['129.0.0.1', '129.0.0.2'], + }, + requestHeaderName: 'plugin-rate-limit-req-header', + requestHost: true, + }, + }, + }, + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['middleware-complex'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test-complex@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-complex') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.innerHTML).toContain('Success') + expect(middlewareCard.innerHTML).toContain('the-provider') + expect(middlewareCard.innerHTML).toContain('redirect-scheme') + expect(middlewareCard.innerHTML).toContain('add-prefix-sample') + expect(middlewareCard.innerHTML).toContain('buffer-retry-expression') + expect(middlewareCard.innerHTML).toContain('circuit-breaker') + expect(middlewareCard.innerHTML).toIncludeMultiple(['replace-path-regex', 'replace-path-replacement']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['/redirect-from-regex', '/redirect-to']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['127.0.0.1', '127.0.0.2', 'rate-limit-req-header']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['126.0.0.1', '126.0.0.2', 'inflight-req-header']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['125.0.0.1', '125.0.0.2', '125.0.0.3', '125.0.0.4']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['ssl.host', 'ssl-proxy-header-a', 'ssl-proxy-header-b']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['host-proxy-header-a', 'host-proxy-header-b']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['allowed-host-1', 'allowed-host-2']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['exposed-header-1', 'exposed-header-2']) + expect(middlewareCard.innerHTML).toContain('allowed.origin') + expect(middlewareCard.innerHTML).toContain('custom-frame-options') + expect(middlewareCard.innerHTML).toContain('content-security-policy') + expect(middlewareCard.innerHTML).toContain('public-key') + expect(middlewareCard.innerHTML).toContain('referrer-policy') + expect(middlewareCard.innerHTML).toContain('feature-policy') + expect(middlewareCard.innerHTML).toIncludeMultiple(['GET', 'POST', 'PUT']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['allowed-header-1', 'allowed-header-2']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['custom-res-headers-a', 'custom-res-headers-b']) + expect(middlewareCard.innerHTML).toIncludeMultiple(['custom-req-headers-a', 'custom-req-headers-b']) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'forward-auth-address', + 'auth-response-header-1', + 'auth-response-header-2', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'error-sample', + 'status-1', + 'status-2', + 'errors-service', + 'errors-query', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'chain-middleware-1', + 'chain-middleware-2', + 'chain-middleware-3', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'user1', + 'user2', + 'users/file', + 'realm-sample', + 'basic-auth-header', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'strip-prefix1', + 'strip-prefix2', + 'strip-prefix-regex1', + 'strip-prefix-regex2', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + '10000', + '10001', + '10002', + '10003', + '10004', + '10005', + '10006', + '10007', + '10008', + '10009', + '10010', + '10011', + '10012', + ]) + expect(middlewareCard.innerHTML).toIncludeMultiple([ + 'plugin-ldap-source', + 'plugin-ldap-base-dn', + 'plugin-ldap-attribute', + 'plugin-ldap-search-filter', + 'plugin-ldap-forward-username-header', + 'plugin-ldap-www-authenticate-realm', + 'plugin-inflight-req-header', + 'plugin-rate-limit-req-header', + '10013', + '10014', + '10015', + '10016', + '10017', + ]) + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test-complex@docker') + }) + + it('should render a plugin middleware with no type', async () => { + const mockMiddleware = { + plugin: { + jwtAuth: { + child: {}, + sibling: { + negativeGrandChild: false, + positiveGrandChild: true, + }, + stringChild: '123', + arrayChild: [1, 2, 3], + }, + }, + status: 'enabled', + name: 'middleware-plugin-no-type', + provider: 'docker', + routers: [], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-plugin-no-type') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.innerHTML).toContain('Success') + expect(middlewareCard.innerHTML).toContain('jwtAuth > child') + expect(middlewareCard.innerHTML).toContain('jwtAuth > sibling > negative Grand Child') + expect(middlewareCard.innerHTML).toContain('jwtAuth > sibling > positive Grand Child') + expect(middlewareCard.innerHTML).toContain('jwtAuth > string Child') + expect(middlewareCard.innerHTML).toContain('jwtAuth > array Child') + + const childSpans = Array.from(middlewareCard.querySelectorAll('span')).filter((span) => + ['0', '1', '2', '3', '123'].includes(span.innerHTML), + ) + expect(childSpans.length).toBe(7) + }) +}) diff --git a/webui/src/pages/http/HttpMiddleware.tsx b/webui/src/pages/http/HttpMiddleware.tsx new file mode 100644 index 000000000..4b2fe7e2a --- /dev/null +++ b/webui/src/pages/http/HttpMiddleware.tsx @@ -0,0 +1,73 @@ +import { Box, Card, H1, Skeleton, styled, Text } from '@traefiklabs/faency' +import { useParams } from 'react-router-dom' + +import { DetailSectionSkeleton } from 'components/resources/DetailSections' +import { RenderMiddleware } from 'components/resources/MiddlewarePanel' +import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection' +import { ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { NotFound } from 'pages/NotFound' +import breakpoints from 'utils/breakpoints' + +const MiddlewareGrid = styled(Box, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(400px, 1fr))', + + [`@media (max-width: ${breakpoints.tablet})`]: { + gridTemplateColumns: '1fr', + }, +}) + +type HttpMiddlewareRenderProps = { + data?: ResourceDetailDataType + error?: Error | null + name: string +} + +export const HttpMiddlewareRender = ({ data, error, name }: HttpMiddlewareRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Middleware right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + +

    {data.name}

    + + + + + + +
    + ) +} + +export const HttpMiddleware = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'middlewares') + return +} + +export default HttpMiddleware diff --git a/webui/src/pages/http/HttpMiddlewares.spec.tsx b/webui/src/pages/http/HttpMiddlewares.spec.tsx new file mode 100644 index 000000000..1f4ce2607 --- /dev/null +++ b/webui/src/pages/http/HttpMiddlewares.spec.tsx @@ -0,0 +1,129 @@ +import { HttpMiddlewares as HttpMiddlewaresPage, HttpMiddlewaresRender, makeRowRender } from './HttpMiddlewares' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the middleware list', () => { + const pages = [ + { + addPrefix: { prefix: '/foo' }, + status: 'enabled', + usedBy: ['web@docker'], + name: 'add-foo@docker', + provider: 'docker', + type: 'addprefix', + }, + { + addPrefix: { prefix: '/path' }, + error: ['message 1', 'message 2'], + status: 'disabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware00@docker', + provider: 'docker', + type: 'addprefix', + }, + { + basicAuth: { + users: ['test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/', 'test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0'], + usersFile: '/etc/foo/my/file/path/.htpasswd', + realm: 'Hello you are here', + removeHeader: true, + headerField: 'X-WebAuth-User', + }, + error: ['message 1', 'message 2'], + status: 'enabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware01@docker', + provider: 'docker', + type: 'basicauth', + }, + { + buffering: { + maxRequestBodyBytes: 42, + memRequestBodyBytes: 42, + maxResponseBodyBytes: 42, + memResponseBodyBytes: 42, + retryExpression: 'IsNetworkError() \u0026\u0026 Attempts() \u003c 2', + }, + error: ['message 1', 'message 2'], + status: 'enabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware02@docker', + provider: 'docker', + type: 'buffering', + }, + { + chain: { + middlewares: [ + 'middleware01@docker', + 'middleware021@docker', + 'middleware03@docker', + 'middleware06@docker', + 'middleware10@docker', + ], + }, + error: ['message 1', 'message 2'], + status: 'enabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware03@docker', + provider: 'docker', + type: 'chain', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('HTTP Middlewares page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(5) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('add-foo@docker') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('addprefix') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('middleware00@docker') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('addprefix') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('middleware01@docker') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('basicauth') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('middleware02@docker') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('buffering') + expect(tbody.querySelectorAll('a[role="row"]')[3].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[4].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[4].innerHTML).toContain('middleware03@docker') + expect(tbody.querySelectorAll('a[role="row"]')[4].innerHTML).toContain('chain') + expect(tbody.querySelectorAll('a[role="row"]')[4].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/http/HttpMiddlewares.tsx b/webui/src/pages/http/HttpMiddlewares.tsx new file mode 100644 index 000000000..f61a4ed6b --- /dev/null +++ b/webui/src/pages/http/HttpMiddlewares.tsx @@ -0,0 +1,125 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' +import { parseMiddlewareType } from 'libs/parsers' + +export const makeRowRender = (): RenderRowType => { + const HttpMiddlewaresRenderRow = (row) => { + const middlewareType = parseMiddlewareType(row) + + return ( + + + + + + + + + + + + + + + + + + + + + + + ) + } + return HttpMiddlewaresRenderRow +} + +export const HttpMiddlewaresRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const HttpMiddlewares = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/http/middlewares', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/http/HttpRouter.spec.tsx b/webui/src/pages/http/HttpRouter.spec.tsx new file mode 100644 index 000000000..a7f1e3ad7 --- /dev/null +++ b/webui/src/pages/http/HttpRouter.spec.tsx @@ -0,0 +1,121 @@ +import { HttpRouterRender } from './HttpRouter' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import apiEntrypoints from 'mocks/data/api-entrypoints.json' +import apiHttpMiddlewares from 'mocks/data/api-http_middlewares.json' +import apiHttpRouters from 'mocks/data/api-http_routers.json' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render the router details', async () => { + const router = apiHttpRouters.find((x) => x.name === 'orphan-router@file') + const mockData = { + ...router!, + middlewares: apiHttpMiddlewares.filter((x) => router?.middlewares?.includes(x.name)), + hasValidMiddlewares: true, + entryPointsData: apiEntrypoints.filter((x) => router?.using?.includes(x.name)), + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const routerStructure = getByTestId('router-structure') + expect(routerStructure.innerHTML).toContain(':80') + expect(routerStructure.innerHTML).toContain(':443') + expect(routerStructure.innerHTML).toContain(':8080') + expect(routerStructure.innerHTML).toContain(':8002') + expect(routerStructure.innerHTML).toContain(':8003') + expect(routerStructure.innerHTML).toContain('orphan-router@file') + expect(routerStructure.innerHTML).toContain('middleware00') + expect(routerStructure.innerHTML).toContain('middleware01') + expect(routerStructure.innerHTML).toContain('middleware02') + expect(routerStructure.innerHTML).toContain('middleware03') + expect(routerStructure.innerHTML).toContain('middleware04') + expect(routerStructure.innerHTML).toContain('middleware05') + expect(routerStructure.innerHTML).toContain('middleware06') + expect(routerStructure.innerHTML).toContain('middleware07') + expect(routerStructure.innerHTML).toContain('middleware08') + expect(routerStructure.innerHTML).toContain('middleware09') + expect(routerStructure.innerHTML).toContain('middleware10') + expect(routerStructure.innerHTML).toContain('middleware11') + expect(routerStructure.innerHTML).toContain('middleware12') + expect(routerStructure.innerHTML).toContain('middleware13') + expect(routerStructure.innerHTML).toContain('middleware14') + expect(routerStructure.innerHTML).toContain('middleware15') + expect(routerStructure.innerHTML).toContain('middleware16') + expect(routerStructure.innerHTML).toContain('middleware17') + expect(routerStructure.innerHTML).toContain('middleware18') + expect(routerStructure.innerHTML).toContain('middleware19') + expect(routerStructure.innerHTML).toContain('middleware20') + expect(routerStructure.innerHTML).toContain('unexistingservice') + expect(routerStructure.innerHTML).toContain('HTTP Router') + expect(routerStructure.innerHTML).not.toContain('TCP Router') + + const routerDetailsSection = getByTestId('router-detail') + + const routerDetailsPanel = routerDetailsSection.querySelector(':scope > div:nth-child(1)') + expect(routerDetailsPanel?.innerHTML).toContain('orphan-router@file') + expect(routerDetailsPanel?.innerHTML).toContain('Error') + expect(routerDetailsPanel?.querySelector('svg[data-testid="file"]')).toBeTruthy() + expect(routerDetailsPanel?.innerHTML).toContain( + 'Path(`somethingreallyunexpectedbutalsoverylongitgetsoutofthecontainermaybe`)', + ) + expect(routerDetailsPanel?.innerHTML).toContain('unexistingservice') + expect(routerDetailsPanel?.innerHTML).toContain('the service "unexistingservice@file" does not exist') + + const middlewaresPanel = routerDetailsSection.querySelector(':scope > div:nth-child(3)') + const providers = Array.from(middlewaresPanel?.querySelectorAll('svg[data-testid="docker"]') || []) + expect(middlewaresPanel?.innerHTML).toContain('middleware00') + expect(middlewaresPanel?.innerHTML).toContain('middleware01') + expect(middlewaresPanel?.innerHTML).toContain('middleware02') + expect(middlewaresPanel?.innerHTML).toContain('middleware03') + expect(middlewaresPanel?.innerHTML).toContain('middleware04') + expect(middlewaresPanel?.innerHTML).toContain('middleware05') + expect(middlewaresPanel?.innerHTML).toContain('middleware06') + expect(middlewaresPanel?.innerHTML).toContain('middleware07') + expect(middlewaresPanel?.innerHTML).toContain('middleware08') + expect(middlewaresPanel?.innerHTML).toContain('middleware09') + expect(middlewaresPanel?.innerHTML).toContain('middleware10') + expect(middlewaresPanel?.innerHTML).toContain('middleware11') + expect(middlewaresPanel?.innerHTML).toContain('middleware12') + expect(middlewaresPanel?.innerHTML).toContain('middleware13') + expect(middlewaresPanel?.innerHTML).toContain('middleware14') + expect(middlewaresPanel?.innerHTML).toContain('middleware15') + expect(middlewaresPanel?.innerHTML).toContain('middleware16') + expect(middlewaresPanel?.innerHTML).toContain('middleware17') + expect(middlewaresPanel?.innerHTML).toContain('middleware18') + expect(middlewaresPanel?.innerHTML).toContain('middleware19') + expect(middlewaresPanel?.innerHTML).toContain('middleware20') + expect(middlewaresPanel?.innerHTML).toContain('Success') + expect(providers.length).toBe(21) + + expect(getByTestId('/http/middlewares/middleware00@docker')).toBeInTheDocument() + + expect(getByTestId('/http/middlewares/middleware01@docker')).toBeInTheDocument() + + expect(getByTestId('/http/services/unexistingservice@file')).toBeInTheDocument() + }) +}) diff --git a/webui/src/pages/http/HttpRouter.tsx b/webui/src/pages/http/HttpRouter.tsx new file mode 100644 index 000000000..dbb493e4d --- /dev/null +++ b/webui/src/pages/http/HttpRouter.tsx @@ -0,0 +1,152 @@ +import { Flex, styled, Text } from '@traefiklabs/faency' +import { useContext, useEffect, useMemo } from 'react' +import { FiGlobe, FiLayers, FiLogIn, FiZap } from 'react-icons/fi' +import { useParams } from 'react-router-dom' + +import { CardListSection, DetailSectionSkeleton } from 'components/resources/DetailSections' +import MiddlewarePanel from 'components/resources/MiddlewarePanel' +import RouterPanel from 'components/resources/RouterPanel' +import TlsPanel from 'components/resources/TlsPanel' +import { ToastContext } from 'contexts/toasts' +import { EntryPoint, ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { getErrorData, getValidData } from 'libs/objectHandlers' +import { parseMiddlewareType } from 'libs/parsers' +import { NotFound } from 'pages/NotFound' + +const CardListColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(4, 1fr)', + marginBottom: '48px', +}) + +type DetailProps = { + data: ResourceDetailDataType + protocol?: string +} + +export const RouterStructure = ({ data, protocol = 'http' }: DetailProps) => { + const { addToast } = useContext(ToastContext) + const entrypoints = useMemo(() => getValidData(data.entryPointsData), [data?.entryPointsData]) + const entrypointsError = useMemo(() => getErrorData(data.entryPointsData), [data?.entryPointsData]) + + const serviceSlug = data.service?.includes('@') + ? data.service + : `${data.service ?? 'unknown'}@${data.provider ?? 'unknown'}` + + useEffect(() => { + entrypointsError?.map((error) => + addToast({ + message: error.message, + severity: 'error', + }), + ) + }, [addToast, entrypointsError]) + + return ( + + {entrypoints.length > 0 && ( + } + title="Entrypoints" + cards={data.entryPointsData?.map((ep: EntryPoint) => ({ + title: ep.name, + description: ep.address, + }))} + /> + )} + } + title={`${protocol.toUpperCase()} Router`} + cards={[{ title: 'router', description: data.name, focus: true }]} + /> + {data.hasValidMiddlewares && ( + } + title={`${protocol.toUpperCase()} Middlewares`} + cards={data.middlewares?.map((mw) => ({ + title: parseMiddlewareType(mw) ?? 'middleware', + description: mw.name, + link: `/${protocol}/middlewares/${mw.name}`, + }))} + /> + )} + } + title="Service" + cards={[{ title: 'service', description: data.service, link: `/${protocol}/services/${serviceSlug}` }]} + /> + + ) +} + +const SpacedColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))', + gridGap: '16px', +}) + +const RouterDetail = ({ data }: DetailProps) => ( + + + + + +) + +type HttpRouterRenderProps = { + data?: ResourceDetailDataType + error?: Error | null + name: string +} + +export const HttpRouterRender = ({ data, error, name }: HttpRouterRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Router right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + + + + + ) +} + +export const HttpRouter = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'routers') + return +} + +export default HttpRouter diff --git a/webui/src/pages/http/HttpRouters.spec.tsx b/webui/src/pages/http/HttpRouters.spec.tsx new file mode 100644 index 000000000..bdddd21b4 --- /dev/null +++ b/webui/src/pages/http/HttpRouters.spec.tsx @@ -0,0 +1,109 @@ +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { HttpRouters as HttpRoutersPage, HttpRoutersRender, makeRowRender } from 'pages/http/HttpRouters' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the routers list', () => { + const pages = [ + { + service: 'jaeger_v2-example-beta1', + rule: 'Host(`jaeger-v2-example-beta1`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'jaeger_v2-example-beta1@docker', + provider: 'docker', + }, + { + middlewares: ['middleware00@docker', 'middleware01@docker', 'middleware02@docker'], + service: 'unexistingservice', + rule: 'Path(`somethingreallyunexpected`)', + error: ['the service "unexistingservice@file" does not exist'], + status: 'disabled', + using: ['web-secured', 'web'], + name: 'orphan-router@file', + provider: 'file', + }, + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + status: 'enabled', + using: ['web-redirect'], + name: 'server-redirect@docker', + provider: 'docker', + }, + { + entryPoints: ['web-secured'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-secured'], + name: 'server-secured@docker', + provider: 'docker', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('HTTP Routers page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(4) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).not.toContain('testid="tls-on"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('Host(`jaeger-v2-example-beta1`)') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toIncludeMultiple(['web-secured', 'web']) + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('jaeger_v2-example-beta1@docker') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('jaeger_v2-example-beta1') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).not.toContain('testid="tls-on"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('Path(`somethingreallyunexpected`)') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toIncludeMultiple(['web-secured', 'web']) + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('orphan-router@file') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('unexistingservice') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="file"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).not.toContain('testid="tls-on"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('Host(`server`)') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toIncludeMultiple(['web-redirect']) + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('server-redirect@docker') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('api2_v2-example-beta1') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('testid="tls-on"') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('Host(`server`)') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toIncludeMultiple(['web-secured']) + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('server-secured@docker') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('api2_v2-example-beta1') + expect(tbody.querySelectorAll('a[role="row"]')[3].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/http/HttpRouters.tsx b/webui/src/pages/http/HttpRouters.tsx new file mode 100644 index 000000000..d646b8f42 --- /dev/null +++ b/webui/src/pages/http/HttpRouters.tsx @@ -0,0 +1,146 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex } from '@traefiklabs/faency' +import { useMemo } from 'react' +import { FiShield } from 'react-icons/fi' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { Chips } from 'components/resources/DetailSections' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (protocol = 'http'): RenderRowType => { + const HttpRoutersRenderRow = (row) => ( + + + + + + + + + {protocol !== 'udp' && ( + <> + + {row.tls && ( + + + + + + )} + + + + + + )} + {row.using && row.using.length > 0 && } + + + + + + + + + + + + + + + + + + ) + return HttpRoutersRenderRow +} + +export const HttpRoutersRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const HttpRouters = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/http/routers', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/http/HttpService.spec.tsx b/webui/src/pages/http/HttpService.spec.tsx new file mode 100644 index 000000000..781d43099 --- /dev/null +++ b/webui/src/pages/http/HttpService.spec.tsx @@ -0,0 +1,220 @@ +import { HttpServiceRender } from './HttpService' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render a service with no health check or mirrors', async () => { + const mockData = { + loadBalancer: { + servers: [ + { + url: 'http://10.0.1.12:80', + }, + ], + passHostHeader: true, + }, + status: 'enabled', + usedBy: ['router-test1@docker', 'router-test2@docker'], + serverStatus: { + 'http://10.0.1.12:80': 'UP', + }, + name: 'service-test1', + provider: 'docker', + type: 'loadbalancer', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test1@docker', + provider: 'docker', + }, + { + entryPoints: ['web-secured'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-secured'], + name: 'router-test2@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'service-test1') + expect(titleTags.length).toBe(1) + + const serviceDetails = getByTestId('service-details') + expect(serviceDetails.innerHTML).toContain('Type') + expect(serviceDetails.innerHTML).toContain('loadbalancer') + expect(serviceDetails.innerHTML).toContain('Provider') + expect(serviceDetails.innerHTML).toContain('docker') + expect(serviceDetails.innerHTML).toContain('Status') + expect(serviceDetails.innerHTML).toContain('Success') + expect(serviceDetails.innerHTML).toContain('Pass Host Header') + expect(serviceDetails.innerHTML).toContain('True') + + const serversList = getByTestId('servers-list') + expect(serversList.childNodes.length).toBe(1) + expect(serversList.innerHTML).toContain('http://10.0.1.12:80') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(2) + expect(tableBody?.innerHTML).toContain('router-test1@docker') + expect(tableBody?.innerHTML).toContain('router-test2@docker') + + expect(() => { + getByTestId('health-check') + }).toThrow('Unable to find an element by: [data-testid="health-check"]') + + expect(() => { + getByTestId('mirror-services') + }).toThrow('Unable to find an element by: [data-testid="mirror-services"]') + }) + + it('should render a service with health check', async () => { + const mockData = { + loadBalancer: { + servers: [ + { + url: 'http://10.0.1.12:81', + }, + ], + passHostHeader: true, + healthCheck: { + scheme: 'https', + path: '/health', + port: 80, + interval: '5s', + timeout: '10s', + hostname: 'domain.com', + headers: { + 'X-Custom-A': 'foobar,gi,ji;ji,ok', + 'X-Custom-B': 'foobar foobar foobar foobar foobar', + }, + }, + }, + status: 'enabled', + usedBy: [], + serverStatus: { + 'http://10.0.1.12:81': 'UP', + }, + name: 'service-test2', + provider: 'docker', + type: 'loadbalancer', + routers: [], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const healthCheck = getByTestId('health-check') + expect(healthCheck.innerHTML).toContain('Scheme') + expect(healthCheck.innerHTML).toContain('https') + expect(healthCheck.innerHTML).toContain('Interval') + expect(healthCheck.innerHTML).toContain('5s') + expect(healthCheck.innerHTML).toContain('Path') + expect(healthCheck.innerHTML).toContain('/health') + expect(healthCheck.innerHTML).toContain('Timeout') + expect(healthCheck.innerHTML).toContain('10s') + expect(healthCheck.innerHTML).toContain('Port') + expect(healthCheck.innerHTML).toContain('80') + expect(healthCheck.innerHTML).toContain('Hostname') + expect(healthCheck.innerHTML).toContain('domain.com') + expect(healthCheck.innerHTML).toContain('Headers') + expect(healthCheck.innerHTML).toContain('X-Custom-A: foobar,gi,ji;ji,ok') + expect(healthCheck.innerHTML).toContain('X-Custom-B: foobar foobar foobar foobar foobar') + + expect(() => { + getByTestId('mirror-services') + }).toThrow('Unable to find an element by: [data-testid="mirror-services"]') + }) + + it('should render a service with mirror services', async () => { + const mockData = { + mirroring: { + service: 'one@docker', + mirrors: [ + { + name: 'two@docker', + percent: 10, + }, + { + name: 'three@docker', + percent: 15, + }, + { + name: 'four@docker', + percent: 80, + }, + ], + }, + status: 'enabled', + usedBy: [], + name: 'service-test3', + provider: 'docker', + type: 'mirroring', + routers: [], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const mirrorServices = getByTestId('mirror-services') + const providers = Array.from(mirrorServices.querySelectorAll('svg[data-testid="docker"]')) + expect(mirrorServices.childNodes.length).toBe(3) + expect(mirrorServices.innerHTML).toContain('two@docker') + expect(mirrorServices.innerHTML).toContain('three@docker') + expect(mirrorServices.innerHTML).toContain('four@docker') + expect(mirrorServices.innerHTML).toContain('10') + expect(mirrorServices.innerHTML).toContain('15') + expect(mirrorServices.innerHTML).toContain('80') + expect(providers.length).toBe(3) + + expect(() => { + getByTestId('health-check') + }).toThrow('Unable to find an element by: [data-testid="health-check"]') + + expect(() => { + getByTestId('servers-list') + }).toThrow('Unable to find an element by: [data-testid="servers-list"]') + }) +}) diff --git a/webui/src/pages/http/HttpService.tsx b/webui/src/pages/http/HttpService.tsx new file mode 100644 index 000000000..4e74c552f --- /dev/null +++ b/webui/src/pages/http/HttpService.tsx @@ -0,0 +1,314 @@ +import { Badge, Box, Flex, H1, Skeleton, styled, Text } from '@traefiklabs/faency' +import { useMemo } from 'react' +import { FiGlobe, FiInfo, FiShield } from 'react-icons/fi' +import { useParams } from 'react-router-dom' + +import ProviderIcon from 'components/icons/providers' +import { + BooleanState, + Chips, + DetailSection, + DetailSectionSkeleton, + ItemBlock, + ItemTitle, + LayoutTwoCols, + ProviderName, +} from 'components/resources/DetailSections' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection' +import Tooltip from 'components/Tooltip' +import { ResourceDetailDataType, ServiceDetailType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { NotFound } from 'pages/NotFound' + +type DetailProps = { + data: ServiceDetailType + protocol?: string +} + +const SpacedColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))', + gridGap: '16px', +}) + +const ServicesGrid = styled(Box, { + display: 'grid', + gridTemplateColumns: '2fr 1fr 1fr', + alignItems: 'center', + padding: '$3 $5', + borderBottom: '1px solid $tableRowBorder', +}) + +const ServersGrid = styled(Box, { + display: 'grid', + alignItems: 'center', + padding: '$3 $5', + borderBottom: '1px solid $tableRowBorder', +}) + +const MirrorsGrid = styled(Box, { + display: 'grid', + gridTemplateColumns: '2fr 1fr 1fr', + alignItems: 'center', + padding: '$3 $5', + borderBottom: '1px solid $tableRowBorder', + + '> *:not(:first-child)': { + justifySelf: 'flex-end', + }, +}) + +const GridTitle = styled(Text, { + fontSize: '14px', + fontWeight: 700, + color: 'hsl(0, 0%, 56%)', +}) + +type Server = { + url: string + address?: string +} + +type ServerStatus = { + [server: string]: string +} + +function getServerStatusList(data: ServiceDetailType): ServerStatus { + const serversList: ServerStatus = {} + + data.loadBalancer?.servers?.forEach((server: Server) => { + serversList[server.address || server.url] = 'DOWN' + }) + + if (data.serverStatus) { + Object.entries(data.serverStatus).forEach(([server, status]) => { + serversList[server] = status + }) + } + + return serversList +} + +export const ServicePanels = ({ data, protocol = '' }: DetailProps) => { + const serversList = getServerStatusList(data) + const getProviderFromName = (serviceName: string): string => { + const [, provider] = serviceName.split('@') + return provider || data.provider + } + const providerName = useMemo(() => { + return data.provider + }, [data.provider]) + + return ( + + } title="Service Details"> + + {data.type && ( + + {data.type} + + )} + {data.provider && ( + + + {providerName} + + )} + + {data.status && ( + + + + )} + {data.mirroring && data.mirroring.service && ( + + {data.mirroring.service} + + )} + {data.loadBalancer && ( + <> + {data.loadBalancer.passHostHeader && ( + + + + )} + {data.loadBalancer.terminationDelay && ( + + {`${data.loadBalancer.terminationDelay} ms`} + + )} + + )} + + {data.loadBalancer?.healthCheck && ( + } title="Health Check"> + + + {data.loadBalancer.healthCheck.scheme && ( + + {data.loadBalancer.healthCheck.scheme} + + )} + {data.loadBalancer.healthCheck.interval && ( + + {data.loadBalancer.healthCheck.interval} + + )} + + + {data.loadBalancer.healthCheck.path && ( + + + {data.loadBalancer.healthCheck.path} + + + )} + {data.loadBalancer.healthCheck.timeout && ( + + {data.loadBalancer.healthCheck.timeout} + + )} + + + {data.loadBalancer.healthCheck.port && ( + + {data.loadBalancer.healthCheck.port} + + )} + {data.loadBalancer.healthCheck.hostname && ( + + + {data.loadBalancer.healthCheck.hostname} + + + )} + + {data.loadBalancer.healthCheck.headers && ( + + entry.join(': '))} + /> + + )} + + + )} + {!!data?.weighted?.services?.length && ( + } title="Services" noPadding> + <> + + Name + Weight + Provider + + + {data.weighted.services.map((service) => ( + + {service.name} + {service.weight} + + + + + ))} + + + + )} + {Object.keys(serversList).length > 0 && ( + } title="Servers" noPadding> + <> + + {protocol === 'http' && Status} + URL + + + {Object.entries(serversList).map(([server, status]) => ( + + {protocol === 'http' && } + + + {server} + + + + ))} + + + + )} + {data.mirroring?.mirrors && data.mirroring.mirrors.length > 0 && ( + } title="Mirror Services" noPadding> + + Name + Percent + Provider + + + {data.mirroring.mirrors.map((mirror) => ( + + {mirror.name} + {mirror.percent} + + + ))} + + + )} + + ) +} + +type HttpServiceRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const HttpServiceRender = ({ data, error, name }: HttpServiceRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Service right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + +

    {data.name}

    + + +
    + ) +} + +export const HttpService = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'services') + return +} + +export default HttpService diff --git a/webui/src/pages/http/HttpServices.spec.tsx b/webui/src/pages/http/HttpServices.spec.tsx new file mode 100644 index 000000000..720fc2549 --- /dev/null +++ b/webui/src/pages/http/HttpServices.spec.tsx @@ -0,0 +1,101 @@ +import { HttpServices as HttpServicesPage, HttpServicesRender, makeRowRender } from './HttpServices' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the services list', () => { + const pages = [ + { + loadBalancer: { servers: [{ url: 'http://10.0.1.12:80' }], passHostHeader: true }, + status: 'enabled', + usedBy: ['server-redirect@docker', 'server-secured@docker'], + serverStatus: { 'http://10.0.1.12:80': 'UP' }, + name: 'api2_v2-example-beta1@docker', + provider: 'docker', + type: 'loadbalancer', + }, + { + loadBalancer: { + servers: [{ url: 'http://10.0.1.11:80' }, { url: 'http://10.0.1.12:80' }], + passHostHeader: true, + }, + status: 'enabled', + usedBy: ['web@docker'], + serverStatus: { 'http://10.0.1.11:80': 'UP' }, + name: 'api_v2-example-beta2@docker', + provider: 'docker', + type: 'loadbalancer', + }, + { + weighted: { sticky: { cookie: { name: 'chocolat', secure: true, httpOnly: true } } }, + status: 'enabled', + usedBy: ['foo@docker'], + name: 'canary1@docker', + provider: 'docker', + type: 'weighted', + }, + { + weighted: { sticky: { cookie: {} } }, + status: 'enabled', + usedBy: ['fii@docker'], + name: 'canary2@file', + provider: 'file', + type: 'weighted', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('HTTP Services page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(4) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('api2_v2-example-beta1@docker') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('api_v2-example-beta2@docker') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('2') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('canary1@docker') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('weighted') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('0') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('canary2@file') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('weighted') + expect(tbody.querySelectorAll('a[role="row"]')[3].innerHTML).toContain('0') + expect(tbody.querySelectorAll('a[role="row"]')[3].querySelector('svg[data-testid="file"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/http/HttpServices.tsx b/webui/src/pages/http/HttpServices.tsx new file mode 100644 index 000000000..6febd6b1f --- /dev/null +++ b/webui/src/pages/http/HttpServices.tsx @@ -0,0 +1,124 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex, Text } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (): RenderRowType => { + const HttpServicesRenderRow = (row) => ( + + + + + + + + + + + + + + + + {row.loadBalancer?.servers?.length || 0} + + + + + + + + + + ) + return HttpServicesRenderRow +} + +export const HttpServicesRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const HttpServices = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/http/services', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/http/Middlewares.vue b/webui/src/pages/http/Middlewares.vue deleted file mode 100644 index 3780d5702..000000000 --- a/webui/src/pages/http/Middlewares.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/webui/src/pages/http/Routers.vue b/webui/src/pages/http/Routers.vue deleted file mode 100644 index e23dde540..000000000 --- a/webui/src/pages/http/Routers.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - diff --git a/webui/src/pages/http/Services.vue b/webui/src/pages/http/Services.vue deleted file mode 100644 index cf5a59fae..000000000 --- a/webui/src/pages/http/Services.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/webui/src/pages/http/index.ts b/webui/src/pages/http/index.ts new file mode 100644 index 000000000..1c40ff67b --- /dev/null +++ b/webui/src/pages/http/index.ts @@ -0,0 +1,6 @@ +export { HttpMiddleware } from './HttpMiddleware' +export { HttpMiddlewares } from './HttpMiddlewares' +export { HttpRouter } from './HttpRouter' +export { HttpRouters } from './HttpRouters' +export { HttpService } from './HttpService' +export { HttpServices } from './HttpServices' diff --git a/webui/src/pages/index.ts b/webui/src/pages/index.ts new file mode 100644 index 000000000..3a84749a9 --- /dev/null +++ b/webui/src/pages/index.ts @@ -0,0 +1,7 @@ +import * as HTTPPages from './http' +import * as TCPPages from './tcp' +import * as UDPPages from './udp' + +export { Dashboard } from './dashboard/Dashboard' +export { NotFound } from './NotFound' +export { HTTPPages, TCPPages, UDPPages } diff --git a/webui/src/pages/tcp/Middlewares.vue b/webui/src/pages/tcp/Middlewares.vue deleted file mode 100644 index 711b589b2..000000000 --- a/webui/src/pages/tcp/Middlewares.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/webui/src/pages/tcp/Routers.vue b/webui/src/pages/tcp/Routers.vue deleted file mode 100644 index 0d169cf29..000000000 --- a/webui/src/pages/tcp/Routers.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - diff --git a/webui/src/pages/tcp/Services.vue b/webui/src/pages/tcp/Services.vue deleted file mode 100644 index bbd88e180..000000000 --- a/webui/src/pages/tcp/Services.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/webui/src/pages/tcp/TcpMiddleware.spec.tsx b/webui/src/pages/tcp/TcpMiddleware.spec.tsx new file mode 100644 index 000000000..b783e0958 --- /dev/null +++ b/webui/src/pages/tcp/TcpMiddleware.spec.tsx @@ -0,0 +1,128 @@ +import { TcpMiddlewareRender } from './TcpMiddleware' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render a simple middleware', async () => { + const mockData = { + inFlightConn: { + amount: 10, + }, + status: 'enabled', + usedBy: ['router-test-simple@docker'], + name: 'middleware-simple', + provider: 'docker', + type: 'addprefix', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['middleware-simple'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test-simple@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-simple') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(middlewareCard.innerHTML).toContain('Success') + expect(middlewareCard.innerHTML).toContain('inFlightConn') + expect(middlewareCard.innerHTML).toContain('amount') + expect(middlewareCard.innerHTML).toContain('10') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test-simple@docker') + }) + + it('should render a complex middleware', async () => { + const mockData = { + name: 'middleware-complex', + type: 'sample-middleware', + status: 'enabled', + provider: 'the-provider', + usedBy: ['router-test-complex@docker'], + inFlightConn: { + amount: 10, + }, + ipWhiteList: { + sourceRange: ['125.0.0.1', '125.0.0.4'], + }, + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['middleware-complex'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test-complex@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'middleware-complex') + expect(titleTags.length).toBe(1) + + const middlewareCard = getByTestId('middleware-card') + expect(middlewareCard.innerHTML).toContain('Success') + expect(middlewareCard.innerHTML).toContain('the-provider') + expect(middlewareCard.innerHTML).toContain('inFlightConn') + expect(middlewareCard.innerHTML).toContain('amount') + expect(middlewareCard.innerHTML).toContain('10') + expect(middlewareCard.innerHTML).toContain('ipWhiteList') + expect(middlewareCard.innerHTML).toContain('source Range') + expect(middlewareCard.innerHTML).toContain('125.0.0.1') + expect(middlewareCard.innerHTML).toContain('125.0.0.4') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test-complex@docker') + }) +}) diff --git a/webui/src/pages/tcp/TcpMiddleware.tsx b/webui/src/pages/tcp/TcpMiddleware.tsx new file mode 100644 index 000000000..f3637a46d --- /dev/null +++ b/webui/src/pages/tcp/TcpMiddleware.tsx @@ -0,0 +1,73 @@ +import { Card, Box, H1, Skeleton, styled, Text } from '@traefiklabs/faency' +import { useParams } from 'react-router-dom' + +import { DetailSectionSkeleton } from 'components/resources/DetailSections' +import { RenderMiddleware } from 'components/resources/MiddlewarePanel' +import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection' +import { ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { NotFound } from 'pages/NotFound' +import breakpoints from 'utils/breakpoints' + +const MiddlewareGrid = styled(Box, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(400px, 1fr))', + + [`@media (max-width: ${breakpoints.tablet})`]: { + gridTemplateColumns: '1fr', + }, +}) + +type TcpMiddlewareRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const TcpMiddlewareRender = ({ data, error, name }: TcpMiddlewareRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Middleware right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + +

    {data.name}

    + + + + + + +
    + ) +} + +export const TcpMiddleware = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'middlewares', 'tcp') + return +} + +export default TcpMiddleware diff --git a/webui/src/pages/tcp/TcpMiddlewares.spec.tsx b/webui/src/pages/tcp/TcpMiddlewares.spec.tsx new file mode 100644 index 000000000..3da9cfc5b --- /dev/null +++ b/webui/src/pages/tcp/TcpMiddlewares.spec.tsx @@ -0,0 +1,67 @@ +import { makeRowRender, TcpMiddlewares as TcpMiddlewaresPage, TcpMiddlewaresRender } from './TcpMiddlewares' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the middlewares list', () => { + const pages = [ + { + inFlightConn: { amount: 10 }, + status: 'enabled', + usedBy: ['web@docker'], + name: 'inFlightConn-foo@docker', + provider: 'docker', + type: 'inFlightConn', + }, + { + ipWhiteList: { sourceRange: ['125.0.0.1', '125.0.0.4'] }, + error: ['message 1', 'message 2'], + status: 'disabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'ipWhiteList@docker', + provider: 'docker', + type: 'ipWhiteList', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('TCP Middlewares page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(2) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('inFlightConn-foo@docker') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('inFlightConn') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('ipWhiteList@docker') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('ipWhiteList') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/tcp/TcpMiddlewares.tsx b/webui/src/pages/tcp/TcpMiddlewares.tsx new file mode 100644 index 000000000..c736d4c47 --- /dev/null +++ b/webui/src/pages/tcp/TcpMiddlewares.tsx @@ -0,0 +1,125 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' +import { parseMiddlewareType } from 'libs/parsers' + +export const makeRowRender = (): RenderRowType => { + const TcpMiddlewaresRenderRow = (row) => { + const middlewareType = parseMiddlewareType(row) + + return ( + + + + + + + + + + + + + + + + + + + + + + + ) + } + return TcpMiddlewaresRenderRow +} + +export const TcpMiddlewaresRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const TcpMiddlewares = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/tcp/middlewares', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/tcp/TcpRouter.spec.tsx b/webui/src/pages/tcp/TcpRouter.spec.tsx new file mode 100644 index 000000000..bd5fe7059 --- /dev/null +++ b/webui/src/pages/tcp/TcpRouter.spec.tsx @@ -0,0 +1,102 @@ +import { TcpRouterRender } from './TcpRouter' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render the router details', async () => { + const mockData = { + entryPoints: ['web-tcp'], + service: 'tcp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'tcp-all@docker', + provider: 'docker', + middlewares: [ + { + status: 'enabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware00@docker', + provider: 'docker', + type: 'middleware00', + }, + { + status: 'enabled', + usedBy: ['foo@docker', 'bar@file'], + name: 'middleware01@docker', + provider: 'docker', + type: 'middleware01', + }, + ], + hasValidMiddlewares: true, + entryPointsData: [ + { + address: ':8000', + name: 'web', + }, + { + address: ':443', + name: 'web-secured', + }, + ], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const routerStructure = getByTestId('router-structure') + expect(routerStructure.innerHTML).toContain(':443') + expect(routerStructure.innerHTML).toContain(':8000') + expect(routerStructure.innerHTML).toContain('tcp-all@docker') + expect(routerStructure.innerHTML).toContain('tcp-all') + expect(routerStructure.innerHTML).toContain('TCP Router') + expect(routerStructure.innerHTML).not.toContain('HTTP Router') + + const routerDetailsSection = getByTestId('router-details') + const routerDetailsPanel = routerDetailsSection.querySelector(':scope > div:nth-child(1)') + + expect(routerDetailsPanel?.innerHTML).toContain('Status') + expect(routerDetailsPanel?.innerHTML).toContain('Success') + expect(routerDetailsPanel?.innerHTML).toContain('Provider') + expect(routerDetailsPanel?.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(routerDetailsPanel?.innerHTML).toContain('Name') + expect(routerDetailsPanel?.innerHTML).toContain('tcp-all@docker') + expect(routerDetailsPanel?.innerHTML).toContain('Entrypoints') + expect(routerDetailsPanel?.innerHTML).toContain('web div:nth-child(3)') + const providers = Array.from(middlewaresPanel?.querySelectorAll('svg[data-testid="docker"]') || []) + expect(middlewaresPanel?.innerHTML).toContain('middleware00') + expect(middlewaresPanel?.innerHTML).toContain('middleware01') + expect(middlewaresPanel?.innerHTML).toContain('Success') + expect(providers.length).toBe(2) + + expect(getByTestId('/tcp/services/tcp-all@docker')).toBeInTheDocument() + }) +}) diff --git a/webui/src/pages/tcp/TcpRouter.tsx b/webui/src/pages/tcp/TcpRouter.tsx new file mode 100644 index 000000000..1bdac707c --- /dev/null +++ b/webui/src/pages/tcp/TcpRouter.tsx @@ -0,0 +1,82 @@ +import { Flex, styled, Text } from '@traefiklabs/faency' +import { useParams } from 'react-router-dom' + +import { CardListSection, DetailSectionSkeleton } from 'components/resources/DetailSections' +import MiddlewarePanel from 'components/resources/MiddlewarePanel' +import RouterPanel from 'components/resources/RouterPanel' +import TlsPanel from 'components/resources/TlsPanel' +import { ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { RouterStructure } from 'pages/http/HttpRouter' +import { NotFound } from 'pages/NotFound' + +type DetailProps = { + data: ResourceDetailDataType +} + +const SpacedColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))', + gridGap: '16px', +}) + +const RouterDetail = ({ data }: DetailProps) => ( + + + + + +) + +type TcpRouterRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const TcpRouterRender = ({ data, error, name }: TcpRouterRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Router right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + + + + + ) +} + +export const TcpRouter = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'routers', 'tcp') + return +} + +export default TcpRouter diff --git a/webui/src/pages/tcp/TcpRouters.spec.tsx b/webui/src/pages/tcp/TcpRouters.spec.tsx new file mode 100644 index 000000000..60acab68e --- /dev/null +++ b/webui/src/pages/tcp/TcpRouters.spec.tsx @@ -0,0 +1,85 @@ +import { makeRowRender, TcpRouters as TcpRoutersPage, TcpRoutersRender } from './TcpRouters' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the routers list', () => { + const pages = [ + { + entryPoints: ['web-tcp'], + service: 'tcp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'tcp-all@docker00', + provider: 'docker', + }, + { + entryPoints: ['web-tcp'], + service: 'tcp-all', + rule: 'HostSNI(`*`)', + status: 'disabled', + using: ['web-secured', 'web'], + name: 'tcp-all@docker01', + provider: 'docker', + }, + { + entryPoints: ['web-tcp'], + service: 'tcp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'tcp-all@docker02', + provider: 'docker', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('TCP Routers page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(3) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('HostSNI(`*`)') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toIncludeMultiple(['web-tcp']) + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('tcp-all@docker00') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('HostSNI(`*`)') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toIncludeMultiple(['web-tcp']) + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('tcp-all@docker01') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('HostSNI(`*`)') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toIncludeMultiple(['web-tcp']) + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('tcp-all@docker02') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/tcp/TcpRouters.tsx b/webui/src/pages/tcp/TcpRouters.tsx new file mode 100644 index 000000000..de8319e79 --- /dev/null +++ b/webui/src/pages/tcp/TcpRouters.tsx @@ -0,0 +1,142 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex } from '@traefiklabs/faency' +import { useMemo } from 'react' +import { FiShield } from 'react-icons/fi' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { Chips } from 'components/resources/DetailSections' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (): RenderRowType => { + const TcpRoutersRenderRow = (row) => ( + + + + + + + + + + {row.tls && ( + + + + + + )} + + + + + {row.entryPoints && row.entryPoints.length > 0 && } + + + + + + + + + + + + + + + + + + ) + return TcpRoutersRenderRow +} + +export const TcpRoutersRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const TcpRouters = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/tcp/routers', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/tcp/TcpService.spec.tsx b/webui/src/pages/tcp/TcpService.spec.tsx new file mode 100644 index 000000000..4860bd9e8 --- /dev/null +++ b/webui/src/pages/tcp/TcpService.spec.tsx @@ -0,0 +1,163 @@ +import { TcpServiceRender } from './TcpService' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render the service', async () => { + const mockData = { + loadBalancer: { + servers: [ + { + address: 'http://10.0.1.12:80', + }, + ], + passHostHeader: true, + terminationDelay: 10, + }, + status: 'enabled', + usedBy: ['router-test1@docker'], + name: 'service-test1', + provider: 'docker', + type: 'loadbalancer', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test1@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'service-test1') + expect(titleTags.length).toBe(1) + + const serviceDetails = getByTestId('service-details') + expect(serviceDetails.innerHTML).toContain('Type') + expect(serviceDetails.innerHTML).toContain('loadbalancer') + expect(serviceDetails.innerHTML).toContain('Provider') + expect(serviceDetails.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(serviceDetails.innerHTML).toContain('Status') + expect(serviceDetails.innerHTML).toContain('Success') + expect(serviceDetails.innerHTML).toContain('Pass Host Header') + expect(serviceDetails.innerHTML).toContain('True') + expect(serviceDetails.innerHTML).toContain('Termination Delay') + expect(serviceDetails.innerHTML).toContain('10 ms') + + const serversList = getByTestId('servers-list') + expect(serversList.childNodes.length).toBe(1) + expect(serversList.innerHTML).toContain('http://10.0.1.12:80') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test1@docker') + }) + + it('should render the service servers from the serverStatus property', async () => { + const mockData = { + loadBalancer: { + terminationDelay: 10, + }, + status: 'enabled', + usedBy: ['router-test1@docker', 'router-test2@docker'], + serverStatus: { + 'http://10.0.1.12:81': 'UP', + }, + name: 'service-test2', + provider: 'docker', + type: 'loadbalancer', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test1@docker', + provider: 'docker', + }, + { + entryPoints: ['web-secured'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-secured'], + name: 'router-test2@docker', + provider: 'docker', + }, + ], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const serversList = getByTestId('servers-list') + expect(serversList.childNodes.length).toBe(1) + expect(serversList.innerHTML).toContain('http://10.0.1.12:81') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(2) + expect(tableBody?.innerHTML).toContain('router-test1@docker') + expect(tableBody?.innerHTML).toContain('router-test2@docker') + }) + + it('should not render used by routers table if the usedBy property is empty', async () => { + const mockData = { + status: 'enabled', + usedBy: [], + name: 'service-test3', + provider: 'docker', + type: 'loadbalancer', + routers: [], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + expect(() => { + getByTestId('routers-table') + }).toThrow('Unable to find an element by: [data-testid="routers-table"]') + }) +}) diff --git a/webui/src/pages/tcp/TcpService.tsx b/webui/src/pages/tcp/TcpService.tsx new file mode 100644 index 000000000..6c1d262b5 --- /dev/null +++ b/webui/src/pages/tcp/TcpService.tsx @@ -0,0 +1,66 @@ +import { Flex, H1, Skeleton, styled, Text } from '@traefiklabs/faency' +import { useParams } from 'react-router-dom' + +import { DetailSectionSkeleton } from 'components/resources/DetailSections' +import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection' +import { ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { ServicePanels } from 'pages/http/HttpService' +import { NotFound } from 'pages/NotFound' + +const SpacedColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))', + gridGap: '16px', +}) + +type TcpServiceRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const TcpServiceRender = ({ data, error, name }: TcpServiceRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Service right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + +

    {data.name}

    + + +
    + ) +} + +export const TcpService = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'services', 'tcp') + return +} + +export default TcpService diff --git a/webui/src/pages/tcp/TcpServices.spec.tsx b/webui/src/pages/tcp/TcpServices.spec.tsx new file mode 100644 index 000000000..cd838bee4 --- /dev/null +++ b/webui/src/pages/tcp/TcpServices.spec.tsx @@ -0,0 +1,82 @@ +import { makeRowRender, TcpServices as TcpServicesPage, TcpServicesRender } from './TcpServices' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the services list', () => { + const pages = [ + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'enabled', + usedBy: ['tcp-all@docker'], + name: 'tcp-all@docker00', + provider: 'docker', + type: 'loadbalancer', + }, + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'disabled', + usedBy: ['tcp-all@docker'], + name: 'tcp-all@docker01', + provider: 'docker', + type: 'loadbalancer', + }, + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'enabled', + usedBy: ['tcp-all@docker'], + name: 'tcp-all@docker02', + provider: 'docker', + type: 'loadbalancer', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('TCP Services page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(3) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('tcp-all@docker00') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('tcp-all@docker01') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('tcp-all@docker02') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/tcp/TcpServices.tsx b/webui/src/pages/tcp/TcpServices.tsx new file mode 100644 index 000000000..a56027b61 --- /dev/null +++ b/webui/src/pages/tcp/TcpServices.tsx @@ -0,0 +1,124 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex, Text } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (): RenderRowType => { + const TcpServicesRenderRow = (row) => ( + + + + + + + + + + + + + + + + {row.loadBalancer?.servers?.length || 0} + + + + + + + + + + ) + return TcpServicesRenderRow +} + +export const TcpServicesRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const TcpServices = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/tcp/services', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/tcp/index.ts b/webui/src/pages/tcp/index.ts new file mode 100644 index 000000000..551a7fe63 --- /dev/null +++ b/webui/src/pages/tcp/index.ts @@ -0,0 +1,6 @@ +export { TcpMiddleware } from './TcpMiddleware' +export { TcpMiddlewares } from './TcpMiddlewares' +export { TcpRouter } from './TcpRouter' +export { TcpRouters } from './TcpRouters' +export { TcpService } from './TcpService' +export { TcpServices } from './TcpServices' diff --git a/webui/src/pages/udp/Routers.vue b/webui/src/pages/udp/Routers.vue deleted file mode 100644 index 7d075c4de..000000000 --- a/webui/src/pages/udp/Routers.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - diff --git a/webui/src/pages/udp/Services.vue b/webui/src/pages/udp/Services.vue deleted file mode 100644 index e1e2c1aa2..000000000 --- a/webui/src/pages/udp/Services.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/webui/src/pages/udp/UdpRouter.spec.tsx b/webui/src/pages/udp/UdpRouter.spec.tsx new file mode 100644 index 000000000..65aa5567d --- /dev/null +++ b/webui/src/pages/udp/UdpRouter.spec.tsx @@ -0,0 +1,80 @@ +import { UdpRouterRender } from './UdpRouter' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render the router details', async () => { + const mockData = { + entryPoints: ['web-udp'], + service: 'udp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'udp-all@docker', + provider: 'docker', + middlewares: undefined, + hasValidMiddlewares: undefined, + entryPointsData: [ + { + address: ':443', + name: 'web-secured', + }, + { + address: ':8000', + name: 'web', + }, + ], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const routerStructure = getByTestId('router-structure') + expect(routerStructure.innerHTML).toContain(':443') + expect(routerStructure.innerHTML).toContain(':8000') + expect(routerStructure.innerHTML).toContain('udp-all@docker') + expect(routerStructure.innerHTML).toContain('udp-all') + expect(routerStructure.innerHTML).toContain('UDP Router') + expect(routerStructure.innerHTML).not.toContain('HTTP Router') + + const routerDetailsSection = getByTestId('router-details') + const routerDetailsPanel = routerDetailsSection.querySelector(':scope > div:nth-child(1)') + + expect(routerDetailsPanel?.innerHTML).toContain('Status') + expect(routerDetailsPanel?.innerHTML).toContain('Success') + expect(routerDetailsPanel?.innerHTML).toContain('Provider') + expect(routerDetailsPanel?.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(routerDetailsPanel?.innerHTML).toContain('Name') + expect(routerDetailsPanel?.innerHTML).toContain('udp-all@docker') + expect(routerDetailsPanel?.innerHTML).toContain('Entrypoints') + expect(routerDetailsPanel?.innerHTML).toContain('web ( + + + +) + +type UdpRouterRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const UdpRouterRender = ({ data, error, name }: UdpRouterRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Router right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + + + + + ) +} + +export const UdpRouter = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'routers', 'udp') + + return +} + +export default UdpRouter diff --git a/webui/src/pages/udp/UdpRouters.spec.tsx b/webui/src/pages/udp/UdpRouters.spec.tsx new file mode 100644 index 000000000..8045cf8b7 --- /dev/null +++ b/webui/src/pages/udp/UdpRouters.spec.tsx @@ -0,0 +1,85 @@ +import { makeRowRender, UdpRouters as UdpRoutersPage, UdpRoutersRender } from './UdpRouters' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the routers list', () => { + const pages = [ + { + entryPoints: ['web-udp'], + service: 'udp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'udp-all@docker00', + provider: 'docker', + }, + { + entryPoints: ['web-udp'], + service: 'udp-all', + rule: 'HostSNI(`*`)', + status: 'disabled', + using: ['web-secured', 'web'], + name: 'udp-all@docker01', + provider: 'docker', + }, + { + entryPoints: ['web-udp'], + service: 'udp-all', + rule: 'HostSNI(`*`)', + status: 'enabled', + using: ['web-secured', 'web'], + name: 'udp-all@docker02', + provider: 'docker', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('UDP Routers page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(3) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toIncludeMultiple(['web-udp']) + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('udp-all@docker00') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('udp-all') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toIncludeMultiple(['web-udp']) + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('udp-all@docker01') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('udp-all') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toIncludeMultiple(['web-udp']) + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('udp-all@docker02') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('udp-all') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/udp/UdpRouters.tsx b/webui/src/pages/udp/UdpRouters.tsx new file mode 100644 index 000000000..56c6d8414 --- /dev/null +++ b/webui/src/pages/udp/UdpRouters.tsx @@ -0,0 +1,127 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { Chips } from 'components/resources/DetailSections' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (): RenderRowType => { + const UdpRoutersRenderRow = (row) => ( + + + + + + + + + {row.entryPoints && row.entryPoints.length > 0 && } + + + + + + + + + + + + + + + + + + ) + return UdpRoutersRenderRow +} + +export const UdpRoutersRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const UdpRouters = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/udp/routers', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/udp/UdpService.spec.tsx b/webui/src/pages/udp/UdpService.spec.tsx new file mode 100644 index 000000000..71114f560 --- /dev/null +++ b/webui/src/pages/udp/UdpService.spec.tsx @@ -0,0 +1,163 @@ +import { UdpServiceRender } from './UdpService' + +import { ResourceDetailDataType } from 'hooks/use-resource-detail' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the error message', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('error-text')).toBeInTheDocument() + }) + + it('should render the skeleton', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('skeleton')).toBeInTheDocument() + }) + + it('should render the not found page', () => { + const { getByTestId } = renderWithProviders( + , + ) + expect(getByTestId('Not found page')).toBeInTheDocument() + }) + + it('should render the service', async () => { + const mockData = { + loadBalancer: { + servers: [ + { + address: 'http://10.0.1.12:80', + }, + ], + passHostHeader: true, + terminationDelay: 10, + }, + status: 'enabled', + usedBy: ['router-test1@docker'], + name: 'service-test1', + provider: 'docker', + type: 'loadbalancer', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test1@docker', + provider: 'docker', + }, + ], + } + + const { container, getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const headings = Array.from(container.getElementsByTagName('h1')) + const titleTags = headings.filter((h1) => h1.innerHTML === 'service-test1') + expect(titleTags.length).toBe(1) + + const serviceDetails = getByTestId('service-details') + expect(serviceDetails.innerHTML).toContain('Type') + expect(serviceDetails.innerHTML).toContain('loadbalancer') + expect(serviceDetails.innerHTML).toContain('Provider') + expect(serviceDetails.querySelector('svg[data-testid="docker"]')).toBeTruthy() + expect(serviceDetails.innerHTML).toContain('Status') + expect(serviceDetails.innerHTML).toContain('Success') + expect(serviceDetails.innerHTML).toContain('Pass Host Header') + expect(serviceDetails.innerHTML).toContain('True') + expect(serviceDetails.innerHTML).toContain('Termination Delay') + expect(serviceDetails.innerHTML).toContain('10 ms') + + const serversList = getByTestId('servers-list') + expect(serversList.childNodes.length).toBe(1) + expect(serversList.innerHTML).toContain('http://10.0.1.12:80') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(1) + expect(tableBody?.innerHTML).toContain('router-test1@docker') + }) + + it('should render the service servers from the serverStatus property', async () => { + const mockData = { + loadBalancer: { + terminationDelay: 10, + }, + status: 'enabled', + usedBy: ['router-test1@docker', 'router-test2@docker'], + serverStatus: { + 'http://10.0.1.12:81': 'UP', + }, + name: 'service-test2', + provider: 'docker', + type: 'loadbalancer', + routers: [ + { + entryPoints: ['web-redirect'], + middlewares: ['redirect@file'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-redirect'], + name: 'router-test1@docker', + provider: 'docker', + }, + { + entryPoints: ['web-secured'], + service: 'api2_v2-example-beta1', + rule: 'Host(`server`)', + tls: {}, + status: 'enabled', + using: ['web-secured'], + name: 'router-test2@docker', + provider: 'docker', + }, + ], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + const serversList = getByTestId('servers-list') + expect(serversList.childNodes.length).toBe(1) + expect(serversList.innerHTML).toContain('http://10.0.1.12:81') + + const routersTable = getByTestId('routers-table') + const tableBody = routersTable.querySelectorAll('div[role="rowgroup"]')[1] + expect(tableBody?.querySelectorAll('a[role="row"]')).toHaveLength(2) + expect(tableBody?.innerHTML).toContain('router-test1@docker') + expect(tableBody?.innerHTML).toContain('router-test2@docker') + }) + + it('should not render used by routers table if the usedBy property is empty', async () => { + const mockData = { + status: 'enabled', + usedBy: [], + name: 'service-test3', + provider: 'docker', + type: 'loadbalancer', + routers: [], + } + + const { getByTestId } = renderWithProviders( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + , + ) + + expect(() => { + getByTestId('routers-table') + }).toThrow('Unable to find an element by: [data-testid="routers-table"]') + }) +}) diff --git a/webui/src/pages/udp/UdpService.tsx b/webui/src/pages/udp/UdpService.tsx new file mode 100644 index 000000000..9727a1663 --- /dev/null +++ b/webui/src/pages/udp/UdpService.tsx @@ -0,0 +1,66 @@ +import { Flex, H1, Skeleton, styled, Text } from '@traefiklabs/faency' +import { useParams } from 'react-router-dom' + +import { DetailSectionSkeleton } from 'components/resources/DetailSections' +import { UsedByRoutersSection, UsedByRoutersSkeleton } from 'components/resources/UsedByRoutersSection' +import { ResourceDetailDataType, useResourceDetail } from 'hooks/use-resource-detail' +import Page from 'layout/Page' +import { ServicePanels } from 'pages/http/HttpService' +import { NotFound } from 'pages/NotFound' + +const SpacedColumns = styled(Flex, { + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(360px, 1fr))', + gridGap: '16px', +}) + +type UdpServiceRenderProps = { + data?: ResourceDetailDataType + error?: Error + name: string +} + +export const UdpServiceRender = ({ data, error, name }: UdpServiceRenderProps) => { + if (error) { + return ( + + + Sorry, we could not fetch detail information for this Service right now. Please, try again later. + + + ) + } + + if (!data) { + return ( + + + + + + + + + ) + } + + if (!data.name) { + return + } + + return ( + +

    {data.name}

    + + +
    + ) +} + +export const UdpService = () => { + const { name } = useParams<{ name: string }>() + const { data, error } = useResourceDetail(name!, 'services', 'udp') + return +} + +export default UdpService diff --git a/webui/src/pages/udp/UdpServices.spec.tsx b/webui/src/pages/udp/UdpServices.spec.tsx new file mode 100644 index 000000000..8bb51ef0d --- /dev/null +++ b/webui/src/pages/udp/UdpServices.spec.tsx @@ -0,0 +1,82 @@ +import { makeRowRender, UdpServices as UdpServicesPage, UdpServicesRender } from './UdpServices' + +import * as useFetchWithPagination from 'hooks/use-fetch-with-pagination' +import { useFetchWithPaginationMock } from 'utils/mocks' +import { renderWithProviders } from 'utils/test' + +describe('', () => { + it('should render the services list', () => { + const pages = [ + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'enabled', + usedBy: ['udp-all@docker'], + name: 'udp-all@docker00', + provider: 'docker', + type: 'loadbalancer', + }, + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'disabled', + usedBy: ['udp-all@docker'], + name: 'udp-all@docker01', + provider: 'docker', + type: 'loadbalancer', + }, + { + loadBalancer: { terminationDelay: 10, servers: [{ address: '10.0.1.14:8080' }] }, + status: 'enabled', + usedBy: ['udp-all@docker'], + name: 'udp-all@docker02', + provider: 'docker', + type: 'loadbalancer', + }, + ].map(makeRowRender()) + const mock = vi + .spyOn(useFetchWithPagination, 'default') + .mockImplementation(() => useFetchWithPaginationMock({ pages })) + + const { container, getByTestId } = renderWithProviders() + + expect(mock).toHaveBeenCalled() + expect(getByTestId('UDP Services page')).toBeInTheDocument() + const tbody = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[1] + expect(tbody.querySelectorAll('a[role="row"]')).toHaveLength(3) + + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('udp-all@docker00') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[0].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[0].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('testid="disabled"') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('udp-all@docker01') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[1].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[1].querySelector('svg[data-testid="docker"]')).toBeTruthy() + + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('testid="enabled"') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('udp-all@docker02') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('loadbalancer') + expect(tbody.querySelectorAll('a[role="row"]')[2].innerHTML).toContain('1') + expect(tbody.querySelectorAll('a[role="row"]')[2].querySelector('svg[data-testid="docker"]')).toBeTruthy() + }) + + it('should render "No data available" when the API returns empty array', async () => { + const { container, getByTestId } = renderWithProviders( + {}} + pageCount={1} + pages={[]} + />, + ) + expect(() => getByTestId('loading')).toThrow('Unable to find an element by: [data-testid="loading"]') + const tfoot = container.querySelectorAll('div[role="table"] > div[role="rowgroup"]')[2] + expect(tfoot.querySelectorAll('div[role="row"]')).toHaveLength(1) + expect(tfoot.querySelectorAll('div[role="row"]')[0].innerHTML).toContain('No data available') + }) +}) diff --git a/webui/src/pages/udp/UdpServices.tsx b/webui/src/pages/udp/UdpServices.tsx new file mode 100644 index 000000000..b02c2fdcf --- /dev/null +++ b/webui/src/pages/udp/UdpServices.tsx @@ -0,0 +1,124 @@ +import { AriaTable, AriaTbody, AriaTd, AriaTfoot, AriaThead, AriaTr, Box, Flex, Text } from '@traefiklabs/faency' +import { useMemo } from 'react' +import useInfiniteScroll from 'react-infinite-scroll-hook' +import { useSearchParams } from 'react-router-dom' + +import ClickableRow from 'components/ClickableRow' +import ProviderIcon from 'components/icons/providers' +import { ResourceStatus } from 'components/resources/ResourceStatus' +import { ScrollTopButton } from 'components/ScrollTopButton' +import { SpinnerLoader } from 'components/SpinnerLoader' +import { searchParamsToState, TableFilter } from 'components/TableFilter' +import SortableTh from 'components/tables/SortableTh' +import Tooltip from 'components/Tooltip' +import TooltipText from 'components/TooltipText' +import useFetchWithPagination, { pagesResponseInterface, RenderRowType } from 'hooks/use-fetch-with-pagination' +import { EmptyPlaceholder } from 'layout/EmptyPlaceholder' +import Page from 'layout/Page' + +export const makeRowRender = (): RenderRowType => { + const UdpServicesRenderRow = (row) => ( + + + + + + + + + + + + + + + + {row.loadBalancer?.servers?.length || 0} + + + + + + + + + + ) + return UdpServicesRenderRow +} + +export const UdpServicesRender = ({ + error, + isEmpty, + isLoadingMore, + isReachingEnd, + loadMore, + pageCount, + pages, +}: pagesResponseInterface) => { + const [infiniteRef] = useInfiniteScroll({ + loading: isLoadingMore, + hasNextPage: !isReachingEnd && !error, + onLoadMore: loadMore, + }) + + return ( + <> + + + + + + + + + + + {pages} + {(isEmpty || !!error) && ( + + + + + + + + )} + + + {isLoadingMore ? : isReachingEnd && pageCount > 1 && } + + + ) +} + +export const UdpServices = () => { + const renderRow = makeRowRender() + const [searchParams] = useSearchParams() + + const query = useMemo(() => searchParamsToState(searchParams), [searchParams]) + const { pages, pageCount, isLoadingMore, isReachingEnd, loadMore, error, isEmpty } = useFetchWithPagination( + '/udp/services', + { + listContextKey: JSON.stringify(query), + renderRow, + renderLoader: () => null, + query, + }, + ) + + return ( + + + + + ) +} diff --git a/webui/src/pages/udp/index.ts b/webui/src/pages/udp/index.ts new file mode 100644 index 000000000..6fd038442 --- /dev/null +++ b/webui/src/pages/udp/index.ts @@ -0,0 +1,4 @@ +export { UdpRouter } from './UdpRouter' +export { UdpRouters } from './UdpRouters' +export { UdpService } from './UdpService' +export { UdpServices } from './UdpServices' diff --git a/webui/src/router/index.js b/webui/src/router/index.js deleted file mode 100644 index 5fc20777a..000000000 --- a/webui/src/router/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import { route } from 'quasar/wrappers' -import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router' -import routes from './routes' - -export default route(function (/* { store, ssrContext } */) { - const createHistory = process.env.SERVER - ? createMemoryHistory - : (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory) - - const Router = createRouter({ - scrollBehavior: () => ({ left: 0, top: 0 }), - routes, - - history: createHistory(process.env.MODE === 'ssr' ? undefined : process.env.VUE_ROUTER_BASE) - }) - - return Router -}) diff --git a/webui/src/router/routes.js b/webui/src/router/routes.js deleted file mode 100644 index 38334cbcc..000000000 --- a/webui/src/router/routes.js +++ /dev/null @@ -1,262 +0,0 @@ -import Error404 from 'pages/_commons/Error404.vue' - -const LayoutDefault = () => import('layouts/Default.vue') - -const routes = [ - { - path: '/', - component: LayoutDefault, - children: [ - { - path: '', - name: 'dashboard', - component: () => import('pages/dashboard/Index.vue'), - meta: { - title: 'Dashboard' - } - } - ] - }, - { - path: '/http', - redirect: '/http/routers', - component: LayoutDefault, - children: [ - { - path: 'routers', - name: 'httpRouters', - components: { - default: () => import('pages/http/Routers.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Routers' - } - }, - { - path: 'routers/:name', - name: 'httpRouterDetail', - components: { - default: () => import('pages/_commons/RouterDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Router Detail' - } - }, - { - path: 'services', - name: 'httpServices', - components: { - default: () => import('pages/http/Services.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Services' - } - }, - { - path: 'services/:name', - name: 'httpServiceDetail', - components: { - default: () => import('pages/_commons/ServiceDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Service Detail' - } - }, - { - path: 'middlewares', - name: 'httpMiddlewares', - components: { - default: () => import('pages/http/Middlewares.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Middlewares' - } - }, - { - path: 'middlewares/:name', - name: 'httpMiddlewareDetail', - components: { - default: () => import('pages/_commons/MiddlewareDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'http', - title: 'HTTP Middleware Detail' - } - } - ] - }, - { - path: '/tcp', - redirect: '/tcp/routers', - component: LayoutDefault, - children: [ - { - path: 'routers', - name: 'tcpRouters', - components: { - default: () => import('pages/tcp/Routers.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Routers' - } - }, - { - path: 'routers/:name', - name: 'tcpRouterDetail', - components: { - default: () => import('pages/_commons/RouterDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Router Detail' - } - }, - { - path: 'services', - name: 'tcpServices', - components: { - default: () => import('pages/tcp/Services.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Services' - } - }, - { - path: 'services/:name', - name: 'tcpServiceDetail', - components: { - default: () => import('pages/_commons/ServiceDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Service Detail' - } - }, - { - path: 'middlewares', - name: 'tcpMiddlewares', - components: { - default: () => import('pages/tcp/Middlewares.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Middlewares' - } - }, - { - path: 'middlewares/:name', - name: 'tcpMiddlewareDetail', - components: { - default: () => import('pages/_commons/MiddlewareDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'tcp', - title: 'TCP Middleware Detail' - } - } - ] - }, - { - path: '/udp', - redirect: '/udp/routers', - component: LayoutDefault, - children: [ - { - path: 'routers', - name: 'udpRouters', - components: { - default: () => import('pages/udp/Routers.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'udp', - title: 'TCP Routers' - } - }, - { - path: 'routers/:name', - name: 'udpRouterDetail', - components: { - default: () => import('pages/_commons/RouterDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'udp', - title: 'TCP Router Detail' - } - }, - { - path: 'services', - name: 'udpServices', - components: { - default: () => import('pages/udp/Services.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'udp', - title: 'TCP Services' - } - }, - { - path: 'services/:name', - name: 'udpServiceDetail', - components: { - default: () => import('pages/_commons/ServiceDetail.vue'), - NavBar: () => import('components/_commons/ToolBar.vue') - }, - props: { default: true, NavBar: true }, - meta: { - protocol: 'udp', - title: 'TCP Service Detail' - } - } - ] - } -] - -// Always leave this as last one -if (process.env.MODE !== 'ssr') { - routes.push({ - path: '/:catchAll(.*)*', - component: Error404, - meta: { - title: '404' - } - }) -} - -export default routes diff --git a/webui/src/routes.tsx b/webui/src/routes.tsx new file mode 100644 index 000000000..249584848 --- /dev/null +++ b/webui/src/routes.tsx @@ -0,0 +1,94 @@ +import { ReactNode } from 'react' +import { LiaProjectDiagramSolid, LiaServerSolid, LiaCogsSolid, LiaHomeSolid } from 'react-icons/lia' + +export type Route = { + path: string + label: string + icon?: string | ReactNode + activeMatches?: string[] +} + +type RouteSections = { + section: string + items: Route[] + sectionLabel?: string +} + +export const ROUTES: RouteSections[] = [ + { + section: 'dashboard', + items: [ + { + path: '/', + label: 'Dashboard', + icon: , + }, + ], + }, + { + section: 'http', + sectionLabel: 'HTTP', + items: [ + { + path: '/http/routers', + activeMatches: ['/http/routers/:name'], + label: 'HTTP Routers', + icon: , + }, + { + path: '/http/services', + activeMatches: ['/http/services/:name'], + label: 'HTTP Services', + icon: , + }, + { + path: '/http/middlewares', + activeMatches: ['/http/middlewares/:name'], + label: 'HTTP Middlewares', + icon: , + }, + ], + }, + { + section: 'tcp', + sectionLabel: 'TCP', + items: [ + { + path: '/tcp/routers', + activeMatches: ['/tcp/routers/:name'], + label: 'TCP Routers', + icon: , + }, + { + path: '/tcp/services', + activeMatches: ['/tcp/services/:name'], + label: 'TCP Services', + icon: , + }, + { + path: '/tcp/middlewares', + activeMatches: ['/tcp/middlewares/:name'], + label: 'TCP Middlewares', + icon: , + }, + ], + }, + { + section: 'udp', + sectionLabel: 'UDP', + items: [ + { + path: '/udp/routers', + activeMatches: ['/udp/routers/:name'], + label: 'UDP Routers', + icon: , + }, + { + path: '/udp/services', + activeMatches: ['/udp/services/:name'], + label: 'UDP Services', + icon: , + }, + ], + }, +] diff --git a/webui/src/store/core/actions.js b/webui/src/store/core/actions.js deleted file mode 100644 index 11be19f28..000000000 --- a/webui/src/store/core/actions.js +++ /dev/null @@ -1,25 +0,0 @@ -import coreService from '../../_services/CoreService' - -export function getOverview ({ commit }) { - commit('getOverviewRequest') - return coreService.getOverview() - .then(body => { - commit('getOverviewSuccess', body) - return body - }) - .catch(error => { - commit('getOverviewFailure', error) - return Promise.reject(error) - }) -} - -export function getVersion ({ commit }) { - return coreService.getVersion() - .then(body => { - commit('getVersionSuccess', body) - return body - }) - .catch(error => { - return Promise.reject(error) - }) -} diff --git a/webui/src/store/core/getters.js b/webui/src/store/core/getters.js deleted file mode 100644 index 43ecdfdad..000000000 --- a/webui/src/store/core/getters.js +++ /dev/null @@ -1,13 +0,0 @@ -// ---------------------------- -// all Overview -// ---------------------------- -export function allOverview (state) { - return state.allOverview -} - -// ---------------------------- -// Version -// ---------------------------- -export function version (state) { - return state.version -} diff --git a/webui/src/store/core/index.js b/webui/src/store/core/index.js deleted file mode 100644 index babab8ec5..000000000 --- a/webui/src/store/core/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from './state' -import * as getters from './getters' -import * as mutations from './mutations' -import * as actions from './actions' - -export default { - namespaced: true, - getters, - mutations, - actions, - state -} diff --git a/webui/src/store/core/mutations.js b/webui/src/store/core/mutations.js deleted file mode 100644 index 31364647e..000000000 --- a/webui/src/store/core/mutations.js +++ /dev/null @@ -1,26 +0,0 @@ -// ---------------------------- -// Get Overview -// ---------------------------- -export function getOverviewRequest (state) { - state.allOverview.loading = true -} - -export function getOverviewSuccess (state, body) { - state.allOverview = { items: body, loading: false } -} - -export function getOverviewFailure (state, error) { - state.allOverview = { error } -} - -export function getOverviewClear (state) { - state.allOverview = {} -} - -// ---------------------------- -// Get Version -// ---------------------------- -export function getVersionSuccess (state, body) { - state.version = body - state.version.disableDashboardAd = !!body.disableDashboardAd // Ensures state.version.disableDashboardAd is defined -} diff --git a/webui/src/store/core/state.js b/webui/src/store/core/state.js deleted file mode 100644 index fb269caed..000000000 --- a/webui/src/store/core/state.js +++ /dev/null @@ -1,4 +0,0 @@ -export default { - allOverview: {}, - version: '' -} diff --git a/webui/src/store/entrypoints/actions.js b/webui/src/store/entrypoints/actions.js deleted file mode 100644 index 5b67b8ae1..000000000 --- a/webui/src/store/entrypoints/actions.js +++ /dev/null @@ -1,27 +0,0 @@ -import EntrypointsService from '../../_services/EntrypointsService' - -export function getAll ({ commit }) { - commit('getAllRequest') - return EntrypointsService.getAll() - .then(body => { - commit('getAllSuccess', body) - return body - }) - .catch(error => { - commit('getAllFailure', error) - return Promise.reject(error) - }) -} - -export function getByName ({ commit }, name) { - commit('getByNameRequest') - return EntrypointsService.getByName(name) - .then(body => { - commit('getByNameSuccess', body) - return body - }) - .catch(error => { - commit('getByNameFailure', error) - return Promise.reject(error) - }) -} diff --git a/webui/src/store/entrypoints/getters.js b/webui/src/store/entrypoints/getters.js deleted file mode 100644 index 52431bc75..000000000 --- a/webui/src/store/entrypoints/getters.js +++ /dev/null @@ -1,13 +0,0 @@ -// ---------------------------- -// all -// ---------------------------- -export function all (state) { - return state.all -} - -// ---------------------------- -// byName -// ---------------------------- -export function byName (state) { - return state.byName -} diff --git a/webui/src/store/entrypoints/index.js b/webui/src/store/entrypoints/index.js deleted file mode 100644 index babab8ec5..000000000 --- a/webui/src/store/entrypoints/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from './state' -import * as getters from './getters' -import * as mutations from './mutations' -import * as actions from './actions' - -export default { - namespaced: true, - getters, - mutations, - actions, - state -} diff --git a/webui/src/store/entrypoints/mutations.js b/webui/src/store/entrypoints/mutations.js deleted file mode 100644 index 5a80fb35e..000000000 --- a/webui/src/store/entrypoints/mutations.js +++ /dev/null @@ -1,37 +0,0 @@ -// ---------------------------- -// Get All -// ---------------------------- -export function getAllRequest (state) { - state.all.loading = true -} - -export function getAllSuccess (state, body) { - state.all = { items: body, loading: false } -} - -export function getAllFailure (state, error) { - state.all = { error } -} - -export function getAllClear (state) { - state.all = {} -} - -// ---------------------------- -// Get By Name -// ---------------------------- -export function getByNameRequest (state) { - state.byName.loading = true -} - -export function getByNameSuccess (state, body) { - state.byName = { item: body, loading: false } -} - -export function getByNameFailure (state, error) { - state.byName = { error } -} - -export function getByNameClear (state) { - state.byName = {} -} diff --git a/webui/src/store/entrypoints/state.js b/webui/src/store/entrypoints/state.js deleted file mode 100644 index 2c7d2af28..000000000 --- a/webui/src/store/entrypoints/state.js +++ /dev/null @@ -1,4 +0,0 @@ -export default { - all: {}, - byName: {} -} diff --git a/webui/src/store/http/actions.js b/webui/src/store/http/actions.js deleted file mode 100644 index 00c6b3224..000000000 --- a/webui/src/store/http/actions.js +++ /dev/null @@ -1,79 +0,0 @@ -import HttpService from '../../_services/HttpService' - -export function getAllRouters ({ commit }, params) { - commit('getAllRoutersRequest') - return HttpService.getAllRouters(params) - .then(body => { - commit('getAllRoutersSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllRoutersFailure', error) - return Promise.reject(error) - }) -} - -export function getRouterByName ({ commit }, name) { - commit('getRouterByNameRequest') - return HttpService.getRouterByName(name) - .then(body => { - commit('getRouterByNameSuccess', body) - return body - }) - .catch(error => { - commit('getRouterByNameFailure', error) - return Promise.reject(error) - }) -} - -export function getAllServices ({ commit }, params) { - commit('getAllServicesRequest') - return HttpService.getAllServices(params) - .then(body => { - commit('getAllServicesSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllServicesFailure', error) - return Promise.reject(error) - }) -} - -export function getServiceByName ({ commit }, name) { - commit('getServiceByNameRequest') - return HttpService.getServiceByName(name) - .then(body => { - commit('getServiceByNameSuccess', body) - return body - }) - .catch(error => { - commit('getServiceByNameFailure', error) - return Promise.reject(error) - }) -} - -export function getAllMiddlewares ({ commit }, params) { - commit('getAllMiddlewaresRequest') - return HttpService.getAllMiddlewares(params) - .then(body => { - commit('getAllMiddlewaresSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllMiddlewaresFailure', error) - return Promise.reject(error) - }) -} - -export function getMiddlewareByName ({ commit }, name) { - commit('getMiddlewareByNameRequest') - return HttpService.getMiddlewareByName(name) - .then(body => { - commit('getMiddlewareByNameSuccess', body) - return body - }) - .catch(error => { - commit('getMiddlewareByNameFailure', error) - return Promise.reject(error) - }) -} diff --git a/webui/src/store/http/getters.js b/webui/src/store/http/getters.js deleted file mode 100644 index 2f822b452..000000000 --- a/webui/src/store/http/getters.js +++ /dev/null @@ -1,41 +0,0 @@ -// ---------------------------- -// all Routers -// ---------------------------- -export function allRouters (state) { - return state.allRouters -} - -// ---------------------------- -// Router by Name -// ---------------------------- -export function routerByName (state) { - return state.routerByName -} - -// ---------------------------- -// all Services -// ---------------------------- -export function allServices (state) { - return state.allServices -} - -// ---------------------------- -// Service by Name -// ---------------------------- -export function serviceByName (state) { - return state.serviceByName -} - -// ---------------------------- -// all Middlewares -// ---------------------------- -export function allMiddlewares (state) { - return state.allMiddlewares -} - -// ---------------------------- -// Middleware by Name -// ---------------------------- -export function middlewareByName (state) { - return state.middlewareByName -} diff --git a/webui/src/store/http/index.js b/webui/src/store/http/index.js deleted file mode 100644 index babab8ec5..000000000 --- a/webui/src/store/http/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from './state' -import * as getters from './getters' -import * as mutations from './mutations' -import * as actions from './actions' - -export default { - namespaced: true, - getters, - mutations, - actions, - state -} diff --git a/webui/src/store/http/mutations.js b/webui/src/store/http/mutations.js deleted file mode 100644 index 484a90d4a..000000000 --- a/webui/src/store/http/mutations.js +++ /dev/null @@ -1,158 +0,0 @@ -import { withPagination } from '../../_helpers/Mutations' - -// ---------------------------- -// Get All Routers -// ---------------------------- -export function getAllRoutersRequest (state) { - withPagination('request', { statePath: 'allRouters' })(state) -} - -export function getAllRoutersSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allRouters - const { currentQuery = '', currentStatus = '' } = currentState - - const isSameContext = currentQuery === query && currentStatus === status - - state.allRouters = { - ...state.allRouters, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allRouters' - })(state, data) -} - -export function getAllRoutersFailure (state, error) { - withPagination('failure', { statePath: 'allRouters' })(state, error) -} - -export function getAllRoutersClear (state) { - state.allRouters = {} -} - -// ---------------------------- -// Get Router By Name -// ---------------------------- -export function getRouterByNameRequest (state) { - state.routerByName.loading = true -} - -export function getRouterByNameSuccess (state, body) { - state.routerByName = { item: body, loading: false } -} - -export function getRouterByNameFailure (state, error) { - state.routerByName = { error } -} - -export function getRouterByNameClear (state) { - state.routerByName = {} -} - -// ---------------------------- -// Get All Services -// ---------------------------- -export function getAllServicesRequest (state) { - withPagination('request', { statePath: 'allServices' })(state) -} - -export function getAllServicesSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allServices - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allServices = { - ...state.allServices, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allServices' - })(state, data) -} - -export function getAllServicesFailure (state, error) { - withPagination('failure', { statePath: 'allServices' })(state, error) -} - -export function getAllServicesClear (state) { - state.allServices = {} -} - -// ---------------------------- -// Get Service By Name -// ---------------------------- -export function getServiceByNameRequest (state) { - state.serviceByName.loading = true -} - -export function getServiceByNameSuccess (state, body) { - state.serviceByName = { item: body, loading: false } -} - -export function getServiceByNameFailure (state, error) { - state.serviceByName = { error } -} - -export function getServiceByNameClear (state) { - state.serviceByName = {} -} - -// ---------------------------- -// Get All Middlewares -// ---------------------------- -export function getAllMiddlewaresRequest (state) { - withPagination('request', { statePath: 'allMiddlewares' })(state) -} - -export function getAllMiddlewaresSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allMiddlewares - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allMiddlewares = { - ...state.allMiddlewares, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allMiddlewares' - })(state, data) -} - -export function getAllMiddlewaresFailure (state, error) { - withPagination('failure', { statePath: 'allMiddlewares' })(state, error) -} - -export function getAllMiddlewaresClear (state) { - state.allMiddlewares = {} -} - -// ---------------------------- -// Get Middleware By Name -// ---------------------------- -export function getMiddlewareByNameRequest (state) { - state.middlewareByName.loading = true -} - -export function getMiddlewareByNameSuccess (state, body) { - state.middlewareByName = { item: body, loading: false } -} - -export function getMiddlewareByNameFailure (state, error) { - state.middlewareByName = { error } -} - -export function getMiddlewareByNameClear (state) { - state.middlewareByName = {} -} diff --git a/webui/src/store/http/mutations.vitest.spec.js b/webui/src/store/http/mutations.vitest.spec.js deleted file mode 100644 index 125216186..000000000 --- a/webui/src/store/http/mutations.vitest.spec.js +++ /dev/null @@ -1,292 +0,0 @@ -import { describe, expect, it } from 'vitest' -import store from './index.js' - -const { - getAllRoutersRequest, - getAllRoutersSuccess, - getAllRoutersFailure, - getAllServicesRequest, - getAllServicesSuccess, - getAllServicesFailure, - getAllMiddlewaresRequest, - getAllMiddlewaresSuccess, - getAllMiddlewaresFailure -} = store.mutations - -describe('http mutations', function () { - /* Routers */ - describe('http routers mutations', function () { - it('getAllRoutersRequest', function () { - const state = { - allRouters: { - items: [{}, {}, {}] - } - } - - getAllRoutersRequest(state) - - expect(state.allRouters.loading).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - - it('getAllRoutersSuccess page 1', function () { - const state = { - allRouters: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(3) - expect(state.allRouters.items.length).to.equal(3) - expect(state.allRouters.currentPage).to.equal(1) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersSuccess page 2', function () { - const state = { - allRouters: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(7) - expect(state.allRouters.items.length).to.equal(7) - expect(state.allRouters.currentPage).to.equal(2) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersFailing', function () { - const state = { - allRouters: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllRoutersFailure(state, error) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.endReached).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - }) - - /* Services */ - describe('http services mutations', function () { - it('getAllServicesRequest', function () { - const state = { - allServices: { - items: [{}, {}, {}] - } - } - - getAllServicesRequest(state) - - expect(state.allServices.loading).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - - it('getAllServicesSuccess page 1', function () { - const state = { - allServices: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(3) - expect(state.allServices.items.length).to.equal(3) - expect(state.allServices.currentPage).to.equal(1) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesSuccess page 2', function () { - const state = { - allServices: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(7) - expect(state.allServices.items.length).to.equal(7) - expect(state.allServices.currentPage).to.equal(2) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesFailing', function () { - const state = { - allServices: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllServicesFailure(state, error) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.endReached).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - }) - - /* Middlewares */ - describe('http middlewares mutations', function () { - it('getAllMiddlewaresRequest', function () { - const state = { - allMiddlewares: { - items: [{}, {}, {}] - } - } - - getAllMiddlewaresRequest(state) - - expect(state.allMiddlewares.loading).to.equal(true) - expect(state.allMiddlewares.items.length).to.equal(3) - }) - - it('getAllMiddlewaresSuccess page 1', function () { - const state = { - allMiddlewares: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllMiddlewaresSuccess(state, data) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.total).to.equal(3) - expect(state.allMiddlewares.items.length).to.equal(3) - expect(state.allMiddlewares.currentPage).to.equal(1) - expect(state.allMiddlewares.currentQuery).to.equal('test query') - expect(state.allMiddlewares.currentStatus).to.equal('warning') - }) - - it('getAllMiddlewaresSuccess page 2', function () { - const state = { - allMiddlewares: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllMiddlewaresSuccess(state, data) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.total).to.equal(7) - expect(state.allMiddlewares.items.length).to.equal(7) - expect(state.allMiddlewares.currentPage).to.equal(2) - expect(state.allMiddlewares.currentQuery).to.equal('test query') - expect(state.allMiddlewares.currentStatus).to.equal('warning') - }) - - it('getAllMiddlewaresFailing', function () { - const state = { - allMiddlewares: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllMiddlewaresFailure(state, error) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.endReached).to.equal(true) - expect(state.allMiddlewares.items.length).to.equal(3) - }) - }) -}) diff --git a/webui/src/store/http/state.js b/webui/src/store/http/state.js deleted file mode 100644 index 0557a4fdd..000000000 --- a/webui/src/store/http/state.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - allRouters: {}, - routerByName: {}, - allServices: {}, - serviceByName: {}, - allMiddlewares: {}, - middlewareByName: {} -} diff --git a/webui/src/store/index.js b/webui/src/store/index.js deleted file mode 100644 index fd7624be1..000000000 --- a/webui/src/store/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import { createStore } from 'vuex' -import { store } from 'quasar/wrappers' - -import core from './core' -import entrypoints from './entrypoints' -import http from './http' -import tcp from './tcp' -import udp from './udp' -import platform from './platform' - -/* - * If not building with SSR mode, you can - * directly export the Store instantiation - */ - -export default store((/* { ssrContext } */) => { - const Store = createStore({ - modules: { - core, - entrypoints, - http, - tcp, - udp, - platform - }, - - // enable strict mode (adds overhead!) - // for dev mode only - strict: process.env.DEV - }) - - return Store -}) diff --git a/webui/src/store/platform/index.js b/webui/src/store/platform/index.js deleted file mode 100644 index 8fec9a464..000000000 --- a/webui/src/store/platform/index.js +++ /dev/null @@ -1,49 +0,0 @@ -export default { - namespaced: true, - getters: { - path (state) { - return state.path - }, - isOpen (state) { - return state.isOpen - }, - notificationIsHidden (state) { - return state.notificationIsHidden - } - }, - mutations: { - toggle (state, isOpen) { - state.isOpen = isOpen || !state.isOpen - if (!state.isOpen) { - state.path = '/' - } - }, - setPath (state, path = '/') { - state.path = path - }, - toggleNotifVisibility (state, isHidden) { - state.notificationIsHidden = isHidden || !state.isHidden - } - }, - actions: { - toggle ({ commit }) { - commit('toggle') - }, - open ({ commit }, path) { - commit('setPath', path) - commit('toggle', true) - }, - close ({ commit }) { - commit('setPath', '/') - commit('toggle', false) - }, - hideNotification ({ commit }) { - commit('toggleNotifVisibility', true) - } - }, - state: { - path: '/', - isOpen: false, - notificationIsHidden: false - } -} diff --git a/webui/src/store/store-flag.d.ts b/webui/src/store/store-flag.d.ts deleted file mode 100644 index 7677175b0..000000000 --- a/webui/src/store/store-flag.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable */ -// THIS FEATURE-FLAG FILE IS AUTOGENERATED, -// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING -import "quasar/dist/types/feature-flag"; - -declare module "quasar/dist/types/feature-flag" { - interface QuasarFeatureFlags { - store: true; - } -} diff --git a/webui/src/store/tcp/actions.js b/webui/src/store/tcp/actions.js deleted file mode 100644 index f728c6d5b..000000000 --- a/webui/src/store/tcp/actions.js +++ /dev/null @@ -1,79 +0,0 @@ -import TcpService from '../../_services/TcpService' - -export function getAllRouters ({ commit }, params) { - commit('getAllRoutersRequest') - return TcpService.getAllRouters(params) - .then(body => { - commit('getAllRoutersSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllRoutersFailure', error) - return Promise.reject(error) - }) -} - -export function getRouterByName ({ commit }, name) { - commit('getRouterByNameRequest') - return TcpService.getRouterByName(name) - .then(body => { - commit('getRouterByNameSuccess', body) - return body - }) - .catch(error => { - commit('getRouterByNameFailure', error) - return Promise.reject(error) - }) -} - -export function getAllServices ({ commit }, params) { - commit('getAllServicesRequest') - return TcpService.getAllServices(params) - .then(body => { - commit('getAllServicesSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllServicesFailure', error) - return Promise.reject(error) - }) -} - -export function getServiceByName ({ commit }, name) { - commit('getServiceByNameRequest') - return TcpService.getServiceByName(name) - .then(body => { - commit('getServiceByNameSuccess', body) - return body - }) - .catch(error => { - commit('getServiceByNameFailure', error) - return Promise.reject(error) - }) -} - -export function getAllMiddlewares ({ commit }, params) { - commit('getAllMiddlewaresRequest') - return TcpService.getAllMiddlewares(params) - .then(body => { - commit('getAllMiddlewaresSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllMiddlewaresFailure', error) - return Promise.reject(error) - }) -} - -export function getMiddlewareByName ({ commit }, name) { - commit('getMiddlewareByNameRequest') - return TcpService.getMiddlewareByName(name) - .then(body => { - commit('getMiddlewareByNameSuccess', body) - return body - }) - .catch(error => { - commit('getMiddlewareByNameFailure', error) - return Promise.reject(error) - }) -} diff --git a/webui/src/store/tcp/getters.js b/webui/src/store/tcp/getters.js deleted file mode 100644 index 2f822b452..000000000 --- a/webui/src/store/tcp/getters.js +++ /dev/null @@ -1,41 +0,0 @@ -// ---------------------------- -// all Routers -// ---------------------------- -export function allRouters (state) { - return state.allRouters -} - -// ---------------------------- -// Router by Name -// ---------------------------- -export function routerByName (state) { - return state.routerByName -} - -// ---------------------------- -// all Services -// ---------------------------- -export function allServices (state) { - return state.allServices -} - -// ---------------------------- -// Service by Name -// ---------------------------- -export function serviceByName (state) { - return state.serviceByName -} - -// ---------------------------- -// all Middlewares -// ---------------------------- -export function allMiddlewares (state) { - return state.allMiddlewares -} - -// ---------------------------- -// Middleware by Name -// ---------------------------- -export function middlewareByName (state) { - return state.middlewareByName -} diff --git a/webui/src/store/tcp/index.js b/webui/src/store/tcp/index.js deleted file mode 100644 index babab8ec5..000000000 --- a/webui/src/store/tcp/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from './state' -import * as getters from './getters' -import * as mutations from './mutations' -import * as actions from './actions' - -export default { - namespaced: true, - getters, - mutations, - actions, - state -} diff --git a/webui/src/store/tcp/mutations.js b/webui/src/store/tcp/mutations.js deleted file mode 100644 index da98bd00d..000000000 --- a/webui/src/store/tcp/mutations.js +++ /dev/null @@ -1,157 +0,0 @@ -import { withPagination } from '../../_helpers/Mutations' - -// ---------------------------- -// Get All Routers -// ---------------------------- -export function getAllRoutersRequest (state) { - withPagination('request', { statePath: 'allRouters' })(state) -} - -export function getAllRoutersSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allRouters - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allRouters = { - ...state.allRouters, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allRouters' - })(state, data) -} - -export function getAllRoutersFailure (state, error) { - withPagination('failure', { statePath: 'allRouters' })(state, error) -} - -export function getAllRoutersClear (state) { - state.allRouters = {} -} - -// ---------------------------- -// Get Router By Name -// ---------------------------- -export function getRouterByNameRequest (state) { - state.routerByName.loading = true -} - -export function getRouterByNameSuccess (state, body) { - state.routerByName = { item: body, loading: false } -} - -export function getRouterByNameFailure (state, error) { - state.routerByName = { error } -} - -export function getRouterByNameClear (state) { - state.routerByName = {} -} - -// ---------------------------- -// Get All Services -// ---------------------------- -export function getAllServicesRequest (state) { - withPagination('request', { statePath: 'allServices' })(state) -} - -export function getAllServicesSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allServices - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allServices = { - ...state.allServices, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allServices' - })(state, data) -} - -export function getAllServicesFailure (state, error) { - withPagination('failure', { statePath: 'allServices' })(state, error) -} - -export function getAllServicesClear (state) { - state.allServices = {} -} - -// ---------------------------- -// Get Service By Name -// ---------------------------- -export function getServiceByNameRequest (state) { - state.serviceByName.loading = true -} - -export function getServiceByNameSuccess (state, body) { - state.serviceByName = { item: body, loading: false } -} - -export function getServiceByNameFailure (state, error) { - state.serviceByName = { error } -} - -export function getServiceByNameClear (state) { - state.serviceByName = {} -} - -// ---------------------------- -// Get All Middlewares -// ---------------------------- -export function getAllMiddlewaresRequest (state) { - withPagination('request', { statePath: 'allMiddlewares' })(state) -} - -export function getAllMiddlewaresSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allMiddlewares - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allMiddlewares = { - ...state.allMiddlewares, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allMiddlewares' - })(state, data) -} - -export function getAllMiddlewaresFailure (state, error) { - withPagination('failure', { statePath: 'allMiddlewares' })(state, error) -} - -export function getAllMiddlewaresClear (state) { - state.allMiddlewares = {} -} - -// ---------------------------- -// Get Middleware By Name -// ---------------------------- -export function getMiddlewareByNameRequest (state) { - state.middlewareByName.loading = true -} - -export function getMiddlewareByNameSuccess (state, body) { - state.middlewareByName = { item: body, loading: false } -} - -export function getMiddlewareByNameFailure (state, error) { - state.middlewareByName = { error } -} - -export function getMiddlewareByNameClear (state) { - state.middlewareByName = {} -} diff --git a/webui/src/store/tcp/mutations.vitest.spec.js b/webui/src/store/tcp/mutations.vitest.spec.js deleted file mode 100644 index 17dc4ff9a..000000000 --- a/webui/src/store/tcp/mutations.vitest.spec.js +++ /dev/null @@ -1,292 +0,0 @@ -import { describe, expect, it } from 'vitest' -import store from './index.js' - -const { - getAllRoutersRequest, - getAllRoutersSuccess, - getAllRoutersFailure, - getAllServicesRequest, - getAllServicesSuccess, - getAllServicesFailure, - getAllMiddlewaresRequest, - getAllMiddlewaresSuccess, - getAllMiddlewaresFailure -} = store.mutations - -describe('tcp mutations', function () { - /* Routers */ - describe('tcp routers mutations', function () { - it('getAllRoutersRequest', function () { - const state = { - allRouters: { - items: [{}, {}, {}] - } - } - - getAllRoutersRequest(state) - - expect(state.allRouters.loading).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - - it('getAllRoutersSuccess page 1', function () { - const state = { - allRouters: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(3) - expect(state.allRouters.items.length).to.equal(3) - expect(state.allRouters.currentPage).to.equal(1) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersSuccess page 2', function () { - const state = { - allRouters: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(7) - expect(state.allRouters.items.length).to.equal(7) - expect(state.allRouters.currentPage).to.equal(2) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersFailing', function () { - const state = { - allRouters: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllRoutersFailure(state, error) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.endReached).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - }) - - /* Services */ - describe('tcp services mutations', function () { - it('getAllServicesRequest', function () { - const state = { - allServices: { - items: [{}, {}, {}] - } - } - - getAllServicesRequest(state) - - expect(state.allServices.loading).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - - it('getAllServicesSuccess page 1', function () { - const state = { - allServices: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(3) - expect(state.allServices.items.length).to.equal(3) - expect(state.allServices.currentPage).to.equal(1) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesSuccess page 2', function () { - const state = { - allServices: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(7) - expect(state.allServices.items.length).to.equal(7) - expect(state.allServices.currentPage).to.equal(2) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesFailing', function () { - const state = { - allServices: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllServicesFailure(state, error) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.endReached).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - }) - - /* Middlewares */ - describe('tcp middlewares mutations', function () { - it('getAllMiddlewaresRequest', function () { - const state = { - allMiddlewares: { - items: [{}, {}, {}] - } - } - - getAllMiddlewaresRequest(state) - - expect(state.allMiddlewares.loading).to.equal(true) - expect(state.allMiddlewares.items.length).to.equal(3) - }) - - it('getAllMiddlewaresSuccess page 1', function () { - const state = { - allMiddlewares: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllMiddlewaresSuccess(state, data) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.total).to.equal(3) - expect(state.allMiddlewares.items.length).to.equal(3) - expect(state.allMiddlewares.currentPage).to.equal(1) - expect(state.allMiddlewares.currentQuery).to.equal('test query') - expect(state.allMiddlewares.currentStatus).to.equal('warning') - }) - - it('getAllMiddlewaresSuccess page 2', function () { - const state = { - allMiddlewares: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllMiddlewaresSuccess(state, data) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.total).to.equal(7) - expect(state.allMiddlewares.items.length).to.equal(7) - expect(state.allMiddlewares.currentPage).to.equal(2) - expect(state.allMiddlewares.currentQuery).to.equal('test query') - expect(state.allMiddlewares.currentStatus).to.equal('warning') - }) - - it('getAllMiddlewaresFailing', function () { - const state = { - allMiddlewares: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllMiddlewaresFailure(state, error) - - expect(state.allMiddlewares.loading).to.equal(false) - expect(state.allMiddlewares.endReached).to.equal(true) - expect(state.allMiddlewares.items.length).to.equal(3) - }) - }) -}) diff --git a/webui/src/store/tcp/state.js b/webui/src/store/tcp/state.js deleted file mode 100644 index 0557a4fdd..000000000 --- a/webui/src/store/tcp/state.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - allRouters: {}, - routerByName: {}, - allServices: {}, - serviceByName: {}, - allMiddlewares: {}, - middlewareByName: {} -} diff --git a/webui/src/store/udp/actions.js b/webui/src/store/udp/actions.js deleted file mode 100644 index 15fe3a7be..000000000 --- a/webui/src/store/udp/actions.js +++ /dev/null @@ -1,53 +0,0 @@ -import UdpService from '../../_services/UdpService' - -export function getAllRouters ({ commit }, params) { - commit('getAllRoutersRequest') - return UdpService.getAllRouters(params) - .then(body => { - commit('getAllRoutersSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllRoutersFailure', error) - return Promise.reject(error) - }) -} - -export function getRouterByName ({ commit }, name) { - commit('getRouterByNameRequest') - return UdpService.getRouterByName(name) - .then(body => { - commit('getRouterByNameSuccess', body) - return body - }) - .catch(error => { - commit('getRouterByNameFailure', error) - return Promise.reject(error) - }) -} - -export function getAllServices ({ commit }, params) { - commit('getAllServicesRequest') - return UdpService.getAllServices(params) - .then(body => { - commit('getAllServicesSuccess', { body, ...params }) - return body - }) - .catch(error => { - commit('getAllServicesFailure', error) - return Promise.reject(error) - }) -} - -export function getServiceByName ({ commit }, name) { - commit('getServiceByNameRequest') - return UdpService.getServiceByName(name) - .then(body => { - commit('getServiceByNameSuccess', body) - return body - }) - .catch(error => { - commit('getServiceByNameFailure', error) - return Promise.reject(error) - }) -} diff --git a/webui/src/store/udp/getters.js b/webui/src/store/udp/getters.js deleted file mode 100644 index 2b9611e94..000000000 --- a/webui/src/store/udp/getters.js +++ /dev/null @@ -1,27 +0,0 @@ -// ---------------------------- -// all Routers -// ---------------------------- -export function allRouters (state) { - return state.allRouters -} - -// ---------------------------- -// Router by Name -// ---------------------------- -export function routerByName (state) { - return state.routerByName -} - -// ---------------------------- -// all Services -// ---------------------------- -export function allServices (state) { - return state.allServices -} - -// ---------------------------- -// Service by Name -// ---------------------------- -export function serviceByName (state) { - return state.serviceByName -} diff --git a/webui/src/store/udp/index.js b/webui/src/store/udp/index.js deleted file mode 100644 index babab8ec5..000000000 --- a/webui/src/store/udp/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import state from './state' -import * as getters from './getters' -import * as mutations from './mutations' -import * as actions from './actions' - -export default { - namespaced: true, - getters, - mutations, - actions, - state -} diff --git a/webui/src/store/udp/mutations.js b/webui/src/store/udp/mutations.js deleted file mode 100644 index 69df42013..000000000 --- a/webui/src/store/udp/mutations.js +++ /dev/null @@ -1,105 +0,0 @@ -import { withPagination } from '../../_helpers/Mutations' - -// ---------------------------- -// Get All Routers -// ---------------------------- -export function getAllRoutersRequest (state) { - withPagination('request', { statePath: 'allRouters' })(state) -} - -export function getAllRoutersSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allRouters - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allRouters = { - ...state.allRouters, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allRouters' - })(state, data) -} - -export function getAllRoutersFailure (state, error) { - withPagination('failure', { statePath: 'allRouters' })(state, error) -} - -export function getAllRoutersClear (state) { - state.allRouters = {} -} - -// ---------------------------- -// Get Router By Name -// ---------------------------- -export function getRouterByNameRequest (state) { - state.routerByName.loading = true -} - -export function getRouterByNameSuccess (state, body) { - state.routerByName = { item: body, loading: false } -} - -export function getRouterByNameFailure (state, error) { - state.routerByName = { error } -} - -export function getRouterByNameClear (state) { - state.routerByName = {} -} - -// ---------------------------- -// Get All Services -// ---------------------------- -export function getAllServicesRequest (state) { - withPagination('request', { statePath: 'allServices' })(state) -} - -export function getAllServicesSuccess (state, data) { - const { query = '', status = '' } = data - const currentState = state.allServices - - const isSameContext = currentState.currentQuery === query && currentState.currentStatus === status - - state.allServices = { - ...state.allServices, - currentQuery: query, - currentStatus: status - } - - withPagination('success', { - isSameContext, - statePath: 'allServices' - })(state, data) -} - -export function getAllServicesFailure (state, error) { - withPagination('failure', { statePath: 'allServices' })(state, error) -} - -export function getAllServicesClear (state) { - state.allServices = {} -} - -// ---------------------------- -// Get Service By Name -// ---------------------------- -export function getServiceByNameRequest (state) { - state.serviceByName.loading = true -} - -export function getServiceByNameSuccess (state, body) { - state.serviceByName = { item: body, loading: false } -} - -export function getServiceByNameFailure (state, error) { - state.serviceByName = { error } -} - -export function getServiceByNameClear (state) { - state.serviceByName = {} -} diff --git a/webui/src/store/udp/mutations.vitest.spec.js b/webui/src/store/udp/mutations.vitest.spec.js deleted file mode 100644 index 4c6b39f63..000000000 --- a/webui/src/store/udp/mutations.vitest.spec.js +++ /dev/null @@ -1,197 +0,0 @@ -import { describe, expect, it } from 'vitest' -import store from './index.js' - -const { - getAllRoutersRequest, - getAllRoutersSuccess, - getAllRoutersFailure, - getAllServicesRequest, - getAllServicesSuccess, - getAllServicesFailure -} = store.mutations - -describe('udp mutations', function () { - /* Routers */ - describe('udp routers mutations', function () { - it('getAllRoutersRequest', function () { - const state = { - allRouters: { - items: [{}, {}, {}] - } - } - - getAllRoutersRequest(state) - - expect(state.allRouters.loading).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - - it('getAllRoutersSuccess page 1', function () { - const state = { - allRouters: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(3) - expect(state.allRouters.items.length).to.equal(3) - expect(state.allRouters.currentPage).to.equal(1) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersSuccess page 2', function () { - const state = { - allRouters: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllRoutersSuccess(state, data) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.total).to.equal(7) - expect(state.allRouters.items.length).to.equal(7) - expect(state.allRouters.currentPage).to.equal(2) - expect(state.allRouters.currentQuery).to.equal('test query') - expect(state.allRouters.currentStatus).to.equal('warning') - }) - - it('getAllRoutersFailing', function () { - const state = { - allRouters: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllRoutersFailure(state, error) - - expect(state.allRouters.loading).to.equal(false) - expect(state.allRouters.endReached).to.equal(true) - expect(state.allRouters.items.length).to.equal(3) - }) - }) - - /* Services */ - describe('udp services mutations', function () { - it('getAllServicesRequest', function () { - const state = { - allServices: { - items: [{}, {}, {}] - } - } - - getAllServicesRequest(state) - - expect(state.allServices.loading).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - - it('getAllServicesSuccess page 1', function () { - const state = { - allServices: { - loading: true - } - } - - const data = { - body: { - data: [{}, {}, {}], - total: 3 - }, - query: 'test query', - status: 'warning', - page: 1 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(3) - expect(state.allServices.items.length).to.equal(3) - expect(state.allServices.currentPage).to.equal(1) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesSuccess page 2', function () { - const state = { - allServices: { - loading: false, - items: [{ id: 1 }, { id: 2 }, { id: 3 }], - total: 3, - currentPage: 1, - currentQuery: 'test query', - currentStatus: 'warning' - } - } - - const data = { - body: { - data: [{ id: 4 }, { id: 5 }, { id: 6 }, { id: 7 }], - total: 4 - }, - query: 'test query', - status: 'warning', - page: 2 - } - - getAllServicesSuccess(state, data) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.total).to.equal(7) - expect(state.allServices.items.length).to.equal(7) - expect(state.allServices.currentPage).to.equal(2) - expect(state.allServices.currentQuery).to.equal('test query') - expect(state.allServices.currentStatus).to.equal('warning') - }) - - it('getAllServicesFailing', function () { - const state = { - allServices: { - items: [{}, {}, {}], - loading: true - } - } - - const error = { message: 'invalid request: page: 3, per_page: 10' } - - getAllServicesFailure(state, error) - - expect(state.allServices.loading).to.equal(false) - expect(state.allServices.endReached).to.equal(true) - expect(state.allServices.items.length).to.equal(3) - }) - }) -}) diff --git a/webui/src/store/udp/state.js b/webui/src/store/udp/state.js deleted file mode 100644 index 0eb429a34..000000000 --- a/webui/src/store/udp/state.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - allRouters: {}, - routerByName: {}, - allServices: {}, - serviceByName: {} -} diff --git a/webui/src/types/global.d.ts b/webui/src/types/global.d.ts new file mode 100644 index 000000000..e1503ed42 --- /dev/null +++ b/webui/src/types/global.d.ts @@ -0,0 +1,9 @@ +interface Window { + APIUrl: string +} + +declare namespace JSX { + interface IntrinsicElements { + 'hub-button-app': React.DetailedHTMLProps, HTMLElement> + } +} diff --git a/webui/src/utils/breakpoints.ts b/webui/src/utils/breakpoints.ts new file mode 100644 index 000000000..9a3202105 --- /dev/null +++ b/webui/src/utils/breakpoints.ts @@ -0,0 +1,9 @@ +export default { + mobileS: '320px', + mobileM: '375px', + mobileL: '425px', + tablet: '768px', + laptop: '1024px', + laptopL: '1440px', + desktop: '2560px', +} diff --git a/webui/src/utils/mocks.ts b/webui/src/utils/mocks.ts new file mode 100644 index 000000000..eda514d6e --- /dev/null +++ b/webui/src/utils/mocks.ts @@ -0,0 +1,11 @@ +export const useFetchWithPaginationMock = (options = {}) => ({ + error: null, + isEmpty: false, + isLoadingMore: false, + isReachingEnd: true, + loadMore: vi.fn, + pageCount: 1, + pageSWRs: [], + pages: null, + ...options, +}) diff --git a/webui/src/utils/position.ts b/webui/src/utils/position.ts new file mode 100644 index 000000000..041c2fa93 --- /dev/null +++ b/webui/src/utils/position.ts @@ -0,0 +1,37 @@ +export type PositionXProps = 'left' | 'center' | 'right' +export type PositionYProps = 'top' | 'bottom' + +export type GetPositionType = { + top?: number + bottom?: number + left?: number + right?: number +} + +export function getPositionValues(positionX: PositionXProps, positionY: PositionYProps): GetPositionType { + const position: GetPositionType = {} + + switch (positionX) { + case 'left': + position.left = 0 + break + case 'center': + position.left = 0 + position.right = 0 + break + case 'right': + position.right = 0 + break + } + + switch (positionY) { + case 'top': + position.top = 0 + break + case 'bottom': + position.bottom = 0 + break + } + + return position +} diff --git a/webui/src/utils/string.ts b/webui/src/utils/string.ts new file mode 100644 index 000000000..d275458d6 --- /dev/null +++ b/webui/src/utils/string.ts @@ -0,0 +1,5 @@ +export const capitalizeFirstLetter = (string: unknown): string | null => { + if (!string) return null + + return string?.toString()?.charAt(0)?.toUpperCase() + string?.toString()?.slice(1) +} diff --git a/webui/src/utils/test.tsx b/webui/src/utils/test.tsx new file mode 100644 index 000000000..2c79760cf --- /dev/null +++ b/webui/src/utils/test.tsx @@ -0,0 +1,45 @@ +import { cleanup, render } from '@testing-library/react' +import { FaencyProvider } from '@traefiklabs/faency' +import { HelmetProvider } from 'react-helmet-async' +import { BrowserRouter } from 'react-router-dom' +import { SWRConfig } from 'swr' +import { afterEach } from 'vitest' + +import fetch from '../libs/fetch' + +afterEach(() => { + cleanup() +}) + +function customRender(ui: React.ReactElement, options = {}) { + return render(ui, { + // wrap provider(s) here if needed + wrapper: ({ children }) => children, + ...options, + }) +} + +// eslint-disable-next-line import/export +export * from '@testing-library/react' +export { default as userEvent } from '@testing-library/user-event' +// override render export +export { customRender as render } // eslint-disable-line import/export + +export function renderWithProviders(ui: React.ReactElement) { + return customRender(ui, { + wrapper: ({ children }) => ( + + + + {children} + + + + ), + }) +} diff --git a/webui/src/utils/wait.ts b/webui/src/utils/wait.ts new file mode 100644 index 000000000..15a408aa7 --- /dev/null +++ b/webui/src/utils/wait.ts @@ -0,0 +1 @@ +export const wait = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/webui/src/vite-env.d.ts b/webui/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/webui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md b/webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md deleted file mode 100644 index 9481a99c3..000000000 --- a/webui/static/DONT-EDIT-FILES-IN-THIS-DIRECTORY.md +++ /dev/null @@ -1 +0,0 @@ -For more information see `webui/readme.md` \ No newline at end of file diff --git a/webui/test/setup.ts b/webui/test/setup.ts new file mode 100644 index 000000000..7c53d16b8 --- /dev/null +++ b/webui/test/setup.ts @@ -0,0 +1,76 @@ +import '@testing-library/jest-dom' +import 'vitest-canvas-mock' + +import * as matchers from 'jest-extended' +import { expect } from 'vitest' + +import { server } from '../src/mocks/server' + +expect.extend(matchers) + +export class IntersectionObserver { + root = null + rootMargin = '' + thresholds = [] + + disconnect() { + return null + } + + observe() { + return null + } + + takeRecords() { + return [] + } + + unobserve() { + return null + } +} + +class ResizeObserver { + observe() { + return null + } + unobserve() { + return null + } + disconnect() { + return null + } +} + +beforeAll(() => { + global.IntersectionObserver = IntersectionObserver + window.IntersectionObserver = IntersectionObserver + + global.ResizeObserver = ResizeObserver + window.ResizeObserver = ResizeObserver + + Object.defineProperty(window, 'matchMedia', { + writable: true, + value: vi.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: vi.fn(), // deprecated + removeListener: vi.fn(), // deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + })), + }) + + Object.defineProperty(window, 'scrollTo', { + writable: true, + value: vi.fn(), + }) + + server.listen({ onUnhandledRequest: 'error' }) +}) + +afterEach(() => server.resetHandlers()) + +afterAll(() => server.close()) diff --git a/webui/test/vitest/setup-file.js b/webui/test/vitest/setup-file.js deleted file mode 100644 index 499204981..000000000 --- a/webui/test/vitest/setup-file.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be run before each test file diff --git a/webui/tsconfig.json b/webui/tsconfig.json new file mode 100644 index 000000000..1c8a6c68b --- /dev/null +++ b/webui/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "node", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "allowSyntheticDefaultImports": true, + "baseUrl": "./src", + "esModuleInterop": true, + "noImplicitAny": false, + "types": ["vitest/globals"], + "paths": { + "react": ["../node_modules/@types/react"] + } + }, + "include": ["src", "test/setup.ts", "types/*.d.ts"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/webui/tsconfig.node.json b/webui/tsconfig.node.json new file mode 100644 index 000000000..97ede7ee6 --- /dev/null +++ b/webui/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/webui/vite.config.ts b/webui/vite.config.ts new file mode 100644 index 000000000..4cabcd2f4 --- /dev/null +++ b/webui/vite.config.ts @@ -0,0 +1,28 @@ +/// +/// + +import react from '@vitejs/plugin-react' +import { defineConfig, loadEnv } from 'vite' +import viteTsconfigPaths from 'vite-tsconfig-paths' + +export default ({ mode }: { mode: string }) => { + process.env = { ...process.env, ...loadEnv(mode, process.cwd()) } + + return defineConfig({ + base: process.env.VITE_APP_BASE_URL || '', + plugins: [react(), viteTsconfigPaths()], + server: { + open: 'index.dev.html', + port: 3000, + }, + build: { + emptyOutDir: true, + outDir: './static', + }, + test: { + environment: 'jsdom', + globals: true, + setupFiles: './test/setup.ts', + }, + }) +} diff --git a/webui/vitest.config.mjs b/webui/vitest.config.mjs deleted file mode 100644 index bb3c6d45d..000000000 --- a/webui/vitest.config.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import { defineConfig } from 'vitest/config'; -import vue from '@vitejs/plugin-vue'; -import { quasar, transformAssetUrls } from '@quasar/vite-plugin'; -import jsconfigPaths from 'vite-jsconfig-paths'; - -// https://vitejs.dev/config/ -export default defineConfig({ - test: { - environment: 'happy-dom', - setupFiles: 'test/vitest/setup-file.js', - include: [ - // Matches vitest tests in any subfolder of 'src' or into 'test/vitest/__tests__' - // Matches all files with extension 'js', 'jsx', 'ts' and 'tsx' - 'src/**/*.vitest.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}', - ], - }, - plugins: [ - vue({ - template: { transformAssetUrls }, - }), - quasar(), - jsconfigPaths(), - ], -}); diff --git a/webui/yarn.lock b/webui/yarn.lock index d625882fb..5e1c92fe9 100644 --- a/webui/yarn.lock +++ b/webui/yarn.lock @@ -1,6394 +1,17106 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" - integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== - dependencies: - "@babel/highlight" "^7.25.7" - picocolors "^1.0.0" - -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.7.tgz#b8479fe0018ef0ac87b6b7a5c6916fcd67ae2c9c" - integrity sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw== - -"@babel/core@^7.12.0", "@babel/core@^7.23.9": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.7.tgz#1b3d144157575daf132a3bc80b2b18e6e3ca6ece" - integrity sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helpers" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@^7.23.10": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz#27b43de786c83cbabbcb328efbb4f099ae85415e" - integrity sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - -"@babel/generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" - integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== - dependencies: - "@babel/types" "^7.25.7" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" - integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA== - dependencies: - "@babel/types" "^7.25.7" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622" - integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7", "@babel/helper-compilation-targets@^7.9.6": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" - integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== - dependencies: - "@babel/compat-data" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" - integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/traverse" "^7.25.7" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e" - integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - regexpu-core "^6.1.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" - integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-member-expression-to-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574" - integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-module-imports@^7.25.7", "@babel/helper-module-imports@^7.8.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" - integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-module-transforms@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" - integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-optimise-call-expression@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" - integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng== - dependencies: - "@babel/types" "^7.25.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" - integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== - -"@babel/helper-remap-async-to-generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021" - integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-wrap-function" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-replace-supers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" - integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.7" - "@babel/helper-optimise-call-expression" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/helper-simple-access@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" - integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-skip-transparent-expression-wrappers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" - integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA== - dependencies: - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helper-string-parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" - integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== - -"@babel/helper-validator-identifier@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" - integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== - -"@babel/helper-validator-option@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" - integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== - -"@babel/helper-wrap-function@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7" - integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg== - dependencies: - "@babel/template" "^7.25.7" - "@babel/traverse" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/helpers@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2" - integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA== - dependencies: - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/highlight@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" - integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.25.3", "@babel/parser@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.7.tgz#99b927720f4ddbfeb8cd195a363ed4532f87c590" - integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw== - dependencies: - "@babel/types" "^7.25.7" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64" - integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046" - integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4" - integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a" - integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/plugin-transform-optional-chaining" "^7.25.7" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5" - integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/plugin-proposal-decorators@^7.4.4": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz#dabfd82df5dff3a8fc61a434233bf8227c88402c" - integrity sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-decorators" "^7.25.7" - -"@babel/plugin-proposal-function-sent@^7.2.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.25.7.tgz#3b15497a959228f3b33faed83bbc5f0946f64696" - integrity sha512-ZsNyYHzDAXuJWqSc5YhtAOx7GR8itltKU6iMJhqheo4rGu/YrL5Mr+4ju5bEUErHEQKOEo4DnxBv8mDPelZ3vg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-wrap-function" "^7.25.7" - "@babel/plugin-syntax-function-sent" "^7.25.7" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-proposal-throw-expressions@^7.2.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.25.7.tgz#2359c72ed372d910ab02d6071154d67468ed5d5e" - integrity sha512-dRhgWKBKoe5o0RqP6sRE0wpVzyMKPE9VPyRObwDG34GnC4KuGx2OIDs4vbrm5BVT4EZy1h9uJlSUfKS4vSKiXA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-throw-expressions" "^7.25.7" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz#cf26fdde4e750688e133c0e33ead2506377e88f7" - integrity sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-function-sent@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.25.7.tgz#7da218f24a83fb79f3cf05ddf81cac01647e462b" - integrity sha512-pHEG0epLjZM9aJsL9rwaT+YaEOSRQbjcc5T8EUIZGf9JB7CBDi/rmQuIMQ3kvvIPBqCsPj9MTFdGxqT5QkHZSg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-import-assertions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f" - integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-import-attributes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f" - integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.2.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-throw-expressions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.25.7.tgz#6ddccb389800b3db0ad74aebb3eb6d5803fba488" - integrity sha512-UydaKYt9Iw3iay5ylLxE/nEUYjGAptjqrzi+VZvkm9bx0dzPw4R0CXBvataxrlEeWX2YRvWmX6CxkD9Tn6o+LA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386" - integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-async-generator-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz#af61a02b30d7bff5108c63bd39ac7938403426d7" - integrity sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-remap-async-to-generator" "^7.25.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/traverse" "^7.25.7" - -"@babel/plugin-transform-async-to-generator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" - integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-remap-async-to-generator" "^7.25.7" - -"@babel/plugin-transform-block-scoped-functions@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c" - integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-block-scoping@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" - integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-class-properties@^7.23.3", "@babel/plugin-transform-class-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523" - integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-class-static-block@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz#d2cf3c812e3b3162d56aadf4566f45c30538cb2c" - integrity sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb" - integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - "@babel/traverse" "^7.25.7" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65" - integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/template" "^7.25.7" - -"@babel/plugin-transform-destructuring@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560" - integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-dotall-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02" - integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-duplicate-keys@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93" - integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141" - integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-dynamic-import@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz#31905ab2cfa94dcf1b1f8ce66096720b2908e518" - integrity sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f" - integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-export-namespace-from@^7.23.4", "@babel/plugin-transform-export-namespace-from@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz#beb2679db6fd3bdfe6ad6de2c8cac84a86ef2da1" - integrity sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669" - integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - -"@babel/plugin-transform-function-name@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd" - integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ== - dependencies: - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/plugin-transform-json-strings@^7.23.4", "@babel/plugin-transform-json-strings@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz#6626433554aff4bd6f76a2c621a1f40e802dfb0a" - integrity sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3" - integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-logical-assignment-operators@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz#93847feb513a1f191c5f5d903d991a0ee24fe99b" - integrity sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5" - integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-modules-amd@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d" - integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA== - dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-modules-commonjs@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" - integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg== - dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-simple-access" "^7.25.7" - -"@babel/plugin-transform-modules-systemjs@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b" - integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g== - dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - "@babel/traverse" "^7.25.7" - -"@babel/plugin-transform-modules-umd@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367" - integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw== - dependencies: - "@babel/helper-module-transforms" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d" - integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-new-target@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9" - integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz#0af84b86d4332654c43cf028dbdcf878b00ac168" - integrity sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.23.4", "@babel/plugin-transform-numeric-separator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz#a516b78f894d1c08283f39d809b2048fd2f29448" - integrity sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz#fa0916521be96fd434e2db59780b24b308c6d169" - integrity sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg== - dependencies: - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.25.7" - -"@babel/plugin-transform-object-super@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661" - integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-replace-supers" "^7.25.7" - -"@babel/plugin-transform-optional-catch-binding@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz#400e2d891f9288f5231694234696aa67164e4913" - integrity sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz#b7f7c9321aa1d8414e67799c28d87c23682e4d68" - integrity sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7" - integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-private-methods@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80" - integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-private-property-in-object@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz#aff877efd05b57c4ad04611d8de97bf155a53369" - integrity sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.7" - "@babel/helper-create-class-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d" - integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-regenerator@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e" - integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - regenerator-transform "^0.15.2" - -"@babel/plugin-transform-reserved-words@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995" - integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-runtime@^7.9.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12" - integrity sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg== - dependencies: - "@babel/helper-module-imports" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.6" - babel-plugin-polyfill-regenerator "^0.6.1" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f" - integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-spread@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998" - integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" - -"@babel/plugin-transform-sticky-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17" - integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-template-literals@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b" - integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-typeof-symbol@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb" - integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-unicode-escapes@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81" - integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-unicode-property-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e" - integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-unicode-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809" - integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/plugin-transform-unicode-sets-regex@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c" - integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - -"@babel/preset-env@^7.9.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.7.tgz#fc1b092152db4b58377b85dc05c890081c1157e0" - integrity sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g== - dependencies: - "@babel/compat-data" "^7.25.7" - "@babel/helper-compilation-targets" "^7.25.7" - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.7" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.7" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.25.7" - "@babel/plugin-syntax-import-attributes" "^7.25.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.25.7" - "@babel/plugin-transform-async-generator-functions" "^7.25.7" - "@babel/plugin-transform-async-to-generator" "^7.25.7" - "@babel/plugin-transform-block-scoped-functions" "^7.25.7" - "@babel/plugin-transform-block-scoping" "^7.25.7" - "@babel/plugin-transform-class-properties" "^7.25.7" - "@babel/plugin-transform-class-static-block" "^7.25.7" - "@babel/plugin-transform-classes" "^7.25.7" - "@babel/plugin-transform-computed-properties" "^7.25.7" - "@babel/plugin-transform-destructuring" "^7.25.7" - "@babel/plugin-transform-dotall-regex" "^7.25.7" - "@babel/plugin-transform-duplicate-keys" "^7.25.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.7" - "@babel/plugin-transform-dynamic-import" "^7.25.7" - "@babel/plugin-transform-exponentiation-operator" "^7.25.7" - "@babel/plugin-transform-export-namespace-from" "^7.25.7" - "@babel/plugin-transform-for-of" "^7.25.7" - "@babel/plugin-transform-function-name" "^7.25.7" - "@babel/plugin-transform-json-strings" "^7.25.7" - "@babel/plugin-transform-literals" "^7.25.7" - "@babel/plugin-transform-logical-assignment-operators" "^7.25.7" - "@babel/plugin-transform-member-expression-literals" "^7.25.7" - "@babel/plugin-transform-modules-amd" "^7.25.7" - "@babel/plugin-transform-modules-commonjs" "^7.25.7" - "@babel/plugin-transform-modules-systemjs" "^7.25.7" - "@babel/plugin-transform-modules-umd" "^7.25.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.7" - "@babel/plugin-transform-new-target" "^7.25.7" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.7" - "@babel/plugin-transform-numeric-separator" "^7.25.7" - "@babel/plugin-transform-object-rest-spread" "^7.25.7" - "@babel/plugin-transform-object-super" "^7.25.7" - "@babel/plugin-transform-optional-catch-binding" "^7.25.7" - "@babel/plugin-transform-optional-chaining" "^7.25.7" - "@babel/plugin-transform-parameters" "^7.25.7" - "@babel/plugin-transform-private-methods" "^7.25.7" - "@babel/plugin-transform-private-property-in-object" "^7.25.7" - "@babel/plugin-transform-property-literals" "^7.25.7" - "@babel/plugin-transform-regenerator" "^7.25.7" - "@babel/plugin-transform-reserved-words" "^7.25.7" - "@babel/plugin-transform-shorthand-properties" "^7.25.7" - "@babel/plugin-transform-spread" "^7.25.7" - "@babel/plugin-transform-sticky-regex" "^7.25.7" - "@babel/plugin-transform-template-literals" "^7.25.7" - "@babel/plugin-transform-typeof-symbol" "^7.25.7" - "@babel/plugin-transform-unicode-escapes" "^7.25.7" - "@babel/plugin-transform-unicode-property-regex" "^7.25.7" - "@babel/plugin-transform-unicode-regex" "^7.25.7" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.7" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.6" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.38.1" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/runtime@^7.8.4", "@babel/runtime@^7.9.0": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" - integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/types" "^7.25.7" - -"@babel/traverse@^7.25.7": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" - integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== - dependencies: - "@babel/code-frame" "^7.25.7" - "@babel/generator" "^7.25.7" - "@babel/parser" "^7.25.7" - "@babel/template" "^7.25.7" - "@babel/types" "^7.25.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.25.7", "@babel/types@^7.4.4": - version "7.25.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.7.tgz#1b7725c1d3a59f328cb700ce704c46371e6eef9b" - integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ== - dependencies: - "@babel/helper-string-parser" "^7.25.7" - "@babel/helper-validator-identifier" "^7.25.7" - to-fast-properties "^2.0.0" - -"@bufbuild/protobuf@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.1.0.tgz#6925f30c25789b4f74d7c505e731c96f79fb48a7" - integrity sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A== - -"@cush/relative@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cush/relative/-/relative-1.0.0.tgz#8cd1769bf9bde3bb27dac356b1bc94af40f6cc16" - integrity sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/aix-ppc64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" - integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" - integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-arm@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" - integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/android-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" - integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" - integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/darwin-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" - integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" - integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/freebsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" - integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" - integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-arm@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" - integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-ia32@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" - integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-loong64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" - integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-mips64el@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" - integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-ppc64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" - integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-riscv64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" - integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-s390x@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" - integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/linux-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" - integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/netbsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" - integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== - -"@esbuild/openbsd-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" - integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/openbsd-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" - integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/sunos-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" - integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-arm64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" - integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-ia32@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" - integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@esbuild/win32-x64@0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" - integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== - -"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" - integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@inquirer/figures@^1.0.3": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.7.tgz#d050ccc0eabfacc0248c4ff647a9dfba1b01594b" - integrity sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@kurkle/color@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" - integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@one-ini/wasm@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" - integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@quasar/app-vite@^2.0.0-beta.15": - version "2.0.0-beta.22" - resolved "https://registry.yarnpkg.com/@quasar/app-vite/-/app-vite-2.0.0-beta.22.tgz#0148c930893d5463063eac2f7f8f42f8d43ed050" - integrity sha512-UjEi0+YBcNALx8uTe0hzTAjd1uYmfwsibaxNE2fX0p1CA/yTV+jTrPv3+mswBhHfD4oLdoWp4W0LvYDMi+Ztqw== - dependencies: - "@quasar/render-ssr-error" "^1.0.3" - "@quasar/ssl-certificate" "^1.0.0" - "@quasar/vite-plugin" "^1.7.0" - "@types/chrome" "^0.0.262" - "@types/compression" "^1.7.5" - "@types/cordova" "^11.0.3" - "@types/express" "^4.17.21" - "@vitejs/plugin-vue" "^5.1.3" - archiver "^7.0.1" - chokidar "^3.6.0" - ci-info "^4.0.0" - compression "^1.7.4" - cross-spawn "^7.0.3" - dot-prop "9.0.0" - dotenv "^16.4.5" - dotenv-expand "^11.0.6" - elementtree "0.1.7" - esbuild "^0.23.1" - express "^4.21.0" - fast-glob "3.3.2" - fs-extra "^11.2.0" - html-minifier-terser "^7.2.0" - inquirer "^9.3.6" - isbinaryfile "^5.0.2" - kolorist "^1.8.0" - lodash "^4.17.21" - minimist "^1.2.8" - open "^10.1.0" - rollup-plugin-visualizer "^5.12.0" - sass-embedded "^1.79.1" - semver "^7.6.3" - serialize-javascript "^6.0.2" - ts-essentials "^9.4.2" - vite "^5.4.5" - webpack-merge "^6.0.1" - -"@quasar/babel-preset-app@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@quasar/babel-preset-app/-/babel-preset-app-2.0.3.tgz#7f821e17eac7fdeee48e44e56eb01e848f369ec7" - integrity sha512-PYvVXU/TBwF1JU+nEKw8VTsbNi4mdhu7l+l9HIqfY0XZGWbDQLOGjBR8TO6A8dn5SUoilvRh85TG3ZQV01VCBQ== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.9.6" - "@babel/helper-module-imports" "^7.8.3" - "@babel/plugin-proposal-decorators" "^7.4.4" - "@babel/plugin-proposal-function-sent" "^7.2.0" - "@babel/plugin-proposal-throw-expressions" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-import-meta" "^7.2.0" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-runtime" "^7.9.0" - "@babel/preset-env" "^7.9.0" - "@babel/runtime" "^7.9.0" - babel-loader "^9.1.2" - babel-plugin-dynamic-import-node "^2.3.0" - babel-plugin-module-resolver "^5.0.0" - core-js "^3.6.5" - core-js-compat "^3.6.5" - -"@quasar/extras@^1.16.12": - version "1.16.12" - resolved "https://registry.yarnpkg.com/@quasar/extras/-/extras-1.16.12.tgz#2dac82eac8bb6b069a677d2817e479261d51f234" - integrity sha512-hLlb3Buxo38Xg/2w0BTkz98RBh/VH8apZ2r6Fl8YpPgrVQ0diHyN/BVTvIOk5Kch2y38L2kvwOIddsB2UcCuIg== - -"@quasar/quasar-app-extension-testing-unit-vitest@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@quasar/quasar-app-extension-testing-unit-vitest/-/quasar-app-extension-testing-unit-vitest-1.1.0.tgz#d7c602ecc0db0925e05a8b174b832d4f2766a798" - integrity sha512-9HZUjBx/TF4Un2Alcgz4GDVZbZtSth2De7Q2KIfqFNc3IwpYtzg9XQNYDDialQS+KTe7qTKxH31ohjrvY+HCVw== - dependencies: - happy-dom "^15.0.0" - lodash-es "^4.17.21" - vite-jsconfig-paths "^2.0.1" - vite-tsconfig-paths "^4.3.1" - -"@quasar/render-ssr-error@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@quasar/render-ssr-error/-/render-ssr-error-1.0.3.tgz#33f27231007d1b222de41d3d70c29a6d14f9498a" - integrity sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg== - dependencies: - stack-trace "^1.0.0-pre2" - -"@quasar/ssl-certificate@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@quasar/ssl-certificate/-/ssl-certificate-1.0.0.tgz#8126d99241ea1558ed14f31cf5003fc5cacdd891" - integrity sha512-RhZF7rO76T7Ywer1/5lCe7xl3CIiXxSAH1xgwOj0wcHTityDxJqIN/5YIj6BxMvlFw8XkJDoB1udEQafoVFA4g== - dependencies: - fs-extra "^11.1.1" - selfsigned "^2.1.1" - -"@quasar/vite-plugin@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@quasar/vite-plugin/-/vite-plugin-1.7.0.tgz#8873391ed7f69677948180f6eb14aa0821747478" - integrity sha512-ia4w1n4DuPYm92MQLPNpMqLJID1WGGRyVGxkVeg8V+V25Vh3p9QBo++iuXR4sW/bCmzzx66Ko6VStsr1zp90GQ== - -"@rollup/rollup-android-arm-eabi@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" - integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== - -"@rollup/rollup-android-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" - integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== - -"@rollup/rollup-darwin-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f" - integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== - -"@rollup/rollup-darwin-x64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" - integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" - integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== - -"@rollup/rollup-linux-arm-musleabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" - integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== - -"@rollup/rollup-linux-arm64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" - integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== - -"@rollup/rollup-linux-arm64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" - integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" - integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== - -"@rollup/rollup-linux-riscv64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" - integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== - -"@rollup/rollup-linux-s390x-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" - integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== - -"@rollup/rollup-linux-x64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" - integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== - -"@rollup/rollup-linux-x64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" - integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== - -"@rollup/rollup-win32-arm64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" - integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== - -"@rollup/rollup-win32-ia32-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" - integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== - -"@rollup/rollup-win32-x64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" - integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/chrome@^0.0.262": - version "0.0.262" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.262.tgz#7c188d946da51216a558342637393c998bb85dd2" - integrity sha512-TOoj3dqSYE13PD2fRuMQ6X6pggEvL9rRk/yOYOyWE6sfqRWxsJm4VoVm+wr9pkr4Sht/M5t7FFL4vXato8d1gA== - dependencies: - "@types/filesystem" "*" - "@types/har-format" "*" - -"@types/compression@^1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.5.tgz#0f80efef6eb031be57b12221c4ba6bc3577808f7" - integrity sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg== - dependencies: - "@types/express" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cordova@^11.0.3": - version "11.0.3" - resolved "https://registry.yarnpkg.com/@types/cordova/-/cordova-11.0.3.tgz#4301b1c614899c1c99a83aac45914285462201b7" - integrity sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg== - -"@types/estree@1.0.6", "@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" - integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/express@^4.17.21": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/filesystem@*": - version "0.0.36" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857" - integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA== - dependencies: - "@types/filewriter" "*" - -"@types/filewriter@*": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" - integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== - -"@types/har-format@*": - version "1.2.16" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.16.tgz#b71ede8681400cc08b3685f061c31e416cf94944" - integrity sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "22.7.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" - integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== - dependencies: - undici-types "~6.19.2" - -"@types/qs@*": - version "6.9.16" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" - integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -"@vitejs/plugin-vue@^5.1.3": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz#72b8b705cfce36b00b59af196195146e356500c4" - integrity sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A== - -"@vitest/expect@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" - integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== - dependencies: - "@vitest/spy" "1.6.0" - "@vitest/utils" "1.6.0" - chai "^4.3.10" - -"@vitest/runner@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" - integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== - dependencies: - "@vitest/utils" "1.6.0" - p-limit "^5.0.0" - pathe "^1.1.1" - -"@vitest/snapshot@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" - integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" - -"@vitest/spy@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" - integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== - dependencies: - tinyspy "^2.2.0" - -"@vitest/utils@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" - integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== - dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" - -"@vue/compiler-core@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.11.tgz#3dcd0c1bab10732f44ab1790735afb03a4b69edc" - integrity sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg== - dependencies: - "@babel/parser" "^7.25.3" - "@vue/shared" "3.5.11" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.2.0" - -"@vue/compiler-dom@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.11.tgz#950f8fc610e26326fed008b8d102cc8ee78a6ce5" - integrity sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew== - dependencies: - "@vue/compiler-core" "3.5.11" - "@vue/shared" "3.5.11" - -"@vue/compiler-sfc@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.11.tgz#68ba7bc6fed4fec6892aed118cb3ee8e4b180d06" - integrity sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw== - dependencies: - "@babel/parser" "^7.25.3" - "@vue/compiler-core" "3.5.11" - "@vue/compiler-dom" "3.5.11" - "@vue/compiler-ssr" "3.5.11" - "@vue/shared" "3.5.11" - estree-walker "^2.0.2" - magic-string "^0.30.11" - postcss "^8.4.47" - source-map-js "^1.2.0" - -"@vue/compiler-ssr@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.11.tgz#02d9891c7a649bbf06490ecd8d24dd1575d53e60" - integrity sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA== - dependencies: - "@vue/compiler-dom" "3.5.11" - "@vue/shared" "3.5.11" - -"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.6.4": - version "6.6.4" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343" - integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g== - -"@vue/reactivity@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.11.tgz#d27df4fba10c2de1c7234701f18247a775b7a391" - integrity sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w== - dependencies: - "@vue/shared" "3.5.11" - -"@vue/runtime-core@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.11.tgz#7beccd013efe5d33981ffd6b6e05d0a5b9058316" - integrity sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA== - dependencies: - "@vue/reactivity" "3.5.11" - "@vue/shared" "3.5.11" - -"@vue/runtime-dom@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.11.tgz#14a3181ab7057de41b345b4b3d37b744b3ff8ff5" - integrity sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ== - dependencies: - "@vue/reactivity" "3.5.11" - "@vue/runtime-core" "3.5.11" - "@vue/shared" "3.5.11" - csstype "^3.1.3" - -"@vue/server-renderer@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.11.tgz#74f558371dfc39f3b0f26f95d089a1a4d1676027" - integrity sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA== - dependencies: - "@vue/compiler-ssr" "3.5.11" - "@vue/shared" "3.5.11" - -"@vue/shared@3.5.11": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.11.tgz#464b840afc89be9373addff9eeb9dfc98bf3fe2e" - integrity sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ== - -"@vue/test-utils@^2.4.4": - version "2.4.6" - resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" - integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow== - dependencies: - js-beautify "^1.14.9" - vue-component-type-helpers "^2.0.0" - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.12.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -archiver-utils@^5.0.0, archiver-utils@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-5.0.2.tgz#63bc719d951803efc72cf961a56ef810760dd14d" - integrity sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA== - dependencies: - glob "^10.0.0" - graceful-fs "^4.2.0" - is-stream "^2.0.1" - lazystream "^1.0.0" - lodash "^4.17.15" - normalize-path "^3.0.0" - readable-stream "^4.0.0" - -archiver@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-7.0.1.tgz#c9d91c350362040b8927379c7aa69c0655122f61" - integrity sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ== - dependencies: - archiver-utils "^5.0.2" - async "^3.2.4" - buffer-crc32 "^1.0.0" - readable-stream "^4.0.0" - readdir-glob "^1.1.2" - tar-stream "^3.0.0" - zip-stream "^6.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array.prototype.findlastindex@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -async@^3.2.4: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -autoprefixer@^10.4.2: - version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" - integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== - dependencies: - browserslist "^4.23.3" - caniuse-lite "^1.0.30001646" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.1" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.7.4: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -b4a@^1.6.4: - version "1.6.7" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" - integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== - -babel-loader@^9.1.2: - version "9.2.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" - integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== - dependencies: - find-cache-dir "^4.0.0" - schema-utils "^4.0.0" - -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-module-resolver@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz#cdeac5d4aaa3b08dd1ac23ddbf516660ed2d293e" - integrity sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg== - dependencies: - find-babel-config "^2.1.1" - glob "^9.3.3" - pkg-up "^3.1.0" - reselect "^4.1.7" - resolve "^1.22.8" - -babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.11" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" - integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.10.6: - version "0.10.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" - integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - core-js-compat "^3.38.0" - -babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" - integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.2" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bare-events@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.0.tgz#305b511e262ffd8b9d5616b056464f8e1b3329cc" - integrity sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.23.3, browserslist@^4.24.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" - integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== - dependencies: - caniuse-lite "^1.0.30001663" - electron-to-chromium "^1.5.28" - node-releases "^2.0.18" - update-browserslist-db "^1.1.0" - -buffer-builder@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" - integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== - -buffer-crc32@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-1.0.0.tgz#a10993b9055081d55304bd9feb4a072de179f405" - integrity sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -builtins@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: - version "1.0.30001667" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz#99fc5ea0d9c6e96897a104a8352604378377f949" - integrity sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw== - -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chart.js@^4.4.1: - version "4.4.4" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.4.tgz#b682d2e7249f7a0cbb1b1d31c840266ae9db64b7" - integrity sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA== - dependencies: - "@kurkle/color" "^0.3.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" - integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== - -clean-css@~5.3.2: - version "5.3.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" - integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== - dependencies: - source-map "~0.6.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorjs.io@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef" - integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -compress-commons@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-6.0.2.tgz#26d31251a66b9d6ba23a84064ecd3a6a71d2609e" - integrity sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg== - dependencies: - crc-32 "^1.2.0" - crc32-stream "^6.0.0" - is-stream "^2.0.1" - normalize-path "^3.0.0" - readable-stream "^4.0.0" - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - -config-chain@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0, cookie@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -core-js-compat@^3.38.0, core-js-compat@^3.38.1, core-js-compat@^3.6.5: - version "3.38.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" - integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== - dependencies: - browserslist "^4.23.3" - -core-js@^3.35.1, core-js@^3.6.5: - version "3.38.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e" - integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -crc32-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-6.0.0.tgz#8529a3868f8b27abb915f6c3617c0fadedbf9430" - integrity sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g== - dependencies: - crc-32 "^1.2.0" - readable-stream "^4.0.0" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -decode-uri-component@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" - integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== - -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== - -default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92" - integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ== - dependencies: - type-fest "^4.18.2" - -dot-prop@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-8.0.2.tgz#afda6866610684dd155a96538f8efcdf78a27f18" - integrity sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ== - dependencies: - type-fest "^3.8.0" - -dotenv-expand@^11.0.6: - version "11.0.6" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.6.tgz#f2c840fd924d7c77a94eff98f153331d876882d3" - integrity sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g== - dependencies: - dotenv "^16.4.4" - -dotenv@^16.4.4, dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -editorconfig@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" - integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== - dependencies: - "@one-ini/wasm" "0.1.1" - commander "^10.0.0" - minimatch "9.0.1" - semver "^7.5.3" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.5.28: - version "1.5.33" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz#8f64698661240e70fdbc4b032e6085e391f05e09" - integrity sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA== - -elementtree@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/elementtree/-/elementtree-0.1.7.tgz#9ac91be6e52fb6e6244c4e54a4ac3ed8ae8e29c0" - integrity sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg== - dependencies: - sax "1.1.4" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -entities@^4.4.0, entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -esbuild@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" - integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.23.1" - "@esbuild/android-arm" "0.23.1" - "@esbuild/android-arm64" "0.23.1" - "@esbuild/android-x64" "0.23.1" - "@esbuild/darwin-arm64" "0.23.1" - "@esbuild/darwin-x64" "0.23.1" - "@esbuild/freebsd-arm64" "0.23.1" - "@esbuild/freebsd-x64" "0.23.1" - "@esbuild/linux-arm" "0.23.1" - "@esbuild/linux-arm64" "0.23.1" - "@esbuild/linux-ia32" "0.23.1" - "@esbuild/linux-loong64" "0.23.1" - "@esbuild/linux-mips64el" "0.23.1" - "@esbuild/linux-ppc64" "0.23.1" - "@esbuild/linux-riscv64" "0.23.1" - "@esbuild/linux-s390x" "0.23.1" - "@esbuild/linux-x64" "0.23.1" - "@esbuild/netbsd-x64" "0.23.1" - "@esbuild/openbsd-arm64" "0.23.1" - "@esbuild/openbsd-x64" "0.23.1" - "@esbuild/sunos-x64" "0.23.1" - "@esbuild/win32-arm64" "0.23.1" - "@esbuild/win32-ia32" "0.23.1" - "@esbuild/win32-x64" "0.23.1" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-compat-utils@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" - integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== - dependencies: - semver "^7.5.4" - -eslint-config-standard@^17.0.0: - version "17.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" - integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" - integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== - dependencies: - debug "^3.2.7" - -eslint-plugin-es-x@^7.5.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" - integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== - dependencies: - "@eslint-community/eslint-utils" "^4.1.2" - "@eslint-community/regexpp" "^4.11.0" - eslint-compat-utils "^0.5.1" - -eslint-plugin-import@^2.19.1: - version "2.31.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" - integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.8" - array.prototype.findlastindex "^1.2.5" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.0" - hasown "^2.0.2" - is-core-module "^2.15.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.0" - semver "^6.3.1" - string.prototype.trimend "^1.0.8" - tsconfig-paths "^3.15.0" - -eslint-plugin-n@^16.6.2: - version "16.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz#6a60a1a376870064c906742272074d5d0b412b0b" - integrity sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - builtins "^5.0.1" - eslint-plugin-es-x "^7.5.0" - get-tsconfig "^4.7.0" - globals "^13.24.0" - ignore "^5.2.4" - is-builtin-module "^3.2.1" - is-core-module "^2.12.1" - minimatch "^3.1.2" - resolve "^1.22.2" - semver "^7.5.3" - -eslint-plugin-promise@^6.0.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" - integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== - -eslint-plugin-vue@^9.0.0: - version "9.28.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz#e4412f0c1024bafd15ffeaa6f76f4c99152e2765" - integrity sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - globals "^13.24.0" - natural-compare "^1.4.0" - nth-check "^2.1.1" - postcss-selector-parser "^6.0.15" - semver "^7.6.3" - vue-eslint-parser "^9.4.3" - xml-name-validator "^4.0.0" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1, eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8.11.0: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.3.1, espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.0, esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -express@^4.21.0: - version "4.21.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" - integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.10" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-glob@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.2.tgz#d78b298cf70fd3b752fd951175a3da6a7b48f024" - integrity sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -filter-obj@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" - integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-babel-config@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.2.tgz#2841b1bfbbbcdb971e1e39df8cbc43dafa901716" - integrity sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg== - dependencies: - json5 "^2.2.3" - -find-cache-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" - integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== - dependencies: - common-path-prefix "^3.0.0" - pkg-dir "^7.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" - integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== - dependencies: - locate-path "^7.1.0" - path-exists "^5.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^11.1.1, fs-extra@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.7.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" - integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-regex@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/glob-regex/-/glob-regex-0.3.2.tgz#27348f2f60648ec32a4a53137090b9fb934f3425" - integrity sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw== - -glob@^10.0.0, glob@^10.3.10, glob@^10.3.3: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^9.3.3: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0, globals@^13.24.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -happy-dom@^15.0.0: - version "15.7.4" - resolved "https://registry.yarnpkg.com/happy-dom/-/happy-dom-15.7.4.tgz#05aade59c1d307336001b7004c76dfc6a829f220" - integrity sha512-r1vadDYGMtsHAAsqhDuk4IpPvr6N8MGKy5ntBo7tSdim+pWDxus2PNqOcOt8LuDZ4t3KJHE+gCuzupcx/GKnyQ== - dependencies: - entities "^4.5.0" - webidl-conversions "^7.0.0" - whatwg-mimetype "^3.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-minifier-terser@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" - integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== - dependencies: - camel-case "^4.1.2" - clean-css "~5.3.2" - commander "^10.0.0" - entities "^4.4.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.15.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -immutable@^4.0.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^9.3.6: - version "9.3.7" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.7.tgz#0b562bf843812208844741c9aec9244c939b83d4" - integrity sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w== - dependencies: - "@inquirer/figures" "^1.0.3" - ansi-escapes "^4.3.2" - cli-width "^4.1.0" - external-editor "^3.1.0" - mute-stream "1.0.0" - ora "^5.4.1" - run-async "^3.0.0" - rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isbinaryfile@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz#fe6e4dfe2e34e947ffa240c113444876ba393ae0" - integrity sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -js-beautify@^1.14.9: - version "1.15.1" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64" - integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA== - dependencies: - config-chain "^1.1.13" - editorconfig "^1.0.4" - glob "^10.3.3" - js-cookie "^3.0.5" - nopt "^7.2.0" - -js-cookie@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" - integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" - integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2, jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kolorist@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" - integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== - -lazystream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" - integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== - dependencies: - readable-stream "^2.0.5" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -local-pkg@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" - integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== - dependencies: - mlly "^1.4.2" - pkg-types "^1.0.3" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.isequal@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -magic-string@^0.30.11, magic-string@^0.30.5: - version "0.30.11" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" - integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -"mime-db@>= 1.43.0 < 2": - version "1.53.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" - integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== - -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -minimatch@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.1.0: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mlly@^1.4.2, mlly@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.2.tgz#21c0d04543207495b8d867eff0ac29fac9a023c0" - integrity sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA== - dependencies: - acorn "^8.12.1" - pathe "^1.1.2" - pkg-types "^1.2.0" - ufo "^1.5.4" - -moment@^2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== - -nopt@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" - integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== - dependencies: - abbrev "^2.0.0" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -nth-check@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" - integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^3.1.0" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1, path-scurry@^1.6.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -pathe@^1.1.1, pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" - integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" - integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== - dependencies: - find-up "^6.3.0" - -pkg-types@^1.0.3, pkg-types@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.1.tgz#6ac4e455a5bb4b9a6185c1c79abd544c901db2e5" - integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw== - dependencies: - confbox "^0.1.8" - mlly "^1.7.2" - pathe "^1.1.2" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-selector-parser@^6.0.15: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.14, postcss@^8.4.43, postcss@^8.4.47: - version "8.4.47" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" - integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.1.0" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -quasar@^2.16.6: - version "2.17.0" - resolved "https://registry.yarnpkg.com/quasar/-/quasar-2.17.0.tgz#af92f90e8d6571479745eeb6bed20b1e0a40e789" - integrity sha512-xFWwCt4FGuaC0M4/MA5drjBiCP7kj/5BsUPv2+dDIlyQG9YGvKIewCnWYYt02r4ijRqJSzPb7TsH89Gzkno1Mg== - -query-string@^8.1.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-8.2.0.tgz#f0b0ef6caa85f525dbdb745a67d3f8c08d71cc6b" - integrity sha512-tUZIw8J0CawM5wyGBiDOAp7ObdRQh4uBor/fUR9ZjmbZVvw95OD9If4w3MQxr99rg0DJZ/9CIORcpEqU5hQG7g== - dependencies: - decode-uri-component "^0.4.1" - filter-obj "^5.1.0" - split-on-first "^3.0.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -readable-stream@^2.0.5: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" - integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - -readdir-glob@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" - integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== - dependencies: - minimatch "^5.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recrawl-sync@^2.0.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recrawl-sync/-/recrawl-sync-2.2.3.tgz#757adcdaae4799466dde5b8ee52122ff9636dfb1" - integrity sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ== - dependencies: - "@cush/relative" "^1.0.0" - glob-regex "^0.3.0" - slash "^3.0.0" - sucrase "^3.20.3" - tslib "^1.9.3" - -regenerate-unicode-properties@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" - integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexp.prototype.flags@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" - integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.2" - -regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.0" - regjsgen "^0.8.0" - regjsparser "^0.11.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149" - integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ== - dependencies: - jsesc "~3.0.2" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -reselect@^4.1.7: - version "4.1.8" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" - integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.14.2, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-visualizer@^5.12.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" - integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== - dependencies: - open "^8.4.0" - picomatch "^2.3.1" - source-map "^0.7.4" - yargs "^17.5.1" - -rollup@^4.20.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.0.tgz#c14a3576f20622ea6a5c9cad7caca5e6e9555d05" - integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.0" - "@rollup/rollup-android-arm64" "4.24.0" - "@rollup/rollup-darwin-arm64" "4.24.0" - "@rollup/rollup-darwin-x64" "4.24.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" - "@rollup/rollup-linux-arm-musleabihf" "4.24.0" - "@rollup/rollup-linux-arm64-gnu" "4.24.0" - "@rollup/rollup-linux-arm64-musl" "4.24.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" - "@rollup/rollup-linux-riscv64-gnu" "4.24.0" - "@rollup/rollup-linux-s390x-gnu" "4.24.0" - "@rollup/rollup-linux-x64-gnu" "4.24.0" - "@rollup/rollup-linux-x64-musl" "4.24.0" - "@rollup/rollup-win32-arm64-msvc" "4.24.0" - "@rollup/rollup-win32-ia32-msvc" "4.24.0" - "@rollup/rollup-win32-x64-msvc" "4.24.0" - fsevents "~2.3.2" - -run-applescript@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" - integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.4.0, rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-embedded-android-arm64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz#09ac7ff705a6674a4eed7302fe6e3a4c7070d875" - integrity sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw== - -sass-embedded-android-arm@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz#500451bbaec62f38761c9534033cbc1190b5fdd3" - integrity sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw== - -sass-embedded-android-ia32@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz#29d0b07a56362c3d7e40dc5f1e7a08e1d07f0483" - integrity sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA== - -sass-embedded-android-riscv64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz#0ac6efa88497877bc6f9128498f7cef3d5979e5f" - integrity sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w== - -sass-embedded-android-x64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz#1c80ac24b5322a8c5322369cae2dc39df018f834" - integrity sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w== - -sass-embedded-darwin-arm64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz#2e8761be8fd2bdb2bbfde32b3a796840712c7d55" - integrity sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA== - -sass-embedded-darwin-x64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz#86566e0804d0e3d5da88270e179a74b4fea51cf0" - integrity sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA== - -sass-embedded-linux-arm64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz#eeb141c86bf4698decbade5e8e9f7f21df1884f8" - integrity sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w== - -sass-embedded-linux-arm@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz#20beecc8632d958057cef8c11ba2f914e0844545" - integrity sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA== - -sass-embedded-linux-ia32@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz#63a3976753c12a7665be5abc0ecdbbc8000a421d" - integrity sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ== - -sass-embedded-linux-musl-arm64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz#ec9bdb7a4f304b3f7e3f15bf74b041b2aa70bf37" - integrity sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ== - -sass-embedded-linux-musl-arm@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz#95eb1727e83a460573f7bf03d285aa1b3e40d6ba" - integrity sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g== - -sass-embedded-linux-musl-ia32@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz#28f07c73be0179ef81bfdcf2cc031c4ae6534195" - integrity sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg== - -sass-embedded-linux-musl-riscv64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz#143e8f1455f5c0869994f3de1958f1b9be324701" - integrity sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw== - -sass-embedded-linux-musl-x64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz#c26720b1497bbbbf55b54138ffb313257c5dbe19" - integrity sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw== - -sass-embedded-linux-riscv64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz#648b70dbb749349ca0fb569280d05b5463bb4770" - integrity sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA== - -sass-embedded-linux-x64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz#b84a99a2178bde7c984c244544688ab4a46869d6" - integrity sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ== - -sass-embedded-win32-arm64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz#2e60184cc5acf58f2004aa3a7eda4c27645d26b7" - integrity sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ== - -sass-embedded-win32-ia32@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz#b3b885cfd75eebfadbb78eacd0538fdac7c6fc5c" - integrity sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg== - -sass-embedded-win32-x64@1.79.4: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz#d240b1d43f36049124117e32958e42e02c4f6eac" - integrity sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA== - -sass-embedded@^1.79.1: - version "1.79.4" - resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.79.4.tgz#45d52b9ca754c526763a1e255d4b98f788ff755b" - integrity sha512-3AATrtStMgxYjkit02/Ix8vx/P7qderYG6DHjmehfk5jiw53OaWVScmcGJSwp/d77kAkxDQ+Y0r+79VynGmrkw== - dependencies: - "@bufbuild/protobuf" "^2.0.0" - buffer-builder "^0.2.0" - colorjs.io "^0.5.0" - immutable "^4.0.0" - rxjs "^7.4.0" - supports-color "^8.1.1" - varint "^6.0.0" - optionalDependencies: - sass-embedded-android-arm "1.79.4" - sass-embedded-android-arm64 "1.79.4" - sass-embedded-android-ia32 "1.79.4" - sass-embedded-android-riscv64 "1.79.4" - sass-embedded-android-x64 "1.79.4" - sass-embedded-darwin-arm64 "1.79.4" - sass-embedded-darwin-x64 "1.79.4" - sass-embedded-linux-arm "1.79.4" - sass-embedded-linux-arm64 "1.79.4" - sass-embedded-linux-ia32 "1.79.4" - sass-embedded-linux-musl-arm "1.79.4" - sass-embedded-linux-musl-arm64 "1.79.4" - sass-embedded-linux-musl-ia32 "1.79.4" - sass-embedded-linux-musl-riscv64 "1.79.4" - sass-embedded-linux-musl-x64 "1.79.4" - sass-embedded-linux-riscv64 "1.79.4" - sass-embedded-linux-x64 "1.79.4" - sass-embedded-win32-arm64 "1.79.4" - sass-embedded-win32-ia32 "1.79.4" - sass-embedded-win32-x64 "1.79.4" - -sax@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.4.tgz#74b6d33c9ae1e001510f179a91168588f1aedaa9" - integrity sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg== - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.0.0, semver@^7.3.6, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.2.0, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -split-on-first@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" - integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== - -stack-trace@^1.0.0-pre2: - version "1.0.0-pre2" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-1.0.0-pre2.tgz#46a83a79f1b287807e9aaafc6a5dd8bcde626f9c" - integrity sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -std-env@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - -streamx@^2.15.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.1.tgz#471c4f8b860f7b696feb83d5b125caab2fdbb93c" - integrity sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA== - dependencies: - fast-fifo "^1.3.2" - queue-tick "^1.0.1" - text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1, string_decoder@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" - integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== - dependencies: - js-tokens "^9.0.0" - -sucrase@^3.20.3: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tar-stream@^3.0.0: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - -terser@^5.15.1: - version "5.34.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6" - integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-decoder@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.0.tgz#85f19d4d5088e0b45cd841bdfaeac458dbffeefc" - integrity sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg== - dependencies: - b4a "^1.6.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -tinybench@^2.5.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinypool@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" - integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== - -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -ts-essentials@^9.4.2: - version "9.4.2" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-9.4.2.tgz#6d4bd23b46b61bf3e031816cc887e839eb62c33c" - integrity sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfck@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.1.3.tgz#a8202f51dab684c426314796cdb0bbd0fe0cdf80" - integrity sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ== - -tsconfig-paths@^3.15.0, tsconfig-paths@^3.9.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.1.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^3.8.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" - integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== - -type-fest@^4.18.2: - version "4.26.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" - integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -ufo@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" - integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" - integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" - integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -varint@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" - integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vite-jsconfig-paths@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/vite-jsconfig-paths/-/vite-jsconfig-paths-2.0.1.tgz#d66e36d67596dd8a8e4a6ed6e6db20debc50b45e" - integrity sha512-rabcTTfKs0MdAsQWcZjbIMo5fcp6jthZce7uFEPgVPgpSY+RNOwjzIJOPES6cB/GJZLSoLGfHM9kt5HNmJvp7A== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - recrawl-sync "^2.0.3" - tsconfig-paths "^3.9.0" - -vite-node@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" - integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" - -vite-tsconfig-paths@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" - integrity sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - -vite@^5.0.0, vite@^5.4.5: - version "5.4.8" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.8.tgz#af548ce1c211b2785478d3ba3e8da51e39a287e8" - integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" - integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== - dependencies: - "@vitest/expect" "1.6.0" - "@vitest/runner" "1.6.0" - "@vitest/snapshot" "1.6.0" - "@vitest/spy" "1.6.0" - "@vitest/utils" "1.6.0" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.3" - vite "^5.0.0" - vite-node "1.6.0" - why-is-node-running "^2.2.2" - -vue-chartjs@^5.3.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/vue-chartjs/-/vue-chartjs-5.3.1.tgz#73484d569ec4994ba5accd30fe6714ef28e86f5b" - integrity sha512-rZjqcHBxKiHrBl0CIvcOlVEBwRhpWAVf6rDU3vUfa7HuSRmGtCslc0Oc8m16oAVuk0erzc1FCtH1VCriHsrz+A== - -vue-component-type-helpers@^2.0.0: - version "2.1.6" - resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.1.6.tgz#f350515b252ed9e76960ac51f135636f8baef3fe" - integrity sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w== - -vue-eslint-parser@^9.4.3: - version "9.4.3" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz#9b04b22c71401f1e8bca9be7c3e3416a4bde76a8" - integrity sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg== - dependencies: - debug "^4.3.4" - eslint-scope "^7.1.1" - eslint-visitor-keys "^3.3.0" - espree "^9.3.1" - esquery "^1.4.0" - lodash "^4.17.21" - semver "^7.3.6" - -vue-router@^4.0.12: - version "4.4.5" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.4.5.tgz#bdf535e4cf32414ebdea6b4b403593efdb541388" - integrity sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q== - dependencies: - "@vue/devtools-api" "^6.6.4" - -vue@^3.0.0: - version "3.5.11" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.11.tgz#3e307183797629f701e303a0a008f517ae031483" - integrity sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg== - dependencies: - "@vue/compiler-dom" "3.5.11" - "@vue/compiler-sfc" "3.5.11" - "@vue/runtime-dom" "3.5.11" - "@vue/server-renderer" "3.5.11" - "@vue/shared" "3.5.11" - -vuex-map-fields@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/vuex-map-fields/-/vuex-map-fields-1.4.1.tgz#3f22f0c3d39e25968d3a74fc2b43738c23c4ae4d" - integrity sha512-jvIcpvoIPqwvJCOfRkPU9Rj0EbjWuk7GlNC5LXU9mCXVGZph6bWGHZssnoUzpLMxJtXQEHoVyZkKf7YQV+/bnQ== - -vuex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.1.0.tgz#aa1b3ea5c7385812b074c86faeeec2217872e36c" - integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ== - dependencies: - "@vue/devtools-api" "^6.0.0-beta.11" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -webpack-merge@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" - integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.1" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wildcard@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.5.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" - integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== - -yoctocolors-cjs@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" - integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== - -zip-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-6.0.1.tgz#e141b930ed60ccaf5d7fa9c8260e0d1748a2bbfb" - integrity sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA== - dependencies: - archiver-utils "^5.0.0" - compress-commons "^6.0.2" - readable-stream "^4.0.0" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.2 + resolution: "@adobe/css-tools@npm:4.4.2" + checksum: 10c0/19433666ad18536b0ed05d4b53fbb3dd6ede266996796462023ec77a90b484890ad28a3e528cdf3ab8a65cb2fcdff5d8feb04db6bc6eed6ca307c40974239c94 + languageName: node + linkType: hard + +"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.2.1": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@asamuzakjp/css-color@npm:^3.1.1": + version: 3.1.1 + resolution: "@asamuzakjp/css-color@npm:3.1.1" + dependencies: + "@csstools/css-calc": "npm:^2.1.2" + "@csstools/css-color-parser": "npm:^3.0.8" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + lru-cache: "npm:^10.4.3" + checksum: 10c0/4abb010fd29de8acae8571eba738468c22cb45a1f77647df3c59a80f1c83d83d728cae3ebbf99e5c73f2517761abaaffbe5e4176fc46b5f9bf60f1478463b51e + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca + languageName: node + linkType: hard + +"@babel/core@npm:^7.15.4, @babel/core@npm:^7.18.9, @babel/core@npm:^7.26.0": + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.10" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/generator@npm:7.27.0" + dependencies: + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": + version: 7.27.0 + resolution: "@babel/helper-compilation-targets@npm:7.27.0" + dependencies: + "@babel/compat-data": "npm:^7.26.8" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/375c9f80e6540118f41bd53dd54d670b8bf91235d631bdead44c8b313b26e9cd89aed5c6df770ad13a87a464497b5346bb72b9462ba690473da422f5402618b6 + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.25.9, @babel/helper-create-class-features-plugin@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/helper-create-class-features-plugin@npm:7.27.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.27.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/c4945903136d934050e070f69a4d72ec425f1f70634e0ddf14ad36695f935125a6df559f8d5b94cc1ed49abd4ce9c5be8ef3ba033fa8d09c5dd78d1a9b97d8cc + languageName: node + linkType: hard + +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": + version: 7.27.0 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + regexpu-core: "npm:^6.2.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/62513522a43521d8a29285a47127694ec28d66d793cd156cf875cdee6a9b3a9a1626c43c1eb75ce18fa2bf5dc3140f0a8081a34feb24272ecf66084f3cc3b00a + languageName: node + linkType: hard + +"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": + version: 0.6.4 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.22.6" + "@babel/helper-plugin-utils": "npm:^7.22.5" + debug: "npm:^4.1.1" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.14.2" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/b74f2b46e233a178618d19432bdae16e0137d0a603497ee901155e083c4a61f26fe01d79fb95d5f4c22131ade9d958d8f587088d412cca1302633587f070919d + languageName: node + linkType: hard + +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" + dependencies: + "@babel/types": "npm:^7.25.9" + checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-wrap-function": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 + languageName: node + linkType: hard + +"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.25.9" + "@babel/helper-optimise-call-expression": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/b19b1245caf835207aaaaac3a494f03a16069ae55e76a2e1350b5acd560e6a820026997a8160e8ebab82ae873e8208759aa008eb8422a67a775df41f0a4633d4 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-wrap-function@npm:7.25.9" + dependencies: + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/helpers@npm:7.27.0" + dependencies: + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/parser@npm:7.27.0" + dependencies: + "@babel/types": "npm:^7.27.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c + languageName: node + linkType: hard + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 + languageName: node + linkType: hard + +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e605e0070da087f6c35579499e65801179a521b6842c15181a1e305c04fded2393f11c1efd09b087be7f8b083d1b75e8f3efcbc1292b4f60d3369e14812cff63 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-assertions@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + languageName: node + linkType: hard + +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" + "@babel/helper-plugin-utils": "npm:^7.18.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/9144e5b02a211a4fb9a0ce91063f94fbe1004e80bde3485a0910c9f14897cf83fabd8c21267907cff25db8e224858178df0517f14333cfcf3380ad9a4139cb50 + languageName: node + linkType: hard + +"@babel/plugin-transform-arrow-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/traverse": "npm:^7.26.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f6fefce963fe2e6268dde1958975d7adbce65fba94ca6f4bc554c90da03104ad1dd2e66d03bc0462da46868498428646e30b03a218ef0e5a84bfc87a7e375cec + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c443d9e462ddef733ae56360064f32fc800105803d892e4ff32d7d6a6922b3765fa97b9ddc9f7f1d3f9d8c2d95721d85bef9dbf507804214c6cf6466b105c168 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.25.9": + version: 7.27.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/15a604fac04151a795ff3213c73ece06bda7cd5f7c8cb7a3b29563ab243f0b3f7cba9e6facfc9d70e3e63b21af32f9d26bd10ccc58e1c425c7801186014b5ce4 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-classes@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d + languageName: node + linkType: hard + +"@babel/plugin-transform-computed-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b + languageName: node + linkType: hard + +"@babel/plugin-transform-destructuring@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 + languageName: node + linkType: hard + +"@babel/plugin-transform-dotall-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 + languageName: node + linkType: hard + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 + languageName: node + linkType: hard + +"@babel/plugin-transform-dynamic-import@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf + languageName: node + linkType: hard + +"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb + languageName: node + linkType: hard + +"@babel/plugin-transform-for-of@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/plugin-transform-for-of@npm:7.26.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e28a521521cf9f84ddd69ca8da7c89fb9f7aa38e4dea35742fe973e4e1d7c23f9cee1a4861a2fdd9e9f18ff945886a44d7335cea1c603b96bfcb1c7c8791ef09 + languageName: node + linkType: hard + +"@babel/plugin-transform-function-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-function-name@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 + languageName: node + linkType: hard + +"@babel/plugin-transform-json-strings@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 + languageName: node + linkType: hard + +"@babel/plugin-transform-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b + languageName: node + linkType: hard + +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 + languageName: node + linkType: hard + +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-amd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-commonjs@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" + dependencies: + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/82e59708f19f36da29531a64a7a94eabbf6ff46a615e0f5d9b49f3f59e8ef10e2bac607d749091508d3fa655146c9e5647c3ffeca781060cdabedb4c7a33c6f2 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-umd@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" + dependencies: + "@babel/helper-module-transforms": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 + languageName: node + linkType: hard + +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef + languageName: node + linkType: hard + +"@babel/plugin-transform-new-target@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-new-target@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e + languageName: node + linkType: hard + +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": + version: 7.26.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/574d6db7cbc5c092db5d1dece8ce26195e642b9c40dbfeaf3082058a78ad7959c1c333471cdd45f38b784ec488850548075d527b178c5010ee9bff7aa527cc7a + languageName: node + linkType: hard + +"@babel/plugin-transform-numeric-separator@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 + languageName: node + linkType: hard + +"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af + languageName: node + linkType: hard + +"@babel/plugin-transform-object-super@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-object-super@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-replace-supers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c + languageName: node + linkType: hard + +"@babel/plugin-transform-optional-chaining@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 + languageName: node + linkType: hard + +"@babel/plugin-transform-parameters@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-parameters@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 + languageName: node + linkType: hard + +"@babel/plugin-transform-private-methods@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd + languageName: node + linkType: hard + +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 + languageName: node + linkType: hard + +"@babel/plugin-transform-property-literals@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-display-name@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/63a0f962d64e71baf87c212755419e25c637d2d95ea6fdc067df26b91e606ae186442ae815b99a577eca9bf5404d9577ecad218a3cf42d0e9e286ca7b003a992 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-self@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ce0e289f6af93d7c4dc6b385512199c5bb138ae61507b4d5117ba88b6a6b5092f704f1bdf80080b7d69b1b8c36649f2a0b250e8198667d4d30c08bbb1546bd99 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-source@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fc9ee08efc9be7cbd2cc6788bbf92579adf3cab37912481f1b915221be3d22b0613b5b36a721df5f4c0ab65efe8582fcf8673caab83e6e1ce4cc04ceebf57dfa + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-pure-annotations@npm:^7.16.7, @babel/plugin-transform-react-pure-annotations@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7c8eac04644ad19dcd71bb8e949b0ae22b9e548fa4a58e545d3d0342f647fb89db7f8789a7c5b8074d478ce6d3d581eaf47dd4b36027e16fd68211c383839abc + languageName: node + linkType: hard + +"@babel/plugin-transform-regenerator@npm:^7.25.9": + version: 7.27.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.27.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + regenerator-transform: "npm:^0.15.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/aa1c6a1592338df96034e0c3933d9c84d0ae25e9768413fda90d4896470192a11e2ab146dbcb92005c5059bbea67aea3d11936de8e4be382613efceafc9c92b5 + languageName: node + linkType: hard + +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + languageName: node + linkType: hard + +"@babel/plugin-transform-reserved-words@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 + languageName: node + linkType: hard + +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-spread@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/205a938ded9554857a604416d369023a961334b6c20943bd861b45f0e5dbbeca1cf6fda1c2049126e38a0d18865993433fdc78eae3028e94836b3b643c08ba0d + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.26.7": + version: 7.27.0 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/00adbd4e044166ac291978bd64173b4a0d36cbcfae3495a196816dd16ba889cc8b5becee232086241d714cd67a80c15742402504fc36f6db4f746a7dd8d2b1c4 + languageName: node + linkType: hard + +"@babel/plugin-transform-typescript@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/plugin-transform-typescript@npm:7.27.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.0" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/plugin-syntax-typescript": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/028e75dd6195495dc2d105ca8ded19d62aef90a215d597451cee57c35325960a87963913aa9a21b8ade190c638b588422292ea7e23b21565baf53c469254dbd4 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.16.11": + version: 7.26.9 + resolution: "@babel/preset-env@npm:7.26.9" + dependencies: + "@babel/compat-data": "npm:^7.26.8" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" + "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" + "@babel/plugin-transform-async-generator-functions": "npm:^7.26.8" + "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.26.5" + "@babel/plugin-transform-block-scoping": "npm:^7.25.9" + "@babel/plugin-transform-class-properties": "npm:^7.25.9" + "@babel/plugin-transform-class-static-block": "npm:^7.26.0" + "@babel/plugin-transform-classes": "npm:^7.25.9" + "@babel/plugin-transform-computed-properties": "npm:^7.25.9" + "@babel/plugin-transform-destructuring": "npm:^7.25.9" + "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3" + "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" + "@babel/plugin-transform-for-of": "npm:^7.26.9" + "@babel/plugin-transform-function-name": "npm:^7.25.9" + "@babel/plugin-transform-json-strings": "npm:^7.25.9" + "@babel/plugin-transform-literals": "npm:^7.25.9" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" + "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" + "@babel/plugin-transform-modules-amd": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" + "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" + "@babel/plugin-transform-modules-umd": "npm:^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" + "@babel/plugin-transform-new-target": "npm:^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.26.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" + "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" + "@babel/plugin-transform-object-super": "npm:^7.25.9" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" + "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/plugin-transform-private-methods": "npm:^7.25.9" + "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" + "@babel/plugin-transform-property-literals": "npm:^7.25.9" + "@babel/plugin-transform-regenerator": "npm:^7.25.9" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" + "@babel/plugin-transform-reserved-words": "npm:^7.25.9" + "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" + "@babel/plugin-transform-spread": "npm:^7.25.9" + "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" + "@babel/plugin-transform-template-literals": "npm:^7.26.8" + "@babel/plugin-transform-typeof-symbol": "npm:^7.26.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.11.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.40.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6812ca76bd38165a58fe8354bab5e7204e1aa17d8b9270bd8f8babb08cc7fa94cd29525fe41b553f2ba0e84033d566f10da26012b8ee0f81897005c5225d0051 + languageName: node + linkType: hard + +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@babel/types": "npm:^7.4.4" + esutils: "npm:^2.0.2" + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/9d02f70d7052446c5f3a4fb39e6b632695fb6801e46d31d7f7c5001f7c18d31d1ea8369212331ca7ad4e7877b73231f470b0d559162624128f1b80fe591409e6 + languageName: node + linkType: hard + +"@babel/preset-react@npm:^7.16.7": + version: 7.26.3 + resolution: "@babel/preset-react@npm:7.26.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-transform-react-display-name": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b470dcba11032ef6c832066f4af5c75052eaed49feb0f445227231ef1b5c42aacd6e216988c0bd469fd5728cd27b6b059ca307c9ecaa80c6bb5da4bf1c833e12 + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.16.7": + version: 7.27.0 + resolution: "@babel/preset-typescript@npm:7.27.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/plugin-syntax-jsx": "npm:^7.25.9" + "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" + "@babel/plugin-transform-typescript": "npm:^7.27.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/986b20edab3c18727d911a6e1a14095c1271afc6cc625b02f42b371f06c1e041e5d7c1baf2afe8b0029b60788a06f02fd6844dedfe54183b148ab9a7429438a9 + languageName: node + linkType: hard + +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.8.4": + version: 7.27.0 + resolution: "@babel/runtime@npm:7.27.0" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/35091ea9de48bd7fd26fb177693d64f4d195eb58ab2b142b893b7f3fa0f1d7c677604d36499ae0621a3703f35ba0c6a8f6c572cc8f7dc0317213841e493cf663 + languageName: node + linkType: hard + +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/template@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/traverse@npm:7.27.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.0" + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0, @babel/types@npm:^7.4.4": + version: 7.27.0 + resolution: "@babel/types@npm:7.27.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@bconnorwhite/module@npm:^2.0.2": + version: 2.0.2 + resolution: "@bconnorwhite/module@npm:2.0.2" + dependencies: + find-up: "npm:^5.0.0" + read-json-safe: "npm:^1.0.5" + types-pkg-json: "npm:^1.1.0" + checksum: 10c0/3887f1cb8da19c4bc604d2b9ace6dc83e82b27f65282e81097a138824ab05f6a2313ac59f07882d687625c5607065789494902f47990c547f014fe67bb6120fa + languageName: node + linkType: hard + +"@bundled-es-modules/cookie@npm:^2.0.1": + version: 2.0.1 + resolution: "@bundled-es-modules/cookie@npm:2.0.1" + dependencies: + cookie: "npm:^0.7.2" + checksum: 10c0/dfac5e36127e827c5557b8577f17a8aa94c057baff6d38555917927b99da0ecf0b1357e7fedadc8853ecdbd4a8a7fa1f5e64111b2a656612f4a36376f5bdbe8d + languageName: node + linkType: hard + +"@bundled-es-modules/statuses@npm:^1.0.1": + version: 1.0.1 + resolution: "@bundled-es-modules/statuses@npm:1.0.1" + dependencies: + statuses: "npm:^2.0.1" + checksum: 10c0/c1a8ede3efa8da61ccda4b98e773582a9733edfbeeee569d4630785f8e018766202edb190a754a3ec7a7f6bd738e857829affc2fdb676b6dab4db1bb44e62785 + languageName: node + linkType: hard + +"@bundled-es-modules/tough-cookie@npm:^0.1.6": + version: 0.1.6 + resolution: "@bundled-es-modules/tough-cookie@npm:0.1.6" + dependencies: + "@types/tough-cookie": "npm:^4.0.5" + tough-cookie: "npm:^4.1.4" + checksum: 10c0/28bcac878bff6b34719ba3aa8341e9924772ee55de5487680ebe784981ec9fccb70ed5d46f563e2404855a04de606f9e56aa4202842d4f5835bc04a4fe820571 + languageName: node + linkType: hard + +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.2": + version: 2.1.2 + resolution: "@csstools/css-calc@npm:2.1.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/css-color-parser@npm:3.0.8" + dependencies: + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 + languageName: node + linkType: hard + +"@emnapi/core@npm:^1.4.0": + version: 1.4.0 + resolution: "@emnapi/core@npm:1.4.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.1" + tslib: "npm:^2.4.0" + checksum: 10c0/ff971bc2544bdbd97a981072baedae6241372971996f39402d113cc21bb0d5c6eaca4a5ce9f4ca7d2106e9a6325a6170b1b86680466f9c663b1a33ecdbb98fc7 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.0": + version: 1.4.0 + resolution: "@emnapi/runtime@npm:1.4.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/9c57c0fd6af62bec771bdbe7615571a484656f5c73758e7766ffb5b7f42c6877128a7d0dc84b12e0aee40f5113fddb309a65d1b3128d57a9db79f963cb327ffe + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.1": + version: 1.0.1 + resolution: "@emnapi/wasi-threads@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/aix-ppc64@npm:0.25.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-arm64@npm:0.25.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-arm@npm:0.25.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/android-x64@npm:0.25.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/darwin-arm64@npm:0.25.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/darwin-x64@npm:0.25.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/freebsd-arm64@npm:0.25.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/freebsd-x64@npm:0.25.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-arm64@npm:0.25.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-arm@npm:0.25.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-ia32@npm:0.25.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-loong64@npm:0.25.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-mips64el@npm:0.25.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-ppc64@npm:0.25.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-riscv64@npm:0.25.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-s390x@npm:0.25.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/linux-x64@npm:0.25.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/netbsd-arm64@npm:0.25.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/netbsd-x64@npm:0.25.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/openbsd-arm64@npm:0.25.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/openbsd-x64@npm:0.25.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/sunos-x64@npm:0.25.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-arm64@npm:0.25.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-ia32@npm:0.25.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.25.2": + version: 0.25.2 + resolution: "@esbuild/win32-x64@npm:0.25.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.5.1 + resolution: "@eslint-community/eslint-utils@npm:4.5.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/b520ae1b7bd04531a5c5da2021071815df4717a9f7d13720e3a5ddccf5c9c619532039830811fcbae1c2f1c9d133e63af2435ee69e0fc0fabbd6d928c6800fb2 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.20.0": + version: 0.20.0 + resolution: "@eslint/config-array@npm:0.20.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/94bc5d0abb96dc5295ff559925242ff75a54eacfb3576677e95917e42f7175e1c4b87bf039aa2a872f949b4852ad9724bf2f7529aaea6b98f28bb3fca7f1d659 + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.2.0": + version: 0.2.1 + resolution: "@eslint/config-helpers@npm:0.2.1" + checksum: 10c0/3e829a78b0bb4f7c44384ba1df3986e5de24b7f440ad5c6bb3cfc366ded773a869ca9ee8d212b5a563ae94596c5940dea6fd2ea1ee53a84c6241ac953dcb8bb7 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.12.0": + version: 0.12.0 + resolution: "@eslint/core@npm:0.12.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/d032af81195bb28dd800c2b9617548c6c2a09b9490da3c5537fd2a1201501666d06492278bb92cfccac1f7ac249e58601dd87f813ec0d6a423ef0880434fa0c3 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.13.0": + version: 0.13.0 + resolution: "@eslint/core@npm:0.13.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/ba724a7df7ed9dab387481f11d0d0f708180f40be93acce2c21dacca625c5867de3528760c42f1c457ccefe6a669d525ff87b779017eabc0d33479a36300797b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 + languageName: node + linkType: hard + +"@eslint/js@npm:9.24.0, @eslint/js@npm:^9.23.0": + version: 9.24.0 + resolution: "@eslint/js@npm:9.24.0" + checksum: 10c0/efe22e29469e4140ac3e2916be8143b1bcfd1084a6edf692b7a58a3e54949d53c67f7f979bc0a811db134d9cc1e7bff8aa71ef1376b47eecd7e226b71206bb36 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.7": + version: 0.2.8 + resolution: "@eslint/plugin-kit@npm:0.2.8" + dependencies: + "@eslint/core": "npm:^0.13.0" + levn: "npm:^0.4.1" + checksum: 10c0/554847c8f2b6bfe0e634f317fc43d0b54771eea0015c4f844f75915fdb9e6170c830c004291bad57db949d61771732e459f36ed059f45cf750af223f77357c5c + languageName: node + linkType: hard + +"@floating-ui/core@npm:^1.6.0": + version: 1.6.9 + resolution: "@floating-ui/core@npm:1.6.9" + dependencies: + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/77debdfc26bc36c6f5ae1f26ab3c15468215738b3f5682af4e1915602fa21ba33ad210273f31c9d2da1c531409929e1afb1138b1608c6b54a0f5853ee84c340d + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.0.0": + version: 1.6.13 + resolution: "@floating-ui/dom@npm:1.6.13" + dependencies: + "@floating-ui/core": "npm:^1.6.0" + "@floating-ui/utils": "npm:^0.2.9" + checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9 + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.1.2": + version: 2.1.2 + resolution: "@floating-ui/react-dom@npm:2.1.2" + dependencies: + "@floating-ui/dom": "npm:^1.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 + languageName: node + linkType: hard + +"@floating-ui/react@npm:^0.26.25": + version: 0.26.28 + resolution: "@floating-ui/react@npm:0.26.28" + dependencies: + "@floating-ui/react-dom": "npm:^2.1.2" + "@floating-ui/utils": "npm:^0.2.8" + tabbable: "npm:^6.0.0" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10c0/a42df129e1e976fe8ba3f4c8efdda265a0196c1b66b83f2b9b27423d08dcc765406f893aeff9d830e70e3f14a9d4c490867eb4c32983317cbaa33863b0fae6f6 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.8, @floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 10c0/0b3c9958d3cd17f4add3574975e3115ae05dc7f1298a60810414b16f6f558c137b5fb3cd3905df380bacfd955ec13f67c1e6710cbb5c246a7e8d65a8289b2bff + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.2 + resolution: "@humanwhocodes/retry@npm:0.4.2" + checksum: 10c0/0235525d38f243bee3bf8b25ed395fbf957fb51c08adae52787e1325673071abe856c7e18e530922ed2dd3ce12ed82ba01b8cee0279ac52a3315fcdc3a69ef0c + languageName: node + linkType: hard + +"@inquirer/confirm@npm:^5.0.0": + version: 5.1.9 + resolution: "@inquirer/confirm@npm:5.1.9" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/e35c134303f8151074479d6704c048676b2684debfde18a46ff0fb7585a3ee31dea551899ddcb48169fbef5dfe64c1948d2d8ac17a6939bedd31bb54c39bbea4 + languageName: node + linkType: hard + +"@inquirer/core@npm:^10.1.10": + version: 10.1.10 + resolution: "@inquirer/core@npm:10.1.10" + dependencies: + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/type": "npm:^3.0.6" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + mute-stream: "npm:^2.0.0" + signal-exit: "npm:^4.1.0" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/8d0a3b725e42e40efbdc6ed087283795f1e36e642b119dd7dd3cbf31fce74bdbdb1b987da16159cd2475f45b2ede7e33293ae92bad3ac481832889c230df3fc0 + languageName: node + linkType: hard + +"@inquirer/figures@npm:^1.0.11, @inquirer/figures@npm:^1.0.3": + version: 1.0.11 + resolution: "@inquirer/figures@npm:1.0.11" + checksum: 10c0/6270e24eebbe42bbc4e7f8e761e906be66b4896787f31ab3e7484ad271c8edc90bce4ec20e232a5da447aee4fc73803397b2dda8cf645f4f7eea83e773b44e1e + languageName: node + linkType: hard + +"@inquirer/type@npm:^3.0.6": + version: 3.0.6 + resolution: "@inquirer/type@npm:3.0.6" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/92382c1b046559ddb16c53e1353a900a43266566a0d73902e5325433c640b6aaeaf3e34cc5b2a68fd089ff5d8add914d0b9875cdec64f7a09313f9c4420b021d + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@isaacs/string-locale-compare@npm:^1.1.0": + version: 1.1.0 + resolution: "@isaacs/string-locale-compare@npm:1.1.0" + checksum: 10c0/d67226ff7ac544a495c77df38187e69e0e3a0783724777f86caadafb306e2155dc3b5787d5927916ddd7fb4a53561ac8f705448ac3235d18ea60da5854829fdf + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.5.0": + version: 0.5.0 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.5.0" + dependencies: + glob: "npm:^10.0.0" + magic-string: "npm:^0.27.0" + react-docgen-typescript: "npm:^2.2.2" + peerDependencies: + typescript: ">= 4.3.x" + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/dd5bcd01c685c67bcfb4676639f15319937867ad5af0dc083991fe9ae9e66302c72fec53d12e0616a45eadb0ae715bea144d0302f408a44f1eeab14c5160ad4a + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@kurkle/color@npm:^0.3.0": + version: 0.3.4 + resolution: "@kurkle/color@npm:0.3.4" + checksum: 10c0/0e9fd55c614b005c5f0c4c755bca19ec0293bc7513b4ea3ec1725234f9c2fa81afbc78156baf555c8b9cb0d305619253c3f5bca016067daeebb3d00ebb4ea683 + languageName: node + linkType: hard + +"@mdx-js/react@npm:^2.1.5": + version: 2.3.0 + resolution: "@mdx-js/react@npm:2.3.0" + dependencies: + "@types/mdx": "npm:^2.0.0" + "@types/react": "npm:>=16" + peerDependencies: + react: ">=16" + checksum: 10c0/6d647115703dbe258f7fe372499fa8c6fe17a053ff0f2a208111c9973a71ae738a0ed376770445d39194d217e00e1a015644b24f32c2f7cb4f57988de0649b15 + languageName: node + linkType: hard + +"@mdx-js/react@npm:^3.0.0": + version: 3.1.0 + resolution: "@mdx-js/react@npm:3.1.0" + dependencies: + "@types/mdx": "npm:^2.0.0" + peerDependencies: + "@types/react": ">=16" + react: ">=16" + checksum: 10c0/381ed1211ba2b8491bf0ad9ef0d8d1badcdd114e1931d55d44019d4b827cc2752586708f9c7d2f9c3244150ed81f1f671a6ca95fae0edd5797fb47a22e06ceca + languageName: node + linkType: hard + +"@mswjs/interceptors@npm:^0.37.0": + version: 0.37.6 + resolution: "@mswjs/interceptors@npm:0.37.6" + dependencies: + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/logger": "npm:^0.3.0" + "@open-draft/until": "npm:^2.0.0" + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.3" + strict-event-emitter: "npm:^0.5.1" + checksum: 10c0/74f52c09c84fcbba9f1a06e462aa25b1567cf078ed27d396c76a8059c002fa9c361e711dcada0ac2aad4298f247d8e236a4fcc861c08ddf6e2ce0889368596fd + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^0.2.8": + version: 0.2.8 + resolution: "@napi-rs/wasm-runtime@npm:0.2.8" + dependencies: + "@emnapi/core": "npm:^1.4.0" + "@emnapi/runtime": "npm:^1.4.0" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/814cc16dd04bf77c600d5ddcc93e389d11d6002e479e43200dee98f0d7fdb2f8655ba0988bbcbb5d9a27db3b53f51efe1dc46675d683aaef7a45a7bdbd742ed5 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/arborist@npm:^5.6.3": + version: 5.6.3 + resolution: "@npmcli/arborist@npm:5.6.3" + dependencies: + "@isaacs/string-locale-compare": "npm:^1.1.0" + "@npmcli/installed-package-contents": "npm:^1.0.7" + "@npmcli/map-workspaces": "npm:^2.0.3" + "@npmcli/metavuln-calculator": "npm:^3.0.1" + "@npmcli/move-file": "npm:^2.0.0" + "@npmcli/name-from-folder": "npm:^1.0.1" + "@npmcli/node-gyp": "npm:^2.0.0" + "@npmcli/package-json": "npm:^2.0.0" + "@npmcli/query": "npm:^1.2.0" + "@npmcli/run-script": "npm:^4.1.3" + bin-links: "npm:^3.0.3" + cacache: "npm:^16.1.3" + common-ancestor-path: "npm:^1.0.1" + hosted-git-info: "npm:^5.2.1" + json-parse-even-better-errors: "npm:^2.3.1" + json-stringify-nice: "npm:^1.1.4" + minimatch: "npm:^5.1.0" + mkdirp: "npm:^1.0.4" + mkdirp-infer-owner: "npm:^2.0.0" + nopt: "npm:^6.0.0" + npm-install-checks: "npm:^5.0.0" + npm-package-arg: "npm:^9.0.0" + npm-pick-manifest: "npm:^7.0.2" + npm-registry-fetch: "npm:^13.0.0" + npmlog: "npm:^6.0.2" + pacote: "npm:^13.6.1" + parse-conflict-json: "npm:^2.0.1" + proc-log: "npm:^2.0.0" + promise-all-reject-late: "npm:^1.0.0" + promise-call-limit: "npm:^1.0.1" + read-package-json-fast: "npm:^2.0.2" + readdir-scoped-modules: "npm:^1.1.0" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.7" + ssri: "npm:^9.0.0" + treeverse: "npm:^2.0.0" + walk-up-path: "npm:^1.0.0" + bin: + arborist: bin/index.js + checksum: 10c0/5647e68e8726f633d43e2d6a89c11568555aec2cd68035bf6b92f78a00e66e364e2b562f089e92b89a7c61abd5efca25f25347f00ce4bc6bc10133225b60c284 + languageName: node + linkType: hard + +"@npmcli/ci-detect@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/ci-detect@npm:2.0.0" + checksum: 10c0/a5871158bc2a6bb7a2d313fa56d4d1747486b1e7531da6b4f39e9a6e8188bb2faef212b5927bf13413a6f0a9ecebbaa849c26f5147eb1593e918c37a2c349634 + languageName: node + linkType: hard + +"@npmcli/config@npm:^4.2.1": + version: 4.2.2 + resolution: "@npmcli/config@npm:4.2.2" + dependencies: + "@npmcli/map-workspaces": "npm:^2.0.2" + ini: "npm:^3.0.0" + mkdirp-infer-owner: "npm:^2.0.0" + nopt: "npm:^6.0.0" + proc-log: "npm:^2.0.0" + read-package-json-fast: "npm:^2.0.3" + semver: "npm:^7.3.5" + walk-up-path: "npm:^1.0.0" + checksum: 10c0/d13f64301e06efe8c6fc4c5aaebc573f86092925564cb9eeaec077d121afca66c73f781d7e74b18d432694f44a86f7d86eb22925eb82e3c2ff57cd6d6948e59f + languageName: node + linkType: hard + +"@npmcli/disparity-colors@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/disparity-colors@npm:2.0.0" + dependencies: + ansi-styles: "npm:^4.3.0" + checksum: 10c0/a4aabb55fad40056b1101c2ab8bb761e0fb2733b8ad33248327f6840e5b4364b80d8aea3d3bd7f066b9ee709abc2ac87077a611c1803107a5a3b9b51ba49e7a1 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0, @npmcli/fs@npm:^2.1.1": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": "npm:^1.1.3" + semver: "npm:^7.3.5" + checksum: 10c0/c50d087733d0d8df23be24f700f104b19922a28677aa66fdbe06ff6af6431cc4a5bb1e27683cbc661a5dafa9bafdc603e6a0378121506dfcd394b2b6dd76a187 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@npmcli/git@npm:^3.0.0": + version: 3.0.2 + resolution: "@npmcli/git@npm:3.0.2" + dependencies: + "@npmcli/promise-spawn": "npm:^3.0.0" + lru-cache: "npm:^7.4.4" + mkdirp: "npm:^1.0.4" + npm-pick-manifest: "npm:^7.0.0" + proc-log: "npm:^2.0.0" + promise-inflight: "npm:^1.0.1" + promise-retry: "npm:^2.0.1" + semver: "npm:^7.3.5" + which: "npm:^2.0.2" + checksum: 10c0/26c18d98d0bf060b82692f41919847d55c00224861abbd972f47b4ecbf2494ec3afddafb8dbf98442d972e8217e3a909f95d27d040feadc061f3e8f7ccc2e2bd + languageName: node + linkType: hard + +"@npmcli/installed-package-contents@npm:^1.0.7": + version: 1.0.7 + resolution: "@npmcli/installed-package-contents@npm:1.0.7" + dependencies: + npm-bundled: "npm:^1.1.1" + npm-normalize-package-bin: "npm:^1.0.1" + bin: + installed-package-contents: index.js + checksum: 10c0/69c23b489ebfc90a28f6ee5293256bf6dae656292c8e13d52cd770fee2db2c9ecbeb7586387cd9006bc1968439edd5c75aeeb7d39ba0c8eb58905c3073bee067 + languageName: node + linkType: hard + +"@npmcli/map-workspaces@npm:^2.0.2, @npmcli/map-workspaces@npm:^2.0.3": + version: 2.0.4 + resolution: "@npmcli/map-workspaces@npm:2.0.4" + dependencies: + "@npmcli/name-from-folder": "npm:^1.0.1" + glob: "npm:^8.0.1" + minimatch: "npm:^5.0.1" + read-package-json-fast: "npm:^2.0.3" + checksum: 10c0/11ab7b357dbe7a06067405619b5c2f50e6176b1d392e97d715ebbb4e51357c7b3683fb59be273e3e689893d158362c050a4c358405af91d2243de6b0cf6129d6 + languageName: node + linkType: hard + +"@npmcli/metavuln-calculator@npm:^3.0.1": + version: 3.1.1 + resolution: "@npmcli/metavuln-calculator@npm:3.1.1" + dependencies: + cacache: "npm:^16.0.0" + json-parse-even-better-errors: "npm:^2.3.1" + pacote: "npm:^13.0.3" + semver: "npm:^7.3.5" + checksum: 10c0/92bd9e5f221639cc9f9580736898a30a7acfb21eb67f0c6c3cc63ff77cb25df18f2b359b47bee8b66afff871640eac693d8ba6779eab7f8977befc7ca09833cd + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: "npm:^1.0.4" + rimraf: "npm:^3.0.2" + checksum: 10c0/11b2151e6d1de6f6eb23128de5aa8a429fd9097d839a5190cb77aa47a6b627022c42d50fa7c47a00f1c9f8f0c1560092b09b061855d293fa0741a2a94cfb174d + languageName: node + linkType: hard + +"@npmcli/name-from-folder@npm:^1.0.1": + version: 1.0.1 + resolution: "@npmcli/name-from-folder@npm:1.0.1" + checksum: 10c0/6dbedf7c678ed1034e9905d75d3493459771bb4c4eeda147e1ab0f6a5c56d5ccc597ca9230741f2884e3f0e5fbf94e66ba6e7776d713d2a109427056bd10ae02 + languageName: node + linkType: hard + +"@npmcli/node-gyp@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/node-gyp@npm:2.0.0" + checksum: 10c0/8de88f4a602e8f868f10c660250429d34a51aaa10cb4d0f1f919d7920632be22cc47ad0e4d75097cd68e07fec5b93e41803ae3f03c1a3370badd865461e6b486 + languageName: node + linkType: hard + +"@npmcli/package-json@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/package-json@npm:2.0.0" + dependencies: + json-parse-even-better-errors: "npm:^2.3.1" + checksum: 10c0/67aa80bb75e2f8d328c5225caf31d63499b01dd8b094e739b84de442b5411ba1040374cea113ccbcd3f0dda8b872a243e74d937b584c9040e8af6a90d42a564e + languageName: node + linkType: hard + +"@npmcli/promise-spawn@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/promise-spawn@npm:3.0.0" + dependencies: + infer-owner: "npm:^1.0.4" + checksum: 10c0/934225972d7b3e456e76b2eae40b3ece2478a361d99aa56c79f65ef7c66aa83cd55330ee44daf43174b76649b25d722b9f85120a4591cac53d884423f315465c + languageName: node + linkType: hard + +"@npmcli/query@npm:^1.2.0": + version: 1.2.0 + resolution: "@npmcli/query@npm:1.2.0" + dependencies: + npm-package-arg: "npm:^9.1.0" + postcss-selector-parser: "npm:^6.0.10" + semver: "npm:^7.3.7" + checksum: 10c0/f0fbc9ae07b437c0ebed20811c46ca22f654240a75223c7819510abbc7791af5c6d9e99b6bc37ecf3842a1b6457abff8deb7232ac00403c07c65df87be651311 + languageName: node + linkType: hard + +"@npmcli/run-script@npm:^4.1.0, @npmcli/run-script@npm:^4.1.3, @npmcli/run-script@npm:^4.2.0, @npmcli/run-script@npm:^4.2.1": + version: 4.2.1 + resolution: "@npmcli/run-script@npm:4.2.1" + dependencies: + "@npmcli/node-gyp": "npm:^2.0.0" + "@npmcli/promise-spawn": "npm:^3.0.0" + node-gyp: "npm:^9.0.0" + read-package-json-fast: "npm:^2.0.3" + which: "npm:^2.0.2" + checksum: 10c0/b658b239a0132d3b7262ab94e16ca1bf4abe2987557015086c94768bd0cfdf7cded9a6c04f2efb58d63ae4f3bbb794caffaedc00b3d64ad7136bcf8c181b9b10 + languageName: node + linkType: hard + +"@octokit/auth-token@npm:^3.0.0": + version: 3.0.4 + resolution: "@octokit/auth-token@npm:3.0.4" + checksum: 10c0/abdf5e2da36344de9727c70ba782d58004f5ae1da0f65fa9bc9216af596ef23c0e4675f386df2f6886806612558091d603564051b693b0ad1986aa6160b7a231 + languageName: node + linkType: hard + +"@octokit/core@npm:^4.2.1": + version: 4.2.4 + resolution: "@octokit/core@npm:4.2.4" + dependencies: + "@octokit/auth-token": "npm:^3.0.0" + "@octokit/graphql": "npm:^5.0.0" + "@octokit/request": "npm:^6.0.0" + "@octokit/request-error": "npm:^3.0.0" + "@octokit/types": "npm:^9.0.0" + before-after-hook: "npm:^2.2.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/e54081a56884e628d1804837fddcd48c10d516117bb891551c8dc9d8e3dad449aeb9b4677ca71e8f0e76268c2b7656c953099506679aaa4666765228474a3ce6 + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^7.0.0": + version: 7.0.6 + resolution: "@octokit/endpoint@npm:7.0.6" + dependencies: + "@octokit/types": "npm:^9.0.0" + is-plain-object: "npm:^5.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/fd147a55010b54af7567bf90791359f7096a1c9916a2b7c72f8afd0c53141338b3d78da3a4ab3e3bdfeb26218a1b73735432d8987ccc04996b1019219299f115 + languageName: node + linkType: hard + +"@octokit/graphql@npm:^5.0.0": + version: 5.0.6 + resolution: "@octokit/graphql@npm:5.0.6" + dependencies: + "@octokit/request": "npm:^6.0.0" + "@octokit/types": "npm:^9.0.0" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/de1d839d97fe6d96179925f6714bf96e7af6f77929892596bb4211adab14add3291fc5872b269a3d0e91a4dcf248d16096c82606c4a43538cf241b815c2e2a36 + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^18.0.0": + version: 18.1.1 + resolution: "@octokit/openapi-types@npm:18.1.1" + checksum: 10c0/856d3bb9f8c666e837dd5e8b8c216ee4342b9ed63ff8da922ca4ce5883ed1dfbec73390eb13d69fbcb4703a4c8b8b6a586df3b0e675ff93bf3d46b5b4fe0968e + languageName: node + linkType: hard + +"@octokit/plugin-paginate-rest@npm:^6.1.2": + version: 6.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" + dependencies: + "@octokit/tsconfig": "npm:^1.0.2" + "@octokit/types": "npm:^9.2.3" + peerDependencies: + "@octokit/core": ">=4" + checksum: 10c0/def241c4f00b864822ab6414eaadd8679a6d332004c7e77467cfc1e6d5bdcc453c76bd185710ee942e4df201f9dd2170d960f46af5b14ef6f261a0068f656364 + languageName: node + linkType: hard + +"@octokit/plugin-retry@npm:^4.1.3": + version: 4.1.6 + resolution: "@octokit/plugin-retry@npm:4.1.6" + dependencies: + "@octokit/types": "npm:^9.0.0" + bottleneck: "npm:^2.15.3" + peerDependencies: + "@octokit/core": ">=3" + checksum: 10c0/becda71309b8fde99b2daa6c5ab7c9774adfabc2c950da53741bb911c6cd4db1b4d9cc878498580f8b8e881f491450a57bfaa50b6ad749aea421766675dbebdb + languageName: node + linkType: hard + +"@octokit/plugin-throttling@npm:^5.2.3": + version: 5.2.3 + resolution: "@octokit/plugin-throttling@npm:5.2.3" + dependencies: + "@octokit/types": "npm:^9.0.0" + bottleneck: "npm:^2.15.3" + peerDependencies: + "@octokit/core": ^4.0.0 + checksum: 10c0/dd43da3e49c7e92aa6f513aae80702a13899cd9265d9538443063bd9c56e250177b4672bda0894843915b6424c01350647366af2763479f43d6dfe9983d43325 + languageName: node + linkType: hard + +"@octokit/request-error@npm:^3.0.0": + version: 3.0.3 + resolution: "@octokit/request-error@npm:3.0.3" + dependencies: + "@octokit/types": "npm:^9.0.0" + deprecation: "npm:^2.0.0" + once: "npm:^1.4.0" + checksum: 10c0/1e252ac193c8af23b709909911aa327ed5372cbafcba09e4aff41e0f640a7c152579ab0a60311a92e37b4e7936392d59ee4c2feae5cdc387ee8587a33d8afa60 + languageName: node + linkType: hard + +"@octokit/request@npm:^6.0.0": + version: 6.2.8 + resolution: "@octokit/request@npm:6.2.8" + dependencies: + "@octokit/endpoint": "npm:^7.0.0" + "@octokit/request-error": "npm:^3.0.0" + "@octokit/types": "npm:^9.0.0" + is-plain-object: "npm:^5.0.0" + node-fetch: "npm:^2.6.7" + universal-user-agent: "npm:^6.0.0" + checksum: 10c0/6b6079ed45bac44c4579b40990bfd1905b03d4bc4e5255f3d5a10cf5182171578ebe19abeab32ebb11a806f1131947f2a06b7a077bd7e77ade7b15fe2882174b + languageName: node + linkType: hard + +"@octokit/tsconfig@npm:^1.0.2": + version: 1.0.2 + resolution: "@octokit/tsconfig@npm:1.0.2" + checksum: 10c0/84db70b495beeed69259dd4def14cdfb600edeb65ef32811558c99413ee2b414ed10bff9c4dcc7a43451d0fd36b4925ada9ef7d4272b5eae38cb005cc2f459ac + languageName: node + linkType: hard + +"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.3": + version: 9.3.2 + resolution: "@octokit/types@npm:9.3.2" + dependencies: + "@octokit/openapi-types": "npm:^18.0.0" + checksum: 10c0/2925479aa378a4491762b4fcf381bdc7daca39b4e0b2dd7062bce5d74a32ed7d79d20d3c65ceaca6d105cf4b1f7417fea634219bf90f79a57d03e2dac629ec45 + languageName: node + linkType: hard + +"@open-draft/deferred-promise@npm:^2.2.0": + version: 2.2.0 + resolution: "@open-draft/deferred-promise@npm:2.2.0" + checksum: 10c0/eafc1b1d0fc8edb5e1c753c5e0f3293410b40dde2f92688211a54806d4136887051f39b98c1950370be258483deac9dfd17cf8b96557553765198ef2547e4549 + languageName: node + linkType: hard + +"@open-draft/logger@npm:^0.3.0": + version: 0.3.0 + resolution: "@open-draft/logger@npm:0.3.0" + dependencies: + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.0" + checksum: 10c0/90010647b22e9693c16258f4f9adb034824d1771d3baa313057b9a37797f571181005bc50415a934eaf7c891d90ff71dcd7a9d5048b0b6bb438f31bef2c7c5c1 + languageName: node + linkType: hard + +"@open-draft/until@npm:^2.0.0, @open-draft/until@npm:^2.1.0": + version: 2.1.0 + resolution: "@open-draft/until@npm:2.1.0" + checksum: 10c0/61d3f99718dd86bb393fee2d7a785f961dcaf12f2055f0c693b27f4d0cd5f7a03d498a6d9289773b117590d794a43cd129366fd8e99222e4832f67b1653d54cf + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@pnpm/config.env-replace@npm:^1.1.0": + version: 1.1.0 + resolution: "@pnpm/config.env-replace@npm:1.1.0" + checksum: 10c0/4cfc4a5c49ab3d0c6a1f196cfd4146374768b0243d441c7de8fa7bd28eaab6290f514b98490472cc65dbd080d34369447b3e9302585e1d5c099befd7c8b5e55f + languageName: node + linkType: hard + +"@pnpm/network.ca-file@npm:^1.0.1": + version: 1.0.2 + resolution: "@pnpm/network.ca-file@npm:1.0.2" + dependencies: + graceful-fs: "npm:4.2.10" + checksum: 10c0/95f6e0e38d047aca3283550719155ce7304ac00d98911e4ab026daedaf640a63bd83e3d13e17c623fa41ac72f3801382ba21260bcce431c14fbbc06430ecb776 + languageName: node + linkType: hard + +"@pnpm/npm-conf@npm:^2.1.0": + version: 2.3.1 + resolution: "@pnpm/npm-conf@npm:2.3.1" + dependencies: + "@pnpm/config.env-replace": "npm:^1.1.0" + "@pnpm/network.ca-file": "npm:^1.0.1" + config-chain: "npm:^1.1.11" + checksum: 10c0/778a3a34ff7d6000a2594d2a9821f873f737bc56367865718b2cf0ba5d366e49689efe7975148316d7afd8e6f1dcef7d736fbb6ea7ef55caadd1dc93a36bb302 + languageName: node + linkType: hard + +"@radix-ui/colors@npm:^2.1.0": + version: 2.1.0 + resolution: "@radix-ui/colors@npm:2.1.0" + checksum: 10c0/0ab0874f4363fc4393dbe9787daca8a27dbeb7e5915126b8d749244dfccfd9d9a08593a112836ff32552736a9f174845f44e2af6f4dc9a168eb3f1c336ebb1ea + languageName: node + linkType: hard + +"@radix-ui/number@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/number@npm:1.1.0" + checksum: 10c0/a48e34d5ff1484de1b7cf5d7317fefc831d49e96a2229f300fd37b657bd8cfb59c922830c00ec02838ab21de3b299a523474592e4f30882153412ed47edce6a4 + languageName: node + linkType: hard + +"@radix-ui/primitive@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/primitive@npm:1.1.1" + checksum: 10c0/6457bd8d1aa4ecb948e5d2a2484fc570698b2ab472db6d915a8f1eec04823f80423efa60b5ba840f0693bec2ca380333cc5f3b52586b40f407d9f572f9261f8d + languageName: node + linkType: hard + +"@radix-ui/react-accessible-icon@npm:^1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-accessible-icon@npm:1.1.2" + dependencies: + "@radix-ui/react-visually-hidden": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/75bb6b64c92b9aa1a9ceae72442dd506a91ba2d43941f389e012dd7b177c7dbb9ba01e293cc0a43b62209a4ecca3a38fe63cd6b28638bb4d816be27603243e2f + languageName: node + linkType: hard + +"@radix-ui/react-accordion@npm:^1.2.0": + version: 1.2.3 + resolution: "@radix-ui/react-accordion@npm:1.2.3" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collapsible": "npm:1.1.3" + "@radix-ui/react-collection": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/2036497884696453a888433dff87eda35ad72859d04205b5aef74aa72df8ca07557eafcc56a4e204a3f755d6f8895927b59453643be9542049d8ad2a969b7a9a + languageName: node + linkType: hard + +"@radix-ui/react-alert-dialog@npm:^1.0.2": + version: 1.1.6 + resolution: "@radix-ui/react-alert-dialog@npm:1.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dialog": "npm:1.1.6" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/87acd4313b4a2fb1233cc94685aeebf7051de20570cb1f11d1c805a6023582e9d487cbef811569d87e03745c4e4a42f011c0c8aa0998f54899e9c5fc2c778bbb + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-arrow@npm:1.1.2" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/38e1a338da1131f325e417ac456b1b6c16c76aa9da0635916262b4682d4e648226fd37b23348964a8e909c98b4d2293c7c5789be8f243cfe03856e6f0765cf5d + languageName: node + linkType: hard + +"@radix-ui/react-aspect-ratio@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-aspect-ratio@npm:1.1.2" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/112227918b97244f3613e82813d4b296eb1d4aef846164cc31f8501ebb8184a1eef395840c632f780f0c510bb3139a3ed94c45d739e1bb53a6e218c738888774 + languageName: node + linkType: hard + +"@radix-ui/react-avatar@npm:^1.0.1": + version: 1.1.3 + resolution: "@radix-ui/react-avatar@npm:1.1.3" + dependencies: + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/ecf0c2b8477346c087b6a22e2a01b6e2984a0722f0bcef9436f398386735e2ec83fbf20e3740b9e9b23ea5c5a43918cef14e009698dbffe6980e3c2d94aa5e16 + languageName: node + linkType: hard + +"@radix-ui/react-checkbox@npm:^1.0.1": + version: 1.1.4 + resolution: "@radix-ui/react-checkbox@npm:1.1.4" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-previous": "npm:1.1.0" + "@radix-ui/react-use-size": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/182db383c02affd874c5bd4f81ebd3786ddc5d6525b958984b40673cb1d8ff0336428bea18c19175f20b27a833120c441ec6a97433e9f731284e56ea1a9f13fd + languageName: node + linkType: hard + +"@radix-ui/react-collapsible@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-collapsible@npm:1.1.3" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/93511dd4406af8f47a9b1b289cb70bfe907e9e4460946a0fa64224058aee663b52137dc249af4c3b024538cb20c463ec1412499adbbdf44ed913f0eb6dea049c + languageName: node + linkType: hard + +"@radix-ui/react-collection@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-collection@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/8376aa0c0f38efbb45e5c0a2e8724b0ca2ccdab511f5aee4c3eb62a89959b20be0d4dd410b7068bc13d722751cbc88e916e10573784fb26b084c43f930818715 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-compose-refs@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/3e84580024e66e3cc5b9ae79355e787815c1d2a3c7d46e7f47900a29c33751ca24cf4ac8903314957ab1f7788aebe1687e2258641c188cf94653f7ddf8f70627 + languageName: node + linkType: hard + +"@radix-ui/react-context-menu@npm:^2.0.1": + version: 2.2.6 + resolution: "@radix-ui/react-context-menu@npm:2.2.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-menu": "npm:2.1.6" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/4381b3615206a95687d3c3b3e0d694fe1668f4bd66cdcde7bae958b4a2f833ab77b49d916aa46b721024df44f37f32907d735954862bca602633fa91d1140c4e + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-context@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/fc4ace9d79d7954c715ade765e06c95d7e1b12a63a536bcbe842fb904f03f88fc5bd6e38d44bd23243d37a270b4c44380fedddaeeae2d274f0b898a20665aba2 + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:1.1.6, @radix-ui/react-dialog@npm:^1.0.2": + version: 1.1.6 + resolution: "@radix-ui/react-dialog@npm:1.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-focus-guards": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/98e425549573c5d6fb0fee94ecd40427a8b8897bb2d9bb2a44fe64e484754376ff23b64fcf64e061d42fc774b9627a28cb5b1bb5652e567908dac9a8d8618705 + languageName: node + linkType: hard + +"@radix-ui/react-direction@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-direction@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/eb07d8cc3ae2388b824e0a11ae0e3b71fb0c49972b506e249cec9f27a5b7ef4305ee668c98b674833c92e842163549a83beb0a197dec1ec65774bdeeb61f932c + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.5" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-escape-keydown": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/05c5adfcd42a736c456f50bdca25bf7f6b25eef7328e4c05de535fea128328666433a89d68cb1445e039c188d7f1397df6a4a02e2da0970762f2a80fd29b48ea + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:^2.0.1": + version: 2.1.6 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-menu": "npm:2.1.6" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/1165cc6a7c914b4491f83b7ff2bd84e5c52016f5ee48ae9b841482ed09b349adb294a8269cc69ba5a20fee75400b521843130a490da7e81c39361f63092266ba + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-focus-guards@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/2e99750ca593083a530542a185d656b45b100752353a7a193a67566e3c256414a76fa9171d152f8c0167b8d6c1fdf62b2e07750d7af2974bf8ef39eb204aa537 + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-focus-scope@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/7b93866a9980bc938fc3fcfacfc49467c13144931c9b7a3b5423c0c3817685dc421499d73f58335f6c3c1c0f4fea9c9b7c16aa06a1d30571620787086082bea0 + languageName: node + linkType: hard + +"@radix-ui/react-icons@npm:^1.1.1": + version: 1.3.2 + resolution: "@radix-ui/react-icons@npm:1.3.2" + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + checksum: 10c0/3a380c7ae47e330ebd8ab4846729a543b4a0be5ecb1e2a7a571f4394728ff7d428b01f6620128051b6b69d63138a0ab8de77af78221ec364fbc5d126acf55b4a + languageName: node + linkType: hard + +"@radix-ui/react-id@npm:1.1.0, @radix-ui/react-id@npm:^1.0.0": + version: 1.1.0 + resolution: "@radix-ui/react-id@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/acf13e29e51ee96336837fc0cfecc306328b20b0e0070f6f0f7aa7a621ded4a1ee5537cfad58456f64bae76caa7f8769231e88dc7dc106197347ee433c275a79 + languageName: node + linkType: hard + +"@radix-ui/react-label@npm:^2.0.0": + version: 2.1.2 + resolution: "@radix-ui/react-label@npm:2.1.2" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/c425ea25a67f60142645e6dd7669aa90bd9017e8d99c347736c9c19c44cea52e33224e4d086fd7e4945a7e9baa49335d42a5801d3bead884305515023e3ab31c + languageName: node + linkType: hard + +"@radix-ui/react-menu@npm:2.1.6": + version: 2.1.6 + resolution: "@radix-ui/react-menu@npm:2.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-focus-guards": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-slot": "npm:1.1.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/0b5420f181e38ec146572f56ebe51a4e7f28663939f8149a246f5d319b79633574fa35a3f3c7c85deb44a6fe31d94af62a34407b1a8e97c1eae99cfca5db40ed + languageName: node + linkType: hard + +"@radix-ui/react-navigation-menu@npm:^1.2.0": + version: 1.2.5 + resolution: "@radix-ui/react-navigation-menu@npm:1.2.5" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + "@radix-ui/react-use-previous": "npm:1.1.0" + "@radix-ui/react-visually-hidden": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/fba44c307cff567eabcf98863ca458ddefa242c0252f1b73dc8e7ead690d431454f55b6db28161f0ee6a19b734cd68d85bc998966bcd90b1d1dc08b01f83e28f + languageName: node + linkType: hard + +"@radix-ui/react-popover@npm:^1.1.2": + version: 1.1.6 + resolution: "@radix-ui/react-popover@npm:1.1.6" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-focus-guards": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/63cc2761693193f8c28c43a25d9eea69e4095ba47da11413dfa19436d6116c814851c388ab78f93a3bda0cc88ec4c234bd31d971ade2fcfbc08a0645ccde1d91 + languageName: node + linkType: hard + +"@radix-ui/react-popper@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-popper@npm:1.2.2" + dependencies: + "@floating-ui/react-dom": "npm:^2.0.0" + "@radix-ui/react-arrow": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + "@radix-ui/react-use-rect": "npm:1.1.0" + "@radix-ui/react-use-size": "npm:1.1.0" + "@radix-ui/rect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/556cef98c0fe50bcfaaa4ae2e85af737755c884b78a04b6bdac3682829051ea0a4cf1163fc8bde782e33280613424e2ebb10b8af507da53e1aea08966c13cc86 + languageName: node + linkType: hard + +"@radix-ui/react-portal@npm:1.1.4, @radix-ui/react-portal@npm:^1.0.1": + version: 1.1.4 + resolution: "@radix-ui/react-portal@npm:1.1.4" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/e4038eb2f20be10d9754d099d00620f429711919d20c4c630946d9c4941f1c83ef1a3f4110c221c70486e65bc565ebba4ada22a0e7e2d179c039f2a014300793 + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-presence@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/0c6fa281368636308044df3be4c1f02733094b5e35ba04f26e610dd1c4315a245ffc758e0e176c444742a7a46f4328af1a9d8181e860175ec39338d06525a78d + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.0.2": + version: 2.0.2 + resolution: "@radix-ui/react-primitive@npm:2.0.2" + dependencies: + "@radix-ui/react-slot": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/1af7a33a86f8bd2467f2300b1bb6ca9af67cae3950953ba543d2a625c17f341dff05d19056ece7b03e5ced8b9f8de99c74f806710ce0da6b9a000f2af063fffe + languageName: node + linkType: hard + +"@radix-ui/react-progress@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-progress@npm:1.1.2" + dependencies: + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/6aa52b17b0d0858fd7346817f23912fb6a516c3c1aa3b4c3d6f9ed1e9790ccf3529f079eaecb4d9c4ff487f1cc296b6d164941261e124085585746b862cccfc0 + languageName: node + linkType: hard + +"@radix-ui/react-radio-group@npm:^1.1.0": + version: 1.2.3 + resolution: "@radix-ui/react-radio-group@npm:1.2.3" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-previous": "npm:1.1.0" + "@radix-ui/react-use-size": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/6e576b69675ab7f6575643080cf334da913629615adcf0031bbaeeb7ba84f63b0b6050def424f4f372f9beef6f9b4006e4d89ea3f86bb888192e1c5edf77d6b0 + languageName: node + linkType: hard + +"@radix-ui/react-roving-focus@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-roving-focus@npm:1.1.2" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/80e378e1156d5b8af14995e908fe2358c8f4757fbf274e30d2ee3c1cedc3a0c7192524df7e3bb1d5011ee9ab8ab7445b60eff06617370e58abcd1ae97e0e40f6 + languageName: node + linkType: hard + +"@radix-ui/react-separator@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-separator@npm:1.1.2" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/9efffd4319ab25210702cbacd5a3fe15f22ab9e29afe407b778112056e6a2e1e43847f1ad5f5b73bff5d604722a4fdabd66816216e7ad8f627f7b4c20a19174e + languageName: node + linkType: hard + +"@radix-ui/react-slider@npm:^1.1.0": + version: 1.2.3 + resolution: "@radix-ui/react-slider@npm:1.2.3" + dependencies: + "@radix-ui/number": "npm:1.1.0" + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + "@radix-ui/react-use-previous": "npm:1.1.0" + "@radix-ui/react-use-size": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/d1b3b193e3a290e734d911d99ddc2d8857c21cd1bebd3c6607c5e034c02e410b77be9d836479de2240c283cd9e2017ac6f5c5fec37f9b3c64e1abe46581327d1 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.1.2, @radix-ui/react-slot@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-slot@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/81d45091806c52b507cec80b4477e4f31189d76ffcd7845b382eb3a034e6cf1faef71b881612028d5893f7580bf9ab59daa18fbf2792042dccd755c99a18df67 + languageName: node + linkType: hard + +"@radix-ui/react-switch@npm:^1.0.1": + version: 1.1.3 + resolution: "@radix-ui/react-switch@npm:1.1.3" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-use-previous": "npm:1.1.0" + "@radix-ui/react-use-size": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/d307953b38cb83d832f69873c95709ba6cd870b7eda4cc682225f79cc37533c93f77eebd8086000b7ceb3bd6ae58e9653ef27c43b781b2a62f558cafb0c0f9a8 + languageName: node + linkType: hard + +"@radix-ui/react-tabs@npm:^1.0.1": + version: 1.1.3 + resolution: "@radix-ui/react-tabs@npm:1.1.3" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/2f621c43a8e1dd0d54c828f8b4d88414c9114af6b720a650ad9587cc0a7a7536da778f2fe5181a38494cc2956f2b238fbe64790f6daad1d058b34f4acaee520e + languageName: node + linkType: hard + +"@radix-ui/react-toggle-group@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-toggle-group@npm:1.1.2" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-direction": "npm:1.1.0" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-toggle": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/df08a9114990b675882700228c21ff1aea1b83963c0190d91f54c1287c2217676eb830c161a5d6ed8185827cf3ba5fe29181d8803d4dc51328700bcfd4c9777c + languageName: node + linkType: hard + +"@radix-ui/react-toggle@npm:1.1.2, @radix-ui/react-toggle@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-toggle@npm:1.1.2" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/2cd8dc6b64c2680f4c0662ff2424963e8cc432de3a925a549e8fd5e5e7b48da1a08434ef4ab49b6b627faea1628160f89a16f098399104ed06a00220170f72a2 + languageName: node + linkType: hard + +"@radix-ui/react-tooltip@npm:^1.1.6": + version: 1.1.8 + resolution: "@radix-ui/react-tooltip@npm:1.1.8" + dependencies: + "@radix-ui/primitive": "npm:1.1.1" + "@radix-ui/react-compose-refs": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" + "@radix-ui/react-id": "npm:1.1.0" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" + "@radix-ui/react-presence": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" + "@radix-ui/react-use-controllable-state": "npm:1.1.0" + "@radix-ui/react-visually-hidden": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/696486eb472686e3fa7af1efa7ba10b177543c60b9f3caa7365b4527a11e3d6019b655cf820b3aa23d931b4bd2100b68f9d4125fee542abf0d44e401896615a1 + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/e954863f3baa151faf89ac052a5468b42650efca924417470efd1bd254b411a94c69c30de2fdbb90187b38cb984795978e12e30423dc41e4309d93d53b66d819 + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-controllable-state@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/2af883b5b25822ac226e60a6bfde647c0123a76345052a90219026059b3f7225844b2c13a9a16fba859c1cda5fb3d057f2a04503f71780e607516492db4eb3a1 + languageName: node + linkType: hard + +"@radix-ui/react-use-escape-keydown@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/910fd696e5a0994b0e06b9cb68def8a865f47951a013ec240c77db2a9e1e726105602700ef5e5f01af49f2f18fe0e73164f9a9651021f28538ef8a30d91f3fbb + languageName: node + linkType: hard + +"@radix-ui/react-use-layout-effect@npm:1.1.0, @radix-ui/react-use-layout-effect@npm:^1.0.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9bf87ece1845c038ed95863cfccf9d75f557c2400d606343bab0ab3192b9806b9840e6aa0a0333fdf3e83cf9982632852192f3e68d7d8367bc8c788dfdf8e62b + languageName: node + linkType: hard + +"@radix-ui/react-use-previous@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-previous@npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9787d24790d4e330715127f2f4db56c4cbed9b0a47f97e11a68582c08a356a53c1ec41c7537382f6fb8d0db25de152770f17430e8eaf0fa59705be97760acbad + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-rect@npm:1.1.0" + dependencies: + "@radix-ui/rect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/c2e30150ab49e2cec238cda306fd748c3d47fb96dcff69a3b08e1d19108d80bac239d48f1747a25dadca614e3e967267d43b91e60ea59db2befbc7bea913ff84 + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-size@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.0" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/4c8b89037597fdc1824d009e0c941b510c7c6c30f83024cc02c934edd748886786e7d9f36f57323b02ad29833e7fa7e8974d81969b4ab33d8f41661afa4f30a6 + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:1.1.2, @radix-ui/react-visually-hidden@npm:^1.0.1": + version: 1.1.2 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.2" + dependencies: + "@radix-ui/react-primitive": "npm:2.0.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/ea6dc8ec284b32bca6f24809db257394802e14af7c95e4a237af51009fa222c42e3b7a55b3bfc94d753f509086636555058ae8e535be25956c46529abf41b448 + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/rect@npm:1.1.0" + checksum: 10c0/a26ff7f8708fb5f2f7949baad70a6b2a597d761ee4dd4aadaf1c1a33ea82ea23dfef6ce6366a08310c5d008cdd60b2e626e4ee03fa342bd5f246ddd9d427f6be + languageName: node + linkType: hard + +"@rehookify/datepicker@npm:^6.6.7": + version: 6.6.8 + resolution: "@rehookify/datepicker@npm:6.6.8" + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + checksum: 10c0/ab7900e8f65cee9f455865dc59bc4cccab7494856b3a2aab5367c642b3e955d1f372f091acd055cf682a7923759999d4bc32a07e8427d3ab09fd7b7baff16f08 + languageName: node + linkType: hard + +"@remix-run/router@npm:1.15.1": + version: 1.15.1 + resolution: "@remix-run/router@npm:1.15.1" + checksum: 10c0/2f84d998defe9943a40fd5bf8794ee6ede521116ff24275cc2294830adb039ef86e34dbdd6555300600016fd8a58a244d4f4df73ff0b2cec7bd749f63d172587 + languageName: node + linkType: hard + +"@rollup/plugin-babel@npm:^5.3.1": + version: 5.3.1 + resolution: "@rollup/plugin-babel@npm:5.3.1" + dependencies: + "@babel/helper-module-imports": "npm:^7.10.4" + "@rollup/pluginutils": "npm:^3.1.0" + peerDependencies: + "@babel/core": ^7.0.0 + "@types/babel__core": ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + "@types/babel__core": + optional: true + checksum: 10c0/2766134dd5567c0d4fd6909d1f511ce9bf3bd9d727e1bc5ffdd6097a3606faca324107ae8e0961839ee4dbb45e5e579ae601efe472fc0a271259aea79920cafa + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^3.1.0": + version: 3.1.0 + resolution: "@rollup/pluginutils@npm:3.1.0" + dependencies: + "@types/estree": "npm:0.0.39" + estree-walker: "npm:^1.0.1" + picomatch: "npm:^2.2.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0 + checksum: 10c0/7151753160d15ba2b259461a6c25b3932150994ea52dba8fd3144f634c7647c2e56733d986e2c15de67c4d96a9ee7d6278efa6d2e626a7169898fd64adc0f90c + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^4.1.2": + version: 4.2.1 + resolution: "@rollup/pluginutils@npm:4.2.1" + dependencies: + estree-walker: "npm:^2.0.1" + picomatch: "npm:^2.2.2" + checksum: 10c0/3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.2": + version: 5.1.4 + resolution: "@rollup/pluginutils@npm:5.1.4" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.39.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-android-arm64@npm:4.39.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.39.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.39.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.39.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.39.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.39.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.39.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.39.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.39.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.39.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.39.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.39.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.39.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.39.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.39.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.39.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.39.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.39.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.39.0": + version: 4.39.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.39.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b + languageName: node + linkType: hard + +"@samverschueren/stream-to-observable@npm:^0.3.0": + version: 0.3.1 + resolution: "@samverschueren/stream-to-observable@npm:0.3.1" + dependencies: + any-observable: "npm:^0.3.0" + peerDependenciesMeta: + rxjs: + optional: true + zen-observable: + optional: true + checksum: 10c0/0d874453f6bc2460d71783292291f52feb36c2a75314b1072a6ffe6206562f33e9d664a554348d565a6b54da9041d75070371052545bc329caaa52f64216987f + languageName: node + linkType: hard + +"@semantic-release/commit-analyzer@npm:^9.0.2": + version: 9.0.2 + resolution: "@semantic-release/commit-analyzer@npm:9.0.2" + dependencies: + conventional-changelog-angular: "npm:^5.0.0" + conventional-commits-filter: "npm:^2.0.0" + conventional-commits-parser: "npm:^3.2.3" + debug: "npm:^4.0.0" + import-from: "npm:^4.0.0" + lodash: "npm:^4.17.4" + micromatch: "npm:^4.0.2" + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + checksum: 10c0/bcb50712d1b13e9439e08046817e3a3b22e015754df44c55cf88334d8c3922455cb50d0c9b06896bdc2282ab0e95d132d04a48583a835cecf7457a9d39776f01 + languageName: node + linkType: hard + +"@semantic-release/error@npm:^3.0.0": + version: 3.0.0 + resolution: "@semantic-release/error@npm:3.0.0" + checksum: 10c0/51f06d11186a6efc543b44996ca1c368a77c6ed18dd823f0362188c37b7ef32f3580bd17654f594e6a72b931ebe69b44bbcb1ee16c755a1d3e44dcb652b47275 + languageName: node + linkType: hard + +"@semantic-release/github@npm:^8.0.0, @semantic-release/github@npm:^8.0.2": + version: 8.1.0 + resolution: "@semantic-release/github@npm:8.1.0" + dependencies: + "@octokit/core": "npm:^4.2.1" + "@octokit/plugin-paginate-rest": "npm:^6.1.2" + "@octokit/plugin-retry": "npm:^4.1.3" + "@octokit/plugin-throttling": "npm:^5.2.3" + "@semantic-release/error": "npm:^3.0.0" + aggregate-error: "npm:^3.0.0" + debug: "npm:^4.0.0" + dir-glob: "npm:^3.0.0" + fs-extra: "npm:^11.0.0" + globby: "npm:^11.0.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.0" + issue-parser: "npm:^6.0.0" + lodash: "npm:^4.17.4" + mime: "npm:^3.0.0" + p-filter: "npm:^2.0.0" + url-join: "npm:^4.0.0" + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + checksum: 10c0/2a1bb1e7eb04c7a7dfcb6bd95c36371c71a80c158515f4e2ef946e31a4c698818150c1ac6cdaf63704fe6c91586ad5b5b28e7dc58ababe8c255418e0cea1c492 + languageName: node + linkType: hard + +"@semantic-release/npm@npm:^9.0.0": + version: 9.0.2 + resolution: "@semantic-release/npm@npm:9.0.2" + dependencies: + "@semantic-release/error": "npm:^3.0.0" + aggregate-error: "npm:^3.0.0" + execa: "npm:^5.0.0" + fs-extra: "npm:^11.0.0" + lodash: "npm:^4.17.15" + nerf-dart: "npm:^1.0.0" + normalize-url: "npm:^6.0.0" + npm: "npm:^8.3.0" + rc: "npm:^1.2.8" + read-pkg: "npm:^5.0.0" + registry-auth-token: "npm:^5.0.0" + semver: "npm:^7.1.2" + tempy: "npm:^1.0.0" + peerDependencies: + semantic-release: ">=19.0.0" + checksum: 10c0/4efa3b2b859d461b499f7800429e1a7986bd45f0a2a47cd1ce0b51f6e575984b25583444ffd7aa993a3cbc625b85df482917c94d1513b5e3a882cfdda56c6eef + languageName: node + linkType: hard + +"@semantic-release/release-notes-generator@npm:^10.0.0, @semantic-release/release-notes-generator@npm:^10.0.3": + version: 10.0.3 + resolution: "@semantic-release/release-notes-generator@npm:10.0.3" + dependencies: + conventional-changelog-angular: "npm:^5.0.0" + conventional-changelog-writer: "npm:^5.0.0" + conventional-commits-filter: "npm:^2.0.0" + conventional-commits-parser: "npm:^3.2.3" + debug: "npm:^4.0.0" + get-stream: "npm:^6.0.0" + import-from: "npm:^4.0.0" + into-stream: "npm:^6.0.0" + lodash: "npm:^4.17.4" + read-pkg-up: "npm:^7.0.0" + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + checksum: 10c0/bf1a5244d7df353afbb68cf0e5f1d40bd4e6472bd75bd0b0c7547a179bce14b6a9ef5529e5fdec5c15566e798acc91991e14914a3083bad828d17bd8d0c0e45b + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^4.0.0": + version: 4.6.0 + resolution: "@sindresorhus/is@npm:4.6.0" + checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e + languageName: node + linkType: hard + +"@sindresorhus/is@npm:^5.2.0, @sindresorhus/is@npm:^5.3.0": + version: 5.6.0 + resolution: "@sindresorhus/is@npm:5.6.0" + checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52 + languageName: node + linkType: hard + +"@stitches/react@npm:1.2.7": + version: 1.2.7 + resolution: "@stitches/react@npm:1.2.7" + peerDependencies: + react: ">= 16.3.0" + checksum: 10c0/c5da5e4b862306d2dd0545765c497bf5b972315a801ee7120374c13950db49587fe3f3ef5282be1ce189f9de2acbe3a4d0f8ba40283fe058b8d056674a336e60 + languageName: node + linkType: hard + +"@storybook/addon-actions@npm:8.6.12, @storybook/addon-actions@npm:^8.2.2": + version: 8.6.12 + resolution: "@storybook/addon-actions@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + "@types/uuid": "npm:^9.0.1" + dequal: "npm:^2.0.2" + polished: "npm:^4.2.2" + uuid: "npm:^9.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/f05a876966f170a65d51405f0908e7db74daba033c2468f7de35e17d800960b0201d8edfe822508346c1e7f2f664c9e601cadf9673a17a41e4afafd1af922241 + languageName: node + linkType: hard + +"@storybook/addon-backgrounds@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-backgrounds@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + memoizerific: "npm:^1.11.3" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/220adbe8e5b1120de449eb74a307b8ebe44e018138a676f9bafa7bb7adae00ceee9d0b9619dc55bff2ff9a261f932d992cb43dbe79f25e1fc249e2a0ae02d4e2 + languageName: node + linkType: hard + +"@storybook/addon-controls@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-controls@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + dequal: "npm:^2.0.2" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/6521a98f31d5cd436795428884085b766424e9f71d1add34dc4d5470985500145dd90a7e57282affd3c1b31dfc3e6e4582640347f876acdf0be880b7734aca3b + languageName: node + linkType: hard + +"@storybook/addon-docs@npm:8.6.12, @storybook/addon-docs@npm:^8.2.5": + version: 8.6.12 + resolution: "@storybook/addon-docs@npm:8.6.12" + dependencies: + "@mdx-js/react": "npm:^3.0.0" + "@storybook/blocks": "npm:8.6.12" + "@storybook/csf-plugin": "npm:8.6.12" + "@storybook/react-dom-shim": "npm:8.6.12" + react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/6a973bcdb4a1fdf369078d7a2e5b527756f982f6652868bf15f1fc0c7da472d15f385079b1b012ec4cda1c7e7940238a4210d7bd729fee92c20661c8f3ace32c + languageName: node + linkType: hard + +"@storybook/addon-essentials@npm:^8.2.5": + version: 8.6.12 + resolution: "@storybook/addon-essentials@npm:8.6.12" + dependencies: + "@storybook/addon-actions": "npm:8.6.12" + "@storybook/addon-backgrounds": "npm:8.6.12" + "@storybook/addon-controls": "npm:8.6.12" + "@storybook/addon-docs": "npm:8.6.12" + "@storybook/addon-highlight": "npm:8.6.12" + "@storybook/addon-measure": "npm:8.6.12" + "@storybook/addon-outline": "npm:8.6.12" + "@storybook/addon-toolbars": "npm:8.6.12" + "@storybook/addon-viewport": "npm:8.6.12" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/ce018694d1ee07ab8b8efcebfe3efdf1c2163068a3907b46591b040e1876b84f68fe78bb0a43f23b50b824ea6c410aacef416d03833a77fe359b2e81b3be5b03 + languageName: node + linkType: hard + +"@storybook/addon-highlight@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-highlight@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/c2b31583fff2cd54a85b1138a62c61b86db95704db815f0396e75ca6f1317329cfae1c6ed630914a058da2d386078d7934f21063e6d4e55ed1baf2632cfee3cb + languageName: node + linkType: hard + +"@storybook/addon-links@npm:^8.2.2": + version: 8.6.12 + resolution: "@storybook/addon-links@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.12 + peerDependenciesMeta: + react: + optional: true + checksum: 10c0/c90e6e81c486b94a172ebd9fa40d32c02cfe498bc1bb9536fe437842d513668ea015c328a49836de289c20801ee330457868793a7c70fd053dfc7441bf86df61 + languageName: node + linkType: hard + +"@storybook/addon-measure@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-measure@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + tiny-invariant: "npm:^1.3.1" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/1247ebf398b6297400d710a00d423c9d285c8af6f9bf7dd98a7734f54cc5689d7d3a3bf5a1e93847f5eb13d7edfe75900ac28b27932555292f09efe0c4093c28 + languageName: node + linkType: hard + +"@storybook/addon-outline@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-outline@npm:8.6.12" + dependencies: + "@storybook/global": "npm:^5.0.0" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/2e1c448b932dea10d1d13b8375e154d4f8bbd1144d7e4b35a909f773c72dd041995915becfd438c02b6611e57929ee61c4d4b9af59ef6fddb222baa8c9a66e6f + languageName: node + linkType: hard + +"@storybook/addon-toolbars@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-toolbars@npm:8.6.12" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/6a7cde7eb84f8f533e96371bec7a37b55aa3e462518bc37c1762cabbd37e2dc45ff48c9708ca6034ea55d272f8b9b3a28f2e94b63056d2ab3855458b664c60bc + languageName: node + linkType: hard + +"@storybook/addon-viewport@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/addon-viewport@npm:8.6.12" + dependencies: + memoizerific: "npm:^1.11.3" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/72a570f4f45ba5c0d1515a14d2e03d04bb510ffc4b8181237f7c787c8d2a6eb6429e4cd048256dafec75bb9a764c4a155c022eed0d6476e7fd7da27f01949db4 + languageName: node + linkType: hard + +"@storybook/blocks@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/blocks@npm:8.6.12" + dependencies: + "@storybook/icons": "npm:^1.2.12" + ts-dedent: "npm:^2.0.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^8.6.12 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10c0/ce15861061888b73a2f05e2fa1dd8947dd37904e61a978299f96c19f3a45b7a65eca265bd10ba101b2e56dcb24f5ff1871cdaff86640142fe46d8491b7b4ac12 + languageName: node + linkType: hard + +"@storybook/builder-vite@npm:8.6.12, @storybook/builder-vite@npm:^8.2.5": + version: 8.6.12 + resolution: "@storybook/builder-vite@npm:8.6.12" + dependencies: + "@storybook/csf-plugin": "npm:8.6.12" + browser-assert: "npm:^1.2.1" + ts-dedent: "npm:^2.0.0" + peerDependencies: + storybook: ^8.6.12 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + checksum: 10c0/cf02c9095a7cf12ac1e372f5e8dc01193c4ae298f16416538de514687b9776a4eda478ff01e5ba73e87e4f3603d8453a6a374dde1673fa22abea103135524892 + languageName: node + linkType: hard + +"@storybook/components@npm:8.6.12, @storybook/components@npm:^8.0.0": + version: 8.6.12 + resolution: "@storybook/components@npm:8.6.12" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 10c0/f443f41354d382307734f0507989ffd78d9b3fb9413122487d5e01927057d34b9526bb9ee6b5343cee806a650d6eef2aecf5112af5b0817eeb3204b1ac4fdc3d + languageName: node + linkType: hard + +"@storybook/core-events@npm:^8.0.0": + version: 8.6.12 + resolution: "@storybook/core-events@npm:8.6.12" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 10c0/2f0427afb97cd445e7dde5cde9022ae65ef4a9b2c79e2d6f51757d7bd53fb844b4167a85d21d3904ea5f6b95f46df4ca34fca0ead0ae6e992884123ebabc4af0 + languageName: node + linkType: hard + +"@storybook/core@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/core@npm:8.6.12" + dependencies: + "@storybook/theming": "npm:8.6.12" + better-opn: "npm:^3.0.2" + browser-assert: "npm:^1.2.1" + esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" + esbuild-register: "npm:^3.5.0" + jsdoc-type-pratt-parser: "npm:^4.0.0" + process: "npm:^0.11.10" + recast: "npm:^0.23.5" + semver: "npm:^7.6.2" + util: "npm:^0.12.5" + ws: "npm:^8.2.3" + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + checksum: 10c0/e21f2408c3fdd125033dbbbdd91d264a9cf0bd60e6f5c047b74306fed2ad8d32e39d3dad3a6bafc4b7a8f0b25451a328569f921d82de5d07b004f150e1973840 + languageName: node + linkType: hard + +"@storybook/csf-plugin@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/csf-plugin@npm:8.6.12" + dependencies: + unplugin: "npm:^1.3.1" + peerDependencies: + storybook: ^8.6.12 + checksum: 10c0/8bb5b9612178ff997cb21bd957b7918a6a7cd58fb5f3249e6ec2f3a4a039d3ff4f40b873360f202a56cf64d1235bb88a32ef5e308d3a663f294f925257943472 + languageName: node + linkType: hard + +"@storybook/global@npm:^5.0.0": + version: 5.0.0 + resolution: "@storybook/global@npm:5.0.0" + checksum: 10c0/8f1b61dcdd3a89584540896e659af2ecc700bc740c16909a7be24ac19127ea213324de144a141f7caf8affaed017d064fea0618d453afbe027cf60f54b4a6d0b + languageName: node + linkType: hard + +"@storybook/icons@npm:^1.2.12, @storybook/icons@npm:^1.2.5": + version: 1.4.0 + resolution: "@storybook/icons@npm:1.4.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + checksum: 10c0/fd0514fb3fa431a8b5939fe1d9fc336b253ef2c25b34792d2d4ee59e13321108d34f8bf223a0981482f54f83c5ef47ffd1a98c376ca9071011c1b8afe2b01d43 + languageName: node + linkType: hard + +"@storybook/manager-api@npm:8.6.12, @storybook/manager-api@npm:^8.0.0": + version: 8.6.12 + resolution: "@storybook/manager-api@npm:8.6.12" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 10c0/88a0d361c27c53f0f7cd32564d404a5e5a3fa129136449003e8ecaecd63fd8e38ddeeda30f189fffddf24a14b674e7d0400003b4dbbdafedfae7d37bbc32272f + languageName: node + linkType: hard + +"@storybook/preview-api@npm:8.6.12, @storybook/preview-api@npm:^8.2.2": + version: 8.6.12 + resolution: "@storybook/preview-api@npm:8.6.12" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 10c0/38044f40a0ac060ab33ed84eff62da1a99cdb5a2f73e6786b58da4cf5c4295d4ef060373f1fdaa1bfe6cccea8e123768d046555adf98a4acf1abda40fa3e9781 + languageName: node + linkType: hard + +"@storybook/react-dom-shim@npm:8.6.12": + version: 8.6.12 + resolution: "@storybook/react-dom-shim@npm:8.6.12" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.12 + checksum: 10c0/feb0447599c2728039ed46a0fbd7fa3f8644b80518bc7e94b3687125317ce7c9aa13acb6a8279a50f1cd63aefcc7a1e9cbe64d1a9e71afbe3c3d33656063b814 + languageName: node + linkType: hard + +"@storybook/react-vite@npm:^8.2.5": + version: 8.6.12 + resolution: "@storybook/react-vite@npm:8.6.12" + dependencies: + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.5.0" + "@rollup/pluginutils": "npm:^5.0.2" + "@storybook/builder-vite": "npm:8.6.12" + "@storybook/react": "npm:8.6.12" + find-up: "npm:^5.0.0" + magic-string: "npm:^0.30.0" + react-docgen: "npm:^7.0.0" + resolve: "npm:^1.22.8" + tsconfig-paths: "npm:^4.2.0" + peerDependencies: + "@storybook/test": 8.6.12 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.12 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + "@storybook/test": + optional: true + checksum: 10c0/77e8e3c32d2687c2f4a41f0d83a418413cb8b634d63d8092983036f897a06140ad3c06328f80c88815d858c070b5952963004e3d4cc2a748828c0e97339c7d53 + languageName: node + linkType: hard + +"@storybook/react@npm:8.6.12, @storybook/react@npm:^8.2.5": + version: 8.6.12 + resolution: "@storybook/react@npm:8.6.12" + dependencies: + "@storybook/components": "npm:8.6.12" + "@storybook/global": "npm:^5.0.0" + "@storybook/manager-api": "npm:8.6.12" + "@storybook/preview-api": "npm:8.6.12" + "@storybook/react-dom-shim": "npm:8.6.12" + "@storybook/theming": "npm:8.6.12" + peerDependencies: + "@storybook/test": 8.6.12 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.12 + typescript: ">= 4.2.x" + peerDependenciesMeta: + "@storybook/test": + optional: true + typescript: + optional: true + checksum: 10c0/62d44f6c310577520d1c400cf80001c53d3db995dca6845e1b4e749422705e80825d337d1ba42c196453b2b5d66aa6d402127037546cf9f51afed5fce095e152 + languageName: node + linkType: hard + +"@storybook/theming@npm:8.6.12, @storybook/theming@npm:^8.0.0, @storybook/theming@npm:^8.2.2": + version: 8.6.12 + resolution: "@storybook/theming@npm:8.6.12" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 10c0/cd7033dbc9415d765fd15a60c058ea039ce02a84c7cdbe6d7e597adb418694f28ac7cacf849cccef1e8b4374e7fa0df5010f801e6b55844c2fa391968eecba3c + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: "npm:^2.0.0" + checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" + dependencies: + defer-to-connect: "npm:^2.0.1" + checksum: 10c0/4629d2fbb2ea67c2e9dc03af235c0991c79ebdddcbc19aed5d5732fb29ce01c13331e9b1a491584b9069bd6ecde6581dcbf871f11b7eefdebbab34de6cf2197e + languageName: node + linkType: hard + +"@testing-library/dom@npm:^9.0.0": + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.1.3" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10c0/147da340e8199d7f98f3a4ad8aa22ed55b914b83957efa5eb22bfea021a979ebe5a5182afa9c1e5b7a5f99a7f6744a5a4d9325ae46ec3b33b5a15aed8750d794 + languageName: node + linkType: hard + +"@testing-library/jest-dom@npm:^6.4.2": + version: 6.6.3 + resolution: "@testing-library/jest-dom@npm:6.6.3" + dependencies: + "@adobe/css-tools": "npm:^4.4.0" + aria-query: "npm:^5.0.0" + chalk: "npm:^3.0.0" + css.escape: "npm:^1.5.1" + dom-accessibility-api: "npm:^0.6.3" + lodash: "npm:^4.17.21" + redent: "npm:^3.0.0" + checksum: 10c0/5566b6c0b7b0709bc244aec3aa3dc9e5f4663e8fb2b99d8cd456fc07279e59db6076cbf798f9d3099a98fca7ef4cd50e4e1f4c4dec5a60a8fad8d24a638a5bf6 + languageName: node + linkType: hard + +"@testing-library/react@npm:^14.2.1": + version: 14.3.1 + resolution: "@testing-library/react@npm:14.3.1" + dependencies: + "@babel/runtime": "npm:^7.12.5" + "@testing-library/dom": "npm:^9.0.0" + "@types/react-dom": "npm:^18.0.0" + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + checksum: 10c0/1ccf4eb1510500cc20a805cb0244c9098dca28a8745173a8f71ea1274d63774f0b7898a35c878b43c797b89c13621548909ff37843b835c1a27ee1efbbdd098c + languageName: node + linkType: hard + +"@testing-library/user-event@npm:^14.5.2": + version: 14.6.1 + resolution: "@testing-library/user-event@npm:14.6.1" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10c0/75fea130a52bf320d35d46ed54f3eec77e71a56911b8b69a3fe29497b0b9947b2dc80d30f04054ad4ce7f577856ae3e5397ea7dff0ef14944d3909784c7a93fe + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: 10c0/073bfa548026b1ebaf1659eb8961e526be22fa77139b10d60e712f46d2f0f05f4e6c8bec62a087d41088ee9e29faa7f54838568e475ab2f776171003c3920858 + languageName: node + linkType: hard + +"@traefiklabs/faency@npm:11.1.4": + version: 11.1.4 + resolution: "@traefiklabs/faency@npm:11.1.4" + dependencies: + "@babel/core": "npm:^7.15.4" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.16.7" + "@babel/preset-env": "npm:^7.16.11" + "@babel/preset-react": "npm:^7.16.7" + "@babel/preset-typescript": "npm:^7.16.7" + "@floating-ui/react": "npm:^0.26.25" + "@mdx-js/react": "npm:^2.1.5" + "@radix-ui/colors": "npm:^2.1.0" + "@radix-ui/react-accessible-icon": "npm:^1.1.2" + "@radix-ui/react-accordion": "npm:^1.2.0" + "@radix-ui/react-alert-dialog": "npm:^1.0.2" + "@radix-ui/react-aspect-ratio": "npm:^1.0.1" + "@radix-ui/react-avatar": "npm:^1.0.1" + "@radix-ui/react-checkbox": "npm:^1.0.1" + "@radix-ui/react-context-menu": "npm:^2.0.1" + "@radix-ui/react-dialog": "npm:^1.0.2" + "@radix-ui/react-dropdown-menu": "npm:^2.0.1" + "@radix-ui/react-icons": "npm:^1.1.1" + "@radix-ui/react-id": "npm:^1.0.0" + "@radix-ui/react-label": "npm:^2.0.0" + "@radix-ui/react-navigation-menu": "npm:^1.2.0" + "@radix-ui/react-popover": "npm:^1.1.2" + "@radix-ui/react-portal": "npm:^1.0.1" + "@radix-ui/react-progress": "npm:^1.0.1" + "@radix-ui/react-radio-group": "npm:^1.1.0" + "@radix-ui/react-separator": "npm:^1.0.1" + "@radix-ui/react-slider": "npm:^1.1.0" + "@radix-ui/react-slot": "npm:^1.0.1" + "@radix-ui/react-switch": "npm:^1.0.1" + "@radix-ui/react-tabs": "npm:^1.0.1" + "@radix-ui/react-toggle": "npm:^1.0.1" + "@radix-ui/react-toggle-group": "npm:^1.0.1" + "@radix-ui/react-tooltip": "npm:^1.1.6" + "@radix-ui/react-use-layout-effect": "npm:^1.0.0" + "@radix-ui/react-visually-hidden": "npm:^1.0.1" + "@rehookify/datepicker": "npm:^6.6.7" + "@rollup/plugin-babel": "npm:^5.3.1" + "@semantic-release/commit-analyzer": "npm:^9.0.2" + "@semantic-release/github": "npm:^8.0.2" + "@semantic-release/npm": "npm:^9.0.0" + "@semantic-release/release-notes-generator": "npm:^10.0.3" + "@stitches/react": "npm:1.2.7" + "@storybook/addon-actions": "npm:^8.2.2" + "@storybook/addon-docs": "npm:^8.2.5" + "@storybook/addon-essentials": "npm:^8.2.5" + "@storybook/addon-links": "npm:^8.2.2" + "@storybook/builder-vite": "npm:^8.2.5" + "@storybook/preview-api": "npm:^8.2.2" + "@storybook/react": "npm:^8.2.5" + "@storybook/react-vite": "npm:^8.2.5" + "@storybook/theming": "npm:^8.2.2" + "@types/jest": "npm:^27.4.1" + "@types/jest-axe": "npm:^3.5.3" + "@types/lodash.merge": "npm:^4.6.6" + "@types/node": "npm:^20.10.0" + "@types/react": "npm:18.2.0" + "@types/react-dom": "npm:18.2.0" + "@types/tinycolor2": "npm:^1.4.3" + "@vitejs/plugin-react": "npm:^4.3.1" + babel-loader: "npm:^8.2.2" + conventional-changelog-conventionalcommits: "npm:^4.6.3" + cross-env: "npm:^7.0.3" + date-fns: "npm:^4.1.0" + husky: "npm:^8.0.0" + lint-staged: "npm:13.1.0" + lodash.merge: "npm:^4.6.2" + np: "npm:^8.0.4" + patch-package: "npm:^8.0.0" + prettier: "npm:^3.3.3" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" + rollup: "npm:^2.70.1" + rollup-plugin-typescript2: "npm:^0.36.0" + semantic-release: "npm:^19.0.2" + storybook: "npm:^8.2.5" + storybook-dark-mode: "npm:^4.0.2" + tinycolor2: "npm:^1.4.2" + typescript: "npm:5.4.5" + use-debounce: "npm:9.0.2" + vite: "npm:^5.1.5" + peerDependencies: + react: ">=18" + react-dom: ">=18" + checksum: 10c0/3ef3f665b402a247cda758df9d485b6d573c69e1ebb595e69139a087c88bbd25ad0999b016cd28fa8ed174ec90b347bb5a94661a383f357fd07b6bfd9ce4c287 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + languageName: node + linkType: hard + +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/9f9e959a8792df208a9d048092fda7e1858bddc95c6314857a8211a99e20e6830bdeb572e3587ae8be5429e37f2a96fcf222a9f53ad232f5537764c9e13a2bbd + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.18.0": + version: 7.20.7 + resolution: "@types/babel__traverse@npm:7.20.7" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd + languageName: node + linkType: hard + +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "npm:*" + "@types/keyv": "npm:^3.1.4" + "@types/node": "npm:*" + "@types/responselike": "npm:^1.0.0" + checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 + languageName: node + linkType: hard + +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 10c0/5b326bd0188120fb32c0be086b141b1481fec9941b76ad537f9110e10d61ee2636beac145463319c71e4be67a17e85b81ca9e13ceb6e3bb63b93d16824d6c149 + languageName: node + linkType: hard + +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: 10c0/cdaca493f13c321cf0cacd1973efc0ae74569633145d9e6fc1128f32217a6968c33bea1f858275239fe90c98f3be57ec8f452b416a9ff48b8e8c1098b20fa51c + languageName: node + linkType: hard + +"@types/estree@npm:0.0.39": + version: 0.0.39 + resolution: "@types/estree@npm:0.0.39" + checksum: 10c0/f0af6c95ac1988c4827964bd9d3b51d24da442e2188943f6dfcb1e1559103d5d024d564b2e9d3f84c53714a02a0a7435c7441138eb63d9af5de4dfc66cdc0d92 + languageName: node + linkType: hard + +"@types/estree@npm:1.0.7, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c + languageName: node + linkType: hard + +"@types/glob@npm:^7.1.1": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" + dependencies: + "@types/minimatch": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/a8eb5d5cb5c48fc58c7ca3ff1e1ddf771ee07ca5043da6e4871e6757b4472e2e73b4cfef2644c38983174a4bc728c73f8da02845c28a1212f98cabd293ecae98 + languageName: node + linkType: hard + +"@types/history@npm:^4.7.11": + version: 4.7.11 + resolution: "@types/history@npm:4.7.11" + checksum: 10c0/3facf37c2493d1f92b2e93a22cac7ea70b06351c2ab9aaceaa3c56aa6099fb63516f6c4ec1616deb5c56b4093c026a043ea2d3373e6c0644d55710364d02c934 + languageName: node + linkType: hard + +"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/jest-axe@npm:^3.5.3": + version: 3.5.9 + resolution: "@types/jest-axe@npm:3.5.9" + dependencies: + "@types/jest": "npm:*" + axe-core: "npm:^3.5.5" + checksum: 10c0/18ae6143c5ca058066d469a7449493dcad0810a06ae3fd4bdadd00b84ffbfffb8b8faa758b7b1327687a5a398f14cc2f6742760f911dae84e25e042564cb3fcf + languageName: node + linkType: hard + +"@types/jest@npm:*": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10c0/18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed + languageName: node + linkType: hard + +"@types/jest@npm:^27.4.1": + version: 27.5.2 + resolution: "@types/jest@npm:27.5.2" + dependencies: + jest-matcher-utils: "npm:^27.0.0" + pretty-format: "npm:^27.0.0" + checksum: 10c0/29ef3da9b94a15736a67fc13956f385ac2ba2c6297f50d550446842c278f2e0d9f343dcd8e31c321ada5d8a1bd67bc1d79c7b6ff1802d55508c692123b3d9794 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac + languageName: node + linkType: hard + +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c + languageName: node + linkType: hard + +"@types/lodash.merge@npm:^4.6.6": + version: 4.6.9 + resolution: "@types/lodash.merge@npm:4.6.9" + dependencies: + "@types/lodash": "npm:*" + checksum: 10c0/2e2ccacdceb2e23343a514e8c24540fc4e1f1ffd616b645eb72ec685da9389d99a2544f04d61921e46a6768f8cc0fe5f58d4f7edaba9bc50552f0ca7df905e83 + languageName: node + linkType: hard + +"@types/lodash@npm:*, @types/lodash@npm:^4.17.16": + version: 4.17.16 + resolution: "@types/lodash@npm:4.17.16" + checksum: 10c0/cf017901b8ab1d7aabc86d5189d9288f4f99f19a75caf020c0e2c77b8d4cead4db0d0b842d009b029339f92399f49f34377dd7c2721053388f251778b4c23534 + languageName: node + linkType: hard + +"@types/mdx@npm:^2.0.0": + version: 2.0.13 + resolution: "@types/mdx@npm:2.0.13" + checksum: 10c0/5edf1099505ac568da55f9ae8a93e7e314e8cbc13d3445d0be61b75941226b005e1390d9b95caecf5dcb00c9d1bab2f1f60f6ff9876dc091a48b547495007720 + languageName: node + linkType: hard + +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 10c0/83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.14.0 + resolution: "@types/node@npm:22.14.0" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/9d79f3fa1af9c2c869514f419c4a4905b34c10e12915582fd1784868ac4e74c6d306cf5eb47ef889b6750ab85a31be96618227b86739c4a3e0b1c15063f384c6 + languageName: node + linkType: hard + +"@types/node@npm:^20.10.0": + version: 20.17.30 + resolution: "@types/node@npm:20.17.30" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10c0/649782c7822367d751472d70c948bcc50cded1a4744610f706f81cd54e1fc015523567d7e3e17f6b19e3e2797f6f23b653e898bdb4a2f21f8759ceba49976310 + languageName: node + linkType: hard + +"@types/node@npm:^22.15.18": + version: 22.15.18 + resolution: "@types/node@npm:22.15.18" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/e23178c568e2dc6b93b6aa3b8dfb45f9556e527918c947fe7406a4c92d2184c7396558912400c3b1b8d0fa952ec63819aca2b8e4d3545455fc6f1e9623e09ca6 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0, @types/normalize-package-data@npm:^2.4.1": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.14 + resolution: "@types/prop-types@npm:15.7.14" + checksum: 10c0/1ec775160bfab90b67a782d735952158c7e702ca4502968aa82565bd8e452c2de8601c8dfe349733073c31179116cf7340710160d3836aa8a1ef76d1532893b1 + languageName: node + linkType: hard + +"@types/react-dom@npm:18.2.0": + version: 18.2.0 + resolution: "@types/react-dom@npm:18.2.0" + dependencies: + "@types/react": "npm:*" + checksum: 10c0/f9f7a396c5499a6fb97e31ef9b050cf9ec5f61e6ec4040badb53428f9e73258c95e5b3dd8233541631b0461d623739b3f6348a4130359c92ce0a69d74a5e9176 + languageName: node + linkType: hard + +"@types/react-dom@npm:^18.0.0, @types/react-dom@npm:^18.2.19": + version: 18.3.6 + resolution: "@types/react-dom@npm:18.3.6" + peerDependencies: + "@types/react": ^18.0.0 + checksum: 10c0/e77ac076096bd4b2e0a99130c47959762a927e536b83412e470ac5198d4b8d111cfd787ff2ab7c22bc39c114c0c5fef80046ea0cccb02a655e021a435859314a + languageName: node + linkType: hard + +"@types/react-router-dom@npm:^5.1.3": + version: 5.3.3 + resolution: "@types/react-router-dom@npm:5.3.3" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + "@types/react-router": "npm:*" + checksum: 10c0/a9231a16afb9ed5142678147eafec9d48582809295754fb60946e29fcd3757a4c7a3180fa94b45763e4c7f6e3f02379e2fcb8dd986db479dcab40eff5fc62a91 + languageName: node + linkType: hard + +"@types/react-router@npm:*": + version: 5.1.20 + resolution: "@types/react-router@npm:5.1.20" + dependencies: + "@types/history": "npm:^4.7.11" + "@types/react": "npm:*" + checksum: 10c0/1f7eee61981d2f807fa01a34a0ef98ebc0774023832b6611a69c7f28fdff01de5a38cabf399f32e376bf8099dcb7afaf724775bea9d38870224492bea4cb5737 + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:>=16": + version: 19.1.0 + resolution: "@types/react@npm:19.1.0" + dependencies: + csstype: "npm:^3.0.2" + checksum: 10c0/632fd20ee176e55801a61c5f854141b043571a3e363ef106b047b766a813a12735cbb37abb3d61d126346979f530f2ed269a60c8ef3cdee54e5e9fe4174e5dad + languageName: node + linkType: hard + +"@types/react@npm:18.2.0": + version: 18.2.0 + resolution: "@types/react@npm:18.2.0" + dependencies: + "@types/prop-types": "npm:*" + "@types/scheduler": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/e38f98b7524817459bb1214d39f4cfcb1dd7ffb31992a427b4494f3988aa6195dc349dfb66b299270b399b34568d045bf1cb6230349a6d343e183052ee486eaa + languageName: node + linkType: hard + +"@types/react@npm:^18.2.0": + version: 18.3.20 + resolution: "@types/react@npm:18.3.20" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/65fa867c91357e4c4c646945c8b99044360f8973cb7f928ec4de115fe3207827985d45be236e6fd6c092b09f631c2126ce835c137be30718419e143d73300d8f + languageName: node + linkType: hard + +"@types/resolve@npm:^1.20.2": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: 10c0/a9b0549d816ff2c353077365d865a33655a141d066d0f5a3ba6fd4b28bc2f4188a510079f7c1f715b3e7af505a27374adce2a5140a3ece2a059aab3d6e1a4244 + languageName: node + linkType: hard + +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.26.0 + resolution: "@types/scheduler@npm:0.26.0" + checksum: 10c0/84626b06551ab7e1247412a2588430da5cd75263a353f1fd70593ca7331d43797937b89fe587089c6b3613d0658986087c5f0b2debef5bae831cdc1104a432ef + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/statuses@npm:^2.0.4": + version: 2.0.5 + resolution: "@types/statuses@npm:2.0.5" + checksum: 10c0/4dacec0b29483a44be902a022a11a22b339de7a6e7b2059daa4f7add10cb6dbcc28d02d2a416fe9687e48d335906bf983065391836d4e7c847e55ddef4de8fad + languageName: node + linkType: hard + +"@types/tinycolor2@npm:^1.4.3": + version: 1.4.6 + resolution: "@types/tinycolor2@npm:1.4.6" + checksum: 10c0/922020c3326460e9d8502c8a98f80db69f06fd14e07fe5a48e8ffe66175762298a9bd51263f2a0c9a40632886a74975a3ff79396defcdbeac0dc176e3e5056e8 + languageName: node + linkType: hard + +"@types/tough-cookie@npm:^4.0.5": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: 10c0/68c6921721a3dcb40451543db2174a145ef915bc8bcbe7ad4e59194a0238e776e782b896c7a59f4b93ac6acefca9161fccb31d1ce3b3445cb6faa467297fb473 + languageName: node + linkType: hard + +"@types/uuid@npm:^9.0.1": + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: 10c0/b411b93054cb1d4361919579ef3508a1f12bf15b5fdd97337d3d351bece6c921b52b6daeef89b62340fd73fd60da407878432a1af777f40648cbe53a01723489 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.29.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.29.0" + "@typescript-eslint/type-utils": "npm:8.29.0" + "@typescript-eslint/utils": "npm:8.29.0" + "@typescript-eslint/visitor-keys": "npm:8.29.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/3b05a7376a0752484229369af6eb60d13cf06d2331e79c2d471cb0b963dcf5b25a31617cafdc71d74e98921091f479f3da10725b761878a89421191d23866b54 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.29.0, @typescript-eslint/parser@npm:^8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/parser@npm:8.29.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.29.0" + "@typescript-eslint/types": "npm:8.29.0" + "@typescript-eslint/typescript-estree": "npm:8.29.0" + "@typescript-eslint/visitor-keys": "npm:8.29.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/270b9b27e3edb54b2f98a97b7f026f95580214002a04167809b1b71233c36d1585041cdcf26f9e08f48b9eb92652f4f9c756a83dc230f48fd204a4e5e054831c + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/scope-manager@npm:8.29.0" + dependencies: + "@typescript-eslint/types": "npm:8.29.0" + "@typescript-eslint/visitor-keys": "npm:8.29.0" + checksum: 10c0/330d777043a99485b51197ad24927f1276d61e61adaf710f012b3fe7db2ab67c8925c0526f801715b498e7d8fa7cef390006b6f7ae40cee89abe22e8e438de9a + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/type-utils@npm:8.29.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.29.0" + "@typescript-eslint/utils": "npm:8.29.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/f254c8d22fc29ea088d16b06e4be1756cb5ad05ccf5989e163637b9c582e5fc8c27aa7003aad6e6a8158d56d7711ea1e4e9d361702c1a18945e0e6aaff1267c5 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/types@npm:8.29.0" + checksum: 10c0/fc1e3f3071102973a9cfb8ae843c51398bd74b5583b7b0edad182ea605ef85e72ceac7987513581869958b3a65303af6b3471bfba5b7be1338e8add62019c858 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.29.0" + dependencies: + "@typescript-eslint/types": "npm:8.29.0" + "@typescript-eslint/visitor-keys": "npm:8.29.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/61dd52229a0758e0bd29f732115c16e640a2418fb25488877c74ef03cdbeb43ddc592a37094abd794ef49812f33d6f814c5b662b95ea796ed0a6c6bfc849299b + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/utils@npm:8.29.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.29.0" + "@typescript-eslint/types": "npm:8.29.0" + "@typescript-eslint/typescript-estree": "npm:8.29.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/e259d7edd12946b2dc8e1aa3bbea10f66c5277f27dda71368aa2b2923487f28cd1c123681aaae22518a31c8aeabd60a5365f8a832d0f6e6efadb03745a2d8a31 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.29.0": + version: 8.29.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.29.0" + dependencies: + "@typescript-eslint/types": "npm:8.29.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/7f5452b137c4edd258b2289cddf5d92687780375db33421bc4f5e2e9b0c94064c7c5ed3a7b5d96dc9c2d09ca7842b4415b3f3ed3e3f1ae3ac2e625ecb5e87efc + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.4.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.4.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.4.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.4.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.4.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.4.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.4.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.4.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.4.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.4.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.4.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-wasm32-wasi@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.4.1" + dependencies: + "@napi-rs/wasm-runtime": "npm:^0.2.8" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.4.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.4.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.4.1": + version: 1.4.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.4.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@vitejs/plugin-react@npm:^4.2.1, @vitejs/plugin-react@npm:^4.3.1": + version: 4.3.4 + resolution: "@vitejs/plugin-react@npm:4.3.4" + dependencies: + "@babel/core": "npm:^7.26.0" + "@babel/plugin-transform-react-jsx-self": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx-source": "npm:^7.25.9" + "@types/babel__core": "npm:^7.20.5" + react-refresh: "npm:^0.14.2" + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + checksum: 10c0/38a47a1dbafae0b97142943d83ee3674cb3331153a60b1a3fd29d230c12c9dfe63b7c345b231a3450168ed8a9375a9a1a253c3d85e9efdc19478c0d56b98496c + languageName: node + linkType: hard + +"@vitest/coverage-v8@npm:^1.3.1": + version: 1.6.1 + resolution: "@vitest/coverage-v8@npm:1.6.1" + dependencies: + "@ampproject/remapping": "npm:^2.2.1" + "@bcoe/v8-coverage": "npm:^0.2.3" + debug: "npm:^4.3.4" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.4" + istanbul-reports: "npm:^3.1.6" + magic-string: "npm:^0.30.5" + magicast: "npm:^0.3.3" + picocolors: "npm:^1.0.0" + std-env: "npm:^3.5.0" + strip-literal: "npm:^2.0.0" + test-exclude: "npm:^6.0.0" + peerDependencies: + vitest: 1.6.1 + checksum: 10c0/2e88903e6487d3ddfcffcb12fdf3796d8e30f3c0db6ae3bbc8670652c9b8c890202bdb9bdc057a288ff8948e11e25bbd2d42f231cb6674fa2c826fc07377b5fc + languageName: node + linkType: hard + +"@vitest/expect@npm:1.6.1": + version: 1.6.1 + resolution: "@vitest/expect@npm:1.6.1" + dependencies: + "@vitest/spy": "npm:1.6.1" + "@vitest/utils": "npm:1.6.1" + chai: "npm:^4.3.10" + checksum: 10c0/278164b2a32a7019b443444f21111c5e32e4cadee026cae047ae2a3b347d99dca1d1fb7b79509c88b67dc3db19fa9a16265b7d7a8377485f7e37f7851e44495a + languageName: node + linkType: hard + +"@vitest/runner@npm:1.6.1": + version: 1.6.1 + resolution: "@vitest/runner@npm:1.6.1" + dependencies: + "@vitest/utils": "npm:1.6.1" + p-limit: "npm:^5.0.0" + pathe: "npm:^1.1.1" + checksum: 10c0/36333f1a596c4ad85d42c6126cc32959c984d584ef28d366d366fa3672678c1a0f5e5c2e8717a36675b6620b57e8830f765d6712d1687f163ed0a8ebf23c87db + languageName: node + linkType: hard + +"@vitest/snapshot@npm:1.6.1": + version: 1.6.1 + resolution: "@vitest/snapshot@npm:1.6.1" + dependencies: + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + pretty-format: "npm:^29.7.0" + checksum: 10c0/68bbc3132c195ec37376469e4b183fc408e0aeedd827dffcc899aac378e9ea324825f0873062786e18f00e3da9dd8a93c9bb871c07471ee483e8df963cb272eb + languageName: node + linkType: hard + +"@vitest/spy@npm:1.6.1": + version: 1.6.1 + resolution: "@vitest/spy@npm:1.6.1" + dependencies: + tinyspy: "npm:^2.2.0" + checksum: 10c0/5207ec0e7882819f0e0811293ae6d14163e26927e781bb4de7d40b3bd99c1fae656934c437bb7a30443a3e7e736c5bccb037bbf4436dbbc83d29e65247888885 + languageName: node + linkType: hard + +"@vitest/utils@npm:1.6.1": + version: 1.6.1 + resolution: "@vitest/utils@npm:1.6.1" + dependencies: + diff-sequences: "npm:^29.6.3" + estree-walker: "npm:^3.0.3" + loupe: "npm:^2.3.7" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d4c619e5688cbc22a60c412719c6baa40376b7671bdbdc3072552f5c5a5ee5d24a96ea328b054018debd49e0626a5e3db672921b2c6b5b17b9a52edd296806a + languageName: node + linkType: hard + +"@yarnpkg/lockfile@npm:^1.1.0": + version: 1.1.0 + resolution: "@yarnpkg/lockfile@npm:1.1.0" + checksum: 10c0/0bfa50a3d756623d1f3409bc23f225a1d069424dbc77c6fd2f14fb377390cd57ec703dc70286e081c564be9051ead9ba85d81d66a3e68eeb6eb506d4e0c0fbda + languageName: node + linkType: hard + +"JSONStream@npm:^1.0.4": + version: 1.3.5 + resolution: "JSONStream@npm:1.3.5" + dependencies: + jsonparse: "npm:^1.2.0" + through: "npm:>=2.2.7 <3" + bin: + JSONStream: ./bin.js + checksum: 10c0/0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 + languageName: node + linkType: hard + +"abbrev@npm:^1.0.0, abbrev@npm:~1.1.1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 + languageName: node + linkType: hard + +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.3.2": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.14.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" + dependencies: + humanize-ms: "npm:^1.2.1" + checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"aggregate-error@npm:^4.0.0": + version: 4.0.1 + resolution: "aggregate-error@npm:4.0.1" + dependencies: + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 10c0/75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"all-package-names@npm:^2.0.2": + version: 2.0.897 + resolution: "all-package-names@npm:2.0.897" + dependencies: + commander-version: "npm:^1.1.0" + p-lock: "npm:^2.0.0" + parse-json-object: "npm:^2.0.1" + progress: "npm:^2.0.3" + types-json: "npm:^1.2.2" + bin: + all-package-names: build/bin/index.js + checksum: 10c0/0527a9c9971e3f9eeb7ff9ad3cc49a350f0d6ec93e8b90e35de3bb6b8b41bab6176a7b0596a2dd8136de536d45245eaad984099edca4e787d2929ff77cd2a040 + languageName: node + linkType: hard + +"ansi-align@npm:^3.0.1": + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" + dependencies: + string-width: "npm:^4.1.0" + checksum: 10c0/ad8b755a253a1bc8234eb341e0cec68a857ab18bf97ba2bda529e86f6e30460416523e0ec58c32e5c21f0ca470d779503244892873a5895dbd0c39c788e82467 + languageName: node + linkType: hard + +"ansi-escapes@npm:^3.0.0, ansi-escapes@npm:^3.2.0": + version: 3.2.0 + resolution: "ansi-escapes@npm:3.2.0" + checksum: 10c0/084e1ce38139ad2406f18a8e7efe2b850ddd06ce3c00f633392d1ce67756dab44fe290e573d09ef3c9a0cb13c12881e0e35a8f77a017d39a0a4ab85ae2fae04f + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-escapes@npm:^5.0.0": + version: 5.0.0 + resolution: "ansi-escapes@npm:5.0.0" + dependencies: + type-fest: "npm:^1.0.2" + checksum: 10c0/f705cc7fbabb981ddf51562cd950792807bccd7260cc3d9478a619dda62bff6634c87ca100f2545ac7aade9b72652c4edad8c7f0d31a0b949b5fa58f33eaf0d0 + languageName: node + linkType: hard + +"ansi-escapes@npm:^6.2.0": + version: 6.2.1 + resolution: "ansi-escapes@npm:6.2.1" + checksum: 10c0/a2c6f58b044be5f69662ee17073229b492daa2425a7fd99a665db6c22eab6e4ab42752807def7281c1c7acfed48f87f2362dda892f08c2c437f1b39c6b033103 + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.1 + resolution: "ansi-regex@npm:3.0.1" + checksum: 10c0/d108a7498b8568caf4a46eea4f1784ab4e0dfb2e3f3938c697dee21443d622d765c958f2b7e2b9f6b9e55e2e2af0584eaa9915d51782b89a841c28e744e7a167 + languageName: node + linkType: hard + +"ansi-regex@npm:^4.1.0": + version: 4.1.1 + resolution: "ansi-regex@npm:4.1.1" + checksum: 10c0/d36d34234d077e8770169d980fed7b2f3724bfa2a01da150ccd75ef9707c80e883d27cdf7a0eac2f145ac1d10a785a8a855cffd05b85f778629a0db62e7033da + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-styles@npm:^2.2.1": + version: 2.2.1 + resolution: "ansi-styles@npm:2.2.1" + checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0, ansi-styles@npm:^4.3.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"ansicolors@npm:~0.3.2": + version: 0.3.2 + resolution: "ansicolors@npm:0.3.2" + checksum: 10c0/e202182895e959c5357db6c60791b2abaade99fcc02221da11a581b26a7f83dc084392bc74e4d3875c22f37b3c9ef48842e896e3bfed394ec278194b8003e0ac + languageName: node + linkType: hard + +"any-observable@npm:^0.3.0": + version: 0.3.0 + resolution: "any-observable@npm:0.3.0" + checksum: 10c0/104c2b79c2ac7e6c75b35f8fd62babf73015668f22bd25336c6f848350d91f9e7daf2fddbf1c1b76fe795e89fbc91b49f70a2aec5c69f1acf0562c344f36042b + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0, aproba@npm:^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 + languageName: node + linkType: hard + +"archy@npm:~1.0.0": + version: 1.0.0 + resolution: "archy@npm:1.0.0" + checksum: 10c0/200c849dd1c304ea9914827b0555e7e1e90982302d574153e28637db1a663c53de62bad96df42d50e8ce7fc18d05e3437d9aa8c4b383803763755f0956c7d308 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: "npm:^1.0.0" + readable-stream: "npm:^3.6.0" + checksum: 10c0/8373f289ba42e4b5ec713bb585acdac14b5702c75f2a458dc985b9e4fa5762bc5b46b40a21b72418a3ed0cfb5e35bdc317ef1ae132f3035f633d581dd03168c3 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"argv-formatter@npm:~1.0.0": + version: 1.0.0 + resolution: "argv-formatter@npm:1.0.0" + checksum: 10c0/e5582aef98e6b9a70cfe038a3abf6cdd926714b5ce761830bcbd5ac7be86d17ae583fcc8a2cdf4a2ac0b6024ec100b7312160fcefb1520998f476473da6a941d + languageName: node + linkType: hard + +"aria-hidden@npm:^1.2.4": + version: 1.2.4 + resolution: "aria-hidden@npm:1.2.4" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a + languageName: node + linkType: hard + +"aria-query@npm:5.1.3": + version: 5.1.3 + resolution: "aria-query@npm:5.1.3" + dependencies: + deep-equal: "npm:^2.0.5" + checksum: 10c0/edcbc8044c4663d6f88f785e983e6784f98cb62b4ba1e9dd8d61b725d0203e4cfca38d676aee984c31f354103461102a3d583aa4fbe4fd0a89b679744f4e5faf + languageName: node + linkType: hard + +"aria-query@npm:^5.0.0, aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + is-array-buffer: "npm:^3.0.5" + checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d + languageName: node + linkType: hard + +"array-ify@npm:^1.0.0": + version: 1.0.0 + resolution: "array-ify@npm:1.0.0" + checksum: 10c0/75c9c072faac47bd61779c0c595e912fe660d338504ac70d10e39e1b8a4a0c9c87658703d619b9d1b70d324177ae29dc8d07dda0d0a15d005597bc4c5a59c70c + languageName: node + linkType: hard + +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + is-string: "npm:^1.0.7" + checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 + languageName: node + linkType: hard + +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 + languageName: node + linkType: hard + +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-shim-unscopables: "npm:^1.1.0" + checksum: 10c0/82559310d2e57ec5f8fc53d7df420e3abf0ba497935de0a5570586035478ba7d07618cb18e2d4ada2da514c8fb98a034aaf5c06caa0a57e2f7f4c4adedef5956 + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + es-shim-unscopables: "npm:^1.0.2" + checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: "npm:^1.0.1" + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + is-array-buffer: "npm:^3.0.4" + checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 10c0/c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab + languageName: node + linkType: hard + +"asap@npm:^2.0.0": + version: 2.0.6 + resolution: "asap@npm:2.0.6" + checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d + languageName: node + linkType: hard + +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b + languageName: node + linkType: hard + +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e + languageName: node + linkType: hard + +"ast-types@npm:^0.16.1": + version: 0.16.1 + resolution: "ast-types@npm:0.16.1" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/abcc49e42eb921a7ebc013d5bec1154651fb6dbc3f497541d488859e681256901b2990b954d530ba0da4d0851271d484f7057d5eff5e07cb73e8b10909f711bf + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 10c0/4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: "npm:^1.0.0" + checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 + languageName: node + linkType: hard + +"axe-core@npm:^3.5.5": + version: 3.5.6 + resolution: "axe-core@npm:3.5.6" + checksum: 10c0/f02a5b0e04e04a1024d7dc5c9931f87864c0394a218c6bd9057f0104df7f6310178bbbab47afd0c0fd4b585a08e8c599eebf5a89b6898f3fbeb7bfa33c25bfc8 + languageName: node + linkType: hard + +"axe-core@npm:^4.10.0": + version: 4.10.3 + resolution: "axe-core@npm:4.10.3" + checksum: 10c0/1b1c24f435b2ffe89d76eca0001cbfff42dbf012ad9bd37398b70b11f0d614281a38a28bc3069e8972e3c90ec929a8937994bd24b0ebcbaab87b8d1e241ab0c7 + languageName: node + linkType: hard + +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 + languageName: node + linkType: hard + +"babel-loader@npm:^8.2.2": + version: 8.4.1 + resolution: "babel-loader@npm:8.4.1" + dependencies: + find-cache-dir: "npm:^3.3.1" + loader-utils: "npm:^2.0.4" + make-dir: "npm:^3.1.0" + schema-utils: "npm:^2.6.5" + peerDependencies: + "@babel/core": ^7.0.0 + webpack: ">=2" + checksum: 10c0/efdca9c3ef502af58b923a32123d660c54fd0be125b7b64562c8a43bda0a3a55dac0db32331674104e7e5184061b75c3a0e395b2c5ccdc7cb2125dd9ec7108d2 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs2@npm:^0.4.10": + version: 0.4.13 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" + dependencies: + "@babel/compat-data": "npm:^7.22.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/b4a54561606d388e6f9499f39f03171af4be7f9ce2355e737135e40afa7086cf6790fdd706c2e59f488c8fa1f76123d28783708e07ddc84647dca8ed8fb98e06 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.11.0": + version: 0.11.1 + resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.3" + core-js-compat: "npm:^3.40.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/025f754b6296d84b20200aff63a3c1acdd85e8c621781f2bd27fe2512d0060526192d02329326947c6b29c27cf475fbcfaaff8c51eab1d2bfc7b79086bb64229 + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.1": + version: 0.6.4 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/ebaaf9e4e53201c02f496d3f686d815e94177b3e55b35f11223b99c60d197a29f907a2e87bbcccced8b7aff22a807fccc1adaf04722864a8e1862c8845ab830a + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"before-after-hook@npm:^2.2.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: 10c0/0488c4ae12df758ca9d49b3bb27b47fd559677965c52cae7b335784724fb8bf96c42b6e5ba7d7afcbc31facb0e294c3ef717cc41c5bc2f7bd9e76f8b90acd31c + languageName: node + linkType: hard + +"better-opn@npm:^3.0.2": + version: 3.0.2 + resolution: "better-opn@npm:3.0.2" + dependencies: + open: "npm:^8.0.4" + checksum: 10c0/911ef25d44da75aabfd2444ce7a4294a8000ebcac73068c04a60298b0f7c7506b60421aa4cd02ac82502fb42baaff7e4892234b51e6923eded44c5a11185f2f5 + languageName: node + linkType: hard + +"big-integer@npm:^1.6.44": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f + languageName: node + linkType: hard + +"bin-links@npm:^3.0.3": + version: 3.0.3 + resolution: "bin-links@npm:3.0.3" + dependencies: + cmd-shim: "npm:^5.0.0" + mkdirp-infer-owner: "npm:^2.0.0" + npm-normalize-package-bin: "npm:^2.0.0" + read-cmd-shim: "npm:^3.0.0" + rimraf: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.0" + checksum: 10c0/a7f3ea8663213d14134695b42f66994e11f00f0519617537d80cee3b78b7cbb5a627c0d3aafd9d8c748eee9b1af03dbdddedfbf18be738b50a4c11bdd739a160 + languageName: node + linkType: hard + +"binary-extensions@npm:^2.2.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"bottleneck@npm:^2.15.3": + version: 2.19.5 + resolution: "bottleneck@npm:2.19.5" + checksum: 10c0/b0f72e45b2e0f56a21ba720183f16bef8e693452fb0495d997fa354e42904353a94bd8fd429868e6751bc85e54b6755190519eed5a0ae0a94a5185209ae7c6d0 + languageName: node + linkType: hard + +"boxen@npm:^7.0.0": + version: 7.1.1 + resolution: "boxen@npm:7.1.1" + dependencies: + ansi-align: "npm:^3.0.1" + camelcase: "npm:^7.0.1" + chalk: "npm:^5.2.0" + cli-boxes: "npm:^3.0.0" + string-width: "npm:^5.1.2" + type-fest: "npm:^2.13.0" + widest-line: "npm:^4.0.1" + wrap-ansi: "npm:^8.1.0" + checksum: 10c0/3a9891dc98ac40d582c9879e8165628258e2c70420c919e70fff0a53ccc7b42825e73cda6298199b2fbc1f41f5d5b93b492490ad2ae27623bed3897ddb4267f8 + languageName: node + linkType: hard + +"bplist-parser@npm:^0.2.0": + version: 0.2.0 + resolution: "bplist-parser@npm:0.2.0" + dependencies: + big-integer: "npm:^1.6.44" + checksum: 10c0/ce79c69e0f6efe506281e7c84e3712f7d12978991675b6e3a58a295b16f13ca81aa9b845c335614a545e0af728c8311b6aa3142af76ba1cb616af9bbac5c4a9f + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browser-assert@npm:^1.2.1": + version: 1.2.1 + resolution: "browser-assert@npm:1.2.1" + checksum: 10c0/902abf999f92c9c951fdb6d7352c09eea9a84706258699655f7e7906e42daa06a1ae286398a755872740e05a6a71c43c5d1a0c0431d67a8cdb66e5d859a3fc0c + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0, browserslist@npm:^4.24.4": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"builtins@npm:^1.0.3": + version: 1.0.3 + resolution: "builtins@npm:1.0.3" + checksum: 10c0/493afcc1db0a56d174cc85bebe5ca69144f6fdd0007d6cbe6b2434185314c79d83cb867e492b56aa5cf421b4b8a8135bf96ba4c3ce71994cf3da154d1ea59747 + languageName: node + linkType: hard + +"builtins@npm:^5.0.0": + version: 5.1.0 + resolution: "builtins@npm:5.1.0" + dependencies: + semver: "npm:^7.0.0" + checksum: 10c0/3c32fe5bd7ed4ff7dbd6fb14bcb9d7eaa7e967327f1899cd336f8625d3f46fceead0a53528f1e332aeaee757034ebb307cb2f1a37af2b86a3c5ad4845d01c0c8 + languageName: node + linkType: hard + +"bundle-name@npm:^3.0.0": + version: 3.0.0 + resolution: "bundle-name@npm:3.0.0" + dependencies: + run-applescript: "npm:^5.0.0" + checksum: 10c0/57bc7f8b025d83961b04db2f1eff6a87f2363c2891f3542a4b82471ff8ebb5d484af48e9784fcdb28ef1d48bb01f03d891966dc3ef58758e46ea32d750ce40f8 + languageName: node + linkType: hard + +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + +"cacache@npm:^16.0.0, cacache@npm:^16.1.0, cacache@npm:^16.1.3": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": "npm:^2.1.0" + "@npmcli/move-file": "npm:^2.0.0" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.1.0" + glob: "npm:^8.0.1" + infer-owner: "npm:^1.0.4" + lru-cache: "npm:^7.7.1" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + mkdirp: "npm:^1.0.4" + p-map: "npm:^4.0.0" + promise-inflight: "npm:^1.0.1" + rimraf: "npm:^3.0.2" + ssri: "npm:^9.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^2.0.0" + checksum: 10c0/cdf6836e1c457d2a5616abcaf5d8240c0346b1f5bd6fdb8866b9d84b6dff0b54e973226dc11e0d099f35394213d24860d1989c8358d2a41b39eb912b3000e749 + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c + languageName: node + linkType: hard + +"cacheable-lookup@npm:^7.0.0": + version: 7.0.0 + resolution: "cacheable-lookup@npm:7.0.0" + checksum: 10c0/63a9c144c5b45cb5549251e3ea774c04d63063b29e469f7584171d059d3a88f650f47869a974e2d07de62116463d742c287a81a625e791539d987115cb081635 + languageName: node + linkType: hard + +"cacheable-request@npm:^10.2.8": + version: 10.2.14 + resolution: "cacheable-request@npm:10.2.14" + dependencies: + "@types/http-cache-semantics": "npm:^4.0.2" + get-stream: "npm:^6.0.1" + http-cache-semantics: "npm:^4.1.1" + keyv: "npm:^4.5.3" + mimic-response: "npm:^4.0.0" + normalize-url: "npm:^8.0.0" + responselike: "npm:^3.0.0" + checksum: 10c0/41b6658db369f20c03128227ecd219ca7ac52a9d24fc0f499cc9aa5d40c097b48b73553504cebd137024d957c0ddb5b67cf3ac1439b136667f3586257763f88d + languageName: node + linkType: hard + +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: "npm:^1.0.2" + get-stream: "npm:^5.1.0" + http-cache-semantics: "npm:^4.0.0" + keyv: "npm:^4.0.0" + lowercase-keys: "npm:^2.0.0" + normalize-url: "npm:^6.0.1" + responselike: "npm:^2.0.0" + checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.2" + checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"caller-callsite@npm:^2.0.0": + version: 2.0.0 + resolution: "caller-callsite@npm:2.0.0" + dependencies: + callsites: "npm:^2.0.0" + checksum: 10c0/a00ca91280e10ee2321de21dda6c168e427df7a63aeaca027ea45e3e466ac5e1a5054199f6547ba1d5a513d3b6b5933457266daaa47f8857fb532a343ee6b5e1 + languageName: node + linkType: hard + +"caller-path@npm:^2.0.0": + version: 2.0.0 + resolution: "caller-path@npm:2.0.0" + dependencies: + caller-callsite: "npm:^2.0.0" + checksum: 10c0/029b5b2c557d831216305c3218e9ff30fa668be31d58dd08088f74c8eabc8362c303e0908b3a93abb25ba10e3a5bfc9cff5eb7fab6ab9cf820e3b160ccb67581 + languageName: node + linkType: hard + +"callsites@npm:^2.0.0": + version: 2.0.0 + resolution: "callsites@npm:2.0.0" + checksum: 10c0/13bff4fee946e6020b37e76284e95e24aa239c9e34ac4f3451e4c5330fca6f2f962e1d1ab69e4da7940e1fce135107a2b2b98c01d62ea33144350fc89dc5494e + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"callsites@npm:^4.0.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: 10c0/bf1a28348c0f285c6c6f68fb98a9d088d3c0269fed0cdff3ea680d5a42df8a067b4de374e7a33e619eb9d5266a448fe66c2dd1f8e0c9209ebc348632882a3526 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^7.0.1": + version: 7.0.1 + resolution: "camelcase@npm:7.0.1" + checksum: 10c0/3adfc9a0e96d51b3a2f4efe90a84dad3e206aaa81dfc664f1bd568270e1bf3b010aad31f01db16345b4ffe1910e16ab411c7273a19a859addd1b98ef7cf4cfbd + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001712 + resolution: "caniuse-lite@npm:1.0.30001712" + checksum: 10c0/b3df8bdcc3335969380c2e47acb36c89bfc7f8fb4ef7ee2a5380e30ba46aa69e9d411654bc29894a06c201a1d60d490ab9b92787f3b66d7a7a38d71360e68215 + languageName: node + linkType: hard + +"cardinal@npm:^2.1.1": + version: 2.1.1 + resolution: "cardinal@npm:2.1.1" + dependencies: + ansicolors: "npm:~0.3.2" + redeyed: "npm:~2.1.0" + bin: + cdl: ./bin/cdl.js + checksum: 10c0/0051d0e64c0e1dff480c1aace4c018c48ecca44030533257af3f023107ccdeb061925603af6d73710f0345b0ae0eb57e5241d181d9b5fdb595d45c5418161675 + languageName: node + linkType: hard + +"chai@npm:^4.3.10": + version: 4.5.0 + resolution: "chai@npm:4.5.0" + dependencies: + assertion-error: "npm:^1.1.0" + check-error: "npm:^1.0.3" + deep-eql: "npm:^4.1.3" + get-func-name: "npm:^2.0.2" + loupe: "npm:^2.3.6" + pathval: "npm:^1.1.1" + type-detect: "npm:^4.1.0" + checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d + languageName: node + linkType: hard + +"chalk@npm:^1.0.0, chalk@npm:^1.1.3": + version: 1.1.3 + resolution: "chalk@npm:1.1.3" + dependencies: + ansi-styles: "npm:^2.2.1" + escape-string-regexp: "npm:^1.0.2" + has-ansi: "npm:^2.0.0" + strip-ansi: "npm:^3.0.0" + supports-color: "npm:^2.0.0" + checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 + languageName: node + linkType: hard + +"chalk@npm:^2.3.2, chalk@npm:^2.4.1, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.0.0, chalk@npm:^5.0.1, chalk@npm:^5.2.0": + version: 5.4.1 + resolution: "chalk@npm:5.4.1" + checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef + languageName: node + linkType: hard + +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + +"chart.js@npm:^4.4.1": + version: 4.4.8 + resolution: "chart.js@npm:4.4.8" + dependencies: + "@kurkle/color": "npm:^0.3.0" + checksum: 10c0/4777e3fef7ccfb664c02b79f90e53fb0e46c01293bc56af5ab81aa8ffef4b1ccc675bef948b7efd071a5dd0ebd59c0e95c42ef606f728da8e3ff1741fc2d1df0 + languageName: node + linkType: hard + +"check-error@npm:^1.0.3": + version: 1.0.3 + resolution: "check-error@npm:1.0.3" + dependencies: + get-func-name: "npm:^2.0.2" + checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"ci-info@npm:^2.0.0": + version: 2.0.0 + resolution: "ci-info@npm:2.0.0" + checksum: 10c0/8c5fa3830a2bcee2b53c2e5018226f0141db9ec9f7b1e27a5c57db5512332cde8a0beb769bcbaf0d8775a78afbf2bb841928feca4ea6219638a5b088f9884b46 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0, ci-info@npm:^3.7.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cidr-regex@npm:^3.1.1": + version: 3.1.1 + resolution: "cidr-regex@npm:3.1.1" + dependencies: + ip-regex: "npm:^4.1.0" + checksum: 10c0/3049225d23fe5b6e0e439d35f90bd344a1e0d2049f77786cc05a755d675b74f5ba8fc3420fb7de0f00892ab8b5af4540125cf46faff91074ee2488711b3a106d + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"clean-stack@npm:^4.0.0": + version: 4.2.0 + resolution: "clean-stack@npm:4.2.0" + dependencies: + escape-string-regexp: "npm:5.0.0" + checksum: 10c0/2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 + languageName: node + linkType: hard + +"cli-boxes@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-boxes@npm:3.0.0" + checksum: 10c0/4db3e8fbfaf1aac4fb3a6cbe5a2d3fa048bee741a45371b906439b9ffc821c6e626b0f108bdcd3ddf126a4a319409aedcf39a0730573ff050fdd7b6731e99fb9 + languageName: node + linkType: hard + +"cli-columns@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-columns@npm:4.0.0" + dependencies: + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/f724c874dba09376f7b2d6c70431d8691d5871bd5d26c6f658dd56b514e668ed5f5b8d803fb7e29f4000fc7f3a6d038d415b892ae7fa3dcd9cc458c07df17871 + languageName: node + linkType: hard + +"cli-cursor@npm:^2.0.0, cli-cursor@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-cursor@npm:2.1.0" + dependencies: + restore-cursor: "npm:^2.0.0" + checksum: 10c0/09ee6d8b5b818d840bf80ec9561eaf696672197d3a02a7daee2def96d5f52ce6e0bbe7afca754ccf14f04830b5a1b4556273e983507d5029f95bba3016618eda + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + +"cli-table3@npm:^0.6.2, cli-table3@npm:^0.6.3": + version: 0.6.5 + resolution: "cli-table3@npm:0.6.5" + dependencies: + "@colors/colors": "npm:1.5.0" + string-width: "npm:^4.2.0" + dependenciesMeta: + "@colors/colors": + optional: true + checksum: 10c0/d7cc9ed12212ae68241cc7a3133c52b844113b17856e11f4f81308acc3febcea7cc9fd298e70933e294dd642866b29fd5d113c2c098948701d0c35f09455de78 + languageName: node + linkType: hard + +"cli-truncate@npm:^0.2.1": + version: 0.2.1 + resolution: "cli-truncate@npm:0.2.1" + dependencies: + slice-ansi: "npm:0.0.4" + string-width: "npm:^1.0.1" + checksum: 10c0/c6caa5e2b70d841c42f4a2270d6fc7129df915f8911e4afa90c79231ccc857cd819a2c90e0707fde04e51ce56b4d71646b843f6cbaff4f7cdcb3b91ed51f6e89 + languageName: node + linkType: hard + +"cli-truncate@npm:^2.1.0": + version: 2.1.0 + resolution: "cli-truncate@npm:2.1.0" + dependencies: + slice-ansi: "npm:^3.0.0" + string-width: "npm:^4.2.0" + checksum: 10c0/dfaa3df675bcef7a3254773de768712b590250420345a4c7ac151f041a4bacb4c25864b1377bee54a39b5925a030c00eabf014e312e3a4ac130952ed3b3879e9 + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: "npm:^5.0.0" + string-width: "npm:^5.0.0" + checksum: 10c0/a19088878409ec0e5dc2659a5166929629d93cfba6d68afc9cde2282fd4c751af5b555bf197047e31c87c574396348d011b7aa806fec29c4139ea4f7f00b324c + languageName: node + linkType: hard + +"cli-width@npm:^2.0.0": + version: 2.2.1 + resolution: "cli-width@npm:2.2.1" + checksum: 10c0/e3a6d422d657ca111c630f69ee0f1a499e8f114eea158ccb2cdbedd19711edffa217093bbd43dafb34b68d1b1a3b5334126e51d059b9ec1d19afa53b42b3ef86 + languageName: node + linkType: hard + +"cli-width@npm:^3.0.0": + version: 3.0.0 + resolution: "cli-width@npm:3.0.0" + checksum: 10c0/125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a + languageName: node + linkType: hard + +"cli-width@npm:^4.1.0": + version: 4.1.0 + resolution: "cli-width@npm:4.1.0" + checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f + languageName: node + linkType: hard + +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: "npm:^1.0.0" + checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"cmd-shim@npm:^5.0.0": + version: 5.0.0 + resolution: "cmd-shim@npm:5.0.0" + dependencies: + mkdirp-infer-owner: "npm:^2.0.0" + checksum: 10c0/0ce77d641bed74e41b74f07a00cbdc4e8690787d2136e40418ca7c1bfcff9d92c0350e31785c7bb98b6c1fb8ae7dcedcdc872b98c6647c28de45e2dc7a70ae43 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 10c0/33f6b234084e46e6e369b6f0b07949392651b4dde70fc6a592a8d3dafa08d5bb32e3981a02f31f6fc323a26bc03a4c063a9d56834848695bda7611c2417ea2e6 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:^1.1.4, color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 + languageName: node + linkType: hard + +"colorette@npm:^2.0.19": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"columnify@npm:^1.6.0": + version: 1.6.0 + resolution: "columnify@npm:1.6.0" + dependencies: + strip-ansi: "npm:^6.0.1" + wcwidth: "npm:^1.0.0" + checksum: 10c0/25b90b59129331bbb8b0c838f8df69924349b83e8eab9549f431062a20a39094b8d744bb83265be38fd5d03140ce4bfbd85837c293f618925e83157ae9535f1d + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander-version@npm:^1.1.0": + version: 1.1.0 + resolution: "commander-version@npm:1.1.0" + dependencies: + "@bconnorwhite/module": "npm:^2.0.2" + commander: "npm:^6.1.0" + checksum: 10c0/ca1cd397b23545694e2c6146817da4f2f3b2b7bad122a076b432fd152d9d1eb2fe5eba927374dd4bf6de522b38e594515c1b2a31bed089cdbf9de9eba0efcbe7 + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commander@npm:^6.1.0": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 10c0/5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + +"common-ancestor-path@npm:^1.0.1": + version: 1.0.1 + resolution: "common-ancestor-path@npm:1.0.1" + checksum: 10c0/390c08d2a67a7a106d39499c002d827d2874966d938012453fd7ca34cd306881e2b9d604f657fa7a8e6e4896d67f39ebc09bf1bfd8da8ff318e0fb7a8752c534 + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"compare-func@npm:^2.0.0": + version: 2.0.0 + resolution: "compare-func@npm:2.0.0" + dependencies: + array-ify: "npm:^1.0.0" + dot-prop: "npm:^5.1.0" + checksum: 10c0/78bd4dd4ed311a79bd264c9e13c36ed564cde657f1390e699e0f04b8eee1fc06ffb8698ce2dfb5fbe7342d509579c82d4e248f08915b708f77f7b72234086cc3 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + +"config-chain@npm:^1.1.11": + version: 1.1.13 + resolution: "config-chain@npm:1.1.13" + dependencies: + ini: "npm:^1.3.4" + proto-list: "npm:~1.2.1" + checksum: 10c0/39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e + languageName: node + linkType: hard + +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" + dependencies: + dot-prop: "npm:^6.0.1" + graceful-fs: "npm:^4.2.6" + unique-string: "npm:^3.0.0" + write-file-atomic: "npm:^3.0.3" + xdg-basedir: "npm:^5.0.1" + checksum: 10c0/6681a96038ab3e0397cbdf55e6e1624ac3dfa3afe955e219f683df060188a418bda043c9114a59a337e7aec9562b0a0c838ed7db24289e6d0c266bc8313b9580 + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + languageName: node + linkType: hard + +"conventional-changelog-angular@npm:^5.0.0": + version: 5.0.13 + resolution: "conventional-changelog-angular@npm:5.0.13" + dependencies: + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: 10c0/bca711b835fe01d75e3500b738f6525c91a12096218e917e9fd81bf9accf157f904fee16f88c523fd5462fb2a7cb1d060eb79e9bc9a3ccb04491f0c383b43231 + languageName: node + linkType: hard + +"conventional-changelog-conventionalcommits@npm:^4.6.3": + version: 4.6.3 + resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" + dependencies: + compare-func: "npm:^2.0.0" + lodash: "npm:^4.17.15" + q: "npm:^1.5.1" + checksum: 10c0/f3b5e6132ec03dad4aa4a2b5ac47ee0e2ae8be6d0fa53a131c722412ce7c02a742c190790f15b5ab4983a31ce90b7066ce1f3f3d5cc4253aa3484ee414259bd2 + languageName: node + linkType: hard + +"conventional-changelog-writer@npm:^5.0.0": + version: 5.0.1 + resolution: "conventional-changelog-writer@npm:5.0.1" + dependencies: + conventional-commits-filter: "npm:^2.0.7" + dateformat: "npm:^3.0.0" + handlebars: "npm:^4.7.7" + json-stringify-safe: "npm:^5.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + split: "npm:^1.0.0" + through2: "npm:^4.0.0" + bin: + conventional-changelog-writer: cli.js + checksum: 10c0/268b56a3e4db07ad24da7134788c889ecd024cf2e7c0bfe8ca76f83e5db79f057538c45500b052a77b7933c4d0f47e2e807c6e756cbd5ad9db365744c9ce0e7f + languageName: node + linkType: hard + +"conventional-commits-filter@npm:^2.0.0, conventional-commits-filter@npm:^2.0.7": + version: 2.0.7 + resolution: "conventional-commits-filter@npm:2.0.7" + dependencies: + lodash.ismatch: "npm:^4.4.0" + modify-values: "npm:^1.0.0" + checksum: 10c0/df06fb29285b473614f5094e983d26fcc14cd0f64b2cbb2f65493fc8bd47c077c2310791d26f4b2b719e9585aaade95370e73230bff6647163164a18b9dfaa07 + languageName: node + linkType: hard + +"conventional-commits-parser@npm:^3.2.3": + version: 3.2.4 + resolution: "conventional-commits-parser@npm:3.2.4" + dependencies: + JSONStream: "npm:^1.0.4" + is-text-path: "npm:^1.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" + bin: + conventional-commits-parser: cli.js + checksum: 10c0/122d7d7f991a04c8e3f703c0e4e9a25b2ecb20906f497e4486cb5c2acd9c68f6d9af745f7e79cb407538f50e840b33399274ac427b20971b98b335d1b66d3d17 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie@npm:^0.7.2": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + +"core-js-compat@npm:^3.40.0": + version: 3.41.0 + resolution: "core-js-compat@npm:3.41.0" + dependencies: + browserslist: "npm:^4.24.4" + checksum: 10c0/92d2c748d3dd1c4e3b6cee6b6683b9212db9bc0a6574d933781210daf3baaeb76334ed4636eb8935b45802aa8d9235ab604c9a262694e02a2fa17ad0f6976829 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"cosmiconfig@npm:^5.2.1": + version: 5.2.1 + resolution: "cosmiconfig@npm:5.2.1" + dependencies: + import-fresh: "npm:^2.0.0" + is-directory: "npm:^0.3.1" + js-yaml: "npm:^3.13.1" + parse-json: "npm:^4.0.0" + checksum: 10c0/ae9ba309cdbb42d0c9d63dad5c1dfa1c56bb8f818cb8633eea14fd2dbdc9f33393b77658ba96fdabda497bc943afed8c3371d1222afe613c518ba676fa624645 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.0.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": "npm:^4.0.0" + import-fresh: "npm:^3.2.1" + parse-json: "npm:^5.0.0" + path-type: "npm:^4.0.0" + yaml: "npm:^1.10.0" + checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 + languageName: node + linkType: hard + +"cosmiconfig@npm:^8.1.3": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" + dependencies: + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a + languageName: node + linkType: hard + +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: "npm:^7.0.1" + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 10c0/f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.0": + version: 6.0.6 + resolution: "cross-spawn@npm:6.0.6" + dependencies: + nice-try: "npm:^1.0.4" + path-key: "npm:^2.0.1" + semver: "npm:^5.5.0" + shebang-command: "npm:^1.2.0" + which: "npm:^1.2.9" + checksum: 10c0/bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"crypto-random-string@npm:^2.0.0": + version: 2.0.0 + resolution: "crypto-random-string@npm:2.0.0" + checksum: 10c0/288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37 + languageName: node + linkType: hard + +"crypto-random-string@npm:^4.0.0": + version: 4.0.0 + resolution: "crypto-random-string@npm:4.0.0" + dependencies: + type-fest: "npm:^1.0.1" + checksum: 10c0/16e11a3c8140398f5408b7fded35a961b9423c5dac39a60cbbd08bd3f0e07d7de130e87262adea7db03ec1a7a4b7551054e0db07ee5408b012bac5400cfc07a5 + languageName: node + linkType: hard + +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: 10c0/5e09035e5bf6c2c422b40c6df2eb1529657a17df37fda5d0433d722609527ab98090baf25b13970ca754079a0f3161dd3dfc0e743563ded8cfa0749d861c1525 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"cssfontparser@npm:^1.2.1": + version: 1.2.1 + resolution: "cssfontparser@npm:1.2.1" + checksum: 10c0/ceb9b2976d503dbff3ac2aff0229b263affb4fb221a6947b357682cd8a952f6995253646ca5f820020d2fe05b5e29b56dbdd2343388c32203e8dd0ed15bdc1ca + languageName: node + linkType: hard + +"cssstyle@npm:^4.0.1": + version: 4.3.0 + resolution: "cssstyle@npm:4.3.0" + dependencies: + "@asamuzakjp/css-color": "npm:^3.1.1" + rrweb-cssom: "npm:^0.8.0" + checksum: 10c0/770ccb288a99257fd0d5b129e03878f848e922d3b017358acb02e8dd530e8f0c7c6f74e6ae5367d715e2da36a490a734b4177fc1b78f3f08eca25f204a56a692 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + +"damerau-levenshtein@npm:^1.0.8": + version: 1.0.8 + resolution: "damerau-levenshtein@npm:1.0.8" + checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 + languageName: node + linkType: hard + +"data-urls@npm:^5.0.0": + version: 5.0.0 + resolution: "data-urls@npm:5.0.0" + dependencies: + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + checksum: 10c0/1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad + languageName: node + linkType: hard + +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.2" + checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-data-view: "npm:^1.0.1" + checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 + languageName: node + linkType: hard + +"date-fns@npm:^1.27.2": + version: 1.30.1 + resolution: "date-fns@npm:1.30.1" + checksum: 10c0/bad6ad7c15180121e15d61ad62a4a214c108d66f35b35f5eeb6ade837a3c29aa4444b9528a93a5374b95ba11231c142276351bf52f4d168676f9a1e17ce3726a + languageName: node + linkType: hard + +"date-fns@npm:^4.1.0": + version: 4.1.0 + resolution: "date-fns@npm:4.1.0" + checksum: 10c0/b79ff32830e6b7faa009590af6ae0fb8c3fd9ffad46d930548fbb5acf473773b4712ae887e156ba91a7b3dc30591ce0f517d69fd83bd9c38650fdc03b4e0bac8 + languageName: node + linkType: hard + +"dateformat@npm:^3.0.0": + version: 3.0.3 + resolution: "dateformat@npm:3.0.3" + checksum: 10c0/2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"debuglog@npm:^1.0.1": + version: 1.0.1 + resolution: "debuglog@npm:1.0.1" + checksum: 10c0/d98ac9abe6a528fcbb4d843b1caf5a9116998c76e1263d8ff4db2c086aa96fa7ea4c752a81050fa2e4304129ef330e6e4dc9dd4d47141afd7db80bf699f08219 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 10c0/4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 + languageName: node + linkType: hard + +"decimal.js@npm:^10.4.3": + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 10c0/1f4fa54eb740414a816b3f6c24818fbfcabd74ac478391e9f4e2282c994127db02010ce804f3d08e38255493cfe68608b3f5c8e09fd6efc4ae46c807691f7a31 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"dedent@npm:^0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 10c0/7c3aa00ddfe3e5fcd477958e156156a5137e3bb6ff1493ca05edff4decf29a90a057974cc77e75951f8eb801c1816cb45aea1f52d628cdd000b82b36ab839d1b + languageName: node + linkType: hard + +"deep-eql@npm:^4.1.3": + version: 4.1.4 + resolution: "deep-eql@npm:4.1.4" + dependencies: + type-detect: "npm:^4.0.0" + checksum: 10c0/264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 + languageName: node + linkType: hard + +"deep-equal@npm:^2.0.5": + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.5" + es-get-iterator: "npm:^1.1.3" + get-intrinsic: "npm:^1.2.2" + is-arguments: "npm:^1.1.1" + is-array-buffer: "npm:^3.0.2" + is-date-object: "npm:^1.0.5" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + isarray: "npm:^2.0.5" + object-is: "npm:^1.1.5" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + side-channel: "npm:^1.0.4" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.1" + which-typed-array: "npm:^1.1.13" + checksum: 10c0/a48244f90fa989f63ff5ef0cc6de1e4916b48ea0220a9c89a378561960814794a5800c600254482a2c8fd2e49d6c2e196131dc983976adb024c94a42dfe4949f + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"default-browser-id@npm:^3.0.0": + version: 3.0.0 + resolution: "default-browser-id@npm:3.0.0" + dependencies: + bplist-parser: "npm:^0.2.0" + untildify: "npm:^4.0.0" + checksum: 10c0/8db3ab882eb3e1e8b59d84c8641320e6c66d8eeb17eb4bb848b7dd549b1e6fd313988e4a13542e95fbaeff03f6e9dedc5ad191ad4df7996187753eb0d45c00b7 + languageName: node + linkType: hard + +"default-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "default-browser@npm:4.0.0" + dependencies: + bundle-name: "npm:^3.0.0" + default-browser-id: "npm:^3.0.0" + execa: "npm:^7.1.1" + titleize: "npm:^3.0.0" + checksum: 10c0/7c8848badc139ecf9d878e562bc4e7ab4301e51ba120b24d8dcb14739c30152115cc612065ac3ab73c02aace4afa29db5a044257b2f0cf234f16e3a58f6c925e + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 + languageName: node + linkType: hard + +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 + languageName: node + linkType: hard + +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 + languageName: node + linkType: hard + +"del@npm:^5.0.0": + version: 5.1.0 + resolution: "del@npm:5.1.0" + dependencies: + globby: "npm:^10.0.1" + graceful-fs: "npm:^4.2.2" + is-glob: "npm:^4.0.1" + is-path-cwd: "npm:^2.2.0" + is-path-inside: "npm:^3.0.1" + p-map: "npm:^3.0.0" + rimraf: "npm:^3.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/1c25de7ff7cf4a8ee017190e39e05d2c4e19774802213d210daaa627228b50e0f5b04e7ce8cceaf03647b238732f78dc303ec5a9d54d5104de33a13fb5a899cf + languageName: node + linkType: hard + +"del@npm:^6.0.0": + version: 6.1.1 + resolution: "del@npm:6.1.1" + dependencies: + globby: "npm:^11.0.1" + graceful-fs: "npm:^4.2.4" + is-glob: "npm:^4.0.1" + is-path-cwd: "npm:^2.2.0" + is-path-inside: "npm:^3.0.2" + p-map: "npm:^4.0.0" + rimraf: "npm:^3.0.2" + slash: "npm:^3.0.0" + checksum: 10c0/8a095c5ccade42c867a60252914ae485ec90da243d735d1f63ec1e64c1cfbc2b8810ad69a29ab6326d159d4fddaa2f5bad067808c42072351ec458efff86708f + languageName: node + linkType: hard + +"del@npm:^7.0.0": + version: 7.1.0 + resolution: "del@npm:7.1.0" + dependencies: + globby: "npm:^13.1.2" + graceful-fs: "npm:^4.2.10" + is-glob: "npm:^4.0.3" + is-path-cwd: "npm:^3.0.0" + is-path-inside: "npm:^4.0.0" + p-map: "npm:^5.5.0" + rimraf: "npm:^3.0.2" + slash: "npm:^4.0.0" + checksum: 10c0/5ad2777b69e386b414ba77f5eba23bb52422c096f4c084c0d1d829ee4776d1a025a6f69765906907c4137026e9bd071ee9d422fd531b1417ef546adc7eb6fada + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 + languageName: node + linkType: hard + +"deprecation@npm:^2.0.0": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: 10c0/23d688ba66b74d09b908c40a76179418acbeeb0bfdf218c8075c58ad8d0c315130cb91aa3dffb623aa3a411a3569ce56c6460de6c8d69071c17fe6dd2442f032 + languageName: node + linkType: hard + +"dequal@npm:^2.0.2, dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + +"detect-node-es@npm:^1.1.0": + version: 1.1.0 + resolution: "detect-node-es@npm:1.1.0" + checksum: 10c0/e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe + languageName: node + linkType: hard + +"dezalgo@npm:^1.0.0": + version: 1.0.4 + resolution: "dezalgo@npm:1.0.4" + dependencies: + asap: "npm:^2.0.0" + wrappy: "npm:1" + checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 + languageName: node + linkType: hard + +"diff-sequences@npm:^27.5.1": + version: 27.5.1 + resolution: "diff-sequences@npm:27.5.1" + checksum: 10c0/a52566d891b89a666f48ba69f54262fa8293ae6264ae04da82c7bf3b6661cba75561de0729f18463179d56003cc0fd69aa09845f2c2cd7a353b1ec1e1a96beb9 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^5.1.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10c0/aed0941f206fe261ecb258dc8d0ceea8abbde3ace5827518ff8d302f0fc9cc81ce116c4d8f379151171336caf0516b79e01abdc1ed1201b6440d895a66689eb4 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.0, dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: "npm:^2.0.2" + checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 10c0/b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 + languageName: node + linkType: hard + +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: 10c0/10bee5aa514b2a9a37c87cd81268db607a2e933a050074abc2f6fa3da9080ebed206a320cbc123567f2c3087d22292853bdfdceaffdd4334ffe2af9510b29360 + languageName: node + linkType: hard + +"dot-prop@npm:^5.1.0": + version: 5.3.0 + resolution: "dot-prop@npm:5.3.0" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 10c0/93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 + languageName: node + linkType: hard + +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 10c0/30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a + languageName: node + linkType: hard + +"dot-prop@npm:^7.2.0": + version: 7.2.0 + resolution: "dot-prop@npm:7.2.0" + dependencies: + type-fest: "npm:^2.11.2" + checksum: 10c0/2621702a01e7a47730e3a8e2938a406afc79b62fbb77bd1394e786ff13776673904bf0a4fc6b812eb9849ec71034e9fc1019a9e0bbe91f84010d8a8088cd41a9 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"duplexer2@npm:~0.1.0": + version: 0.1.4 + resolution: "duplexer2@npm:0.1.4" + dependencies: + readable-stream: "npm:^2.0.2" + checksum: 10c0/0765a4cc6fe6d9615d43cc6dbccff6f8412811d89a6f6aa44828ca9422a0a469625ce023bf81cee68f52930dbedf9c5716056ff264ac886612702d134b5e39b4 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.132 + resolution: "electron-to-chromium@npm:1.5.132" + checksum: 10c0/5dcbbed2a5be4b19812d54d4beb0c09a7f753793018255690f028346f96baf8b5c77f4d231a735321bf6f69f389bdd90c045c99deac61e8ce19183788ceb4fb4 + languageName: node + linkType: hard + +"elegant-spinner@npm:^1.0.1": + version: 1.0.1 + resolution: "elegant-spinner@npm:1.0.1" + checksum: 10c0/df607c83c20fc3ce56c514175dd5d1ee7f667da00cee13d04d32c70d55e76555091fa236689e691cf7dedba17b0020fec635e499cdde84dbea2ef8639314e5f8 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"env-ci@npm:^5.0.0": + version: 5.5.0 + resolution: "env-ci@npm:5.5.0" + dependencies: + execa: "npm:^5.0.0" + fromentries: "npm:^1.3.2" + java-properties: "npm:^1.0.0" + checksum: 10c0/5175b4ccc464929811bac4bd5498443bc519d4ee3053d4cfb65b468ee41aaca342e91ff7f92a5a8af5fe801abf92007230dfa94e5d80040962d025d3e19f1e5f + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": + version: 1.23.9 + resolution: "es-abstract@npm:1.23.9" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.0" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-regex: "npm:^1.2.1" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.0" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.3" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.3" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.18" + checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-get-iterator@npm:^1.1.3": + version: 1.1.3 + resolution: "es-get-iterator@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.3" + has-symbols: "npm:^1.0.3" + is-arguments: "npm:^1.1.1" + is-map: "npm:^2.0.2" + is-set: "npm:^2.0.2" + is-string: "npm:^1.0.7" + isarray: "npm:^2.0.5" + stop-iteration-iterator: "npm:^1.0.0" + checksum: 10c0/ebd11effa79851ea75d7f079405f9d0dc185559fd65d986c6afea59a0ff2d46c2ed8675f19f03dce7429d7f6c14ff9aede8d121fbab78d75cfda6a263030bac0 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-set-tostringtag: "npm:^2.0.3" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.6" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + iterator.prototype: "npm:^1.1.4" + safe-array-concat: "npm:^1.1.3" + checksum: 10c0/97e3125ca472d82d8aceea11b790397648b52c26d8768ea1c1ee6309ef45a8755bb63225a43f3150c7591cffc17caf5752459f1e70d583b4184370a8f04ebd2f + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: "npm:^1.2.7" + is-date-object: "npm:^1.0.5" + is-symbol: "npm:^1.0.4" + checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b + languageName: node + linkType: hard + +"esbuild-register@npm:^3.5.0": + version: 3.6.0 + resolution: "esbuild-register@npm:3.6.0" + dependencies: + debug: "npm:^4.3.4" + peerDependencies: + esbuild: ">=0.12 <1" + checksum: 10c0/77193b7ca32ba9f81b35ddf3d3d0138efb0b1429d71b39480cfee932e1189dd2e492bd32bf04a4d0bc3adfbc7ec7381ceb5ffd06efe35f3e70904f1f686566d5 + languageName: node + linkType: hard + +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0": + version: 0.25.2 + resolution: "esbuild@npm:0.25.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.2" + "@esbuild/android-arm": "npm:0.25.2" + "@esbuild/android-arm64": "npm:0.25.2" + "@esbuild/android-x64": "npm:0.25.2" + "@esbuild/darwin-arm64": "npm:0.25.2" + "@esbuild/darwin-x64": "npm:0.25.2" + "@esbuild/freebsd-arm64": "npm:0.25.2" + "@esbuild/freebsd-x64": "npm:0.25.2" + "@esbuild/linux-arm": "npm:0.25.2" + "@esbuild/linux-arm64": "npm:0.25.2" + "@esbuild/linux-ia32": "npm:0.25.2" + "@esbuild/linux-loong64": "npm:0.25.2" + "@esbuild/linux-mips64el": "npm:0.25.2" + "@esbuild/linux-ppc64": "npm:0.25.2" + "@esbuild/linux-riscv64": "npm:0.25.2" + "@esbuild/linux-s390x": "npm:0.25.2" + "@esbuild/linux-x64": "npm:0.25.2" + "@esbuild/netbsd-arm64": "npm:0.25.2" + "@esbuild/netbsd-x64": "npm:0.25.2" + "@esbuild/openbsd-arm64": "npm:0.25.2" + "@esbuild/openbsd-x64": "npm:0.25.2" + "@esbuild/sunos-x64": "npm:0.25.2" + "@esbuild/win32-arm64": "npm:0.25.2" + "@esbuild/win32-ia32": "npm:0.25.2" + "@esbuild/win32-x64": "npm:0.25.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/87ce0b78699c4d192b8cf7e9b688e9a0da10e6f58ff85a368bf3044ca1fa95626c98b769b5459352282e0065585b6f994a5e6699af5cccf9d31178960e2b58fd + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-goat@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-goat@npm:4.0.0" + checksum: 10c0/9d2a8314e2370f2dd9436d177f6b3b1773525df8f895c8f3e1acb716f5fd6b10b336cb1cd9862d4709b36eb207dbe33664838deca9c6d55b8371be4eebb972f6 + languageName: node + linkType: hard + +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^10.0.2": + version: 10.1.1 + resolution: "eslint-config-prettier@npm:10.1.1" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/3dbfdf6495dd62e2e1644ea9e8e978100dabcd8740fd264df1222d130001a1e8de05d6ed6c67d3a60727386a07507f067d1ca79af6d546910414beab19e7966e + languageName: node + linkType: hard + +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 + languageName: node + linkType: hard + +"eslint-import-resolver-typescript@npm:^3.8.3": + version: 3.10.0 + resolution: "eslint-import-resolver-typescript@npm:3.10.0" + dependencies: + "@nolyfill/is-core-module": "npm:1.0.39" + debug: "npm:^4.4.0" + get-tsconfig: "npm:^4.10.0" + is-bun-module: "npm:^2.0.0" + stable-hash: "npm:^0.0.5" + tinyglobby: "npm:^0.2.12" + unrs-resolver: "npm:^1.3.2" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10c0/5abd1b2d2bd0dca1616cca88ce3ed6bd6d68aa227a5da09e291720c3477f1ff467fbdcc0e19f28b4a4c2e3e8b2e6864fe0c4dcf8ff3092b5c6df2e7095aa738e + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" + dependencies: + debug: "npm:^3.2.7" + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.31.0": + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" + dependencies: + "@rtsao/scc": "npm:^1.1.0" + array-includes: "npm:^3.1.8" + array.prototype.findlastindex: "npm:^1.2.5" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.12.0" + hasown: "npm:^2.0.2" + is-core-module: "npm:^2.15.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + object.groupby: "npm:^1.0.3" + object.values: "npm:^1.2.0" + semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" + tsconfig-paths: "npm:^3.15.0" + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a + languageName: node + linkType: hard + +"eslint-plugin-jsx-a11y@npm:^6.10.2": + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" + dependencies: + aria-query: "npm:^5.3.2" + array-includes: "npm:^3.1.8" + array.prototype.flatmap: "npm:^1.3.2" + ast-types-flow: "npm:^0.0.8" + axe-core: "npm:^4.10.0" + axobject-query: "npm:^4.1.0" + damerau-levenshtein: "npm:^1.0.8" + emoji-regex: "npm:^9.2.2" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^3.3.5" + language-tags: "npm:^1.0.9" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.8" + safe-regex-test: "npm:^1.0.3" + string.prototype.includes: "npm:^2.0.1" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^5.1.0": + version: 5.2.0 + resolution: "eslint-plugin-react-hooks@npm:5.2.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: 10c0/1c8d50fa5984c6dea32470651807d2922cc3934cf3425e78f84a24c2dfd972e7f019bee84aefb27e0cf2c13fea0ac1d4473267727408feeb1c56333ca1489385 + languageName: node + linkType: hard + +"eslint-plugin-react@npm:^7.37.4": + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.2.1" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.9" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57 + languageName: node + linkType: hard + +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + +"eslint@npm:^9.23.0": + version: 9.24.0 + resolution: "eslint@npm:9.24.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.20.0" + "@eslint/config-helpers": "npm:^0.2.0" + "@eslint/core": "npm:^0.12.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.24.0" + "@eslint/plugin-kit": "npm:^0.2.7" + "@humanfs/node": "npm:^0.16.6" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.3.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/f758ff1b9d2f2af5335f562f3f40aa8f71607b3edca33f7616840a222ed224555aeb3ac6943cc86e4f9ac5dc124a60bbfde624d054fb235631a8c04447e39ecc + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0, esprima@npm:~4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^1.0.1": + version: 1.0.1 + resolution: "estree-walker@npm:1.0.1" + checksum: 10c0/fa9e5f8c1bbe8d01e314c0f03067b64a4f22d4c58410fc5237060d0c15b81e58c23921c41acc60abbdab490f1fdfcbd6408ede2d03ca704454272e0244d61a55 + languageName: node + linkType: hard + +"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:^1.0.0": + version: 1.0.0 + resolution: "execa@npm:1.0.0" + dependencies: + cross-spawn: "npm:^6.0.0" + get-stream: "npm:^4.0.0" + is-stream: "npm:^1.1.0" + npm-run-path: "npm:^2.0.0" + p-finally: "npm:^1.0.0" + signal-exit: "npm:^3.0.0" + strip-eof: "npm:^1.0.0" + checksum: 10c0/cc71707c9aa4a2552346893ee63198bf70a04b5a1bc4f8a0ef40f1d03c319eae80932c59191f037990d7d102193e83a38ec72115fff814ec2fb3099f3661a590 + languageName: node + linkType: hard + +"execa@npm:^2.0.3": + version: 2.1.0 + resolution: "execa@npm:2.1.0" + dependencies: + cross-spawn: "npm:^7.0.0" + get-stream: "npm:^5.0.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^3.0.0" + onetime: "npm:^5.1.0" + p-finally: "npm:^2.0.0" + signal-exit: "npm:^3.0.2" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/6578db04a18a9d166a2de6f85be2f1130315fe5917d8163fdbbeaaec39f89cc20448e243dffe833f58b93c210fb3b19e3612c155c81853722497100b8230c34c + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"execa@npm:^6.1.0": + version: 6.1.0 + resolution: "execa@npm:6.1.0" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^3.0.1" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 10c0/004ee32092af745766a1b0352fdba8701a4001bc3fe08e63101c04276d4c860bbe11bb8ab85f37acdff13d3da83d60e044041dcf24bd7e25e645a543828d9c41 + languageName: node + linkType: hard + +"execa@npm:^7.1.1": + version: 7.2.0 + resolution: "execa@npm:7.2.0" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^4.3.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 10c0/098cd6a1bc26d509e5402c43f4971736450b84d058391820c6f237aeec6436963e006fd8423c9722f148c53da86aa50045929c7278b5522197dff802d10f9885 + languageName: node + linkType: hard + +"execa@npm:^8.0.1": + version: 8.0.1 + resolution: "execa@npm:8.0.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^8.0.1" + human-signals: "npm:^5.0.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^3.0.0" + checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af + languageName: node + linkType: hard + +"exit-hook@npm:^3.2.0": + version: 3.2.0 + resolution: "exit-hook@npm:3.2.0" + checksum: 10c0/e8c56a32d24372d7051f179f63f4f75eaeee11160953102ab0f155661555025b3bf961033bf6326de14c55fc51aac6330c4491752358a39acaa17f65c74772ed + languageName: node + linkType: hard + +"expect@npm:^29.0.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + languageName: node + linkType: hard + +"external-editor@npm:^3.0.3, external-editor@npm:^3.1.0": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.19.1 + resolution: "fastq@npm:1.19.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 + languageName: node + linkType: hard + +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f + languageName: node + linkType: hard + +"figures@npm:^1.7.0": + version: 1.7.0 + resolution: "figures@npm:1.7.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + object-assign: "npm:^4.1.0" + checksum: 10c0/a10942b0eec3372bf61822ab130d2bbecdf527d551b0b013fbe7175b7a0238ead644ee8930a1a3cb872fb9ab2ec27df30e303765a3b70b97852e2e9ee43bdff3 + languageName: node + linkType: hard + +"figures@npm:^2.0.0": + version: 2.0.0 + resolution: "figures@npm:2.0.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/5dc5a75fec3e7e04ae65d6ce51d28b3e70d4656c51b06996b6fdb2cb5b542df512e3b3c04482f5193a964edddafa5521479ff948fa84e12ff556e53e094ab4ce + languageName: node + linkType: hard + +"figures@npm:^3.0.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10c0/9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: 10c0/071e0886b2b50238ca5026c5bbf58c26a7c1a1f720773b8c7813d16ba93d0200de977af14ac143c5ac18f666b2cfc83073f3a5fe6a4e996c49e0863d5500fccf + languageName: node + linkType: hard + +"find-cache-dir@npm:^3.3.1, find-cache-dir@npm:^3.3.2": + version: 3.3.2 + resolution: "find-cache-dir@npm:3.3.2" + dependencies: + commondir: "npm:^1.0.1" + make-dir: "npm:^3.0.2" + pkg-dir: "npm:^4.1.0" + checksum: 10c0/92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 + languageName: node + linkType: hard + +"find-up@npm:^2.0.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: "npm:^2.0.0" + checksum: 10c0/c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"find-versions@npm:^4.0.0": + version: 4.0.0 + resolution: "find-versions@npm:4.0.0" + dependencies: + semver-regex: "npm:^3.1.2" + checksum: 10c0/4ed736f0604e9249104fb8679850ad8bfb9262142e79f86bc88e1e731e6958616a1dd6b0d6814634e993e7a59efaa1546a92e0d47a22534c6e79ec382ea60950 + languageName: node + linkType: hard + +"find-yarn-workspace-root@npm:^2.0.0": + version: 2.0.0 + resolution: "find-yarn-workspace-root@npm:2.0.0" + dependencies: + micromatch: "npm:^4.0.2" + checksum: 10c0/b0d3843013fbdaf4e57140e0165889d09fa61745c9e85da2af86e54974f4cc9f1967e40f0d8fc36a79d53091f0829c651d06607d552582e53976f3cd8f4e5689 + languageName: node + linkType: hard + +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: "npm:^1.2.7" + checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"form-data-encoder@npm:^2.1.2": + version: 2.1.4 + resolution: "form-data-encoder@npm:2.1.4" + checksum: 10c0/4c06ae2b79ad693a59938dc49ebd020ecb58e4584860a90a230f80a68b026483b022ba5e4143cff06ae5ac8fd446a0b500fabc87bbac3d1f62f2757f8dabcaf7 + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.2 + resolution: "form-data@npm:4.0.2" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.12" + checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c + languageName: node + linkType: hard + +"framer-motion@npm:^11.18.2": + version: 11.18.2 + resolution: "framer-motion@npm:11.18.2" + dependencies: + motion-dom: "npm:^11.18.1" + motion-utils: "npm:^11.18.1" + tslib: "npm:^2.4.0" + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10c0/41b1ef1b4e54ea13adaf01d61812a8783d2352f74641c91b50519775704bc6274db6b6863ff494a1f705fa6c6ed8f4df3497292327c906d53ea0129cef3ec361 + languageName: node + linkType: hard + +"from2@npm:^2.3.0": + version: 2.3.0 + resolution: "from2@npm:2.3.0" + dependencies: + inherits: "npm:^2.0.1" + readable-stream: "npm:^2.0.0" + checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 + languageName: node + linkType: hard + +"fromentries@npm:^1.3.2": + version: 1.3.2 + resolution: "fromentries@npm:1.3.2" + checksum: 10c0/63938819a86e39f490b0caa1f6b38b8ad04f41ccd2a1c144eb48a21f76e4dbc074bc62e97abb053c7c1f541ecc70cf0b8aaa98eed3fe02206db9b6f9bb9a6a47 + languageName: node + linkType: hard + +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e + languageName: node + linkType: hard + +"fs-extra@npm:^11.0.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a + languageName: node + linkType: hard + +"fs-extra@npm:^9.0.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + functions-have-names: "npm:^1.2.3" + hasown: "npm:^2.0.2" + is-callable: "npm:^1.2.7" + checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: "npm:^1.0.3 || ^2.0.0" + color-support: "npm:^1.1.3" + console-control-strings: "npm:^1.1.0" + has-unicode: "npm:^2.0.1" + signal-exit: "npm:^3.0.7" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wide-align: "npm:^1.1.5" + checksum: 10c0/ef10d7981113d69225135f994c9f8c4369d945e64a8fc721d655a3a38421b738c9fe899951721d1b47b73c41fdb5404ac87cc8903b2ecbed95d2800363e7e58c + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a + languageName: node + linkType: hard + +"get-nonce@npm:^1.0.0": + version: 1.0.1 + resolution: "get-nonce@npm:1.0.1" + checksum: 10c0/2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162 + languageName: node + linkType: hard + +"get-own-enumerable-property-symbols@npm:^3.0.0": + version: 3.0.2 + resolution: "get-own-enumerable-property-symbols@npm:3.0.2" + checksum: 10c0/103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-stdin@npm:^7.0.0": + version: 7.0.0 + resolution: "get-stdin@npm:7.0.0" + checksum: 10c0/84d7850d17727f14d582670c4222b167317da43b296b88717abca989b6192eb80f66ca62833d63e749b3c984f3f9113cb6794dc9ecccb29969b8162565162033 + languageName: node + linkType: hard + +"get-stream@npm:^4.0.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/294d876f667694a5ca23f0ca2156de67da950433b6fb53024833733975d32582896dbc7f257842d331809979efccf04d5e0b6b75ad4d45744c45f193fd497539 + languageName: node + linkType: hard + +"get-stream@npm:^5.0.0, get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"get-stream@npm:^8.0.1": + version: 8.0.1 + resolution: "get-stream@npm:8.0.1" + checksum: 10c0/5c2181e98202b9dae0bb4a849979291043e5892eb40312b47f0c22b9414fc9b28a3b6063d2375705eb24abc41ecf97894d9a51f64ff021511b504477b27b4290 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b + languageName: node + linkType: hard + +"get-tsconfig@npm:^4.10.0": + version: 4.10.0 + resolution: "get-tsconfig@npm:4.10.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 + languageName: node + linkType: hard + +"git-log-parser@npm:^1.2.0": + version: 1.2.1 + resolution: "git-log-parser@npm:1.2.1" + dependencies: + argv-formatter: "npm:~1.0.0" + spawn-error-forwarder: "npm:~1.0.0" + split2: "npm:~1.0.0" + stream-combiner2: "npm:~1.1.1" + through2: "npm:~2.0.0" + traverse: "npm:0.6.8" + checksum: 10c0/8b35e5a4882a481164b1999a062141063645246152eedab4587f4efaf0c61a4964da6cb1891263e92bc1b91edf0850843a06b6cf88a389a7c6a66c1be67ead4f + languageName: node + linkType: hard + +"github-url-from-git@npm:^1.5.0": + version: 1.5.0 + resolution: "github-url-from-git@npm:1.5.0" + checksum: 10c0/d9af476188a660a289f7f2a32d6f25e5199dc04a31ac6f5b4e0c3749cd0b42db9768571cd72659ecf5cb98ca687a14dc43da315c7b52e53c21702ff534012b28 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.0.0, glob@npm:^10.2.2": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"glob@npm:^8.0.1": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: 10c0/cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f + languageName: node + linkType: hard + +"global-dirs@npm:^3.0.0": + version: 3.0.1 + resolution: "global-dirs@npm:3.0.1" + dependencies: + ini: "npm:2.0.0" + checksum: 10c0/ef65e2241a47ff978f7006a641302bc7f4c03dfb98783d42bf7224c136e3a06df046e70ee3a010cf30214114755e46c9eb5eb1513838812fbbe0d92b14c25080 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10c0/8906d5f01838df64a81d6c2a7b7214312e2216cf65c5ed1546dc9a7d0febddf55ffa906cf04efd5b01eec2534d6f14859a89535d1a68241832810e41ef3fd5bb + languageName: node + linkType: hard + +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" + dependencies: + define-properties: "npm:^1.2.1" + gopd: "npm:^1.0.1" + checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 + languageName: node + linkType: hard + +"globby@npm:^10.0.1": + version: 10.0.2 + resolution: "globby@npm:10.0.2" + dependencies: + "@types/glob": "npm:^7.1.1" + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.0.3" + glob: "npm:^7.1.3" + ignore: "npm:^5.1.1" + merge2: "npm:^1.2.3" + slash: "npm:^3.0.0" + checksum: 10c0/9c610ad47117b9dfbc5b0c6c2408c3b72f89c1b9f91ee14c4dc794794e35768ee0920e2a403b688cfa749f48617c6ba3f3a52df07677ed73d602d4349b68c810 + languageName: node + linkType: hard + +"globby@npm:^11.0.0, globby@npm:^11.0.1": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 10c0/b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 + languageName: node + linkType: hard + +"globby@npm:^13.1.2": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 10c0/a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": "npm:^4.0.0" + "@szmarczak/http-timer": "npm:^4.0.5" + "@types/cacheable-request": "npm:^6.0.1" + "@types/responselike": "npm:^1.0.0" + cacheable-lookup: "npm:^5.0.3" + cacheable-request: "npm:^7.0.2" + decompress-response: "npm:^6.0.0" + http2-wrapper: "npm:^1.0.0-beta.5.2" + lowercase-keys: "npm:^2.0.0" + p-cancelable: "npm:^2.0.0" + responselike: "npm:^2.0.0" + checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 + languageName: node + linkType: hard + +"got@npm:^12.1.0": + version: 12.6.1 + resolution: "got@npm:12.6.1" + dependencies: + "@sindresorhus/is": "npm:^5.2.0" + "@szmarczak/http-timer": "npm:^5.0.1" + cacheable-lookup: "npm:^7.0.0" + cacheable-request: "npm:^10.2.8" + decompress-response: "npm:^6.0.0" + form-data-encoder: "npm:^2.1.2" + get-stream: "npm:^6.0.1" + http2-wrapper: "npm:^2.1.10" + lowercase-keys: "npm:^3.0.0" + p-cancelable: "npm:^3.0.0" + responselike: "npm:^3.0.0" + checksum: 10c0/2fe97fcbd7a9ffc7c2d0ecf59aca0a0562e73a7749cadada9770eeb18efbdca3086262625fb65590594edc220a1eca58fab0d26b0c93c2f9a008234da71ca66b + languageName: node + linkType: hard + +"graceful-fs@npm:4.2.10": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 10c0/4223a833e38e1d0d2aea630c2433cfb94ddc07dfc11d511dbd6be1d16688c5be848acc31f9a5d0d0ddbfb56d2ee5a6ae0278aceeb0ca6a13f27e06b9956fb952 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"graphql@npm:^16.8.1": + version: 16.10.0 + resolution: "graphql@npm:16.10.0" + checksum: 10c0/303730675538c8bd6c76b447dc6f03e61242e2d2596b408c34759666ec4877409e5593a7a0467d590ac5407b8c663b093b599556a77f24f281abea69ddc53de6 + languageName: node + linkType: hard + +"handlebars@npm:^4.7.7": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 10c0/7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 10c0/febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 + languageName: node + linkType: hard + +"has-ansi@npm:^2.0.0": + version: 2.0.0 + resolution: "has-ansi@npm:2.0.0" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 + languageName: node + linkType: hard + +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: "npm:^1.0.0" + checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c + languageName: node + linkType: hard + +"has-yarn@npm:^3.0.0": + version: 3.0.0 + resolution: "has-yarn@npm:3.0.0" + checksum: 10c0/38c76618cb764e4a98ea114a3938e0bed6ceafb6bacab2ffb32e7c7d1e18b5e09cd03387d507ee87072388e1f20b1f80947fee62c41fc450edfbbdc02a665787 + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"headers-polyfill@npm:^4.0.2": + version: 4.0.3 + resolution: "headers-polyfill@npm:4.0.3" + checksum: 10c0/53e85b2c6385f8d411945fb890c5369f1469ce8aa32a6e8d28196df38568148de640c81cf88cbc7c67767103dd9acba48f4f891982da63178fc6e34560022afe + languageName: node + linkType: hard + +"hook-std@npm:^2.0.0": + version: 2.0.0 + resolution: "hook-std@npm:2.0.0" + checksum: 10c0/f34859f826bc3a8556e3e91b4cb2285aa33f7472fed2de7a461f8e0450792d6273afc3d497c1b318ea6529e13abad1e7ed1933ce3c07c17c896f74a65abccc44 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.0, hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: "npm:^6.0.0" + checksum: 10c0/150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 + languageName: node + linkType: hard + +"hosted-git-info@npm:^5.0.0, hosted-git-info@npm:^5.2.1": + version: 5.2.1 + resolution: "hosted-git-info@npm:5.2.1" + dependencies: + lru-cache: "npm:^7.5.1" + checksum: 10c0/c6682c2e91d774d79893e2c862d7173450455747fd57f0659337c78d37ddb56c23cb7541b296cbef4a3b47c3be307d8d57f24a6e9aa149cad243c7f126cd42ff + languageName: node + linkType: hard + +"hosted-git-info@npm:^6.1.1": + version: 6.1.3 + resolution: "hosted-git-info@npm:6.1.3" + dependencies: + lru-cache: "npm:^7.5.1" + checksum: 10c0/a1fc10faf67d04d575ebabf89cd5c9e3ebca041d99f42f31143bc8027684da4612c2f6deaf7cf2c09ac3b04dd502ad3957caa49d913628f0558964b2e1e7b414 + languageName: node + linkType: hard + +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": "npm:2" + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/32a05e413430b2c1e542e5c74b38a9f14865301dd69dff2e53ddb684989440e3d2ce0c4b64d25eb63cf6283e6265ff979a61cf93e3ca3d23047ddfdc8df34a32 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.0.0" + checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 + languageName: node + linkType: hard + +"http2-wrapper@npm:^2.1.10": + version: 2.2.1 + resolution: "http2-wrapper@npm:2.2.1" + dependencies: + quick-lru: "npm:^5.1.1" + resolve-alpn: "npm:^1.2.0" + checksum: 10c0/7207201d3c6e53e72e510c9b8912e4f3e468d3ecc0cf3bf52682f2aac9cd99358b896d1da4467380adc151cf97c412bedc59dc13dae90c523f42053a7449eedb + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.0, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"human-signals@npm:^3.0.1": + version: 3.0.1 + resolution: "human-signals@npm:3.0.1" + checksum: 10c0/0bb27e72aea1666322f69ab9816e05df952ef2160346f2293f98f45d472edb1b62d0f1a596697b50d48d8f8222e6db3b9f9dc0b6bf6113866121001f0a8e48e9 + languageName: node + linkType: hard + +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 10c0/40498b33fe139f5cc4ef5d2f95eb1803d6318ac1b1c63eaf14eeed5484d26332c828de4a5a05676b6c83d7b9e57727c59addb4b1dea19cb8d71e83689e5b336c + languageName: node + linkType: hard + +"human-signals@npm:^5.0.0": + version: 5.0.0 + resolution: "human-signals@npm:5.0.0" + checksum: 10c0/5a9359073fe17a8b58e5a085e9a39a950366d9f00217c4ff5878bd312e09d80f460536ea6a3f260b5943a01fe55c158d1cea3fc7bee3d0520aeef04f6d915c82 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: "npm:^2.0.0" + checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a + languageName: node + linkType: hard + +"husky@npm:^3.1.0": + version: 3.1.0 + resolution: "husky@npm:3.1.0" + dependencies: + chalk: "npm:^2.4.2" + ci-info: "npm:^2.0.0" + cosmiconfig: "npm:^5.2.1" + execa: "npm:^1.0.0" + get-stdin: "npm:^7.0.0" + opencollective-postinstall: "npm:^2.0.2" + pkg-dir: "npm:^4.2.0" + please-upgrade-node: "npm:^3.2.0" + read-pkg: "npm:^5.2.0" + run-node: "npm:^1.0.0" + slash: "npm:^3.0.0" + bin: + husky-run: ./run.js + husky-upgrade: ./lib/upgrader/bin.js + checksum: 10c0/f88f41f2ca49780df339098310c8d6c68dba66219d32bf8530585f395eabee9e8bac31012ecaeb9daad3a0697f395a7e321855b8118c725dfc2c72164952aac6 + languageName: node + linkType: hard + +"husky@npm:^8.0.0": + version: 8.0.3 + resolution: "husky@npm:8.0.3" + bin: + husky: lib/bin.js + checksum: 10c0/6722591771c657b91a1abb082e07f6547eca79144d678e586828ae806499d90dce2a6aee08b66183fd8b085f19d20e0990a2ad396961746b4c8bd5bdb619d668 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-walk@npm:^5.0.1": + version: 5.0.1 + resolution: "ignore-walk@npm:5.0.1" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10c0/0d157a54d6d11af0c3059fdc7679eef3b074e9a663d110a76c72788e2fb5b22087e08b21ab767718187ac3396aca4d0aa6c6473f925b19a74d9a00480ca7a76e + languageName: node + linkType: hard + +"ignore-walk@npm:^6.0.3": + version: 6.0.5 + resolution: "ignore-walk@npm:6.0.5" + dependencies: + minimatch: "npm:^9.0.0" + checksum: 10c0/8bd6d37c82400016c7b6538b03422dde8c9d7d3e99051c8357dd205d499d42828522fb4fbce219c9c21b4b069079445bacdc42bbd3e2e073b52856c2646d8a39 + languageName: node + linkType: hard + +"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "import-fresh@npm:2.0.0" + dependencies: + caller-path: "npm:^2.0.0" + resolve-from: "npm:^3.0.0" + checksum: 10c0/116c55ee5215a7839062285b60df85dbedde084c02111dc58c1b9d03ff7876627059f4beb16cdc090a3db21fea9022003402aa782139dc8d6302589038030504 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec + languageName: node + linkType: hard + +"import-from@npm:^4.0.0": + version: 4.0.0 + resolution: "import-from@npm:4.0.0" + checksum: 10c0/7fd98650d555e418c18341fef49ae11afc833f5ae70b7043e99684187cba6ac6b52e4118a491bd9f856045495bef5bdda7321095e65bcb2ef70ce2adf9f0d8d1 + languageName: node + linkType: hard + +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 10c0/a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca + languageName: node + linkType: hard + +"import-local@npm:^3.1.0": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^3.0.0": + version: 3.2.0 + resolution: "indent-string@npm:3.2.0" + checksum: 10c0/91b6d61621d24944c5c4d365d6f1ff4a490264ccaf1162a602faa0d323e69231db2180ad4ccc092c2f49cf8888cdb3da7b73e904cc0fdeec40d0bfb41ceb9478 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 10c0/a7b241e3149c26e37474e3435779487f42f36883711f198c45794703c7556bc38af224088bd4d1a221a45b8208ae2c2bcf86200383621434d0c099304481c5b9 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:2.0.0": + version: 2.0.0 + resolution: "ini@npm:2.0.0" + checksum: 10c0/2e0c8f386369139029da87819438b20a1ff3fe58372d93fb1a86e9d9344125ace3a806b8ec4eb160a46e64cbc422fe68251869441676af49b7fc441af2389c25 + languageName: node + linkType: hard + +"ini@npm:^1.3.4, ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"ini@npm:^3.0.0, ini@npm:^3.0.1": + version: 3.0.1 + resolution: "ini@npm:3.0.1" + checksum: 10c0/4473d8d42d4b0c4fcf8707e5d37a7eacd5a1d2ed2b99f1b6805c76efddf674c3deba6fb26811eeeb883a71d6c6917c3250d336e545b4e2c8d96081bf05e58df6 + languageName: node + linkType: hard + +"init-package-json@npm:^3.0.2": + version: 3.0.2 + resolution: "init-package-json@npm:3.0.2" + dependencies: + npm-package-arg: "npm:^9.0.1" + promzard: "npm:^0.3.0" + read: "npm:^1.0.7" + read-package-json: "npm:^5.0.0" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + validate-npm-package-name: "npm:^4.0.0" + checksum: 10c0/6efb57881d31af86006795df1def73fa997729ad57ff2e74346128653a1f21e417d194353b7733fd2edef8a79389ee9c1f56c65ce7b0809c3041229599366e6e + languageName: node + linkType: hard + +"inquirer-autosubmit-prompt@npm:^0.2.0": + version: 0.2.0 + resolution: "inquirer-autosubmit-prompt@npm:0.2.0" + dependencies: + chalk: "npm:^2.4.1" + inquirer: "npm:^6.2.1" + rxjs: "npm:^6.3.3" + checksum: 10c0/334416788513181a1371acc15b0306a73776923244a3c91e88f480eb05eefdcce3f4501f272ca5d4c8abc09cd79304632a7ab85d7ea91a4052fff69f174033e4 + languageName: node + linkType: hard + +"inquirer@npm:^6.2.1": + version: 6.5.2 + resolution: "inquirer@npm:6.5.2" + dependencies: + ansi-escapes: "npm:^3.2.0" + chalk: "npm:^2.4.2" + cli-cursor: "npm:^2.1.0" + cli-width: "npm:^2.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^2.0.0" + lodash: "npm:^4.17.12" + mute-stream: "npm:0.0.7" + run-async: "npm:^2.2.0" + rxjs: "npm:^6.4.0" + string-width: "npm:^2.1.0" + strip-ansi: "npm:^5.1.0" + through: "npm:^2.3.6" + checksum: 10c0/a5aa53a8f88405cf1cff63111493f87a5b3b5deb5ea4a0dbcd73ccc06a51a6bba0c3f1a0747f8880e9e3ec2437c69f90417be16368abf636b1d29eebe35db0ac + languageName: node + linkType: hard + +"inquirer@npm:^7.0.0": + version: 7.3.3 + resolution: "inquirer@npm:7.3.3" + dependencies: + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.19" + mute-stream: "npm:0.0.8" + run-async: "npm:^2.4.0" + rxjs: "npm:^6.6.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + checksum: 10c0/96e75974cfd863fe6653c075e41fa5f1a290896df141189816db945debabcd92d3277145f11aef8d2cfca5409ab003ccdd18a099744814057b52a2f27aeb8c94 + languageName: node + linkType: hard + +"inquirer@npm:^9.2.6": + version: 9.3.7 + resolution: "inquirer@npm:9.3.7" + dependencies: + "@inquirer/figures": "npm:^1.0.3" + ansi-escapes: "npm:^4.3.2" + cli-width: "npm:^4.1.0" + external-editor: "npm:^3.1.0" + mute-stream: "npm:1.0.0" + ora: "npm:^5.4.1" + run-async: "npm:^3.0.0" + rxjs: "npm:^7.8.1" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^6.2.0" + yoctocolors-cjs: "npm:^2.1.2" + checksum: 10c0/7a5b70312a734b579846648365cbf354e8b23ec73f379d46ada30bc2cf3961dc33b7ca59a3c2beed8a8e03744e3d6c12d4998a34b2d3904774aed238d77328b4 + languageName: node + linkType: hard + +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + hasown: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 + languageName: node + linkType: hard + +"into-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "into-stream@npm:6.0.0" + dependencies: + from2: "npm:^2.3.0" + p-is-promise: "npm:^3.0.0" + checksum: 10c0/576319a540d0e494f5f6028db364b0e163d58020139d862e5372c51ac35875e4ac2ee49fd821bb9225642de6add2e26dff82e5c41108d638a95930fa83bad750 + languageName: node + linkType: hard + +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: "npm:^1.0.0" + checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"ip-regex@npm:^4.1.0": + version: 4.3.0 + resolution: "ip-regex@npm:4.3.0" + checksum: 10c0/f9ef1f5d0df05b9133a882974e572ae525ccd205260cb103dae337f1fc7451ed783391acc6ad688e56dd2598f769e8e72ecbb650ec34763396af822a91768562 + languageName: node + linkType: hard + +"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" + dependencies: + async-function: "npm:^1.0.0" + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: "npm:^1.0.2" + checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e + languageName: node + linkType: hard + +"is-bun-module@npm:^2.0.0": + version: 2.0.0 + resolution: "is-bun-module@npm:2.0.0" + dependencies: + semver: "npm:^7.7.1" + checksum: 10c0/7d27a0679cfa5be1f5052650391f9b11040cd70c48d45112e312c56bc6b6ca9c9aea70dcce6cc40b1e8947bfff8567a5c5715d3b066fb478522dab46ea379240 + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f + languageName: node + linkType: hard + +"is-ci@npm:^3.0.1": + version: 3.0.1 + resolution: "is-ci@npm:3.0.1" + dependencies: + ci-info: "npm:^3.2.0" + bin: + is-ci: bin.js + checksum: 10c0/0e81caa62f4520d4088a5bef6d6337d773828a88610346c4b1119fb50c842587ed8bef1e5d9a656835a599e7209405b5761ddf2339668f2d0f4e889a92fe6051 + languageName: node + linkType: hard + +"is-cidr@npm:^4.0.2": + version: 4.0.2 + resolution: "is-cidr@npm:4.0.2" + dependencies: + cidr-regex: "npm:^3.1.1" + checksum: 10c0/64d8e03304a8c479b338fbe4341e8a37a9dd6fa1e0e95c93e7121b64f50ef154346965779c5e3bc1460915eb04a57564909d9199adb627dc7ec1ac2cfd282f10 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + is-typed-array: "npm:^1.1.13" + checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f + languageName: node + linkType: hard + +"is-directory@npm:^0.3.1": + version: 0.3.1 + resolution: "is-directory@npm:0.3.1" + checksum: 10c0/1c39c7d1753b04e9483b89fb88908b8137ab4743b6f481947e97ccf93ecb384a814c8d3f0b95b082b149c5aa19c3e9e4464e2791d95174bce95998c26bb1974b + languageName: node + linkType: hard + +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": + version: 2.2.1 + resolution: "is-docker@npm:2.2.1" + bin: + is-docker: cli.js + checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc + languageName: node + linkType: hard + +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: "npm:^1.0.0" + checksum: 10c0/12acfcf16142f2d431bf6af25d68569d3198e81b9799b4ae41058247aafcc666b0127d64384ea28e67a746372611fcbe9b802f69175287aba466da3eddd5ba0f + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: 10c0/df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + get-proto: "npm:^1.0.0" + has-tostringtag: "npm:^1.0.2" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd + languageName: node + linkType: hard + +"is-installed-globally@npm:^0.4.0": + version: 0.4.0 + resolution: "is-installed-globally@npm:0.4.0" + dependencies: + global-dirs: "npm:^3.0.0" + is-path-inside: "npm:^3.0.2" + checksum: 10c0/f3e6220ee5824b845c9ed0d4b42c24272701f1f9926936e30c0e676254ca5b34d1b92c6205cae11b283776f9529212c0cdabb20ec280a6451677d6493ca9c22d + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-map@npm:^2.0.2, is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + +"is-name-taken@npm:^2.0.0": + version: 2.0.0 + resolution: "is-name-taken@npm:2.0.0" + dependencies: + all-package-names: "npm:^2.0.2" + package-name-conflict: "npm:^1.0.3" + validate-npm-package-name: "npm:^3.0.0" + checksum: 10c0/f2d98c282cf28325585c64a1e82b0ccf830f5d86b356f3d68dfc35d016350fb5dd1e5ae57ce9b52814c0284b8df3c00e9ed245b29449fc1e71481050afb24f07 + languageName: node + linkType: hard + +"is-node-process@npm:^1.2.0": + version: 1.2.0 + resolution: "is-node-process@npm:1.2.0" + checksum: 10c0/5b24fda6776d00e42431d7bcd86bce81cb0b6cabeb944142fe7b077a54ada2e155066ad06dbe790abdb397884bdc3151e04a9707b8cd185099efbc79780573ed + languageName: node + linkType: hard + +"is-npm@npm:^6.0.0": + version: 6.0.0 + resolution: "is-npm@npm:6.0.0" + checksum: 10c0/1f064c66325cba6e494783bee4e635caa2655aad7f853a0e045d086e0bb7d83d2d6cdf1745dc9a7c7c93dacbf816fbee1f8d9179b02d5d01674d4f92541dc0d9 + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-obj@npm:^1.0.1": + version: 1.0.1 + resolution: "is-obj@npm:1.0.1" + checksum: 10c0/5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 + languageName: node + linkType: hard + +"is-obj@npm:^2.0.0": + version: 2.0.0 + resolution: "is-obj@npm:2.0.0" + checksum: 10c0/85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e + languageName: node + linkType: hard + +"is-observable@npm:^1.1.0": + version: 1.1.0 + resolution: "is-observable@npm:1.1.0" + dependencies: + symbol-observable: "npm:^1.1.0" + checksum: 10c0/cf3166b0822f70ad06e7851e09430166ce658349d54aaa64c93a03320420b9285735821b23164bdce741ff83a86730ac3e53035ce4e2511ed843dbff4105bfa2 + languageName: node + linkType: hard + +"is-path-cwd@npm:^2.2.0": + version: 2.2.0 + resolution: "is-path-cwd@npm:2.2.0" + checksum: 10c0/afce71533a427a759cd0329301c18950333d7589533c2c90205bd3fdcf7b91eb92d1940493190567a433134d2128ec9325de2fd281e05be1920fbee9edd22e0a + languageName: node + linkType: hard + +"is-path-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "is-path-cwd@npm:3.0.0" + checksum: 10c0/8135b789c74e137501ca33b11a846c32d160c517037c0ce390004a98335e010b9712792d97c73d9e98a5ecbcfd03589a81e95c72e1c05014a69fead963a02753 + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.1, is-path-inside@npm:^3.0.2": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 + languageName: node + linkType: hard + +"is-path-inside@npm:^4.0.0": + version: 4.0.0 + resolution: "is-path-inside@npm:4.0.0" + checksum: 10c0/51188d7e2b1d907a9a5f7c18d99a90b60870b951ed87cf97595d9aaa429d4c010652c3350bcbf31182e7f4b0eab9a1860b43e16729b13cb1a44baaa6cdb64c46 + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 + languageName: node + linkType: hard + +"is-promise@npm:^2.1.0": + version: 2.2.2 + resolution: "is-promise@npm:2.2.2" + checksum: 10c0/2dba959812380e45b3df0fb12e7cb4d4528c989c7abb03ececb1d1fd6ab1cbfee956ca9daa587b9db1d8ac3c1e5738cf217bdb3dfd99df8c691be4c00ae09069 + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 + languageName: node + linkType: hard + +"is-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "is-regexp@npm:1.0.0" + checksum: 10c0/34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 + languageName: node + linkType: hard + +"is-scoped@npm:^3.0.0": + version: 3.0.0 + resolution: "is-scoped@npm:3.0.0" + dependencies: + scoped-regex: "npm:^3.0.0" + checksum: 10c0/9061cb11ea6e41e215810181dad2475df8172328f9e6ac2f0a79cfaeeee605ca025e3b18fb910bf4c277f4e61fe912660e687b16d2f9446d52cf487c4fad89a9 + languageName: node + linkType: hard + +"is-set@npm:^2.0.2, is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db + languageName: node + linkType: hard + +"is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 10c0/eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 + languageName: node + linkType: hard + +"is-string@npm:^1.0.7, is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + safe-regex-test: "npm:^1.1.0" + checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e + languageName: node + linkType: hard + +"is-text-path@npm:^1.0.1": + version: 1.0.1 + resolution: "is-text-path@npm:1.0.1" + dependencies: + text-extensions: "npm:^1.0.0" + checksum: 10c0/61c8650c29548febb6bf69e9541fc11abbbb087a0568df7bc471ba264e95fb254def4e610631cbab4ddb0a1a07949d06416f4ebeaf37875023fb184cdb87ee84 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: "npm:^1.1.16" + checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 + languageName: node + linkType: hard + +"is-typedarray@npm:^1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 10c0/4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^1.1.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + +"is-url-superb@npm:^6.1.0": + version: 6.1.0 + resolution: "is-url-superb@npm:6.1.0" + checksum: 10c0/f22c5e49503cb616a0fbab9a4eddf57718213d268355c151ba06e65a8f677c724a9c25e698dbee3cf94dd2686c8c84803317a1e68e3724ad48f390f7cd966b7d + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: "npm:^1.0.3" + checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: "npm:^1.0.3" + get-intrinsic: "npm:^1.2.6" + checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 + languageName: node + linkType: hard + +"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": + version: 2.2.0 + resolution: "is-wsl@npm:2.2.0" + dependencies: + is-docker: "npm:^2.0.0" + checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e + languageName: node + linkType: hard + +"is-yarn-global@npm:^0.4.0": + version: 0.4.1 + resolution: "is-yarn-global@npm:0.4.1" + checksum: 10c0/8ff66f33454614f8e913ad91cc4de0d88d519a46c1ed41b3f589da79504ed0fcfa304064fe3096dda9360c5f35aa210cb8e978fd36798f3118cb66a4de64d365 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"issue-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "issue-parser@npm:6.0.0" + dependencies: + lodash.capitalize: "npm:^4.2.1" + lodash.escaperegexp: "npm:^4.1.2" + lodash.isplainobject: "npm:^4.0.6" + lodash.isstring: "npm:^4.0.1" + lodash.uniqby: "npm:^4.7.0" + checksum: 10c0/3bfc48ca5c380061ba3db9bfb0c2a86692c74245a386d8add5eb7cd60022c85f44277692d78914ff0d37cf0da7d1743149516d00175233949c85c056d12e3b49 + languageName: node + linkType: hard + +"issue-regex@npm:^4.1.0": + version: 4.3.0 + resolution: "issue-regex@npm:4.3.0" + checksum: 10c0/4a8b14f93a0e190c896714b56eda1b3047fb6c64b39f61ace922cc1bc9758a2b46f5e4fa8d04679e8c90662d7cbc18a6778e3f0a23b2b0ee88826816cd4724f7 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.2": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^5.0.4": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + checksum: 10c0/ffe75d70b303a3621ee4671554f306e0831b16f39ab7f4ab52e54d356a5d33e534d97563e318f1333a6aae1d42f91ec49c76b6cd3f3fb378addcb5c81da0255f + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.6": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + languageName: node + linkType: hard + +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" + dependencies: + define-data-property: "npm:^1.1.4" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + get-proto: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"java-properties@npm:^1.0.0": + version: 1.0.2 + resolution: "java-properties@npm:1.0.2" + checksum: 10c0/be0f58c83b5a852f313de2ea57f7b8b7d46dc062b2ffe487d58838e7034d4660f4d22f2a96aae4daa622af6d734726c0d08b01396e59666ededbcfdc25a694d6 + languageName: node + linkType: hard + +"jest-canvas-mock@npm:~2.5.2": + version: 2.5.2 + resolution: "jest-canvas-mock@npm:2.5.2" + dependencies: + cssfontparser: "npm:^1.2.1" + moo-color: "npm:^1.0.2" + checksum: 10c0/6a4190354b1e9aedcb3045273f13f6f1d2d1efb00cfe6458707fae538a8f91f6afdf72b9e201b653666863054edc783428bdc0c1a2c71d66d9ac364b4893f6d6 + languageName: node + linkType: hard + +"jest-diff@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-diff@npm:27.5.1" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^27.5.1" + jest-get-type: "npm:^27.5.1" + pretty-format: "npm:^27.5.1" + checksum: 10c0/48f008c7b4ea7794108319eb61050315b1723e7391cb01e4377c072cadcab10a984cb09d2a6876cb65f100d06c970fd932996192e092b26006f885c00945e7ad + languageName: node + linkType: hard + +"jest-diff@npm:^29.0.0, jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-extended@npm:^4.0.2": + version: 4.0.2 + resolution: "jest-extended@npm:4.0.2" + dependencies: + jest-diff: "npm:^29.0.0" + jest-get-type: "npm:^29.0.0" + peerDependencies: + jest: ">=27.2.5" + peerDependenciesMeta: + jest: + optional: true + checksum: 10c0/305fdb6885ab71755830b70690b8db6ea6fd9adca92360ea1a37c0d2fa6567a68b57178dd7707d112fc57b01ab75b66f28a1c550ed0e6b1b8628600a812c2277 + languageName: node + linkType: hard + +"jest-get-type@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-get-type@npm:27.5.1" + checksum: 10c0/42ee0101336bccfc3c1cff598b603c6006db7876b6117e5bd4a9fb7ffaadfb68febdb9ae68d1c47bc3a4174b070153fc6cfb59df995dcd054e81ace5028a7269 + languageName: node + linkType: hard + +"jest-get-type@npm:^29.0.0, jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^27.0.0": + version: 27.5.1 + resolution: "jest-matcher-utils@npm:27.5.1" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^27.5.1" + jest-get-type: "npm:^27.5.1" + pretty-format: "npm:^27.5.1" + checksum: 10c0/a2f082062e8bedc9cfe2654177a894ca43768c6db4c0f4efc0d6ec195e305a99e3d868ff54cc61bcd7f1c810d8ee28c9ac6374de21715dc52f136876de739a73 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-tokens@npm:^9.0.1": + version: 9.0.1 + resolution: "js-tokens@npm:9.0.1" + checksum: 10c0/68dcab8f233dde211a6b5fd98079783cbcd04b53617c1250e3553ee16ab3e6134f5e65478e41d82f6d351a052a63d71024553933808570f04dbf828d7921e80e + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsdoc-type-pratt-parser@npm:^4.0.0": + version: 4.1.0 + resolution: "jsdoc-type-pratt-parser@npm:4.1.0" + checksum: 10c0/7700372d2e733a32f7ea0a1df9cec6752321a5345c11a91b2ab478a031a426e934f16d5c1f15c8566c7b2c10af9f27892a29c2c789039f595470e929a4aa60ea + languageName: node + linkType: hard + +"jsdom@npm:^24.0.0": + version: 24.1.3 + resolution: "jsdom@npm:24.1.3" + dependencies: + cssstyle: "npm:^4.0.1" + data-urls: "npm:^5.0.0" + decimal.js: "npm:^10.4.3" + form-data: "npm:^4.0.0" + html-encoding-sniffer: "npm:^4.0.0" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.5" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.12" + parse5: "npm:^7.1.2" + rrweb-cssom: "npm:^0.7.1" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^4.1.4" + w3c-xmlserializer: "npm:^5.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^3.1.1" + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + ws: "npm:^8.18.0" + xml-name-validator: "npm:^5.0.0" + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/e48b342afacd7418a23dac204a62deea729c50f4d072a7c04c09fd32355fdb4335f8779fa79fd0277a2dbeb2d356250a950955719d00047324b251233b11277f + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json-stable-stringify@npm:^1.0.2": + version: 1.2.1 + resolution: "json-stable-stringify@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + isarray: "npm:^2.0.5" + jsonify: "npm:^0.0.1" + object-keys: "npm:^1.1.1" + checksum: 10c0/e623e7ce89282f089d56454087edb717357e8572089b552fbc6980fb7814dc3943f7d0e4f1a19429a36ce9f4428b6c8ee6883357974457aaaa98daba5adebeea + languageName: node + linkType: hard + +"json-stringify-nice@npm:^1.1.4": + version: 1.1.4 + resolution: "json-stringify-nice@npm:1.1.4" + checksum: 10c0/13673b67ba9e7fde75a103cade0b0d2dd0d21cd3b918de8d8f6cd59d48ad8c78b0e85f6f4a5842073ddfc91ebdde5ef7c81c7f51945b96a33eaddc5d41324b87 + languageName: node + linkType: hard + +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 + languageName: node + linkType: hard + +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: "npm:^1.2.0" + bin: + json5: lib/cli.js + checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsonify@npm:^0.0.1": + version: 0.0.1 + resolution: "jsonify@npm:0.0.1" + checksum: 10c0/7f5499cdd59a0967ed35bda48b7cec43d850bbc8fb955cdd3a1717bb0efadbe300724d5646de765bb7a99fc1c3ab06eb80d93503c6faaf99b4ff50a3326692f6 + languageName: node + linkType: hard + +"jsonparse@npm:^1.2.0, jsonparse@npm:^1.3.1": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" + dependencies: + array-includes: "npm:^3.1.6" + array.prototype.flat: "npm:^1.3.1" + object.assign: "npm:^4.1.4" + object.values: "npm:^1.1.6" + checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 + languageName: node + linkType: hard + +"just-diff-apply@npm:^5.2.0": + version: 5.5.0 + resolution: "just-diff-apply@npm:5.5.0" + checksum: 10c0/d7b85371f2a5a17a108467fda35dddd95264ab438ccec7837b67af5913c57ded7246039d1df2b5bc1ade034ccf815b56d69786c5f1e07383168a066007c796c0 + languageName: node + linkType: hard + +"just-diff@npm:^5.0.1": + version: 5.2.0 + resolution: "just-diff@npm:5.2.0" + checksum: 10c0/a9d0ebc789f70f5200a022059de057a49b7f1a63179f691b79da13c82c3973d58b7f18e5b30ee0874f79ca53d5e9bdff8f089dff6de4c5f7def10a1c1cc5200e + languageName: node + linkType: hard + +"keyv@npm:^4.0.0, keyv@npm:^4.5.3, keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"klaw-sync@npm:^6.0.0": + version: 6.0.0 + resolution: "klaw-sync@npm:6.0.0" + dependencies: + graceful-fs: "npm:^4.1.11" + checksum: 10c0/00d8e4c48d0d699b743b3b028e807295ea0b225caf6179f51029e19783a93ad8bb9bccde617d169659fbe99559d73fb35f796214de031d0023c26b906cecd70a + languageName: node + linkType: hard + +"language-subtag-registry@npm:^0.3.20": + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c + languageName: node + linkType: hard + +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" + dependencies: + language-subtag-registry: "npm:^0.3.20" + checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff + languageName: node + linkType: hard + +"latest-version@npm:^7.0.0": + version: 7.0.0 + resolution: "latest-version@npm:7.0.0" + dependencies: + package-json: "npm:^8.1.0" + checksum: 10c0/68045f5e419e005c12e595ae19687dd88317dd0108b83a8773197876622c7e9d164fe43aacca4f434b2cba105c92848b89277f658eabc5d50e81fb743bbcddb1 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"libnpmaccess@npm:^6.0.4": + version: 6.0.4 + resolution: "libnpmaccess@npm:6.0.4" + dependencies: + aproba: "npm:^2.0.0" + minipass: "npm:^3.1.1" + npm-package-arg: "npm:^9.0.1" + npm-registry-fetch: "npm:^13.0.0" + checksum: 10c0/d7cee5ae92369a1ac6fb141082b929c853b3b6a140d9878e52ee93abca644fe052e7b5dfc3ac14c4b2f0c0945bd8bf6d5ccff608be8d8928d812df4af28cb43b + languageName: node + linkType: hard + +"libnpmdiff@npm:^4.0.5": + version: 4.0.5 + resolution: "libnpmdiff@npm:4.0.5" + dependencies: + "@npmcli/disparity-colors": "npm:^2.0.0" + "@npmcli/installed-package-contents": "npm:^1.0.7" + binary-extensions: "npm:^2.2.0" + diff: "npm:^5.1.0" + minimatch: "npm:^5.0.1" + npm-package-arg: "npm:^9.0.1" + pacote: "npm:^13.6.1" + tar: "npm:^6.1.0" + checksum: 10c0/421d92ce61bfdfa5d9f04a35974d1363525ffaa4a92df6ce9cec46788e5f4e52283137f77e22e3280eb79f52c3b9cdb587ffbbc640012a95d7369abae77a51a1 + languageName: node + linkType: hard + +"libnpmexec@npm:^4.0.14": + version: 4.0.14 + resolution: "libnpmexec@npm:4.0.14" + dependencies: + "@npmcli/arborist": "npm:^5.6.3" + "@npmcli/ci-detect": "npm:^2.0.0" + "@npmcli/fs": "npm:^2.1.1" + "@npmcli/run-script": "npm:^4.2.0" + chalk: "npm:^4.1.0" + mkdirp-infer-owner: "npm:^2.0.0" + npm-package-arg: "npm:^9.0.1" + npmlog: "npm:^6.0.2" + pacote: "npm:^13.6.1" + proc-log: "npm:^2.0.0" + read: "npm:^1.0.7" + read-package-json-fast: "npm:^2.0.2" + semver: "npm:^7.3.7" + walk-up-path: "npm:^1.0.0" + checksum: 10c0/d5897a873b0755053111978e33944ff6f90682a615fa227043c7e2a10210fce521701d9cce69010ff5609479defaf97f410329a026ba1eed40210ee41d309572 + languageName: node + linkType: hard + +"libnpmfund@npm:^3.0.5": + version: 3.0.5 + resolution: "libnpmfund@npm:3.0.5" + dependencies: + "@npmcli/arborist": "npm:^5.6.3" + checksum: 10c0/8977a4db55d37d991598aaf9507d34cc994aa5b783e2d2f0c2f75ba8fdcded5a81e195fbb77e914de6d577e55f17678c974442e8e559652869b76a02d84283a1 + languageName: node + linkType: hard + +"libnpmhook@npm:^8.0.4": + version: 8.0.4 + resolution: "libnpmhook@npm:8.0.4" + dependencies: + aproba: "npm:^2.0.0" + npm-registry-fetch: "npm:^13.0.0" + checksum: 10c0/64e0fe39053e6bf30c69937f19c06cf555c28eb30539d7caee5db860e85f18d2e4d874235696e1a2b23c9c3e04696bf1afe140a49302aa98a37b0b6c0772fe8b + languageName: node + linkType: hard + +"libnpmorg@npm:^4.0.4": + version: 4.0.4 + resolution: "libnpmorg@npm:4.0.4" + dependencies: + aproba: "npm:^2.0.0" + npm-registry-fetch: "npm:^13.0.0" + checksum: 10c0/aa6c760efe87183d217af0595dbd992374d33eab94f4bb2ab6548b6dc41d9a986c4d4f93e8fcfab4d9c18640c7ffed73a4219b629f207367f9e1f7fa7140fe0b + languageName: node + linkType: hard + +"libnpmpack@npm:^4.1.3": + version: 4.1.3 + resolution: "libnpmpack@npm:4.1.3" + dependencies: + "@npmcli/run-script": "npm:^4.1.3" + npm-package-arg: "npm:^9.0.1" + pacote: "npm:^13.6.1" + checksum: 10c0/628341371bfb556b8e4649b11be63fe1c11dec85fe5d3018d9cda87cc5f274b6fd4df2751d6b651c8e3cfffb03f055e2e1811c41d94022bd28833236f03479cd + languageName: node + linkType: hard + +"libnpmpublish@npm:^6.0.5": + version: 6.0.5 + resolution: "libnpmpublish@npm:6.0.5" + dependencies: + normalize-package-data: "npm:^4.0.0" + npm-package-arg: "npm:^9.0.1" + npm-registry-fetch: "npm:^13.0.0" + semver: "npm:^7.3.7" + ssri: "npm:^9.0.0" + checksum: 10c0/b6238933d792a73a52ddb262aea07a09221dceeaefeb7340f1443d9ab7b2a6997ea8ef5267daaa5c15b1c3be6b7b730cc816f8bf3076a6b346e0a46546828f44 + languageName: node + linkType: hard + +"libnpmsearch@npm:^5.0.4": + version: 5.0.4 + resolution: "libnpmsearch@npm:5.0.4" + dependencies: + npm-registry-fetch: "npm:^13.0.0" + checksum: 10c0/21e0e24c571f91a7e3c1f2d4441bdf611dae6f161ca22aea1623bc90582d0d93b9307903facc0eee1758635da2f5b1f274ebd98db68e9ea3054ca8fc8ab2ffe8 + languageName: node + linkType: hard + +"libnpmteam@npm:^4.0.4": + version: 4.0.4 + resolution: "libnpmteam@npm:4.0.4" + dependencies: + aproba: "npm:^2.0.0" + npm-registry-fetch: "npm:^13.0.0" + checksum: 10c0/ae7311de69936141b8e5b5932aca3bce6eada88b1ef5c5fec12391a26750ccd83e70cffb1cfa7c87d91bfc346d89ce975bfbe4648c3ddc693d3e9a641780537a + languageName: node + linkType: hard + +"libnpmversion@npm:^3.0.7": + version: 3.0.7 + resolution: "libnpmversion@npm:3.0.7" + dependencies: + "@npmcli/git": "npm:^3.0.0" + "@npmcli/run-script": "npm:^4.1.3" + json-parse-even-better-errors: "npm:^2.3.1" + proc-log: "npm:^2.0.0" + semver: "npm:^7.3.7" + checksum: 10c0/07620887a240b4466ce1d7faf967ab5571da0e705c7b87b3aac4581defc9ab1c839e02bee6c1d413321f83b59910f78d770e9b5163e0450799d9eb24ce6e6174 + languageName: node + linkType: hard + +"lilconfig@npm:2.0.6": + version: 2.0.6 + resolution: "lilconfig@npm:2.0.6" + checksum: 10c0/52bcb478586c629a78b9b06de72de897cd6d771725e70ee91ec16605721afebf43cf54b4d20b6bf904ca70877ddd9531b9578494c694072d1573a6d4aba1545a + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"lint-staged@npm:13.1.0": + version: 13.1.0 + resolution: "lint-staged@npm:13.1.0" + dependencies: + cli-truncate: "npm:^3.1.0" + colorette: "npm:^2.0.19" + commander: "npm:^9.4.1" + debug: "npm:^4.3.4" + execa: "npm:^6.1.0" + lilconfig: "npm:2.0.6" + listr2: "npm:^5.0.5" + micromatch: "npm:^4.0.5" + normalize-path: "npm:^3.0.0" + object-inspect: "npm:^1.12.2" + pidtree: "npm:^0.6.0" + string-argv: "npm:^0.3.1" + yaml: "npm:^2.1.3" + bin: + lint-staged: bin/lint-staged.js + checksum: 10c0/e6eeb75b433fd9aaa195c016618017dcf5a0fe87911d0303bb34eda6bfab09b6b5a902f11b26baf3e4a0e911cc683cea8a7f7655f2234739478001b35e58f406 + languageName: node + linkType: hard + +"lint-staged@npm:^9.5.0": + version: 9.5.0 + resolution: "lint-staged@npm:9.5.0" + dependencies: + chalk: "npm:^2.4.2" + commander: "npm:^2.20.0" + cosmiconfig: "npm:^5.2.1" + debug: "npm:^4.1.1" + dedent: "npm:^0.7.0" + del: "npm:^5.0.0" + execa: "npm:^2.0.3" + listr: "npm:^0.14.3" + log-symbols: "npm:^3.0.0" + micromatch: "npm:^4.0.2" + normalize-path: "npm:^3.0.0" + please-upgrade-node: "npm:^3.1.1" + string-argv: "npm:^0.3.0" + stringify-object: "npm:^3.3.0" + bin: + lint-staged: ./bin/lint-staged + checksum: 10c0/852bac51210cb49b59930d855ab945c8acb858a1027ca2ebf07d7e57d889d7a500708cb7a552efc14c4a33cdbed9b25e752e3a9022cfb4fbee0456c0aec7b809 + languageName: node + linkType: hard + +"listr-input@npm:^0.2.1": + version: 0.2.1 + resolution: "listr-input@npm:0.2.1" + dependencies: + inquirer: "npm:^7.0.0" + inquirer-autosubmit-prompt: "npm:^0.2.0" + rxjs: "npm:^6.5.3" + through: "npm:^2.3.8" + checksum: 10c0/3e0ff822f7770bae176d7291f3320fd760a17b5a0fc79ed395a5c269028d66027759b4c4be57974665cc959ff9d581c7b709357ac124aeb8b64f2fb941ce70e9 + languageName: node + linkType: hard + +"listr-silent-renderer@npm:^1.1.1": + version: 1.1.1 + resolution: "listr-silent-renderer@npm:1.1.1" + checksum: 10c0/a13e08ebf863516a757bce4887f05290070772113d89095e9f51a07cf0b11a43a7563a67ff3b287c752c08f6d781fdb2123b02957534e3e0675fb564f2a42e1b + languageName: node + linkType: hard + +"listr-update-renderer@npm:^0.5.0": + version: 0.5.0 + resolution: "listr-update-renderer@npm:0.5.0" + dependencies: + chalk: "npm:^1.1.3" + cli-truncate: "npm:^0.2.1" + elegant-spinner: "npm:^1.0.1" + figures: "npm:^1.7.0" + indent-string: "npm:^3.0.0" + log-symbols: "npm:^1.0.2" + log-update: "npm:^2.3.0" + strip-ansi: "npm:^3.0.1" + peerDependencies: + listr: ^0.14.2 + checksum: 10c0/8ade44bf3dc6146c8e0178000619439e8889792c4689b66be6ce82bd459f5fe462ecb34b05147fb206a8ad60e6d4e6f34c9f48038e18366f867fd972688b8edc + languageName: node + linkType: hard + +"listr-verbose-renderer@npm:^0.5.0": + version: 0.5.0 + resolution: "listr-verbose-renderer@npm:0.5.0" + dependencies: + chalk: "npm:^2.4.1" + cli-cursor: "npm:^2.1.0" + date-fns: "npm:^1.27.2" + figures: "npm:^2.0.0" + checksum: 10c0/041cd1e82da7054f27ae0a914e98b40d15faf9f950ef850578fc6241d3fff3c2d7158a4f6226006e566b4c47bf445be2d254dd1ce5c16569a3a5dcd575bec656 + languageName: node + linkType: hard + +"listr2@npm:^5.0.5": + version: 5.0.8 + resolution: "listr2@npm:5.0.8" + dependencies: + cli-truncate: "npm:^2.1.0" + colorette: "npm:^2.0.19" + log-update: "npm:^4.0.0" + p-map: "npm:^4.0.0" + rfdc: "npm:^1.3.0" + rxjs: "npm:^7.8.0" + through: "npm:^2.3.8" + wrap-ansi: "npm:^7.0.0" + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 10c0/00f00ad18262909bafff21b42d2d94faa9ed3911d70094a12a1182e773533f9b3cfd78d83a81fdbfb7dbc42e3e3252093f504c822de152100a953a91f3adf7cb + languageName: node + linkType: hard + +"listr@npm:^0.14.3": + version: 0.14.3 + resolution: "listr@npm:0.14.3" + dependencies: + "@samverschueren/stream-to-observable": "npm:^0.3.0" + is-observable: "npm:^1.1.0" + is-promise: "npm:^2.1.0" + is-stream: "npm:^1.1.0" + listr-silent-renderer: "npm:^1.1.1" + listr-update-renderer: "npm:^0.5.0" + listr-verbose-renderer: "npm:^0.5.0" + p-map: "npm:^2.0.0" + rxjs: "npm:^6.3.3" + checksum: 10c0/753d518218c423f46bee8eeacccecadfd2e414ba9c0f602e7f85fe3f6fa18404dfab0812433aeda4683ee2548358488f597ac1a3d321196baec5d3149b200b10 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: "npm:^5.2.2" + emojis-list: "npm:^3.0.0" + json5: "npm:^2.1.2" + checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 + languageName: node + linkType: hard + +"local-pkg@npm:^0.5.0": + version: 0.5.1 + resolution: "local-pkg@npm:0.5.1" + dependencies: + mlly: "npm:^1.7.3" + pkg-types: "npm:^1.2.1" + checksum: 10c0/ade8346f1dc04875921461adee3c40774b00d4b74095261222ebd4d5fd0a444676e36e325f76760f21af6a60bc82480e154909b54d2d9f7173671e36dacf1808 + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 10c0/24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + +"lodash.capitalize@npm:^4.2.1": + version: 4.2.1 + resolution: "lodash.capitalize@npm:4.2.1" + checksum: 10c0/b289326497c2e24d6b8afa2af2ca4e068ef6ef007ade36bfb6f70af77ce10ea3f090eeee947d5fdcf2db4bcfa4703c8c10a5857a2b39e308bddfd1d11ad35970 + languageName: node + linkType: hard + +"lodash.debounce@npm:^4.0.8": + version: 4.0.8 + resolution: "lodash.debounce@npm:4.0.8" + checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 + languageName: node + linkType: hard + +"lodash.escaperegexp@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.escaperegexp@npm:4.1.2" + checksum: 10c0/484ad4067fa9119bb0f7c19a36ab143d0173a081314993fe977bd00cf2a3c6a487ce417a10f6bac598d968364f992153315f0dbe25c9e38e3eb7581dd333e087 + languageName: node + linkType: hard + +"lodash.isequal@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10c0/dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f + languageName: node + linkType: hard + +"lodash.ismatch@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.ismatch@npm:4.4.0" + checksum: 10c0/8f96a5dc4b8d3fc5a033dcb259d0c3148a1044fa4d02b4a0e8dce0fa1f2ef3ec4ac131e20b5cb2c985a4e9bcb1c37c0aa5af2cef70094959389617347b8fc645 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: 10c0/09eaf980a283f9eef58ef95b30ec7fee61df4d6bf4aba3b5f096869cc58f24c9da17900febc8ffd67819b4e29de29793190e88dc96983db92d84c95fa85d1c92 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: 10c0/c505c0de20ca759599a2ba38710e8fb95ff2d2028e24d86c901ef2c74be8056518571b9b754bfb75053b2818d30dd02243e4a4621a6940c206bbb3f7626db656 + languageName: node + linkType: hard + +"lodash.zip@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.zip@npm:4.2.0" + checksum: 10c0/e596da80a6138e369998b50c78b51ed6cf984b4f239e59056aa18dca5972a213c491c511caf5888a2dec603c67265caf942099bec554a86a5c7ff1937d57f0e4 + languageName: node + linkType: hard + +"lodash@npm:^4.17.12, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"log-symbols@npm:^1.0.2": + version: 1.0.2 + resolution: "log-symbols@npm:1.0.2" + dependencies: + chalk: "npm:^1.0.0" + checksum: 10c0/c64e1fe41d0d043840f8b592d043b8607a836b846506f525a53d99d578561f02f97b2cba1d2b3c30bae5311d64b308d5a392a9930d252b906a9042fc2877da7a + languageName: node + linkType: hard + +"log-symbols@npm:^3.0.0": + version: 3.0.0 + resolution: "log-symbols@npm:3.0.0" + dependencies: + chalk: "npm:^2.4.2" + checksum: 10c0/d11582a1b499b76aa1415988234ad54d9fb3f888f4cb4186cbc20ee4d314ac4b5f3d9fe9edd828748d2c0d372df2ea9f5dfd89100510988a8ce5ddf483ae015e + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"log-symbols@npm:^5.1.0": + version: 5.1.0 + resolution: "log-symbols@npm:5.1.0" + dependencies: + chalk: "npm:^5.0.0" + is-unicode-supported: "npm:^1.1.0" + checksum: 10c0/c14f8567c6618a7f96209c4c4b9fb3b794187116904712f7b526e465a5c9535728aec983735a5bef919247d0e54b9b72b6680a7fb9fc72d76b945dac4865e669 + languageName: node + linkType: hard + +"log-update@npm:^2.3.0": + version: 2.3.0 + resolution: "log-update@npm:2.3.0" + dependencies: + ansi-escapes: "npm:^3.0.0" + cli-cursor: "npm:^2.0.0" + wrap-ansi: "npm:^3.0.1" + checksum: 10c0/9bf21b138801ab4770a2bfa735161cf005b869360eaf5003a84ba64ddc5f5c3ce7217f4f1fa79d9c1f510d792213b2c9800327228e94df05859d19b716215d90 + languageName: node + linkType: hard + +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: "npm:^4.3.0" + cli-cursor: "npm:^3.1.0" + slice-ansi: "npm:^4.0.0" + wrap-ansi: "npm:^6.2.0" + checksum: 10c0/18b299e230432a156f2535660776406d15ba8bb7817dd3eaadd58004b363756d4ecaabcd658f9949f90b62ea7d3354423be3fdeb7a201ab951ec0e8d6139af86 + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"loupe@npm:^2.3.6, loupe@npm:^2.3.7": + version: 2.3.7 + resolution: "loupe@npm:2.3.7" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 + languageName: node + linkType: hard + +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 + languageName: node + linkType: hard + +"lowercase-keys@npm:^3.0.0": + version: 3.0.0 + resolution: "lowercase-keys@npm:3.0.0" + checksum: 10c0/ef62b9fa5690ab0a6e4ef40c94efce68e3ed124f583cc3be38b26ff871da0178a28b9a84ce0c209653bb25ca135520ab87fea7cd411a54ac4899cb2f30501430 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"lru-cache@npm:^7.4.4, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 10c0/36128e4de34791838abe979b19927c26e67201ca5acf00880377af7d765b38d1c60847e01c5ec61b1a260c48029084ab3893a3925fd6e48a04011364b089991b + languageName: node + linkType: hard + +"magic-string@npm:^0.27.0": + version: 0.27.0 + resolution: "magic-string@npm:0.27.0" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.13" + checksum: 10c0/cddacfea14441ca57ae8a307bc3cf90bac69efaa4138dd9a80804cffc2759bf06f32da3a293fb13eaa96334b7d45b7768a34f1d226afae25d2f05b05a3bb37d8 + languageName: node + linkType: hard + +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.5": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + languageName: node + linkType: hard + +"magicast@npm:^0.3.3": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" + source-map-js: "npm:^1.2.0" + checksum: 10c0/a6cacc0a848af84f03e3f5bda7b0de75e4d0aa9ddce5517fd23ed0f31b5ddd51b2d0ff0b7e09b51f7de0f4053c7a1107117edda6b0732dca3e9e39e6c5a68c64 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^10.0.3, make-fetch-happen@npm:^10.0.6, make-fetch-happen@npm:^10.2.0": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: "npm:^4.2.1" + cacache: "npm:^16.1.0" + http-cache-semantics: "npm:^4.1.0" + http-proxy-agent: "npm:^5.0.0" + https-proxy-agent: "npm:^5.0.0" + is-lambda: "npm:^1.0.1" + lru-cache: "npm:^7.7.1" + minipass: "npm:^3.1.6" + minipass-collect: "npm:^1.0.2" + minipass-fetch: "npm:^2.0.3" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + socks-proxy-agent: "npm:^7.0.0" + ssri: "npm:^9.0.0" + checksum: 10c0/28ec392f63ab93511f400839dcee83107eeecfaad737d1e8487ea08b4332cd89a8f3319584222edd9f6f1d0833cf516691469496d46491863f9e88c658013949 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 10c0/ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: 10c0/1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b + languageName: node + linkType: hard + +"map-or-similar@npm:^1.5.0": + version: 1.5.0 + resolution: "map-or-similar@npm:1.5.0" + checksum: 10c0/33c6ccfdc272992e33e4e99a69541a3e7faed9de3ac5bc732feb2500a9ee71d3f9d098980a70b7746e7eeb7f859ff7dfb8aa9b5ecc4e34170a32ab78cfb18def + languageName: node + linkType: hard + +"marked-terminal@npm:^5.0.0": + version: 5.2.0 + resolution: "marked-terminal@npm:5.2.0" + dependencies: + ansi-escapes: "npm:^6.2.0" + cardinal: "npm:^2.1.1" + chalk: "npm:^5.2.0" + cli-table3: "npm:^0.6.3" + node-emoji: "npm:^1.11.0" + supports-hyperlinks: "npm:^2.3.0" + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: 10c0/3f10966cf5c7973453442cf2cf8a5479c68c266723af0de9aa6f0687d40dd30b2820de002bb2c737274223c338ef5fcf1215c7f71092ffa35f448f105713b267 + languageName: node + linkType: hard + +"marked@npm:^4.0.10": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 10c0/0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"memoizerific@npm:^1.11.3": + version: 1.11.3 + resolution: "memoizerific@npm:1.11.3" + dependencies: + map-or-similar: "npm:^1.5.0" + checksum: 10c0/661bf69b7afbfad57f0208f0c63324f4c96087b480708115b78ee3f0237d86c7f91347f6db31528740b2776c2e34c709bcb034e1e910edee2270c9603a0a469e + languageName: node + linkType: hard + +"meow@npm:^12.0.1": + version: 12.1.1 + resolution: "meow@npm:12.1.1" + checksum: 10c0/a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 + languageName: node + linkType: hard + +"meow@npm:^8.0.0": + version: 8.1.2 + resolution: "meow@npm:8.1.2" + dependencies: + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: 10c0/9a8d90e616f783650728a90f4ea1e5f763c1c5260369e6596b52430f877f4af8ecbaa8c9d952c93bbefd6d5bda4caed6a96a20ba7d27b511d2971909b01922a2 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime@npm:^3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: 10c0/402e792a8df1b2cc41cb77f0dcc46472b7944b7ec29cb5bbcd398624b6b97096728f1239766d3fdeb20551dd8d94738344c195a6ea10c4f906eb0356323b0531 + languageName: node + linkType: hard + +"mimic-fn@npm:^1.0.0": + version: 1.2.0 + resolution: "mimic-fn@npm:1.2.0" + checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"mimic-response@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-response@npm:4.0.0" + checksum: 10c0/761d788d2668ae9292c489605ffd4fad220f442fbae6832adce5ebad086d691e906a6d5240c290293c7a11e99fbdbbef04abbbed498bf8699a4ee0f31315e3fb + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" + checksum: 10c0/7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^3.1.6" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/33ab2c5bdb3d91b9cb8bc6ae42d7418f4f00f7f7beae14b3bb21ea18f9224e792f560a6e17b6f1be12bbeb70dbe99a269f4204c60e5d99130a0777b153505c43 + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-json-stream@npm:^1.0.1": + version: 1.0.2 + resolution: "minipass-json-stream@npm:1.0.2" + dependencies: + jsonparse: "npm:^1.3.1" + minipass: "npm:^3.0.0" + checksum: 10c0/c2fc0d9719dd445d08de82bb449b51c59c3609a08064dd270da8bc76e4e542f4f354b5b1ef3b6e2f2f5b621b25e21ffbd0f0fa26ba6a80121fc19c3ad0d4db2c + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1": + version: 3.0.2 + resolution: "minizlib@npm:3.0.2" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/9f3bd35e41d40d02469cb30470c55ccc21cae0db40e08d1d0b1dff01cc8cc89a6f78e9c5d2b7c844e485ec0a8abc2238111213fdc5b2038e6d1012eacf316f78 + languageName: node + linkType: hard + +"mkdirp-infer-owner@npm:^2.0.0": + version: 2.0.0 + resolution: "mkdirp-infer-owner@npm:2.0.0" + dependencies: + chownr: "npm:^2.0.0" + infer-owner: "npm:^1.0.4" + mkdirp: "npm:^1.0.3" + checksum: 10c0/548356a586b92a16fc90eb62b953e5a23d594b56084ecdf72446f4164bbaa6a3bacd8c140672ad24f10c5f561e16c35ac3d97a5ab422832c5ed5449c72501a03 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + +"mlly@npm:^1.7.3, mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^2.0.1" + pkg-types: "npm:^1.3.0" + ufo: "npm:^1.5.4" + checksum: 10c0/69e738218a13d6365caf930e0ab4e2b848b84eec261597df9788cefb9930f3e40667be9cb58a4718834ba5f97a6efeef31d3b5a95f4388143fd4e0d0deff72ff + languageName: node + linkType: hard + +"modify-values@npm:^1.0.0": + version: 1.0.1 + resolution: "modify-values@npm:1.0.1" + checksum: 10c0/6acb1b82aaf7a02f9f7b554b20cbfc159f223a79c66b0a257511c5933d50b85e12ea1220b0a90a2af6f80bc29ff784f929a52a51881867a93ae6a12ce87a729a + languageName: node + linkType: hard + +"moo-color@npm:^1.0.2": + version: 1.0.3 + resolution: "moo-color@npm:1.0.3" + dependencies: + color-name: "npm:^1.1.4" + checksum: 10c0/778c82f67f638c03a1d0fa78dcd6ea376a9f17b5e78e349c7e34a290b496dbdb43fd0b1c38070e2062d5e784bcf08e57f499015fcbcf52b3a1887d7825ebb80d + languageName: node + linkType: hard + +"motion-dom@npm:^11.18.1": + version: 11.18.1 + resolution: "motion-dom@npm:11.18.1" + dependencies: + motion-utils: "npm:^11.18.1" + checksum: 10c0/98378bdf9d77870829cdf3624c5eff02e48cfa820dfc74450364d7421884700048d60e277bfbf477df33270fbae4c1980e5914586f5b6dff28d4921fdca8ac47 + languageName: node + linkType: hard + +"motion-utils@npm:^11.18.1": + version: 11.18.1 + resolution: "motion-utils@npm:11.18.1" + checksum: 10c0/dac083bdeb6e433a277ac4362211b0fdce59ff09d6f7897f0f49d1e3561209c6481f676876daf99a33485054bc7e4b1d1b8d1de16f7b1e5c6f117fe76358ca00 + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.2, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"msw@npm:^2.1.7": + version: 2.7.3 + resolution: "msw@npm:2.7.3" + dependencies: + "@bundled-es-modules/cookie": "npm:^2.0.1" + "@bundled-es-modules/statuses": "npm:^1.0.1" + "@bundled-es-modules/tough-cookie": "npm:^0.1.6" + "@inquirer/confirm": "npm:^5.0.0" + "@mswjs/interceptors": "npm:^0.37.0" + "@open-draft/deferred-promise": "npm:^2.2.0" + "@open-draft/until": "npm:^2.1.0" + "@types/cookie": "npm:^0.6.0" + "@types/statuses": "npm:^2.0.4" + graphql: "npm:^16.8.1" + headers-polyfill: "npm:^4.0.2" + is-node-process: "npm:^1.2.0" + outvariant: "npm:^1.4.3" + path-to-regexp: "npm:^6.3.0" + picocolors: "npm:^1.1.1" + strict-event-emitter: "npm:^0.5.1" + type-fest: "npm:^4.26.1" + yargs: "npm:^17.7.2" + peerDependencies: + typescript: ">= 4.8.x" + peerDependenciesMeta: + typescript: + optional: true + bin: + msw: cli/index.js + checksum: 10c0/47cad1c4b4615b312477c8977fddfda3e90becd8efc2d81d73be8fb860e45ad0d3f7bca6d4f70ae7ed21894e93975bda66d609aafc3a1c99cb923c5ef67f8686 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.7": + version: 0.0.7 + resolution: "mute-stream@npm:0.0.7" + checksum: 10c0/c687cfe99289166fe17dcbd0cf49612c5d267410a7819b654a82df45016967d7b2b0b18b35410edef86de6bb089a00413557dc0182c5e78a4af50ba5d61edb42 + languageName: node + linkType: hard + +"mute-stream@npm:0.0.8, mute-stream@npm:~0.0.4": + version: 0.0.8 + resolution: "mute-stream@npm:0.0.8" + checksum: 10c0/18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 + languageName: node + linkType: hard + +"mute-stream@npm:1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c + languageName: node + linkType: hard + +"mute-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "mute-stream@npm:2.0.0" + checksum: 10c0/2cf48a2087175c60c8dcdbc619908b49c07f7adcfc37d29236b0c5c612d6204f789104c98cc44d38acab7b3c96f4a3ec2cfdc4934d0738d876dbefa2a12c69f4 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.8": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"nerf-dart@npm:^1.0.0": + version: 1.0.0 + resolution: "nerf-dart@npm:1.0.0" + checksum: 10c0/e19e17d7bd91dfcb1acd07cbdd8df1f0613f3408227538fe91793c6dfcf58e95b5f18b88b4a13e9b31587e89a119fd76d6df4b8d8c65564dd2c409d787819583 + languageName: node + linkType: hard + +"new-github-release-url@npm:^2.0.0": + version: 2.0.0 + resolution: "new-github-release-url@npm:2.0.0" + dependencies: + type-fest: "npm:^2.5.1" + checksum: 10c0/9faec009b8b403efbc407f45306d07de5cc58e09df5b00bdd55b01384cd18b0fd29a97aef6915428ba3b5abb0a5c132c3507468c0c3c101e8d737c1337386786 + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f + languageName: node + linkType: hard + +"node-emoji@npm:^1.11.0": + version: 1.11.0 + resolution: "node-emoji@npm:1.11.0" + dependencies: + lodash: "npm:^4.17.21" + checksum: 10c0/5dac6502dbef087092d041fcc2686d8be61168593b3a9baf964d62652f55a3a9c2277f171b81cccb851ccef33f2d070f45e633fab1fda3264f8e1ae9041c673f + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 + languageName: node + linkType: hard + +"node-gyp@npm:^9.0.0, node-gyp@npm:^9.1.0": + version: 9.4.1 + resolution: "node-gyp@npm:9.4.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^7.1.4" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^10.0.3" + nopt: "npm:^6.0.0" + npmlog: "npm:^6.0.0" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^2.0.2" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/f7d676cfa79f27d35edf17fe9c80064123670362352d19729e5dc9393d7e99f1397491c3107eddc0c0e8941442a6244a7ba6c860cfbe4b433b4cae248a55fe10 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.2.0 + resolution: "node-gyp@npm:11.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + tinyglobby: "npm:^0.2.12" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: "npm:^1.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/837b52c330df16fcaad816b1f54fec6b2854ab1aa771d935c1603fbcf9b023bb073f1466b1b67f48ea4dce127ae675b85b9d9355700e9b109de39db490919786 + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: 10c0/e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be + languageName: node + linkType: hard + +"normalize-package-data@npm:^4.0.0": + version: 4.0.1 + resolution: "normalize-package-data@npm:4.0.1" + dependencies: + hosted-git-info: "npm:^5.0.0" + is-core-module: "npm:^2.8.1" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/3a6ace810d1bd2fd23b98fa53790a28bbfade5380eea0f2e0cc5cbc24987db43a4780846942edee7069fa9574bf050a9ed8d35faf9079e5e4d9a737d07a136dd + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"normalize-url@npm:^6.0.0, normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 + languageName: node + linkType: hard + +"normalize-url@npm:^8.0.0": + version: 8.0.1 + resolution: "normalize-url@npm:8.0.1" + checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef + languageName: node + linkType: hard + +"np@npm:^8.0.4": + version: 8.0.4 + resolution: "np@npm:8.0.4" + dependencies: + chalk: "npm:^5.2.0" + cosmiconfig: "npm:^8.1.3" + del: "npm:^7.0.0" + escape-goat: "npm:^4.0.0" + escape-string-regexp: "npm:^5.0.0" + execa: "npm:^7.1.1" + exit-hook: "npm:^3.2.0" + github-url-from-git: "npm:^1.5.0" + has-yarn: "npm:^3.0.0" + hosted-git-info: "npm:^6.1.1" + ignore-walk: "npm:^6.0.3" + import-local: "npm:^3.1.0" + inquirer: "npm:^9.2.6" + is-installed-globally: "npm:^0.4.0" + is-interactive: "npm:^2.0.0" + is-scoped: "npm:^3.0.0" + issue-regex: "npm:^4.1.0" + listr: "npm:^0.14.3" + listr-input: "npm:^0.2.1" + log-symbols: "npm:^5.1.0" + meow: "npm:^12.0.1" + new-github-release-url: "npm:^2.0.0" + npm-name: "npm:^7.1.0" + onetime: "npm:^6.0.0" + open: "npm:^9.1.0" + ow: "npm:^1.1.1" + p-memoize: "npm:^7.1.1" + p-timeout: "npm:^6.1.1" + path-exists: "npm:^5.0.0" + pkg-dir: "npm:^7.0.0" + read-pkg-up: "npm:^9.1.0" + rxjs: "npm:^7.8.1" + semver: "npm:^7.5.1" + symbol-observable: "npm:^4.0.0" + terminal-link: "npm:^3.0.0" + update-notifier: "npm:^6.0.2" + bin: + np: source/cli.js + checksum: 10c0/a0c55b931177f68d7735e3c679f91519fb46cca211f8c217160d2efc999925f20917ae149235c9124f12be7fda44526411880850625ba1dc7853aa5c9a7bceb5 + languageName: node + linkType: hard + +"npm-audit-report@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-audit-report@npm:3.0.0" + dependencies: + chalk: "npm:^4.0.0" + checksum: 10c0/a8ce2ce80cc11334d58fef28f0b8eef1626f134942d27212dbac8c2dfbfe10373d2978101ceb2b472b8199170bb1c6986f32d33d9879f05d28a32ec56d743915 + languageName: node + linkType: hard + +"npm-bundled@npm:^1.1.1": + version: 1.1.2 + resolution: "npm-bundled@npm:1.1.2" + dependencies: + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/3f2337789afc8cb608a0dd71cefe459531053d48a5497db14b07b985c4cab15afcae88600db9f92eae072c89b982eeeec8e4463e1d77bc03a7e90f5dacf29769 + languageName: node + linkType: hard + +"npm-bundled@npm:^2.0.0": + version: 2.0.1 + resolution: "npm-bundled@npm:2.0.1" + dependencies: + npm-normalize-package-bin: "npm:^2.0.0" + checksum: 10c0/5b2dc1de455d38200e49c6205dee185ce919ea6b608672c693bec8907116bc5686dabcc150347630d351c1c533315fd60a1910ce00bdad6bb204cef016b90b7d + languageName: node + linkType: hard + +"npm-install-checks@npm:^5.0.0": + version: 5.0.0 + resolution: "npm-install-checks@npm:5.0.0" + dependencies: + semver: "npm:^7.1.1" + checksum: 10c0/eb108e1c1ac38c76f9a658ab2b4871836246e262836c05d42a23049e0399e6c8cdcf65a1e50193b64807a3b2b86f8e158d0161db98e846d7e9617bc5f49337af + languageName: node + linkType: hard + +"npm-name@npm:^7.1.0": + version: 7.1.1 + resolution: "npm-name@npm:7.1.1" + dependencies: + got: "npm:^11.8.5" + is-name-taken: "npm:^2.0.0" + is-scoped: "npm:^3.0.0" + is-url-superb: "npm:^6.1.0" + lodash.zip: "npm:^4.2.0" + org-regex: "npm:^1.0.0" + p-map: "npm:^5.5.0" + registry-auth-token: "npm:^4.2.2" + registry-url: "npm:^6.0.1" + validate-npm-package-name: "npm:^3.0.0" + checksum: 10c0/601b9a3704461b0f263f3e1d9aa69958930709b99fce21c2b75259a116e3b7ad9d42f9fe2dd32236fa8de7e92a3a5089598311b1dee9a5849db663da0678f873 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-normalize-package-bin@npm:1.0.1" + checksum: 10c0/b0c8c05fe419a122e0ff970ccbe7874ae24b4b4b08941a24d18097fe6e1f4b93e3f6abfb5512f9c5488827a5592f2fb3ce2431c41d338802aed24b9a0c160551 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^2.0.0": + version: 2.0.0 + resolution: "npm-normalize-package-bin@npm:2.0.0" + checksum: 10c0/9b5283a2e423124c60fbc14244d36686b59e517d29156eacf9df8d3dc5d5bf4d9444b7669c607567ed2e089bbdbef5a2b3678cbf567284eeff3612da6939514b + languageName: node + linkType: hard + +"npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1, npm-package-arg@npm:^9.1.0": + version: 9.1.2 + resolution: "npm-package-arg@npm:9.1.2" + dependencies: + hosted-git-info: "npm:^5.0.0" + proc-log: "npm:^2.0.1" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^4.0.0" + checksum: 10c0/e81aa931adfc5f19fb9f10fe9eb120a0203d63b879594b1a473c64257761cdde42e32fb5d9b2e90d6944a3229e8c3ffa62ce8c31a7c9c4971d34f9219fdc0bb5 + languageName: node + linkType: hard + +"npm-packlist@npm:^5.1.0": + version: 5.1.3 + resolution: "npm-packlist@npm:5.1.3" + dependencies: + glob: "npm:^8.0.1" + ignore-walk: "npm:^5.0.1" + npm-bundled: "npm:^2.0.0" + npm-normalize-package-bin: "npm:^2.0.0" + bin: + npm-packlist: bin/index.js + checksum: 10c0/a8bea97661b2a7132bc8832d5560da24f823ee5324429bd16eb82b7873557de14641bc3fed8a7611b0d88b9771e59e99e01a9e551a53adb164327ded6128aada + languageName: node + linkType: hard + +"npm-pick-manifest@npm:^7.0.0, npm-pick-manifest@npm:^7.0.2": + version: 7.0.2 + resolution: "npm-pick-manifest@npm:7.0.2" + dependencies: + npm-install-checks: "npm:^5.0.0" + npm-normalize-package-bin: "npm:^2.0.0" + npm-package-arg: "npm:^9.0.0" + semver: "npm:^7.3.5" + checksum: 10c0/522ba83a9ec92405b720a135b4333bc237063994f1244ff8125fd906979feedff3775472caa87779a260294ff4d2cd949c6f679ab353b2d81bca76c466539b67 + languageName: node + linkType: hard + +"npm-profile@npm:^6.2.0": + version: 6.2.1 + resolution: "npm-profile@npm:6.2.1" + dependencies: + npm-registry-fetch: "npm:^13.0.1" + proc-log: "npm:^2.0.0" + checksum: 10c0/1397ce26905a4ca1a2ea4080acbceeddc93fcac753295b8cc7738e38b8e0018d59219c6cb7c5a059d870b3e94bd6bac6aea628dd971dbe47e0ec2d82f7e0a031 + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^13.0.0, npm-registry-fetch@npm:^13.0.1, npm-registry-fetch@npm:^13.3.1": + version: 13.3.1 + resolution: "npm-registry-fetch@npm:13.3.1" + dependencies: + make-fetch-happen: "npm:^10.0.6" + minipass: "npm:^3.1.6" + minipass-fetch: "npm:^2.0.3" + minipass-json-stream: "npm:^1.0.1" + minizlib: "npm:^2.1.2" + npm-package-arg: "npm:^9.0.1" + proc-log: "npm:^2.0.0" + checksum: 10c0/86c8cdc2b0d2aa97d06031962f39442b0eacecd9989eebc88451e6b53b3c8572b89fb09cf0042ce6080e7d120353af359a75c5f60b085b5b455337d1e39e57ab + languageName: node + linkType: hard + +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: "npm:^2.0.0" + checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de + languageName: node + linkType: hard + +"npm-run-path@npm:^3.0.0": + version: 3.1.0 + resolution: "npm-run-path@npm:3.1.0" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/8399f01239e9a5bf5a10bddbc71ecac97e0b7890e5b78abe9731fc759db48865b0686cc86ec079cd254a98ba119a3fa08f1b23f9de1a5428c19007bbc7b5a728 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"npm-run-path@npm:^5.1.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba + languageName: node + linkType: hard + +"npm-user-validate@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-user-validate@npm:1.0.1" + checksum: 10c0/b6533da7df07c4495e8e209eba7191846683443503897e10e0acfb52fedefde34028f221b7ee5ae45b79ada13748a8e881a20392cd0fb93d190b1bf54ef1ee42 + languageName: node + linkType: hard + +"npm@npm:^8.3.0": + version: 8.19.4 + resolution: "npm@npm:8.19.4" + dependencies: + "@isaacs/string-locale-compare": "npm:^1.1.0" + "@npmcli/arborist": "npm:^5.6.3" + "@npmcli/ci-detect": "npm:^2.0.0" + "@npmcli/config": "npm:^4.2.1" + "@npmcli/fs": "npm:^2.1.0" + "@npmcli/map-workspaces": "npm:^2.0.3" + "@npmcli/package-json": "npm:^2.0.0" + "@npmcli/run-script": "npm:^4.2.1" + abbrev: "npm:~1.1.1" + archy: "npm:~1.0.0" + cacache: "npm:^16.1.3" + chalk: "npm:^4.1.2" + chownr: "npm:^2.0.0" + cli-columns: "npm:^4.0.0" + cli-table3: "npm:^0.6.2" + columnify: "npm:^1.6.0" + fastest-levenshtein: "npm:^1.0.12" + fs-minipass: "npm:^2.1.0" + glob: "npm:^8.0.1" + graceful-fs: "npm:^4.2.10" + hosted-git-info: "npm:^5.2.1" + ini: "npm:^3.0.1" + init-package-json: "npm:^3.0.2" + is-cidr: "npm:^4.0.2" + json-parse-even-better-errors: "npm:^2.3.1" + libnpmaccess: "npm:^6.0.4" + libnpmdiff: "npm:^4.0.5" + libnpmexec: "npm:^4.0.14" + libnpmfund: "npm:^3.0.5" + libnpmhook: "npm:^8.0.4" + libnpmorg: "npm:^4.0.4" + libnpmpack: "npm:^4.1.3" + libnpmpublish: "npm:^6.0.5" + libnpmsearch: "npm:^5.0.4" + libnpmteam: "npm:^4.0.4" + libnpmversion: "npm:^3.0.7" + make-fetch-happen: "npm:^10.2.0" + minimatch: "npm:^5.1.0" + minipass: "npm:^3.1.6" + minipass-pipeline: "npm:^1.2.4" + mkdirp: "npm:^1.0.4" + mkdirp-infer-owner: "npm:^2.0.0" + ms: "npm:^2.1.2" + node-gyp: "npm:^9.1.0" + nopt: "npm:^6.0.0" + npm-audit-report: "npm:^3.0.0" + npm-install-checks: "npm:^5.0.0" + npm-package-arg: "npm:^9.1.0" + npm-pick-manifest: "npm:^7.0.2" + npm-profile: "npm:^6.2.0" + npm-registry-fetch: "npm:^13.3.1" + npm-user-validate: "npm:^1.0.1" + npmlog: "npm:^6.0.2" + opener: "npm:^1.5.2" + p-map: "npm:^4.0.0" + pacote: "npm:^13.6.2" + parse-conflict-json: "npm:^2.0.2" + proc-log: "npm:^2.0.1" + qrcode-terminal: "npm:^0.12.0" + read: "npm:~1.0.7" + read-package-json: "npm:^5.0.2" + read-package-json-fast: "npm:^2.0.3" + readdir-scoped-modules: "npm:^1.1.0" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.7" + ssri: "npm:^9.0.1" + tar: "npm:^6.1.11" + text-table: "npm:~0.2.0" + tiny-relative-date: "npm:^1.3.0" + treeverse: "npm:^2.0.0" + validate-npm-package-name: "npm:^4.0.0" + which: "npm:^2.0.2" + write-file-atomic: "npm:^4.0.1" + bin: + npm: bin/npm-cli.js + npx: bin/npx-cli.js + checksum: 10c0/a27e0d108f6281b66fcad8daf6501dac62791285b974eba283275e65be1ababa8222b4e33fd95fddbd7236481e694141018f6715dac4831bcae3a54add092080 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0, npmlog@npm:^6.0.2": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: "npm:^3.0.0" + console-control-strings: "npm:^1.1.0" + gauge: "npm:^4.0.3" + set-blocking: "npm:^2.0.0" + checksum: 10c0/0cacedfbc2f6139c746d9cd4a85f62718435ad0ca4a2d6459cd331dd33ae58206e91a0742c1558634efcde3f33f8e8e7fd3adf1bfe7978310cf00bd55cccf890 + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 10c0/cb97149006acc5cd512c13c1838223abdf202e76ddfa059c5e8e7507aff2c3a78cd19057516885a2f6f5b576543dc4f7b6f3c997cc7df53ae26c260855466df5 + languageName: node + linkType: hard + +"nwsapi@npm:^2.2.12": + version: 2.2.20 + resolution: "nwsapi@npm:2.2.20" + checksum: 10c0/07f4dafa3186aef7c007863e90acd4342a34ba9d44b22f14f644fdb311f6086887e21c2fc15efaa826c2bc39ab2bc841364a1a630e7c87e0cb723ba59d729297 + languageName: node + linkType: hard + +"object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"object-is@npm:^1.1.5": + version: 1.1.6 + resolution: "object-is@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + checksum: 10c0/506af444c4dce7f8e31f34fc549e2fb8152d6b9c4a30c6e62852badd7f520b579c679af433e7a072f9d78eb7808d230dc12e1cf58da9154dfbf8813099ea0fe0 + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" + object-keys: "npm:^1.1.1" + checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc + languageName: node + linkType: hard + +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db + languageName: node + linkType: hard + +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.2" + checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c + languageName: node + linkType: hard + +"object.values@npm:^1.1.6, object.values@npm:^1.2.0, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^2.0.0": + version: 2.0.1 + resolution: "onetime@npm:2.0.1" + dependencies: + mimic-fn: "npm:^1.0.0" + checksum: 10c0/b4e44a8c34e70e02251bfb578a6e26d6de6eedbed106cd78211d2fd64d28b6281d54924696554e4e966559644243753ac5df73c87f283b0927533d3315696215 + languageName: node + linkType: hard + +"onetime@npm:^5.1.0, onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: "npm:^4.0.0" + checksum: 10c0/4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c + languageName: node + linkType: hard + +"open@npm:^7.4.2": + version: 7.4.2 + resolution: "open@npm:7.4.2" + dependencies: + is-docker: "npm:^2.0.0" + is-wsl: "npm:^2.1.1" + checksum: 10c0/77573a6a68f7364f3a19a4c80492712720746b63680ee304555112605ead196afe91052bd3c3d165efdf4e9d04d255e87de0d0a77acec11ef47fd5261251813f + languageName: node + linkType: hard + +"open@npm:^8.0.4": + version: 8.4.2 + resolution: "open@npm:8.4.2" + dependencies: + define-lazy-prop: "npm:^2.0.0" + is-docker: "npm:^2.1.1" + is-wsl: "npm:^2.2.0" + checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 + languageName: node + linkType: hard + +"open@npm:^9.1.0": + version: 9.1.0 + resolution: "open@npm:9.1.0" + dependencies: + default-browser: "npm:^4.0.0" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^2.2.0" + checksum: 10c0/8073ec0dd8994a7a7d9bac208bd17d093993a65ce10f2eb9b62b6d3a91c9366ae903938a237c275493c130171d339f6dcbdd2a2de7e32953452c0867b97825af + languageName: node + linkType: hard + +"opencollective-postinstall@npm:^2.0.2": + version: 2.0.3 + resolution: "opencollective-postinstall@npm:2.0.3" + bin: + opencollective-postinstall: index.js + checksum: 10c0/8a0104a218bc1afaae943f0af378461eeb2836f9848bad872bbd067ec5d1d9791636f307454ab77d0746f10341366f295384656a340ebdb87a2585058e8567e5 + languageName: node + linkType: hard + +"opener@npm:^1.5.2": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 10c0/dd56256ab0cf796585617bc28e06e058adf09211781e70b264c76a1dbe16e90f868c974e5bf5309c93469157c7d14b89c35dc53fe7293b0e40b4d2f92073bc79 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"ora@npm:^5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"org-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "org-regex@npm:1.0.0" + checksum: 10c0/70cd09689fc4a977fd80bc103eac5da8fb5a20899e9c2bf0f05595caf14d56e246477c3ca12aea14b1ac6766ce89efb9b11e6e13a0135722f473b5ce1533ad8c + languageName: node + linkType: hard + +"os-tmpdir@npm:~1.0.2": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"outvariant@npm:^1.4.0, outvariant@npm:^1.4.3": + version: 1.4.3 + resolution: "outvariant@npm:1.4.3" + checksum: 10c0/5976ca7740349cb8c71bd3382e2a762b1aeca6f33dc984d9d896acdf3c61f78c3afcf1bfe9cc633a7b3c4b295ec94d292048f83ea2b2594fae4496656eba992c + languageName: node + linkType: hard + +"ow@npm:^1.1.1": + version: 1.1.1 + resolution: "ow@npm:1.1.1" + dependencies: + "@sindresorhus/is": "npm:^5.3.0" + callsites: "npm:^4.0.0" + dot-prop: "npm:^7.2.0" + lodash.isequal: "npm:^4.5.0" + vali-date: "npm:^1.0.0" + checksum: 10c0/3973f9d6245f2e468a0f1d614ece96f1289632f7425094e8b266b50ddbe79471f2e6cba447b80e90b54bbeb13c20e83671edfb5ef4c0b13c15546ba0710554e1 + languageName: node + linkType: hard + +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: "npm:^1.2.6" + object-keys: "npm:^1.1.1" + safe-push-apply: "npm:^1.0.0" + checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a + languageName: node + linkType: hard + +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 + languageName: node + linkType: hard + +"p-cancelable@npm:^3.0.0": + version: 3.0.0 + resolution: "p-cancelable@npm:3.0.0" + checksum: 10c0/948fd4f8e87b956d9afc2c6c7392de9113dac817cb1cecf4143f7a3d4c57ab5673614a80be3aba91ceec5e4b69fd8c869852d7e8048bc3d9273c4c36ce14b9aa + languageName: node + linkType: hard + +"p-each-series@npm:^2.1.0": + version: 2.2.0 + resolution: "p-each-series@npm:2.2.0" + checksum: 10c0/32a7cce1312bf70f99079db2ff070fc3ee2ed6efe0fa0444616fa38f79730ad09b461d009127d25254c4c865c40b6664e2c656b1a7b2c4781756d9173c974269 + languageName: node + linkType: hard + +"p-filter@npm:^2.0.0": + version: 2.1.0 + resolution: "p-filter@npm:2.1.0" + dependencies: + p-map: "npm:^2.0.0" + checksum: 10c0/5ac34b74b3b691c04212d5dd2319ed484f591c557a850a3ffc93a08cb38c4f5540be059c6b10a185773c479ca583a91ea00c7d6c9958c815e6b74d052f356645 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 + languageName: node + linkType: hard + +"p-finally@npm:^2.0.0": + version: 2.0.1 + resolution: "p-finally@npm:2.0.1" + checksum: 10c0/a4ee34179f5e0eb5417462ca5afbca4b6b537b051ea87c8ec7649ffb2b60a8e82a06441792fe496ab0d0156c4060a3dfd707973915a1b8369b00f2531e3eab94 + languageName: node + linkType: hard + +"p-is-promise@npm:^3.0.0": + version: 3.0.0 + resolution: "p-is-promise@npm:3.0.0" + checksum: 10c0/17a52c7a59a31a435a4721a7110faeccb7cc9179cf9cd00016b7a9a7156e2c2ed9d8e2efc0142acab74d5064fbb443eaeaf67517cf3668f2a7c93a7effad5bb9 + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: "npm:^1.0.0" + checksum: 10c0/5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"p-limit@npm:^5.0.0": + version: 5.0.0 + resolution: "p-limit@npm:5.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: 10c0/574e93b8895a26e8485eb1df7c4b58a1a6e8d8ae41b1750cc2cc440922b3d306044fc6e9a7f74578a883d46802d9db72b30f2e612690fcef838c173261b1ed83 + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: "npm:^1.1.0" + checksum: 10c0/82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + +"p-lock@npm:^2.0.0": + version: 2.1.0 + resolution: "p-lock@npm:2.1.0" + checksum: 10c0/d976667b3b0325c6992b7c83956061adfd56d9e14c5dd352380bffe8b94cc9a91a8a39d1644dcd77e058d3938630767bf2e42e32135e38588ea980580479cda6 + languageName: node + linkType: hard + +"p-map@npm:^2.0.0": + version: 2.1.0 + resolution: "p-map@npm:2.1.0" + checksum: 10c0/735dae87badd4737a2dd582b6d8f93e49a1b79eabbc9815a4d63a528d5e3523e978e127a21d784cccb637010e32103a40d2aaa3ab23ae60250b1a820ca752043 + languageName: node + linkType: hard + +"p-map@npm:^3.0.0": + version: 3.0.0 + resolution: "p-map@npm:3.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/297930737e52412ad9f5787c52774ad6496fad9a8be5f047e75fd0a3dc61930d8f7a9b2bbe1c4d1404e54324228a4f69721da2538208dadaa4ef4c81773c9f20 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^5.5.0": + version: 5.5.0 + resolution: "p-map@npm:5.5.0" + dependencies: + aggregate-error: "npm:^4.0.0" + checksum: 10c0/410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"p-memoize@npm:^7.1.1": + version: 7.1.1 + resolution: "p-memoize@npm:7.1.1" + dependencies: + mimic-fn: "npm:^4.0.0" + type-fest: "npm:^3.0.0" + checksum: 10c0/6adbdf0ac0e53d80ac3a2ff01fb39ae2053976295d15e3e614ff9e981eca9d4f8c28cf54e857c791cee48abd5c37849e9eca7deab18be1e4f064d5753e3d87b8 + languageName: node + linkType: hard + +"p-reduce@npm:^2.0.0": + version: 2.1.0 + resolution: "p-reduce@npm:2.1.0" + checksum: 10c0/27b8ff0fb044995507a06cd6357dffba0f2b98862864745972562a21885d7906ce5c794036d2aaa63ef6303158e41e19aed9f19651dfdafb38548ecec7d0de15 + languageName: node + linkType: hard + +"p-timeout@npm:^6.1.1": + version: 6.1.4 + resolution: "p-timeout@npm:6.1.4" + checksum: 10c0/019edad1c649ab07552aa456e40ce7575c4b8ae863191477f02ac8d283ac8c66cedef0ca93422735130477a051dfe952ba717641673fd3599befdd13f63bcc33 + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 10c0/757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"package-json@npm:^8.1.0": + version: 8.1.1 + resolution: "package-json@npm:8.1.1" + dependencies: + got: "npm:^12.1.0" + registry-auth-token: "npm:^5.0.1" + registry-url: "npm:^6.0.0" + semver: "npm:^7.3.7" + checksum: 10c0/83b057878bca229033aefad4ef51569b484e63a65831ddf164dc31f0486817e17ffcb58c819c7af3ef3396042297096b3ffc04e107fd66f8f48756f6d2071c8f + languageName: node + linkType: hard + +"package-name-conflict@npm:^1.0.3": + version: 1.0.3 + resolution: "package-name-conflict@npm:1.0.3" + checksum: 10c0/d69e64e8db2829f5720b533ebba20d41c91ac21b1434525f139e9bf4fff9dcd644d02a78c0caf7d8d262328c461c1e91a81cd3712ca834272ef92b5cc59ca54f + languageName: node + linkType: hard + +"pacote@npm:^13.0.3, pacote@npm:^13.6.1, pacote@npm:^13.6.2": + version: 13.6.2 + resolution: "pacote@npm:13.6.2" + dependencies: + "@npmcli/git": "npm:^3.0.0" + "@npmcli/installed-package-contents": "npm:^1.0.7" + "@npmcli/promise-spawn": "npm:^3.0.0" + "@npmcli/run-script": "npm:^4.1.0" + cacache: "npm:^16.0.0" + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.1.0" + infer-owner: "npm:^1.0.4" + minipass: "npm:^3.1.6" + mkdirp: "npm:^1.0.4" + npm-package-arg: "npm:^9.0.0" + npm-packlist: "npm:^5.1.0" + npm-pick-manifest: "npm:^7.0.0" + npm-registry-fetch: "npm:^13.0.1" + proc-log: "npm:^2.0.0" + promise-retry: "npm:^2.0.1" + read-package-json: "npm:^5.0.0" + read-package-json-fast: "npm:^2.0.3" + rimraf: "npm:^3.0.2" + ssri: "npm:^9.0.0" + tar: "npm:^6.1.11" + bin: + pacote: lib/bin.js + checksum: 10c0/134d4ae5c3ab4a1745ee24de228796d7222320813d67d26016f6607319d6135d1b4fa2f4200d6d964be89749525b0daff893338237ac6284bb9b4a7a36770696 + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-conflict-json@npm:^2.0.1, parse-conflict-json@npm:^2.0.2": + version: 2.0.2 + resolution: "parse-conflict-json@npm:2.0.2" + dependencies: + json-parse-even-better-errors: "npm:^2.3.1" + just-diff: "npm:^5.0.1" + just-diff-apply: "npm:^5.2.0" + checksum: 10c0/7a6a116017cd2629d95eda0325d5928d950c69df412f2c14ca02c9581a606f258404a16a3b9a67a3294ca9e6e12571e65be4f80d3879b53c5b842fbae0495fd4 + languageName: node + linkType: hard + +"parse-json-object@npm:^1.0.5": + version: 1.1.0 + resolution: "parse-json-object@npm:1.1.0" + dependencies: + types-json: "npm:^1.0.6" + checksum: 10c0/76261b99d601de5290872210bd5f6f3616a09259de77853c8669de1822cadaadd4c48b631c6728e9eb14e2c6b9cff8704483e22bd895f8555a25e9b300861c31 + languageName: node + linkType: hard + +"parse-json-object@npm:^2.0.1": + version: 2.0.1 + resolution: "parse-json-object@npm:2.0.1" + dependencies: + types-json: "npm:^1.2.0" + checksum: 10c0/349b92cc27e3e9dcd788c287a3b8729898acbc5bdde71b2419f6375b5d1c4a756fb7d0ae17fae5cda15cb1e60693a7557a1ceb706fbc64118e0c2acf56b13f0e + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"parse5@npm:^7.1.2": + version: 7.2.1 + resolution: "parse5@npm:7.2.1" + dependencies: + entities: "npm:^4.5.0" + checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 + languageName: node + linkType: hard + +"patch-package@npm:^8.0.0": + version: 8.0.0 + resolution: "patch-package@npm:8.0.0" + dependencies: + "@yarnpkg/lockfile": "npm:^1.1.0" + chalk: "npm:^4.1.2" + ci-info: "npm:^3.7.0" + cross-spawn: "npm:^7.0.3" + find-yarn-workspace-root: "npm:^2.0.0" + fs-extra: "npm:^9.0.0" + json-stable-stringify: "npm:^1.0.2" + klaw-sync: "npm:^6.0.0" + minimist: "npm:^1.2.6" + open: "npm:^7.4.2" + rimraf: "npm:^2.6.3" + semver: "npm:^7.5.3" + slash: "npm:^2.0.0" + tmp: "npm:^0.0.33" + yaml: "npm:^2.2.2" + bin: + patch-package: index.js + checksum: 10c0/690eab0537e953a3fd7d32bb23f0e82f97cd448f8244c3227ed55933611a126f9476397325c06ad2c11d881a19b427a02bd1881bee78d89f1731373fc4fe0fee + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: 10c0/17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^2.0.0, path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-to-regexp@npm:^6.3.0": + version: 6.3.0 + resolution: "path-to-regexp@npm:6.3.0" + checksum: 10c0/73b67f4638b41cde56254e6354e46ae3a2ebc08279583f6af3d96fe4664fc75788f74ed0d18ca44fa4a98491b69434f9eee73b97bb5314bd1b5adb700f5c18d6 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"pathe@npm:^1.1.1": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 + languageName: node + linkType: hard + +"pathe@npm:^2.0.1": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" + bin: + pidtree: bin/pidtree.js + checksum: 10c0/0829ec4e9209e230f74ebf4265f5ccc9ebfb488334b525cb13f86ff801dca44b362c41252cd43ae4d7653a10a5c6ab3be39d2c79064d6895e0d78dc50a5ed6e9 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 + languageName: node + linkType: hard + +"pkg-conf@npm:^2.1.0": + version: 2.1.0 + resolution: "pkg-conf@npm:2.1.0" + dependencies: + find-up: "npm:^2.0.0" + load-json-file: "npm:^4.0.0" + checksum: 10c0/e1474a4f7714ee78204b4a7f2316dec9e59887762bdc126ebd0eb701bbde7c6a6da65c4dc9c2a7c1eaeee49914009bf4a4368f5d9894c596ddf812ff982fdb05 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: "npm:^6.3.0" + checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 + languageName: node + linkType: hard + +"pkg-types@npm:^1.2.1, pkg-types@npm:^1.3.0": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea + languageName: node + linkType: hard + +"please-upgrade-node@npm:^3.1.1, please-upgrade-node@npm:^3.2.0": + version: 3.2.0 + resolution: "please-upgrade-node@npm:3.2.0" + dependencies: + semver-compare: "npm:^1.0.0" + checksum: 10c0/222514d2841022be4b843f38d415beadcc6409c0545d6d153778d71c601bba7bbf1cd5827d650c7fae6a9a2ba7cf00f4b6729b40d015a3a5ba2937e57bc1c435 + languageName: node + linkType: hard + +"polished@npm:^4.2.2": + version: 4.3.1 + resolution: "polished@npm:4.3.1" + dependencies: + "@babel/runtime": "npm:^7.17.8" + checksum: 10c0/45480d4c7281a134281cef092f6ecc202a868475ff66a390fee6e9261386e16f3047b4de46a2f2e1cf7fb7aa8f52d30b4ed631a1e3bcd6f303ca31161d4f07fe + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.10": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + +"postcss@npm:^8.4.43": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" + dependencies: + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier@npm:^3.3.3, prettier@npm:^3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 + languageName: node + linkType: hard + +"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^17.0.1" + checksum: 10c0/0cbda1031aa30c659e10921fa94e0dd3f903ecbbbe7184a729ad66f2b6e7f17891e8c7d7654c458fa4ccb1a411ffb695b4f17bbcd3fe075fabe181027c4040ed + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^2.0.0, proc-log@npm:^2.0.1": + version: 2.0.1 + resolution: "proc-log@npm:2.0.1" + checksum: 10c0/701c501429775ce34cec28ef6a1c976537274b42917212fb8a5975ebcecb0a85612907fd7f99ff28ff4c2112bb84a0f4322fc9b9e1e52a8562fcbb1d5b3ce608 + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c + languageName: node + linkType: hard + +"promise-all-reject-late@npm:^1.0.0": + version: 1.0.1 + resolution: "promise-all-reject-late@npm:1.0.1" + checksum: 10c0/f1af0c7b0067e84d64751148ee5bb6c3e84f4a4d1316d6fe56261e1d2637cf71b49894bcbd2c6daf7d45afb1bc99efc3749be277c3e0518b70d0c5a29d037011 + languageName: node + linkType: hard + +"promise-call-limit@npm:^1.0.1": + version: 1.0.2 + resolution: "promise-call-limit@npm:1.0.2" + checksum: 10c0/500aed321d7b9212da403db369551d7190c96c8937c3b2d15c6097d1037b17fb802c7decfbc8ba6bb937f1cc1ea291e5eba10ed9ea76adc0f398ab9f7d174a58 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 10c0/d179d148d98fbff3d815752fa9a08a87d3190551d1420f17c4467f628214db12235ae068d98cd001f024453676d8985af8f28f002345646c4ece4600a79620bc + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"promzard@npm:^0.3.0": + version: 0.3.0 + resolution: "promzard@npm:0.3.0" + dependencies: + read: "npm:1" + checksum: 10c0/7fd8dbcd9764b35092da65867cc60fdcf2ea85d77e8ed1ae348ec0af1a22616f74053ccf8dad7d8de01e1e3aafe349d77ef56653c2db3791589ac2a8ef485149 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + +"proto-list@npm:~1.2.1": + version: 1.2.4 + resolution: "proto-list@npm:1.2.4" + checksum: 10c0/b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 + languageName: node + linkType: hard + +"psl@npm:^1.1.33": + version: 1.15.0 + resolution: "psl@npm:1.15.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"pupa@npm:^3.1.0": + version: 3.1.0 + resolution: "pupa@npm:3.1.0" + dependencies: + escape-goat: "npm:^4.0.0" + checksum: 10c0/02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c + languageName: node + linkType: hard + +"q@npm:^1.5.1": + version: 1.5.1 + resolution: "q@npm:1.5.1" + checksum: 10c0/7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 + languageName: node + linkType: hard + +"qrcode-terminal@npm:^0.12.0": + version: 0.12.0 + resolution: "qrcode-terminal@npm:0.12.0" + bin: + qrcode-terminal: ./bin/qrcode-terminal.js + checksum: 10c0/1d8996a743d6c95e22056bd45fe958c306213adc97d7ef8cf1e03bc1aeeb6f27180a747ec3d761141921351eb1e3ca688f7b673ab54cdae9fa358dffaa49563c + languageName: node + linkType: hard + +"query-string@npm:^6.9.0": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" + dependencies: + decode-uri-component: "npm:^0.2.0" + filter-obj: "npm:^1.1.0" + split-on-first: "npm:^1.0.0" + strict-uri-encode: "npm:^2.0.0" + checksum: 10c0/900e0fa788000e9dc5f929b6f4141742dcf281f02d3bab9714bc83bea65fab3de75169ea8d61f19cda996bc0dcec72e156efe3c5614c6bce65dcf234ac955b14 + languageName: node + linkType: hard + +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 10c0/3258bc3dbdf322ff2663619afe5947c7926a6ef5fb78ad7d384602974c467fadfc8272af44f5eb8cddd0d011aae8fabf3a929a8eee4b86edcc0a21e6bd10f9aa + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: 10c0/f9b1596fa7595a35c2f9d913ac312fede13d37dc8a747a51557ab36e11ce113bbe88ef4c0154968845559a7709cb6a7e7cbe75f7972182451cd45e7f057a334d + languageName: node + linkType: hard + +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da + languageName: node + linkType: hard + +"rc@npm:1.2.8, rc@npm:^1.2.8": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"react-chartjs-2@npm:^5.2.0": + version: 5.3.0 + resolution: "react-chartjs-2@npm:5.3.0" + peerDependencies: + chart.js: ^4.1.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/4415d40217c084a49f9a936fbd30f67e0e705148e6f8359bec65601033d1076f31085c45793839fc29ec833e6c427b0bf9861a0c54c432c08d35bc9590ffa41a + languageName: node + linkType: hard + +"react-docgen-typescript@npm:^2.2.2": + version: 2.2.2 + resolution: "react-docgen-typescript@npm:2.2.2" + peerDependencies: + typescript: ">= 4.3.x" + checksum: 10c0/d31a061a21b5d4b67d4af7bc742541fd9e16254bd32861cd29c52565bc2175f40421a3550d52b6a6b0d0478e7cc408558eb0060a0bdd2957b02cfceeb0ee1e88 + languageName: node + linkType: hard + +"react-docgen@npm:^7.0.0": + version: 7.1.1 + resolution: "react-docgen@npm:7.1.1" + dependencies: + "@babel/core": "npm:^7.18.9" + "@babel/traverse": "npm:^7.18.9" + "@babel/types": "npm:^7.18.9" + "@types/babel__core": "npm:^7.18.0" + "@types/babel__traverse": "npm:^7.18.0" + "@types/doctrine": "npm:^0.0.9" + "@types/resolve": "npm:^1.20.2" + doctrine: "npm:^3.0.0" + resolve: "npm:^1.22.1" + strip-indent: "npm:^4.0.0" + checksum: 10c0/961e69487f6acbd9110afbda31f5a0c7fa7ab8b1ebe09fc0138c17efd297fa0b69518df873e937cac108732cd8125433bf939115d23ff99c1c171844140705a7 + languageName: node + linkType: hard + +"react-dom@npm:18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.0" + peerDependencies: + react: ^18.2.0 + checksum: 10c0/66dfc5f93e13d0674e78ef41f92ed21dfb80f9c4ac4ac25a4b51046d41d4d2186abc915b897f69d3d0ebbffe6184e7c5876f2af26bfa956f179225d921be713a + languageName: node + linkType: hard + +"react-dom@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": + version: 19.1.0 + resolution: "react-dom@npm:19.1.0" + dependencies: + scheduler: "npm:^0.26.0" + peerDependencies: + react: ^19.1.0 + checksum: 10c0/3e26e89bb6c67c9a6aa86cb888c7a7f8258f2e347a6d2a15299c17eb16e04c19194e3452bc3255bd34000a61e45e2cb51e46292392340432f133e5a5d2dfb5fc + languageName: node + linkType: hard + +"react-dom@npm:^18.2.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 + languageName: node + linkType: hard + +"react-error-boundary@npm:^4.0.12": + version: 4.1.2 + resolution: "react-error-boundary@npm:4.1.2" + dependencies: + "@babel/runtime": "npm:^7.12.5" + peerDependencies: + react: ">=16.13.1" + checksum: 10c0/0737e5259bed40ce14eb0823b3c7b152171921f2179e604f48f3913490cdc594d6c22d43d7abb4ffb1512c832850228db07aa69d3b941db324953a5e393cb399 + languageName: node + linkType: hard + +"react-fast-compare@npm:^3.2.2": + version: 3.2.2 + resolution: "react-fast-compare@npm:3.2.2" + checksum: 10c0/0bbd2f3eb41ab2ff7380daaa55105db698d965c396df73e6874831dbafec8c4b5b08ba36ff09df01526caa3c61595247e3269558c284e37646241cba2b90a367 + languageName: node + linkType: hard + +"react-helmet-async@npm:^2.0.4": + version: 2.0.5 + resolution: "react-helmet-async@npm:2.0.5" + dependencies: + invariant: "npm:^2.2.4" + react-fast-compare: "npm:^3.2.2" + shallowequal: "npm:^1.1.0" + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + checksum: 10c0/f390ea8bf13c2681850e5f8eb5b73d8613f407c245a5fd23e9db9b2cc14a3700dd1ce992d3966632886d1d613083294c2aeee009193f49dfa7d145d9f13ea2b0 + languageName: node + linkType: hard + +"react-icons@npm:^5.0.1": + version: 5.5.0 + resolution: "react-icons@npm:5.5.0" + peerDependencies: + react: "*" + checksum: 10c0/a24309bfc993c19cbcbfc928157e53a137851822779977b9588f6dd41ffc4d11ebc98b447f4039b0d309a858f0a42980f6bfb4477fb19f9f2d1bc2e190fcf79c + languageName: node + linkType: hard + +"react-infinite-scroll-hook@npm:^4.1.1": + version: 4.1.1 + resolution: "react-infinite-scroll-hook@npm:4.1.1" + dependencies: + react-intersection-observer-hook: "npm:^2.1.1" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/43b49a12032bea13ecf60ad104135292e1b9d3e99833f0b06401ffb2e73f05c886a928e019e2a9b9c7654bf601035d8318ca5cf55645d722eb6d98efbd1e0ed3 + languageName: node + linkType: hard + +"react-intersection-observer-hook@npm:^2.1.1": + version: 2.1.1 + resolution: "react-intersection-observer-hook@npm:2.1.1" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/a960a9e6c75cee0cf76cb332157622b5dd2837e6d2f17762d720c2647de0f18a0c7a957e819b5491f1e4129f681748b7db3754290c4551c03ab3bcf74c06aa49 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + +"react-refresh@npm:^0.14.2": + version: 0.14.2 + resolution: "react-refresh@npm:0.14.2" + checksum: 10c0/875b72ef56b147a131e33f2abd6ec059d1989854b3ff438898e4f9310bfcc73acff709445b7ba843318a953cb9424bcc2c05af2b3d80011cee28f25aef3e2ebb + languageName: node + linkType: hard + +"react-remove-scroll-bar@npm:^2.3.7": + version: 2.3.8 + resolution: "react-remove-scroll-bar@npm:2.3.8" + dependencies: + react-style-singleton: "npm:^2.2.2" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/9a0675c66cbb52c325bdbfaed80987a829c4504cefd8ff2dd3b6b3afc9a1500b8ec57b212e92c1fb654396d07bbe18830a8146fe77677d2a29ce40b5e1f78654 + languageName: node + linkType: hard + +"react-remove-scroll@npm:^2.6.3": + version: 2.6.3 + resolution: "react-remove-scroll@npm:2.6.3" + dependencies: + react-remove-scroll-bar: "npm:^2.3.7" + react-style-singleton: "npm:^2.2.3" + tslib: "npm:^2.1.0" + use-callback-ref: "npm:^1.3.3" + use-sidecar: "npm:^1.1.3" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/068e9704ff26816fffc4c8903e2c6c8df7291ee08615d7c1ab0cf8751f7080e2c5a5d78ef5d908b11b9cfc189f176d312e44cb02ea291ca0466d8283b479b438 + languageName: node + linkType: hard + +"react-router-dom@npm:6.22.1": + version: 6.22.1 + resolution: "react-router-dom@npm:6.22.1" + dependencies: + "@remix-run/router": "npm:1.15.1" + react-router: "npm:6.22.1" + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10c0/1e6ec4596f134204934d4f701b8acc426867532342c8aec1b5c4ffeaf23afa0099727f58ab8687f7838db069616b8d6ed05a065570f23b3b60cbff405b3fbccd + languageName: node + linkType: hard + +"react-router@npm:6.22.1": + version: 6.22.1 + resolution: "react-router@npm:6.22.1" + dependencies: + "@remix-run/router": "npm:1.15.1" + peerDependencies: + react: ">=16.8" + checksum: 10c0/bb33c3a6457e73fa9977133be0c27b60accfc6452cc5d7b62c729cdd2d091a1345a9567cf852c651315548f1f16adac258eeab8ad193b46e4ce926c911dc857c + languageName: node + linkType: hard + +"react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": + version: 2.2.3 + resolution: "react-style-singleton@npm:2.2.3" + dependencies: + get-nonce: "npm:^1.0.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/841938ff16d16a6b76895f4cb2e1fea957e5fe3b30febbf03a54892dae1c9153f2383e231dea0b3ba41192ad2f2849448fa859caccd288943bce32639e971bee + languageName: node + linkType: hard + +"react@npm:18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/b562d9b569b0cb315e44b48099f7712283d93df36b19a39a67c254c6686479d3980b7f013dc931f4a5a3ae7645eae6386b4aa5eea933baa54ecd0f9acb0902b8 + languageName: node + linkType: hard + +"react@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": + version: 19.1.0 + resolution: "react@npm:19.1.0" + checksum: 10c0/530fb9a62237d54137a13d2cfb67a7db6a2156faed43eecc423f4713d9b20c6f2728b026b45e28fcd72e8eadb9e9ed4b089e99f5e295d2f0ad3134251bdd3698 + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 + languageName: node + linkType: hard + +"read-cmd-shim@npm:^3.0.0": + version: 3.0.1 + resolution: "read-cmd-shim@npm:3.0.1" + checksum: 10c0/a157c401161d28178aee45b70fae5f721b4f65ddedd728c51e21c3d2ea09715f73bcd33e87462bc27601f3445dce313d44e99450fafa48ded0b295445c49c2bf + languageName: node + linkType: hard + +"read-file-safe@npm:^1.0.5": + version: 1.0.10 + resolution: "read-file-safe@npm:1.0.10" + checksum: 10c0/730046d28677348f96c559feae8fd36c0fa1ae3ce17f05a447087c384006cc7c944caba229c7ec51e40dec22ecb11e86b92864b8b9c8bf3442d44feeb7011fed + languageName: node + linkType: hard + +"read-json-safe@npm:^1.0.5": + version: 1.0.5 + resolution: "read-json-safe@npm:1.0.5" + dependencies: + parse-json-object: "npm:^1.0.5" + read-file-safe: "npm:^1.0.5" + checksum: 10c0/cff70a6ff39caa667aeccc55bc8cad6a3656adfb92d61fcc9e712c108d886faa62915bcd7ce3e731854c9774afb28b4b0a06801c1d7aa05babfd48f378dfebf9 + languageName: node + linkType: hard + +"read-package-json-fast@npm:^2.0.2, read-package-json-fast@npm:^2.0.3": + version: 2.0.3 + resolution: "read-package-json-fast@npm:2.0.3" + dependencies: + json-parse-even-better-errors: "npm:^2.3.0" + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/c265a5d6c85f4c8ee0bf35b0b0d92800a7439e5cf4d1f5a2b3f9615a02ee2fd46bca6c2f07e244bfac1c40816eb0d28aec259ae99d7552d144dd9f971a5d2028 + languageName: node + linkType: hard + +"read-package-json@npm:^5.0.0, read-package-json@npm:^5.0.2": + version: 5.0.2 + resolution: "read-package-json@npm:5.0.2" + dependencies: + glob: "npm:^8.0.1" + json-parse-even-better-errors: "npm:^2.3.1" + normalize-package-data: "npm:^4.0.0" + npm-normalize-package-bin: "npm:^2.0.0" + checksum: 10c0/78972bda869efb6191f7b70ab0ca1e7a86549a4aaf73cb379dfeb57098e4ecaa1128ba3f81485ed0b52174605ef16fce1599a551228e5f656a17a1a53a1793e7 + languageName: node + linkType: hard + +"read-pkg-up@npm:^7.0.0, read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 + languageName: node + linkType: hard + +"read-pkg-up@npm:^9.1.0": + version: 9.1.0 + resolution: "read-pkg-up@npm:9.1.0" + dependencies: + find-up: "npm:^6.3.0" + read-pkg: "npm:^7.1.0" + type-fest: "npm:^2.5.0" + checksum: 10c0/3fb44889ff930b5c7b5cef9929fc5b2a8a80bc877682be0aef8daff7fc65b1f150bb4e61e7d4e7a11772b7b9b8e05843528031fe8111a7696b6deb652ee4287f + languageName: node + linkType: hard + +"read-pkg@npm:^5.0.0, read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb + languageName: node + linkType: hard + +"read-pkg@npm:^7.1.0": + version: 7.1.0 + resolution: "read-pkg@npm:7.1.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.1" + normalize-package-data: "npm:^3.0.2" + parse-json: "npm:^5.2.0" + type-fest: "npm:^2.0.0" + checksum: 10c0/5d67a9a1c96f6ee7765743c741f446e0556388dd60236ebfe3a8675019753b49da0863a871763bbdde81a8b3a07d03039088a21bf2dbf6ec485728958d9e93a3 + languageName: node + linkType: hard + +"read@npm:1, read@npm:^1.0.7, read@npm:~1.0.7": + version: 1.0.7 + resolution: "read@npm:1.0.7" + dependencies: + mute-stream: "npm:~0.0.4" + checksum: 10c0/443533f05d5bb11b36ef1c6d625aae4e2ced8967e93cf546f35aa77b4eb6bd157f4256619e446bae43467f8f6619c7bc5c76983348dffaf36afedf4224f46216 + languageName: node + linkType: hard + +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.2, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readdir-scoped-modules@npm:^1.1.0": + version: 1.1.0 + resolution: "readdir-scoped-modules@npm:1.1.0" + dependencies: + debuglog: "npm:^1.0.1" + dezalgo: "npm:^1.0.0" + graceful-fs: "npm:^4.1.2" + once: "npm:^1.3.0" + checksum: 10c0/21a53741c488775cbf78b0b51f1b897e9c523b1bcf54567fc2c8ed09b12d9027741f45fcb720f388c0c3088021b54dc3f616c07af1531417678cc7962fc15e5c + languageName: node + linkType: hard + +"recast@npm:^0.23.5": + version: 0.23.11 + resolution: "recast@npm:0.23.11" + dependencies: + ast-types: "npm:^0.16.1" + esprima: "npm:~4.0.0" + source-map: "npm:~0.6.1" + tiny-invariant: "npm:^1.3.3" + tslib: "npm:^2.0.1" + checksum: 10c0/45b520a8f0868a5a24ecde495be9de3c48e69a54295d82a7331106554b75cfba75d16c909959d056e9ceed47a1be5e061e2db8b9ecbcd6ba44c2f3ef9a47bd18 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: 10c0/d64a6b5c0b50eb3ddce3ab770f866658a2b9998c678f797919ceb1b586bab9259b311407280bd80b804e2a7c7539b19238ae6a2a20c843f1a7fcff21d48c2eae + languageName: node + linkType: hard + +"redeyed@npm:~2.1.0": + version: 2.1.1 + resolution: "redeyed@npm:2.1.1" + dependencies: + esprima: "npm:~4.0.0" + checksum: 10c0/350f5e39aebab3886713a170235c38155ee64a74f0f7e629ecc0144ba33905efea30c2c3befe1fcbf0b0366e344e7bfa34e6b2502b423c9a467d32f1306ef166 + languageName: node + linkType: hard + +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.9" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.7" + get-proto: "npm:^1.0.1" + which-builtin-type: "npm:^1.2.1" + checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac + languageName: node + linkType: hard + +"regenerate-unicode-properties@npm:^10.2.0": + version: 10.2.0 + resolution: "regenerate-unicode-properties@npm:10.2.0" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + languageName: node + linkType: hard + +"regenerate@npm:^1.4.2": + version: 1.4.2 + resolution: "regenerate@npm:1.4.2" + checksum: 10c0/f73c9eba5d398c818edc71d1c6979eaa05af7a808682749dd079f8df2a6d91a9b913db216c2c9b03e0a8ba2bba8701244a93f45211afbff691c32c7b275db1b8 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 + languageName: node + linkType: hard + +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" + dependencies: + "@babel/runtime": "npm:^7.8.4" + checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" + dependencies: + call-bind: "npm:^1.0.8" + define-properties: "npm:^1.2.1" + es-errors: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + set-function-name: "npm:^2.0.2" + checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 + languageName: node + linkType: hard + +"regexpu-core@npm:^6.2.0": + version: 6.2.0 + resolution: "regexpu-core@npm:6.2.0" + dependencies: + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.2.0" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.12.0" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.1.0" + checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + languageName: node + linkType: hard + +"registry-auth-token@npm:^4.2.2": + version: 4.2.2 + resolution: "registry-auth-token@npm:4.2.2" + dependencies: + rc: "npm:1.2.8" + checksum: 10c0/1d0000b8b65e7141a4cc4594926e2551607f48596e01326e7aa2ba2bc688aea86b2aa0471c5cb5de7acc9a59808a3a1ddde9084f974da79bfc67ab67aa48e003 + languageName: node + linkType: hard + +"registry-auth-token@npm:^5.0.0, registry-auth-token@npm:^5.0.1": + version: 5.1.0 + resolution: "registry-auth-token@npm:5.1.0" + dependencies: + "@pnpm/npm-conf": "npm:^2.1.0" + checksum: 10c0/316229bd8a4acc29a362a7a3862ff809e608256f0fd9e0b133412b43d6a9ea18743756a0ec5ee1467a5384e1023602b85461b3d88d1336b11879e42f7cf02c12 + languageName: node + linkType: hard + +"registry-url@npm:^6.0.0, registry-url@npm:^6.0.1": + version: 6.0.1 + resolution: "registry-url@npm:6.0.1" + dependencies: + rc: "npm:1.2.8" + checksum: 10c0/66e2221c8113fc35ee9d23fe58cb516fc8d556a189fb8d6f1011a02efccc846c4c9b5075b4027b99a5d5c9ad1345ac37f297bea3c0ca30d607ec8084bf561b90 + languageName: node + linkType: hard + +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10c0/44f526c4fdbf0b29286101a282189e4dbb303f4013cf3fea058668d96d113b9180d3d03d1e13f6d4cbde38b7728bf951aecd9dc199938c080093a9a6f0d7a6bd + languageName: node + linkType: hard + +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" + dependencies: + jsesc: "npm:~3.0.2" + bin: + regjsparser: bin/parser + checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 + languageName: node + linkType: hard + +"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-from@npm:3.0.0" + checksum: 10c0/24affcf8e81f4c62f0dcabc774afe0e19c1f38e34e43daac0ddb409d79435fc3037f612b0cc129178b8c220442c3babd673e88e870d27215c99454566e770ebc + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 + languageName: node + linkType: hard + +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: "npm:^2.0.0" + checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 + languageName: node + linkType: hard + +"responselike@npm:^3.0.0": + version: 3.0.0 + resolution: "responselike@npm:3.0.0" + dependencies: + lowercase-keys: "npm:^3.0.0" + checksum: 10c0/8af27153f7e47aa2c07a5f2d538cb1e5872995f0e9ff77def858ecce5c3fe677d42b824a62cde502e56d275ab832b0a8bd350d5cd6b467ac0425214ac12ae658 + languageName: node + linkType: hard + +"restore-cursor@npm:^2.0.0": + version: 2.0.0 + resolution: "restore-cursor@npm:2.0.0" + dependencies: + onetime: "npm:^2.0.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/f5b335bee06f440445e976a7031a3ef53691f9b7c4a9d42a469a0edaf8a5508158a0d561ff2b26a1f4f38783bcca2c0e5c3a44f927326f6694d5b44d7a4993e6 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa + languageName: node + linkType: hard + +"rfdc@npm:^1.3.0": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"rollup-plugin-typescript2@npm:^0.36.0": + version: 0.36.0 + resolution: "rollup-plugin-typescript2@npm:0.36.0" + dependencies: + "@rollup/pluginutils": "npm:^4.1.2" + find-cache-dir: "npm:^3.3.2" + fs-extra: "npm:^10.0.0" + semver: "npm:^7.5.4" + tslib: "npm:^2.6.2" + peerDependencies: + rollup: ">=1.26.3" + typescript: ">=2.4.0" + checksum: 10c0/3c8d17cd852ded36eaad2759caf170f90e091d8f86ff7b016d1823bc8b507b8f689156bcccda348fc88471681dc79cc9eb13ddb09a4dfcf0d07ac9a249e2d79b + languageName: node + linkType: hard + +"rollup@npm:^2.70.1": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" + dependencies: + fsevents: "npm:~2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/bc3746c988d903c2211266ddc539379d53d92689b9cc5c2b4e3ae161689de9af491957a567c629b6cc81f48d0928a7591fc4c383fba68a48d2966c9fb8a2bce9 + languageName: node + linkType: hard + +"rollup@npm:^4.20.0": + version: 4.39.0 + resolution: "rollup@npm:4.39.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.39.0" + "@rollup/rollup-android-arm64": "npm:4.39.0" + "@rollup/rollup-darwin-arm64": "npm:4.39.0" + "@rollup/rollup-darwin-x64": "npm:4.39.0" + "@rollup/rollup-freebsd-arm64": "npm:4.39.0" + "@rollup/rollup-freebsd-x64": "npm:4.39.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.39.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.39.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.39.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.39.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.39.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.39.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.39.0" + "@rollup/rollup-linux-x64-musl": "npm:4.39.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.39.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.39.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.39.0" + "@types/estree": "npm:1.0.7" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/2dc0c23ca04bd00295035b405c977261559aed8acc9902ee9ff44e4a6b54734fcb64999c32143c43804dcb543da7983032831b893a902633b006c21848a093ce + languageName: node + linkType: hard + +"rrweb-cssom@npm:^0.7.1": + version: 0.7.1 + resolution: "rrweb-cssom@npm:0.7.1" + checksum: 10c0/127b8ca6c8aac45e2755abbae6138d4a813b1bedc2caabf79466ae83ab3cfc84b5bfab513b7033f0aa4561c7753edf787d0dd01163ceacdee2e8eb1b6bf7237e + languageName: node + linkType: hard + +"rrweb-cssom@npm:^0.8.0": + version: 0.8.0 + resolution: "rrweb-cssom@npm:0.8.0" + checksum: 10c0/56f2bfd56733adb92c0b56e274c43f864b8dd48784d6fe946ef5ff8d438234015e59ad837fc2ad54714b6421384141c1add4eb569e72054e350d1f8a50b8ac7b + languageName: node + linkType: hard + +"run-applescript@npm:^5.0.0": + version: 5.0.0 + resolution: "run-applescript@npm:5.0.0" + dependencies: + execa: "npm:^5.0.0" + checksum: 10c0/f9977db5770929f3f0db434b8e6aa266498c70dec913c84320c0a06add510cf44e3a048c44da088abee312006f9cbf572fd065cdc8f15d7682afda8755f4114c + languageName: node + linkType: hard + +"run-async@npm:^2.2.0, run-async@npm:^2.4.0": + version: 2.4.1 + resolution: "run-async@npm:2.4.1" + checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 + languageName: node + linkType: hard + +"run-async@npm:^3.0.0": + version: 3.0.0 + resolution: "run-async@npm:3.0.0" + checksum: 10c0/b18b562ae37c3020083dcaae29642e4cc360c824fbfb6b7d50d809a9d5227bb986152d09310255842c8dce40526e82ca768f02f00806c91ba92a8dfa6159cb85 + languageName: node + linkType: hard + +"run-node@npm:^1.0.0": + version: 1.0.0 + resolution: "run-node@npm:1.0.0" + bin: + run-node: run-node + checksum: 10c0/ab32a065194903e5cd2e4c01e4a5568d22720b4eaa5c853d5386e8d116c59c313e84591f0375913dbe6cc973c2181aed4f54d6b32dba9f7d0d5d01a762de8b6b + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"rxjs@npm:^6.3.3, rxjs@npm:^6.4.0, rxjs@npm:^6.5.3, rxjs@npm:^6.6.0": + version: 6.6.7 + resolution: "rxjs@npm:6.6.7" + dependencies: + tslib: "npm:^1.9.0" + checksum: 10c0/e556a13a9aa89395e5c9d825eabcfa325568d9c9990af720f3f29f04a888a3b854f25845c2b55875d875381abcae2d8100af9cacdc57576e7ed6be030a01d2fe + languageName: node + linkType: hard + +"rxjs@npm:^7.8.0, rxjs@npm:^7.8.1": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.6" + has-symbols: "npm:^1.1.0" + isarray: "npm:^2.0.5" + checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + isarray: "npm:^2.0.5" + checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + is-regex: "npm:^1.2.1" + checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.0, scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 + languageName: node + linkType: hard + +"scheduler@npm:^0.26.0": + version: 0.26.0 + resolution: "scheduler@npm:0.26.0" + checksum: 10c0/5b8d5bfddaae3513410eda54f2268e98a376a429931921a81b5c3a2873aab7ca4d775a8caac5498f8cbc7d0daeab947cf923dbd8e215d61671f9f4e392d34356 + languageName: node + linkType: hard + +"schema-utils@npm:^2.6.5": + version: 2.7.1 + resolution: "schema-utils@npm:2.7.1" + dependencies: + "@types/json-schema": "npm:^7.0.5" + ajv: "npm:^6.12.4" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/f484f34464edd8758712d5d3ba25a306e367dac988aecaf4ce112e99baae73f33a807b5cf869240bb6648c80720b36af2d7d72be3a27faa49a2d4fc63fa3f85f + languageName: node + linkType: hard + +"scoped-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "scoped-regex@npm:3.0.0" + checksum: 10c0/484d137f4f30d531786442214e1f15b86e36929aa5b7e808e466eff365adff759cc34f450290658a47ec6d2baf0509eb94829948c0fb01625cf24436234743ab + languageName: node + linkType: hard + +"semantic-release@npm:^19.0.2": + version: 19.0.5 + resolution: "semantic-release@npm:19.0.5" + dependencies: + "@semantic-release/commit-analyzer": "npm:^9.0.2" + "@semantic-release/error": "npm:^3.0.0" + "@semantic-release/github": "npm:^8.0.0" + "@semantic-release/npm": "npm:^9.0.0" + "@semantic-release/release-notes-generator": "npm:^10.0.0" + aggregate-error: "npm:^3.0.0" + cosmiconfig: "npm:^7.0.0" + debug: "npm:^4.0.0" + env-ci: "npm:^5.0.0" + execa: "npm:^5.0.0" + figures: "npm:^3.0.0" + find-versions: "npm:^4.0.0" + get-stream: "npm:^6.0.0" + git-log-parser: "npm:^1.2.0" + hook-std: "npm:^2.0.0" + hosted-git-info: "npm:^4.0.0" + lodash: "npm:^4.17.21" + marked: "npm:^4.0.10" + marked-terminal: "npm:^5.0.0" + micromatch: "npm:^4.0.2" + p-each-series: "npm:^2.1.0" + p-reduce: "npm:^2.0.0" + read-pkg-up: "npm:^7.0.0" + resolve-from: "npm:^5.0.0" + semver: "npm:^7.3.2" + semver-diff: "npm:^3.1.1" + signale: "npm:^1.2.1" + yargs: "npm:^16.2.0" + bin: + semantic-release: bin/semantic-release.js + checksum: 10c0/b1fee9c6393a986a80ecfbfa1a95d811a012f991a6c0ee2be649172ecd83b3d3a58efb6524e5451ad12c7c8b9db48642b70bdb12c259048d36e84c6cc8934a24 + languageName: node + linkType: hard + +"semver-compare@npm:^1.0.0": + version: 1.0.0 + resolution: "semver-compare@npm:1.0.0" + checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 + languageName: node + linkType: hard + +"semver-diff@npm:^3.1.1": + version: 3.1.1 + resolution: "semver-diff@npm:3.1.1" + dependencies: + semver: "npm:^6.3.0" + checksum: 10c0/7d350f1450b9577d538ef866a9bc4cd97bfbf1f1d92070291495a31d0ec3aa808e826c223e5454ea9877cc06eaa886ffd71bb3a1f331b44bc210f9ff525c68d2 + languageName: node + linkType: hard + +"semver-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "semver-diff@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/3ed1bb22f39b4b6e98785bb066e821eabb9445d3b23e092866c50e7df8b9bd3eda617b242f81db4159586e0e39b0deb908dd160a24f783bd6f52095b22cd68ea + languageName: node + linkType: hard + +"semver-regex@npm:^3.1.2": + version: 3.1.4 + resolution: "semver-regex@npm:3.1.4" + checksum: 10c0/17bb7742b280e113c7850ce40b274341c74f61077a0712babd84782ea11b5bc343cde5b4e6d06721b29a2a4a17a42c5b8d1559efd9fd3de799997e83d361162c + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a + languageName: node + linkType: hard + +"shallowequal@npm:^1.1.0": + version: 1.1.0 + resolution: "shallowequal@npm:1.1.0" + checksum: 10c0/b926efb51cd0f47aa9bc061add788a4a650550bbe50647962113a4579b60af2abe7b62f9b02314acc6f97151d4cf87033a2b15fc20852fae306d1a095215396c + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: "npm:^1.0.0" + checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4, side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"signale@npm:^1.2.1": + version: 1.4.0 + resolution: "signale@npm:1.4.0" + dependencies: + chalk: "npm:^2.3.2" + figures: "npm:^2.0.0" + pkg-conf: "npm:^2.1.0" + checksum: 10c0/3b637421368a30805da3948f82350cb9959ddfb19073f44609495384b98baba1c62b1c5c094db57000836c8bc84c6c05c979aa7e072ceeaaf0032d7991b329c7 + languageName: node + linkType: hard + +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: 10c0/f83dbd3cb62c41bb8fcbbc6bf5473f3234b97fa1d008f571710a9d3757a28c7169e1811cad1554ccb1cc531460b3d221c9a7b37f549398d9a30707f0a5af9193 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: 10c0/b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:0.0.4": + version: 0.0.4 + resolution: "slice-ansi@npm:0.0.4" + checksum: 10c0/997d4cc73e34aa8c0f60bdb71701b16c062cc4acd7a95e3b10e8c05d790eb5e735d9b470270dc6f443b1ba21492db7ceb849d5c93011d1256061bf7ed7216c7a + languageName: node + linkType: hard + +"slice-ansi@npm:^3.0.0": + version: 3.0.0 + resolution: "slice-ansi@npm:3.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/88083c9d0ca67d09f8b4c78f68833d69cabbb7236b74df5d741ad572bbf022deaf243fa54009cd434350622a1174ab267710fcc80a214ecc7689797fe00cb27c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 10c0/2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^6.0.2" + debug: "npm:^4.3.3" + socks: "npm:^2.6.2" + checksum: 10c0/b859f7eb8e96ec2c4186beea233ae59c02404094f3eb009946836af27d6e5c1627d1975a69b4d2e20611729ed543b6db3ae8481eb38603433c50d0345c987600 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.6.2, socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.6.1, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spawn-error-forwarder@npm:~1.0.0": + version: 1.0.0 + resolution: "spawn-error-forwarder@npm:1.0.0" + checksum: 10c0/531cb73404af88b5400f9b7a976836b9f09cb48e4c0c79784ad80001ea942eb256e311f14cc7d171539cd1a86297c1c5461177c3fa736ac30627f5f8a6b06db6 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 + languageName: node + linkType: hard + +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 10c0/56df8344f5a5de8521898a5c090023df1d8b8c75be6228f56c52491e0fc1617a5236f2ac3a066adb67a73231eac216ccea7b5b4a2423a543c277cb2f48d24c29 + languageName: node + linkType: hard + +"split2@npm:^3.0.0": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: "npm:^3.0.0" + checksum: 10c0/2dad5603c52b353939befa3e2f108f6e3aff42b204ad0f5f16dd12fd7c2beab48d117184ce6f7c8854f9ee5ffec6faae70d243711dd7d143a9f635b4a285de4e + languageName: node + linkType: hard + +"split2@npm:~1.0.0": + version: 1.0.0 + resolution: "split2@npm:1.0.0" + dependencies: + through2: "npm:~2.0.0" + checksum: 10c0/5923936c492ebbdfed66705a25a1d53eb98d2cff740421f4b558842fdf731f108872c24fe13fa091feef8b564543bdf25c967c03fce6ea09b7119b9d3ed07eda + languageName: node + linkType: hard + +"split@npm:^1.0.0": + version: 1.0.1 + resolution: "split@npm:1.0.1" + dependencies: + through: "npm:2" + checksum: 10c0/7f489e7ed5ff8a2e43295f30a5197ffcb2d6202c9cf99357f9690d645b19c812bccf0be3ff336fea5054cda17ac96b91d67147d95dbfc31fbb5804c61962af85 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"ssri@npm:^9.0.0, ssri@npm:^9.0.1": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: "npm:^3.1.1" + checksum: 10c0/c5d153ce03b5980d683ecaa4d805f6a03d8dc545736213803e168a1907650c46c08a4e5ce6d670a0205482b35c35713d9d286d9133bdd79853a406e22ad81f04 + languageName: node + linkType: hard + +"stable-hash@npm:^0.0.5": + version: 0.0.5 + resolution: "stable-hash@npm:0.0.5" + checksum: 10c0/ca670cb6d172f1c834950e4ec661e2055885df32fee3ebf3647c5df94993b7c2666a5dbc1c9a62ee11fc5c24928579ec5e81bb5ad31971d355d5a341aab493b3 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"statuses@npm:^2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"std-env@npm:^3.5.0": + version: 3.9.0 + resolution: "std-env@npm:3.9.0" + checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 + languageName: node + linkType: hard + +"stop-iteration-iterator@npm:^1.0.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + internal-slot: "npm:^1.1.0" + checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 + languageName: node + linkType: hard + +"storybook-dark-mode@npm:^4.0.2": + version: 4.0.2 + resolution: "storybook-dark-mode@npm:4.0.2" + dependencies: + "@storybook/components": "npm:^8.0.0" + "@storybook/core-events": "npm:^8.0.0" + "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.2.5" + "@storybook/manager-api": "npm:^8.0.0" + "@storybook/theming": "npm:^8.0.0" + fast-deep-equal: "npm:^3.1.3" + memoizerific: "npm:^1.11.3" + checksum: 10c0/d4fc652ff080f6cc9f0effab0c989b66ead3372b267c2c328eef608f27c9822bf47aaa177405e42768b2de22f8a3e9a0280af50430efd0cf78bd6ed1f12c8b29 + languageName: node + linkType: hard + +"storybook@npm:^8.2.5": + version: 8.6.12 + resolution: "storybook@npm:8.6.12" + dependencies: + "@storybook/core": "npm:8.6.12" + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + bin: + getstorybook: ./bin/index.cjs + sb: ./bin/index.cjs + storybook: ./bin/index.cjs + checksum: 10c0/9e52fed104fe9b0e8baad84651f5ea13d37ad885f1cfaf3fb27858c928920abbc05f624516545c360975c5bb86c1107ca8cdf484725fc8ddb540e55a6d536cb6 + languageName: node + linkType: hard + +"stream-combiner2@npm:~1.1.1": + version: 1.1.1 + resolution: "stream-combiner2@npm:1.1.1" + dependencies: + duplexer2: "npm:~0.1.0" + readable-stream: "npm:^2.0.2" + checksum: 10c0/96a14ae94493aad307176d0c0a795446cedf6c49d11d08e5d0a56bcf9f22352b0dd148b0497c8456f08b00da0867288e9750bf0286b71f6b621c0f2ba6768758 + languageName: node + linkType: hard + +"strict-event-emitter@npm:^0.5.1": + version: 0.5.1 + resolution: "strict-event-emitter@npm:0.5.1" + checksum: 10c0/f5228a6e6b6393c57f52f62e673cfe3be3294b35d6f7842fc24b172ae0a6e6c209fa83241d0e433fc267c503bc2f4ffdbe41a9990ff8ffd5ac425ec0489417f7 + languageName: node + linkType: hard + +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: 10c0/010cbc78da0e2cf833b0f5dc769e21ae74cdc5d5f5bd555f14a4a4876c8ad2c85ab8b5bdf9a722dc71a11dcd3184085e1c3c0bd50ec6bb85fffc0f28cf82597d + languageName: node + linkType: hard + +"string-argv@npm:^0.3.0, string-argv@npm:^0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: "npm:^1.0.0" + is-fullwidth-code-point: "npm:^1.0.0" + strip-ansi: "npm:^3.0.0" + checksum: 10c0/c558438baed23a9ab9370bb6a939acbdb2b2ffc517838d651aad0f5b2b674fb85d460d9b1d0b6a4c210dffd09e3235222d89a5bd4c0c1587f78b2bb7bc00c65e + languageName: node + linkType: hard + +"string-width@npm:^2.1.0, string-width@npm:^2.1.1": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: "npm:^2.0.0" + strip-ansi: "npm:^4.0.0" + checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 + languageName: node + linkType: hard + +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.6" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.6" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + internal-slot: "npm:^1.1.0" + regexp.prototype.flags: "npm:^1.5.3" + set-function-name: "npm:^2.0.2" + side-channel: "npm:^1.1.0" + checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" + dependencies: + define-properties: "npm:^1.1.3" + es-abstract: "npm:^1.17.5" + checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-data-property: "npm:^1.1.4" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.5" + es-object-atoms: "npm:^1.0.0" + has-property-descriptors: "npm:^1.0.2" + checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.2" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"stringify-object@npm:^3.3.0": + version: 3.3.0 + resolution: "stringify-object@npm:3.3.0" + dependencies: + get-own-enumerable-property-symbols: "npm:^3.0.0" + is-obj: "npm:^1.0.1" + is-regexp: "npm:^1.0.0" + checksum: 10c0/ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: "npm:^2.0.0" + checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: "npm:^3.0.0" + checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d + languageName: node + linkType: hard + +"strip-ansi@npm:^5.1.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: "npm:^4.1.0" + checksum: 10c0/de4658c8a097ce3b15955bc6008f67c0790f85748bdc025b7bc8c52c7aee94bc4f9e50624516150ed173c3db72d851826cd57e7a85fe4e4bb6dbbebd5d297fdf + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 + languageName: node + linkType: hard + +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 10c0/a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: "npm:^1.0.0" + checksum: 10c0/ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 + languageName: node + linkType: hard + +"strip-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-indent@npm:4.0.0" + dependencies: + min-indent: "npm:^1.0.1" + checksum: 10c0/6b1fb4e22056867f5c9e7a6f3f45922d9a2436cac758607d58aeaac0d3b16ec40b1c43317de7900f1b8dd7a4107352fa47fb960f2c23566538c51e8585c8870e + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"strip-literal@npm:^2.0.0": + version: 2.1.1 + resolution: "strip-literal@npm:2.1.1" + dependencies: + js-tokens: "npm:^9.0.1" + checksum: 10c0/66a7353f5ba1ae6a4fb2805b4aba228171847200640083117c41512692e6b2c020e18580402984f55c0ae69c30f857f9a55abd672863e4ca8fdb463fdf93ba19 + languageName: node + linkType: hard + +"supports-color@npm:^2.0.0": + version: 2.0.0 + resolution: "supports-color@npm:2.0.0" + checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^2.2.0, supports-hyperlinks@npm:^2.3.0": + version: 2.3.0 + resolution: "supports-hyperlinks@npm:2.3.0" + dependencies: + has-flag: "npm:^4.0.0" + supports-color: "npm:^7.0.0" + checksum: 10c0/4057f0d86afb056cd799602f72d575b8fdd79001c5894bcb691176f14e870a687e7981e50bc1484980e8b688c6d5bcd4931e1609816abb5a7dc1486b7babf6a1 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"swr@npm:^2.2.4": + version: 2.3.3 + resolution: "swr@npm:2.3.3" + dependencies: + dequal: "npm:^2.0.3" + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/882fc8291912860e0c50eae3470ebf0cd58b0144cb12adcc4b14c5cef913ea06479043830508d8b0b3d4061d99ad8dd52485c9c879fbd4e9b893484e6d8da9e3 + languageName: node + linkType: hard + +"symbol-observable@npm:^1.1.0": + version: 1.2.0 + resolution: "symbol-observable@npm:1.2.0" + checksum: 10c0/009fee50798ef80ed4b8195048288f108b03de162db07493f2e1fd993b33fafa72d659e832b584da5a2427daa78e5a738fb2a9ab027ee9454252e0bedbcd1fdc + languageName: node + linkType: hard + +"symbol-observable@npm:^4.0.0": + version: 4.0.0 + resolution: "symbol-observable@npm:4.0.0" + checksum: 10c0/5e9a3ab08263a6be8cbee76587ad5880dcc62a47002787ed5ebea56b1eb30dc87da6f0183d67e88286806799fbe21c69077fbd677be4be2188e92318d6c6f31d + languageName: node + linkType: hard + +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 + languageName: node + linkType: hard + +"tabbable@npm:^6.0.0": + version: 6.2.0 + resolution: "tabbable@npm:6.2.0" + checksum: 10c0/ced8b38f05f2de62cd46836d77c2646c42b8c9713f5bd265daf0e78ff5ac73d3ba48a7ca45f348bafeef29b23da7187c72250742d37627883ef89cbd7fa76898 + languageName: node + linkType: hard + +"tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + +"temp-dir@npm:^2.0.0": + version: 2.0.0 + resolution: "temp-dir@npm:2.0.0" + checksum: 10c0/b1df969e3f3f7903f3426861887ed76ba3b495f63f6d0c8e1ce22588679d9384d336df6064210fda14e640ed422e2a17d5c40d901f60e161c99482d723f4d309 + languageName: node + linkType: hard + +"tempy@npm:^1.0.0": + version: 1.0.1 + resolution: "tempy@npm:1.0.1" + dependencies: + del: "npm:^6.0.0" + is-stream: "npm:^2.0.0" + temp-dir: "npm:^2.0.0" + type-fest: "npm:^0.16.0" + unique-string: "npm:^2.0.0" + checksum: 10c0/864a1cf1b5536dc21e84ae45dbbc3ba4dd2c7ec1674d895f99c349cf209df959a53d797ca38d0b2cf69c7684d565fde5cfc67faaa63b7208ffb21d454b957472 + languageName: node + linkType: hard + +"terminal-link@npm:^3.0.0": + version: 3.0.0 + resolution: "terminal-link@npm:3.0.0" + dependencies: + ansi-escapes: "npm:^5.0.0" + supports-hyperlinks: "npm:^2.2.0" + checksum: 10c0/2ccf93f474d9c4fe1ac75764a48836e61c281def08f4aff154696bc83dd764078ee2f5a6a6148382fb928943d53f44313ae513c5f457649d2961a95e5cd343b3 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + +"text-extensions@npm:^1.0.0": + version: 1.9.0 + resolution: "text-extensions@npm:1.9.0" + checksum: 10c0/9ad5a9f723a871e2d884e132d7e93f281c60b5759c95f3f6b04704856548715d93a36c10dbaf5f12b91bf405f0cf3893bf169d4d143c0f5509563b992d385443 + languageName: node + linkType: hard + +"text-table@npm:~0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: "npm:3" + checksum: 10c0/3741564ae99990a4a79097fe7a4152c22348adc4faf2df9199a07a66c81ed2011da39f631e479fdc56483996a9d34a037ad64e76d79f18c782ab178ea9b6778c + languageName: node + linkType: hard + +"through2@npm:~2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: 10c0/cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade + languageName: node + linkType: hard + +"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"tiny-invariant@npm:^1.3.1, tiny-invariant@npm:^1.3.3": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a + languageName: node + linkType: hard + +"tiny-relative-date@npm:^1.3.0": + version: 1.3.0 + resolution: "tiny-relative-date@npm:1.3.0" + checksum: 10c0/70a0818793bd00345771a4ddfa9e339c102f891766c5ebce6a011905a1a20e30212851c9ffb11b52b79e2445be32bc21d164c4c6d317aef730766b2a61008f30 + languageName: node + linkType: hard + +"tinybench@npm:^2.5.1": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinycolor2@npm:^1.4.2": + version: 1.6.0 + resolution: "tinycolor2@npm:1.6.0" + checksum: 10c0/9aa79a36ba2c2a87cb221453465cabacd04b9e35f9694373e846fdc78b1c768110f81e581ea41440106c0f24d9a023891d0887e8075885e790ac40eb0e74a5c1 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f + languageName: node + linkType: hard + +"tinypool@npm:^0.8.3": + version: 0.8.4 + resolution: "tinypool@npm:0.8.4" + checksum: 10c0/779c790adcb0316a45359652f4b025958c1dff5a82460fe49f553c864309b12ad732c8288be52f852973bc76317f5e7b3598878aee0beb8a33322c0e72c4a66c + languageName: node + linkType: hard + +"tinyspy@npm:^2.2.0": + version: 2.2.1 + resolution: "tinyspy@npm:2.2.1" + checksum: 10c0/0b4cfd07c09871e12c592dfa7b91528124dc49a4766a0b23350638c62e6a483d5a2a667de7e6282246c0d4f09996482ddaacbd01f0c05b7ed7e0f79d32409bdc + languageName: node + linkType: hard + +"titleize@npm:^3.0.0": + version: 3.0.0 + resolution: "titleize@npm:3.0.0" + checksum: 10c0/5ae6084ba299b5782f95e3fe85ea9f0fa4d74b8ae722b6b3208157e975589fbb27733aeba4e5080fa9314a856044ef52caa61b87caea4b1baade951a55c06336 + languageName: node + linkType: hard + +"tmp@npm:^0.0.33": + version: 0.0.33 + resolution: "tmp@npm:0.0.33" + dependencies: + os-tmpdir: "npm:~1.0.2" + checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"tough-cookie@npm:^4.1.4": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" + dependencies: + psl: "npm:^1.1.33" + punycode: "npm:^2.1.1" + universalify: "npm:^0.2.0" + url-parse: "npm:^1.5.3" + checksum: 10c0/aca7ff96054f367d53d1e813e62ceb7dd2eda25d7752058a74d64b7266fd07be75908f3753a32ccf866a2f997604b414cfb1916d6e7f69bc64d9d9939b0d6c45 + languageName: node + linkType: hard + +"tr46@npm:^5.1.0": + version: 5.1.0 + resolution: "tr46@npm:5.1.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 + languageName: node + linkType: hard + +"traefik-proxy-dashboard@workspace:.": + version: 0.0.0-use.local + resolution: "traefik-proxy-dashboard@workspace:." + dependencies: + "@eslint/js": "npm:^9.23.0" + "@testing-library/jest-dom": "npm:^6.4.2" + "@testing-library/react": "npm:^14.2.1" + "@testing-library/user-event": "npm:^14.5.2" + "@traefiklabs/faency": "npm:11.1.4" + "@types/lodash": "npm:^4.17.16" + "@types/node": "npm:^22.15.18" + "@types/react": "npm:^18.2.0" + "@types/react-dom": "npm:^18.2.19" + "@types/react-router-dom": "npm:^5.1.3" + "@typescript-eslint/parser": "npm:^8.29.0" + "@vitejs/plugin-react": "npm:^4.2.1" + "@vitest/coverage-v8": "npm:^1.3.1" + chart.js: "npm:^4.4.1" + eslint: "npm:^9.23.0" + eslint-config-prettier: "npm:^10.0.2" + eslint-import-resolver-typescript: "npm:^3.8.3" + eslint-plugin-import: "npm:^2.31.0" + eslint-plugin-jsx-a11y: "npm:^6.10.2" + eslint-plugin-react: "npm:^7.37.4" + eslint-plugin-react-hooks: "npm:^5.1.0" + framer-motion: "npm:^11.18.2" + globals: "npm:^16.0.0" + husky: "npm:^3.1.0" + jest-extended: "npm:^4.0.2" + jsdom: "npm:^24.0.0" + lint-staged: "npm:^9.5.0" + lodash: "npm:^4.17.21" + msw: "npm:^2.1.7" + prettier: "npm:^3.5.3" + query-string: "npm:^6.9.0" + react: "npm:^18.2.0" + react-chartjs-2: "npm:^5.2.0" + react-dom: "npm:^18.2.0" + react-error-boundary: "npm:^4.0.12" + react-helmet-async: "npm:^2.0.4" + react-icons: "npm:^5.0.1" + react-infinite-scroll-hook: "npm:^4.1.1" + react-router-dom: "npm:6.22.1" + swr: "npm:^2.2.4" + typescript: "npm:^5.2.2" + typescript-eslint: "npm:^8.24.1" + usehooks-ts: "npm:^2.14.0" + vite: "npm:^5.1.4" + vite-tsconfig-paths: "npm:^4.3.1" + vitest: "npm:^1.3.1" + vitest-canvas-mock: "npm:^0.3.3" + languageName: unknown + linkType: soft + +"traverse@npm:0.6.8": + version: 0.6.8 + resolution: "traverse@npm:0.6.8" + checksum: 10c0/d97a71be2ca895ff6b813840db37f9b5d88e30f7c4c4bd5b22c5c68ebc22d4a10c4599e02c51414523cc7ada3432e118ea62ebd53cf6f3a4f3aa951bd45072a9 + languageName: node + linkType: hard + +"treeverse@npm:^2.0.0": + version: 2.0.0 + resolution: "treeverse@npm:2.0.0" + checksum: 10c0/be37fd0d4d62c62fe7f4bfcac164d82f11456184dc397473896ed2efcdf9b307c3e433e1d275a1dd924fc7e66aa280ab36be8b8966b87f23e0f545417eb52900 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: 10c0/03cfefde6c59ff57138412b8c6be922ecc5aec30694d784f2a65ef8dcbd47faef580b7de0c949345abdc56ec4b4abf64dd1e5aea619b200316e471a3dd5bf1f6 + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.0.1": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f + languageName: node + linkType: hard + +"ts-dedent@npm:^2.0.0": + version: 2.2.0 + resolution: "ts-dedent@npm:2.2.0" + checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 + languageName: node + linkType: hard + +"tsconfck@npm:^3.0.3": + version: 3.1.5 + resolution: "tsconfck@npm:3.1.5" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + tsconfck: bin/tsconfck.js + checksum: 10c0/9b62cd85d5702aa23ea50ea578d7124f3d59cc4518fcc7eacc04f4f9c9c481f720738ff8351bd4472247c0723a17dfd01af95a5b60ad623cdb8727fbe4881847 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^4.2.0": + version: 4.2.0 + resolution: "tsconfig-paths@npm:4.2.0" + dependencies: + json5: "npm:^2.2.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea + languageName: node + linkType: hard + +"tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": + version: 4.1.0 + resolution: "type-detect@npm:4.1.0" + checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a + languageName: node + linkType: hard + +"type-fest@npm:^0.16.0": + version: 0.16.0 + resolution: "type-fest@npm:0.16.0" + checksum: 10c0/6b4d846534e7bcb49a6160b068ffaed2b62570d989d909ac3f29df5ef1e993859f890a4242eebe023c9e923f96adbcb3b3e88a198c35a1ee9a731e147a6839c3 + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: 10c0/303f5ecf40d03e1d5b635ce7660de3b33c18ed8ebc65d64920c02974d9e684c72483c23f9084587e9dd6466a2ece1da42ddc95b412a461794dd30baca95e2bac + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 + languageName: node + linkType: hard + +"type-fest@npm:^1.0.1, type-fest@npm:^1.0.2": + version: 1.4.0 + resolution: "type-fest@npm:1.4.0" + checksum: 10c0/a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 + languageName: node + linkType: hard + +"type-fest@npm:^2.0.0, type-fest@npm:^2.11.2, type-fest@npm:^2.13.0, type-fest@npm:^2.5.0, type-fest@npm:^2.5.1": + version: 2.19.0 + resolution: "type-fest@npm:2.19.0" + checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb + languageName: node + linkType: hard + +"type-fest@npm:^3.0.0": + version: 3.13.1 + resolution: "type-fest@npm:3.13.1" + checksum: 10c0/547d22186f73a8c04590b70dcf63baff390078c75ea8acd366bbd510fd0646e348bd1970e47ecf795b7cff0b41d26e9c475c1fedd6ef5c45c82075fbf916b629 + languageName: node + linkType: hard + +"type-fest@npm:^4.26.1": + version: 4.39.1 + resolution: "type-fest@npm:4.39.1" + checksum: 10c0/f5bf302eb2e2f70658be1757aa578f4a09da3f65699b0b12b7ae5502ccea76e5124521a6e6b69540f442c3dc924c394202a2ab58718d0582725c7ac23c072594 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: "npm:^1.0.3" + es-errors: "npm:^1.3.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.14" + checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + for-each: "npm:^0.3.3" + gopd: "npm:^1.2.0" + has-proto: "npm:^1.2.0" + is-typed-array: "npm:^1.1.15" + reflect.getprototypeof: "npm:^1.0.9" + checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.7" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + is-typed-array: "npm:^1.1.13" + possible-typed-array-names: "npm:^1.0.0" + reflect.getprototypeof: "npm:^1.0.6" + checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 + languageName: node + linkType: hard + +"typedarray-to-buffer@npm:^3.1.5": + version: 3.1.5 + resolution: "typedarray-to-buffer@npm:3.1.5" + dependencies: + is-typedarray: "npm:^1.0.0" + checksum: 10c0/4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 + languageName: node + linkType: hard + +"types-eslintrc@npm:^1.0.3": + version: 1.0.3 + resolution: "types-eslintrc@npm:1.0.3" + dependencies: + types-json: "npm:^1.2.2" + checksum: 10c0/ae30c64095ad7cfde0b045ff85f59afe93eec9eaa64b53c0920525703402f04f795e2a07793eaf3496534d44268e3103f4d052d1d3839d01079d0690188cbd73 + languageName: node + linkType: hard + +"types-json@npm:^1.0.6, types-json@npm:^1.2.0, types-json@npm:^1.2.2": + version: 1.2.2 + resolution: "types-json@npm:1.2.2" + checksum: 10c0/042b2678d93721c768f0111ef5f0faa3b1aaba208c65d574d9fdffaa54cf3aa0b1badb7861acd1ba06753bef5463cd790c92e8c8a8962a890dc33c90310588b0 + languageName: node + linkType: hard + +"types-pkg-json@npm:^1.1.0": + version: 1.2.1 + resolution: "types-pkg-json@npm:1.2.1" + dependencies: + types-eslintrc: "npm:^1.0.3" + types-json: "npm:^1.2.2" + checksum: 10c0/4e2eefa8a946616d525b41ab9c7a92b672ce0f29cc7622df34608f09950ab4d015167c4ada6a4aa70de57f9275f4cd23e95f66c5f89d2e2b2a0871fe125ee2e9 + languageName: node + linkType: hard + +"typescript-eslint@npm:^8.24.1": + version: 8.29.0 + resolution: "typescript-eslint@npm:8.29.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.29.0" + "@typescript-eslint/parser": "npm:8.29.0" + "@typescript-eslint/utils": "npm:8.29.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/1438b80fc875acc65acc842dc870070be31d6a30f756a6d9985fadd063f4f568e74a83bac7aaf94d2320e434df3c033a6e2ab7258b1429cae2aa7c4b16fb5088 + languageName: node + linkType: hard + +"typescript@npm:5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e + languageName: node + linkType: hard + +"typescript@npm:^5.2.2": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A5.4.5#optional!builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + languageName: node + linkType: hard + +"ufo@npm:^1.5.4": + version: 1.5.4 + resolution: "ufo@npm:1.5.4" + checksum: 10c0/b5dc4dc435c49c9ef8890f1b280a19ee4d0954d1d6f9ab66ce62ce64dd04c7be476781531f952a07c678d51638d02ad4b98e16237be29149295b0f7c09cda765 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 10c0/83b0a90eca35f778e07cad9622b80c448b6aad457c9ff8e568afed978212b42930a95f9e1be943a1ffa4258a3340fbb899f41461131c05bb1d0a9c303aed8479 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" + dependencies: + call-bound: "npm:^1.0.3" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.1.0" + which-boxed-primitive: "npm:^1.1.1" + checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 + languageName: node + linkType: hard + +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + +"unicode-canonical-property-names-ecmascript@npm:^2.0.0": + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 10c0/f83bc492fdbe662860795ef37a85910944df7310cac91bd778f1c19ebc911e8b9cde84e703de631e5a2fcca3905e39896f8fc5fc6a44ddaf7f4aff1cda24f381 + languageName: node + linkType: hard + +"unicode-match-property-ecmascript@npm:^2.0.0": + version: 2.0.0 + resolution: "unicode-match-property-ecmascript@npm:2.0.0" + dependencies: + unicode-canonical-property-names-ecmascript: "npm:^2.0.0" + unicode-property-aliases-ecmascript: "npm:^2.0.0" + checksum: 10c0/4d05252cecaf5c8e36d78dc5332e03b334c6242faf7cf16b3658525441386c0a03b5f603d42cbec0f09bb63b9fd25c9b3b09667aee75463cac3efadae2cd17ec + languageName: node + linkType: hard + +"unicode-match-property-value-ecmascript@npm:^2.1.0": + version: 2.2.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" + checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d + languageName: node + linkType: hard + +"unicode-property-aliases-ecmascript@npm:^2.0.0": + version: 2.1.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" + checksum: 10c0/50ded3f8c963c7785e48c510a3b7c6bc4e08a579551489aa0349680a35b1ceceec122e33b2b6c1b579d0be2250f34bb163ac35f5f8695fe10bbc67fb757f0af8 + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: "npm:^3.0.0" + checksum: 10c0/55d95cd670c4a86117ebc34d394936d712d43b56db6bc511f9ca00f666373818bf9f075fb0ab76bcbfaf134592ef26bb75aad20786c1ff1ceba4457eaba90fb8 + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/617240eb921af803b47d322d75a71a363dacf2e56c29ae5d1404fad85f64f4ec81ef10ee4fd79215d0202cbe1e5a653edb0558d59c9c81d3bd538c2d58e4c026 + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"unique-string@npm:^2.0.0": + version: 2.0.0 + resolution: "unique-string@npm:2.0.0" + dependencies: + crypto-random-string: "npm:^2.0.0" + checksum: 10c0/11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b + languageName: node + linkType: hard + +"unique-string@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-string@npm:3.0.0" + dependencies: + crypto-random-string: "npm:^4.0.0" + checksum: 10c0/b35ea034b161b2a573666ec16c93076b4b6106b8b16c2415808d747ab3a0566b5db0c4be231d4b11cfbc16d7fd915c9d8a45884bff0e2db11b799775b2e1e017 + languageName: node + linkType: hard + +"universal-user-agent@npm:^6.0.0": + version: 6.0.1 + resolution: "universal-user-agent@npm:6.0.1" + checksum: 10c0/5c9c46ffe19a975e11e6443640ed4c9e0ce48fcc7203325757a8414ac49940ebb0f4667f2b1fa561489d1eb22cb2d05a0f7c82ec20c5cba42e58e188fb19b187 + languageName: node + linkType: hard + +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: 10c0/cedbe4d4ca3967edf24c0800cfc161c5a15e240dac28e3ce575c689abc11f2c81ccc6532c8752af3b40f9120fb5e454abecd359e164f4f6aa44c29cd37e194fe + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"unplugin@npm:^1.3.1": + version: 1.16.1 + resolution: "unplugin@npm:1.16.1" + dependencies: + acorn: "npm:^8.14.0" + webpack-virtual-modules: "npm:^0.6.2" + checksum: 10c0/dd5f8c5727d0135847da73cf03fb199107f1acf458167034886fda3405737dab871ad3926431b4f70e1e82cdac482ac1383cea4019d782a68515c8e3e611b6cc + languageName: node + linkType: hard + +"unrs-resolver@npm:^1.3.2": + version: 1.4.1 + resolution: "unrs-resolver@npm:1.4.1" + dependencies: + "@unrs/resolver-binding-darwin-arm64": "npm:1.4.1" + "@unrs/resolver-binding-darwin-x64": "npm:1.4.1" + "@unrs/resolver-binding-freebsd-x64": "npm:1.4.1" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.4.1" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.4.1" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.4.1" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.4.1" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.4.1" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.4.1" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.4.1" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.4.1" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.4.1" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.4.1" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.4.1" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.4.1" + dependenciesMeta: + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10c0/cc0b148d8fafeb303389fd10c8c2df8806e44b5aa6cec59ef1b7f8a64554f1f53a7a7de81a58bdd438d25a50b5045b1b8e192a9b8acd156fabff1206406316d4 + languageName: node + linkType: hard + +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10c0/d758e624c707d49f76f7511d75d09a8eda7f2020d231ec52b67ff4896bcf7013be3f9522d8375f57e586e9a2e827f5641c7e06ee46ab9c435fc2b2b2e9de517a + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 + languageName: node + linkType: hard + +"update-notifier@npm:^6.0.2": + version: 6.0.2 + resolution: "update-notifier@npm:6.0.2" + dependencies: + boxen: "npm:^7.0.0" + chalk: "npm:^5.0.1" + configstore: "npm:^6.0.0" + has-yarn: "npm:^3.0.0" + import-lazy: "npm:^4.0.0" + is-ci: "npm:^3.0.1" + is-installed-globally: "npm:^0.4.0" + is-npm: "npm:^6.0.0" + is-yarn-global: "npm:^0.4.0" + latest-version: "npm:^7.0.0" + pupa: "npm:^3.1.0" + semver: "npm:^7.3.7" + semver-diff: "npm:^4.0.0" + xdg-basedir: "npm:^5.1.0" + checksum: 10c0/ad3980073312df904133a6e6c554a7f9d0832ed6275e55f5a546313fe77a0f20f23a7b1b4aeb409e20a78afb06f4d3b2b28b332d9cfb55745b5d1ea155810bcc + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"url-join@npm:^4.0.0": + version: 4.0.1 + resolution: "url-join@npm:4.0.1" + checksum: 10c0/ac65e2c7c562d7b49b68edddcf55385d3e922bc1dd5d90419ea40b53b6de1607d1e45ceb71efb9d60da02c681d13c6cb3a1aa8b13fc0c989dfc219df97ee992d + languageName: node + linkType: hard + +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: "npm:^2.1.1" + requires-port: "npm:^1.0.0" + checksum: 10c0/bd5aa9389f896974beb851c112f63b466505a04b4807cea2e5a3b7092f6fbb75316f0491ea84e44f66fed55f1b440df5195d7e3a8203f64fcefa19d182f5be87 + languageName: node + linkType: hard + +"use-callback-ref@npm:^1.3.3": + version: 1.3.3 + resolution: "use-callback-ref@npm:1.3.3" + dependencies: + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/f887488c6e6075cdad4962979da1714b217bcb1ee009a9e57ce9a844bcfc4c3a99e93983dfc2e5af9e0913824d24e730090ff255e902c516dcb58d2d3837e01c + languageName: node + linkType: hard + +"use-debounce@npm:9.0.2": + version: 9.0.2 + resolution: "use-debounce@npm:9.0.2" + peerDependencies: + react: ">=16.8.0" + checksum: 10c0/42acc0228a104cefad00d4a134d27e10da541c6eb8502838ef15da61cf86b7d31bd8eeb2e2331dcb9c01142b322a87b9045ad8a0fdb9c8861ebde8da563211da + languageName: node + linkType: hard + +"use-sidecar@npm:^1.1.3": + version: 1.1.3 + resolution: "use-sidecar@npm:1.1.3" + dependencies: + detect-node-es: "npm:^1.1.0" + tslib: "npm:^2.0.0" + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/161599bf921cfaa41c85d2b01c871975ee99260f3e874c2d41c05890d41170297bdcf314bc5185e7a700de2034ac5b888e3efc8e9f35724f4918f53538d717c9 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.4.0": + version: 1.5.0 + resolution: "use-sync-external-store@npm:1.5.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 + languageName: node + linkType: hard + +"usehooks-ts@npm:^2.14.0": + version: 2.16.0 + resolution: "usehooks-ts@npm:2.16.0" + dependencies: + lodash.debounce: "npm:^4.0.8" + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + checksum: 10c0/0b7babf09b587cf7af71644dd603ee2efd820ec173c414af1c2afc2c61decc357738b093cabb6a881ac97d8a4e614723ee20096bddd459779f3a0786f4e6b2bf + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"util@npm:^0.12.5": + version: 0.12.5 + resolution: "util@npm:0.12.5" + dependencies: + inherits: "npm:^2.0.3" + is-arguments: "npm:^1.0.4" + is-generator-function: "npm:^1.0.7" + is-typed-array: "npm:^1.1.3" + which-typed-array: "npm:^1.1.2" + checksum: 10c0/c27054de2cea2229a66c09522d0fa1415fb12d861d08523a8846bf2e4cbf0079d4c3f725f09dcb87493549bcbf05f5798dce1688b53c6c17201a45759e7253f3 + languageName: node + linkType: hard + +"uuid@npm:^9.0.0": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 10c0/1607dd32ac7fc22f2d8f77051e6a64845c9bce5cd3dd8aa0070c074ec73e666a1f63c7b4e0f4bf2bc8b9d59dc85a15e17807446d9d2b17c8485fbc2147b27f9b + languageName: node + linkType: hard + +"vali-date@npm:^1.0.0": + version: 1.0.0 + resolution: "vali-date@npm:1.0.0" + checksum: 10c0/5755215f6734caab535f60af0a32bbbf2052c61b1a40668d773df78fd3754e4fe9da2ea5466731505f3e0a599acc209d5578c4b70488ed120fb03f0c2ab06449 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"validate-npm-package-name@npm:^3.0.0": + version: 3.0.0 + resolution: "validate-npm-package-name@npm:3.0.0" + dependencies: + builtins: "npm:^1.0.3" + checksum: 10c0/064f21f59aefae6cc286dd4a50b15d14adb0227e0facab4316197dfb8d06801669e997af5081966c15f7828a5e6ff1957bd20886aeb6b9d0fa430e4cb5db9c4a + languageName: node + linkType: hard + +"validate-npm-package-name@npm:^4.0.0": + version: 4.0.0 + resolution: "validate-npm-package-name@npm:4.0.0" + dependencies: + builtins: "npm:^5.0.0" + checksum: 10c0/d7f753c0aac0a2b8dd06752e7278d18165a21e28b5064d897a1b6f10350d857b339d6bd9e08dd140710433479940bec9ba151b619196780dc6e49dd8fbff6df8 + languageName: node + linkType: hard + +"vite-node@npm:1.6.1": + version: 1.6.1 + resolution: "vite-node@npm:1.6.1" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.4" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + vite: "npm:^5.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/4d96da9f11bd0df8b60c46e65a740edaad7dd2d1aff3cdb3da5714ea8c10b5f2683111b60bfe45545c7e8c1f33e7e8a5095573d5e9ba55f50a845233292c2e02 + languageName: node + linkType: hard + +"vite-tsconfig-paths@npm:^4.3.1": + version: 4.3.2 + resolution: "vite-tsconfig-paths@npm:4.3.2" + dependencies: + debug: "npm:^4.1.1" + globrex: "npm:^0.1.2" + tsconfck: "npm:^3.0.3" + peerDependencies: + vite: "*" + peerDependenciesMeta: + vite: + optional: true + checksum: 10c0/f390ac1d1c3992fc5ac50f9274c1090f8b55ab34a89ea88893db9a6924a3b26c9f64bc1163615150ad100749db73b6b2cf1d57f6cd60df6e762ceb5b8ad30024 + languageName: node + linkType: hard + +"vite@npm:^5.0.0, vite@npm:^5.1.4, vite@npm:^5.1.5": + version: 5.4.17 + resolution: "vite@npm:5.4.17" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/3322bd6d8da30cbc87b1b24cd14fdbca75abb36de81217d1062c8b4c574a1a0d28d11dfe23a3eed08b3d179d2bdc1510e0d7b9f3e1b722a45bd7631c7cec72eb + languageName: node + linkType: hard + +"vitest-canvas-mock@npm:^0.3.3": + version: 0.3.3 + resolution: "vitest-canvas-mock@npm:0.3.3" + dependencies: + jest-canvas-mock: "npm:~2.5.2" + peerDependencies: + vitest: "*" + checksum: 10c0/c14eec888d06e0a91706c2902cba115c6563de132d1b4c0f87897c550345674849cac3f62b36c4b3c1180ed352d25dd53525ccd2267d164ac1926557f58708b9 + languageName: node + linkType: hard + +"vitest@npm:^1.3.1": + version: 1.6.1 + resolution: "vitest@npm:1.6.1" + dependencies: + "@vitest/expect": "npm:1.6.1" + "@vitest/runner": "npm:1.6.1" + "@vitest/snapshot": "npm:1.6.1" + "@vitest/spy": "npm:1.6.1" + "@vitest/utils": "npm:1.6.1" + acorn-walk: "npm:^8.3.2" + chai: "npm:^4.3.10" + debug: "npm:^4.3.4" + execa: "npm:^8.0.1" + local-pkg: "npm:^0.5.0" + magic-string: "npm:^0.30.5" + pathe: "npm:^1.1.1" + picocolors: "npm:^1.0.0" + std-env: "npm:^3.5.0" + strip-literal: "npm:^2.0.0" + tinybench: "npm:^2.5.1" + tinypool: "npm:^0.8.3" + vite: "npm:^5.0.0" + vite-node: "npm:1.6.1" + why-is-node-running: "npm:^2.2.2" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 1.6.1 + "@vitest/ui": 1.6.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/511d27d7f697683964826db2fad7ac303f9bc7eeb59d9422111dc488371ccf1f9eed47ac3a80eb47ca86b7242228ba5ca9cc3613290830d0e916973768cac215 + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" + dependencies: + xml-name-validator: "npm:^5.0.0" + checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b + languageName: node + linkType: hard + +"walk-up-path@npm:^1.0.0": + version: 1.0.0 + resolution: "walk-up-path@npm:1.0.0" + checksum: 10c0/e2dc2346acfeec355c8af17095aa8689b57906f0f3ad5f3ff1b0a29a36ee41904608e9a3545a933a2cfa22f20905e2bbe5dd6469cb31b110c8e129c23103e985 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.0, wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db + languageName: node + linkType: hard + +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"webpack-virtual-modules@npm:^0.6.2": + version: 0.6.2 + resolution: "webpack-virtual-modules@npm:0.6.2" + checksum: 10c0/5ffbddf0e84bf1562ff86cf6fcf039c74edf09d78358a6904a09bbd4484e8bb6812dc385fe14330b715031892dcd8423f7a88278b57c9f5002c84c2860179add + languageName: node + linkType: hard + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df + languageName: node + linkType: hard + +"whatwg-url@npm:^14.0.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" + dependencies: + tr46: "npm:^5.1.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" + dependencies: + is-bigint: "npm:^1.1.0" + is-boolean-object: "npm:^1.2.1" + is-number-object: "npm:^1.1.1" + is-string: "npm:^1.1.1" + is-symbol: "npm:^1.1.1" + checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe + languageName: node + linkType: hard + +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: "npm:^1.0.2" + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.1.0" + is-finalizationregistry: "npm:^1.1.0" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.2.1" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.1.0" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.16" + checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + for-each: "npm:^0.3.5" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-tostringtag: "npm:^1.0.2" + checksum: 10c0/702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f + languageName: node + linkType: hard + +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: "npm:^2.0.0" + bin: + which: ./bin/which + checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.2.2": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 + languageName: node + linkType: hard + +"widest-line@npm:^4.0.1": + version: 4.0.1 + resolution: "widest-line@npm:4.0.1" + dependencies: + string-width: "npm:^5.0.1" + checksum: 10c0/7da9525ba45eaf3e4ed1a20f3dcb9b85bd9443962450694dae950f4bdd752839747bbc14713522b0b93080007de8e8af677a61a8c2114aa553ad52bde72d0f9c + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 10c0/7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "wrap-ansi@npm:3.0.1" + dependencies: + string-width: "npm:^2.1.1" + strip-ansi: "npm:^4.0.0" + checksum: 10c0/ad6fed8f242c26755badaf452da154122d0d862f8b7aab56e758466857f230efafdc5fbffca026650b947ac3fc0eb563df5c05b9e2190a52a4a68f4eef3d4555 + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^3.0.3": + version: 3.0.3 + resolution: "write-file-atomic@npm:3.0.3" + dependencies: + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 10c0/7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.0, write-file-atomic@npm:^4.0.1": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"ws@npm:^8.18.0, ws@npm:^8.2.3": + version: 8.18.1 + resolution: "ws@npm:8.18.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa + languageName: node + linkType: hard + +"xdg-basedir@npm:^5.0.1, xdg-basedir@npm:^5.1.0": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: 10c0/c88efabc71ffd996ba9ad8923a8cc1c7c020a03e2c59f0ffa72e06be9e724ad2a0fccef488757bc6ed3d8849d753dd25082d1035d95cb179e79eae4d034d0b80 + languageName: node + linkType: hard + +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 + languageName: node + linkType: hard + +"xtend@npm:~4.0.1": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yaml@npm:^2.1.3, yaml@npm:^2.2.2": + version: 2.7.1 + resolution: "yaml@npm:2.7.1" + bin: + yaml: bin.mjs + checksum: 10c0/ee2126398ab7d1fdde566b4013b68e36930b9e6d8e68b6db356875c99614c10d678b6f45597a145ff6d63814961221fc305bf9242af8bf7450177f8a68537590 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.2.1 + resolution: "yocto-queue@npm:1.2.1" + checksum: 10c0/5762caa3d0b421f4bdb7a1926b2ae2189fc6e4a14469258f183600028eb16db3e9e0306f46e8ebf5a52ff4b81a881f22637afefbef5399d6ad440824e9b27f9f + languageName: node + linkType: hard + +"yoctocolors-cjs@npm:^2.1.2": + version: 2.1.2 + resolution: "yoctocolors-cjs@npm:2.1.2" + checksum: 10c0/a0e36eb88fea2c7981eab22d1ba45e15d8d268626e6c4143305e2c1628fa17ebfaa40cd306161a8ce04c0a60ee0262058eab12567493d5eb1409780853454c6f + languageName: node + linkType: hard From 6a54f1f66ce6a760a605c40d07d7ff2deec3898d Mon Sep 17 00:00:00 2001 From: Corey Date: Wed, 28 May 2025 04:46:04 -0500 Subject: [PATCH 007/172] Add WebSocket guide --- docs/content/user-guides/websocket.md | 355 ++++++++++++++++++++++++++ docs/mkdocs.yml | 1 + 2 files changed, 356 insertions(+) create mode 100644 docs/content/user-guides/websocket.md diff --git a/docs/content/user-guides/websocket.md b/docs/content/user-guides/websocket.md new file mode 100644 index 000000000..cb122d90f --- /dev/null +++ b/docs/content/user-guides/websocket.md @@ -0,0 +1,355 @@ +--- +title: "Traefik WebSocket Documentation" +description: "How to configure WebSocket and WebSocket Secure (WSS) connections with Traefik Proxy." +--- + +# WebSocket + +Configuring Traefik to handle WebSocket and WebSocket Secure (WSS) connections. +{: .subtitle } + +## Overview + +WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. +WebSocket Secure (WSS) is the encrypted version of WebSocket, using TLS/SSL encryption. + +Traefik supports WebSocket and WebSocket Secure (WSS) out of the box. This guide will walk through examples of how to configure Traefik for different WebSocket scenarios. + +## Basic WebSocket Configuration + +A basic WebSocket configuration only requires defining a router and a service that points to your WebSocket server. + +```yaml tab="Docker & Swarm" +labels: + - "traefik.http.routers.my-websocket.rule=Host(`ws.example.com`)" + - "traefik.http.routers.my-websocket.service=my-websocket-service" + - "traefik.http.services.my-websocket-service.loadbalancer.server.port=8000" +``` + +```yaml tab="Kubernetes" +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: my-websocket-route +spec: + entryPoints: + - web + routes: + - match: Host(`ws.example.com`) + kind: Rule + services: + - name: my-websocket-service + port: 8000 +``` + +```yaml tab="File (YAML)" +http: + routers: + my-websocket: + rule: "Host(`ws.example.com`)" + service: my-websocket-service + + services: + my-websocket-service: + loadBalancer: + servers: + - url: "http://my-websocket-server:8000" +``` + +```toml tab="File (TOML)" +[http.routers] + [http.routers.my-websocket] + rule = "Host(`ws.example.com`)" + service = "my-websocket-service" + +[http.services] + [http.services.my-websocket-service] + [http.services.my-websocket-service.loadBalancer] + [[http.services.my-websocket-service.loadBalancer.servers]] + url = "http://my-websocket-server:8000" +``` + +## WebSocket Secure (WSS) Configuration + +WebSocket Secure (WSS) requires TLS configuration. +The client connects using the `wss://` protocol instead of `ws://`. + +```yaml tab="Docker & Swarm" +labels: + - "traefik.http.routers.my-websocket-secure.rule=Host(`wss.example.com`)" + - "traefik.http.routers.my-websocket-secure.service=my-websocket-service" + - "traefik.http.routers.my-websocket-secure.tls=true" + - "traefik.http.services.my-websocket-service.loadbalancer.server.port=8000" +``` + +```yaml tab="Kubernetes" +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: my-websocket-secure-route +spec: + entryPoints: + - websecure + routes: + - match: Host(`wss.example.com`) + kind: Rule + services: + - name: my-websocket-service + port: 8000 + tls: {} +``` + +```yaml tab="File (YAML)" +http: + routers: + my-websocket-secure: + rule: "Host(`wss.example.com`)" + service: my-websocket-service + tls: {} + + services: + my-websocket-service: + loadBalancer: + servers: + - url: "http://my-websocket-server:8000" +``` + +```toml tab="File (TOML)" +[http.routers] + [http.routers.my-websocket-secure] + rule = "Host(`wss.example.com`)" + service = "my-websocket-service" + [http.routers.my-websocket-secure.tls] + +[http.services] + [http.services.my-websocket-service] + [http.services.my-websocket-service.loadBalancer] + [[http.services.my-websocket-service.loadBalancer.servers]] + url = "http://my-websocket-server:8000" +``` + +## SSL Termination for WebSockets + +In this scenario, clients connect to Traefik using WSS (encrypted), but Traefik connects to your backend server using WS (unencrypted). +This is called SSL termination. + +```yaml tab="Docker & Swarm" +labels: + - "traefik.http.routers.my-wss-termination.rule=Host(`wss.example.com`)" + - "traefik.http.routers.my-wss-termination.service=my-ws-service" + - "traefik.http.routers.my-wss-termination.tls=true" + - "traefik.http.services.my-ws-service.loadbalancer.server.port=8000" +``` + +```yaml tab="Kubernetes" +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: my-wss-termination-route +spec: + entryPoints: + - websecure + routes: + - match: Host(`wss.example.com`) + kind: Rule + services: + - name: my-ws-service + port: 8000 + tls: {} +``` + +```yaml tab="File (YAML)" +http: + routers: + my-wss-termination: + rule: "Host(`wss.example.com`)" + service: my-ws-service + tls: {} + + services: + my-ws-service: + loadBalancer: + servers: + - url: "http://my-ws-server:8000" +``` + +```toml tab="File (TOML)" +[http.routers] + [http.routers.my-wss-termination] + rule = "Host(`wss.example.com`)" + service = "my-ws-service" + [http.routers.my-wss-termination.tls] + +[http.services] + [http.services.my-ws-service] + [http.services.my-ws-service.loadBalancer] + [[http.services.my-ws-service.loadBalancer.servers]] + url = "http://my-ws-server:8000" +``` + +## End-to-End WebSocket Secure (WSS) + +For end-to-end encryption, Traefik can be configured to connect to your backend using HTTPS. + +```yaml tab="Docker & Swarm" +labels: + - "traefik.http.routers.my-wss-e2e.rule=Host(`wss.example.com`)" + - "traefik.http.routers.my-wss-e2e.service=my-wss-service" + - "traefik.http.routers.my-wss-e2e.tls=true" + - "traefik.http.services.my-wss-service.loadbalancer.server.port=8443" + # If the backend uses a self-signed certificate + - "traefik.http.serversTransports.insecureTransport.insecureSkipVerify=true" + - "traefik.http.services.my-wss-service.loadBalancer.serversTransport=insecureTransport" +``` + +```yaml tab="Kubernetes" +apiVersion: traefik.io/v1alpha1 +kind: ServersTransport +metadata: + name: insecure-transport +spec: + insecureSkipVerify: true + +--- +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: my-wss-e2e-route +spec: + entryPoints: + - websecure + routes: + - match: Host(`wss.example.com`) + kind: Rule + services: + - name: my-wss-service + port: 8443 + serversTransport: insecure-transport + tls: {} +``` + +```yaml tab="File (YAML)" +http: + serversTransports: + insecureTransport: + insecureSkipVerify: true + + routers: + my-wss-e2e: + rule: "Host(`wss.example.com`)" + service: my-wss-service + tls: {} + + services: + my-wss-service: + loadBalancer: + serversTransport: insecureTransport + servers: + - url: "https://my-wss-server:8443" +``` + +```toml tab="File (TOML)" +[http.serversTransports] + [http.serversTransports.insecureTransport] + insecureSkipVerify = true + +[http.routers] + [http.routers.my-wss-e2e] + rule = "Host(`wss.example.com`)" + service = "my-wss-service" + [http.routers.my-wss-e2e.tls] + +[http.services] + [http.services.my-wss-service] + [http.services.my-wss-service.loadBalancer] + serversTransport = "insecureTransport" + [[http.services.my-wss-service.loadBalancer.servers]] + url = "https://my-wss-server:8443" +``` + +## EntryPoints Configuration for WebSockets + +In your Traefik static configuration, you'll need to define entryPoints for both WS and WSS: + +```yaml tab="File (YAML)" +entryPoints: + web: + address: ":80" + websecure: + address: ":443" +``` + +```toml tab="File (TOML)" +[entryPoints] + [entryPoints.web] + address = ":80" + [entryPoints.websecure] + address = ":443" +``` + +## Testing WebSocket Connections + +You can test your WebSocket configuration using various tools: + +1. Browser Developer Tools: Most modern browsers include WebSocket debugging in their developer tools. +2. WebSocket client tools like [wscat](https://github.com/websockets/wscat) or online tools like [Piesocket's WebSocket Tester](https://www.piesocket.com/websocket-tester). + +Example wscat commands: + +```bash +# Test standard WebSocket +wscat -c ws://ws.example.com + +# Test WebSocket Secure +wscat -c wss://wss.example.com +``` + +## Common Issues and Solutions + +### Headers and Origin Checks + +Some WebSocket servers implement origin checking. Traefik passes the original headers to your backend, including the `Origin` header. + +If you need to manipulate headers for WebSocket connections, you can use Traefik's Headers middleware: + +```yaml tab="Docker & Swarm" +labels: + - "traefik.http.middlewares.my-headers.headers.customrequestheaders.Origin=https://allowed-origin.com" + - "traefik.http.routers.my-websocket.middlewares=my-headers" +``` + +```yaml tab="Kubernetes" +apiVersion: traefik.io/v1alpha1 +kind: Middleware +metadata: + name: my-headers +spec: + headers: + customRequestHeaders: + Origin: "https://allowed-origin.com" + +--- +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: my-websocket-route +spec: + routes: + - match: Host(`ws.example.com`) + kind: Rule + middlewares: + - name: my-headers + services: + - name: my-websocket-service + port: 8000 +``` + +### Certificate Issues with WSS + +If you're experiencing certificate issues with WSS: + +1. Ensure your certificates are valid and not expired +2. For testing with self-signed certificates, configure your clients to accept them +3. When using Let's Encrypt, ensure your domain is properly configured + +For backends with self-signed certificates, use the `insecureSkipVerify` option in the ServersTransport configuration as shown in the examples above. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index fe10e3740..d8d50cd10 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -171,6 +171,7 @@ nav: - 'Kubernetes and Let''s Encrypt': 'user-guides/crd-acme/index.md' - 'Kubernetes and cert-manager': 'user-guides/cert-manager.md' - 'gRPC Examples': 'user-guides/grpc.md' + - 'WebSocket Examples': 'user-guides/websocket.md' - 'Docker': - 'Basic Example': 'user-guides/docker-compose/basic-example/index.md' - 'HTTPS with Let''s Encrypt': From 0b4058dde0cfc522a453c8b7ef45e31a09ef60da Mon Sep 17 00:00:00 2001 From: Thomas Mauran <78204354+thomas-mauran@users.noreply.github.com> Date: Wed, 28 May 2025 17:16:08 +0200 Subject: [PATCH 008/172] Remove obsolete version field in compose files --- docs/content/getting-started/quick-start.md | 4 ---- docs/content/observability/access-logs.md | 2 -- docs/content/providers/docker.md | 3 --- docs/content/providers/swarm.md | 5 ----- .../observability/logs-and-accesslogs.md | 2 -- .../reference/install-configuration/providers/docker.md | 3 --- .../reference/install-configuration/providers/swarm.md | 5 ----- .../routing-configuration/dynamic-configuration-methods.md | 2 -- .../routing-configuration/other-providers/docker.md | 3 --- .../reference/routing-configuration/other-providers/swarm.md | 3 --- docs/content/routing/providers/docker.md | 3 --- docs/content/routing/providers/swarm.md | 3 --- .../user-guides/docker-compose/acme-dns/docker-compose.yml | 2 -- .../docker-compose/acme-dns/docker-compose_secrets.yml | 2 -- .../user-guides/docker-compose/acme-http/docker-compose.yml | 2 -- .../user-guides/docker-compose/acme-tls/docker-compose.yml | 2 -- .../docker-compose/basic-example/docker-compose.yml | 2 -- .../user-guides/docker-compose/basic-example/index.md | 2 -- integration/resources/compose/access_log.yml | 1 - integration/resources/compose/allowlist.yml | 1 - integration/resources/compose/base.yml | 1 - integration/resources/compose/consul.yml | 1 - integration/resources/compose/consul_catalog.yml | 1 - integration/resources/compose/docker.yml | 1 - integration/resources/compose/error_pages.yml | 1 - integration/resources/compose/etcd.yml | 1 - integration/resources/compose/file.yml | 1 - integration/resources/compose/healthcheck.yml | 1 - integration/resources/compose/hostresolver.yml | 1 - integration/resources/compose/k8s.yml | 1 - integration/resources/compose/minimal.yml | 1 - integration/resources/compose/pebble.yml | 1 - integration/resources/compose/proxy-protocol.yml | 1 - integration/resources/compose/ratelimit.yml | 1 - integration/resources/compose/redis.yml | 1 - integration/resources/compose/redis_sentinel.yml | 1 - integration/resources/compose/reqacceptgrace.yml | 1 - integration/resources/compose/rest.yml | 1 - integration/resources/compose/retry.yml | 1 - integration/resources/compose/stats.yml | 1 - integration/resources/compose/tailscale.yml | 1 - integration/resources/compose/tcp.yml | 1 - integration/resources/compose/timeout.yml | 1 - integration/resources/compose/tlsclientheaders.yml | 1 - integration/resources/compose/tracing.yml | 1 - integration/resources/compose/udp.yml | 1 - integration/resources/compose/whitelist.yml | 1 - integration/resources/compose/zookeeper.yml | 1 - 48 files changed, 80 deletions(-) diff --git a/docs/content/getting-started/quick-start.md b/docs/content/getting-started/quick-start.md index a06bba0b1..4553a534f 100644 --- a/docs/content/getting-started/quick-start.md +++ b/docs/content/getting-started/quick-start.md @@ -15,8 +15,6 @@ A Use Case Using Docker Create a `docker-compose.yml` file where you will define a `reverse-proxy` service that uses the official Traefik image: ```yaml -version: '3' - services: reverse-proxy: # The official v3 Traefik docker image @@ -50,8 +48,6 @@ Now that you have a Traefik instance up and running, you will deploy new service Edit your `docker-compose.yml` file and add the following at the end of your file. ```yaml -version: '3' - services: ... diff --git a/docs/content/observability/access-logs.md b/docs/content/observability/access-logs.md index 4a74b814b..b2177d2ae 100644 --- a/docs/content/observability/access-logs.md +++ b/docs/content/observability/access-logs.md @@ -288,8 +288,6 @@ It is possible to configure the Traefik to timestamp in a specific timezone by e Example utilizing Docker Compose: ```yaml -version: "3.7" - services: traefik: image: traefik:v3.4 diff --git a/docs/content/providers/docker.md b/docs/content/providers/docker.md index e164ae349..df77e5e01 100644 --- a/docs/content/providers/docker.md +++ b/docs/content/providers/docker.md @@ -40,7 +40,6 @@ This provider works with [Docker (standalone) Engine](https://docs.docker.com/en Attaching labels to containers (in your docker compose file) ```yaml - version: "3" services: my-container: # ... @@ -162,8 +161,6 @@ See the [Docker API Access](#docker-api-access) section for more information. The docker-compose file shares the docker sock with the Traefik container ```yaml - version: '3' - services: traefik: image: traefik:v3.4 # The official v3 Traefik docker image diff --git a/docs/content/providers/swarm.md b/docs/content/providers/swarm.md index c5c158ba8..d1db245df 100644 --- a/docs/content/providers/swarm.md +++ b/docs/content/providers/swarm.md @@ -53,7 +53,6 @@ This provider works with [Docker Swarm Mode](https://docs.docker.com/engine/swar then that service is automatically assigned to the router. ```yaml - version: "3" services: my-container: deploy: @@ -176,8 +175,6 @@ docker service create \ ``` ```yml tab="With Docker Compose" -version: '3' - services: traefik: # ... @@ -208,8 +205,6 @@ See the [Docker Swarm API Access](#docker-api-access) section for more informati The docker-compose file shares the docker sock with the Traefik container ```yaml - version: '3' - services: traefik: image: traefik:v3.4 # The official v3 Traefik docker image diff --git a/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md b/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md index d13226ad4..d610fae4d 100644 --- a/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md +++ b/docs/content/reference/install-configuration/observability/logs-and-accesslogs.md @@ -199,8 +199,6 @@ It is possible to configure the Traefik to timestamp in a specific timezone by e Example utilizing Docker Compose: ```yaml -version: "3.7" - services: traefik: image: traefik:v3.4 diff --git a/docs/content/reference/install-configuration/providers/docker.md b/docs/content/reference/install-configuration/providers/docker.md index 74e250ae0..82463e8fc 100644 --- a/docs/content/reference/install-configuration/providers/docker.md +++ b/docs/content/reference/install-configuration/providers/docker.md @@ -29,7 +29,6 @@ providers: Attach labels to containers (in your Docker compose file) ```yaml -version: "3" services: my-container: # ... @@ -67,8 +66,6 @@ See the [Docker API Access](#docker-api-access) section for more information. The docker-compose file shares the docker sock with the Traefik container ```yaml - version: '3' - services: traefik: image: traefik:v3.1 # The official v3 Traefik docker image diff --git a/docs/content/reference/install-configuration/providers/swarm.md b/docs/content/reference/install-configuration/providers/swarm.md index becfdd577..92ac6a562 100644 --- a/docs/content/reference/install-configuration/providers/swarm.md +++ b/docs/content/reference/install-configuration/providers/swarm.md @@ -33,7 +33,6 @@ When there is only one service, and the router does not specify a service, then that service is automatically assigned to the router. ```yaml tab="Labels" -version: "3" services: my-container: deploy: @@ -73,8 +72,6 @@ See the [Docker Swarm API Access](#docker-api-access) section for more informati The docker-compose file shares the docker sock with the Traefik container ```yaml - version: '3' - services: traefik: image: traefik:v3.1 # The official v3 Traefik docker image @@ -405,8 +402,6 @@ docker service create \ ``` ```yml tab="With Docker Compose" -version: '3' - services: traefik: # ... diff --git a/docs/content/reference/routing-configuration/dynamic-configuration-methods.md b/docs/content/reference/routing-configuration/dynamic-configuration-methods.md index cb158d0b2..20b30222e 100644 --- a/docs/content/reference/routing-configuration/dynamic-configuration-methods.md +++ b/docs/content/reference/routing-configuration/dynamic-configuration-methods.md @@ -72,8 +72,6 @@ When using Docker or Amazon ECS, you can define routing configuration using cont When deploying a Docker container, you can specify labels to define routing rules and services: ```yaml - version: '3' - services: my-service: image: my-image diff --git a/docs/content/reference/routing-configuration/other-providers/docker.md b/docs/content/reference/routing-configuration/other-providers/docker.md index e17c9fc91..fb3cb0445 100644 --- a/docs/content/reference/routing-configuration/other-providers/docker.md +++ b/docs/content/reference/routing-configuration/other-providers/docker.md @@ -35,7 +35,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou Attaching labels to containers (in your docker compose file) ```yaml - version: "3" services: my-container: # ... @@ -48,7 +47,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou Forward requests for `http://example.com` to `http://:12345`: ```yaml - version: "3" services: my-container: # ... @@ -71,7 +69,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou In this example, requests are forwarded for `http://example-a.com` to `http://:8000` in addition to `http://example-b.com` forwarding to `http://:9000`: ```yaml - version: "3" services: my-container: # ... diff --git a/docs/content/reference/routing-configuration/other-providers/swarm.md b/docs/content/reference/routing-configuration/other-providers/swarm.md index 51b2371c0..824bb1470 100644 --- a/docs/content/reference/routing-configuration/other-providers/swarm.md +++ b/docs/content/reference/routing-configuration/other-providers/swarm.md @@ -48,7 +48,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate then that service is automatically assigned to the router. ```yaml - version: "3" services: my-container: deploy: @@ -67,7 +66,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate Forward requests for `http://example.com` to `http://:12345`: ```yaml - version: "3" services: my-container: # ... @@ -93,7 +91,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate In this example, requests are forwarded for `http://example-a.com` to `http://:8000` in addition to `http://example-b.com` forwarding to `http://:9000`: ```yaml - version: "3" services: my-container: # ... diff --git a/docs/content/routing/providers/docker.md b/docs/content/routing/providers/docker.md index aedbfe09f..29b180388 100644 --- a/docs/content/routing/providers/docker.md +++ b/docs/content/routing/providers/docker.md @@ -42,7 +42,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou Attaching labels to containers (in your docker compose file) ```yaml - version: "3" services: my-container: # ... @@ -55,7 +54,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou Forward requests for `http://example.com` to `http://:12345`: ```yaml - version: "3" services: my-container: # ... @@ -78,7 +76,6 @@ With Docker, Traefik can leverage labels attached to a container to generate rou In this example, requests are forwarded for `http://example-a.com` to `http://:8000` in addition to `http://example-b.com` forwarding to `http://:9000`: ```yaml - version: "3" services: my-container: # ... diff --git a/docs/content/routing/providers/swarm.md b/docs/content/routing/providers/swarm.md index bd9685ef6..915a57a6d 100644 --- a/docs/content/routing/providers/swarm.md +++ b/docs/content/routing/providers/swarm.md @@ -55,7 +55,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate then that service is automatically assigned to the router. ```yaml - version: "3" services: my-container: deploy: @@ -74,7 +73,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate Forward requests for `http://example.com` to `http://:12345`: ```yaml - version: "3" services: my-container: # ... @@ -100,7 +98,6 @@ With Docker Swarm, Traefik can leverage labels attached to a service to generate In this example, requests are forwarded for `http://example-a.com` to `http://:8000` in addition to `http://example-b.com` forwarding to `http://:9000`: ```yaml - version: "3" services: my-container: # ... diff --git a/docs/content/user-guides/docker-compose/acme-dns/docker-compose.yml b/docs/content/user-guides/docker-compose/acme-dns/docker-compose.yml index d276dc41e..b81bcd495 100644 --- a/docs/content/user-guides/docker-compose/acme-dns/docker-compose.yml +++ b/docs/content/user-guides/docker-compose/acme-dns/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.3" - services: traefik: diff --git a/docs/content/user-guides/docker-compose/acme-dns/docker-compose_secrets.yml b/docs/content/user-guides/docker-compose/acme-dns/docker-compose_secrets.yml index ce629d8f2..74d70f749 100644 --- a/docs/content/user-guides/docker-compose/acme-dns/docker-compose_secrets.yml +++ b/docs/content/user-guides/docker-compose/acme-dns/docker-compose_secrets.yml @@ -1,5 +1,3 @@ -version: "3.3" - secrets: ovh_endpoint: file: "./secrets/ovh_endpoint.secret" diff --git a/docs/content/user-guides/docker-compose/acme-http/docker-compose.yml b/docs/content/user-guides/docker-compose/acme-http/docker-compose.yml index 82c248a68..6f54ab79c 100644 --- a/docs/content/user-guides/docker-compose/acme-http/docker-compose.yml +++ b/docs/content/user-guides/docker-compose/acme-http/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.3" - services: traefik: diff --git a/docs/content/user-guides/docker-compose/acme-tls/docker-compose.yml b/docs/content/user-guides/docker-compose/acme-tls/docker-compose.yml index e3faaa3ce..6e2b3fa72 100644 --- a/docs/content/user-guides/docker-compose/acme-tls/docker-compose.yml +++ b/docs/content/user-guides/docker-compose/acme-tls/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.3" - services: traefik: diff --git a/docs/content/user-guides/docker-compose/basic-example/docker-compose.yml b/docs/content/user-guides/docker-compose/basic-example/docker-compose.yml index 3e9f68fa7..2491de7dc 100644 --- a/docs/content/user-guides/docker-compose/basic-example/docker-compose.yml +++ b/docs/content/user-guides/docker-compose/basic-example/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.3" - services: traefik: diff --git a/docs/content/user-guides/docker-compose/basic-example/index.md b/docs/content/user-guides/docker-compose/basic-example/index.md index f6d395b4a..35a5fe39f 100644 --- a/docs/content/user-guides/docker-compose/basic-example/index.md +++ b/docs/content/user-guides/docker-compose/basic-example/index.md @@ -23,8 +23,6 @@ Create a `docker-compose.yml` file with the following content: You can use a [pre-existing network](https://docs.docker.com/compose/networking/#use-a-pre-existing-network "Link to Docker Compose networking docs") too. ```yaml - version: "3.3" - networks: traefiknet: {} diff --git a/integration/resources/compose/access_log.yml b/integration/resources/compose/access_log.yml index c5be8f9e4..a5e4f5d44 100644 --- a/integration/resources/compose/access_log.yml +++ b/integration/resources/compose/access_log.yml @@ -1,4 +1,3 @@ -version: "3.8" services: server0: image: traefik/whoami diff --git a/integration/resources/compose/allowlist.yml b/integration/resources/compose/allowlist.yml index 0fd241322..f5cd10680 100644 --- a/integration/resources/compose/allowlist.yml +++ b/integration/resources/compose/allowlist.yml @@ -1,4 +1,3 @@ -version: "3.8" services: noOverrideAllowlist: image: traefik/whoami diff --git a/integration/resources/compose/base.yml b/integration/resources/compose/base.yml index 2d6380051..54a5f2f8e 100644 --- a/integration/resources/compose/base.yml +++ b/integration/resources/compose/base.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/consul.yml b/integration/resources/compose/consul.yml index 041ba0b45..0d1f343ba 100644 --- a/integration/resources/compose/consul.yml +++ b/integration/resources/compose/consul.yml @@ -1,4 +1,3 @@ -version: "3.8" services: consul: image: consul:1.6 diff --git a/integration/resources/compose/consul_catalog.yml b/integration/resources/compose/consul_catalog.yml index 6a0fd279c..949333a39 100644 --- a/integration/resources/compose/consul_catalog.yml +++ b/integration/resources/compose/consul_catalog.yml @@ -1,4 +1,3 @@ -version: "3.8" services: consul: image: consul:1.6.2 diff --git a/integration/resources/compose/docker.yml b/integration/resources/compose/docker.yml index b16571a4b..7ee4492cf 100644 --- a/integration/resources/compose/docker.yml +++ b/integration/resources/compose/docker.yml @@ -1,4 +1,3 @@ -version: "3.8" services: simple: image: swarm:1.0.0 diff --git a/integration/resources/compose/error_pages.yml b/integration/resources/compose/error_pages.yml index 03cc13f80..3f2c40e6b 100644 --- a/integration/resources/compose/error_pages.yml +++ b/integration/resources/compose/error_pages.yml @@ -1,4 +1,3 @@ -version: "3.8" services: nginx1: image: nginx:1.25.3-alpine3.18 diff --git a/integration/resources/compose/etcd.yml b/integration/resources/compose/etcd.yml index 6a3b34fe9..02529171a 100644 --- a/integration/resources/compose/etcd.yml +++ b/integration/resources/compose/etcd.yml @@ -1,4 +1,3 @@ -version: "3.8" services: etcd: image: quay.io/coreos/etcd:v3.5.14 diff --git a/integration/resources/compose/file.yml b/integration/resources/compose/file.yml index 52e973e53..3e37129b2 100644 --- a/integration/resources/compose/file.yml +++ b/integration/resources/compose/file.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/healthcheck.yml b/integration/resources/compose/healthcheck.yml index 9419f4bce..ee9be620f 100644 --- a/integration/resources/compose/healthcheck.yml +++ b/integration/resources/compose/healthcheck.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/hostresolver.yml b/integration/resources/compose/hostresolver.yml index 680962006..424b832ce 100644 --- a/integration/resources/compose/hostresolver.yml +++ b/integration/resources/compose/hostresolver.yml @@ -1,4 +1,3 @@ -version: "3.8" services: server1: image: traefik/whoami diff --git a/integration/resources/compose/k8s.yml b/integration/resources/compose/k8s.yml index f14b7abdb..51e46b0be 100644 --- a/integration/resources/compose/k8s.yml +++ b/integration/resources/compose/k8s.yml @@ -1,4 +1,3 @@ -version: "3.8" services: server: image: rancher/k3s:v1.21.14-k3s1 diff --git a/integration/resources/compose/minimal.yml b/integration/resources/compose/minimal.yml index acb12804e..911b12d38 100644 --- a/integration/resources/compose/minimal.yml +++ b/integration/resources/compose/minimal.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/pebble.yml b/integration/resources/compose/pebble.yml index f39dc1378..4e9eac58b 100644 --- a/integration/resources/compose/pebble.yml +++ b/integration/resources/compose/pebble.yml @@ -1,4 +1,3 @@ -version: "3.8" services: pebble: image: letsencrypt/pebble:v2.3.1 diff --git a/integration/resources/compose/proxy-protocol.yml b/integration/resources/compose/proxy-protocol.yml index 8fa69a9ba..3d8339330 100644 --- a/integration/resources/compose/proxy-protocol.yml +++ b/integration/resources/compose/proxy-protocol.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami: image: traefik/whoami diff --git a/integration/resources/compose/ratelimit.yml b/integration/resources/compose/ratelimit.yml index 5d9d6ec1e..414aff839 100644 --- a/integration/resources/compose/ratelimit.yml +++ b/integration/resources/compose/ratelimit.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/redis.yml b/integration/resources/compose/redis.yml index 09bbeacad..bc5e657b3 100644 --- a/integration/resources/compose/redis.yml +++ b/integration/resources/compose/redis.yml @@ -1,4 +1,3 @@ -version: "3.8" services: redis: image: redis:5.0 diff --git a/integration/resources/compose/redis_sentinel.yml b/integration/resources/compose/redis_sentinel.yml index 1737c2a1a..3f76aa12f 100644 --- a/integration/resources/compose/redis_sentinel.yml +++ b/integration/resources/compose/redis_sentinel.yml @@ -1,4 +1,3 @@ -version: "3.8" services: master: image: redis diff --git a/integration/resources/compose/reqacceptgrace.yml b/integration/resources/compose/reqacceptgrace.yml index 8fa69a9ba..3d8339330 100644 --- a/integration/resources/compose/reqacceptgrace.yml +++ b/integration/resources/compose/reqacceptgrace.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami: image: traefik/whoami diff --git a/integration/resources/compose/rest.yml b/integration/resources/compose/rest.yml index 251568165..fd0dedb04 100644 --- a/integration/resources/compose/rest.yml +++ b/integration/resources/compose/rest.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/retry.yml b/integration/resources/compose/retry.yml index 8fa69a9ba..3d8339330 100644 --- a/integration/resources/compose/retry.yml +++ b/integration/resources/compose/retry.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami: image: traefik/whoami diff --git a/integration/resources/compose/stats.yml b/integration/resources/compose/stats.yml index 599fed311..206fa5187 100644 --- a/integration/resources/compose/stats.yml +++ b/integration/resources/compose/stats.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami1: image: traefik/whoami diff --git a/integration/resources/compose/tailscale.yml b/integration/resources/compose/tailscale.yml index dbad56561..70e5d796c 100644 --- a/integration/resources/compose/tailscale.yml +++ b/integration/resources/compose/tailscale.yml @@ -1,4 +1,3 @@ -version: "3.8" services: tailscaled: hostname: traefik-tests-gw # This will become the tailscale device name diff --git a/integration/resources/compose/tcp.yml b/integration/resources/compose/tcp.yml index cd7fc0627..14e2d413c 100644 --- a/integration/resources/compose/tcp.yml +++ b/integration/resources/compose/tcp.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami-a: image: traefik/whoamitcp diff --git a/integration/resources/compose/timeout.yml b/integration/resources/compose/timeout.yml index 6e415b9b0..de629c4db 100644 --- a/integration/resources/compose/timeout.yml +++ b/integration/resources/compose/timeout.yml @@ -1,4 +1,3 @@ -version: "3.8" services: timeoutEndpoint: image: yaman/timeout diff --git a/integration/resources/compose/tlsclientheaders.yml b/integration/resources/compose/tlsclientheaders.yml index ef16f5f36..ae03ecbae 100644 --- a/integration/resources/compose/tlsclientheaders.yml +++ b/integration/resources/compose/tlsclientheaders.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami: image: traefik/whoami diff --git a/integration/resources/compose/tracing.yml b/integration/resources/compose/tracing.yml index 314dd66dc..8a2a6d514 100644 --- a/integration/resources/compose/tracing.yml +++ b/integration/resources/compose/tracing.yml @@ -1,4 +1,3 @@ -version: "3.8" services: tempo: hostname: tempo diff --git a/integration/resources/compose/udp.yml b/integration/resources/compose/udp.yml index ce2633199..0c001c829 100644 --- a/integration/resources/compose/udp.yml +++ b/integration/resources/compose/udp.yml @@ -1,4 +1,3 @@ -version: "3.8" services: whoami-a: image: traefik/whoamiudp:latest diff --git a/integration/resources/compose/whitelist.yml b/integration/resources/compose/whitelist.yml index 790ce52b7..ee08b935e 100644 --- a/integration/resources/compose/whitelist.yml +++ b/integration/resources/compose/whitelist.yml @@ -1,4 +1,3 @@ -version: "3.8" services: noOverrideWhitelist: image: traefik/whoami diff --git a/integration/resources/compose/zookeeper.yml b/integration/resources/compose/zookeeper.yml index 9861c1437..b086f24f3 100644 --- a/integration/resources/compose/zookeeper.yml +++ b/integration/resources/compose/zookeeper.yml @@ -1,4 +1,3 @@ -version: "3.8" services: zookeeper: image: zookeeper:3.5 From cd16321dd9c25bb47a2e9417b2a4a75959be63d0 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Mon, 2 Jun 2025 10:36:05 +0200 Subject: [PATCH 009/172] Bump to go1.24 Co-authored-by: Romain --- .github/workflows/build.yaml | 2 +- .github/workflows/experimental.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/test-integration.yaml | 2 +- .github/workflows/test-unit.yaml | 2 +- .github/workflows/validate.yaml | 2 +- go.mod | 2 +- pkg/api/handler_http_test.go | 5 ++- pkg/api/handler_tcp_test.go | 3 +- pkg/api/handler_udp_test.go | 3 +- pkg/config/runtime/runtime_http_test.go | 3 +- pkg/config/runtime/runtime_tcp_test.go | 3 +- pkg/config/runtime/runtime_udp_test.go | 3 +- pkg/healthcheck/healthcheck_test.go | 4 +-- pkg/log/log_test.go | 3 +- pkg/metrics/datadog_test.go | 5 ++- pkg/metrics/influxdb2_test.go | 3 +- pkg/metrics/influxdb_test.go | 5 ++- pkg/metrics/prometheus_test.go | 11 +++--- pkg/metrics/statsd_test.go | 5 ++- pkg/middlewares/accesslog/logger_test.go | 2 +- pkg/middlewares/addprefix/add_prefix_test.go | 5 ++- pkg/middlewares/auth/basic_auth_test.go | 15 ++++---- pkg/middlewares/auth/digest_auth_test.go | 7 ++-- pkg/middlewares/auth/forward_test.go | 15 ++++---- pkg/middlewares/buffering/buffering_test.go | 3 +- pkg/middlewares/compress/compress_test.go | 23 ++++++------- .../customerrors/custom_errors_test.go | 6 ++-- pkg/middlewares/headers/headers_test.go | 11 +++--- .../ipallowlist/ip_allowlist_test.go | 5 ++- .../ipwhitelist/ip_whitelist_test.go | 5 ++- .../pass_tls_client_cert_test.go | 5 ++- pkg/middlewares/pipelining/pipelining_test.go | 7 ++-- .../ratelimiter/rate_limiter_test.go | 5 ++- pkg/middlewares/recovery/recovery_test.go | 3 +- .../redirect/redirect_regex_test.go | 3 +- .../redirect/redirect_scheme_test.go | 3 +- .../replacepath/replace_path_test.go | 3 +- .../replace_path_regex_test.go | 3 +- .../requestdecorator/hostresolver_test.go | 3 +- pkg/middlewares/retry/retry_test.go | 17 +++++----- .../stripprefix/strip_prefix_test.go | 3 +- .../strip_prefix_regex_test.go | 3 +- .../tcp/inflightconn/inflight_conn_test.go | 3 +- .../tcp/ipallowlist/ip_allowlist_test.go | 4 +-- .../tcp/ipwhitelist/ip_whitelist_test.go | 4 +-- pkg/middlewares/tracing/entrypoint_test.go | 3 +- pkg/middlewares/tracing/forwarder_test.go | 3 +- pkg/provider/acme/local_store_test.go | 5 ++- pkg/provider/acme/provider_test.go | 11 +++--- pkg/provider/aggregator/aggregator_test.go | 3 +- pkg/provider/consulcatalog/config_test.go | 5 ++- pkg/provider/docker/config_test.go | 15 ++++---- pkg/provider/docker/swarm_test.go | 10 +++--- pkg/provider/ecs/config_test.go | 5 ++- pkg/provider/file/file_test.go | 9 +++-- pkg/provider/http/http_test.go | 5 ++- .../kubernetes/crd/kubernetes_test.go | 13 ++++--- .../kubernetes/gateway/kubernetes_test.go | 9 +++-- .../kubernetes/ingress/client_test.go | 9 +++-- .../kubernetes/ingress/kubernetes_test.go | 9 +++-- pkg/provider/kv/kv_test.go | 7 ++-- pkg/provider/marathon/config_test.go | 7 ++-- pkg/provider/nomad/config_test.go | 11 +++--- pkg/provider/nomad/nomad_test.go | 3 +- pkg/provider/rancher/config_test.go | 3 +- pkg/provider/traefik/internal_test.go | 3 +- pkg/safe/routine_test.go | 6 ++-- pkg/server/configurationwatcher_test.go | 26 +++++++------- pkg/server/middleware/middlewares_test.go | 9 +++-- pkg/server/provider/provider_test.go | 20 +++++------ pkg/server/router/router_test.go | 17 +++++----- pkg/server/router/tcp/manager_test.go | 9 +++-- pkg/server/router/tcp/router_test.go | 5 ++- pkg/server/router/udp/router_test.go | 3 +- pkg/server/server_entrypoint_tcp.go | 30 ++++++---------- .../server_entrypoint_tcp_http3_test.go | 13 ++++--- pkg/server/server_entrypoint_tcp_test.go | 34 ++++++++++--------- pkg/server/server_entrypoint_udp_test.go | 5 ++- .../loadbalancer/failover/failover_test.go | 15 ++++---- .../loadbalancer/mirror/mirror_test.go | 13 ++++--- .../service/loadbalancer/wrr/wrr_test.go | 18 +++++----- pkg/server/service/roundtripper_test.go | 3 +- pkg/server/service/service_test.go | 18 +++++----- pkg/server/service/tcp/service_test.go | 3 +- pkg/server/service/udp/service_test.go | 3 +- pkg/tls/tlsmanager_test.go | 9 +++-- pkg/types/tls_test.go | 3 +- 88 files changed, 284 insertions(+), 362 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0122f29e6..5d392a685 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/experimental.yaml b/.github/workflows/experimental.yaml index 76959bbd5..fd0b76e4c 100644 --- a/.github/workflows/experimental.yaml +++ b/.github/workflows/experimental.yaml @@ -7,7 +7,7 @@ on: - v* env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 821d639d3..d167180fe 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -6,7 +6,7 @@ on: - 'v*.*.*' env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' CGO_ENABLED: 0 VERSION: ${{ github.ref_name }} TRAEFIKER_EMAIL: "traefiker@traefik.io" diff --git a/.github/workflows/test-integration.yaml b/.github/workflows/test-integration.yaml index f8eac5dc6..806148268 100644 --- a/.github/workflows/test-integration.yaml +++ b/.github/workflows/test-integration.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' CGO_ENABLED: 0 jobs: diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index 7d4a0fa66..ef82911e2 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -10,7 +10,7 @@ on: - 'script/gcg/**' env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' jobs: diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml index 4ed5faec5..8f9b0f643 100644 --- a/.github/workflows/validate.yaml +++ b/.github/workflows/validate.yaml @@ -6,7 +6,7 @@ on: - '*' env: - GO_VERSION: '1.23' + GO_VERSION: '1.24' GOLANGCI_LINT_VERSION: v2.0.2 MISSPELL_VERSION: v0.6.0 diff --git a/go.mod b/go.mod index 970fd883e..923f17d85 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/traefik/traefik/v2 -go 1.23.0 +go 1.24.0 require ( github.com/BurntSushi/toml v1.5.0 diff --git a/pkg/api/handler_http_test.go b/pkg/api/handler_http_test.go index 7c1d7fb4c..0e5079f61 100644 --- a/pkg/api/handler_http_test.go +++ b/pkg/api/handler_http_test.go @@ -1,7 +1,6 @@ package api import ( - "context" "encoding/json" "fmt" "io" @@ -926,8 +925,8 @@ func TestHandler_HTTP(t *testing.T) { rtConf := &test.conf // To lazily initialize the Statuses. rtConf.PopulateUsedBy() - rtConf.GetRoutersByEntryPoints(context.Background(), []string{"web"}, false) - rtConf.GetRoutersByEntryPoints(context.Background(), []string{"web"}, true) + rtConf.GetRoutersByEntryPoints(t.Context(), []string{"web"}, false) + rtConf.GetRoutersByEntryPoints(t.Context(), []string{"web"}, true) handler := New(static.Configuration{API: &static.API{}, Global: &static.Global{}}, rtConf) server := httptest.NewServer(handler.createRouter()) diff --git a/pkg/api/handler_tcp_test.go b/pkg/api/handler_tcp_test.go index af79bbce8..7566e4dd5 100644 --- a/pkg/api/handler_tcp_test.go +++ b/pkg/api/handler_tcp_test.go @@ -1,7 +1,6 @@ package api import ( - "context" "encoding/json" "io" "net/http" @@ -797,7 +796,7 @@ func TestHandler_TCP(t *testing.T) { rtConf := &test.conf // To lazily initialize the Statuses. rtConf.PopulateUsedBy() - rtConf.GetTCPRoutersByEntryPoints(context.Background(), []string{"web"}) + rtConf.GetTCPRoutersByEntryPoints(t.Context(), []string{"web"}) handler := New(static.Configuration{API: &static.API{}, Global: &static.Global{}}, rtConf) server := httptest.NewServer(handler.createRouter()) diff --git a/pkg/api/handler_udp_test.go b/pkg/api/handler_udp_test.go index 9f230c466..04429fc95 100644 --- a/pkg/api/handler_udp_test.go +++ b/pkg/api/handler_udp_test.go @@ -1,7 +1,6 @@ package api import ( - "context" "encoding/json" "io" "net/http" @@ -536,7 +535,7 @@ func TestHandler_UDP(t *testing.T) { rtConf := &test.conf // To lazily initialize the Statuses. rtConf.PopulateUsedBy() - rtConf.GetUDPRoutersByEntryPoints(context.Background(), []string{"web"}) + rtConf.GetUDPRoutersByEntryPoints(t.Context(), []string{"web"}) handler := New(static.Configuration{API: &static.API{}, Global: &static.Global{}}, rtConf) server := httptest.NewServer(handler.createRouter()) diff --git a/pkg/config/runtime/runtime_http_test.go b/pkg/config/runtime/runtime_http_test.go index 7ca957472..4d9dbd630 100644 --- a/pkg/config/runtime/runtime_http_test.go +++ b/pkg/config/runtime/runtime_http_test.go @@ -1,7 +1,6 @@ package runtime import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -211,7 +210,7 @@ func TestGetRoutersByEntryPoints(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() runtimeConfig := NewConfig(test.conf) - actual := runtimeConfig.GetRoutersByEntryPoints(context.Background(), test.entryPoints, false) + actual := runtimeConfig.GetRoutersByEntryPoints(t.Context(), test.entryPoints, false) assert.Equal(t, test.expected, actual) }) } diff --git a/pkg/config/runtime/runtime_tcp_test.go b/pkg/config/runtime/runtime_tcp_test.go index b30509325..fc67336b6 100644 --- a/pkg/config/runtime/runtime_tcp_test.go +++ b/pkg/config/runtime/runtime_tcp_test.go @@ -1,7 +1,6 @@ package runtime import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -211,7 +210,7 @@ func TestGetTCPRoutersByEntryPoints(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() runtimeConfig := NewConfig(test.conf) - actual := runtimeConfig.GetTCPRoutersByEntryPoints(context.Background(), test.entryPoints) + actual := runtimeConfig.GetTCPRoutersByEntryPoints(t.Context(), test.entryPoints) assert.Equal(t, test.expected, actual) }) } diff --git a/pkg/config/runtime/runtime_udp_test.go b/pkg/config/runtime/runtime_udp_test.go index c43972674..d4bc0eaf4 100644 --- a/pkg/config/runtime/runtime_udp_test.go +++ b/pkg/config/runtime/runtime_udp_test.go @@ -1,7 +1,6 @@ package runtime import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -192,7 +191,7 @@ func TestGetUDPRoutersByEntryPoints(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() runtimeConfig := NewConfig(test.conf) - actual := runtimeConfig.GetUDPRoutersByEntryPoints(context.Background(), test.entryPoints) + actual := runtimeConfig.GetUDPRoutersByEntryPoints(t.Context(), test.entryPoints) assert.Equal(t, test.expected, actual) }) } diff --git a/pkg/healthcheck/healthcheck_test.go b/pkg/healthcheck/healthcheck_test.go index 4fcebde3b..e90d05526 100644 --- a/pkg/healthcheck/healthcheck_test.go +++ b/pkg/healthcheck/healthcheck_test.go @@ -101,7 +101,7 @@ func TestSetBackendsConfiguration(t *testing.T) { // The context is passed to the health check and canonically canceled by // the test server once all expected requests have been received. - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() ts := newTestServer(cancel, test.healthSequence) defer ts.Close() @@ -568,7 +568,7 @@ func TestNotFollowingRedirects(t *testing.T) { })) defer redirectTestServer.Close() - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(t.Context()) defer cancel() server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { diff --git a/pkg/log/log_test.go b/pkg/log/log_test.go index 704f2a83b..083b7b547 100644 --- a/pkg/log/log_test.go +++ b/pkg/log/log_test.go @@ -2,7 +2,6 @@ package log import ( "bytes" - "context" "strings" "testing" @@ -42,7 +41,7 @@ func TestLog(t *testing.T) { var buffer bytes.Buffer SetOutput(&buffer) - ctx := context.Background() + ctx := t.Context() for key, value := range test.fields { ctx = With(ctx, Str(key, value)) diff --git a/pkg/metrics/datadog_test.go b/pkg/metrics/datadog_test.go index e4b13cb15..26649dc31 100644 --- a/pkg/metrics/datadog_test.go +++ b/pkg/metrics/datadog_test.go @@ -1,7 +1,6 @@ package metrics import ( - "context" "net/http" "strconv" "testing" @@ -17,7 +16,7 @@ func TestDatadog(t *testing.T) { // This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond udp.Timeout = 5 * time.Second - datadogRegistry := RegisterDatadog(context.Background(), &types.Datadog{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) + datadogRegistry := RegisterDatadog(t.Context(), &types.Datadog{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) defer StopDatadog() if !datadogRegistry.IsEpEnabled() || !datadogRegistry.IsRouterEnabled() || !datadogRegistry.IsSvcEnabled() { @@ -35,7 +34,7 @@ func TestDatadogWithPrefix(t *testing.T) { // This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond udp.Timeout = 5 * time.Second - datadogRegistry := RegisterDatadog(context.Background(), &types.Datadog{Prefix: "testPrefix", Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) + datadogRegistry := RegisterDatadog(t.Context(), &types.Datadog{Prefix: "testPrefix", Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) testDatadogRegistry(t, "testPrefix", datadogRegistry) } diff --git a/pkg/metrics/influxdb2_test.go b/pkg/metrics/influxdb2_test.go index de20bb4b3..7a81f23d4 100644 --- a/pkg/metrics/influxdb2_test.go +++ b/pkg/metrics/influxdb2_test.go @@ -1,7 +1,6 @@ package metrics import ( - "context" "fmt" "io" "net/http" @@ -27,7 +26,7 @@ func TestInfluxDB2(t *testing.T) { })) defer ts.Close() - influxDB2Registry := RegisterInfluxDB2(context.Background(), + influxDB2Registry := RegisterInfluxDB2(t.Context(), &types.InfluxDB2{ Address: ts.URL, Token: "test-token", diff --git a/pkg/metrics/influxdb_test.go b/pkg/metrics/influxdb_test.go index bcec37b3f..ec1679866 100644 --- a/pkg/metrics/influxdb_test.go +++ b/pkg/metrics/influxdb_test.go @@ -1,7 +1,6 @@ package metrics import ( - "context" "fmt" "io" "net/http" @@ -23,7 +22,7 @@ func TestInfluxDB(t *testing.T) { udp.Timeout = 5 * time.Second influxDBClient = nil - influxDBRegistry := RegisterInfluxDB(context.Background(), + influxDBRegistry := RegisterInfluxDB(t.Context(), &types.InfluxDB{ Address: ":8089", PushInterval: ptypes.Duration(time.Second), @@ -147,7 +146,7 @@ func TestInfluxDBHTTP(t *testing.T) { defer ts.Close() influxDBClient = nil - influxDBRegistry := RegisterInfluxDB(context.Background(), + influxDBRegistry := RegisterInfluxDB(t.Context(), &types.InfluxDB{ Address: ts.URL, Protocol: "http", diff --git a/pkg/metrics/prometheus_test.go b/pkg/metrics/prometheus_test.go index 7be5cbf64..953acfd62 100644 --- a/pkg/metrics/prometheus_test.go +++ b/pkg/metrics/prometheus_test.go @@ -1,7 +1,6 @@ package metrics import ( - "context" "fmt" "net/http" "strconv" @@ -70,7 +69,7 @@ func TestRegisterPromState(t *testing.T) { if test.initPromState { initStandardRegistry(prom) } - if registerPromState(context.Background()) { + if registerPromState(t.Context()) { actualNbRegistries++ } if test.unregisterPromState { @@ -91,7 +90,7 @@ func TestPrometheus(t *testing.T) { promRegistry = prometheus.NewRegistry() t.Cleanup(promState.reset) - prometheusRegistry := RegisterPrometheus(context.Background(), &types.Prometheus{ + prometheusRegistry := RegisterPrometheus(t.Context(), &types.Prometheus{ AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true, @@ -443,7 +442,7 @@ func TestPrometheusMetricRemoval(t *testing.T) { promRegistry = prometheus.NewRegistry() t.Cleanup(promState.reset) - prometheusRegistry := RegisterPrometheus(context.Background(), &types.Prometheus{AddEntryPointsLabels: true, AddServicesLabels: true, AddRoutersLabels: true}) + prometheusRegistry := RegisterPrometheus(t.Context(), &types.Prometheus{AddEntryPointsLabels: true, AddServicesLabels: true, AddRoutersLabels: true}) defer promRegistry.Unregister(promState) conf1 := dynamic.Configuration{ @@ -534,7 +533,7 @@ func TestPrometheusMetricRemoveEndpointForRecoveredService(t *testing.T) { promRegistry = prometheus.NewRegistry() t.Cleanup(promState.reset) - prometheusRegistry := RegisterPrometheus(context.Background(), &types.Prometheus{AddServicesLabels: true}) + prometheusRegistry := RegisterPrometheus(t.Context(), &types.Prometheus{AddServicesLabels: true}) defer promRegistry.Unregister(promState) conf1 := dynamic.Configuration{ @@ -573,7 +572,7 @@ func TestPrometheusMetricRemoveEndpointForRecoveredService(t *testing.T) { func TestPrometheusRemovedMetricsReset(t *testing.T) { t.Cleanup(promState.reset) - prometheusRegistry := RegisterPrometheus(context.Background(), &types.Prometheus{AddEntryPointsLabels: true, AddServicesLabels: true}) + prometheusRegistry := RegisterPrometheus(t.Context(), &types.Prometheus{AddEntryPointsLabels: true, AddServicesLabels: true}) defer promRegistry.Unregister(promState) conf1 := dynamic.Configuration{ diff --git a/pkg/metrics/statsd_test.go b/pkg/metrics/statsd_test.go index 1031d5929..c60075ad8 100644 --- a/pkg/metrics/statsd_test.go +++ b/pkg/metrics/statsd_test.go @@ -1,7 +1,6 @@ package metrics import ( - "context" "net/http" "strconv" "testing" @@ -21,7 +20,7 @@ func TestStatsD(t *testing.T) { // This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond udp.Timeout = 5 * time.Second - statsdRegistry := RegisterStatsd(context.Background(), &types.Statsd{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) + statsdRegistry := RegisterStatsd(t.Context(), &types.Statsd{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true}) testRegistry(t, defaultMetricsPrefix, statsdRegistry) } @@ -35,7 +34,7 @@ func TestStatsDWithPrefix(t *testing.T) { // This is needed to make sure that UDP Listener listens for data a bit longer, otherwise it will quit after a millisecond udp.Timeout = 5 * time.Second - statsdRegistry := RegisterStatsd(context.Background(), &types.Statsd{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true, Prefix: "testPrefix"}) + statsdRegistry := RegisterStatsd(t.Context(), &types.Statsd{Address: ":18125", PushInterval: ptypes.Duration(time.Second), AddEntryPointsLabels: true, AddRoutersLabels: true, AddServicesLabels: true, Prefix: "testPrefix"}) testRegistry(t, "testPrefix", statsdRegistry) } diff --git a/pkg/middlewares/accesslog/logger_test.go b/pkg/middlewares/accesslog/logger_test.go index 5201070ef..634ed72c7 100644 --- a/pkg/middlewares/accesslog/logger_test.go +++ b/pkg/middlewares/accesslog/logger_test.go @@ -926,7 +926,7 @@ func doLoggingWithAbortedStream(t *testing.T, config *types.AccessLog) { require.NoError(t, err, "logger should create "+config.FilePath) } - reqContext, cancelRequest := context.WithCancel(context.Background()) + reqContext, cancelRequest := context.WithCancel(t.Context()) req := &http.Request{ Header: map[string][]string{ diff --git a/pkg/middlewares/addprefix/add_prefix_test.go b/pkg/middlewares/addprefix/add_prefix_test.go index e56a13d9f..89cf5bc20 100644 --- a/pkg/middlewares/addprefix/add_prefix_test.go +++ b/pkg/middlewares/addprefix/add_prefix_test.go @@ -1,7 +1,6 @@ package addprefix import ( - "context" "net/http" "testing" @@ -34,7 +33,7 @@ func TestNewAddPrefix(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - _, err := New(context.Background(), next, test.prefix, "foo-add-prefix") + _, err := New(t.Context(), next, test.prefix, "foo-add-prefix") if test.expectsError { assert.Error(t, err) } else { @@ -87,7 +86,7 @@ func TestAddPrefix(t *testing.T) { req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost"+test.path, nil) - handler, err := New(context.Background(), next, test.prefix, "foo-add-prefix") + handler, err := New(t.Context(), next, test.prefix, "foo-add-prefix") require.NoError(t, err) handler.ServeHTTP(nil, req) diff --git a/pkg/middlewares/auth/basic_auth_test.go b/pkg/middlewares/auth/basic_auth_test.go index 196bd3669..f3f98df73 100644 --- a/pkg/middlewares/auth/basic_auth_test.go +++ b/pkg/middlewares/auth/basic_auth_test.go @@ -1,7 +1,6 @@ package auth import ( - "context" "fmt" "io" "net/http" @@ -23,13 +22,13 @@ func TestBasicAuthFail(t *testing.T) { auth := dynamic.BasicAuth{ Users: []string{"test"}, } - _, err := NewBasic(context.Background(), next, auth, "authName") + _, err := NewBasic(t.Context(), next, auth, "authName") require.Error(t, err) auth2 := dynamic.BasicAuth{ Users: []string{"test:test"}, } - authMiddleware, err := NewBasic(context.Background(), next, auth2, "authTest") + authMiddleware, err := NewBasic(t.Context(), next, auth2, "authTest") require.NoError(t, err) ts := httptest.NewServer(authMiddleware) @@ -52,7 +51,7 @@ func TestBasicAuthSuccess(t *testing.T) { auth := dynamic.BasicAuth{ Users: []string{"test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"}, } - authMiddleware, err := NewBasic(context.Background(), next, auth, "authName") + authMiddleware, err := NewBasic(t.Context(), next, auth, "authName") require.NoError(t, err) ts := httptest.NewServer(authMiddleware) @@ -83,7 +82,7 @@ func TestBasicAuthUserHeader(t *testing.T) { Users: []string{"test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"}, HeaderField: "X-Webauth-User", } - middleware, err := NewBasic(context.Background(), next, auth, "authName") + middleware, err := NewBasic(t.Context(), next, auth, "authName") require.NoError(t, err) ts := httptest.NewServer(middleware) @@ -114,7 +113,7 @@ func TestBasicAuthHeaderRemoved(t *testing.T) { RemoveHeader: true, Users: []string{"test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"}, } - middleware, err := NewBasic(context.Background(), next, auth, "authName") + middleware, err := NewBasic(t.Context(), next, auth, "authName") require.NoError(t, err) ts := httptest.NewServer(middleware) @@ -145,7 +144,7 @@ func TestBasicAuthHeaderPresent(t *testing.T) { auth := dynamic.BasicAuth{ Users: []string{"test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"}, } - middleware, err := NewBasic(context.Background(), next, auth, "authName") + middleware, err := NewBasic(t.Context(), next, auth, "authName") require.NoError(t, err) ts := httptest.NewServer(middleware) @@ -231,7 +230,7 @@ func TestBasicAuthUsersFromFile(t *testing.T) { fmt.Fprintln(w, "traefik") }) - authenticator, err := NewBasic(context.Background(), next, authenticatorConfiguration, "authName") + authenticator, err := NewBasic(t.Context(), next, authenticatorConfiguration, "authName") require.NoError(t, err) ts := httptest.NewServer(authenticator) diff --git a/pkg/middlewares/auth/digest_auth_test.go b/pkg/middlewares/auth/digest_auth_test.go index 1494205cd..8987fe099 100644 --- a/pkg/middlewares/auth/digest_auth_test.go +++ b/pkg/middlewares/auth/digest_auth_test.go @@ -1,7 +1,6 @@ package auth import ( - "context" "fmt" "io" "net/http" @@ -23,7 +22,7 @@ func TestDigestAuthError(t *testing.T) { auth := dynamic.DigestAuth{ Users: []string{"test"}, } - _, err := NewDigest(context.Background(), next, auth, "authName") + _, err := NewDigest(t.Context(), next, auth, "authName") assert.Error(t, err) } @@ -35,7 +34,7 @@ func TestDigestAuthFail(t *testing.T) { auth := dynamic.DigestAuth{ Users: []string{"test:traefik:a2688e031edb4be6a3797f3882655c05"}, } - authMiddleware, err := NewDigest(context.Background(), next, auth, "authName") + authMiddleware, err := NewDigest(t.Context(), next, auth, "authName") require.NoError(t, err) assert.NotNil(t, authMiddleware, "this should not be nil") @@ -109,7 +108,7 @@ func TestDigestAuthUsersFromFile(t *testing.T) { fmt.Fprintln(w, "traefik") }) - authenticator, err := NewDigest(context.Background(), next, authenticatorConfiguration, "authName") + authenticator, err := NewDigest(t.Context(), next, authenticatorConfiguration, "authName") require.NoError(t, err) ts := httptest.NewServer(authenticator) diff --git a/pkg/middlewares/auth/forward_test.go b/pkg/middlewares/auth/forward_test.go index de834a802..3dbd4eece 100644 --- a/pkg/middlewares/auth/forward_test.go +++ b/pkg/middlewares/auth/forward_test.go @@ -1,7 +1,6 @@ package auth import ( - "context" "fmt" "io" "net/http" @@ -30,7 +29,7 @@ func TestForwardAuthFail(t *testing.T) { })) t.Cleanup(server.Close) - middleware, err := NewForward(context.Background(), next, dynamic.ForwardAuth{ + middleware, err := NewForward(t.Context(), next, dynamic.ForwardAuth{ Address: server.URL, }, "authTest") require.NoError(t, err) @@ -77,7 +76,7 @@ func TestForwardAuthSuccess(t *testing.T) { AuthResponseHeaders: []string{"X-Auth-User", "X-Auth-Group"}, AuthResponseHeadersRegex: "^Foo-", } - middleware, err := NewForward(context.Background(), next, auth, "authTest") + middleware, err := NewForward(t.Context(), next, auth, "authTest") require.NoError(t, err) ts := httptest.NewServer(middleware) @@ -110,7 +109,7 @@ func TestForwardAuthRedirect(t *testing.T) { auth := dynamic.ForwardAuth{Address: authTs.URL} - authMiddleware, err := NewForward(context.Background(), next, auth, "authTest") + authMiddleware, err := NewForward(t.Context(), next, auth, "authTest") require.NoError(t, err) ts := httptest.NewServer(authMiddleware) @@ -161,7 +160,7 @@ func TestForwardAuthRemoveHopByHopHeaders(t *testing.T) { auth := dynamic.ForwardAuth{Address: authTs.URL} - authMiddleware, err := NewForward(context.Background(), next, auth, "authTest") + authMiddleware, err := NewForward(t.Context(), next, auth, "authTest") require.NoError(t, err) ts := httptest.NewServer(authMiddleware) @@ -207,7 +206,7 @@ func TestForwardAuthFailResponseHeaders(t *testing.T) { auth := dynamic.ForwardAuth{ Address: authTs.URL, } - authMiddleware, err := NewForward(context.Background(), next, auth, "authTest") + authMiddleware, err := NewForward(t.Context(), next, auth, "authTest") require.NoError(t, err) ts := httptest.NewServer(authMiddleware) @@ -469,10 +468,10 @@ func TestForwardAuthUsesTracing(t *testing.T) { tr, _ := tracing.NewTracing("testApp", 100, &mockBackend{tracer}) - next, err := NewForward(context.Background(), next, auth, "authTest") + next, err := NewForward(t.Context(), next, auth, "authTest") require.NoError(t, err) - next = tracingMiddleware.NewEntryPoint(context.Background(), tr, "tracingTest", next) + next = tracingMiddleware.NewEntryPoint(t.Context(), tr, "tracingTest", next) ts := httptest.NewServer(next) t.Cleanup(ts.Close) diff --git a/pkg/middlewares/buffering/buffering_test.go b/pkg/middlewares/buffering/buffering_test.go index adf2c6daa..bd5bb018a 100644 --- a/pkg/middlewares/buffering/buffering_test.go +++ b/pkg/middlewares/buffering/buffering_test.go @@ -2,7 +2,6 @@ package buffering import ( "bytes" - "context" "crypto/rand" "math" "net/http" @@ -57,7 +56,7 @@ func TestBuffering(t *testing.T) { require.NoError(t, err) }) - buffMiddleware, err := New(context.Background(), next, test.config, "foo") + buffMiddleware, err := New(t.Context(), next, test.config, "foo") require.NoError(t, err) req := httptest.NewRequest(http.MethodPost, "http://localhost", bytes.NewBuffer(test.body)) diff --git a/pkg/middlewares/compress/compress_test.go b/pkg/middlewares/compress/compress_test.go index 13715682e..d413ecf7c 100644 --- a/pkg/middlewares/compress/compress_test.go +++ b/pkg/middlewares/compress/compress_test.go @@ -1,7 +1,6 @@ package compress import ( - "context" "io" "net/http" "net/http/httptest" @@ -34,7 +33,7 @@ func TestShouldCompressWhenNoContentEncodingHeader(t *testing.T) { _, err := rw.Write(baseBody) assert.NoError(t, err) }) - handler, err := New(context.Background(), next, dynamic.Compress{}, "testing") + handler, err := New(t.Context(), next, dynamic.Compress{}, "testing") require.NoError(t, err) rw := httptest.NewRecorder() @@ -61,7 +60,7 @@ func TestShouldNotCompressWhenContentEncodingHeader(t *testing.T) { http.Error(rw, err.Error(), http.StatusInternalServerError) } }) - handler, err := New(context.Background(), next, dynamic.Compress{}, "testing") + handler, err := New(t.Context(), next, dynamic.Compress{}, "testing") require.NoError(t, err) rw := httptest.NewRecorder() @@ -83,7 +82,7 @@ func TestShouldNotCompressWhenNoAcceptEncodingHeader(t *testing.T) { http.Error(rw, err.Error(), http.StatusInternalServerError) } }) - handler, err := New(context.Background(), next, dynamic.Compress{}, "testing") + handler, err := New(t.Context(), next, dynamic.Compress{}, "testing") require.NoError(t, err) rw := httptest.NewRecorder() @@ -144,7 +143,7 @@ func TestShouldNotCompressWhenSpecificContentType(t *testing.T) { } }) - handler, err := New(context.Background(), next, test.conf, "test") + handler, err := New(t.Context(), next, test.conf, "test") require.NoError(t, err) rw := httptest.NewRecorder() @@ -194,7 +193,7 @@ func TestIntegrationShouldNotCompress(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { - compress, err := New(context.Background(), test.handler, dynamic.Compress{}, "testing") + compress, err := New(t.Context(), test.handler, dynamic.Compress{}, "testing") require.NoError(t, err) ts := httptest.NewServer(compress) @@ -229,7 +228,7 @@ func TestShouldWriteHeaderWhenFlush(t *testing.T) { http.Error(rw, err.Error(), http.StatusInternalServerError) } }) - handler, err := New(context.Background(), next, dynamic.Compress{}, "testing") + handler, err := New(t.Context(), next, dynamic.Compress{}, "testing") require.NoError(t, err) ts := httptest.NewServer(handler) @@ -280,7 +279,7 @@ func TestIntegrationShouldCompress(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { - compress, err := New(context.Background(), test.handler, dynamic.Compress{}, "testing") + compress, err := New(t.Context(), test.handler, dynamic.Compress{}, "testing") require.NoError(t, err) ts := httptest.NewServer(compress) @@ -337,7 +336,7 @@ func TestMinResponseBodyBytes(t *testing.T) { } }) - handler, err := New(context.Background(), next, dynamic.Compress{MinResponseBodyBytes: test.minResponseBodyBytes}, "testing") + handler, err := New(t.Context(), next, dynamic.Compress{MinResponseBodyBytes: test.minResponseBodyBytes}, "testing") require.NoError(t, err) rw := httptest.NewRecorder() @@ -373,7 +372,7 @@ func Test1xxResponses(t *testing.T) { } }) - compress, err := New(context.Background(), next, dynamic.Compress{MinResponseBodyBytes: 1024}, "testing") + compress, err := New(t.Context(), next, dynamic.Compress{MinResponseBodyBytes: 1024}, "testing") require.NoError(t, err) server := httptest.NewServer(compress) @@ -417,7 +416,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, server.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, server.URL, nil) req.Header.Add(acceptEncodingHeader, gzipValue) res, err := frontendClient.Do(req) @@ -478,7 +477,7 @@ func BenchmarkCompress(b *testing.B) { _, err := rw.Write(baseBody) assert.NoError(b, err) }) - handler, _ := New(context.Background(), next, dynamic.Compress{}, "testing") + handler, _ := New(b.Context(), next, dynamic.Compress{}, "testing") req, _ := http.NewRequest(http.MethodGet, "/whatever", nil) req.Header.Set("Accept-Encoding", "gzip") diff --git a/pkg/middlewares/customerrors/custom_errors_test.go b/pkg/middlewares/customerrors/custom_errors_test.go index 046ecb665..bc3afe638 100644 --- a/pkg/middlewares/customerrors/custom_errors_test.go +++ b/pkg/middlewares/customerrors/custom_errors_test.go @@ -170,7 +170,7 @@ func TestHandler(t *testing.T) { } _, _ = fmt.Fprintln(w, http.StatusText(test.backendCode)) }) - errorPageHandler, err := New(context.Background(), handler, *test.errorPage, serviceBuilderMock, "test") + errorPageHandler, err := New(t.Context(), handler, *test.errorPage, serviceBuilderMock, "test") require.NoError(t, err) req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost/test?foo=bar&baz=buz", nil) @@ -205,7 +205,7 @@ func Test1xxResponses(t *testing.T) { config := dynamic.ErrorPage{Service: "error", Query: "/", Status: []string{"200"}} - errorPageHandler, err := New(context.Background(), next, config, serviceBuilderMock, "test") + errorPageHandler, err := New(t.Context(), next, config, serviceBuilderMock, "test") require.NoError(t, err) server := httptest.NewServer(errorPageHandler) @@ -249,7 +249,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, server.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, server.URL, nil) res, err := frontendClient.Do(req) assert.NoError(t, err) diff --git a/pkg/middlewares/headers/headers_test.go b/pkg/middlewares/headers/headers_test.go index 41ec273a2..6248d1c4f 100644 --- a/pkg/middlewares/headers/headers_test.go +++ b/pkg/middlewares/headers/headers_test.go @@ -3,7 +3,6 @@ package headers // Middleware tests based on https://github.com/unrolled/secure import ( - "context" "io" "net/http" "net/http/httptest" @@ -20,7 +19,7 @@ import ( func TestNew_withoutOptions(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) - mid, err := New(context.Background(), next, dynamic.Headers{}, "testing") + mid, err := New(t.Context(), next, dynamic.Headers{}, "testing") require.Errorf(t, err, "headers configuration not valid") assert.Nil(t, mid) @@ -55,7 +54,7 @@ func TestNew_allowedHosts(t *testing.T) { AllowedHosts: []string{"foo.com", "bar.com"}, } - mid, err := New(context.Background(), emptyHandler, cfg, "foo") + mid, err := New(t.Context(), emptyHandler, cfg, "foo") require.NoError(t, err) for _, test := range testCases { @@ -86,7 +85,7 @@ func TestNew_customHeaders(t *testing.T) { }, } - mid, err := New(context.Background(), next, cfg, "testing") + mid, err := New(t.Context(), next, cfg, "testing") require.NoError(t, err) req := httptest.NewRequest(http.MethodGet, "/foo", nil) @@ -134,7 +133,7 @@ func Test1xxResponses(t *testing.T) { }, } - mid, err := New(context.Background(), next, cfg, "testing") + mid, err := New(t.Context(), next, cfg, "testing") require.NoError(t, err) server := httptest.NewServer(mid) @@ -178,7 +177,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, server.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, server.URL, nil) res, err := frontendClient.Do(req) assert.NoError(t, err) diff --git a/pkg/middlewares/ipallowlist/ip_allowlist_test.go b/pkg/middlewares/ipallowlist/ip_allowlist_test.go index 130c6f7cc..8c90e961c 100644 --- a/pkg/middlewares/ipallowlist/ip_allowlist_test.go +++ b/pkg/middlewares/ipallowlist/ip_allowlist_test.go @@ -1,7 +1,6 @@ package ipallowlist import ( - "context" "net/http" "net/http/httptest" "testing" @@ -37,7 +36,7 @@ func TestNewIPAllowLister(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - allowLister, err := New(context.Background(), next, test.allowList, "traefikTest") + allowLister, err := New(t.Context(), next, test.allowList, "traefikTest") if test.expectedError { assert.Error(t, err) @@ -79,7 +78,7 @@ func TestIPAllowLister_ServeHTTP(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - allowLister, err := New(context.Background(), next, test.allowList, "traefikTest") + allowLister, err := New(t.Context(), next, test.allowList, "traefikTest") require.NoError(t, err) recorder := httptest.NewRecorder() diff --git a/pkg/middlewares/ipwhitelist/ip_whitelist_test.go b/pkg/middlewares/ipwhitelist/ip_whitelist_test.go index 13b6e9e5e..fddeaf43b 100644 --- a/pkg/middlewares/ipwhitelist/ip_whitelist_test.go +++ b/pkg/middlewares/ipwhitelist/ip_whitelist_test.go @@ -1,7 +1,6 @@ package ipwhitelist import ( - "context" "net/http" "net/http/httptest" "testing" @@ -37,7 +36,7 @@ func TestNewIPWhiteLister(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - whiteLister, err := New(context.Background(), next, test.whiteList, "traefikTest") + whiteLister, err := New(t.Context(), next, test.whiteList, "traefikTest") if test.expectedError { assert.Error(t, err) @@ -79,7 +78,7 @@ func TestIPWhiteLister_ServeHTTP(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - whiteLister, err := New(context.Background(), next, test.whiteList, "traefikTest") + whiteLister, err := New(t.Context(), next, test.whiteList, "traefikTest") require.NoError(t, err) recorder := httptest.NewRecorder() diff --git a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go index d0a4b7735..edaea4106 100644 --- a/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go +++ b/pkg/middlewares/passtlsclientcert/pass_tls_client_cert_test.go @@ -1,7 +1,6 @@ package passtlsclientcert import ( - "context" "crypto/tls" "crypto/x509" "encoding/pem" @@ -313,7 +312,7 @@ func TestPassTLSClientCert_PEM(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - tlsClientHeaders, err := New(context.Background(), next, test.config, "foo") + tlsClientHeaders, err := New(t.Context(), next, test.config, "foo") require.NoError(t, err) res := httptest.NewRecorder() @@ -535,7 +534,7 @@ func TestPassTLSClientCert_certInfo(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - tlsClientHeaders, err := New(context.Background(), next, test.config, "foo") + tlsClientHeaders, err := New(t.Context(), next, test.config, "foo") require.NoError(t, err) res := httptest.NewRecorder() diff --git a/pkg/middlewares/pipelining/pipelining_test.go b/pkg/middlewares/pipelining/pipelining_test.go index 9ad64f103..449101737 100644 --- a/pkg/middlewares/pipelining/pipelining_test.go +++ b/pkg/middlewares/pipelining/pipelining_test.go @@ -1,7 +1,6 @@ package pipelining import ( - "context" "io" "net/http" "net/http/httptest" @@ -62,7 +61,7 @@ func TestNew(t *testing.T) { assert.Equal(t, test.implementCloseNotifier, ok) w.WriteHeader(http.StatusOK) }) - handler := New(context.Background(), nextHandler, "pipe") + handler := New(t.Context(), nextHandler, "pipe") req := httptest.NewRequest(test.HTTPMethod, "http://localhost", nil) @@ -87,7 +86,7 @@ func Test1xxResponses(t *testing.T) { _, _ = w.Write([]byte("Hello")) }) - pipe := New(context.Background(), next, "pipe") + pipe := New(t.Context(), next, "pipe") server := httptest.NewServer(pipe) t.Cleanup(server.Close) @@ -130,7 +129,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, server.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, server.URL, nil) res, err := frontendClient.Do(req) assert.NoError(t, err) diff --git a/pkg/middlewares/ratelimiter/rate_limiter_test.go b/pkg/middlewares/ratelimiter/rate_limiter_test.go index 50c51553d..0b8927bf1 100644 --- a/pkg/middlewares/ratelimiter/rate_limiter_test.go +++ b/pkg/middlewares/ratelimiter/rate_limiter_test.go @@ -1,7 +1,6 @@ package ratelimiter import ( - "context" "fmt" "net/http" "net/http/httptest" @@ -94,7 +93,7 @@ func TestNewRateLimiter(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - h, err := New(context.Background(), next, test.config, "rate-limiter") + h, err := New(t.Context(), next, test.config, "rate-limiter") if test.expectedError != "" { assert.EqualError(t, err, test.expectedError) } else { @@ -258,7 +257,7 @@ func TestRateLimit(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { reqCount++ }) - h, err := New(context.Background(), next, test.config, "rate-limiter") + h, err := New(t.Context(), next, test.config, "rate-limiter") require.NoError(t, err) loadPeriod := time.Duration(1e9 / test.incomingLoad) diff --git a/pkg/middlewares/recovery/recovery_test.go b/pkg/middlewares/recovery/recovery_test.go index 1929f0b54..d93cb77eb 100644 --- a/pkg/middlewares/recovery/recovery_test.go +++ b/pkg/middlewares/recovery/recovery_test.go @@ -1,7 +1,6 @@ package recovery import ( - "context" "errors" "io" "net/http" @@ -47,7 +46,7 @@ func TestRecoverHandler(t *testing.T) { } panic(test.panicErr) } - recovery, err := New(context.Background(), http.HandlerFunc(fn)) + recovery, err := New(t.Context(), http.HandlerFunc(fn)) require.NoError(t, err) server := httptest.NewServer(recovery) diff --git a/pkg/middlewares/redirect/redirect_regex_test.go b/pkg/middlewares/redirect/redirect_regex_test.go index 0c04d9ef8..820016324 100644 --- a/pkg/middlewares/redirect/redirect_regex_test.go +++ b/pkg/middlewares/redirect/redirect_regex_test.go @@ -1,7 +1,6 @@ package redirect import ( - "context" "crypto/tls" "net/http" "net/http/httptest" @@ -158,7 +157,7 @@ func TestRedirectRegexHandler(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - handler, err := NewRedirectRegex(context.Background(), next, test.config, "traefikTest") + handler, err := NewRedirectRegex(t.Context(), next, test.config, "traefikTest") if test.errorExpected { require.Error(t, err) diff --git a/pkg/middlewares/redirect/redirect_scheme_test.go b/pkg/middlewares/redirect/redirect_scheme_test.go index 7ff97bba4..eb9718930 100644 --- a/pkg/middlewares/redirect/redirect_scheme_test.go +++ b/pkg/middlewares/redirect/redirect_scheme_test.go @@ -1,7 +1,6 @@ package redirect import ( - "context" "crypto/tls" "net/http" "net/http/httptest" @@ -287,7 +286,7 @@ func TestRedirectSchemeHandler(t *testing.T) { t.Parallel() next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) - handler, err := NewRedirectScheme(context.Background(), next, test.config, "traefikTest") + handler, err := NewRedirectScheme(t.Context(), next, test.config, "traefikTest") if test.errorExpected { require.Error(t, err) diff --git a/pkg/middlewares/replacepath/replace_path_test.go b/pkg/middlewares/replacepath/replace_path_test.go index 782733bc0..e2fdc3782 100644 --- a/pkg/middlewares/replacepath/replace_path_test.go +++ b/pkg/middlewares/replacepath/replace_path_test.go @@ -1,7 +1,6 @@ package replacepath import ( - "context" "net/http" "net/http/httptest" "testing" @@ -82,7 +81,7 @@ func TestReplacePath(t *testing.T) { requestURI = r.RequestURI }) - handler, err := New(context.Background(), next, test.config, "foo-replace-path") + handler, err := New(t.Context(), next, test.config, "foo-replace-path") require.NoError(t, err) server := httptest.NewServer(handler) diff --git a/pkg/middlewares/replacepathregex/replace_path_regex_test.go b/pkg/middlewares/replacepathregex/replace_path_regex_test.go index b7e637851..348be4be2 100644 --- a/pkg/middlewares/replacepathregex/replace_path_regex_test.go +++ b/pkg/middlewares/replacepathregex/replace_path_regex_test.go @@ -1,7 +1,6 @@ package replacepathregex import ( - "context" "net/http" "net/http/httptest" "testing" @@ -150,7 +149,7 @@ func TestReplacePathRegex(t *testing.T) { requestURI = r.RequestURI }) - handler, err := New(context.Background(), next, test.config, "foo-replace-path-regexp") + handler, err := New(t.Context(), next, test.config, "foo-replace-path-regexp") if test.expectsError { require.Error(t, err) return diff --git a/pkg/middlewares/requestdecorator/hostresolver_test.go b/pkg/middlewares/requestdecorator/hostresolver_test.go index f1c8c39a2..e00228576 100644 --- a/pkg/middlewares/requestdecorator/hostresolver_test.go +++ b/pkg/middlewares/requestdecorator/hostresolver_test.go @@ -1,7 +1,6 @@ package requestdecorator import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -43,7 +42,7 @@ func TestCNAMEFlatten(t *testing.T) { ResolvDepth: 5, } - flatH := hostResolver.CNAMEFlatten(context.Background(), test.domain) + flatH := hostResolver.CNAMEFlatten(t.Context(), test.domain) assert.Equal(t, test.expectedDomain, flatH) }) } diff --git a/pkg/middlewares/retry/retry_test.go b/pkg/middlewares/retry/retry_test.go index b7332fe1e..b8e7d0fd5 100644 --- a/pkg/middlewares/retry/retry_test.go +++ b/pkg/middlewares/retry/retry_test.go @@ -1,7 +1,6 @@ package retry import ( - "context" "fmt" "io" "net/http" @@ -129,7 +128,7 @@ func TestRetry(t *testing.T) { }) retryListener := &countingRetryListener{} - retry, err := New(context.Background(), next, test.config, retryListener, "traefikTest") + retry, err := New(t.Context(), next, test.config, retryListener, "traefikTest") require.NoError(t, err) recorder := httptest.NewRecorder() @@ -149,7 +148,7 @@ func TestRetryEmptyServerList(t *testing.T) { }) retryListener := &countingRetryListener{} - retry, err := New(context.Background(), next, dynamic.Retry{Attempts: 3}, retryListener, "traefikTest") + retry, err := New(t.Context(), next, dynamic.Retry{Attempts: 3}, retryListener, "traefikTest") require.NoError(t, err) recorder := httptest.NewRecorder() @@ -185,7 +184,7 @@ func TestMultipleRetriesShouldNotLooseHeaders(t *testing.T) { rw.WriteHeader(http.StatusNoContent) }) - retry, err := New(context.Background(), next, dynamic.Retry{Attempts: 3}, &countingRetryListener{}, "traefikTest") + retry, err := New(t.Context(), next, dynamic.Retry{Attempts: 3}, &countingRetryListener{}, "traefikTest") require.NoError(t, err) res := httptest.NewRecorder() @@ -219,7 +218,7 @@ func TestRetryShouldNotLooseHeadersOnWrite(t *testing.T) { require.NoError(t, err) }) - retry, err := New(context.Background(), next, dynamic.Retry{Attempts: 3}, &countingRetryListener{}, "traefikTest") + retry, err := New(t.Context(), next, dynamic.Retry{Attempts: 3}, &countingRetryListener{}, "traefikTest") require.NoError(t, err) res := httptest.NewRecorder() @@ -243,7 +242,7 @@ func TestRetryWithFlush(t *testing.T) { } }) - retry, err := New(context.Background(), next, dynamic.Retry{Attempts: 1}, &countingRetryListener{}, "traefikTest") + retry, err := New(t.Context(), next, dynamic.Retry{Attempts: 1}, &countingRetryListener{}, "traefikTest") require.NoError(t, err) responseRecorder := httptest.NewRecorder() @@ -312,7 +311,7 @@ func TestRetryWebsocket(t *testing.T) { }) retryListener := &countingRetryListener{} - retryH, err := New(context.Background(), next, dynamic.Retry{Attempts: test.maxRequestAttempts}, retryListener, "traefikTest") + retryH, err := New(t.Context(), next, dynamic.Retry{Attempts: test.maxRequestAttempts}, retryListener, "traefikTest") require.NoError(t, err) retryServer := httptest.NewServer(retryH) @@ -345,7 +344,7 @@ func Test1xxResponses(t *testing.T) { }) retryListener := &countingRetryListener{} - retry, err := New(context.Background(), next, dynamic.Retry{Attempts: 1}, retryListener, "traefikTest") + retry, err := New(t.Context(), next, dynamic.Retry{Attempts: 1}, retryListener, "traefikTest") require.NoError(t, err) server := httptest.NewServer(retry) @@ -389,7 +388,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, server.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, server.URL, nil) res, err := frontendClient.Do(req) assert.NoError(t, err) diff --git a/pkg/middlewares/stripprefix/strip_prefix_test.go b/pkg/middlewares/stripprefix/strip_prefix_test.go index b592224e9..8ed6ebe92 100644 --- a/pkg/middlewares/stripprefix/strip_prefix_test.go +++ b/pkg/middlewares/stripprefix/strip_prefix_test.go @@ -1,7 +1,6 @@ package stripprefix import ( - "context" "net/http" "net/http/httptest" "testing" @@ -189,7 +188,7 @@ func TestStripPrefix(t *testing.T) { requestURI = r.RequestURI }) - handler, err := New(context.Background(), next, test.config, "foo-strip-prefix") + handler, err := New(t.Context(), next, test.config, "foo-strip-prefix") require.NoError(t, err) req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost"+test.path, nil) diff --git a/pkg/middlewares/stripprefixregex/strip_prefix_regex_test.go b/pkg/middlewares/stripprefixregex/strip_prefix_regex_test.go index 18e831d35..5a9b6d115 100644 --- a/pkg/middlewares/stripprefixregex/strip_prefix_regex_test.go +++ b/pkg/middlewares/stripprefixregex/strip_prefix_regex_test.go @@ -1,7 +1,6 @@ package stripprefixregex import ( - "context" "net/http" "net/http/httptest" "testing" @@ -118,7 +117,7 @@ func TestStripPrefixRegex(t *testing.T) { actualHeader = r.Header.Get(stripprefix.ForwardedPrefixHeader) requestURI = r.RequestURI }) - handler, err := New(context.Background(), handlerPath, testPrefixRegex, "foo-strip-prefix-regex") + handler, err := New(t.Context(), handlerPath, testPrefixRegex, "foo-strip-prefix-regex") require.NoError(t, err) req := testhelpers.MustNewRequest(http.MethodGet, "http://localhost"+test.path, nil) diff --git a/pkg/middlewares/tcp/inflightconn/inflight_conn_test.go b/pkg/middlewares/tcp/inflightconn/inflight_conn_test.go index 666df4317..ceaf876f8 100644 --- a/pkg/middlewares/tcp/inflightconn/inflight_conn_test.go +++ b/pkg/middlewares/tcp/inflightconn/inflight_conn_test.go @@ -1,7 +1,6 @@ package tcpinflightconn import ( - "context" "net" "testing" "time" @@ -27,7 +26,7 @@ func TestInFlightConn_ServeTCP(t *testing.T) { finishCh <- struct{}{} }) - middleware, err := New(context.Background(), next, dynamic.TCPInFlightConn{Amount: 1}, "foo") + middleware, err := New(t.Context(), next, dynamic.TCPInFlightConn{Amount: 1}, "foo") require.NoError(t, err) // The first connection should succeed and wait. diff --git a/pkg/middlewares/tcp/ipallowlist/ip_allowlist_test.go b/pkg/middlewares/tcp/ipallowlist/ip_allowlist_test.go index d55a1fffa..b6ff41a1c 100644 --- a/pkg/middlewares/tcp/ipallowlist/ip_allowlist_test.go +++ b/pkg/middlewares/tcp/ipallowlist/ip_allowlist_test.go @@ -43,7 +43,7 @@ func TestNewIPAllowLister(t *testing.T) { t.Parallel() next := tcp.HandlerFunc(func(conn tcp.WriteCloser) {}) - allowLister, err := New(context.Background(), next, test.allowList, "traefikTest") + allowLister, err := New(t.Context(), next, test.allowList, "traefikTest") if test.expectedError { assert.Error(t, err) @@ -92,7 +92,7 @@ func TestIPAllowLister_ServeHTTP(t *testing.T) { require.NoError(t, err) }) - allowLister, err := New(context.Background(), next, test.allowList, "traefikTest") + allowLister, err := New(t.Context(), next, test.allowList, "traefikTest") require.NoError(t, err) server, client := net.Pipe() diff --git a/pkg/middlewares/tcp/ipwhitelist/ip_whitelist_test.go b/pkg/middlewares/tcp/ipwhitelist/ip_whitelist_test.go index e419f6bfe..40753edff 100644 --- a/pkg/middlewares/tcp/ipwhitelist/ip_whitelist_test.go +++ b/pkg/middlewares/tcp/ipwhitelist/ip_whitelist_test.go @@ -43,7 +43,7 @@ func TestNewIPWhiteLister(t *testing.T) { t.Parallel() next := tcp.HandlerFunc(func(conn tcp.WriteCloser) {}) - whiteLister, err := New(context.Background(), next, test.whiteList, "traefikTest") + whiteLister, err := New(t.Context(), next, test.whiteList, "traefikTest") if test.expectedError { assert.Error(t, err) @@ -92,7 +92,7 @@ func TestIPWhiteLister_ServeHTTP(t *testing.T) { require.NoError(t, err) }) - whiteLister, err := New(context.Background(), next, test.whiteList, "traefikTest") + whiteLister, err := New(t.Context(), next, test.whiteList, "traefikTest") require.NoError(t, err) server, client := net.Pipe() diff --git a/pkg/middlewares/tracing/entrypoint_test.go b/pkg/middlewares/tracing/entrypoint_test.go index 604c8c012..14ed69366 100644 --- a/pkg/middlewares/tracing/entrypoint_test.go +++ b/pkg/middlewares/tracing/entrypoint_test.go @@ -1,7 +1,6 @@ package tracing import ( - "context" "net/http" "net/http/httptest" "testing" @@ -79,7 +78,7 @@ func TestEntryPointMiddleware(t *testing.T) { assert.Equal(t, test.expected.OperationName, span.OpName) }) - handler := NewEntryPoint(context.Background(), newTracing, test.entryPoint, next) + handler := NewEntryPoint(t.Context(), newTracing, test.entryPoint, next) handler.ServeHTTP(rw, req) }) } diff --git a/pkg/middlewares/tracing/forwarder_test.go b/pkg/middlewares/tracing/forwarder_test.go index 6eab47432..af9182e17 100644 --- a/pkg/middlewares/tracing/forwarder_test.go +++ b/pkg/middlewares/tracing/forwarder_test.go @@ -1,7 +1,6 @@ package tracing import ( - "context" "net/http" "net/http/httptest" "testing" @@ -129,7 +128,7 @@ func TestNewForwarder(t *testing.T) { assert.Equal(t, test.expected.OperationName, span.OpName) }) - handler := NewForwarder(context.Background(), test.router, test.service, next) + handler := NewForwarder(t.Context(), test.router, test.service, next) handler.ServeHTTP(rw, req) }) } diff --git a/pkg/provider/acme/local_store_test.go b/pkg/provider/acme/local_store_test.go index 61d2cff6b..257cfa3b0 100644 --- a/pkg/provider/acme/local_store_test.go +++ b/pkg/provider/acme/local_store_test.go @@ -1,7 +1,6 @@ package acme import ( - "context" "fmt" "os" "path/filepath" @@ -47,7 +46,7 @@ func TestLocalStore_GetAccount(t *testing.T) { for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { - s := NewLocalStore(test.filename, safe.NewPool(context.Background())) + s := NewLocalStore(test.filename, safe.NewPool(t.Context())) account, err := s.GetAccount("test") require.NoError(t, err) @@ -60,7 +59,7 @@ func TestLocalStore_GetAccount(t *testing.T) { func TestLocalStore_SaveAccount(t *testing.T) { acmeFile := filepath.Join(t.TempDir(), "acme.json") - s := NewLocalStore(acmeFile, safe.NewPool(context.Background())) + s := NewLocalStore(acmeFile, safe.NewPool(t.Context())) email := "some@email.com" diff --git a/pkg/provider/acme/provider_test.go b/pkg/provider/acme/provider_test.go index 73dc785ff..e34fb9bad 100644 --- a/pkg/provider/acme/provider_test.go +++ b/pkg/provider/acme/provider_test.go @@ -1,7 +1,6 @@ package acme import ( - "context" "crypto/tls" "testing" "time" @@ -181,7 +180,7 @@ func TestGetUncheckedCertificates(t *testing.T) { resolvingDomains: test.resolvingDomains, } - domains := acmeProvider.getUncheckedDomains(context.Background(), test.domains, "default") + domains := acmeProvider.getUncheckedDomains(t.Context(), test.domains, "default") assert.Len(t, domains, len(test.expectedDomains), "Unexpected domains.") }) } @@ -245,7 +244,7 @@ func TestProvider_sanitizeDomains(t *testing.T) { acmeProvider := Provider{Configuration: &Configuration{DNSChallenge: test.dnsChallenge}} - domains, err := acmeProvider.sanitizeDomains(context.Background(), test.domains) + domains, err := acmeProvider.sanitizeDomains(t.Context(), test.domains) if len(test.expectedErr) > 0 { assert.EqualError(t, err, test.expectedErr, "Unexpected error.") @@ -424,7 +423,7 @@ func TestDeleteUnnecessaryDomains(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - domains := deleteUnnecessaryDomains(context.Background(), test.domains) + domains := deleteUnnecessaryDomains(t.Context(), test.domains) assert.Equal(t, test.expectedDomains, domains, "unexpected domain") }) } @@ -497,7 +496,7 @@ func TestIsAccountMatchingCaServer(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - result := isAccountMatchingCaServer(context.Background(), test.accountURI, test.serverURI) + result := isAccountMatchingCaServer(t.Context(), test.accountURI, test.serverURI) assert.Equal(t, test.expected, result) }) @@ -574,7 +573,7 @@ func TestInitAccount(t *testing.T) { acmeProvider := Provider{account: test.account, Configuration: &Configuration{Email: test.email, KeyType: test.keyType}} - actualAccount, err := acmeProvider.initAccount(context.Background()) + actualAccount, err := acmeProvider.initAccount(t.Context()) assert.NoError(t, err, "Init account in error") assert.Equal(t, test.expectedAccount.Email, actualAccount.Email, "unexpected email account") assert.Equal(t, test.expectedAccount.KeyType, actualAccount.KeyType, "unexpected keyType account") diff --git a/pkg/provider/aggregator/aggregator_test.go b/pkg/provider/aggregator/aggregator_test.go index 4bcf2bd79..b7fbd1b4f 100644 --- a/pkg/provider/aggregator/aggregator_test.go +++ b/pkg/provider/aggregator/aggregator_test.go @@ -1,7 +1,6 @@ package aggregator import ( - "context" "testing" "time" @@ -24,7 +23,7 @@ func TestProviderAggregator_Provide(t *testing.T) { cfgCh := make(chan dynamic.Message) errCh := make(chan error) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) t.Cleanup(pool.Stop) diff --git a/pkg/provider/consulcatalog/config_test.go b/pkg/provider/consulcatalog/config_test.go index 22f830c48..478ad2332 100644 --- a/pkg/provider/consulcatalog/config_test.go +++ b/pkg/provider/consulcatalog/config_test.go @@ -1,7 +1,6 @@ package consulcatalog import ( - "context" "fmt" "testing" @@ -294,7 +293,7 @@ func TestDefaultRule(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.items, nil) + configuration := p.buildConfiguration(t.Context(), test.items, nil) assert.Equal(t, test.expected, configuration) }) @@ -3186,7 +3185,7 @@ func Test_buildConfiguration(t *testing.T) { test.items[i].Tags = tags } - configuration := p.buildConfiguration(context.Background(), test.items, &connectCert{ + configuration := p.buildConfiguration(t.Context(), test.items, &connectCert{ root: []string{"root"}, leaf: keyPair{ cert: "cert", diff --git a/pkg/provider/docker/config_test.go b/pkg/provider/docker/config_test.go index 03a5af050..b6b3dc538 100644 --- a/pkg/provider/docker/config_test.go +++ b/pkg/provider/docker/config_test.go @@ -1,7 +1,6 @@ package docker import ( - "context" "strconv" "testing" @@ -387,7 +386,7 @@ func TestDefaultRule(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.containers) + configuration := p.buildConfiguration(t.Context(), test.containers) assert.Equal(t, test.expected, configuration) }) @@ -3504,7 +3503,7 @@ func Test_buildConfiguration(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.containers) + configuration := p.buildConfiguration(t.Context(), test.containers) assert.Equal(t, test.expected, configuration) }) @@ -3676,7 +3675,7 @@ func TestDockerGetIPPort(t *testing.T) { UseBindPortIP: true, } - actualIP, actualPort, actualError := provider.getIPPort(context.Background(), dData, test.serverPort) + actualIP, actualPort, actualError := provider.getIPPort(t.Context(), dData, test.serverPort) if test.expected.error { require.Error(t, actualError) } else { @@ -3857,7 +3856,7 @@ func TestDockerGetIPAddress(t *testing.T) { dData.ExtraConf.Docker.Network = test.network } - actual := provider.getIPAddress(context.Background(), dData) + actual := provider.getIPAddress(t.Context(), dData) assert.Equal(t, test.expected, actual) }) } @@ -3917,10 +3916,10 @@ func TestSwarmGetIPAddress(t *testing.T) { SwarmMode: true, } - dData, err := provider.parseService(context.Background(), test.service, test.networks) + dData, err := provider.parseService(t.Context(), test.service, test.networks) require.NoError(t, err) - actual := provider.getIPAddress(context.Background(), dData) + actual := provider.getIPAddress(t.Context(), dData) assert.Equal(t, test.expected, actual) }) } @@ -3949,7 +3948,7 @@ func TestSwarmGetPort(t *testing.T) { p := Provider{} - dData, err := p.parseService(context.Background(), test.service, test.networks) + dData, err := p.parseService(t.Context(), test.service, test.networks) require.NoError(t, err) actual := getPort(dData, test.serverPort) diff --git a/pkg/provider/docker/swarm_test.go b/pkg/provider/docker/swarm_test.go index 05c9451f0..a70c9488e 100644 --- a/pkg/provider/docker/swarm_test.go +++ b/pkg/provider/docker/swarm_test.go @@ -83,11 +83,11 @@ func TestListTasks(t *testing.T) { t.Parallel() p := Provider{} - dockerData, err := p.parseService(context.Background(), test.service, test.networks) + dockerData, err := p.parseService(t.Context(), test.service, test.networks) require.NoError(t, err) dockerClient := &fakeTasksClient{tasks: test.tasks} - taskDockerData, _ := listTasks(context.Background(), dockerClient, test.service.ID, dockerData, test.networks, test.isGlobalSVC) + taskDockerData, _ := listTasks(t.Context(), dockerClient, test.service.ID, dockerData, test.networks, test.isGlobalSVC) if len(test.expectedTasks) != len(taskDockerData) { t.Errorf("expected tasks %v, got %v", test.expectedTasks, taskDockerData) @@ -277,7 +277,7 @@ func TestListServices(t *testing.T) { p := Provider{} - serviceDockerData, err := p.listServices(context.Background(), dockerClient) + serviceDockerData, err := p.listServices(t.Context(), dockerClient) assert.NoError(t, err) assert.Len(t, serviceDockerData, len(test.expectedServices)) @@ -395,11 +395,11 @@ func TestSwarmTaskParsing(t *testing.T) { p := Provider{} - dData, err := p.parseService(context.Background(), test.service, test.networks) + dData, err := p.parseService(t.Context(), test.service, test.networks) require.NoError(t, err) for _, task := range test.tasks { - taskDockerData := parseTasks(context.Background(), task, dData, test.networks, test.isGlobalSVC) + taskDockerData := parseTasks(t.Context(), task, dData, test.networks, test.isGlobalSVC) expected := test.expected[task.ID] assert.Equal(t, expected.Name, taskDockerData.Name) } diff --git a/pkg/provider/ecs/config_test.go b/pkg/provider/ecs/config_test.go index 6f72344cf..dcd867b04 100644 --- a/pkg/provider/ecs/config_test.go +++ b/pkg/provider/ecs/config_test.go @@ -1,7 +1,6 @@ package ecs import ( - "context" "testing" ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" @@ -358,7 +357,7 @@ func TestDefaultRule(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.instances) + configuration := p.buildConfiguration(t.Context(), test.instances) assert.Equal(t, test.expected, configuration) }) @@ -3088,7 +3087,7 @@ func Test_buildConfiguration(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.containers) + configuration := p.buildConfiguration(t.Context(), test.containers) assert.Equal(t, test.expected, configuration) }) diff --git a/pkg/provider/file/file_test.go b/pkg/provider/file/file_test.go index cf40d7032..76bb0ff91 100644 --- a/pkg/provider/file/file_test.go +++ b/pkg/provider/file/file_test.go @@ -1,7 +1,6 @@ package file import ( - "context" "io" "os" "path/filepath" @@ -60,7 +59,7 @@ func TestTLSCertificateContent(t *testing.T) { require.NoError(t, err) provider := &Provider{} - configuration, err := provider.loadFileConfig(context.Background(), fileConfig.Name(), true) + configuration, err := provider.loadFileConfig(t.Context(), fileConfig.Name(), true) require.NoError(t, err) require.Equal(t, "CONTENT", configuration.TLS.Certificates[0].Certificate.CertFile.String()) @@ -81,7 +80,7 @@ func TestErrorWhenEmptyConfig(t *testing.T) { configChan := make(chan dynamic.Message) errorChan := make(chan struct{}) go func() { - err := provider.Provide(configChan, safe.NewPool(context.Background())) + err := provider.Provide(configChan, safe.NewPool(t.Context())) assert.Error(t, err) close(errorChan) }() @@ -105,7 +104,7 @@ func TestProvideWithoutWatch(t *testing.T) { provider.DebugLogGeneratedTemplate = true go func() { - err := provider.Provide(configChan, safe.NewPool(context.Background())) + err := provider.Provide(configChan, safe.NewPool(t.Context())) assert.NoError(t, err) }() @@ -135,7 +134,7 @@ func TestProvideWithWatch(t *testing.T) { configChan := make(chan dynamic.Message) go func() { - err := provider.Provide(configChan, safe.NewPool(context.Background())) + err := provider.Provide(configChan, safe.NewPool(t.Context())) assert.NoError(t, err) }() diff --git a/pkg/provider/http/http_test.go b/pkg/provider/http/http_test.go index d63a3cacc..cb7d8cdb5 100644 --- a/pkg/provider/http/http_test.go +++ b/pkg/provider/http/http_test.go @@ -1,7 +1,6 @@ package http import ( - "context" "fmt" "net/http" "net/http/httptest" @@ -212,7 +211,7 @@ func TestProvider_Provide(t *testing.T) { }, } - err = provider.Provide(configurationChan, safe.NewPool(context.Background())) + err = provider.Provide(configurationChan, safe.NewPool(t.Context())) require.NoError(t, err) timeout := time.After(time.Second) @@ -246,7 +245,7 @@ func TestProvider_ProvideConfigurationOnlyOnceIfUnchanged(t *testing.T) { configurationChan := make(chan dynamic.Message, 10) - err = provider.Provide(configurationChan, safe.NewPool(context.Background())) + err = provider.Provide(configurationChan, safe.NewPool(t.Context())) require.NoError(t, err) time.Sleep(time.Second) diff --git a/pkg/provider/kubernetes/crd/kubernetes_test.go b/pkg/provider/kubernetes/crd/kubernetes_test.go index ba9031b33..d00ca8a8e 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_test.go +++ b/pkg/provider/kubernetes/crd/kubernetes_test.go @@ -1,7 +1,6 @@ package crd import ( - "context" "os" "path/filepath" "strings" @@ -1466,7 +1465,7 @@ func TestLoadIngressRouteTCPs(t *testing.T) { } clientMock := newClientMock(test.paths...) - conf := p.loadConfigurationFromCRD(context.Background(), clientMock) + conf := p.loadConfigurationFromCRD(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) } @@ -4241,7 +4240,7 @@ func TestLoadIngressRoutes(t *testing.T) { } clientMock := newClientMock(test.paths...) - conf := p.loadConfigurationFromCRD(context.Background(), clientMock) + conf := p.loadConfigurationFromCRD(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) } @@ -4721,7 +4720,7 @@ func TestLoadIngressRouteUDPs(t *testing.T) { } clientMock := newClientMock(test.paths...) - conf := p.loadConfigurationFromCRD(context.Background(), clientMock) + conf := p.loadConfigurationFromCRD(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) } @@ -6098,7 +6097,7 @@ func TestCrossNamespace(t *testing.T) { p := Provider{AllowCrossNamespace: test.allowCrossNamespace} - conf := p.loadConfigurationFromCRD(context.Background(), client) + conf := p.loadConfigurationFromCRD(t.Context(), client) assert.Equal(t, test.expected, conf) }) } @@ -6387,7 +6386,7 @@ func TestExternalNameService(t *testing.T) { p := Provider{AllowExternalNameServices: test.allowExternalNameService} - conf := p.loadConfigurationFromCRD(context.Background(), client) + conf := p.loadConfigurationFromCRD(t.Context(), client) assert.Equal(t, test.expected, conf) }) } @@ -6593,7 +6592,7 @@ func TestNativeLB(t *testing.T) { p := Provider{} - conf := p.loadConfigurationFromCRD(context.Background(), client) + conf := p.loadConfigurationFromCRD(t.Context(), client) assert.Equal(t, test.expected, conf) }) } diff --git a/pkg/provider/kubernetes/gateway/kubernetes_test.go b/pkg/provider/kubernetes/gateway/kubernetes_test.go index 1d51d26af..f7f0c7858 100644 --- a/pkg/provider/kubernetes/gateway/kubernetes_test.go +++ b/pkg/provider/kubernetes/gateway/kubernetes_test.go @@ -1,7 +1,6 @@ package gateway import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -1481,7 +1480,7 @@ func TestLoadHTTPRoutes(t *testing.T) { } p := Provider{EntryPoints: test.entryPoints} - conf := p.loadConfigurationFromGateway(context.Background(), newClientMock(test.paths...)) + conf := p.loadConfigurationFromGateway(t.Context(), newClientMock(test.paths...)) assert.Equal(t, test.expected, conf) }) } @@ -2215,7 +2214,7 @@ func TestLoadTCPRoutes(t *testing.T) { } p := Provider{EntryPoints: test.entryPoints} - conf := p.loadConfigurationFromGateway(context.Background(), newClientMock(test.paths...)) + conf := p.loadConfigurationFromGateway(t.Context(), newClientMock(test.paths...)) assert.Equal(t, test.expected, conf) }) } @@ -3307,7 +3306,7 @@ func TestLoadTLSRoutes(t *testing.T) { } p := Provider{EntryPoints: test.entryPoints} - conf := p.loadConfigurationFromGateway(context.Background(), newClientMock(test.paths...)) + conf := p.loadConfigurationFromGateway(t.Context(), newClientMock(test.paths...)) assert.Equal(t, test.expected, conf) }) } @@ -4258,7 +4257,7 @@ func TestLoadMixedRoutes(t *testing.T) { } p := Provider{EntryPoints: test.entryPoints} - conf := p.loadConfigurationFromGateway(context.Background(), newClientMock(test.paths...)) + conf := p.loadConfigurationFromGateway(t.Context(), newClientMock(test.paths...)) assert.Equal(t, test.expected, conf) }) } diff --git a/pkg/provider/kubernetes/ingress/client_test.go b/pkg/provider/kubernetes/ingress/client_test.go index 725ba3491..0f82d9847 100644 --- a/pkg/provider/kubernetes/ingress/client_test.go +++ b/pkg/provider/kubernetes/ingress/client_test.go @@ -1,7 +1,6 @@ package ingress import ( - "context" "errors" "testing" "time" @@ -243,7 +242,7 @@ func TestClientIgnoresEmptyEndpointUpdates(t *testing.T) { assert.Fail(t, "expected to receive event for endpoints") } - emptyEndpoint, err = kubeClient.CoreV1().Endpoints("test").Get(context.TODO(), "empty-endpoint", metav1.GetOptions{}) + emptyEndpoint, err = kubeClient.CoreV1().Endpoints("test").Get(t.Context(), "empty-endpoint", metav1.GetOptions{}) assert.NoError(t, err) // Update endpoint annotation and resource version (apparently not done by fake client itself) @@ -251,7 +250,7 @@ func TestClientIgnoresEmptyEndpointUpdates(t *testing.T) { // This reflects the behavior of kubernetes controllers which use endpoint annotations for leader election. emptyEndpoint.Annotations["test-annotation"] = "___" emptyEndpoint.ResourceVersion = "1245" - _, err = kubeClient.CoreV1().Endpoints("test").Update(context.TODO(), emptyEndpoint, metav1.UpdateOptions{}) + _, err = kubeClient.CoreV1().Endpoints("test").Update(t.Context(), emptyEndpoint, metav1.UpdateOptions{}) require.NoError(t, err) select { @@ -263,12 +262,12 @@ func TestClientIgnoresEmptyEndpointUpdates(t *testing.T) { case <-time.After(50 * time.Millisecond): } - filledEndpoint, err = kubeClient.CoreV1().Endpoints("test").Get(context.TODO(), "filled-endpoint", metav1.GetOptions{}) + filledEndpoint, err = kubeClient.CoreV1().Endpoints("test").Get(t.Context(), "filled-endpoint", metav1.GetOptions{}) assert.NoError(t, err) filledEndpoint.Subsets[0].Addresses[0].IP = "10.13.37.2" filledEndpoint.ResourceVersion = "1235" - _, err = kubeClient.CoreV1().Endpoints("test").Update(context.TODO(), filledEndpoint, metav1.UpdateOptions{}) + _, err = kubeClient.CoreV1().Endpoints("test").Update(t.Context(), filledEndpoint, metav1.UpdateOptions{}) require.NoError(t, err) select { diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index 8780d83c7..078fdbaa9 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -1,7 +1,6 @@ package ingress import ( - "context" "errors" "math" "os" @@ -1658,7 +1657,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { clientMock := newClientMock(serverVersion, paths...) p := Provider{IngressClass: test.ingressClass, AllowEmptyServices: test.allowEmptyServices} - conf := p.loadConfigurationFromIngresses(context.Background(), clientMock) + conf := p.loadConfigurationFromIngresses(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) @@ -1804,7 +1803,7 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) { p := Provider{IngressClass: test.ingressClass} p.AllowExternalNameServices = test.allowExternalNameServices - conf := p.loadConfigurationFromIngresses(context.Background(), clientMock) + conf := p.loadConfigurationFromIngresses(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) @@ -1881,7 +1880,7 @@ func TestLoadConfigurationFromIngressesWithNativeLB(t *testing.T) { clientMock := newClientMock(serverVersion, paths...) p := Provider{IngressClass: test.ingressClass} - conf := p.loadConfigurationFromIngresses(context.Background(), clientMock) + conf := p.loadConfigurationFromIngresses(t.Context(), clientMock) assert.Equal(t, test.expected, conf) }) @@ -2053,7 +2052,7 @@ func TestGetCertificates(t *testing.T) { t.Parallel() tlsConfigs := map[string]*tls.CertAndStores{} - err := getCertificates(context.Background(), test.ingress, test.client, tlsConfigs) + err := getCertificates(t.Context(), test.ingress, test.client, tlsConfigs) if test.errResult != "" { assert.EqualError(t, err, test.errResult) diff --git a/pkg/provider/kv/kv_test.go b/pkg/provider/kv/kv_test.go index 18693d485..3d3fdad2f 100644 --- a/pkg/provider/kv/kv_test.go +++ b/pkg/provider/kv/kv_test.go @@ -1,7 +1,6 @@ package kv import ( - "context" "errors" "testing" "time" @@ -285,7 +284,7 @@ func Test_buildConfiguration(t *testing.T) { "traefik/tls/certificates/1/stores/1": "foobar", })) - cfg, err := provider.buildConfiguration(context.Background()) + cfg, err := provider.buildConfiguration(t.Context()) require.NoError(t, err) expected := &dynamic.Configuration{ @@ -931,7 +930,7 @@ func Test_buildConfiguration_KV_error(t *testing.T) { }, } - cfg, err := provider.buildConfiguration(context.Background()) + cfg, err := provider.buildConfiguration(t.Context()) require.Error(t, err) assert.Nil(t, cfg) } @@ -950,7 +949,7 @@ func TestKvWatchTree(t *testing.T) { configChan := make(chan dynamic.Message) go func() { - err := provider.watchKv(context.Background(), configChan) + err := provider.watchKv(t.Context(), configChan) require.NoError(t, err) }() diff --git a/pkg/provider/marathon/config_test.go b/pkg/provider/marathon/config_test.go index f8923833c..4857aad8e 100644 --- a/pkg/provider/marathon/config_test.go +++ b/pkg/provider/marathon/config_test.go @@ -1,7 +1,6 @@ package marathon import ( - "context" "math" "testing" @@ -22,7 +21,7 @@ func TestGetConfigurationAPIErrors(t *testing.T) { marathonClient: fakeClient, } - actualConfig := p.getConfigurations(context.Background()) + actualConfig := p.getConfigurations(t.Context()) fakeClient.AssertExpectations(t) if actualConfig != nil { @@ -2051,7 +2050,7 @@ func TestBuildConfiguration(t *testing.T) { err := p.Init() require.NoError(t, err) - actualConfig := p.buildConfiguration(context.Background(), test.applications) + actualConfig := p.buildConfiguration(t.Context(), test.applications) assert.NotNil(t, actualConfig) assert.Equal(t, test.expected, actualConfig) @@ -2097,7 +2096,7 @@ func TestApplicationFilterEnabled(t *testing.T) { extraConf, err := provider.getConfiguration(app) require.NoError(t, err) - if provider.keepApplication(context.Background(), extraConf, stringValueMap(app.Labels)) != test.expected { + if provider.keepApplication(t.Context(), extraConf, stringValueMap(app.Labels)) != test.expected { t.Errorf("got unexpected filtering = %t", !test.expected) } }) diff --git a/pkg/provider/nomad/config_test.go b/pkg/provider/nomad/config_test.go index b18335d3c..ec3545db5 100644 --- a/pkg/provider/nomad/config_test.go +++ b/pkg/provider/nomad/config_test.go @@ -1,7 +1,6 @@ package nomad import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -229,8 +228,7 @@ func Test_defaultRule(t *testing.T) { err := p.Init() require.NoError(t, err) - ctx := context.TODO() - config := p.buildConfig(ctx, test.items) + config := p.buildConfig(t.Context(), test.items) require.Equal(t, test.expected, config) }) } @@ -2680,8 +2678,7 @@ func Test_buildConfig(t *testing.T) { err := p.Init() require.NoError(t, err) - ctx := context.TODO() - c := p.buildConfig(ctx, test.items) + c := p.buildConfig(t.Context(), test.items) require.Equal(t, test.expected, c) }) } @@ -2729,8 +2726,8 @@ func Test_keepItem(t *testing.T) { p := new(Provider) p.SetDefaults() p.Constraints = test.constraints - ctx := context.TODO() - result := p.keepItem(ctx, test.i) + + result := p.keepItem(t.Context(), test.i) require.Equal(t, test.exp, result) }) } diff --git a/pkg/provider/nomad/nomad_test.go b/pkg/provider/nomad/nomad_test.go index 745a85a23..e6a11c60c 100644 --- a/pkg/provider/nomad/nomad_test.go +++ b/pkg/provider/nomad/nomad_test.go @@ -1,7 +1,6 @@ package nomad import ( - "context" "net/http" "net/http/httptest" "strings" @@ -155,7 +154,7 @@ func Test_getNomadServiceData(t *testing.T) { require.NoError(t, err) // make the query for services - items, err := p.getNomadServiceData(context.TODO()) + items, err := p.getNomadServiceData(t.Context()) require.NoError(t, err) require.Len(t, items, 2) } diff --git a/pkg/provider/rancher/config_test.go b/pkg/provider/rancher/config_test.go index 80e9b2322..6dfe75e44 100644 --- a/pkg/provider/rancher/config_test.go +++ b/pkg/provider/rancher/config_test.go @@ -1,7 +1,6 @@ package rancher import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -1281,7 +1280,7 @@ func Test_buildConfiguration(t *testing.T) { require.NoError(t, err) } - configuration := p.buildConfiguration(context.Background(), test.containers) + configuration := p.buildConfiguration(t.Context(), test.containers) assert.Equal(t, test.expected, configuration) }) diff --git a/pkg/provider/traefik/internal_test.go b/pkg/provider/traefik/internal_test.go index 133273044..3dccf6843 100644 --- a/pkg/provider/traefik/internal_test.go +++ b/pkg/provider/traefik/internal_test.go @@ -1,7 +1,6 @@ package traefik import ( - "context" "encoding/json" "flag" "os" @@ -262,7 +261,7 @@ func Test_createConfiguration(t *testing.T) { provider := Provider{staticCfg: test.staticCfg} - cfg := provider.createConfiguration(context.Background()) + cfg := provider.createConfiguration(t.Context()) filename := filepath.Join("fixtures", test.desc) diff --git a/pkg/safe/routine_test.go b/pkg/safe/routine_test.go index 12875972c..3fa403e78 100644 --- a/pkg/safe/routine_test.go +++ b/pkg/safe/routine_test.go @@ -15,7 +15,7 @@ func TestNewPoolContext(t *testing.T) { testKey := testKeyType("test") - ctx := context.WithValue(context.Background(), testKey, "test") + ctx := context.WithValue(t.Context(), testKey, "test") p := NewPool(ctx) p.GoCtx(func(ctx context.Context) { @@ -66,7 +66,7 @@ func TestPoolWithCtx(t *testing.T) { t.Run(test.desc, func(t *testing.T) { // These subtests cannot be run in parallel, since the testRoutine // is shared across the subtests. - p := NewPool(context.Background()) + p := NewPool(t.Context()) timer := time.NewTimer(500 * time.Millisecond) defer timer.Stop() @@ -93,7 +93,7 @@ func TestPoolWithCtx(t *testing.T) { } func TestPoolCleanupWithGoPanicking(t *testing.T) { - p := NewPool(context.Background()) + p := NewPool(t.Context()) timer := time.NewTimer(500 * time.Millisecond) defer timer.Stop() diff --git a/pkg/server/configurationwatcher_test.go b/pkg/server/configurationwatcher_test.go index e7179734c..64019c191 100644 --- a/pkg/server/configurationwatcher_test.go +++ b/pkg/server/configurationwatcher_test.go @@ -57,7 +57,7 @@ func (p *mockProvider) Init() error { } func TestNewConfigurationWatcher(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) t.Cleanup(routinesPool.Stop) pvd := &mockProvider{ @@ -114,7 +114,7 @@ func TestNewConfigurationWatcher(t *testing.T) { } func TestWaitForRequiredProvider(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) pvdAggregator := &mockProvider{ wait: 5 * time.Millisecond, @@ -162,7 +162,7 @@ func TestWaitForRequiredProvider(t *testing.T) { } func TestIgnoreTransientConfiguration(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) config := &dynamic.Configuration{ HTTP: th.BuildConfiguration( @@ -298,7 +298,7 @@ func TestIgnoreTransientConfiguration(t *testing.T) { } func TestListenProvidersThrottleProviderConfigReload(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) pvd := &mockProvider{ wait: 10 * time.Millisecond, @@ -343,7 +343,7 @@ func TestListenProvidersThrottleProviderConfigReload(t *testing.T) { } func TestListenProvidersSkipsEmptyConfigs(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) pvd := &mockProvider{ messages: []dynamic.Message{{ProviderName: "mock"}}, @@ -364,7 +364,7 @@ func TestListenProvidersSkipsEmptyConfigs(t *testing.T) { } func TestListenProvidersSkipsSameConfigurationForProvider(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) message := dynamic.Message{ ProviderName: "mock", @@ -398,7 +398,7 @@ func TestListenProvidersSkipsSameConfigurationForProvider(t *testing.T) { } func TestListenProvidersDoesNotSkipFlappingConfiguration(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) configuration := &dynamic.Configuration{ HTTP: th.BuildConfiguration( @@ -466,7 +466,7 @@ func TestListenProvidersDoesNotSkipFlappingConfiguration(t *testing.T) { } func TestListenProvidersIgnoreSameConfig(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) configuration := &dynamic.Configuration{ HTTP: th.BuildConfiguration( @@ -557,7 +557,7 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) { } func TestApplyConfigUnderStress(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) watcher := NewConfigurationWatcher(routinesPool, &mockProvider{}, []string{}, "") @@ -600,7 +600,7 @@ func TestApplyConfigUnderStress(t *testing.T) { } func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) configuration := &dynamic.Configuration{ HTTP: th.BuildConfiguration( @@ -691,7 +691,7 @@ func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) { } func TestListenProvidersPublishesConfigForEachProvider(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) configuration := &dynamic.Configuration{ HTTP: th.BuildConfiguration( @@ -756,7 +756,7 @@ func TestListenProvidersPublishesConfigForEachProvider(t *testing.T) { } func TestPublishConfigUpdatedByProvider(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) pvdConfiguration := dynamic.Configuration{ TCP: &dynamic.TCPConfiguration{ @@ -802,7 +802,7 @@ func TestPublishConfigUpdatedByProvider(t *testing.T) { } func TestPublishConfigUpdatedByConfigWatcherListener(t *testing.T) { - routinesPool := safe.NewPool(context.Background()) + routinesPool := safe.NewPool(t.Context()) pvd := &mockProvider{ wait: 10 * time.Millisecond, diff --git a/pkg/server/middleware/middlewares_test.go b/pkg/server/middleware/middlewares_test.go index 58b053053..ed4456b31 100644 --- a/pkg/server/middleware/middlewares_test.go +++ b/pkg/server/middleware/middlewares_test.go @@ -1,7 +1,6 @@ package middleware import ( - "context" "errors" "net/http" "net/http/httptest" @@ -20,7 +19,7 @@ func TestBuilder_BuildChainNilConfig(t *testing.T) { } middlewaresBuilder := NewBuilder(testConfig, nil, nil) - chain := middlewaresBuilder.BuildChain(context.Background(), []string{"empty"}) + chain := middlewaresBuilder.BuildChain(t.Context(), []string{"empty"}) _, err := chain.Then(nil) require.Error(t, err) } @@ -31,7 +30,7 @@ func TestBuilder_BuildChainNonExistentChain(t *testing.T) { } middlewaresBuilder := NewBuilder(testConfig, nil, nil) - chain := middlewaresBuilder.BuildChain(context.Background(), []string{"empty"}) + chain := middlewaresBuilder.BuildChain(t.Context(), []string{"empty"}) _, err := chain.Then(nil) require.Error(t, err) } @@ -259,7 +258,7 @@ func TestBuilder_BuildChainWithContext(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - ctx := context.Background() + ctx := t.Context() if len(test.contextProvider) > 0 { ctx = provider.AddInContext(ctx, "foobar@"+test.contextProvider) } @@ -366,7 +365,7 @@ func TestBuilder_buildConstructor(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - constructor, err := middlewaresBuilder.buildConstructor(context.Background(), test.middlewareID) + constructor, err := middlewaresBuilder.buildConstructor(t.Context(), test.middlewareID) require.NoError(t, err) middleware, err2 := constructor(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) diff --git a/pkg/server/provider/provider_test.go b/pkg/server/provider/provider_test.go index 7686d1bb5..f4a0b27e3 100644 --- a/pkg/server/provider/provider_test.go +++ b/pkg/server/provider/provider_test.go @@ -16,31 +16,31 @@ func TestAddInContext(t *testing.T) { }{ { desc: "without provider information", - ctx: context.Background(), + ctx: t.Context(), name: "test", expected: "", }, { desc: "provider name embedded in element name", - ctx: context.Background(), + ctx: t.Context(), name: "test@foo", expected: "foo", }, { desc: "provider name in context", - ctx: context.WithValue(context.Background(), key, "foo"), + ctx: context.WithValue(t.Context(), key, "foo"), name: "test", expected: "foo", }, { desc: "provider name in context and different provider name embedded in element name", - ctx: context.WithValue(context.Background(), key, "foo"), + ctx: context.WithValue(t.Context(), key, "foo"), name: "test@fii", expected: "fii", }, { desc: "provider name in context and same provider name embedded in element name", - ctx: context.WithValue(context.Background(), key, "foo"), + ctx: context.WithValue(t.Context(), key, "foo"), name: "test@foo", expected: "foo", }, @@ -71,31 +71,31 @@ func TestGetQualifiedName(t *testing.T) { }{ { desc: "empty name", - ctx: context.Background(), + ctx: t.Context(), name: "", expected: "", }, { desc: "without provider", - ctx: context.Background(), + ctx: t.Context(), name: "test", expected: "test", }, { desc: "with explicit provider", - ctx: context.Background(), + ctx: t.Context(), name: "test@foo", expected: "test@foo", }, { desc: "with provider in context", - ctx: context.WithValue(context.Background(), key, "foo"), + ctx: context.WithValue(t.Context(), key, "foo"), name: "test", expected: "test@foo", }, { desc: "with provider in context and explicit name", - ctx: context.WithValue(context.Background(), key, "foo"), + ctx: context.WithValue(t.Context(), key, "foo"), name: "test@fii", expected: "test@fii", }, diff --git a/pkg/server/router/router_test.go b/pkg/server/router/router_test.go index 3f6c9bbe9..c1c5e3b8a 100644 --- a/pkg/server/router/router_test.go +++ b/pkg/server/router/router_test.go @@ -1,7 +1,6 @@ package router import ( - "context" "io" "math" "net/http" @@ -322,7 +321,7 @@ func TestRouterManager_Get(t *testing.T) { routerManager := NewManager(rtConf, serviceManager, middlewaresBuilder, chainBuilder, metrics.NewVoidRegistry(), tlsManager) - handlers := routerManager.BuildHandlers(context.Background(), test.entryPoints, false) + handlers := routerManager.BuildHandlers(t.Context(), test.entryPoints, false) w := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://foo.bar/", nil) @@ -429,7 +428,7 @@ func TestAccessLog(t *testing.T) { routerManager := NewManager(rtConf, serviceManager, middlewaresBuilder, chainBuilder, metrics.NewVoidRegistry(), tlsManager) - handlers := routerManager.BuildHandlers(context.Background(), test.entryPoints, false) + handlers := routerManager.BuildHandlers(t.Context(), test.entryPoints, false) w := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://foo.bar/", nil) @@ -813,12 +812,12 @@ func TestRuntimeConfiguration(t *testing.T) { middlewaresBuilder := middleware.NewBuilder(rtConf.Middlewares, serviceManager, nil) chainBuilder := middleware.NewChainBuilder(nil, nil, nil) tlsManager := tls.NewManager() - tlsManager.UpdateConfigs(context.Background(), nil, test.tlsOptions, nil) + tlsManager.UpdateConfigs(t.Context(), nil, test.tlsOptions, nil) routerManager := NewManager(rtConf, serviceManager, middlewaresBuilder, chainBuilder, metrics.NewVoidRegistry(), tlsManager) - _ = routerManager.BuildHandlers(context.Background(), entryPoints, false) - _ = routerManager.BuildHandlers(context.Background(), entryPoints, true) + _ = routerManager.BuildHandlers(t.Context(), entryPoints, false) + _ = routerManager.BuildHandlers(t.Context(), entryPoints, true) // even though rtConf was passed by argument to the manager builders above, // it's ok to use it as the result we check, because everything worth checking @@ -894,7 +893,7 @@ func TestProviderOnMiddlewares(t *testing.T) { routerManager := NewManager(rtConf, serviceManager, middlewaresBuilder, chainBuilder, metrics.NewVoidRegistry(), tlsManager) - _ = routerManager.BuildHandlers(context.Background(), entryPoints, false) + _ = routerManager.BuildHandlers(t.Context(), entryPoints, false) assert.Equal(t, []string{"chain@file", "m1@file"}, rtConf.Routers["router@file"].Middlewares) assert.Equal(t, []string{"m1@file", "m2@file", "m1@file"}, rtConf.Middlewares["chain@file"].Chain.Middlewares) @@ -963,7 +962,7 @@ func BenchmarkRouterServe(b *testing.B) { routerManager := NewManager(rtConf, serviceManager, middlewaresBuilder, chainBuilder, metrics.NewVoidRegistry(), tlsManager) - handlers := routerManager.BuildHandlers(context.Background(), entryPoints, false) + handlers := routerManager.BuildHandlers(b.Context(), entryPoints, false) w := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://foo.bar/", nil) @@ -1003,7 +1002,7 @@ func BenchmarkService(b *testing.B) { w := httptest.NewRecorder() req := testhelpers.MustNewRequest(http.MethodGet, "http://foo.bar/", nil) - handler, _ := serviceManager.BuildHTTP(context.Background(), "foo-service") + handler, _ := serviceManager.BuildHTTP(b.Context(), "foo-service") b.ReportAllocs() for range b.N { handler.ServeHTTP(w, req) diff --git a/pkg/server/router/tcp/manager_test.go b/pkg/server/router/tcp/manager_test.go index 2ccbcb24b..d005f1b0e 100644 --- a/pkg/server/router/tcp/manager_test.go +++ b/pkg/server/router/tcp/manager_test.go @@ -1,7 +1,6 @@ package tcp import ( - "context" "crypto/tls" "math" "net/http" @@ -347,7 +346,7 @@ func TestRuntimeConfiguration(t *testing.T) { serviceManager := tcp.NewManager(conf) tlsManager := traefiktls.NewManager() tlsManager.UpdateConfigs( - context.Background(), + t.Context(), map[string]traefiktls.Store{}, map[string]traefiktls.Options{ "default": { @@ -367,7 +366,7 @@ func TestRuntimeConfiguration(t *testing.T) { routerManager := NewManager(conf, serviceManager, middlewaresBuilder, nil, nil, tlsManager) - _ = routerManager.BuildHandlers(context.Background(), entryPoints) + _ = routerManager.BuildHandlers(t.Context(), entryPoints) // even though conf was passed by argument to the manager builders above, // it's ok to use it as the result we check, because everything worth checking @@ -658,7 +657,7 @@ func TestDomainFronting(t *testing.T) { serviceManager := tcp.NewManager(conf) tlsManager := traefiktls.NewManager() - tlsManager.UpdateConfigs(context.Background(), map[string]traefiktls.Store{}, test.tlsOptions, []*traefiktls.CertAndStores{}) + tlsManager.UpdateConfigs(t.Context(), map[string]traefiktls.Store{}, test.tlsOptions, []*traefiktls.CertAndStores{}) httpsHandler := map[string]http.Handler{ "web": http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {}), @@ -668,7 +667,7 @@ func TestDomainFronting(t *testing.T) { routerManager := NewManager(conf, serviceManager, middlewaresBuilder, nil, httpsHandler, tlsManager) - routers := routerManager.BuildHandlers(context.Background(), entryPoints) + routers := routerManager.BuildHandlers(t.Context(), entryPoints) router, ok := routers["web"] require.True(t, ok) diff --git a/pkg/server/router/tcp/router_test.go b/pkg/server/router/tcp/router_test.go index 2f997c7f1..55b4b4f11 100644 --- a/pkg/server/router/tcp/router_test.go +++ b/pkg/server/router/tcp/router_test.go @@ -2,7 +2,6 @@ package tcp import ( "bytes" - "context" "crypto/tls" "errors" "fmt" @@ -172,7 +171,7 @@ func Test_Routing(t *testing.T) { // Creates the tlsManager and defines the TLS 1.0 and 1.2 TLSOptions. tlsManager := traefiktls.NewManager() tlsManager.UpdateConfigs( - context.Background(), + t.Context(), map[string]traefiktls.Store{ tlsalpn01.ACMETLS1Protocol: {}, }, @@ -588,7 +587,7 @@ func Test_Routing(t *testing.T) { router(dynConf) } - router, err := manager.buildEntryPointHandler(context.Background(), dynConf.TCPRouters, dynConf.Routers, nil, nil) + router, err := manager.buildEntryPointHandler(t.Context(), dynConf.TCPRouters, dynConf.Routers, nil, nil) require.NoError(t, err) if test.allowACMETLSPassthrough { diff --git a/pkg/server/router/udp/router_test.go b/pkg/server/router/udp/router_test.go index a71662b48..5967e3fe2 100644 --- a/pkg/server/router/udp/router_test.go +++ b/pkg/server/router/udp/router_test.go @@ -1,7 +1,6 @@ package udp import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -118,7 +117,7 @@ func TestRuntimeConfiguration(t *testing.T) { serviceManager := udp.NewManager(conf) routerManager := NewManager(conf, serviceManager) - _ = routerManager.BuildHandlers(context.Background(), entryPoints) + _ = routerManager.BuildHandlers(t.Context(), entryPoints) // even though conf was passed by argument to the manager builders above, // it's ok to use it as the result we check, because everything worth checking diff --git a/pkg/server/server_entrypoint_tcp.go b/pkg/server/server_entrypoint_tcp.go index ea1f1975b..3257d6720 100644 --- a/pkg/server/server_entrypoint_tcp.go +++ b/pkg/server/server_entrypoint_tcp.go @@ -31,8 +31,6 @@ import ( "github.com/traefik/traefik/v2/pkg/server/service" "github.com/traefik/traefik/v2/pkg/tcp" "github.com/traefik/traefik/v2/pkg/types" - "golang.org/x/net/http2" - "golang.org/x/net/http2/h2c" ) var httpServerLogger = stdlog.New(log.WithoutContext().WriterLevel(logrus.DebugLevel), "", 0) @@ -577,11 +575,12 @@ func createHTTPServer(ctx context.Context, ln net.Listener, configuration *stati handler = newKeepAliveMiddleware(handler, configuration.Transport.KeepAliveMaxRequests, configuration.Transport.KeepAliveMaxTime) } - if withH2c { - handler = h2c.NewHandler(handler, &http2.Server{ - MaxConcurrentStreams: uint32(configuration.HTTP2.MaxConcurrentStreams), - }) - } + var protocols http.Protocols + protocols.SetHTTP1(true) + protocols.SetHTTP2(true) + + // With the addition of UnencryptedHTTP2 in http.Server#Protocols in go1.24 setting the h2c handler is not necessary anymore. + protocols.SetUnencryptedHTTP2(withH2c) if configuration.HTTP.EncodeQuerySemicolons { handler = encodeQuerySemicolons(handler) @@ -602,11 +601,15 @@ func createHTTPServer(ctx context.Context, ln net.Listener, configuration *stati handler = denyFragment(handler) serverHTTP := &http.Server{ + Protocols: &protocols, Handler: handler, ErrorLog: httpServerLogger, ReadTimeout: time.Duration(configuration.Transport.RespondingTimeouts.ReadTimeout), WriteTimeout: time.Duration(configuration.Transport.RespondingTimeouts.WriteTimeout), IdleTimeout: time.Duration(configuration.Transport.RespondingTimeouts.IdleTimeout), + HTTP2: &http.HTTP2Config{ + MaxConcurrentStreams: int(configuration.HTTP2.MaxConcurrentStreams), + }, } if debugConnection || (configuration.Transport != nil && (configuration.Transport.KeepAliveMaxTime > 0 || configuration.Transport.KeepAliveMaxRequests > 0)) { serverHTTP.ConnContext = func(ctx context.Context, c net.Conn) context.Context { @@ -640,19 +643,6 @@ func createHTTPServer(ctx context.Context, ln net.Listener, configuration *stati return ctx } - // ConfigureServer configures HTTP/2 with the MaxConcurrentStreams option for the given server. - // Also keeping behavior the same as - // https://cs.opensource.google/go/go/+/refs/tags/go1.17.7:src/net/http/server.go;l=3262 - if !strings.Contains(os.Getenv("GODEBUG"), "http2server=0") { - err = http2.ConfigureServer(serverHTTP, &http2.Server{ - MaxConcurrentStreams: uint32(configuration.HTTP2.MaxConcurrentStreams), - NewWriteScheduler: func() http2.WriteScheduler { return http2.NewPriorityWriteScheduler(nil) }, - }) - if err != nil { - return nil, fmt.Errorf("configure HTTP/2 server: %w", err) - } - } - listener := newHTTPForwarder(ln) go func() { err := serverHTTP.Serve(listener) diff --git a/pkg/server/server_entrypoint_tcp_http3_test.go b/pkg/server/server_entrypoint_tcp_http3_test.go index 2dee92df2..bcaa1c028 100644 --- a/pkg/server/server_entrypoint_tcp_http3_test.go +++ b/pkg/server/server_entrypoint_tcp_http3_test.go @@ -2,7 +2,6 @@ package server import ( "bufio" - "context" "crypto/tls" "crypto/x509" "net/http" @@ -87,7 +86,7 @@ func TestHTTP3AdvertisedPort(t *testing.T) { epConfig := &static.EntryPointsTransport{} epConfig.SetDefaults() - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: "127.0.0.1:0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -108,7 +107,7 @@ func TestHTTP3AdvertisedPort(t *testing.T) { rw.WriteHeader(http.StatusOK) }), nil) - ctx := context.Background() + ctx := t.Context() go entryPoint.Start(ctx) entryPoint.SwitchRouter(router) @@ -151,7 +150,7 @@ func TestHTTP30RTT(t *testing.T) { epConfig := &static.EntryPointsTransport{} epConfig.SetDefaults() - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: "127.0.0.1:8090", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -170,7 +169,7 @@ func TestHTTP30RTT(t *testing.T) { rw.WriteHeader(http.StatusOK) }), nil) - ctx := context.Background() + ctx := t.Context() go entryPoint.Start(ctx) entryPoint.SwitchRouter(router) @@ -193,7 +192,7 @@ func TestHTTP30RTT(t *testing.T) { tlsConf.ClientSessionCache = cache // This first DialAddrEarly connection is here to populate the cache. - earlyConnection, err := quic.DialAddrEarly(context.Background(), "127.0.0.1:8090", tlsConf, &quic.Config{}) + earlyConnection, err := quic.DialAddrEarly(t.Context(), "127.0.0.1:8090", tlsConf, &quic.Config{}) require.NoError(t, err) t.Cleanup(func() { @@ -207,7 +206,7 @@ func TestHTTP30RTT(t *testing.T) { // 0RTT is always false on the first connection. require.False(t, earlyConnection.ConnectionState().Used0RTT) - earlyConnection, err = quic.DialAddrEarly(context.Background(), "127.0.0.1:8090", tlsConf, &quic.Config{}) + earlyConnection, err = quic.DialAddrEarly(t.Context(), "127.0.0.1:8090", tlsConf, &quic.Config{}) require.NoError(t, err) <-earlyConnection.HandshakeComplete() diff --git a/pkg/server/server_entrypoint_tcp_test.go b/pkg/server/server_entrypoint_tcp_test.go index e007fc325..f09c9ba63 100644 --- a/pkg/server/server_entrypoint_tcp_test.go +++ b/pkg/server/server_entrypoint_tcp_test.go @@ -81,7 +81,7 @@ func testShutdown(t *testing.T, router *tcprouter.Router) { epConfig.RespondingTimeouts.ReadTimeout = ptypes.Duration(5 * time.Second) epConfig.RespondingTimeouts.WriteTimeout = ptypes.Duration(5 * time.Second) - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ // We explicitly use an IPV4 address because on Alpine, with an IPV6 address // there seems to be shenanigans related to properly cleaning up file descriptors Address: "127.0.0.1:0", @@ -91,7 +91,7 @@ func testShutdown(t *testing.T, router *tcprouter.Router) { }, nil) require.NoError(t, err) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) t.Cleanup(func() { _ = conn.Close() }) @@ -114,7 +114,7 @@ func testShutdown(t *testing.T, router *tcprouter.Router) { _, err = reader.Peek(1) require.NoError(t, err) - go entryPoint.Shutdown(context.Background()) + go entryPoint.Shutdown(t.Context()) // Make sure that new connections are not permitted anymore. // Note that this should be true not only after Shutdown has returned, @@ -145,8 +145,10 @@ func testShutdown(t *testing.T, router *tcprouter.Router) { assert.Equal(t, http.StatusOK, resp.StatusCode) } -func startEntrypoint(entryPoint *TCPEntryPoint, router *tcprouter.Router) (net.Conn, error) { - go entryPoint.Start(context.Background()) +func startEntrypoint(t *testing.T, entryPoint *TCPEntryPoint, router *tcprouter.Router) (net.Conn, error) { + t.Helper() + + go entryPoint.Start(t.Context()) entryPoint.SwitchRouter(router) @@ -168,7 +170,7 @@ func TestReadTimeoutWithoutFirstByte(t *testing.T) { epConfig.SetDefaults() epConfig.RespondingTimeouts.ReadTimeout = ptypes.Duration(2 * time.Second) - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: ":0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -183,7 +185,7 @@ func TestReadTimeoutWithoutFirstByte(t *testing.T) { rw.WriteHeader(http.StatusOK) })) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) errChan := make(chan error) @@ -207,7 +209,7 @@ func TestReadTimeoutWithFirstByte(t *testing.T) { epConfig.SetDefaults() epConfig.RespondingTimeouts.ReadTimeout = ptypes.Duration(2 * time.Second) - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: ":0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -222,7 +224,7 @@ func TestReadTimeoutWithFirstByte(t *testing.T) { rw.WriteHeader(http.StatusOK) })) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) _, err = conn.Write([]byte("GET /some HTTP/1.1\r\n")) @@ -249,7 +251,7 @@ func TestKeepAliveMaxRequests(t *testing.T) { epConfig.SetDefaults() epConfig.KeepAliveMaxRequests = 3 - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: ":0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -264,7 +266,7 @@ func TestKeepAliveMaxRequests(t *testing.T) { rw.WriteHeader(http.StatusOK) })) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) http.DefaultClient.Transport = &http.Transport{ @@ -297,7 +299,7 @@ func TestKeepAliveMaxTime(t *testing.T) { epConfig.SetDefaults() epConfig.KeepAliveMaxTime = ptypes.Duration(time.Millisecond) - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: ":0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -312,7 +314,7 @@ func TestKeepAliveMaxTime(t *testing.T) { rw.WriteHeader(http.StatusOK) })) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) http.DefaultClient.Transport = &http.Transport{ @@ -341,7 +343,7 @@ func TestKeepAliveH2c(t *testing.T) { epConfig.SetDefaults() epConfig.KeepAliveMaxRequests = 1 - entryPoint, err := NewTCPEntryPoint(context.Background(), &static.EntryPoint{ + entryPoint, err := NewTCPEntryPoint(t.Context(), &static.EntryPoint{ Address: ":0", Transport: epConfig, ForwardedHeaders: &static.ForwardedHeaders{}, @@ -356,7 +358,7 @@ func TestKeepAliveH2c(t *testing.T) { rw.WriteHeader(http.StatusOK) })) - conn, err := startEntrypoint(entryPoint, router) + conn, err := startEntrypoint(t, entryPoint, router) require.NoError(t, err) http2Transport := &http2.Transport{ @@ -574,7 +576,7 @@ func TestPathOperations(t *testing.T) { configuration.SetDefaults() // Create the HTTP server using createHTTPServer. - server, err := createHTTPServer(context.Background(), ln, configuration, false, requestdecorator.New(nil)) + server, err := createHTTPServer(t.Context(), ln, configuration, false, requestdecorator.New(nil)) require.NoError(t, err) server.Switcher.UpdateHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/pkg/server/server_entrypoint_udp_test.go b/pkg/server/server_entrypoint_udp_test.go index 0396f434f..580d087cb 100644 --- a/pkg/server/server_entrypoint_udp_test.go +++ b/pkg/server/server_entrypoint_udp_test.go @@ -1,7 +1,6 @@ package server import ( - "context" "io" "net" "testing" @@ -27,7 +26,7 @@ func TestShutdownUDPConn(t *testing.T) { entryPoint, err := NewUDPEntryPoint(&ep) require.NoError(t, err) - go entryPoint.Start(context.Background()) + go entryPoint.Start(t.Context()) entryPoint.Switch(udp.HandlerFunc(func(conn *udp.Conn) { for { b := make([]byte, 1024*1024) @@ -56,7 +55,7 @@ func TestShutdownUDPConn(t *testing.T) { doneChan := make(chan struct{}) go func() { - entryPoint.Shutdown(context.Background()) + entryPoint.Shutdown(t.Context()) close(doneChan) }() diff --git a/pkg/server/service/loadbalancer/failover/failover_test.go b/pkg/server/service/loadbalancer/failover/failover_test.go index 9f8d38215..410557ee9 100644 --- a/pkg/server/service/loadbalancer/failover/failover_test.go +++ b/pkg/server/service/loadbalancer/failover/failover_test.go @@ -1,7 +1,6 @@ package failover import ( - "context" "net/http" "net/http/httptest" "testing" @@ -51,7 +50,7 @@ func TestFailover(t *testing.T) { assert.Equal(t, []int{200}, recorder.status) assert.True(t, status) - failover.SetHandlerStatus(context.Background(), false) + failover.SetHandlerStatus(t.Context(), false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} failover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -61,7 +60,7 @@ func TestFailover(t *testing.T) { assert.Equal(t, []int{200}, recorder.status) assert.True(t, status) - failover.SetFallbackHandlerStatus(context.Background(), false) + failover.SetFallbackHandlerStatus(t.Context(), false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} failover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -92,7 +91,7 @@ func TestFailoverDownThenUp(t *testing.T) { assert.Equal(t, 0, recorder.save["fallback"]) assert.Equal(t, []int{200}, recorder.status) - failover.SetHandlerStatus(context.Background(), false) + failover.SetHandlerStatus(t.Context(), false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} failover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -101,7 +100,7 @@ func TestFailoverDownThenUp(t *testing.T) { assert.Equal(t, 1, recorder.save["fallback"]) assert.Equal(t, []int{200}, recorder.status) - failover.SetHandlerStatus(context.Background(), true) + failover.SetHandlerStatus(t.Context(), true) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} failover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -129,7 +128,7 @@ func TestFailoverPropagate(t *testing.T) { rw.WriteHeader(http.StatusOK) })) err := failover.RegisterStatusUpdater(func(up bool) { - topFailover.SetHandlerStatus(context.Background(), up) + topFailover.SetHandlerStatus(t.Context(), up) }) require.NoError(t, err) @@ -141,7 +140,7 @@ func TestFailoverPropagate(t *testing.T) { assert.Equal(t, 0, recorder.save["topFailover"]) assert.Equal(t, []int{200}, recorder.status) - failover.SetHandlerStatus(context.Background(), false) + failover.SetHandlerStatus(t.Context(), false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} topFailover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -151,7 +150,7 @@ func TestFailoverPropagate(t *testing.T) { assert.Equal(t, 0, recorder.save["topFailover"]) assert.Equal(t, []int{200}, recorder.status) - failover.SetFallbackHandlerStatus(context.Background(), false) + failover.SetFallbackHandlerStatus(t.Context(), false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} topFailover.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) diff --git a/pkg/server/service/loadbalancer/mirror/mirror_test.go b/pkg/server/service/loadbalancer/mirror/mirror_test.go index b417fa13d..3cb59b2f2 100644 --- a/pkg/server/service/loadbalancer/mirror/mirror_test.go +++ b/pkg/server/service/loadbalancer/mirror/mirror_test.go @@ -2,7 +2,6 @@ package mirror import ( "bytes" - "context" "io" "net/http" "net/http/httptest" @@ -20,7 +19,7 @@ func TestMirroringOn100(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusOK) }) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) mirror := New(handler, pool, defaultMaxBodySize, nil) err := mirror.AddMirror(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { atomic.AddInt32(&countMirror1, 1) @@ -49,7 +48,7 @@ func TestMirroringOn10(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusOK) }) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) mirror := New(handler, pool, defaultMaxBodySize, nil) err := mirror.AddMirror(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { atomic.AddInt32(&countMirror1, 1) @@ -74,7 +73,7 @@ func TestMirroringOn10(t *testing.T) { } func TestInvalidPercent(t *testing.T) { - mirror := New(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), safe.NewPool(context.Background()), defaultMaxBodySize, nil) + mirror := New(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), safe.NewPool(t.Context()), defaultMaxBodySize, nil) err := mirror.AddMirror(nil, -1) assert.Error(t, err) @@ -92,7 +91,7 @@ func TestHijack(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusOK) }) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) mirror := New(handler, pool, defaultMaxBodySize, nil) var mirrorRequest bool @@ -116,7 +115,7 @@ func TestFlush(t *testing.T) { handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusOK) }) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) mirror := New(handler, pool, defaultMaxBodySize, nil) var mirrorRequest bool @@ -144,7 +143,7 @@ func TestMirroringWithBody(t *testing.T) { body = []byte(`body`) ) - pool := safe.NewPool(context.Background()) + pool := safe.NewPool(t.Context()) handler := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { assert.NotNil(t, r.Body) diff --git a/pkg/server/service/loadbalancer/wrr/wrr_test.go b/pkg/server/service/loadbalancer/wrr/wrr_test.go index 8ef17faeb..4a953128d 100644 --- a/pkg/server/service/loadbalancer/wrr/wrr_test.go +++ b/pkg/server/service/loadbalancer/wrr/wrr_test.go @@ -90,8 +90,8 @@ func TestBalancerNoServiceUp(t *testing.T) { rw.WriteHeader(http.StatusInternalServerError) }), pointer(1)) - balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "first", false) - balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) + balancer.SetStatus(context.WithValue(t.Context(), serviceName, "parent"), "first", false) + balancer.SetStatus(context.WithValue(t.Context(), serviceName, "parent"), "second", false) recorder := httptest.NewRecorder() balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -110,7 +110,7 @@ func TestBalancerOneServerDown(t *testing.T) { balancer.AddService("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusInternalServerError) }), pointer(1)) - balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) + balancer.SetStatus(context.WithValue(t.Context(), serviceName, "parent"), "second", false) recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} for range 3 { @@ -132,7 +132,7 @@ func TestBalancerDownThenUp(t *testing.T) { rw.Header().Set("server", "second") rw.WriteHeader(http.StatusOK) }), pointer(1)) - balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) + balancer.SetStatus(context.WithValue(t.Context(), serviceName, "parent"), "second", false) recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} for range 3 { @@ -140,7 +140,7 @@ func TestBalancerDownThenUp(t *testing.T) { } assert.Equal(t, 3, recorder.save["first"]) - balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", true) + balancer.SetStatus(context.WithValue(t.Context(), serviceName, "parent"), "second", true) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} for range 2 { balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -174,13 +174,13 @@ func TestBalancerPropagate(t *testing.T) { topBalancer := New(nil, &dynamic.HealthCheck{}) topBalancer.AddService("balancer1", balancer1, pointer(1)) _ = balancer1.RegisterStatusUpdater(func(up bool) { - topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer1", up) + topBalancer.SetStatus(context.WithValue(t.Context(), serviceName, "top"), "balancer1", up) // TODO(mpl): if test gets flaky, add channel or something here to signal that // propagation is done, and wait on it before sending request. }) topBalancer.AddService("balancer2", balancer2, pointer(1)) _ = balancer2.RegisterStatusUpdater(func(up bool) { - topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer2", up) + topBalancer.SetStatus(context.WithValue(t.Context(), serviceName, "top"), "balancer2", up) }) recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} @@ -195,7 +195,7 @@ func TestBalancerPropagate(t *testing.T) { assert.Equal(t, wantStatus, recorder.status) // fourth gets downed, but balancer2 still up since third is still up. - balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "fourth", false) + balancer2.SetStatus(context.WithValue(t.Context(), serviceName, "top"), "fourth", false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} for range 8 { topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) @@ -209,7 +209,7 @@ func TestBalancerPropagate(t *testing.T) { // third gets downed, and the propagation triggers balancer2 to be marked as // down as well for topBalancer. - balancer2.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "third", false) + balancer2.SetStatus(context.WithValue(t.Context(), serviceName, "top"), "third", false) recorder = &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} for range 8 { topBalancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) diff --git a/pkg/server/service/roundtripper_test.go b/pkg/server/service/roundtripper_test.go index 2c5a2584e..9a97e2c98 100644 --- a/pkg/server/service/roundtripper_test.go +++ b/pkg/server/service/roundtripper_test.go @@ -1,7 +1,6 @@ package service import ( - "context" "crypto/tls" "crypto/x509" "net" @@ -351,7 +350,7 @@ func TestKerberosRoundTripper(t *testing.T) { }), } - ctx := AddTransportOnContext(context.Background()) + ctx := AddTransportOnContext(t.Context()) for _, expected := range test.expectedStatusCode { req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://127.0.0.1", http.NoBody) require.NoError(t, err) diff --git a/pkg/server/service/service_test.go b/pkg/server/service/service_test.go index 7bee444a3..2067a800f 100644 --- a/pkg/server/service/service_test.go +++ b/pkg/server/service/service_test.go @@ -69,7 +69,7 @@ func TestGetLoadBalancer(t *testing.T) { t.Run(test.desc, func(t *testing.T) { t.Parallel() - handler, err := sm.getLoadBalancer(context.Background(), test.serviceName, test.service, test.fwd) + handler, err := sm.getLoadBalancer(t.Context(), test.serviceName, test.service, test.fwd) if test.expectError { require.Error(t, err) assert.Nil(t, handler) @@ -336,7 +336,7 @@ func TestGetLoadBalancerServiceHandler(t *testing.T) { for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { - handler, err := sm.getLoadBalancerServiceHandler(context.Background(), test.serviceName, test.service) + handler, err := sm.getLoadBalancerServiceHandler(t.Context(), test.serviceName, test.service) assert.NoError(t, err) assert.NotNil(t, handler) @@ -414,7 +414,7 @@ func Test1xxResponses(t *testing.T) { }, }, } - handler, err := sm.getLoadBalancerServiceHandler(context.Background(), "foobar", config) + handler, err := sm.getLoadBalancerServiceHandler(t.Context(), "foobar", config) assert.NoError(t, err) frontend := httptest.NewServer(handler) @@ -458,7 +458,7 @@ func Test1xxResponses(t *testing.T) { return nil }, } - req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(context.Background(), trace), http.MethodGet, frontend.URL, nil) + req, _ := http.NewRequestWithContext(httptrace.WithClientTrace(t.Context(), trace), http.MethodGet, frontend.URL, nil) res, err := frontendClient.Do(req) assert.NoError(t, err) @@ -506,15 +506,15 @@ func TestManager_ServiceBuilders(t *testing.T) { return nil, nil })) - h, err := manager.BuildHTTP(context.Background(), "test@internal") + h, err := manager.BuildHTTP(t.Context(), "test@internal") require.NoError(t, err) assert.Equal(t, internalHandler, h) - h, err = manager.BuildHTTP(context.Background(), "test@test") + h, err = manager.BuildHTTP(t.Context(), "test@test") require.NoError(t, err) assert.NotNil(t, h) - _, err = manager.BuildHTTP(context.Background(), "wrong@test") + _, err = manager.BuildHTTP(t.Context(), "wrong@test") assert.Error(t, err) } @@ -571,7 +571,7 @@ func TestManager_Build(t *testing.T) { }, }) - ctx := context.Background() + ctx := t.Context() if len(test.providerName) > 0 { ctx = provider.AddInContext(ctx, "foobar@"+test.providerName) } @@ -598,6 +598,6 @@ func TestMultipleTypeOnBuildHTTP(t *testing.T) { }, }) - _, err := manager.BuildHTTP(context.Background(), "test@file") + _, err := manager.BuildHTTP(t.Context(), "test@file") assert.Error(t, err, "cannot create service: multi-types service not supported, consider declaring two different pieces of service instead") } diff --git a/pkg/server/service/tcp/service_test.go b/pkg/server/service/tcp/service_test.go index 6587469cc..857a9568b 100644 --- a/pkg/server/service/tcp/service_test.go +++ b/pkg/server/service/tcp/service_test.go @@ -1,7 +1,6 @@ package tcp import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -181,7 +180,7 @@ func TestManager_BuildTCP(t *testing.T) { TCPServices: test.configs, }) - ctx := context.Background() + ctx := t.Context() if len(test.providerName) > 0 { ctx = provider.AddInContext(ctx, "foobar@"+test.providerName) } diff --git a/pkg/server/service/udp/service_test.go b/pkg/server/service/udp/service_test.go index a3ee3b15e..f3de425f3 100644 --- a/pkg/server/service/udp/service_test.go +++ b/pkg/server/service/udp/service_test.go @@ -1,7 +1,6 @@ package udp import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -181,7 +180,7 @@ func TestManager_BuildUDP(t *testing.T) { UDPServices: test.configs, }) - ctx := context.Background() + ctx := t.Context() if len(test.providerName) > 0 { ctx = provider.AddInContext(ctx, "foobar@"+test.providerName) } diff --git a/pkg/tls/tlsmanager_test.go b/pkg/tls/tlsmanager_test.go index c91e244a1..48490a365 100644 --- a/pkg/tls/tlsmanager_test.go +++ b/pkg/tls/tlsmanager_test.go @@ -1,7 +1,6 @@ package tls import ( - "context" "crypto/tls" "crypto/x509" "encoding/pem" @@ -77,7 +76,7 @@ func TestTLSInStore(t *testing.T) { }} tlsManager := NewManager() - tlsManager.UpdateConfigs(context.Background(), nil, nil, dynamicConfigs) + tlsManager.UpdateConfigs(t.Context(), nil, nil, dynamicConfigs) certs := tlsManager.GetStore("default").DynamicCerts.Get().(map[string]*tls.Certificate) if len(certs) == 0 { @@ -94,7 +93,7 @@ func TestTLSInvalidStore(t *testing.T) { }} tlsManager := NewManager() - tlsManager.UpdateConfigs(context.Background(), + tlsManager.UpdateConfigs(t.Context(), map[string]Store{ "default": { DefaultCertificate: &Certificate{ @@ -158,7 +157,7 @@ func TestManager_Get(t *testing.T) { } tlsManager := NewManager() - tlsManager.UpdateConfigs(context.Background(), nil, tlsConfigs, dynamicConfigs) + tlsManager.UpdateConfigs(t.Context(), nil, tlsConfigs, dynamicConfigs) for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { @@ -297,7 +296,7 @@ func TestClientAuth(t *testing.T) { } tlsManager := NewManager() - tlsManager.UpdateConfigs(context.Background(), nil, tlsConfigs, nil) + tlsManager.UpdateConfigs(t.Context(), nil, tlsConfigs, nil) for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { diff --git a/pkg/types/tls_test.go b/pkg/types/tls_test.go index b123aba53..615267644 100644 --- a/pkg/types/tls_test.go +++ b/pkg/types/tls_test.go @@ -1,7 +1,6 @@ package types import ( - "context" "testing" "github.com/stretchr/testify/assert" @@ -105,7 +104,7 @@ func TestClientTLS_CreateTLSConfig(t *testing.T) { for _, test := range tests { t.Run(test.desc, func(t *testing.T) { - tlsConfig, err := test.clientTLS.CreateTLSConfig(context.Background()) + tlsConfig, err := test.clientTLS.CreateTLSConfig(t.Context()) if test.wantErr { require.Error(t, err) return From 2fdee25bb34ca5df3e9e7914e4da1c3027cc1aec Mon Sep 17 00:00:00 2001 From: Romain Date: Mon, 2 Jun 2025 10:46:04 +0200 Subject: [PATCH 010/172] Attempt to fix TestProxyFromEnvironment test Co-authored-by: Kevin Pollet --- pkg/proxy/fast/proxy_test.go | 95 +++++++++++++----------------------- 1 file changed, 35 insertions(+), 60 deletions(-) diff --git a/pkg/proxy/fast/proxy_test.go b/pkg/proxy/fast/proxy_test.go index e26c67f63..70b1256aa 100644 --- a/pkg/proxy/fast/proxy_test.go +++ b/pkg/proxy/fast/proxy_test.go @@ -20,7 +20,6 @@ import ( "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/static" "github.com/traefik/traefik/v3/pkg/testhelpers" - "github.com/traefik/traefik/v3/pkg/tls/generate" ) const ( @@ -125,9 +124,17 @@ func TestProxyFromEnvironment(t *testing.T) { for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { - backendURL, backendCert := newBackendServer(t, test.tls, http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - _, _ = rw.Write([]byte("backend")) - })) + var backendServer *httptest.Server + if test.tls { + backendServer = httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + _, _ = rw.Write([]byte("backendTLS")) + })) + } else { + backendServer = httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + _, _ = rw.Write([]byte("backend")) + })) + } + t.Cleanup(backendServer.Close) var proxyCalled bool proxyHandler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { @@ -155,8 +162,21 @@ func TestProxyFromEnvironment(t *testing.T) { connHj, _, err := hj.Hijack() require.NoError(t, err) - go func() { _, _ = io.Copy(connHj, conn) }() - _, _ = io.Copy(conn, connHj) + defer func() { + _ = connHj.Close() + _ = conn.Close() + }() + + errCh := make(chan error, 1) + go func() { + _, err = io.Copy(connHj, conn) + errCh <- err + }() + go func() { + _, err = io.Copy(conn, connHj) + errCh <- err + }() + <-errCh // Wait for one of the copy operations to finish }) var proxyURL string @@ -198,7 +218,7 @@ func TestProxyFromEnvironment(t *testing.T) { proxyURL = proxyServer.URL case proxyHTTPS: - proxyServer := httptest.NewServer(proxyHandler) + proxyServer := httptest.NewTLSServer(proxyHandler) t.Cleanup(proxyServer.Close) proxyURL = proxyServer.URL @@ -209,11 +229,8 @@ func TestProxyFromEnvironment(t *testing.T) { if proxyCert != nil { certPool.AddCert(proxyCert) } - if backendCert != nil { - cert, err := x509.ParseCertificate(backendCert.Certificate[0]) - require.NoError(t, err) - - certPool.AddCert(cert) + if backendServer.Certificate() != nil { + certPool.AddCert(backendServer.Certificate()) } builder := NewProxyBuilder(&transportManagerMock{tlsConfig: &tls.Config{RootCAs: certPool}}, static.FastProxyConfig{}) @@ -230,7 +247,7 @@ func TestProxyFromEnvironment(t *testing.T) { return u, nil } - reverseProxy, err := builder.Build("foo", testhelpers.MustParseURL(backendURL), false, false) + reverseProxy, err := builder.Build("foo", testhelpers.MustParseURL(backendServer.URL), false, false) require.NoError(t, err) reverseProxyServer := httptest.NewServer(reverseProxy) @@ -246,7 +263,11 @@ func TestProxyFromEnvironment(t *testing.T) { body, err := io.ReadAll(resp.Body) require.NoError(t, err) - assert.Equal(t, "backend", string(body)) + if test.tls { + assert.Equal(t, "backendTLS", string(body)) + } else { + assert.Equal(t, "backend", string(body)) + } assert.True(t, proxyCalled) }) } @@ -385,52 +406,6 @@ func TestTransferEncodingChunked(t *testing.T) { assert.Equal(t, "chunk 0\nchunk 1\nchunk 2\n", string(body)) } -func newCertificate(t *testing.T, domain string) *tls.Certificate { - t.Helper() - - certPEM, keyPEM, err := generate.KeyPair(domain, time.Time{}) - require.NoError(t, err) - - certificate, err := tls.X509KeyPair(certPEM, keyPEM) - require.NoError(t, err) - - return &certificate -} - -func newBackendServer(t *testing.T, isTLS bool, handler http.Handler) (string, *tls.Certificate) { - t.Helper() - - var ln net.Listener - var err error - var cert *tls.Certificate - - scheme := "http" - domain := "backend.localhost" - if isTLS { - scheme = "https" - - cert = newCertificate(t, domain) - - ln, err = tls.Listen("tcp", ":0", &tls.Config{Certificates: []tls.Certificate{*cert}}) - require.NoError(t, err) - } else { - ln, err = net.Listen("tcp", ":0") - require.NoError(t, err) - } - - srv := &http.Server{Handler: handler} - go func() { _ = srv.Serve(ln) }() - - t.Cleanup(func() { _ = srv.Close() }) - - _, port, err := net.SplitHostPort(ln.Addr().String()) - require.NoError(t, err) - - backendURL := fmt.Sprintf("%s://%s:%s", scheme, domain, port) - - return backendURL, cert -} - type transportManagerMock struct { tlsConfig *tls.Config } From f174014d968f69680e80fcda6439c7dc39ab8038 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 2 Jun 2025 11:00:05 +0200 Subject: [PATCH 011/172] feat: parallelise unit tests --- .github/workflows/test-unit.yaml | 31 ++++++++++++++- internal/testsci/genmatrix.go | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 internal/testsci/genmatrix.go diff --git a/.github/workflows/test-unit.yaml b/.github/workflows/test-unit.yaml index ef82911e2..33e9459df 100644 --- a/.github/workflows/test-unit.yaml +++ b/.github/workflows/test-unit.yaml @@ -14,8 +14,36 @@ env: jobs: + generate-packages: + name: List Go Packages + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + check-latest: true + + - name: Generate matrix + id: set-matrix + run: | + matrix_output=$(go run ./internal/testsci/genmatrix.go) + echo "$matrix_output" + echo "$matrix_output" >> $GITHUB_OUTPUT + test-unit: runs-on: ubuntu-latest + needs: generate-packages + strategy: + matrix: + package: ${{ fromJson(needs.generate-packages.outputs.matrix) }} steps: - name: Check out code @@ -33,7 +61,8 @@ jobs: run: touch webui/static/index.html - name: Tests - run: make test-unit + run: | + go test -v -parallel 8 ${{ matrix.package.group }} test-ui-unit: runs-on: ubuntu-latest diff --git a/internal/testsci/genmatrix.go b/internal/testsci/genmatrix.go new file mode 100644 index 000000000..3c0f82775 --- /dev/null +++ b/internal/testsci/genmatrix.go @@ -0,0 +1,66 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/traefik/traefik/v2/pkg/log" + "golang.org/x/tools/go/packages" +) + +const groupCount = 12 + +type group struct { + Group string `json:"group"` +} + +func main() { + logger := log.WithoutContext() + + cfg := &packages.Config{ + Mode: packages.NeedName, + Dir: ".", + } + + pkgs, err := packages.Load(cfg, "./cmd/...", "./pkg/...") + if err != nil { + logger.Fatalf("Loading packages: %v", err) + } + + var packageNames []string + for _, pkg := range pkgs { + if pkg.PkgPath != "" { + packageNames = append(packageNames, pkg.PkgPath) + } + } + + total := len(packageNames) + perGroup := (total + groupCount - 1) / groupCount + + fmt.Fprintf(os.Stderr, "Total packages: %d\n", total) + fmt.Fprintf(os.Stderr, "Packages per group: %d\n", perGroup) + + var matrix []group + for i := range groupCount { + start := i * perGroup + end := start + perGroup + if start >= total { + break + } + if end > total { + end = total + } + g := strings.Join(packageNames[start:end], " ") + matrix = append(matrix, group{Group: g}) + } + + jsonBytes, err := json.Marshal(matrix) + if err != nil { + logger.Fatalf("Failed to marshal matrix: %v", err) + } + + // Output for GitHub Actions + fmt.Printf("matrix=%s\n", string(jsonBytes)) +} From 92f798dfcd12999007eb83fac18734f260f445c0 Mon Sep 17 00:00:00 2001 From: Jesper Noordsij <45041769+jnoordsij@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:08:04 +0200 Subject: [PATCH 012/172] Update supported versions --- docs/content/deprecation/releases.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/content/deprecation/releases.md b/docs/content/deprecation/releases.md index 1a5fc0b03..0c25265bd 100644 --- a/docs/content/deprecation/releases.md +++ b/docs/content/deprecation/releases.md @@ -6,11 +6,12 @@ Below is a non-exhaustive list of versions and their maintenance status: | Version | Release Date | Active Support | Security Support | |---------|--------------|--------------------|-------------------| -| 3.3 | Jan 06, 2025 | Yes | Yes | +| 3.4 | May 05, 2025 | Yes | Yes | +| 3.3 | Jan 06, 2025 | Ended May 05, 2025 | No | | 3.2 | Oct 28, 2024 | Ended Jan 06, 2025 | No | | 3.1 | Jul 15, 2024 | Ended Oct 28, 2024 | No | | 3.0 | Apr 29, 2024 | Ended Jul 15, 2024 | No | -| 2.11 | Feb 12, 2024 | Ends Apr 29, 2025 | Ends Feb 01, 2026 | +| 2.11 | Feb 12, 2024 | Ended Apr 29, 2025 | Ends Feb 01, 2026 | | 2.10 | Apr 24, 2023 | Ended Feb 12, 2024 | No | | 2.9 | Oct 03, 2022 | Ended Apr 24, 2023 | No | | 2.8 | Jun 29, 2022 | Ended Oct 03, 2022 | No | From fe5c7fdc65884f7193811d7e12519df70b410be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Stuchl=C3=ADk?= Date: Mon, 2 Jun 2025 16:22:04 +0200 Subject: [PATCH 013/172] Add a note to certificatesDuration --- docs/content/https/acme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/https/acme.md b/docs/content/https/acme.md index ce613f964..8e52e6f1b 100644 --- a/docs/content/https/acme.md +++ b/docs/content/https/acme.md @@ -767,6 +767,8 @@ docker run -v "/my/host/acme:/etc/traefik/acme" traefik _Optional, Default=2160_ +`certificatesDuration` specifies the duration (in hours) of the certificates issued by the CA server. It is used to determine when to renew the certificate, but it **doesn't** define the duration of the certificates, that is up to the CA server. + `certificatesDuration` is used to calculate two durations: - `Renew Period`: the period before the end of the certificate duration, during which the certificate should be renewed. From ce1b13f228e2016e821e64f72a61288404c7df80 Mon Sep 17 00:00:00 2001 From: Romain Date: Tue, 3 Jun 2025 09:20:04 +0200 Subject: [PATCH 014/172] Bump sigs.k8s.io/gateway-api to v1.3.0 --- docs/content/providers/kubernetes-gateway.md | 8 +- .../kubernetes/kubernetes-gateway.md | 6 +- .../routing/providers/kubernetes-gateway.md | 4 +- go.mod | 58 +- go.sum | 127 +- .../experimental-v3.4-default-report.yaml | 4 +- ...-v1.2.1.yml => 00-experimental-v1.3.0.yml} | 3954 +++++++++++++---- integration/k8s_conformance_test.go | 2 +- 8 files changed, 3255 insertions(+), 908 deletions(-) rename integration/conformance-reports/{v1.2.1 => v1.3.0}/experimental-v3.4-default-report.yaml (94%) rename integration/fixtures/k8s-conformance/{00-experimental-v1.2.1.yml => 00-experimental-v1.3.0.yml} (83%) diff --git a/docs/content/providers/kubernetes-gateway.md b/docs/content/providers/kubernetes-gateway.md index 650d4fcfd..ef6279eaf 100644 --- a/docs/content/providers/kubernetes-gateway.md +++ b/docs/content/providers/kubernetes-gateway.md @@ -8,11 +8,11 @@ description: "Learn how to use the Kubernetes Gateway API as a provider for conf The Kubernetes Gateway provider is a Traefik implementation of the [Gateway API](https://gateway-api.sigs.k8s.io/) specification from the Kubernetes Special Interest Groups (SIGs). -This provider supports Standard version [v1.2.1](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.2.1) of the Gateway API specification. +This provider supports Standard version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the Gateway API specification. It fully supports all HTTP core and some extended features, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels). -For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.2.1/traefik-traefik). +For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik). ## Requirements @@ -27,7 +27,7 @@ For more details, check out the conformance [report](https://github.com/kubernet ```bash # Install Gateway API CRDs from the Standard channel. - kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml + kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml ``` 2. Install the additional Traefik RBAC required for Gateway API. @@ -275,7 +275,7 @@ providers: ```bash # Install Gateway API CRDs from the Experimental channel. - kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/experimental-install.yaml + kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/experimental-install.yaml ``` ### `labelselector` diff --git a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md index 98b3f2add..07d962efb 100644 --- a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md +++ b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-gateway.md @@ -8,11 +8,11 @@ description: "Learn how to use the Kubernetes Gateway API as a provider for conf The Kubernetes Gateway provider is a Traefik implementation of the [Gateway API](https://gateway-api.sigs.k8s.io/) specification from the Kubernetes Special Interest Groups (SIGs). -This provider supports Standard version [v1.2.1](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.2.1) of the Gateway API specification. +This provider supports Standard version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the Gateway API specification. It fully supports all HTTP core and some extended features, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels). -For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.2.1/traefik-traefik). +For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik). !!! info "Using The Helm Chart" @@ -27,7 +27,7 @@ For more details, check out the conformance [report](https://github.com/kubernet ```bash # Install Gateway API CRDs from the Standard channel. - kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml + kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml ``` 2. Install/update the Traefik [RBAC](../../../dynamic-configuration/kubernetes-gateway-rbac.yml). diff --git a/docs/content/routing/providers/kubernetes-gateway.md b/docs/content/routing/providers/kubernetes-gateway.md index 3137db830..f658ca4ba 100644 --- a/docs/content/routing/providers/kubernetes-gateway.md +++ b/docs/content/routing/providers/kubernetes-gateway.md @@ -8,11 +8,11 @@ description: "The Kubernetes Gateway API can be used as a provider for routing a When using the Kubernetes Gateway API provider, Traefik leverages the Gateway API Custom Resource Definitions (CRDs) to obtain its routing configuration. For detailed information on the Gateway API concepts and resources, refer to the official [documentation](https://gateway-api.sigs.k8s.io/). -The Kubernetes Gateway API provider supports version [v1.2.1](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.2.1) of the specification. +The Kubernetes Gateway API provider supports version [v1.3.0](https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.3.0) of the specification. It fully supports all `HTTPRoute` core and some extended features, like `GRPCRoute`, as well as the `TCPRoute` and `TLSRoute` resources from the [Experimental channel](https://gateway-api.sigs.k8s.io/concepts/versioning/?h=#release-channels). -For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.2.1/traefik-traefik). +For more details, check out the conformance [report](https://github.com/kubernetes-sigs/gateway-api/tree/main/conformance/reports/v1.3.0/traefik-traefik). ## Deploying a Gateway diff --git a/go.mod b/go.mod index b91189865..8f2e12868 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,7 @@ require ( github.com/kvtools/valkeyrie v1.0.0 github.com/kvtools/zookeeper v1.0.2 github.com/mailgun/ttlmap v0.0.0-20170619185759-c1c17f74874f // No tag on the repo. - github.com/miekg/dns v1.1.64 + github.com/miekg/dns v1.1.65 github.com/mitchellh/copystructure v1.2.0 github.com/mitchellh/hashstructure v1.0.0 github.com/mitchellh/mapstructure v1.5.0 @@ -96,23 +96,23 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.34.0 go.opentelemetry.io/otel/trace v1.34.0 golang.org/x/mod v0.23.0 - golang.org/x/net v0.38.0 - golang.org/x/sync v0.12.0 - golang.org/x/sys v0.31.0 - golang.org/x/text v0.23.0 + golang.org/x/net v0.39.0 + golang.org/x/sync v0.13.0 + golang.org/x/sys v0.32.0 + golang.org/x/text v0.24.0 golang.org/x/time v0.11.0 golang.org/x/tools v0.30.0 - google.golang.org/grpc v1.71.0 + google.golang.org/grpc v1.71.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.31.1 - k8s.io/apiextensions-apiserver v0.31.1 - k8s.io/apimachinery v0.31.1 - k8s.io/client-go v0.31.1 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // No tag on the repo. + k8s.io/api v0.32.3 + k8s.io/apiextensions-apiserver v0.32.3 + k8s.io/apimachinery v0.32.3 + k8s.io/client-go v0.32.3 + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // No tag on the repo. mvdan.cc/xurls/v2 v2.5.0 - sigs.k8s.io/controller-runtime v0.18.0 - sigs.k8s.io/gateway-api v1.2.1 + sigs.k8s.io/controller-runtime v0.20.4 + sigs.k8s.io/gateway-api v1.3.0 sigs.k8s.io/yaml v1.4.0 ) @@ -183,9 +183,9 @@ require ( github.com/dnsimple/dnsimple-go v1.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect - github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/exoscale/egoscale/v3 v3.1.13 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect @@ -217,7 +217,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 // indirect + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect @@ -269,7 +269,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/user v0.2.0 // indirect github.com/moby/term v0.5.0 // indirect @@ -292,7 +292,7 @@ require ( github.com/nrdcg/porkbun v0.4.0 // indirect github.com/nzdjb/go-metaname v1.0.0 // indirect github.com/onsi/ginkgo v1.16.5 // indirect - github.com/onsi/ginkgo/v2 v2.20.2 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect @@ -328,7 +328,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.18.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1128 // indirect @@ -349,9 +349,9 @@ require ( github.com/yandex-cloud/go-sdk v0.0.0-20250320143332-9cbcfc5de4ae // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/errs v1.3.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/v3 v3.5.14 // indirect + go.etcd.io/etcd/api/v3 v3.5.16 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect + go.etcd.io/etcd/client/v3 v3.5.16 // indirect go.mongodb.org/mongo-driver v1.13.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect @@ -364,17 +364,17 @@ require ( go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.0 // indirect - go.uber.org/zap v1.26.0 // indirect + go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.36.0 // indirect + golang.org/x/crypto v0.37.0 // indirect golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect golang.org/x/oauth2 v0.28.0 // indirect - golang.org/x/term v0.30.0 // indirect + golang.org/x/term v0.31.0 // indirect google.golang.org/api v0.227.0 // indirect google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/h2non/gock.v1 v1.0.16 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -382,10 +382,10 @@ require ( gopkg.in/ns1/ns1-go.v2 v2.13.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect nhooyr.io/websocket v1.8.7 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect ) // Containous forks diff --git a/go.sum b/go.sum index aeff1bfa0..908bc663a 100644 --- a/go.sum +++ b/go.sum @@ -319,18 +319,16 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -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/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/exoscale/egoscale/v3 v3.1.13 h1:CAGC7QRjp2AiGj01agsSD0VKCp4OZmW5f51vV2IguNQ= github.com/exoscale/egoscale/v3 v3.1.13/go.mod h1:t9+MpSEam94na48O/xgvvPFpQPRiwZ3kBN4/UuQtKco= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= @@ -497,8 +495,8 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -537,8 +535,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134 h1:c5FlPPgxOn7kJz3VoPLkQYQXGBS3EklQ4Zfi57uOuqQ= -github.com/google/pprof v0.0.0-20240910150728-a0b0bb1d4134/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= @@ -828,8 +826,8 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.47/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/miekg/dns v1.1.64 h1:wuZgD9wwCE6XMT05UU/mlSko71eRSXEAm2EbjQXLKnQ= -github.com/miekg/dns v1.1.64/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= +github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc= +github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= github.com/mimuret/golang-iij-dpf v0.9.1 h1:Gj6EhHJkOhr+q2RnvRPJsPMcjuVnWPSccEHyoEehU34= github.com/mimuret/golang-iij-dpf v0.9.1/go.mod h1:sl9KyOkESib9+KRD3HaGpgi1xk7eoN2+d96LCLsME2M= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -864,8 +862,8 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= 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.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +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/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/user v0.2.0 h1:OnpapJsRp25vkhw8TFG6OLJODNh/3rEwRWtJ3kakwRM= @@ -937,8 +935,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4= -github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -946,8 +944,8 @@ github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je4 github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= +github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1128,8 +1126,9 @@ github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 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/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= @@ -1275,15 +1274,15 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= -go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= +go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= +go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= +go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= +go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= -go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= +go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= +go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1361,8 +1360,8 @@ go.uber.org/ratelimit v0.3.0/go.mod h1:So5LG7CV1zWpY1sHe+DXTJqQvOx+FFPFaAs2SnoyB go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -1396,8 +1395,8 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1497,8 +1496,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= 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.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1520,8 +1519,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1611,8 +1610,8 @@ golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 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.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1621,8 +1620,8 @@ 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.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1638,8 +1637,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.11.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.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1796,8 +1795,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= +google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= 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= @@ -1812,8 +1811,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1870,20 +1869,20 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU= -k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI= -k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40= -k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ= -k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U= -k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0= -k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg= +k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= +k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= +k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= +k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= +k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= 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-20240423202451-8948a665c108 h1:Q8Z7VlGhcJgBHJHYugJ/K/7iB8a2eSxCyxdVjJp+lLY= -k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= @@ -1893,14 +1892,16 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.18.0 h1:Z7jKuX784TQSUL1TIyeuF7j8KXZ4RtSX0YgtjKcSTME= -sigs.k8s.io/controller-runtime v0.18.0/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= -sigs.k8s.io/gateway-api v1.2.1 h1:fZZ/+RyRb+Y5tGkwxFKuYuSRQHu9dZtbjenblleOLHM= -sigs.k8s.io/gateway-api v1.2.1/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= +sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= +sigs.k8s.io/gateway-api v1.3.0 h1:q6okN+/UKDATola4JY7zXzx40WO4VISk7i9DIfOvr9M= +sigs.k8s.io/gateway-api v1.3.0/go.mod h1:d8NV8nJbaRbEKem+5IuxkL8gJGOZ+FJ+NvOIltV8gDk= +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 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/integration/conformance-reports/v1.2.1/experimental-v3.4-default-report.yaml b/integration/conformance-reports/v1.3.0/experimental-v3.4-default-report.yaml similarity index 94% rename from integration/conformance-reports/v1.2.1/experimental-v3.4-default-report.yaml rename to integration/conformance-reports/v1.3.0/experimental-v3.4-default-report.yaml index 2025f9c40..1f0caa773 100644 --- a/integration/conformance-reports/v1.2.1/experimental-v3.4-default-report.yaml +++ b/integration/conformance-reports/v1.3.0/experimental-v3.4-default-report.yaml @@ -1,7 +1,7 @@ apiVersion: gateway.networking.k8s.io/v1 date: '-' gatewayAPIChannel: experimental -gatewayAPIVersion: v1.2.1 +gatewayAPIVersion: v1.3.0 implementation: contact: - '@traefik/maintainers' @@ -46,6 +46,7 @@ profiles: - HTTPRouteResponseHeaderModification - HTTPRouteSchemeRedirect unsupportedFeatures: + - GatewayAddressEmpty - GatewayHTTPListenerIsolation - GatewayInfrastructurePropagation - GatewayStaticAddresses @@ -54,6 +55,7 @@ profiles: - HTTPRouteParentRefPort - HTTPRouteRequestMirror - HTTPRouteRequestMultipleMirrors + - HTTPRouteRequestPercentageMirror - HTTPRouteRequestTimeout name: GATEWAY-HTTP summary: Core tests succeeded. Extended tests succeeded. diff --git a/integration/fixtures/k8s-conformance/00-experimental-v1.2.1.yml b/integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml similarity index 83% rename from integration/fixtures/k8s-conformance/00-experimental-v1.2.1.yml rename to integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml index 69b689846..75725cc0f 100644 --- a/integration/fixtures/k8s-conformance/00-experimental-v1.2.1.yml +++ b/integration/fixtures/k8s-conformance/00-experimental-v1.3.0.yml @@ -1,4 +1,4 @@ -# Copyright 2024 The Kubernetes Authors. +# Copyright 2025 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,507 +17,6 @@ # --- # -# config/crd/experimental/gateway.networking.k8s.io_backendlbpolicies.yaml -# -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 - gateway.networking.k8s.io/channel: experimental - creationTimestamp: null - labels: - gateway.networking.k8s.io/policy: Direct - name: backendlbpolicies.gateway.networking.k8s.io -spec: - group: gateway.networking.k8s.io - names: - categories: - - gateway-api - kind: BackendLBPolicy - listKind: BackendLBPolicyList - plural: backendlbpolicies - shortNames: - - blbpolicy - singular: backendlbpolicy - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha2 - schema: - openAPIV3Schema: - description: |- - BackendLBPolicy provides a way to define load balancing rules - for a backend. - properties: - apiVersion: - description: |- - APIVersion defines the versioned schema of this representation of an object. - Servers should convert recognized schemas to the latest internal value, and - may reject unrecognized values. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources - type: string - kind: - description: |- - Kind is a string value representing the REST resource this object represents. - Servers may infer this from the endpoint the client submits requests to. - Cannot be updated. - In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds - type: string - metadata: - type: object - spec: - description: Spec defines the desired state of BackendLBPolicy. - properties: - sessionPersistence: - description: |- - SessionPersistence defines and configures session persistence - for the backend. - - Support: Extended - properties: - absoluteTimeout: - description: |- - AbsoluteTimeout defines the absolute timeout of the persistent - session. Once the AbsoluteTimeout duration has elapsed, the - session becomes invalid. - - Support: Extended - pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ - type: string - cookieConfig: - description: |- - CookieConfig provides configuration settings that are specific - to cookie-based session persistence. - - Support: Core - properties: - lifetimeType: - default: Session - description: |- - LifetimeType specifies whether the cookie has a permanent or - session-based lifetime. A permanent cookie persists until its - specified expiry time, defined by the Expires or Max-Age cookie - attributes, while a session cookie is deleted when the current - session ends. - - When set to "Permanent", AbsoluteTimeout indicates the - cookie's lifetime via the Expires or Max-Age cookie attributes - and is required. - - When set to "Session", AbsoluteTimeout indicates the - absolute lifetime of the cookie tracked by the gateway and - is optional. - - Support: Core for "Session" type - - Support: Extended for "Permanent" type - enum: - - Permanent - - Session - type: string - type: object - idleTimeout: - description: |- - IdleTimeout defines the idle timeout of the persistent session. - Once the session has been idle for more than the specified - IdleTimeout duration, the session becomes invalid. - - Support: Extended - pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ - type: string - sessionName: - description: |- - SessionName defines the name of the persistent session token - which may be reflected in the cookie or the header. Users - should avoid reusing session names to prevent unintended - consequences, such as rejection or unpredictable behavior. - - Support: Implementation-specific - maxLength: 128 - type: string - type: - default: Cookie - description: |- - Type defines the type of session persistence such as through - the use a header or cookie. Defaults to cookie based session - persistence. - - Support: Core for "Cookie" type - - Support: Extended for "Header" type - enum: - - Cookie - - Header - type: string - type: object - x-kubernetes-validations: - - message: AbsoluteTimeout must be specified when cookie lifetimeType - is Permanent - rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType) - || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)' - targetRefs: - description: |- - TargetRef identifies an API object to apply policy to. - Currently, Backends (i.e. Service, ServiceImport, or any - implementation-specific backendRef) are the only valid API - target references. - items: - description: |- - LocalPolicyTargetReference identifies an API object to apply a direct or - inherited policy to. This should be used as part of Policy resources - that can target Gateway API resources. For more information on how this - policy attachment model works, and a sample Policy resource, refer to - the policy attachment documentation for Gateway API. - properties: - group: - description: Group is the group of the target resource. - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - description: Kind is kind of the target resource. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: Name is the name of the target resource. - maxLength: 253 - minLength: 1 - type: string - required: - - group - - kind - - name - type: object - maxItems: 16 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - group - - kind - - name - x-kubernetes-list-type: map - required: - - targetRefs - type: object - status: - description: Status defines the current state of BackendLBPolicy. - properties: - ancestors: - description: |- - Ancestors is a list of ancestor resources (usually Gateways) that are - associated with the policy, and the status of the policy with respect to - each ancestor. When this policy attaches to a parent, the controller that - manages the parent and the ancestors MUST add an entry to this list when - the controller first sees the policy and SHOULD update the entry as - appropriate when the relevant ancestor is modified. - - Note that choosing the relevant ancestor is left to the Policy designers; - an important part of Policy design is designing the right object level at - which to namespace this status. - - Note also that implementations MUST ONLY populate ancestor status for - the Ancestor resources they are responsible for. Implementations MUST - use the ControllerName field to uniquely identify the entries in this list - that they are responsible for. - - Note that to achieve this, the list of PolicyAncestorStatus structs - MUST be treated as a map with a composite key, made up of the AncestorRef - and ControllerName fields combined. - - A maximum of 16 ancestors will be represented in this list. An empty list - means the Policy is not relevant for any ancestors. - - If this slice is full, implementations MUST NOT add further entries. - Instead they MUST consider the policy unimplementable and signal that - on any related resources such as the ancestor that would be referenced - here. For example, if this list was full on BackendTLSPolicy, no - additional Gateways would be able to reference the Service targeted by - the BackendTLSPolicy. - items: - description: |- - PolicyAncestorStatus describes the status of a route with respect to an - associated Ancestor. - - Ancestors refer to objects that are either the Target of a policy or above it - in terms of object hierarchy. For example, if a policy targets a Service, the - Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and - the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most - useful object to place Policy status on, so we recommend that implementations - SHOULD use Gateway as the PolicyAncestorStatus object unless the designers - have a _very_ good reason otherwise. - - In the context of policy attachment, the Ancestor is used to distinguish which - resource results in a distinct application of this policy. For example, if a policy - targets a Service, it may have a distinct result per attached Gateway. - - Policies targeting the same resource may have different effects depending on the - ancestors of those resources. For example, different Gateways targeting the same - Service may have different capabilities, especially if they have different underlying - implementations. - - For example, in BackendTLSPolicy, the Policy attaches to a Service that is - used as a backend in a HTTPRoute that is itself attached to a Gateway. - In this case, the relevant object for status is the Gateway, and that is the - ancestor object referred to in this status. - - Note that a parent is also an ancestor, so for objects where the parent is the - relevant object for status, this struct SHOULD still be used. - - This struct is intended to be used in a slice that's effectively a map, - with a composite key made up of the AncestorRef and the ControllerName. - properties: - ancestorRef: - description: |- - AncestorRef corresponds with a ParentRef in the spec that this - PolicyAncestorStatus struct describes the status of. - properties: - group: - default: gateway.networking.k8s.io - description: |- - Group is the group of the referent. - When unspecified, "gateway.networking.k8s.io" is inferred. - To set the core API group (such as for a "Service" kind referent), - Group must be explicitly set to "" (empty string). - - Support: Core - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - kind: - default: Gateway - description: |- - Kind is kind of the referent. - - There are two kinds of parent resources with "Core" support: - - * Gateway (Gateway conformance profile) - * Service (Mesh conformance profile, ClusterIP Services only) - - Support for other resources is Implementation-Specific. - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - type: string - name: - description: |- - Name is the name of the referent. - - Support: Core - maxLength: 253 - minLength: 1 - type: string - namespace: - description: |- - Namespace is the namespace of the referent. When unspecified, this refers - to the local namespace of the Route. - - Note that there are specific rules for ParentRefs which cross namespace - boundaries. Cross-namespace references are only valid if they are explicitly - allowed by something in the namespace they are referring to. For example: - Gateway has the AllowedRoutes field, and ReferenceGrant provides a - generic way to enable any other kind of cross-namespace reference. - - - ParentRefs from a Route to a Service in the same namespace are "producer" - routes, which apply default routing rules to inbound connections from - any namespace to the Service. - - ParentRefs from a Route to a Service in a different namespace are - "consumer" routes, and these routing rules are only applied to outbound - connections originating from the same namespace as the Route, for which - the intended destination of the connections are a Service targeted as a - ParentRef of the Route. - - - Support: Core - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - port: - description: |- - Port is the network port this Route targets. It can be interpreted - differently based on the type of parent resource. - - When the parent resource is a Gateway, this targets all listeners - listening on the specified port that also support this kind of Route(and - select this Route). It's not recommended to set `Port` unless the - networking behaviors specified in a Route must apply to a specific port - as opposed to a listener(s) whose port(s) may be changed. When both Port - and SectionName are specified, the name and port of the selected listener - must match both specified values. - - - When the parent resource is a Service, this targets a specific port in the - Service spec. When both Port (experimental) and SectionName are specified, - the name and port of the selected port must match both specified values. - - - Implementations MAY choose to support other parent resources. - Implementations supporting other types of parent resources MUST clearly - document how/if Port is interpreted. - - For the purpose of status, an attachment is considered successful as - long as the parent resource accepts it partially. For example, Gateway - listeners can restrict which Routes can attach to them by Route kind, - namespace, or hostname. If 1 of 2 Gateway listeners accept attachment - from the referencing Route, the Route MUST be considered successfully - attached. If no Gateway listeners accept attachment from this Route, - the Route MUST be considered detached from the Gateway. - - Support: Extended - format: int32 - maximum: 65535 - minimum: 1 - type: integer - sectionName: - description: |- - SectionName is the name of a section within the target resource. In the - following resources, SectionName is interpreted as the following: - - * Gateway: Listener name. When both Port (experimental) and SectionName - are specified, the name and port of the selected listener must match - both specified values. - * Service: Port name. When both Port (experimental) and SectionName - are specified, the name and port of the selected listener must match - both specified values. - - Implementations MAY choose to support attaching Routes to other resources. - If that is the case, they MUST clearly document how SectionName is - interpreted. - - When unspecified (empty string), this will reference the entire resource. - For the purpose of status, an attachment is considered successful if at - least one section in the parent resource accepts it. For example, Gateway - listeners can restrict which Routes can attach to them by Route kind, - namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from - the referencing Route, the Route MUST be considered successfully - attached. If no Gateway listeners accept attachment from this Route, the - Route MUST be considered detached from the Gateway. - - Support: Core - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - type: string - required: - - name - type: object - conditions: - description: Conditions describes the status of the Policy with - respect to the given Ancestor. - items: - description: Condition contains details for one aspect of - the current state of this API Resource. - properties: - lastTransitionTime: - description: |- - lastTransitionTime is the last time the condition transitioned from one status to another. - This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date - with respect to the current state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: |- - reason contains a programmatic identifier indicating the reason for the condition's last transition. - Producers of specific condition types may define expected values and meanings for this field, - and whether the values are considered a guaranteed API. - The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, - Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - maxItems: 8 - minItems: 1 - type: array - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - controllerName: - description: |- - ControllerName is a domain/path string that indicates the name of the - controller that wrote this status. This corresponds with the - controllerName field on GatewayClass. - - Example: "example.net/gateway-controller". - - The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are - valid Kubernetes names - (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). - - Controllers MUST populate this field when writing status. Controllers should ensure that - entries to status populated with their ControllerName are cleaned up when they are no - longer necessary. - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ - type: string - required: - - ancestorRef - - controllerName - type: object - maxItems: 16 - type: array - required: - - ancestors - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: null - storedVersions: null ---- -# # config/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml # apiVersion: apiextensions.k8s.io/v1 @@ -525,7 +24,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null labels: @@ -607,6 +106,14 @@ spec: by default, but this default may change in the future to provide a more granular application of the policy. + TargetRefs must be _distinct_. This means either that: + + * They select different targets. If this is the case, then targetRef + entries are distinct. In terms of fields, this means that the + multi-part key defined by `group`, `kind`, and `name` must + be unique across all targetRef entries in the BackendTLSPolicy. + * They select different sectionNames in the same target. + Support: Extended for Kubernetes Service Support: Implementation-specific for any other resource @@ -663,6 +170,20 @@ spec: maxItems: 16 minItems: 1 type: array + x-kubernetes-validations: + - message: sectionName must be specified when targetRefs includes + 2 or more references to the same target + rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind + == p2.kind && p1.name == p2.name ? ((!has(p1.sectionName) || p1.sectionName + == '''') == (!has(p2.sectionName) || p2.sectionName == '''')) + : true))' + - message: sectionName must be unique when targetRefs includes 2 or + more references to the same target + rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind + == p2.kind && p1.name == p2.name && (((!has(p1.sectionName) || + p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName + == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName + == p2.sectionName)))) validation: description: Validation contains backend TLS validation configuration. properties: @@ -674,7 +195,7 @@ spec: If CACertificateRefs is empty or unspecified, then WellKnownCACertificates must be specified. Only one of CACertificateRefs or WellKnownCACertificates may be specified, - not both. If CACertifcateRefs is empty or unspecified, the configuration for + not both. If CACertificateRefs is empty or unspecified, the configuration for WellKnownCACertificates MUST be honored instead if supported by the implementation. References to a resource in a different namespace are invalid for the @@ -732,7 +253,7 @@ spec: backends: 1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066). - 2. If SubjectAltNames is not specified, Hostname MUST be used for + 2. Hostname MUST be used for authentication and MUST match the certificate served by the matching backend, unless SubjectAltNames is specified. authentication and MUST match the certificate served by the matching backend. @@ -744,10 +265,10 @@ spec: subjectAltNames: description: |- SubjectAltNames contains one or more Subject Alternative Names. - When specified, the certificate served from the backend MUST have at least one - Subject Alternate Name matching one of the specified SubjectAltNames. + When specified the certificate served from the backend MUST + have at least one Subject Alternate Name matching one of the specified SubjectAltNames. - Support: Core + Support: Extended items: description: SubjectAltName represents Subject Alternative Name. properties: @@ -1154,7 +675,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: gatewayclasses.gateway.networking.k8s.io @@ -1389,7 +910,7 @@ spec: - type x-kubernetes-list-type: map supportedFeatures: - description: | + description: |- SupportedFeatures is the set of features the GatewayClass support. It MUST be sorted in ascending alphabetical order by the Name key. items: @@ -1633,7 +1154,7 @@ spec: - type x-kubernetes-list-type: map supportedFeatures: - description: | + description: |- SupportedFeatures is the set of features the GatewayClass support. It MUST be sorted in ascending alphabetical order by the Name key. items: @@ -1674,7 +1195,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: gateways.gateway.networking.k8s.io @@ -1732,7 +1253,7 @@ spec: description: Spec defines the desired state of Gateway. properties: addresses: - description: |+ + description: |- Addresses requested for this Gateway. This is optional and behavior can depend on the implementation. If a value is set in the spec and the requested address is invalid or unavailable, the implementation MUST @@ -1753,10 +1274,9 @@ spec: GatewayStatus.Addresses. Support: Extended - items: - description: GatewayAddress describes an address that can be bound - to a Gateway. + description: GatewaySpecAddress describes an address that can be + bound to a Gateway. oneOf: - properties: type: @@ -1781,15 +1301,15 @@ spec: type: string value: description: |- - Value of the address. The validity of the values will depend - on the type and support by the controller. + When a value is unspecified, an implementation SHOULD automatically + assign an address matching the requested type if possible. + + If an implementation does not support an empty value, they MUST set the + "Programmed" condition in status to False with a reason of "AddressNotAssigned". Examples: `1.2.3.4`, `128::1`, `my-ip-address`. maxLength: 253 - minLength: 1 type: string - required: - - value type: object x-kubernetes-validations: - message: Hostname value must only contain valid characters (matching @@ -1805,16 +1325,96 @@ spec: - message: Hostname values must be unique rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2, a2.type == a1.type && a2.value == a1.value) : true )' + allowedListeners: + description: |- + AllowedListeners defines which ListenerSets can be attached to this Gateway. + While this feature is experimental, the default value is to allow no ListenerSets. + properties: + namespaces: + default: + from: None + description: |- + Namespaces defines which namespaces ListenerSets can be attached to this Gateway. + While this feature is experimental, the default value is to allow no ListenerSets. + properties: + from: + default: None + description: |- + From indicates where ListenerSets can attach to this Gateway. Possible + values are: + + * Same: Only ListenerSets in the same namespace may be attached to this Gateway. + * Selector: ListenerSets in namespaces selected by the selector may be attached to this Gateway. + * All: ListenerSets in all namespaces may be attached to this Gateway. + * None: Only listeners defined in the Gateway's spec are allowed + + While this feature is experimental, the default value None + enum: + - All + - Selector + - Same + - None + type: string + selector: + description: |- + Selector must be specified when From is set to "Selector". In that case, + only ListenerSets in Namespaces matching this Selector will be selected by this + Gateway. This field is ignored for other values of "From". + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: object backendTLS: - description: |+ + description: |- BackendTLS configures TLS settings for when this Gateway is connecting to backends with TLS. Support: Core - properties: clientCertificateRef: - description: |+ + description: |- ClientCertificateRef is a reference to an object that contains a Client Certificate and the associated private key. @@ -1830,7 +1430,6 @@ spec: This setting can be overridden on the service level by use of BackendTLSPolicy. Support: Core - properties: group: default: "" @@ -1965,6 +1564,11 @@ spec: the merging behavior is implementation specific. It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway. + If the referent cannot be found, refers to an unsupported kind, or when + the data within that resource is malformed, the Gateway SHOULD be + rejected with the "Accepted" status condition set to "False" and an + "InvalidParameters" reason. + Support: Implementation-specific properties: group: @@ -1995,6 +1599,8 @@ spec: logical endpoints that are bound on this Gateway's addresses. At least one Listener MUST be specified. + ## Distinct Listeners + Each Listener in a set of Listeners (for example, in a single Gateway) MUST be _distinct_, in that a traffic flow MUST be able to be assigned to exactly one listener. (This section uses "set of Listeners" rather than @@ -2006,55 +1612,76 @@ spec: combination of Port, Protocol, and, if supported by the protocol, Hostname. Some combinations of port, protocol, and TLS settings are considered - Core support and MUST be supported by implementations based on their - targeted conformance profile: + Core support and MUST be supported by implementations based on the objects + they support: - HTTP Profile + HTTPRoute 1. HTTPRoute, Port: 80, Protocol: HTTP 2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided - TLS Profile + TLSRoute 1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough "Distinct" Listeners have the following property: - The implementation can match inbound requests to a single distinct - Listener. When multiple Listeners share values for fields (for + **The implementation can match inbound requests to a single distinct + Listener**. + + When multiple Listeners share values for fields (for example, two Listeners with the same Port value), the implementation can match requests to only one of the Listeners using other Listener fields. - For example, the following Listener scenarios are distinct: + When multiple listeners have the same value for the Protocol field, then + each of the Listeners with matching Protocol values MUST have different + values for other fields. - 1. Multiple Listeners with the same Port that all use the "HTTP" - Protocol that all have unique Hostname values. - 2. Multiple Listeners with the same Port that use either the "HTTPS" or - "TLS" Protocol that all have unique Hostname values. - 3. A mixture of "TCP" and "UDP" Protocol Listeners, where no Listener - with the same Protocol has the same Port value. + The set of fields that MUST be different for a Listener differs per protocol. + The following rules define the rules for what fields MUST be considered for + Listeners to be distinct with each protocol currently defined in the + Gateway API spec. - Some fields in the Listener struct have possible values that affect - whether the Listener is distinct. Hostname is particularly relevant - for HTTP or HTTPS protocols. + The set of listeners that all share a protocol value MUST have _different_ + values for _at least one_ of these fields to be distinct: - When using the Hostname value to select between same-Port, same-Protocol - Listeners, the Hostname value must be different on each Listener for the - Listener to be distinct. + * **HTTP, HTTPS, TLS**: Port, Hostname + * **TCP, UDP**: Port - When the Listeners are distinct based on Hostname, inbound request + One **very** important rule to call out involves what happens when an + implementation: + + * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol + Listeners, and + * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP + Protocol. + + In this case all the Listeners that share a port with the + TCP Listener are not distinct and so MUST NOT be accepted. + + If an implementation does not support TCP Protocol Listeners, then the + previous rule does not apply, and the TCP Listeners SHOULD NOT be + accepted. + + Note that the `tls` field is not used for determining if a listener is distinct, because + Listeners that _only_ differ on TLS config will still conflict in all cases. + + ### Listeners that are distinct only by Hostname + + When the Listeners are distinct based only on Hostname, inbound request hostnames MUST match from the most specific to least specific Hostname values to choose the correct Listener and its associated set of Routes. - Exact matches must be processed before wildcard matches, and wildcard - matches must be processed before fallback (empty Hostname value) + Exact matches MUST be processed before wildcard matches, and wildcard + matches MUST be processed before fallback (empty Hostname value) matches. For example, `"foo.example.com"` takes precedence over `"*.example.com"`, and `"*.example.com"` takes precedence over `""`. Additionally, if there are multiple wildcard entries, more specific wildcard entries must be processed before less specific wildcard entries. For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`. + The precise definition here is that the higher the number of dots in the hostname to the right of the wildcard character, the higher the precedence. @@ -2062,18 +1689,26 @@ spec: the left, however, so `"*.example.com"` will match both `"foo.bar.example.com"` _and_ `"bar.example.com"`. + ## Handling indistinct Listeners + If a set of Listeners contains Listeners that are not distinct, then those - Listeners are Conflicted, and the implementation MUST set the "Conflicted" + Listeners are _Conflicted_, and the implementation MUST set the "Conflicted" condition in the Listener Status to "True". + The words "indistinct" and "conflicted" are considered equivalent for the + purpose of this documentation. + Implementations MAY choose to accept a Gateway with some Conflicted Listeners only if they only accept the partial Listener set that contains - no Conflicted Listeners. To put this another way, implementations may - accept a partial Listener set only if they throw out *all* the conflicting - Listeners. No picking one of the conflicting listeners as the winner. - This also means that the Gateway must have at least one non-conflicting - Listener in this case, otherwise it violates the requirement that at - least one Listener must be present. + no Conflicted Listeners. + + Specifically, an implementation MAY accept a partial Listener set subject to + the following rules: + + * The implementation MUST NOT pick one conflicting Listener as the winner. + ALL indistinct Listeners must not be accepted for processing. + * At least one distinct Listener MUST be present, or else the Gateway effectively + contains _no_ Listeners, and must be rejected from processing as a whole. The implementation MUST set a "ListenersNotValid" condition on the Gateway Status when the Gateway contains Conflicted Listeners whether or @@ -2082,7 +1717,25 @@ spec: Accepted. Additionally, the Listener status for those listeners SHOULD indicate which Listeners are conflicted and not Accepted. - A Gateway's Listeners are considered "compatible" if: + ## General Listener behavior + + Note that, for all distinct Listeners, requests SHOULD match at most one Listener. + For example, if Listeners are defined for "foo.example.com" and "*.example.com", a + request to "foo.example.com" SHOULD only be routed using routes attached + to the "foo.example.com" Listener (and not the "*.example.com" Listener). + + This concept is known as "Listener Isolation", and it is an Extended feature + of Gateway API. Implementations that do not support Listener Isolation MUST + clearly document this, and MUST NOT claim support for the + `GatewayHTTPListenerIsolation` feature. + + Implementations that _do_ support Listener Isolation SHOULD claim support + for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated + conformance tests. + + ## Compatible Listeners + + A Gateway's Listeners are considered _compatible_ if: 1. They are distinct. 2. The implementation can serve them in compliance with the Addresses @@ -2097,16 +1750,11 @@ spec: on the same address, or cannot mix HTTPS and generic TLS listens on the same port would not consider those cases compatible, even though they are distinct. - Note that requests SHOULD match at most one Listener. For example, if - Listeners are defined for "foo.example.com" and "*.example.com", a - request to "foo.example.com" SHOULD only be routed using routes attached - to the "foo.example.com" Listener (and not the "*.example.com" Listener). - This concept is known as "Listener Isolation". Implementations that do - not support Listener Isolation MUST clearly document this. - Implementations MAY merge separate Gateways onto a single set of Addresses if all Listeners across all Gateways are compatible. + In a future release the MinItems=1 requirement MAY be dropped. + Support: Core items: description: |- @@ -2268,10 +1916,31 @@ spec: * TLS: The Listener Hostname MUST match the SNI. * HTTP: The Listener Hostname MUST match the Host header of the request. - * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP - protocol layers as described above. If an implementation does not - ensure that both the SNI and Host header match the Listener hostname, - it MUST clearly document that. + * HTTPS: The Listener Hostname SHOULD match both the SNI and Host header. + Note that this does not require the SNI and Host header to be the same. + The semantics of this are described in more detail below. + + To ensure security, Section 11.1 of RFC-6066 emphasizes that server + implementations that rely on SNI hostname matching MUST also verify + hostnames within the application protocol. + + Section 9.1.2 of RFC-7540 provides a mechanism for servers to reject the + reuse of a connection by responding with the HTTP 421 Misdirected Request + status code. This indicates that the origin server has rejected the + request because it appears to have been misdirected. + + To detect misdirected requests, Gateways SHOULD match the authority of + the requests with all the SNI hostname(s) configured across all the + Gateway Listeners on the same port and protocol: + + * If another Listener has an exact match or more specific wildcard entry, + the Gateway SHOULD return a 421. + * If the current Listener (selected by SNI matching during ClientHello) + does not match the Host: + * If another Listener does match the Host the Gateway SHOULD return a + 421. + * If no other Listener matches the Host, the Gateway MUST return a + 404. For HTTPRoute and TLSRoute resources, there is an interaction with the `spec.hostnames` array. When both listener and route specify hostnames, @@ -2411,7 +2080,7 @@ spec: maxItems: 64 type: array frontendValidation: - description: |+ + description: |- FrontendValidation holds configuration information for validating the frontend (client). Setting this field will require clients to send a client certificate required for validation during the TLS handshake. In browsers this may result in a dialog appearing @@ -2419,7 +2088,6 @@ spec: The maximum depth of a certificate chain accepted in verification is Implementation specific. Support: Extended - properties: caCertificateRefs: description: |- @@ -2458,7 +2126,7 @@ spec: group: description: |- Group is the group of the referent. For example, "gateway.networking.k8s.io". - When unspecified or empty string, core API group is inferred. + When set to the empty string, core API group is inferred. maxLength: 253 pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string @@ -2596,7 +2264,7 @@ spec: description: Status defines the current state of Gateway. properties: addresses: - description: |+ + description: |- Addresses lists the network addresses that have been bound to the Gateway. @@ -2606,7 +2274,6 @@ spec: * no addresses are specified, all addresses are dynamically assigned * a combination of specified and dynamic addresses are assigned * a specified address was unusable (e.g. already in use) - items: description: GatewayStatusAddress describes a network address that is bound to a Gateway. @@ -2924,7 +2591,7 @@ spec: description: Spec defines the desired state of Gateway. properties: addresses: - description: |+ + description: |- Addresses requested for this Gateway. This is optional and behavior can depend on the implementation. If a value is set in the spec and the requested address is invalid or unavailable, the implementation MUST @@ -2945,10 +2612,9 @@ spec: GatewayStatus.Addresses. Support: Extended - items: - description: GatewayAddress describes an address that can be bound - to a Gateway. + description: GatewaySpecAddress describes an address that can be + bound to a Gateway. oneOf: - properties: type: @@ -2973,15 +2639,15 @@ spec: type: string value: description: |- - Value of the address. The validity of the values will depend - on the type and support by the controller. + When a value is unspecified, an implementation SHOULD automatically + assign an address matching the requested type if possible. + + If an implementation does not support an empty value, they MUST set the + "Programmed" condition in status to False with a reason of "AddressNotAssigned". Examples: `1.2.3.4`, `128::1`, `my-ip-address`. maxLength: 253 - minLength: 1 type: string - required: - - value type: object x-kubernetes-validations: - message: Hostname value must only contain valid characters (matching @@ -2997,16 +2663,96 @@ spec: - message: Hostname values must be unique rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2, a2.type == a1.type && a2.value == a1.value) : true )' + allowedListeners: + description: |- + AllowedListeners defines which ListenerSets can be attached to this Gateway. + While this feature is experimental, the default value is to allow no ListenerSets. + properties: + namespaces: + default: + from: None + description: |- + Namespaces defines which namespaces ListenerSets can be attached to this Gateway. + While this feature is experimental, the default value is to allow no ListenerSets. + properties: + from: + default: None + description: |- + From indicates where ListenerSets can attach to this Gateway. Possible + values are: + + * Same: Only ListenerSets in the same namespace may be attached to this Gateway. + * Selector: ListenerSets in namespaces selected by the selector may be attached to this Gateway. + * All: ListenerSets in all namespaces may be attached to this Gateway. + * None: Only listeners defined in the Gateway's spec are allowed + + While this feature is experimental, the default value None + enum: + - All + - Selector + - Same + - None + type: string + selector: + description: |- + Selector must be specified when From is set to "Selector". In that case, + only ListenerSets in Namespaces matching this Selector will be selected by this + Gateway. This field is ignored for other values of "From". + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: object backendTLS: - description: |+ + description: |- BackendTLS configures TLS settings for when this Gateway is connecting to backends with TLS. Support: Core - properties: clientCertificateRef: - description: |+ + description: |- ClientCertificateRef is a reference to an object that contains a Client Certificate and the associated private key. @@ -3022,7 +2768,6 @@ spec: This setting can be overridden on the service level by use of BackendTLSPolicy. Support: Core - properties: group: default: "" @@ -3157,6 +2902,11 @@ spec: the merging behavior is implementation specific. It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway. + If the referent cannot be found, refers to an unsupported kind, or when + the data within that resource is malformed, the Gateway SHOULD be + rejected with the "Accepted" status condition set to "False" and an + "InvalidParameters" reason. + Support: Implementation-specific properties: group: @@ -3187,6 +2937,8 @@ spec: logical endpoints that are bound on this Gateway's addresses. At least one Listener MUST be specified. + ## Distinct Listeners + Each Listener in a set of Listeners (for example, in a single Gateway) MUST be _distinct_, in that a traffic flow MUST be able to be assigned to exactly one listener. (This section uses "set of Listeners" rather than @@ -3198,55 +2950,76 @@ spec: combination of Port, Protocol, and, if supported by the protocol, Hostname. Some combinations of port, protocol, and TLS settings are considered - Core support and MUST be supported by implementations based on their - targeted conformance profile: + Core support and MUST be supported by implementations based on the objects + they support: - HTTP Profile + HTTPRoute 1. HTTPRoute, Port: 80, Protocol: HTTP 2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided - TLS Profile + TLSRoute 1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough "Distinct" Listeners have the following property: - The implementation can match inbound requests to a single distinct - Listener. When multiple Listeners share values for fields (for + **The implementation can match inbound requests to a single distinct + Listener**. + + When multiple Listeners share values for fields (for example, two Listeners with the same Port value), the implementation can match requests to only one of the Listeners using other Listener fields. - For example, the following Listener scenarios are distinct: + When multiple listeners have the same value for the Protocol field, then + each of the Listeners with matching Protocol values MUST have different + values for other fields. - 1. Multiple Listeners with the same Port that all use the "HTTP" - Protocol that all have unique Hostname values. - 2. Multiple Listeners with the same Port that use either the "HTTPS" or - "TLS" Protocol that all have unique Hostname values. - 3. A mixture of "TCP" and "UDP" Protocol Listeners, where no Listener - with the same Protocol has the same Port value. + The set of fields that MUST be different for a Listener differs per protocol. + The following rules define the rules for what fields MUST be considered for + Listeners to be distinct with each protocol currently defined in the + Gateway API spec. - Some fields in the Listener struct have possible values that affect - whether the Listener is distinct. Hostname is particularly relevant - for HTTP or HTTPS protocols. + The set of listeners that all share a protocol value MUST have _different_ + values for _at least one_ of these fields to be distinct: - When using the Hostname value to select between same-Port, same-Protocol - Listeners, the Hostname value must be different on each Listener for the - Listener to be distinct. + * **HTTP, HTTPS, TLS**: Port, Hostname + * **TCP, UDP**: Port - When the Listeners are distinct based on Hostname, inbound request + One **very** important rule to call out involves what happens when an + implementation: + + * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol + Listeners, and + * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP + Protocol. + + In this case all the Listeners that share a port with the + TCP Listener are not distinct and so MUST NOT be accepted. + + If an implementation does not support TCP Protocol Listeners, then the + previous rule does not apply, and the TCP Listeners SHOULD NOT be + accepted. + + Note that the `tls` field is not used for determining if a listener is distinct, because + Listeners that _only_ differ on TLS config will still conflict in all cases. + + ### Listeners that are distinct only by Hostname + + When the Listeners are distinct based only on Hostname, inbound request hostnames MUST match from the most specific to least specific Hostname values to choose the correct Listener and its associated set of Routes. - Exact matches must be processed before wildcard matches, and wildcard - matches must be processed before fallback (empty Hostname value) + Exact matches MUST be processed before wildcard matches, and wildcard + matches MUST be processed before fallback (empty Hostname value) matches. For example, `"foo.example.com"` takes precedence over `"*.example.com"`, and `"*.example.com"` takes precedence over `""`. Additionally, if there are multiple wildcard entries, more specific wildcard entries must be processed before less specific wildcard entries. For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`. + The precise definition here is that the higher the number of dots in the hostname to the right of the wildcard character, the higher the precedence. @@ -3254,18 +3027,26 @@ spec: the left, however, so `"*.example.com"` will match both `"foo.bar.example.com"` _and_ `"bar.example.com"`. + ## Handling indistinct Listeners + If a set of Listeners contains Listeners that are not distinct, then those - Listeners are Conflicted, and the implementation MUST set the "Conflicted" + Listeners are _Conflicted_, and the implementation MUST set the "Conflicted" condition in the Listener Status to "True". + The words "indistinct" and "conflicted" are considered equivalent for the + purpose of this documentation. + Implementations MAY choose to accept a Gateway with some Conflicted Listeners only if they only accept the partial Listener set that contains - no Conflicted Listeners. To put this another way, implementations may - accept a partial Listener set only if they throw out *all* the conflicting - Listeners. No picking one of the conflicting listeners as the winner. - This also means that the Gateway must have at least one non-conflicting - Listener in this case, otherwise it violates the requirement that at - least one Listener must be present. + no Conflicted Listeners. + + Specifically, an implementation MAY accept a partial Listener set subject to + the following rules: + + * The implementation MUST NOT pick one conflicting Listener as the winner. + ALL indistinct Listeners must not be accepted for processing. + * At least one distinct Listener MUST be present, or else the Gateway effectively + contains _no_ Listeners, and must be rejected from processing as a whole. The implementation MUST set a "ListenersNotValid" condition on the Gateway Status when the Gateway contains Conflicted Listeners whether or @@ -3274,7 +3055,25 @@ spec: Accepted. Additionally, the Listener status for those listeners SHOULD indicate which Listeners are conflicted and not Accepted. - A Gateway's Listeners are considered "compatible" if: + ## General Listener behavior + + Note that, for all distinct Listeners, requests SHOULD match at most one Listener. + For example, if Listeners are defined for "foo.example.com" and "*.example.com", a + request to "foo.example.com" SHOULD only be routed using routes attached + to the "foo.example.com" Listener (and not the "*.example.com" Listener). + + This concept is known as "Listener Isolation", and it is an Extended feature + of Gateway API. Implementations that do not support Listener Isolation MUST + clearly document this, and MUST NOT claim support for the + `GatewayHTTPListenerIsolation` feature. + + Implementations that _do_ support Listener Isolation SHOULD claim support + for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated + conformance tests. + + ## Compatible Listeners + + A Gateway's Listeners are considered _compatible_ if: 1. They are distinct. 2. The implementation can serve them in compliance with the Addresses @@ -3289,16 +3088,11 @@ spec: on the same address, or cannot mix HTTPS and generic TLS listens on the same port would not consider those cases compatible, even though they are distinct. - Note that requests SHOULD match at most one Listener. For example, if - Listeners are defined for "foo.example.com" and "*.example.com", a - request to "foo.example.com" SHOULD only be routed using routes attached - to the "foo.example.com" Listener (and not the "*.example.com" Listener). - This concept is known as "Listener Isolation". Implementations that do - not support Listener Isolation MUST clearly document this. - Implementations MAY merge separate Gateways onto a single set of Addresses if all Listeners across all Gateways are compatible. + In a future release the MinItems=1 requirement MAY be dropped. + Support: Core items: description: |- @@ -3460,10 +3254,31 @@ spec: * TLS: The Listener Hostname MUST match the SNI. * HTTP: The Listener Hostname MUST match the Host header of the request. - * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP - protocol layers as described above. If an implementation does not - ensure that both the SNI and Host header match the Listener hostname, - it MUST clearly document that. + * HTTPS: The Listener Hostname SHOULD match both the SNI and Host header. + Note that this does not require the SNI and Host header to be the same. + The semantics of this are described in more detail below. + + To ensure security, Section 11.1 of RFC-6066 emphasizes that server + implementations that rely on SNI hostname matching MUST also verify + hostnames within the application protocol. + + Section 9.1.2 of RFC-7540 provides a mechanism for servers to reject the + reuse of a connection by responding with the HTTP 421 Misdirected Request + status code. This indicates that the origin server has rejected the + request because it appears to have been misdirected. + + To detect misdirected requests, Gateways SHOULD match the authority of + the requests with all the SNI hostname(s) configured across all the + Gateway Listeners on the same port and protocol: + + * If another Listener has an exact match or more specific wildcard entry, + the Gateway SHOULD return a 421. + * If the current Listener (selected by SNI matching during ClientHello) + does not match the Host: + * If another Listener does match the Host the Gateway SHOULD return a + 421. + * If no other Listener matches the Host, the Gateway MUST return a + 404. For HTTPRoute and TLSRoute resources, there is an interaction with the `spec.hostnames` array. When both listener and route specify hostnames, @@ -3603,7 +3418,7 @@ spec: maxItems: 64 type: array frontendValidation: - description: |+ + description: |- FrontendValidation holds configuration information for validating the frontend (client). Setting this field will require clients to send a client certificate required for validation during the TLS handshake. In browsers this may result in a dialog appearing @@ -3611,7 +3426,6 @@ spec: The maximum depth of a certificate chain accepted in verification is Implementation specific. Support: Extended - properties: caCertificateRefs: description: |- @@ -3650,7 +3464,7 @@ spec: group: description: |- Group is the group of the referent. For example, "gateway.networking.k8s.io". - When unspecified or empty string, core API group is inferred. + When set to the empty string, core API group is inferred. maxLength: 253 pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string @@ -3788,7 +3602,7 @@ spec: description: Status defines the current state of Gateway. properties: addresses: - description: |+ + description: |- Addresses lists the network addresses that have been bound to the Gateway. @@ -3798,7 +3612,6 @@ spec: * no addresses are specified, all addresses are dynamically assigned * a combination of specified and dynamic addresses are assigned * a specified address was unusable (e.g. already in use) - items: description: GatewayStatusAddress describes a network address that is bound to a Gateway. @@ -4090,7 +3903,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: grpcroutes.gateway.networking.k8s.io @@ -4239,7 +4052,7 @@ spec: maxItems: 16 type: array parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -4301,11 +4114,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -4479,9 +4287,7 @@ spec: || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port == p2.port)))) rules: - description: |+ - Rules are a list of GRPC matchers, filters and actions. - + description: Rules are a list of GRPC matchers, filters and actions. items: description: |- GRPCRouteRule defines the semantics for matching a gRPC request based on @@ -4527,7 +4333,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -4542,8 +4347,6 @@ spec: If a Route is not able to send traffic to the backend using the specified protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - - properties: filters: description: |- @@ -4629,7 +4432,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -4704,7 +4507,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -4732,7 +4535,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -4742,7 +4545,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -4838,13 +4640,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -4863,14 +4664,13 @@ spec: to denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -4915,7 +4715,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -4990,7 +4790,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -5018,7 +4818,7 @@ spec: x-kubernetes-list-type: map type: object type: - description: |+ + description: |- Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: @@ -5043,7 +4843,6 @@ spec: If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. - enum: - ResponseHeaderModifier - RequestHeaderModifier @@ -5200,7 +4999,7 @@ spec: Specifying the same filter multiple times is not supported unless explicitly indicated in the filter. - If an implementation can not support a combination of filters, it must clearly + If an implementation cannot support a combination of filters, it must clearly document that limitation. In cases where incompatible or unsupported filters are specified and cause the `Accepted` condition to be set to status `False`, implementations may use the `IncompatibleFilters` reason to specify @@ -5283,7 +5082,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -5357,7 +5156,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -5385,7 +5184,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -5395,7 +5194,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -5491,13 +5289,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -5516,14 +5313,13 @@ spec: denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -5567,7 +5363,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -5641,7 +5437,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -5669,7 +5465,7 @@ spec: x-kubernetes-list-type: map type: object type: - description: |+ + description: |- Type identifies the type of filter to apply. As with other API fields, types are classified into three conformance levels: @@ -5694,7 +5490,6 @@ spec: If a reference to a custom filter type cannot be resolved, the filter MUST NOT be skipped. Instead, requests that would have been processed by that filter MUST receive a HTTP error response. - enum: - ResponseHeaderModifier - RequestHeaderModifier @@ -5910,10 +5705,10 @@ spec: has(self.method) ? self.method.matches(r"""^[A-Za-z_][A-Za-z_0-9]*$"""): true' type: object - maxItems: 8 + maxItems: 64 type: array name: - description: | + description: |- Name is the name of the route rule. This name MUST be unique within a Route if it is set. Support: Extended @@ -5922,12 +5717,11 @@ spec: pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string sessionPersistence: - description: |+ + description: |- SessionPersistence defines and configures session persistence for the route rule. Support: Extended - properties: absoluteTimeout: description: |- @@ -5962,6 +5756,8 @@ spec: absolute lifetime of the cookie tracked by the gateway and is optional. + Defaults to "Session". + Support: Core for "Session" type Support: Extended for "Permanent" type @@ -6079,7 +5875,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -6328,7 +6124,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: httproutes.gateway.networking.k8s.io @@ -6457,7 +6253,7 @@ spec: maxItems: 16 type: array parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -6519,11 +6315,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -6702,9 +6493,7 @@ spec: - path: type: PathPrefix value: / - description: |+ - Rules are a list of HTTP matchers, filters and actions. - + description: Rules are a list of HTTP matchers, filters and actions. items: description: |- HTTPRouteRule defines semantics for matching an HTTP request based on @@ -6757,7 +6546,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -6772,8 +6560,6 @@ spec: If a Route is not able to send traffic to the backend using the specified protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - - properties: filters: description: |- @@ -6791,6 +6577,289 @@ spec: authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. properties: + cors: + description: |- + CORS defines a schema for a filter that responds to the + cross-origin request based on HTTP response header. + + Support: Extended + properties: + allowCredentials: + description: |- + AllowCredentials indicates whether the actual cross-origin request allows + to include credentials. + + The only valid value for the `Access-Control-Allow-Credentials` response + header is true (case-sensitive). + + If the credentials are not allowed in cross-origin requests, the gateway + will omit the header `Access-Control-Allow-Credentials` entirely rather + than setting its value to false. + + Support: Extended + enum: + - true + type: boolean + allowHeaders: + description: |- + AllowHeaders indicates which HTTP request headers are supported for + accessing the requested resource. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Allow-Headers` + response header are separated by a comma (","). + + When the `AllowHeaders` field is configured with one or more headers, the + gateway must return the `Access-Control-Allow-Headers` response header + which value is present in the `AllowHeaders` field. + + If any header name in the `Access-Control-Request-Headers` request header + is not included in the list of header names specified by the response + header `Access-Control-Allow-Headers`, it will present an error on the + client side. + + If any header name in the `Access-Control-Allow-Headers` response header + does not recognize by the client, it will also occur an error on the + client side. + + A wildcard indicates that the requests with all HTTP headers are allowed. + The `Access-Control-Allow-Headers` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowHeaders` field + specified with the `*` wildcard, the gateway must specify one or more + HTTP headers in the value of the `Access-Control-Allow-Headers` response + header. The value of the header `Access-Control-Allow-Headers` is same as + the `Access-Control-Request-Headers` header provided by the client. If + the header `Access-Control-Request-Headers` is not included in the + request, the gateway will omit the `Access-Control-Allow-Headers` + response header, instead of specifying the `*` wildcard. A Gateway + implementation may choose to add implementation-specific default headers. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + description: |- + AllowMethods indicates which HTTP methods are supported for accessing the + requested resource. + + Valid values are any method defined by RFC9110, along with the special + value `*`, which represents all HTTP methods are allowed. + + Method names are case sensitive, so these values are also case-sensitive. + (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1) + + Multiple method names in the value of the `Access-Control-Allow-Methods` + response header are separated by a comma (","). + + A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`. + (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The + CORS-safelisted methods are always allowed, regardless of whether they + are specified in the `AllowMethods` field. + + When the `AllowMethods` field is configured with one or more methods, the + gateway must return the `Access-Control-Allow-Methods` response header + which value is present in the `AllowMethods` field. + + If the HTTP method of the `Access-Control-Request-Method` request header + is not included in the list of methods specified by the response header + `Access-Control-Allow-Methods`, it will present an error on the client + side. + + The `Access-Control-Allow-Methods` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowMethods` field + specified with the `*` wildcard, the gateway must specify one HTTP method + in the value of the Access-Control-Allow-Methods response header. The + value of the header `Access-Control-Allow-Methods` is same as the + `Access-Control-Request-Method` header provided by the client. If the + header `Access-Control-Request-Method` is not included in the request, + the gateway will omit the `Access-Control-Allow-Methods` response header, + instead of specifying the `*` wildcard. A Gateway implementation may + choose to add implementation-specific default methods. + + Support: Extended + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside + other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + description: |- + AllowOrigins indicates whether the response can be shared with requested + resource from the given `Origin`. + + The `Origin` consists of a scheme and a host, with an optional port, and + takes the form `://(:)`. + + Valid values for scheme are: `http` and `https`. + + Valid values for port are any integer between 1 and 65535 (the list of + available TCP/UDP ports). Note that, if not included, port `80` is + assumed for `http` scheme origins, and port `443` is assumed for `https` + origins. This may affect origin matching. + + The host part of the origin may contain the wildcard character `*`. These + wildcard characters behave as follows: + + * `*` is a greedy match to the _left_, including any number of + DNS labels to the left of its position. This also means that + `*` will include any number of period `.` characters to the + left of its position. + * A wildcard by itself matches all hosts. + + An origin value that includes _only_ the `*` character indicates requests + from all `Origin`s are allowed. + + When the `AllowOrigins` field is configured with multiple origins, it + means the server supports clients from multiple origins. If the request + `Origin` matches the configured allowed origins, the gateway must return + the given `Origin` and sets value of the header + `Access-Control-Allow-Origin` same as the `Origin` header provided by the + client. + + The status code of a successful response to a "preflight" request is + always an OK status (i.e., 204 or 200). + + If the request `Origin` does not match the configured allowed origins, + the gateway returns 204/200 response but doesn't set the relevant + cross-origin response headers. Alternatively, the gateway responds with + 403 status to the "preflight" request is denied, coupled with omitting + the CORS headers. The cross-origin request fails on the client side. + Therefore, the client doesn't attempt the actual cross-origin request. + + The `Access-Control-Allow-Origin` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowOrigins` field + specified with the `*` wildcard, the gateway must return a single origin + in the value of the `Access-Control-Allow-Origin` response header, + instead of specifying the `*` wildcard. The value of the header + `Access-Control-Allow-Origin` is same as the `Origin` header provided by + the client. + + Support: Extended + items: + description: |- + The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and + encoding rules specified in RFC3986. The AbsoluteURI MUST include both a + scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that + include an authority MUST include a fully qualified domain name or + IP address as the host. + maxLength: 253 + minLength: 1 + pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))? + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + exposeHeaders: + description: |- + ExposeHeaders indicates which HTTP response headers can be exposed + to client-side scripts in response to a cross-origin request. + + A CORS-safelisted response header is an HTTP header in a CORS response + that it is considered safe to expose to the client scripts. + The CORS-safelisted response headers include the following headers: + `Cache-Control` + `Content-Language` + `Content-Length` + `Content-Type` + `Expires` + `Last-Modified` + `Pragma` + (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name) + The CORS-safelisted response headers are exposed to client by default. + + When an HTTP header name is specified using the `ExposeHeaders` field, + this additional header will be exposed as part of the response to the + client. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Expose-Headers` + response header are separated by a comma (","). + + A wildcard indicates that the responses with all HTTP headers are exposed + to clients. The `Access-Control-Expose-Headers` response header can only + use `*` wildcard as value when the `AllowCredentials` field is + unspecified. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + description: |- + MaxAge indicates the duration (in seconds) for the client to cache the + results of a "preflight" request. + + The information provided by the `Access-Control-Allow-Methods` and + `Access-Control-Allow-Headers` response headers can be cached by the + client until the time specified by `Access-Control-Max-Age` elapses. + + The default value of `Access-Control-Max-Age` response header is 5 + (seconds). + format: int32 + minimum: 1 + type: integer + type: object extensionRef: description: |- ExtensionRef is an optional, implementation-specific extension to the @@ -6859,7 +6928,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -6934,7 +7003,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -6962,7 +7031,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -6972,7 +7041,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -7068,13 +7136,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -7093,14 +7160,13 @@ spec: to denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -7298,7 +7364,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -7373,7 +7439,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -7441,6 +7507,7 @@ spec: - RequestRedirect - URLRewrite - ExtensionRef + - CORS type: string urlRewrite: description: |- @@ -7573,6 +7640,11 @@ spec: - message: filter.extensionRef must be specified for ExtensionRef filter.type rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' + - message: filter.cors must be nil if the filter.type + is not CORS + rule: '!(has(self.cors) && self.type != ''CORS'')' + - message: filter.cors must be specified for CORS filter.type + rule: '!(!has(self.cors) && self.type == ''CORS'')' maxItems: 16 type: array x-kubernetes-validations: @@ -7694,7 +7766,7 @@ spec: they are specified. Implementations MAY choose to implement this ordering strictly, rejecting - any combination or order of filters that can not be supported. If implementations + any combination or order of filters that cannot be supported. If implementations choose a strict interpretation of filter ordering, they MUST clearly document that behavior. @@ -7716,7 +7788,7 @@ spec: All filters are expected to be compatible with each other except for the URLRewrite and RequestRedirect filters, which may not be combined. If an - implementation can not support other combinations of filters, they must clearly + implementation cannot support other combinations of filters, they must clearly document that limitation. In cases where incompatible or unsupported filters are specified and cause the `Accepted` condition to be set to status `False`, implementations may use the `IncompatibleFilters` reason to specify @@ -7732,6 +7804,289 @@ spec: authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. properties: + cors: + description: |- + CORS defines a schema for a filter that responds to the + cross-origin request based on HTTP response header. + + Support: Extended + properties: + allowCredentials: + description: |- + AllowCredentials indicates whether the actual cross-origin request allows + to include credentials. + + The only valid value for the `Access-Control-Allow-Credentials` response + header is true (case-sensitive). + + If the credentials are not allowed in cross-origin requests, the gateway + will omit the header `Access-Control-Allow-Credentials` entirely rather + than setting its value to false. + + Support: Extended + enum: + - true + type: boolean + allowHeaders: + description: |- + AllowHeaders indicates which HTTP request headers are supported for + accessing the requested resource. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Allow-Headers` + response header are separated by a comma (","). + + When the `AllowHeaders` field is configured with one or more headers, the + gateway must return the `Access-Control-Allow-Headers` response header + which value is present in the `AllowHeaders` field. + + If any header name in the `Access-Control-Request-Headers` request header + is not included in the list of header names specified by the response + header `Access-Control-Allow-Headers`, it will present an error on the + client side. + + If any header name in the `Access-Control-Allow-Headers` response header + does not recognize by the client, it will also occur an error on the + client side. + + A wildcard indicates that the requests with all HTTP headers are allowed. + The `Access-Control-Allow-Headers` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowHeaders` field + specified with the `*` wildcard, the gateway must specify one or more + HTTP headers in the value of the `Access-Control-Allow-Headers` response + header. The value of the header `Access-Control-Allow-Headers` is same as + the `Access-Control-Request-Headers` header provided by the client. If + the header `Access-Control-Request-Headers` is not included in the + request, the gateway will omit the `Access-Control-Allow-Headers` + response header, instead of specifying the `*` wildcard. A Gateway + implementation may choose to add implementation-specific default headers. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + description: |- + AllowMethods indicates which HTTP methods are supported for accessing the + requested resource. + + Valid values are any method defined by RFC9110, along with the special + value `*`, which represents all HTTP methods are allowed. + + Method names are case sensitive, so these values are also case-sensitive. + (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1) + + Multiple method names in the value of the `Access-Control-Allow-Methods` + response header are separated by a comma (","). + + A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`. + (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The + CORS-safelisted methods are always allowed, regardless of whether they + are specified in the `AllowMethods` field. + + When the `AllowMethods` field is configured with one or more methods, the + gateway must return the `Access-Control-Allow-Methods` response header + which value is present in the `AllowMethods` field. + + If the HTTP method of the `Access-Control-Request-Method` request header + is not included in the list of methods specified by the response header + `Access-Control-Allow-Methods`, it will present an error on the client + side. + + The `Access-Control-Allow-Methods` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowMethods` field + specified with the `*` wildcard, the gateway must specify one HTTP method + in the value of the Access-Control-Allow-Methods response header. The + value of the header `Access-Control-Allow-Methods` is same as the + `Access-Control-Request-Method` header provided by the client. If the + header `Access-Control-Request-Method` is not included in the request, + the gateway will omit the `Access-Control-Allow-Methods` response header, + instead of specifying the `*` wildcard. A Gateway implementation may + choose to add implementation-specific default methods. + + Support: Extended + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside + other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + description: |- + AllowOrigins indicates whether the response can be shared with requested + resource from the given `Origin`. + + The `Origin` consists of a scheme and a host, with an optional port, and + takes the form `://(:)`. + + Valid values for scheme are: `http` and `https`. + + Valid values for port are any integer between 1 and 65535 (the list of + available TCP/UDP ports). Note that, if not included, port `80` is + assumed for `http` scheme origins, and port `443` is assumed for `https` + origins. This may affect origin matching. + + The host part of the origin may contain the wildcard character `*`. These + wildcard characters behave as follows: + + * `*` is a greedy match to the _left_, including any number of + DNS labels to the left of its position. This also means that + `*` will include any number of period `.` characters to the + left of its position. + * A wildcard by itself matches all hosts. + + An origin value that includes _only_ the `*` character indicates requests + from all `Origin`s are allowed. + + When the `AllowOrigins` field is configured with multiple origins, it + means the server supports clients from multiple origins. If the request + `Origin` matches the configured allowed origins, the gateway must return + the given `Origin` and sets value of the header + `Access-Control-Allow-Origin` same as the `Origin` header provided by the + client. + + The status code of a successful response to a "preflight" request is + always an OK status (i.e., 204 or 200). + + If the request `Origin` does not match the configured allowed origins, + the gateway returns 204/200 response but doesn't set the relevant + cross-origin response headers. Alternatively, the gateway responds with + 403 status to the "preflight" request is denied, coupled with omitting + the CORS headers. The cross-origin request fails on the client side. + Therefore, the client doesn't attempt the actual cross-origin request. + + The `Access-Control-Allow-Origin` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowOrigins` field + specified with the `*` wildcard, the gateway must return a single origin + in the value of the `Access-Control-Allow-Origin` response header, + instead of specifying the `*` wildcard. The value of the header + `Access-Control-Allow-Origin` is same as the `Origin` header provided by + the client. + + Support: Extended + items: + description: |- + The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and + encoding rules specified in RFC3986. The AbsoluteURI MUST include both a + scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that + include an authority MUST include a fully qualified domain name or + IP address as the host. + maxLength: 253 + minLength: 1 + pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))? + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + exposeHeaders: + description: |- + ExposeHeaders indicates which HTTP response headers can be exposed + to client-side scripts in response to a cross-origin request. + + A CORS-safelisted response header is an HTTP header in a CORS response + that it is considered safe to expose to the client scripts. + The CORS-safelisted response headers include the following headers: + `Cache-Control` + `Content-Language` + `Content-Length` + `Content-Type` + `Expires` + `Last-Modified` + `Pragma` + (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name) + The CORS-safelisted response headers are exposed to client by default. + + When an HTTP header name is specified using the `ExposeHeaders` field, + this additional header will be exposed as part of the response to the + client. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Expose-Headers` + response header are separated by a comma (","). + + A wildcard indicates that the responses with all HTTP headers are exposed + to clients. The `Access-Control-Expose-Headers` response header can only + use `*` wildcard as value when the `AllowCredentials` field is + unspecified. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + description: |- + MaxAge indicates the duration (in seconds) for the client to cache the + results of a "preflight" request. + + The information provided by the `Access-Control-Allow-Methods` and + `Access-Control-Allow-Headers` response headers can be cached by the + client until the time specified by `Access-Control-Max-Age` elapses. + + The default value of `Access-Control-Max-Age` response header is 5 + (seconds). + format: int32 + minimum: 1 + type: integer + type: object extensionRef: description: |- ExtensionRef is an optional, implementation-specific extension to the @@ -7799,7 +8154,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -7873,7 +8228,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -7901,7 +8256,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -7911,7 +8266,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -8007,13 +8361,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -8032,14 +8385,13 @@ spec: denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -8236,7 +8588,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -8310,7 +8662,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -8378,6 +8730,7 @@ spec: - RequestRedirect - URLRewrite - ExtensionRef + - CORS type: string urlRewrite: description: |- @@ -8507,6 +8860,11 @@ spec: - message: filter.extensionRef must be specified for ExtensionRef filter.type rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' + - message: filter.cors must be nil if the filter.type is not + CORS + rule: '!(has(self.cors) && self.type != ''CORS'')' + - message: filter.cors must be specified for CORS filter.type + rule: '!(!has(self.cors) && self.type == ''CORS'')' maxItems: 16 type: array x-kubernetes-validations: @@ -8610,7 +8968,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, only the first entry with an equivalent name MUST be considered for a match. Subsequent @@ -8821,7 +9179,7 @@ spec: maxItems: 64 type: array name: - description: | + description: |- Name is the name of the route rule. This name MUST be unique within a Route if it is set. Support: Extended @@ -8830,15 +9188,14 @@ spec: pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string retry: - description: |+ + description: |- Retry defines the configuration for when to retry an HTTP request. Support: Extended - properties: attempts: description: |- - Attempts specifies the maxmimum number of times an individual request + Attempts specifies the maximum number of times an individual request from the gateway to a backend should be retried. If the maximum number of retries has been attempted without a successful @@ -8912,20 +9269,17 @@ spec: Implementations MAY support specifying discrete values in the 400-499 range, which are often inadvisable to retry. - - maximum: 599 minimum: 400 type: integer type: array type: object sessionPersistence: - description: |+ + description: |- SessionPersistence defines and configures session persistence for the route rule. Support: Extended - properties: absoluteTimeout: description: |- @@ -8960,6 +9314,8 @@ spec: absolute lifetime of the cookie tracked by the gateway and is optional. + Defaults to "Session". + Support: Core for "Session" type Support: Extended for "Permanent" type @@ -9173,7 +9529,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -9523,7 +9879,7 @@ spec: maxItems: 16 type: array parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -9585,11 +9941,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -9768,9 +10119,7 @@ spec: - path: type: PathPrefix value: / - description: |+ - Rules are a list of HTTP matchers, filters and actions. - + description: Rules are a list of HTTP matchers, filters and actions. items: description: |- HTTPRouteRule defines semantics for matching an HTTP request based on @@ -9823,7 +10172,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -9838,8 +10186,6 @@ spec: If a Route is not able to send traffic to the backend using the specified protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - - properties: filters: description: |- @@ -9857,6 +10203,289 @@ spec: authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. properties: + cors: + description: |- + CORS defines a schema for a filter that responds to the + cross-origin request based on HTTP response header. + + Support: Extended + properties: + allowCredentials: + description: |- + AllowCredentials indicates whether the actual cross-origin request allows + to include credentials. + + The only valid value for the `Access-Control-Allow-Credentials` response + header is true (case-sensitive). + + If the credentials are not allowed in cross-origin requests, the gateway + will omit the header `Access-Control-Allow-Credentials` entirely rather + than setting its value to false. + + Support: Extended + enum: + - true + type: boolean + allowHeaders: + description: |- + AllowHeaders indicates which HTTP request headers are supported for + accessing the requested resource. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Allow-Headers` + response header are separated by a comma (","). + + When the `AllowHeaders` field is configured with one or more headers, the + gateway must return the `Access-Control-Allow-Headers` response header + which value is present in the `AllowHeaders` field. + + If any header name in the `Access-Control-Request-Headers` request header + is not included in the list of header names specified by the response + header `Access-Control-Allow-Headers`, it will present an error on the + client side. + + If any header name in the `Access-Control-Allow-Headers` response header + does not recognize by the client, it will also occur an error on the + client side. + + A wildcard indicates that the requests with all HTTP headers are allowed. + The `Access-Control-Allow-Headers` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowHeaders` field + specified with the `*` wildcard, the gateway must specify one or more + HTTP headers in the value of the `Access-Control-Allow-Headers` response + header. The value of the header `Access-Control-Allow-Headers` is same as + the `Access-Control-Request-Headers` header provided by the client. If + the header `Access-Control-Request-Headers` is not included in the + request, the gateway will omit the `Access-Control-Allow-Headers` + response header, instead of specifying the `*` wildcard. A Gateway + implementation may choose to add implementation-specific default headers. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + description: |- + AllowMethods indicates which HTTP methods are supported for accessing the + requested resource. + + Valid values are any method defined by RFC9110, along with the special + value `*`, which represents all HTTP methods are allowed. + + Method names are case sensitive, so these values are also case-sensitive. + (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1) + + Multiple method names in the value of the `Access-Control-Allow-Methods` + response header are separated by a comma (","). + + A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`. + (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The + CORS-safelisted methods are always allowed, regardless of whether they + are specified in the `AllowMethods` field. + + When the `AllowMethods` field is configured with one or more methods, the + gateway must return the `Access-Control-Allow-Methods` response header + which value is present in the `AllowMethods` field. + + If the HTTP method of the `Access-Control-Request-Method` request header + is not included in the list of methods specified by the response header + `Access-Control-Allow-Methods`, it will present an error on the client + side. + + The `Access-Control-Allow-Methods` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowMethods` field + specified with the `*` wildcard, the gateway must specify one HTTP method + in the value of the Access-Control-Allow-Methods response header. The + value of the header `Access-Control-Allow-Methods` is same as the + `Access-Control-Request-Method` header provided by the client. If the + header `Access-Control-Request-Method` is not included in the request, + the gateway will omit the `Access-Control-Allow-Methods` response header, + instead of specifying the `*` wildcard. A Gateway implementation may + choose to add implementation-specific default methods. + + Support: Extended + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside + other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + description: |- + AllowOrigins indicates whether the response can be shared with requested + resource from the given `Origin`. + + The `Origin` consists of a scheme and a host, with an optional port, and + takes the form `://(:)`. + + Valid values for scheme are: `http` and `https`. + + Valid values for port are any integer between 1 and 65535 (the list of + available TCP/UDP ports). Note that, if not included, port `80` is + assumed for `http` scheme origins, and port `443` is assumed for `https` + origins. This may affect origin matching. + + The host part of the origin may contain the wildcard character `*`. These + wildcard characters behave as follows: + + * `*` is a greedy match to the _left_, including any number of + DNS labels to the left of its position. This also means that + `*` will include any number of period `.` characters to the + left of its position. + * A wildcard by itself matches all hosts. + + An origin value that includes _only_ the `*` character indicates requests + from all `Origin`s are allowed. + + When the `AllowOrigins` field is configured with multiple origins, it + means the server supports clients from multiple origins. If the request + `Origin` matches the configured allowed origins, the gateway must return + the given `Origin` and sets value of the header + `Access-Control-Allow-Origin` same as the `Origin` header provided by the + client. + + The status code of a successful response to a "preflight" request is + always an OK status (i.e., 204 or 200). + + If the request `Origin` does not match the configured allowed origins, + the gateway returns 204/200 response but doesn't set the relevant + cross-origin response headers. Alternatively, the gateway responds with + 403 status to the "preflight" request is denied, coupled with omitting + the CORS headers. The cross-origin request fails on the client side. + Therefore, the client doesn't attempt the actual cross-origin request. + + The `Access-Control-Allow-Origin` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowOrigins` field + specified with the `*` wildcard, the gateway must return a single origin + in the value of the `Access-Control-Allow-Origin` response header, + instead of specifying the `*` wildcard. The value of the header + `Access-Control-Allow-Origin` is same as the `Origin` header provided by + the client. + + Support: Extended + items: + description: |- + The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and + encoding rules specified in RFC3986. The AbsoluteURI MUST include both a + scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that + include an authority MUST include a fully qualified domain name or + IP address as the host. + maxLength: 253 + minLength: 1 + pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))? + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + exposeHeaders: + description: |- + ExposeHeaders indicates which HTTP response headers can be exposed + to client-side scripts in response to a cross-origin request. + + A CORS-safelisted response header is an HTTP header in a CORS response + that it is considered safe to expose to the client scripts. + The CORS-safelisted response headers include the following headers: + `Cache-Control` + `Content-Language` + `Content-Length` + `Content-Type` + `Expires` + `Last-Modified` + `Pragma` + (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name) + The CORS-safelisted response headers are exposed to client by default. + + When an HTTP header name is specified using the `ExposeHeaders` field, + this additional header will be exposed as part of the response to the + client. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Expose-Headers` + response header are separated by a comma (","). + + A wildcard indicates that the responses with all HTTP headers are exposed + to clients. The `Access-Control-Expose-Headers` response header can only + use `*` wildcard as value when the `AllowCredentials` field is + unspecified. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + description: |- + MaxAge indicates the duration (in seconds) for the client to cache the + results of a "preflight" request. + + The information provided by the `Access-Control-Allow-Methods` and + `Access-Control-Allow-Headers` response headers can be cached by the + client until the time specified by `Access-Control-Max-Age` elapses. + + The default value of `Access-Control-Max-Age` response header is 5 + (seconds). + format: int32 + minimum: 1 + type: integer + type: object extensionRef: description: |- ExtensionRef is an optional, implementation-specific extension to the @@ -9925,7 +10554,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10000,7 +10629,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10028,7 +10657,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -10038,7 +10667,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -10134,13 +10762,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -10159,14 +10786,13 @@ spec: to denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -10364,7 +10990,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10439,7 +11065,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10507,6 +11133,7 @@ spec: - RequestRedirect - URLRewrite - ExtensionRef + - CORS type: string urlRewrite: description: |- @@ -10639,6 +11266,11 @@ spec: - message: filter.extensionRef must be specified for ExtensionRef filter.type rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' + - message: filter.cors must be nil if the filter.type + is not CORS + rule: '!(has(self.cors) && self.type != ''CORS'')' + - message: filter.cors must be specified for CORS filter.type + rule: '!(!has(self.cors) && self.type == ''CORS'')' maxItems: 16 type: array x-kubernetes-validations: @@ -10760,7 +11392,7 @@ spec: they are specified. Implementations MAY choose to implement this ordering strictly, rejecting - any combination or order of filters that can not be supported. If implementations + any combination or order of filters that cannot be supported. If implementations choose a strict interpretation of filter ordering, they MUST clearly document that behavior. @@ -10782,7 +11414,7 @@ spec: All filters are expected to be compatible with each other except for the URLRewrite and RequestRedirect filters, which may not be combined. If an - implementation can not support other combinations of filters, they must clearly + implementation cannot support other combinations of filters, they must clearly document that limitation. In cases where incompatible or unsupported filters are specified and cause the `Accepted` condition to be set to status `False`, implementations may use the `IncompatibleFilters` reason to specify @@ -10798,6 +11430,289 @@ spec: authentication strategies, rate-limiting, and traffic shaping. API guarantee/conformance is defined based on the type of the filter. properties: + cors: + description: |- + CORS defines a schema for a filter that responds to the + cross-origin request based on HTTP response header. + + Support: Extended + properties: + allowCredentials: + description: |- + AllowCredentials indicates whether the actual cross-origin request allows + to include credentials. + + The only valid value for the `Access-Control-Allow-Credentials` response + header is true (case-sensitive). + + If the credentials are not allowed in cross-origin requests, the gateway + will omit the header `Access-Control-Allow-Credentials` entirely rather + than setting its value to false. + + Support: Extended + enum: + - true + type: boolean + allowHeaders: + description: |- + AllowHeaders indicates which HTTP request headers are supported for + accessing the requested resource. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Allow-Headers` + response header are separated by a comma (","). + + When the `AllowHeaders` field is configured with one or more headers, the + gateway must return the `Access-Control-Allow-Headers` response header + which value is present in the `AllowHeaders` field. + + If any header name in the `Access-Control-Request-Headers` request header + is not included in the list of header names specified by the response + header `Access-Control-Allow-Headers`, it will present an error on the + client side. + + If any header name in the `Access-Control-Allow-Headers` response header + does not recognize by the client, it will also occur an error on the + client side. + + A wildcard indicates that the requests with all HTTP headers are allowed. + The `Access-Control-Allow-Headers` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowHeaders` field + specified with the `*` wildcard, the gateway must specify one or more + HTTP headers in the value of the `Access-Control-Allow-Headers` response + header. The value of the header `Access-Control-Allow-Headers` is same as + the `Access-Control-Request-Headers` header provided by the client. If + the header `Access-Control-Request-Headers` is not included in the + request, the gateway will omit the `Access-Control-Allow-Headers` + response header, instead of specifying the `*` wildcard. A Gateway + implementation may choose to add implementation-specific default headers. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + allowMethods: + description: |- + AllowMethods indicates which HTTP methods are supported for accessing the + requested resource. + + Valid values are any method defined by RFC9110, along with the special + value `*`, which represents all HTTP methods are allowed. + + Method names are case sensitive, so these values are also case-sensitive. + (See https://www.rfc-editor.org/rfc/rfc2616#section-5.1.1) + + Multiple method names in the value of the `Access-Control-Allow-Methods` + response header are separated by a comma (","). + + A CORS-safelisted method is a method that is `GET`, `HEAD`, or `POST`. + (See https://fetch.spec.whatwg.org/#cors-safelisted-method) The + CORS-safelisted methods are always allowed, regardless of whether they + are specified in the `AllowMethods` field. + + When the `AllowMethods` field is configured with one or more methods, the + gateway must return the `Access-Control-Allow-Methods` response header + which value is present in the `AllowMethods` field. + + If the HTTP method of the `Access-Control-Request-Method` request header + is not included in the list of methods specified by the response header + `Access-Control-Allow-Methods`, it will present an error on the client + side. + + The `Access-Control-Allow-Methods` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowMethods` field + specified with the `*` wildcard, the gateway must specify one HTTP method + in the value of the Access-Control-Allow-Methods response header. The + value of the header `Access-Control-Allow-Methods` is same as the + `Access-Control-Request-Method` header provided by the client. If the + header `Access-Control-Request-Method` is not included in the request, + the gateway will omit the `Access-Control-Allow-Methods` response header, + instead of specifying the `*` wildcard. A Gateway implementation may + choose to add implementation-specific default methods. + + Support: Extended + items: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - CONNECT + - OPTIONS + - TRACE + - PATCH + - '*' + type: string + maxItems: 9 + type: array + x-kubernetes-list-type: set + x-kubernetes-validations: + - message: AllowMethods cannot contain '*' alongside + other methods + rule: '!(''*'' in self && self.size() > 1)' + allowOrigins: + description: |- + AllowOrigins indicates whether the response can be shared with requested + resource from the given `Origin`. + + The `Origin` consists of a scheme and a host, with an optional port, and + takes the form `://(:)`. + + Valid values for scheme are: `http` and `https`. + + Valid values for port are any integer between 1 and 65535 (the list of + available TCP/UDP ports). Note that, if not included, port `80` is + assumed for `http` scheme origins, and port `443` is assumed for `https` + origins. This may affect origin matching. + + The host part of the origin may contain the wildcard character `*`. These + wildcard characters behave as follows: + + * `*` is a greedy match to the _left_, including any number of + DNS labels to the left of its position. This also means that + `*` will include any number of period `.` characters to the + left of its position. + * A wildcard by itself matches all hosts. + + An origin value that includes _only_ the `*` character indicates requests + from all `Origin`s are allowed. + + When the `AllowOrigins` field is configured with multiple origins, it + means the server supports clients from multiple origins. If the request + `Origin` matches the configured allowed origins, the gateway must return + the given `Origin` and sets value of the header + `Access-Control-Allow-Origin` same as the `Origin` header provided by the + client. + + The status code of a successful response to a "preflight" request is + always an OK status (i.e., 204 or 200). + + If the request `Origin` does not match the configured allowed origins, + the gateway returns 204/200 response but doesn't set the relevant + cross-origin response headers. Alternatively, the gateway responds with + 403 status to the "preflight" request is denied, coupled with omitting + the CORS headers. The cross-origin request fails on the client side. + Therefore, the client doesn't attempt the actual cross-origin request. + + The `Access-Control-Allow-Origin` response header can only use `*` + wildcard as value when the `AllowCredentials` field is unspecified. + + When the `AllowCredentials` field is specified and `AllowOrigins` field + specified with the `*` wildcard, the gateway must return a single origin + in the value of the `Access-Control-Allow-Origin` response header, + instead of specifying the `*` wildcard. The value of the header + `Access-Control-Allow-Origin` is same as the `Origin` header provided by + the client. + + Support: Extended + items: + description: |- + The AbsoluteURI MUST NOT be a relative URI, and it MUST follow the URI syntax and + encoding rules specified in RFC3986. The AbsoluteURI MUST include both a + scheme (e.g., "http" or "spiffe") and a scheme-specific-part. URIs that + include an authority MUST include a fully qualified domain name or + IP address as the host. + maxLength: 253 + minLength: 1 + pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))? + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + exposeHeaders: + description: |- + ExposeHeaders indicates which HTTP response headers can be exposed + to client-side scripts in response to a cross-origin request. + + A CORS-safelisted response header is an HTTP header in a CORS response + that it is considered safe to expose to the client scripts. + The CORS-safelisted response headers include the following headers: + `Cache-Control` + `Content-Language` + `Content-Length` + `Content-Type` + `Expires` + `Last-Modified` + `Pragma` + (See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name) + The CORS-safelisted response headers are exposed to client by default. + + When an HTTP header name is specified using the `ExposeHeaders` field, + this additional header will be exposed as part of the response to the + client. + + Header names are not case sensitive. + + Multiple header names in the value of the `Access-Control-Expose-Headers` + response header are separated by a comma (","). + + A wildcard indicates that the responses with all HTTP headers are exposed + to clients. The `Access-Control-Expose-Headers` response header can only + use `*` wildcard as value when the `AllowCredentials` field is + unspecified. + + Support: Extended + items: + description: |- + HTTPHeaderName is the name of an HTTP header. + + Valid values include: + + * "Authorization" + * "Set-Cookie" + + Invalid values include: + + - ":method" - ":" is an invalid character. This means that HTTP/2 pseudo + headers are not currently supported by this type. + - "/invalid" - "/ " is an invalid character + maxLength: 256 + minLength: 1 + pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$ + type: string + maxItems: 64 + type: array + x-kubernetes-list-type: set + maxAge: + default: 5 + description: |- + MaxAge indicates the duration (in seconds) for the client to cache the + results of a "preflight" request. + + The information provided by the `Access-Control-Allow-Methods` and + `Access-Control-Allow-Headers` response headers can be cached by the + client until the time specified by `Access-Control-Max-Age` elapses. + + The default value of `Access-Control-Max-Age` response header is 5 + (seconds). + format: int32 + minimum: 1 + type: integer + type: object extensionRef: description: |- ExtensionRef is an optional, implementation-specific extension to the @@ -10865,7 +11780,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10939,7 +11854,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -10967,7 +11882,7 @@ spec: x-kubernetes-list-type: map type: object requestMirror: - description: |+ + description: |- RequestMirror defines a schema for a filter that mirrors requests. Requests are sent to the specified destination, but responses from that destination are ignored. @@ -10977,7 +11892,6 @@ spec: backends. Support: Extended - properties: backendRef: description: |- @@ -11073,13 +11987,12 @@ spec: rule: '(size(self.group) == 0 && self.kind == ''Service'') ? has(self.port) : true' fraction: - description: |+ + description: |- Fraction represents the fraction of requests that should be mirrored to BackendRef. Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - properties: denominator: default: 100 @@ -11098,14 +12011,13 @@ spec: denominator rule: self.numerator <= self.denominator percent: - description: |+ + description: |- Percent represents the percentage of requests that should be mirrored to BackendRef. Its minimum value is 0 (indicating 0% of requests) and its maximum value is 100 (indicating 100% of requests). Only one of Fraction or Percent may be specified. If neither field is specified, 100% of requests will be mirrored. - format: int32 maximum: 100 minimum: 0 @@ -11302,7 +12214,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -11376,7 +12288,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, the first entry with an equivalent name MUST be considered for a match. Subsequent entries @@ -11444,6 +12356,7 @@ spec: - RequestRedirect - URLRewrite - ExtensionRef + - CORS type: string urlRewrite: description: |- @@ -11573,6 +12486,11 @@ spec: - message: filter.extensionRef must be specified for ExtensionRef filter.type rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')' + - message: filter.cors must be nil if the filter.type is not + CORS + rule: '!(has(self.cors) && self.type != ''CORS'')' + - message: filter.cors must be specified for CORS filter.type + rule: '!(!has(self.cors) && self.type == ''CORS'')' maxItems: 16 type: array x-kubernetes-validations: @@ -11676,7 +12594,7 @@ spec: name: description: |- Name is the name of the HTTP Header to be matched. Name matching MUST be - case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). + case-insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2). If multiple entries specify equivalent header names, only the first entry with an equivalent name MUST be considered for a match. Subsequent @@ -11887,7 +12805,7 @@ spec: maxItems: 64 type: array name: - description: | + description: |- Name is the name of the route rule. This name MUST be unique within a Route if it is set. Support: Extended @@ -11896,15 +12814,14 @@ spec: pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ type: string retry: - description: |+ + description: |- Retry defines the configuration for when to retry an HTTP request. Support: Extended - properties: attempts: description: |- - Attempts specifies the maxmimum number of times an individual request + Attempts specifies the maximum number of times an individual request from the gateway to a backend should be retried. If the maximum number of retries has been attempted without a successful @@ -11978,20 +12895,17 @@ spec: Implementations MAY support specifying discrete values in the 400-499 range, which are often inadvisable to retry. - - maximum: 599 minimum: 400 type: integer type: array type: object sessionPersistence: - description: |+ + description: |- SessionPersistence defines and configures session persistence for the route rule. Support: Extended - properties: absoluteTimeout: description: |- @@ -12026,6 +12940,8 @@ spec: absolute lifetime of the cookie tracked by the gateway and is optional. + Defaults to "Session". + Support: Core for "Session" type Support: Extended for "Permanent" type @@ -12239,7 +13155,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -12490,7 +13406,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: referencegrants.gateway.networking.k8s.io @@ -12683,7 +13599,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: tcproutes.gateway.networking.k8s.io @@ -12731,7 +13647,7 @@ spec: description: Spec defines the desired state of TCPRoute. properties: parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -12793,11 +13709,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -12971,16 +13882,14 @@ spec: || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port == p2.port)))) rules: - description: |+ - Rules are a list of TCP matchers and actions. - + description: Rules are a list of TCP matchers and actions. items: description: TCPRouteRule is the configuration for a given rule. properties: backendRefs: description: |- BackendRefs defines the backend(s) where matching requests should be - sent. If unspecified or invalid (refers to a non-existent resource or a + sent. If unspecified or invalid (refers to a nonexistent resource or a Service with no endpoints), the underlying implementation MUST actively reject connection attempts to this backend. Connection rejections must respect weight; if an invalid backend is requested to have 80% of @@ -13003,7 +13912,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -13019,7 +13927,6 @@ spec: protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - Note that when the BackendTLSPolicy object is enabled by the implementation, there are some extra rules about validity to consider here. See the fields @@ -13177,7 +14084,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -13428,7 +14335,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: tlsroutes.gateway.networking.k8s.io @@ -13536,7 +14443,7 @@ spec: maxItems: 16 type: array parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -13598,11 +14505,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -13776,16 +14678,14 @@ spec: || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port == p2.port)))) rules: - description: |+ - Rules are a list of TLS matchers and actions. - + description: Rules are a list of TLS matchers and actions. items: description: TLSRouteRule is the configuration for a given rule. properties: backendRefs: description: |- BackendRefs defines the backend(s) where matching requests should be - sent. If unspecified or invalid (refers to a non-existent resource or + sent. If unspecified or invalid (refers to a nonexistent resource or a Service with no endpoints), the rule performs no forwarding; if no filters are specified that would result in a response being sent, the underlying implementation must actively reject request attempts to this @@ -13811,7 +14711,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -13827,7 +14726,6 @@ spec: protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - Note that when the BackendTLSPolicy object is enabled by the implementation, there are some extra rules about validity to consider here. See the fields @@ -13985,7 +14883,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -14236,7 +15134,7 @@ kind: CustomResourceDefinition metadata: annotations: api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 - gateway.networking.k8s.io/bundle-version: v1.2.1 + gateway.networking.k8s.io/bundle-version: v1.3.0 gateway.networking.k8s.io/channel: experimental creationTimestamp: null name: udproutes.gateway.networking.k8s.io @@ -14284,7 +15182,7 @@ spec: description: Spec defines the desired state of UDPRoute. properties: parentRefs: - description: |+ + description: |- ParentRefs references the resources (usually Gateways) that a Route wants to be attached to. Note that the referenced parent resource needs to allow this for the attachment to be complete. For Gateways, that means @@ -14346,11 +15244,6 @@ spec: connections originating from the same namespace as the Route, for which the intended destination of the connections are a Service targeted as a ParentRef of the Route. - - - - - items: description: |- ParentReference identifies an API object (usually a Gateway) that can be considered @@ -14524,16 +15417,14 @@ spec: || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port == p2.port)))) rules: - description: |+ - Rules are a list of UDP matchers and actions. - + description: Rules are a list of UDP matchers and actions. items: description: UDPRouteRule is the configuration for a given rule. properties: backendRefs: description: |- BackendRefs defines the backend(s) where matching requests should be - sent. If unspecified or invalid (refers to a non-existent resource or a + sent. If unspecified or invalid (refers to a nonexistent resource or a Service with no endpoints), the underlying implementation MUST actively reject connection attempts to this backend. Packet drops must respect weight; if an invalid backend is requested to have 80% of @@ -14556,7 +15447,6 @@ spec: namespace's owner to accept the reference. See the ReferenceGrant documentation for details. - When the BackendRef points to a Kubernetes Service, implementations SHOULD honor the appProtocol field if it is set for the target Service Port. @@ -14572,7 +15462,6 @@ spec: protocol then the backend is considered invalid. Implementations MUST set the "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason. - Note that when the BackendTLSPolicy object is enabled by the implementation, there are some extra rules about validity to consider here. See the fields @@ -14730,7 +15619,7 @@ spec: There are a number of cases where the "Accepted" condition may not be set due to lack of controller visibility, that includes when: - * The Route refers to a non-existent parent. + * The Route refers to a nonexistent parent. * The Route is of a type that the controller does not support. * The Route is in a namespace the controller does not have access to. items: @@ -14972,3 +15861,1458 @@ status: plural: "" conditions: null storedVersions: null +--- +# +# config/crd/experimental/gateway.networking.x-k8s.io_xbackendtrafficpolicies.yaml +# +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 + gateway.networking.k8s.io/bundle-version: v1.3.0 + gateway.networking.k8s.io/channel: experimental + creationTimestamp: null + labels: + gateway.networking.k8s.io/policy: Direct + name: xbackendtrafficpolicies.gateway.networking.x-k8s.io +spec: + group: gateway.networking.x-k8s.io + names: + categories: + - gateway-api + kind: XBackendTrafficPolicy + listKind: XBackendTrafficPolicyList + plural: xbackendtrafficpolicies + shortNames: + - xbtrafficpolicy + singular: xbackendtrafficpolicy + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + XBackendTrafficPolicy defines the configuration for how traffic to a + target backend should be handled. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: Spec defines the desired state of BackendTrafficPolicy. + properties: + retryConstraint: + description: |- + RetryConstraint defines the configuration for when to allow or prevent + further retries to a target backend, by dynamically calculating a 'retry + budget'. This budget is calculated based on the percentage of incoming + traffic composed of retries over a given time interval. Once the budget + is exceeded, additional retries will be rejected. + + For example, if the retry budget interval is 10 seconds, there have been + 1000 active requests in the past 10 seconds, and the allowed percentage + of requests that can be retried is 20% (the default), then 200 of those + requests may be composed of retries. Active requests will only be + considered for the duration of the interval when calculating the retry + budget. Retrying the same original request multiple times within the + retry budget interval will lead to each retry being counted towards + calculating the budget. + + Configuring a RetryConstraint in BackendTrafficPolicy is compatible with + HTTPRoute Retry settings for each HTTPRouteRule that targets the same + backend. While the HTTPRouteRule Retry stanza can specify whether a + request will be retried, and the number of retry attempts each client + may perform, RetryConstraint helps prevent cascading failures such as + retry storms during periods of consistent failures. + + After the retry budget has been exceeded, additional retries to the + backend MUST return a 503 response to the client. + + Additional configurations for defining a constraint on retries MAY be + defined in the future. + + Support: Extended + properties: + budget: + default: + interval: 10s + percent: 20 + description: Budget holds the details of the retry budget configuration. + properties: + interval: + default: 10s + description: |- + Interval defines the duration in which requests will be considered + for calculating the budget for retries. + + Support: Extended + pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ + type: string + x-kubernetes-validations: + - message: interval can not be greater than one hour or less + than one second + rule: '!(duration(self) < duration(''1s'') || duration(self) + > duration(''1h''))' + percent: + default: 20 + description: |- + Percent defines the maximum percentage of active requests that may + be made up of retries. + + Support: Extended + maximum: 100 + minimum: 0 + type: integer + type: object + minRetryRate: + default: + count: 10 + interval: 1s + description: |- + MinRetryRate defines the minimum rate of retries that will be allowable + over a specified duration of time. + + The effective overall minimum rate of retries targeting the backend + service may be much higher, as there can be any number of clients which + are applying this setting locally. + + This ensures that requests can still be retried during periods of low + traffic, where the budget for retries may be calculated as a very low + value. + + Support: Extended + properties: + count: + description: |- + Count specifies the number of requests per time interval. + + Support: Extended + maximum: 1000000 + minimum: 1 + type: integer + interval: + description: |- + Interval specifies the divisor of the rate of requests, the amount of + time during which the given count of requests occur. + + Support: Extended + pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ + type: string + x-kubernetes-validations: + - message: interval can not be greater than one hour + rule: '!(duration(self) == duration(''0s'') || duration(self) + > duration(''1h''))' + type: object + type: object + sessionPersistence: + description: |- + SessionPersistence defines and configures session persistence + for the backend. + + Support: Extended + properties: + absoluteTimeout: + description: |- + AbsoluteTimeout defines the absolute timeout of the persistent + session. Once the AbsoluteTimeout duration has elapsed, the + session becomes invalid. + + Support: Extended + pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ + type: string + cookieConfig: + description: |- + CookieConfig provides configuration settings that are specific + to cookie-based session persistence. + + Support: Core + properties: + lifetimeType: + default: Session + description: |- + LifetimeType specifies whether the cookie has a permanent or + session-based lifetime. A permanent cookie persists until its + specified expiry time, defined by the Expires or Max-Age cookie + attributes, while a session cookie is deleted when the current + session ends. + + When set to "Permanent", AbsoluteTimeout indicates the + cookie's lifetime via the Expires or Max-Age cookie attributes + and is required. + + When set to "Session", AbsoluteTimeout indicates the + absolute lifetime of the cookie tracked by the gateway and + is optional. + + Defaults to "Session". + + Support: Core for "Session" type + + Support: Extended for "Permanent" type + enum: + - Permanent + - Session + type: string + type: object + idleTimeout: + description: |- + IdleTimeout defines the idle timeout of the persistent session. + Once the session has been idle for more than the specified + IdleTimeout duration, the session becomes invalid. + + Support: Extended + pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$ + type: string + sessionName: + description: |- + SessionName defines the name of the persistent session token + which may be reflected in the cookie or the header. Users + should avoid reusing session names to prevent unintended + consequences, such as rejection or unpredictable behavior. + + Support: Implementation-specific + maxLength: 128 + type: string + type: + default: Cookie + description: |- + Type defines the type of session persistence such as through + the use a header or cookie. Defaults to cookie based session + persistence. + + Support: Core for "Cookie" type + + Support: Extended for "Header" type + enum: + - Cookie + - Header + type: string + type: object + x-kubernetes-validations: + - message: AbsoluteTimeout must be specified when cookie lifetimeType + is Permanent + rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType) + || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)' + targetRefs: + description: |- + TargetRefs identifies API object(s) to apply this policy to. + Currently, Backends (A grouping of like endpoints such as Service, + ServiceImport, or any implementation-specific backendRef) are the only + valid API target references. + + Currently, a TargetRef can not be scoped to a specific port on a + Service. + items: + description: |- + LocalPolicyTargetReference identifies an API object to apply a direct or + inherited policy to. This should be used as part of Policy resources + that can target Gateway API resources. For more information on how this + policy attachment model works, and a sample Policy resource, refer to + the policy attachment documentation for Gateway API. + properties: + group: + description: Group is the group of the target resource. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + description: Kind is kind of the target resource. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the target resource. + maxLength: 253 + minLength: 1 + type: string + required: + - group + - kind + - name + type: object + maxItems: 16 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - group + - kind + - name + x-kubernetes-list-type: map + required: + - targetRefs + type: object + status: + description: Status defines the current state of BackendTrafficPolicy. + properties: + ancestors: + description: |- + Ancestors is a list of ancestor resources (usually Gateways) that are + associated with the policy, and the status of the policy with respect to + each ancestor. When this policy attaches to a parent, the controller that + manages the parent and the ancestors MUST add an entry to this list when + the controller first sees the policy and SHOULD update the entry as + appropriate when the relevant ancestor is modified. + + Note that choosing the relevant ancestor is left to the Policy designers; + an important part of Policy design is designing the right object level at + which to namespace this status. + + Note also that implementations MUST ONLY populate ancestor status for + the Ancestor resources they are responsible for. Implementations MUST + use the ControllerName field to uniquely identify the entries in this list + that they are responsible for. + + Note that to achieve this, the list of PolicyAncestorStatus structs + MUST be treated as a map with a composite key, made up of the AncestorRef + and ControllerName fields combined. + + A maximum of 16 ancestors will be represented in this list. An empty list + means the Policy is not relevant for any ancestors. + + If this slice is full, implementations MUST NOT add further entries. + Instead they MUST consider the policy unimplementable and signal that + on any related resources such as the ancestor that would be referenced + here. For example, if this list was full on BackendTLSPolicy, no + additional Gateways would be able to reference the Service targeted by + the BackendTLSPolicy. + items: + description: |- + PolicyAncestorStatus describes the status of a route with respect to an + associated Ancestor. + + Ancestors refer to objects that are either the Target of a policy or above it + in terms of object hierarchy. For example, if a policy targets a Service, the + Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and + the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most + useful object to place Policy status on, so we recommend that implementations + SHOULD use Gateway as the PolicyAncestorStatus object unless the designers + have a _very_ good reason otherwise. + + In the context of policy attachment, the Ancestor is used to distinguish which + resource results in a distinct application of this policy. For example, if a policy + targets a Service, it may have a distinct result per attached Gateway. + + Policies targeting the same resource may have different effects depending on the + ancestors of those resources. For example, different Gateways targeting the same + Service may have different capabilities, especially if they have different underlying + implementations. + + For example, in BackendTLSPolicy, the Policy attaches to a Service that is + used as a backend in a HTTPRoute that is itself attached to a Gateway. + In this case, the relevant object for status is the Gateway, and that is the + ancestor object referred to in this status. + + Note that a parent is also an ancestor, so for objects where the parent is the + relevant object for status, this struct SHOULD still be used. + + This struct is intended to be used in a slice that's effectively a map, + with a composite key made up of the AncestorRef and the ControllerName. + properties: + ancestorRef: + description: |- + AncestorRef corresponds with a ParentRef in the spec that this + PolicyAncestorStatus struct describes the status of. + properties: + group: + default: gateway.networking.k8s.io + description: |- + Group is the group of the referent. + When unspecified, "gateway.networking.k8s.io" is inferred. + To set the core API group (such as for a "Service" kind referent), + Group must be explicitly set to "" (empty string). + + Support: Core + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Gateway + description: |- + Kind is kind of the referent. + + There are two kinds of parent resources with "Core" support: + + * Gateway (Gateway conformance profile) + * Service (Mesh conformance profile, ClusterIP Services only) + + Support for other resources is Implementation-Specific. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: |- + Name is the name of the referent. + + Support: Core + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referent. When unspecified, this refers + to the local namespace of the Route. + + Note that there are specific rules for ParentRefs which cross namespace + boundaries. Cross-namespace references are only valid if they are explicitly + allowed by something in the namespace they are referring to. For example: + Gateway has the AllowedRoutes field, and ReferenceGrant provides a + generic way to enable any other kind of cross-namespace reference. + + + ParentRefs from a Route to a Service in the same namespace are "producer" + routes, which apply default routing rules to inbound connections from + any namespace to the Service. + + ParentRefs from a Route to a Service in a different namespace are + "consumer" routes, and these routing rules are only applied to outbound + connections originating from the same namespace as the Route, for which + the intended destination of the connections are a Service targeted as a + ParentRef of the Route. + + + Support: Core + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + port: + description: |- + Port is the network port this Route targets. It can be interpreted + differently based on the type of parent resource. + + When the parent resource is a Gateway, this targets all listeners + listening on the specified port that also support this kind of Route(and + select this Route). It's not recommended to set `Port` unless the + networking behaviors specified in a Route must apply to a specific port + as opposed to a listener(s) whose port(s) may be changed. When both Port + and SectionName are specified, the name and port of the selected listener + must match both specified values. + + + When the parent resource is a Service, this targets a specific port in the + Service spec. When both Port (experimental) and SectionName are specified, + the name and port of the selected port must match both specified values. + + + Implementations MAY choose to support other parent resources. + Implementations supporting other types of parent resources MUST clearly + document how/if Port is interpreted. + + For the purpose of status, an attachment is considered successful as + long as the parent resource accepts it partially. For example, Gateway + listeners can restrict which Routes can attach to them by Route kind, + namespace, or hostname. If 1 of 2 Gateway listeners accept attachment + from the referencing Route, the Route MUST be considered successfully + attached. If no Gateway listeners accept attachment from this Route, + the Route MUST be considered detached from the Gateway. + + Support: Extended + format: int32 + maximum: 65535 + minimum: 1 + type: integer + sectionName: + description: |- + SectionName is the name of a section within the target resource. In the + following resources, SectionName is interpreted as the following: + + * Gateway: Listener name. When both Port (experimental) and SectionName + are specified, the name and port of the selected listener must match + both specified values. + * Service: Port name. When both Port (experimental) and SectionName + are specified, the name and port of the selected listener must match + both specified values. + + Implementations MAY choose to support attaching Routes to other resources. + If that is the case, they MUST clearly document how SectionName is + interpreted. + + When unspecified (empty string), this will reference the entire resource. + For the purpose of status, an attachment is considered successful if at + least one section in the parent resource accepts it. For example, Gateway + listeners can restrict which Routes can attach to them by Route kind, + namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from + the referencing Route, the Route MUST be considered successfully + attached. If no Gateway listeners accept attachment from this Route, the + Route MUST be considered detached from the Gateway. + + Support: Core + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + required: + - name + type: object + conditions: + description: Conditions describes the status of the Policy with + respect to the given Ancestor. + items: + description: Condition contains details for one aspect of + the current state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + controllerName: + description: |- + ControllerName is a domain/path string that indicates the name of the + controller that wrote this status. This corresponds with the + controllerName field on GatewayClass. + + Example: "example.net/gateway-controller". + + The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are + valid Kubernetes names + (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names). + + Controllers MUST populate this field when writing status. Controllers should ensure that + entries to status populated with their ControllerName are cleaned up when they are no + longer necessary. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$ + type: string + required: + - ancestorRef + - controllerName + type: object + maxItems: 16 + type: array + required: + - ancestors + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null +--- +# +# config/crd/experimental/gateway.networking.x-k8s.io_xlistenersets.yaml +# +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328 + gateway.networking.k8s.io/bundle-version: v1.3.0 + gateway.networking.k8s.io/channel: experimental + creationTimestamp: null + name: xlistenersets.gateway.networking.x-k8s.io +spec: + group: gateway.networking.x-k8s.io + names: + categories: + - gateway-api + kind: XListenerSet + listKind: XListenerSetList + plural: xlistenersets + shortNames: + - lset + singular: xlistenerset + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.conditions[?(@.type=="Accepted")].status + name: Accepted + type: string + - jsonPath: .status.conditions[?(@.type=="Programmed")].status + name: Programmed + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: |- + XListenerSet defines a set of additional listeners + to attach to an existing Gateway. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: Spec defines the desired state of ListenerSet. + properties: + listeners: + description: |- + Listeners associated with this ListenerSet. Listeners define + logical endpoints that are bound on this referenced parent Gateway's addresses. + + Listeners in a `Gateway` and their attached `ListenerSets` are concatenated + as a list when programming the underlying infrastructure. Each listener + name does not need to be unique across the Gateway and ListenerSets. + See ListenerEntry.Name for more details. + + Implementations MUST treat the parent Gateway as having the merged + list of all listeners from itself and attached ListenerSets using + the following precedence: + + 1. "parent" Gateway + 2. ListenerSet ordered by creation time (oldest first) + 3. ListenerSet ordered alphabetically by “{namespace}/{name}”. + + An implementation MAY reject listeners by setting the ListenerEntryStatus + `Accepted`` condition to False with the Reason `TooManyListeners` + + If a listener has a conflict, this will be reported in the + Status.ListenerEntryStatus setting the `Conflicted` condition to True. + + Implementations SHOULD be cautious about what information from the + parent or siblings are reported to avoid accidentally leaking + sensitive information that the child would not otherwise have access + to. This can include contents of secrets etc. + items: + properties: + allowedRoutes: + default: + namespaces: + from: Same + description: |- + AllowedRoutes defines the types of routes that MAY be attached to a + Listener and the trusted namespaces where those Route resources MAY be + present. + + Although a client request may match multiple route rules, only one rule + may ultimately receive the request. Matching precedence MUST be + determined in order of the following criteria: + + * The most specific match as defined by the Route type. + * The oldest Route based on creation timestamp. For example, a Route with + a creation timestamp of "2020-09-08 01:02:03" is given precedence over + a Route with a creation timestamp of "2020-09-08 01:02:04". + * If everything else is equivalent, the Route appearing first in + alphabetical order (namespace/name) should be given precedence. For + example, foo/bar is given precedence over foo/baz. + + All valid rules within a Route attached to this Listener should be + implemented. Invalid Route rules can be ignored (sometimes that will mean + the full Route). If a Route rule transitions from valid to invalid, + support for that Route rule should be dropped to ensure consistency. For + example, even if a filter specified by a Route rule is invalid, the rest + of the rules within that Route should still be supported. + properties: + kinds: + description: |- + Kinds specifies the groups and kinds of Routes that are allowed to bind + to this Gateway Listener. When unspecified or empty, the kinds of Routes + selected are determined using the Listener protocol. + + A RouteGroupKind MUST correspond to kinds of Routes that are compatible + with the application protocol specified in the Listener's Protocol field. + If an implementation does not support or recognize this resource type, it + MUST set the "ResolvedRefs" condition to False for this Listener with the + "InvalidRouteKinds" reason. + + Support: Core + items: + description: RouteGroupKind indicates the group and kind + of a Route resource. + properties: + group: + default: gateway.networking.k8s.io + description: Group is the group of the Route. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + description: Kind is the kind of the Route. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + required: + - kind + type: object + maxItems: 8 + type: array + namespaces: + default: + from: Same + description: |- + Namespaces indicates namespaces from which Routes may be attached to this + Listener. This is restricted to the namespace of this Gateway by default. + + Support: Core + properties: + from: + default: Same + description: |- + From indicates where Routes will be selected for this Gateway. Possible + values are: + + * All: Routes in all namespaces may be used by this Gateway. + * Selector: Routes in namespaces selected by the selector may be used by + this Gateway. + * Same: Only Routes in the same namespace may be used by this Gateway. + + Support: Core + enum: + - All + - Selector + - Same + type: string + selector: + description: |- + Selector must be specified when From is set to "Selector". In that case, + only Routes in Namespaces matching this Selector will be selected by this + Gateway. This field is ignored for other values of "From". + + Support: Core + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: |- + A label selector requirement is a selector that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: |- + operator represents a key's relationship to a set of values. + Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: |- + values is an array of string values. If the operator is In or NotIn, + the values array must be non-empty. If the operator is Exists or DoesNotExist, + the values array must be empty. This array is replaced during a strategic + merge patch. + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + description: |- + matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, whose key field is "key", the + operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + type: object + type: object + hostname: + description: |- + Hostname specifies the virtual hostname to match for protocol types that + define this concept. When unspecified, all hostnames are matched. This + field is ignored for protocols that don't require hostname based + matching. + + Implementations MUST apply Hostname matching appropriately for each of + the following protocols: + + * TLS: The Listener Hostname MUST match the SNI. + * HTTP: The Listener Hostname MUST match the Host header of the request. + * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP + protocol layers as described above. If an implementation does not + ensure that both the SNI and Host header match the Listener hostname, + it MUST clearly document that. + + For HTTPRoute and TLSRoute resources, there is an interaction with the + `spec.hostnames` array. When both listener and route specify hostnames, + there MUST be an intersection between the values for a Route to be + accepted. For more information, refer to the Route specific Hostnames + documentation. + + Hostnames that are prefixed with a wildcard label (`*.`) are interpreted + as a suffix match. That means that a match for `*.example.com` would match + both `test.example.com`, and `foo.test.example.com`, but not `example.com`. + maxLength: 253 + minLength: 1 + pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + name: + description: |- + Name is the name of the Listener. This name MUST be unique within a + ListenerSet. + + Name is not required to be unique across a Gateway and ListenerSets. + Routes can attach to a Listener by having a ListenerSet as a parentRef + and setting the SectionName + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + port: + description: |- + Port is the network port. Multiple listeners may use the + same port, subject to the Listener compatibility rules. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + protocol: + description: Protocol specifies the network protocol this listener + expects to receive. + maxLength: 255 + minLength: 1 + pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$ + type: string + tls: + description: |- + TLS is the TLS configuration for the Listener. This field is required if + the Protocol field is "HTTPS" or "TLS". It is invalid to set this field + if the Protocol field is "HTTP", "TCP", or "UDP". + + The association of SNIs to Certificate defined in GatewayTLSConfig is + defined based on the Hostname field for this listener. + + The GatewayClass MUST use the longest matching SNI out of all + available certificates for any TLS handshake. + properties: + certificateRefs: + description: |- + CertificateRefs contains a series of references to Kubernetes objects that + contains TLS certificates and private keys. These certificates are used to + establish a TLS handshake for requests that match the hostname of the + associated listener. + + A single CertificateRef to a Kubernetes Secret has "Core" support. + Implementations MAY choose to support attaching multiple certificates to + a Listener, but this behavior is implementation-specific. + + References to a resource in different namespace are invalid UNLESS there + is a ReferenceGrant in the target namespace that allows the certificate + to be attached. If a ReferenceGrant does not allow this reference, the + "ResolvedRefs" condition MUST be set to False for this listener with the + "RefNotPermitted" reason. + + This field is required to have at least one element when the mode is set + to "Terminate" (default) and is optional otherwise. + + CertificateRefs can reference to standard Kubernetes resources, i.e. + Secret, or implementation-specific custom resources. + + Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls + + Support: Implementation-specific (More than one reference or other resource types) + items: + description: |- + SecretObjectReference identifies an API object including its namespace, + defaulting to Secret. + + The API object must be valid in the cluster; the Group and Kind must + be registered in the cluster for this reference to be valid. + + References to objects with invalid Group and Kind are not valid, and must + be rejected by the implementation, with appropriate Conditions set + on the containing object. + properties: + group: + default: "" + description: |- + Group is the group of the referent. For example, "gateway.networking.k8s.io". + When unspecified or empty string, core API group is inferred. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Secret + description: Kind is kind of the referent. For example + "Secret". + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referenced object. When unspecified, the local + namespace is inferred. + + Note that when a namespace different than the local namespace is specified, + a ReferenceGrant object is required in the referent namespace to allow that + namespace's owner to accept the reference. See the ReferenceGrant + documentation for details. + + Support: Core + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object + maxItems: 64 + type: array + frontendValidation: + description: |- + FrontendValidation holds configuration information for validating the frontend (client). + Setting this field will require clients to send a client certificate + required for validation during the TLS handshake. In browsers this may result in a dialog appearing + that requests a user to specify the client certificate. + The maximum depth of a certificate chain accepted in verification is Implementation specific. + + Support: Extended + properties: + caCertificateRefs: + description: |- + CACertificateRefs contains one or more references to + Kubernetes objects that contain TLS certificates of + the Certificate Authorities that can be used + as a trust anchor to validate the certificates presented by the client. + + A single CA certificate reference to a Kubernetes ConfigMap + has "Core" support. + Implementations MAY choose to support attaching multiple CA certificates to + a Listener, but this behavior is implementation-specific. + + Support: Core - A single reference to a Kubernetes ConfigMap + with the CA certificate in a key named `ca.crt`. + + Support: Implementation-specific (More than one reference, or other kinds + of resources). + + References to a resource in a different namespace are invalid UNLESS there + is a ReferenceGrant in the target namespace that allows the certificate + to be attached. If a ReferenceGrant does not allow this reference, the + "ResolvedRefs" condition MUST be set to False for this listener with the + "RefNotPermitted" reason. + items: + description: |- + ObjectReference identifies an API object including its namespace. + + The API object must be valid in the cluster; the Group and Kind must + be registered in the cluster for this reference to be valid. + + References to objects with invalid Group and Kind are not valid, and must + be rejected by the implementation, with appropriate Conditions set + on the containing object. + properties: + group: + description: |- + Group is the group of the referent. For example, "gateway.networking.k8s.io". + When set to the empty string, core API group is inferred. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + description: Kind is kind of the referent. For + example "ConfigMap" or "Service". + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referenced object. When unspecified, the local + namespace is inferred. + + Note that when a namespace different than the local namespace is specified, + a ReferenceGrant object is required in the referent namespace to allow that + namespace's owner to accept the reference. See the ReferenceGrant + documentation for details. + + Support: Core + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - group + - kind + - name + type: object + maxItems: 8 + minItems: 1 + type: array + type: object + mode: + default: Terminate + description: |- + Mode defines the TLS behavior for the TLS session initiated by the client. + There are two possible modes: + + - Terminate: The TLS session between the downstream client and the + Gateway is terminated at the Gateway. This mode requires certificates + to be specified in some way, such as populating the certificateRefs + field. + - Passthrough: The TLS session is NOT terminated by the Gateway. This + implies that the Gateway can't decipher the TLS stream except for + the ClientHello message of the TLS protocol. The certificateRefs field + is ignored in this mode. + + Support: Core + enum: + - Terminate + - Passthrough + type: string + options: + additionalProperties: + description: |- + AnnotationValue is the value of an annotation in Gateway API. This is used + for validation of maps such as TLS options. This roughly matches Kubernetes + annotation validation, although the length validation in that case is based + on the entire size of the annotations struct. + maxLength: 4096 + minLength: 0 + type: string + description: |- + Options are a list of key/value pairs to enable extended TLS + configuration for each implementation. For example, configuring the + minimum TLS version or supported cipher suites. + + A set of common keys MAY be defined by the API in the future. To avoid + any ambiguity, implementation-specific definitions MUST use + domain-prefixed names, such as `example.com/my-custom-option`. + Un-prefixed names are reserved for key names defined by Gateway API. + + Support: Implementation-specific + maxProperties: 16 + type: object + type: object + x-kubernetes-validations: + - message: certificateRefs or options must be specified when + mode is Terminate + rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs) + > 0 || size(self.options) > 0 : true' + required: + - name + - port + - protocol + type: object + maxItems: 64 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + x-kubernetes-validations: + - message: tls must not be specified for protocols ['HTTP', 'TCP', + 'UDP'] + rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ? + !has(l.tls) : true)' + - message: tls mode must be Terminate for protocol HTTPS + rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode + == '''' || l.tls.mode == ''Terminate'') : true)' + - message: hostname must not be specified for protocols ['TCP', 'UDP'] + rule: 'self.all(l, l.protocol in [''TCP'', ''UDP''] ? (!has(l.hostname) + || l.hostname == '''') : true)' + - message: Listener name must be unique within the Gateway + rule: self.all(l1, self.exists_one(l2, l1.name == l2.name)) + - message: Combination of port, protocol and hostname must be unique + for each listener + rule: 'self.all(l1, !has(l1.port) || self.exists_one(l2, has(l2.port) + && l1.port == l2.port && l1.protocol == l2.protocol && (has(l1.hostname) + && has(l2.hostname) ? l1.hostname == l2.hostname : !has(l1.hostname) + && !has(l2.hostname))))' + parentRef: + description: ParentRef references the Gateway that the listeners are + attached to. + properties: + group: + default: gateway.networking.k8s.io + description: Group is the group of the referent. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + default: Gateway + description: Kind is kind of the referent. For example "Gateway". + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + name: + description: Name is the name of the referent. + maxLength: 253 + minLength: 1 + type: string + namespace: + description: |- + Namespace is the namespace of the referent. If not present, + the namespace of the referent is assumed to be the same as + the namespace of the referring object. + maxLength: 63 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object + required: + - listeners + - parentRef + type: object + status: + default: + conditions: + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Accepted + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Programmed + description: Status defines the current state of ListenerSet. + properties: + conditions: + default: + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Accepted + - lastTransitionTime: "1970-01-01T00:00:00Z" + message: Waiting for controller + reason: Pending + status: Unknown + type: Programmed + description: |- + Conditions describe the current conditions of the ListenerSet. + + Implementations MUST express ListenerSet conditions using the + `ListenerSetConditionType` and `ListenerSetConditionReason` + constants so that operators and tools can converge on a common + vocabulary to describe ListenerSet state. + + Known condition types are: + + * "Accepted" + * "Programmed" + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + listeners: + description: Listeners provide status for each unique listener port + defined in the Spec. + items: + description: ListenerStatus is the status associated with a Listener. + properties: + attachedRoutes: + description: |- + AttachedRoutes represents the total number of Routes that have been + successfully attached to this Listener. + + Successful attachment of a Route to a Listener is based solely on the + combination of the AllowedRoutes field on the corresponding Listener + and the Route's ParentRefs field. A Route is successfully attached to + a Listener when it is selected by the Listener's AllowedRoutes field + AND the Route has a valid ParentRef selecting the whole Gateway + resource or a specific Listener as a parent resource (more detail on + attachment semantics can be found in the documentation on the various + Route kinds ParentRefs fields). Listener or Route status does not impact + successful attachment, i.e. the AttachedRoutes field count MUST be set + for Listeners with condition Accepted: false and MUST count successfully + attached Routes that may themselves have Accepted: false conditions. + + Uses for this field include troubleshooting Route attachment and + measuring blast radius/impact of changes to a Listener. + format: int32 + type: integer + conditions: + description: Conditions describe the current condition of this + listener. + items: + description: Condition contains details for one aspect of + the current state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, + Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + maxItems: 8 + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + name: + description: Name is the name of the Listener that this status + corresponds to. + maxLength: 253 + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + port: + description: Port is the network port the listener is configured + to listen on. + format: int32 + maximum: 65535 + minimum: 1 + type: integer + supportedKinds: + description: |- + SupportedKinds is the list indicating the Kinds supported by this + listener. This MUST represent the kinds an implementation supports for + that Listener configuration. + + If kinds are specified in Spec that are not supported, they MUST NOT + appear in this list and an implementation MUST set the "ResolvedRefs" + condition to "False" with the "InvalidRouteKinds" reason. If both valid + and invalid Route kinds are specified, the implementation MUST + reference the valid Route kinds that have been specified. + items: + description: RouteGroupKind indicates the group and kind of + a Route resource. + properties: + group: + default: gateway.networking.k8s.io + description: Group is the group of the Route. + maxLength: 253 + pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ + type: string + kind: + description: Kind is the kind of the Route. + maxLength: 63 + minLength: 1 + pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ + type: string + required: + - kind + type: object + maxItems: 8 + type: array + required: + - attachedRoutes + - conditions + - name + - port + - supportedKinds + type: object + maxItems: 64 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/integration/k8s_conformance_test.go b/integration/k8s_conformance_test.go index 1684c951a..1e03f223b 100644 --- a/integration/k8s_conformance_test.go +++ b/integration/k8s_conformance_test.go @@ -89,7 +89,7 @@ func (s *K8sConformanceSuite) SetupSuite() { s.k3sContainer, err = k3s.Run(ctx, k3sImage, - k3s.WithManifest("./fixtures/k8s-conformance/00-experimental-v1.2.1.yml"), + k3s.WithManifest("./fixtures/k8s-conformance/00-experimental-v1.3.0.yml"), k3s.WithManifest("./fixtures/k8s-conformance/01-rbac.yml"), k3s.WithManifest("./fixtures/k8s-conformance/02-traefik.yml"), network.WithNetwork(nil, s.network), From fd5796ac391d6e5177dc5ba31918b3d88e7b9d3c Mon Sep 17 00:00:00 2001 From: Daniel Peinhopf <84123899+sevensolutions@users.noreply.github.com> Date: Tue, 3 Jun 2025 10:02:04 +0200 Subject: [PATCH 015/172] Improve visualization for StatusRewrites option of errors middleware --- webui/src/components/resources/RenderUnknownProp.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webui/src/components/resources/RenderUnknownProp.tsx b/webui/src/components/resources/RenderUnknownProp.tsx index 580c89f2c..e4f0d118e 100644 --- a/webui/src/components/resources/RenderUnknownProp.tsx +++ b/webui/src/components/resources/RenderUnknownProp.tsx @@ -60,6 +60,12 @@ export const RenderUnknownProp = ({ name, prop, removeTitlePrefix }: RenderUnkno switch (childName) { case 'ipStrategy': return wrap(, title, title) + case 'statusRewrites': + return wrap( + `${x[0]} → ${x[1]}`)} />, + title, + title, + ) default: return } From f7a6f32784bca83d424264c390ec5592d63bc860 Mon Sep 17 00:00:00 2001 From: Jesper Noordsij <45041769+jnoordsij@users.noreply.github.com> Date: Tue, 3 Jun 2025 11:24:05 +0200 Subject: [PATCH 016/172] Update Dockerfiles to Alpine 3.22 --- Dockerfile | 2 +- docs/check.Dockerfile | 4 +--- docs/docs.Dockerfile | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index fcf9c49b9..0e08e72da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1.2 -FROM alpine:3.21 +FROM alpine:3.22 RUN apk add --no-cache --no-progress ca-certificates tzdata diff --git a/docs/check.Dockerfile b/docs/check.Dockerfile index 41a389f69..2a03cf8af 100644 --- a/docs/check.Dockerfile +++ b/docs/check.Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.22 RUN apk --no-cache --no-progress add \ build-base \ @@ -9,9 +9,7 @@ RUN apk --no-cache --no-progress add \ ruby \ ruby-bigdecimal \ ruby-dev \ - ruby-etc \ ruby-ffi \ - ruby-json \ zlib-dev RUN gem install nokogiri --version 1.18.6 --no-document -- --use-system-libraries diff --git a/docs/docs.Dockerfile b/docs/docs.Dockerfile index e15440a36..99e963cf4 100644 --- a/docs/docs.Dockerfile +++ b/docs/docs.Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.22 ENV PATH="${PATH}:/venv/bin" From bf72b9768c5e75f7753f88653e326789e0421387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Farkas?= Date: Tue, 3 Jun 2025 11:44:05 +0200 Subject: [PATCH 017/172] Introduce X25519MLKEM768 for Post-Quantum-Secure TLS --- pkg/tls/certificate.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/tls/certificate.go b/pkg/tls/certificate.go index e1e11191c..ea7f895ae 100644 --- a/pkg/tls/certificate.go +++ b/pkg/tls/certificate.go @@ -35,14 +35,16 @@ var ( // Available CurveIDs defined at https://godoc.org/crypto/tls#CurveID, // also allowing rfc names defined at https://tools.ietf.org/html/rfc8446#section-4.2.7 CurveIDs = map[string]tls.CurveID{ - `secp256r1`: tls.CurveP256, - `CurveP256`: tls.CurveP256, - `secp384r1`: tls.CurveP384, - `CurveP384`: tls.CurveP384, - `secp521r1`: tls.CurveP521, - `CurveP521`: tls.CurveP521, - `x25519`: tls.X25519, - `X25519`: tls.X25519, + `secp256r1`: tls.CurveP256, + `CurveP256`: tls.CurveP256, + `secp384r1`: tls.CurveP384, + `CurveP384`: tls.CurveP384, + `secp521r1`: tls.CurveP521, + `CurveP521`: tls.CurveP521, + `x25519`: tls.X25519, + `X25519`: tls.X25519, + `x25519mlkem768`: tls.X25519MLKEM768, + `X25519MLKEM768`: tls.X25519MLKEM768, } ) From bfcef58a4f701166146aa37a1132707486c3b69f Mon Sep 17 00:00:00 2001 From: Romain Date: Tue, 3 Jun 2025 16:56:04 +0200 Subject: [PATCH 018/172] Fix KV reference rendering --- docs/content/reference/dynamic-configuration/kv-ref.md | 3 +++ docs/content/reference/dynamic-configuration/kv.md | 2 -- internal/gendoc.go | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/content/reference/dynamic-configuration/kv-ref.md b/docs/content/reference/dynamic-configuration/kv-ref.md index b39dc96ab..0b2f7c5f0 100644 --- a/docs/content/reference/dynamic-configuration/kv-ref.md +++ b/docs/content/reference/dynamic-configuration/kv-ref.md @@ -2,6 +2,9 @@ CODE GENERATED AUTOMATICALLY THIS FILE MUST NOT BE EDITED BY HAND --> + +| Key (Path) | Value | +|------------|-------| | `traefik/http/middlewares/Middleware01/addPrefix/prefix` | `foobar` | | `traefik/http/middlewares/Middleware02/basicAuth/headerField` | `foobar` | | `traefik/http/middlewares/Middleware02/basicAuth/realm` | `foobar` | diff --git a/docs/content/reference/dynamic-configuration/kv.md b/docs/content/reference/dynamic-configuration/kv.md index 8db8415e5..71fe4ab06 100644 --- a/docs/content/reference/dynamic-configuration/kv.md +++ b/docs/content/reference/dynamic-configuration/kv.md @@ -8,6 +8,4 @@ description: "Read the technical documentation to learn the Traefik Dynamic Conf Dynamic configuration with KV stores. {: .subtitle } -| Key (Path) | Value | -|----------------------------------------------------------------------------------------------|-------------| --8<-- "content/reference/dynamic-configuration/kv-ref.md" diff --git a/internal/gendoc.go b/internal/gendoc.go index 76f650582..e2362faf5 100644 --- a/internal/gendoc.go +++ b/internal/gendoc.go @@ -349,6 +349,11 @@ func genKVDynConfDoc(outputFile string) { CODE GENERATED AUTOMATICALLY THIS FILE MUST NOT BE EDITED BY HAND --> +`) + + _, _ = fmt.Fprintf(file, ` +| Key (Path) | Value | +|------------|-------| `) for _, k := range keys { From aac8bc69ad090e26ac1376d504712a828eaeb7bc Mon Sep 17 00:00:00 2001 From: Alexy Van Den Abele <103523876+Alexy-vda@users.noreply.github.com> Date: Wed, 4 Jun 2025 11:18:04 +0200 Subject: [PATCH 019/172] Clarify mirroring service default percent value --- .../routing-configuration/http/load-balancing/service.md | 6 ++++++ docs/content/routing/services/index.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/docs/content/reference/routing-configuration/http/load-balancing/service.md b/docs/content/reference/routing-configuration/http/load-balancing/service.md index eaa665417..58a818ac8 100644 --- a/docs/content/reference/routing-configuration/http/load-balancing/service.md +++ b/docs/content/reference/routing-configuration/http/load-balancing/service.md @@ -265,6 +265,10 @@ http: The mirroring is able to mirror requests sent to a service to other services. Please note that by default the whole request is buffered in memory while it is being mirrored. See the `maxBodySize` option in the example below for how to modify this behaviour. You can also omit the request body by setting the `mirrorBody` option to false. +!!! warning "Default behavior of `percent`" + + When configuring a `mirror` service, if the `percent` field is not set, it defaults to `0`, meaning **no traffic will be sent to the mirror**. + !!! info "Supported Providers" This strategy can be defined currently with the [File](../../../install-configuration/providers/others/file.md) or [IngressRoute](../../../install-configuration/providers/kubernetes/kubernetes-ingress.md) providers. @@ -285,6 +289,8 @@ http: maxBodySize: 1024 mirrors: - name: appv2 + # Percent defines the percentage of requests that should be mirrored. + # Default value is 0, which means no traffic will be sent to the mirror. percent: 10 appv1: diff --git a/docs/content/routing/services/index.md b/docs/content/routing/services/index.md index 199fb81a3..9c7f76775 100644 --- a/docs/content/routing/services/index.md +++ b/docs/content/routing/services/index.md @@ -1259,6 +1259,10 @@ Please note that by default the whole request is buffered in memory while it is See the maxBodySize option in the example below for how to modify this behaviour. You can also omit the request body by setting the mirrorBody option to `false`. +!!! warning "Default behavior of `percent`" + + When configuring a `mirror` service, if the `percent` field is not set, it defaults to `0`, meaning **no traffic will be sent to the mirror**. + !!! info "Supported Providers" This strategy can be defined currently with the [File](../../providers/file.md) or [IngressRoute](../../providers/kubernetes-crd.md) providers. @@ -1279,6 +1283,8 @@ http: maxBodySize: 1024 mirrors: - name: appv2 + # Percent defines the percentage of requests that should be mirrored. + # Default value is 0, which means no traffic will be sent to the mirror. percent: 10 appv1: From ae79d4e5f00fcd639ba11715f02963828217cf40 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Wed, 4 Jun 2025 12:08:04 +0200 Subject: [PATCH 020/172] Do not log redis sentinel username and password --- pkg/provider/kv/redis/redis.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/provider/kv/redis/redis.go b/pkg/provider/kv/redis/redis.go index 3005c8f2d..afb4531f6 100644 --- a/pkg/provider/kv/redis/redis.go +++ b/pkg/provider/kv/redis/redis.go @@ -21,14 +21,14 @@ type Provider struct { Username string `description:"Username for authentication." json:"username,omitempty" toml:"username,omitempty" yaml:"username,omitempty" loggable:"false"` Password string `description:"Password for authentication." json:"password,omitempty" toml:"password,omitempty" yaml:"password,omitempty" loggable:"false"` DB int `description:"Database to be selected after connecting to the server." json:"db,omitempty" toml:"db,omitempty" yaml:"db,omitempty"` - Sentinel *Sentinel `description:"Enable Sentinel support." json:"sentinel,omitempty" toml:"sentinel,omitempty" yaml:"sentinel,omitempty"` + Sentinel *Sentinel `description:"Enable Sentinel support." json:"sentinel,omitempty" toml:"sentinel,omitempty" yaml:"sentinel,omitempty" export:"true"` } // Sentinel holds the Redis Sentinel configuration. type Sentinel struct { MasterName string `description:"Name of the master." json:"masterName,omitempty" toml:"masterName,omitempty" yaml:"masterName,omitempty" export:"true"` - Username string `description:"Username for Sentinel authentication." json:"username,omitempty" toml:"username,omitempty" yaml:"username,omitempty" export:"true"` - Password string `description:"Password for Sentinel authentication." json:"password,omitempty" toml:"password,omitempty" yaml:"password,omitempty" export:"true"` + Username string `description:"Username for Sentinel authentication." json:"username,omitempty" toml:"username,omitempty" yaml:"username,omitempty" loggable:"false"` + Password string `description:"Password for Sentinel authentication." json:"password,omitempty" toml:"password,omitempty" yaml:"password,omitempty" loggable:"false"` LatencyStrategy bool `description:"Defines whether to route commands to the closest master or replica nodes (mutually exclusive with RandomStrategy and ReplicaStrategy)." json:"latencyStrategy,omitempty" toml:"latencyStrategy,omitempty" yaml:"latencyStrategy,omitempty" export:"true"` RandomStrategy bool `description:"Defines whether to route commands randomly to master or replica nodes (mutually exclusive with LatencyStrategy and ReplicaStrategy)." json:"randomStrategy,omitempty" toml:"randomStrategy,omitempty" yaml:"randomStrategy,omitempty" export:"true"` From 2949995abc523a6edff6f4b695dbf5b91ef5a05e Mon Sep 17 00:00:00 2001 From: Ben <52796471+bengentree@users.noreply.github.com> Date: Wed, 4 Jun 2025 07:38:04 -0600 Subject: [PATCH 021/172] Handle context canceled in ForwardAuth middleware --- pkg/middlewares/auth/forward.go | 8 +++- pkg/middlewares/auth/forward_test.go | 71 ++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/pkg/middlewares/auth/forward.go b/pkg/middlewares/auth/forward.go index 0ade40b7d..8520e2357 100644 --- a/pkg/middlewares/auth/forward.go +++ b/pkg/middlewares/auth/forward.go @@ -17,6 +17,7 @@ import ( "github.com/traefik/traefik/v3/pkg/middlewares" "github.com/traefik/traefik/v3/pkg/middlewares/accesslog" "github.com/traefik/traefik/v3/pkg/middlewares/observability" + "github.com/traefik/traefik/v3/pkg/proxy/httputil" "github.com/traefik/traefik/v3/pkg/tracing" "github.com/traefik/traefik/v3/pkg/types" "github.com/vulcand/oxy/v2/forward" @@ -195,7 +196,12 @@ func (fa *forwardAuth) ServeHTTP(rw http.ResponseWriter, req *http.Request) { logger.Debug().Err(forwardErr).Msgf("Error calling %s", fa.address) observability.SetStatusErrorf(req.Context(), "Error calling %s. Cause: %s", fa.address, forwardErr) - rw.WriteHeader(http.StatusInternalServerError) + statusCode := http.StatusInternalServerError + if errors.Is(forwardErr, context.Canceled) { + statusCode = httputil.StatusClientClosedRequest + } + + rw.WriteHeader(statusCode) return } defer forwardResponse.Body.Close() diff --git a/pkg/middlewares/auth/forward_test.go b/pkg/middlewares/auth/forward_test.go index aa4503381..2bd062370 100644 --- a/pkg/middlewares/auth/forward_test.go +++ b/pkg/middlewares/auth/forward_test.go @@ -11,10 +11,12 @@ import ( "net/url" "strconv" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/traefik/traefik/v3/pkg/config/dynamic" + "github.com/traefik/traefik/v3/pkg/proxy/httputil" "github.com/traefik/traefik/v3/pkg/testhelpers" "github.com/traefik/traefik/v3/pkg/tracing" "github.com/vulcand/oxy/v2/forward" @@ -408,6 +410,75 @@ func TestForwardAuthFailResponseHeaders(t *testing.T) { assert.Equal(t, "Forbidden\n", string(body)) } +func TestForwardAuthClientClosedRequest(t *testing.T) { + requestStarted := make(chan struct{}) + requestCancelled := make(chan struct{}) + responseComplete := make(chan struct{}) + + authTs := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + close(requestStarted) + <-requestCancelled + })) + t.Cleanup(authTs.Close) + + next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // next should not be called. + t.Fail() + }) + + auth := dynamic.ForwardAuth{ + Address: authTs.URL, + } + authMiddleware, err := NewForward(t.Context(), next, auth, "authTest") + require.NoError(t, err) + + ctx, cancel := context.WithCancel(t.Context()) + req := httptest.NewRequestWithContext(ctx, "GET", "http://foo", http.NoBody) + + recorder := httptest.NewRecorder() + go func() { + authMiddleware.ServeHTTP(recorder, req) + close(responseComplete) + }() + + <-requestStarted + + cancel() + close(requestCancelled) + + <-responseComplete + + assert.Equal(t, httputil.StatusClientClosedRequest, recorder.Result().StatusCode) +} + +func TestForwardAuthForwardError(t *testing.T) { + next := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // next should not be called. + t.Fail() + }) + + auth := dynamic.ForwardAuth{ + Address: "http://non-existing-server", + } + authMiddleware, err := NewForward(t.Context(), next, auth, "authTest") + require.NoError(t, err) + + ctx, cancel := context.WithTimeout(t.Context(), 1*time.Microsecond) + defer cancel() + req := httptest.NewRequestWithContext(ctx, http.MethodGet, "http://foo", nil) + + recorder := httptest.NewRecorder() + responseComplete := make(chan struct{}) + go func() { + authMiddleware.ServeHTTP(recorder, req) + close(responseComplete) + }() + + <-responseComplete + + assert.Equal(t, http.StatusInternalServerError, recorder.Result().StatusCode) +} + func Test_writeHeader(t *testing.T) { testCases := []struct { name string From 917771739e708e53eadd4cfc9c34862884c1e838 Mon Sep 17 00:00:00 2001 From: Etienne Dysli Metref Date: Wed, 4 Jun 2025 16:22:04 +0200 Subject: [PATCH 022/172] Add a note about Ingress Backend Resource support --- .../providers/kubernetes/kubernetes-ingress.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md index adf102e64..d3b582d29 100644 --- a/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md +++ b/docs/content/reference/install-configuration/providers/kubernetes/kubernetes-ingress.md @@ -8,6 +8,11 @@ description: "Understand the requirements, routing configuration, and how to set The Traefik Kubernetes Ingress provider is a Kubernetes Ingress controller; i.e, it manages access to cluster services by supporting the [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) specification. +??? warning "Ingress Backend Resource not supported" + + Referencing backend service endpoints using [`spec.rules.http.paths.backend.resource`](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/#IngressBackend) is not supported. + Use `spec.rules.http.paths.backend.service` instead. + ## Configuration Example You can enable the `kubernetesIngress` provider as detailed below: From b39ee8ede5b64e7e1c6e78c276b79d3dd13e7a34 Mon Sep 17 00:00:00 2001 From: Alessandro Chitolina Date: Fri, 6 Jun 2025 17:44:04 +0200 Subject: [PATCH 023/172] OCSP stapling --- cmd/traefik/traefik.go | 4 +- docs/content/https/ocsp.md | 71 +++ .../install-configuration/tls/ocsp.md | 71 +++ .../reference/static-configuration/cli-ref.md | 6 + .../reference/static-configuration/env-ref.md | 6 + .../reference/static-configuration/file.toml | 5 + .../reference/static-configuration/file.yaml | 4 + docs/mkdocs.yml | 2 + go.mod | 2 +- integration/fixtures/ocsp/ca.crt | 11 + integration/fixtures/ocsp/ca.key | 5 + integration/fixtures/ocsp/default.crt | 11 + integration/fixtures/ocsp/default.key | 5 + integration/fixtures/ocsp/gencert.go | 100 ++++ integration/fixtures/ocsp/server.crt | 11 + integration/fixtures/ocsp/server.key | 5 + integration/fixtures/ocsp/simple.toml | 27 + integration/simple_test.go | 129 +++++ pkg/config/static/static_config.go | 11 + pkg/server/router/router_test.go | 8 +- pkg/server/router/tcp/manager_test.go | 4 +- pkg/server/router/tcp/router_test.go | 2 +- pkg/server/routerfactory_test.go | 6 +- pkg/tls/certificate.go | 81 --- pkg/tls/certificate_store.go | 186 +++++-- pkg/tls/certificate_store_test.go | 4 +- pkg/tls/ocsp.go | 206 ++++++++ pkg/tls/ocsp_test.go | 485 ++++++++++++++++++ pkg/tls/tlsmanager.go | 164 ++++-- pkg/tls/tlsmanager_test.go | 122 ++++- 30 files changed, 1576 insertions(+), 178 deletions(-) create mode 100644 docs/content/https/ocsp.md create mode 100644 docs/content/reference/install-configuration/tls/ocsp.md create mode 100644 integration/fixtures/ocsp/ca.crt create mode 100644 integration/fixtures/ocsp/ca.key create mode 100644 integration/fixtures/ocsp/default.crt create mode 100644 integration/fixtures/ocsp/default.key create mode 100644 integration/fixtures/ocsp/gencert.go create mode 100644 integration/fixtures/ocsp/server.crt create mode 100644 integration/fixtures/ocsp/server.key create mode 100644 integration/fixtures/ocsp/simple.toml create mode 100644 pkg/tls/ocsp.go create mode 100644 pkg/tls/ocsp_test.go diff --git a/cmd/traefik/traefik.go b/cmd/traefik/traefik.go index 77930754b..93e319f6a 100644 --- a/cmd/traefik/traefik.go +++ b/cmd/traefik/traefik.go @@ -182,7 +182,9 @@ func setupServer(staticConfiguration *static.Configuration) (*server.Server, err // ACME - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(staticConfiguration.OCSP) + routinesPool.GoCtx(tlsManager.Run) + httpChallengeProvider := acme.NewChallengeHTTP() tlsChallengeProvider := acme.NewChallengeTLSALPN() diff --git a/docs/content/https/ocsp.md b/docs/content/https/ocsp.md new file mode 100644 index 000000000..a960d88d0 --- /dev/null +++ b/docs/content/https/ocsp.md @@ -0,0 +1,71 @@ +--- +title: "Traefik OCSP Documentation" +description: "Learn how to configure Traefik to use OCSP. Read the technical documentation." +--- + +# OCSP + +Check certificate status and perform OCSP stapling. +{: .subtitle } + +## Overview + +### OCSP Stapling + +When OCSP is enabled, Traefik checks the status of every certificate in the store that provides an OCSP responder URL, +including the default certificate, and staples the OCSP response to the TLS handshake. +The OCSP check is performed when the certificate is loaded, +and once every hour until it is successful at the halfway point before the update date. + +### Caching + +Traefik caches the OCSP response as long as the associated certificate is provided by the configuration. +When a certificate is no longer provided, +the OCSP response has a 24 hour TTL waiting to be provided again or eventually removed. +The OCSP response is cached in memory and is not persisted between Traefik restarts. + +## Configuration + +### General + +Enabling OCSP is part of the [static configuration](../getting-started/configuration-overview.md#the-static-configuration). +It can be defined by using a file (YAML or TOML) or CLI arguments: + +```yaml tab="File (YAML)" +## Static configuration +ocsp: {} +``` + +```toml tab="File (TOML)" +## Static configuration +[ocsp] +``` + +```bash tab="CLI" +## Static configuration +--ocsp=true +``` + +### Responder Overrides + +The `responderOverrides` option defines the OCSP responder URLs to use instead of the one provided by the certificate. +This is useful when you want to use a different OCSP responder. + +```yaml tab="File (YAML)" +## Static configuration +ocsp: + responderOverrides: + foo: bar +``` + +```toml tab="File (TOML)" +## Static configuration +[ocsp] + [ocsp.responderOverrides] + foo = "bar" +``` + +```bash tab="CLI" +## Static configuration +-ocsp.responderoverrides.foo=bar +``` diff --git a/docs/content/reference/install-configuration/tls/ocsp.md b/docs/content/reference/install-configuration/tls/ocsp.md new file mode 100644 index 000000000..a960d88d0 --- /dev/null +++ b/docs/content/reference/install-configuration/tls/ocsp.md @@ -0,0 +1,71 @@ +--- +title: "Traefik OCSP Documentation" +description: "Learn how to configure Traefik to use OCSP. Read the technical documentation." +--- + +# OCSP + +Check certificate status and perform OCSP stapling. +{: .subtitle } + +## Overview + +### OCSP Stapling + +When OCSP is enabled, Traefik checks the status of every certificate in the store that provides an OCSP responder URL, +including the default certificate, and staples the OCSP response to the TLS handshake. +The OCSP check is performed when the certificate is loaded, +and once every hour until it is successful at the halfway point before the update date. + +### Caching + +Traefik caches the OCSP response as long as the associated certificate is provided by the configuration. +When a certificate is no longer provided, +the OCSP response has a 24 hour TTL waiting to be provided again or eventually removed. +The OCSP response is cached in memory and is not persisted between Traefik restarts. + +## Configuration + +### General + +Enabling OCSP is part of the [static configuration](../getting-started/configuration-overview.md#the-static-configuration). +It can be defined by using a file (YAML or TOML) or CLI arguments: + +```yaml tab="File (YAML)" +## Static configuration +ocsp: {} +``` + +```toml tab="File (TOML)" +## Static configuration +[ocsp] +``` + +```bash tab="CLI" +## Static configuration +--ocsp=true +``` + +### Responder Overrides + +The `responderOverrides` option defines the OCSP responder URLs to use instead of the one provided by the certificate. +This is useful when you want to use a different OCSP responder. + +```yaml tab="File (YAML)" +## Static configuration +ocsp: + responderOverrides: + foo: bar +``` + +```toml tab="File (TOML)" +## Static configuration +[ocsp] + [ocsp.responderOverrides] + foo = "bar" +``` + +```bash tab="CLI" +## Static configuration +-ocsp.responderoverrides.foo=bar +``` diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index cd98f99af..e0b1b0c73 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -642,6 +642,12 @@ Prefix to use for metrics collection. (Default: ```traefik```) `--metrics.statsd.pushinterval`: StatsD push interval. (Default: ```10```) +`--ocsp`: +OCSP configuration. (Default: ```false```) + +`--ocsp.responderoverrides.`: +Defines a map of OCSP responders to replace for querying OCSP servers. + `--ping`: Enable ping. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index 4eac71881..ca423ab23 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -642,6 +642,12 @@ Prefix to use for metrics collection. (Default: ```traefik```) `TRAEFIK_METRICS_STATSD_PUSHINTERVAL`: StatsD push interval. (Default: ```10```) +`TRAEFIK_OCSP`: +OCSP configuration. (Default: ```false```) + +`TRAEFIK_OCSP_RESPONDEROVERRIDES_`: +Defines a map of OCSP responders to replace for querying OCSP servers. + `TRAEFIK_PING`: Enable ping. (Default: ```false```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index 4e9e45ebe..4839306e8 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -609,3 +609,8 @@ [spiffe] workloadAPIAddr = "foobar" + +[ocsp] + [ocsp.responderOverrides] + name0 = "foobar" + name1 = "foobar" diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index 77310bd39..4f302ead3 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -675,3 +675,7 @@ core: defaultRuleSyntax: foobar spiffe: workloadAPIAddr: foobar +ocsp: + responderOverrides: + name0: foobar + name1: foobar diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index d8d50cd10..587b0a3c0 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -110,6 +110,7 @@ nav: - 'Let''s Encrypt': 'https/acme.md' - 'Tailscale': 'https/tailscale.md' - 'SPIFFE': 'https/spiffe.md' + - 'OCSP': 'https/ocsp.md' - 'Middlewares': - 'Overview': 'middlewares/overview.md' - 'HTTP': @@ -227,6 +228,7 @@ nav: - "ACME" : 'reference/install-configuration/tls/certificate-resolvers/acme.md' - "Tailscale" : 'reference/install-configuration/tls/certificate-resolvers/tailscale.md' - "SPIFFE" : 'reference/install-configuration/tls/spiffe.md' + - "OCSP" : 'reference/install-configuration/tls/ocsp.md' - 'Observability': - 'Metrics' : 'reference/install-configuration/observability/metrics.md' - 'Tracing': 'reference/install-configuration/observability/tracing.md' diff --git a/go.mod b/go.mod index 8f2e12868..e810e3120 100644 --- a/go.mod +++ b/go.mod @@ -95,6 +95,7 @@ require ( go.opentelemetry.io/otel/sdk/log v0.8.0 go.opentelemetry.io/otel/sdk/metric v1.34.0 go.opentelemetry.io/otel/trace v1.34.0 + golang.org/x/crypto v0.37.0 golang.org/x/mod v0.23.0 golang.org/x/net v0.39.0 golang.org/x/sync v0.13.0 @@ -366,7 +367,6 @@ require ( go.uber.org/ratelimit v0.3.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.37.0 // indirect golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect golang.org/x/oauth2 v0.28.0 // indirect golang.org/x/term v0.31.0 // indirect diff --git a/integration/fixtures/ocsp/ca.crt b/integration/fixtures/ocsp/ca.crt new file mode 100644 index 000000000..bc620de75 --- /dev/null +++ b/integration/fixtures/ocsp/ca.crt @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBhjCCASygAwIBAgIBATAKBggqhkjOPQQDAjASMRAwDgYDVQQDEwdUZXN0IENB +MB4XDTI1MDQyNDEzNTIzOFoXDTM1MDQyMjEzNTIzOFowEjEQMA4GA1UEAxMHVGVz +dCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPp8MoNUBbUxp3jW6FcDH+lg +Zft1SIpnGjkMVjLSbW9EzmRQ/oMRHQqJvE7wJbwDs/JUTigRtfZL0vOojnhHcPej +czBxMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEBMB0GA1UdDgQW +BBQXRlWLK295lmDy+931a4Ha8XVNNjAsBggrBgEFBQcBAQQgMB4wHAYIKwYBBQUH +MAGGEG9jc3AuZXhhbXBsZS5jb20wCgYIKoZIzj0EAwIDSAAwRQIgYH6lnce9jxcp +YIVhY4z55rnOKXqaI/5rUQKwjJ3dRsUCIQDThtkFgOPT/67xOYCTCEVSMSTwh2Gq +jbeucU+4c/InVg== +-----END CERTIFICATE----- diff --git a/integration/fixtures/ocsp/ca.key b/integration/fixtures/ocsp/ca.key new file mode 100644 index 000000000..ac7b3aa04 --- /dev/null +++ b/integration/fixtures/ocsp/ca.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIGV6FPfHeA42xfjVtpnyATG6tKCCu0QoY0OlBR/0xn2toAoGCCqGSM49 +AwEHoUQDQgAE+nwyg1QFtTGneNboVwMf6WBl+3VIimcaOQxWMtJtb0TOZFD+gxEd +Com8TvAlvAOz8lROKBG19kvS86iOeEdw9w== +-----END EC PRIVATE KEY----- diff --git a/integration/fixtures/ocsp/default.crt b/integration/fixtures/ocsp/default.crt new file mode 100644 index 000000000..85a651f66 --- /dev/null +++ b/integration/fixtures/ocsp/default.crt @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBjzCCATWgAwIBAgIIGDlFgswljYAwCgYIKoZIzj0EAwIwEjEQMA4GA1UEAxMH +VGVzdCBDQTAeFw0yNTA0MjQxMzUyMzhaFw0yNjA0MjQxMzUyMzhaMBgxFjAUBgNV +BAMTDWRlZmF1bHQubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQGABZ/ +zezTMQBwmmw3aifU0OkDQ4ZzxGG7dR93svJPgYnP7TpBVtPrxy0WgVZbbCHv0Srl +PlpO9rFkKf3D4E6Qo28wbTAOBgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAf +BgNVHSMEGDAWgBQXRlWLK295lmDy+931a4Ha8XVNNjAsBggrBgEFBQcBAQQgMB4w +HAYIKwYBBQUHMAGGEG9jc3AuZXhhbXBsZS5jb20wCgYIKoZIzj0EAwIDSAAwRQIh +AJMF7RkU0BtNZlHf//PPgpPfDJybnYMIoX1Ek4I8JZ+QAiBpxjzeFE9jwqcJnx5X +KnOJMbgfvJliZZgVSuXBbulzAA== +-----END CERTIFICATE----- diff --git a/integration/fixtures/ocsp/default.key b/integration/fixtures/ocsp/default.key new file mode 100644 index 000000000..96471e10d --- /dev/null +++ b/integration/fixtures/ocsp/default.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIO4UluA82wXVkaVH0m6oFGWyC8mzVcc7H9MI0ltXgkNuoAoGCCqGSM49 +AwEHoUQDQgAEBgAWf83s0zEAcJpsN2on1NDpA0OGc8Rhu3Ufd7LyT4GJz+06QVbT +68ctFoFWW2wh79Eq5T5aTvaxZCn9w+BOkA== +-----END EC PRIVATE KEY----- diff --git a/integration/fixtures/ocsp/gencert.go b/integration/fixtures/ocsp/gencert.go new file mode 100644 index 000000000..1c1277641 --- /dev/null +++ b/integration/fixtures/ocsp/gencert.go @@ -0,0 +1,100 @@ +package main + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "math/big" + "os" + "time" +) + +func main() { + // generate CA + caKey, caCert := generateCA("Test CA") + saveKeyAndCert("integration/fixtures/ocsp/ca.key", "integration/fixtures/ocsp/ca.crt", caKey, caCert) + + // server certificate + serverKey, serverCert := generateCert("server.local", caKey, caCert) + saveKeyAndCert("integration/fixtures/ocsp/server.key", "integration/fixtures/ocsp/server.crt", serverKey, serverCert) + + // default certificate + defaultKey, defaultCert := generateCert("default.local", caKey, caCert) + saveKeyAndCert("integration/fixtures/ocsp/default.key", "integration/fixtures/ocsp/default.crt", defaultKey, defaultCert) +} + +func generateCA(commonName string) (*ecdsa.PrivateKey, *x509.Certificate) { + // generate a private key for the CA + caKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + + // create a self-signed CA certificate + caTemplate := &x509.Certificate{ + SerialNumber: big.NewInt(1), + Subject: pkix.Name{ + CommonName: commonName, + }, + NotBefore: time.Now(), + NotAfter: time.Now().Add(10 * 365 * 24 * time.Hour), // 10 ans + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign, + BasicConstraintsValid: true, + IsCA: true, + MaxPathLen: 1, + OCSPServer: []string{"ocsp.example.com"}, + } + + caCertDER, _ := x509.CreateCertificate(rand.Reader, caTemplate, caTemplate, &caKey.PublicKey, caKey) + caCert, _ := x509.ParseCertificate(caCertDER) + + return caKey, caCert +} + +func generateCert(commonName string, caKey *ecdsa.PrivateKey, caCert *x509.Certificate) (*ecdsa.PrivateKey, *x509.Certificate) { + // create a private key for the certificate + certKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + + // create a certificate signed by the CA + certTemplate := &x509.Certificate{ + SerialNumber: big.NewInt(time.Now().UnixNano()), + Subject: pkix.Name{ + CommonName: commonName, + }, + NotBefore: time.Now(), + NotAfter: time.Now().Add(1 * 365 * 24 * time.Hour), // 1 an + KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment, + BasicConstraintsValid: true, + OCSPServer: []string{"ocsp.example.com"}, + } + + certDER, _ := x509.CreateCertificate(rand.Reader, certTemplate, caCert, &certKey.PublicKey, caKey) + cert, _ := x509.ParseCertificate(certDER) + + return certKey, cert +} + +func saveKeyAndCert(keyFile, certFile string, key *ecdsa.PrivateKey, cert *x509.Certificate) { + // save the private key + keyOut, _ := os.Create(keyFile) + defer keyOut.Close() + + // Marshal the private key to ASN.1 DER format + privateKey, err := x509.MarshalECPrivateKey(key) + if err != nil { + panic(err) + } + + err = pem.Encode(keyOut, &pem.Block{Type: "EC PRIVATE KEY", Bytes: privateKey}) + if err != nil { + panic(err) + } + + // save the certificate + certOut, _ := os.Create(certFile) + defer certOut.Close() + err = pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) + if err != nil { + panic(err) + } +} diff --git a/integration/fixtures/ocsp/server.crt b/integration/fixtures/ocsp/server.crt new file mode 100644 index 000000000..9e05c6e5c --- /dev/null +++ b/integration/fixtures/ocsp/server.crt @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBjjCCATSgAwIBAgIIGDlFgswgB3AwCgYIKoZIzj0EAwIwEjEQMA4GA1UEAxMH +VGVzdCBDQTAeFw0yNTA0MjQxMzUyMzhaFw0yNjA0MjQxMzUyMzhaMBcxFTATBgNV +BAMTDHNlcnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHpjZoVk +Qh15gTa26KMJfvzfVgGHGicUDg1UYppKAMY83rxSXqRHcVFAFRqWDTgCQRy6hPq+ +6p5OwBziC2X/SOejbzBtMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB8G +A1UdIwQYMBaAFBdGVYsrb3mWYPL73fVrgdrxdU02MCwGCCsGAQUFBwEBBCAwHjAc +BggrBgEFBQcwAYYQb2NzcC5leGFtcGxlLmNvbTAKBggqhkjOPQQDAgNIADBFAiEA +mp5LQixMUFh5h8yF1EtFsi4MKrO+dzD68TqIhq1rKjUCIEbB++M8qO4gtqjv8d06 +AzSLTEfgNCmM574JI46YAKVx +-----END CERTIFICATE----- diff --git a/integration/fixtures/ocsp/server.key b/integration/fixtures/ocsp/server.key new file mode 100644 index 000000000..3cd45737a --- /dev/null +++ b/integration/fixtures/ocsp/server.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIFpVKKKxvw6cZe7hwRLHgXIsWiJYUQ66PKzO6iXINUH0oAoGCCqGSM49 +AwEHoUQDQgAEemNmhWRCHXmBNrboowl+/N9WAYcaJxQODVRimkoAxjzevFJepEdx +UUAVGpYNOAJBHLqE+r7qnk7AHOILZf9I5w== +-----END EC PRIVATE KEY----- diff --git a/integration/fixtures/ocsp/simple.toml b/integration/fixtures/ocsp/simple.toml new file mode 100644 index 000000000..13222b694 --- /dev/null +++ b/integration/fixtures/ocsp/simple.toml @@ -0,0 +1,27 @@ +[global] + checkNewVersion = false + sendAnonymousUsage = false + +[entryPoints] + [entryPoints.web] + address = ":8000" + +[providers.file] + filename = "{{ .SelfFilename }}" + +[ocsp.responderOverrides] + ocsp.example.com = "{{ .ResponderURL }}" + +[log] + level="debug" + +## dynamic configuration ## + +[[tls.certificates]] + certFile = "fixtures/ocsp/server.crt" + keyFile = "fixtures/ocsp/server.key" + +[tls.stores] + [tls.stores.default.defaultCertificate] + certFile = "fixtures/ocsp/default.crt" + keyFile = "fixtures/ocsp/default.key" diff --git a/integration/simple_test.go b/integration/simple_test.go index 791ee514c..675e21c3d 100644 --- a/integration/simple_test.go +++ b/integration/simple_test.go @@ -3,7 +3,9 @@ package integration import ( "bufio" "bytes" + "crypto" "crypto/rand" + "crypto/tls" "encoding/json" "fmt" "io" @@ -24,6 +26,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/traefik/traefik/v3/integration/try" "github.com/traefik/traefik/v3/pkg/config/dynamic" + "golang.org/x/crypto/ocsp" ) // SimpleSuite tests suite. @@ -1598,6 +1601,132 @@ func (s *SimpleSuite) TestMaxHeaderBytes() { } } +func (s *SimpleSuite) TestSimpleOCSP() { + defaultCert, err := tls.LoadX509KeyPair("fixtures/ocsp/default.crt", "fixtures/ocsp/default.key") + require.NoError(s.T(), err) + + serverCert, err := tls.LoadX509KeyPair("fixtures/ocsp/server.crt", "fixtures/ocsp/server.key") + require.NoError(s.T(), err) + + defaultOCSPResponseTmpl := ocsp.Response{ + SerialNumber: defaultCert.Leaf.SerialNumber, + Status: ocsp.Good, + ThisUpdate: defaultCert.Leaf.NotBefore, + NextUpdate: defaultCert.Leaf.NotAfter, + } + defaultOCSPResponse, err := ocsp.CreateResponse(defaultCert.Leaf, defaultCert.Leaf, defaultOCSPResponseTmpl, defaultCert.PrivateKey.(crypto.Signer)) + require.NoError(s.T(), err) + + serverOCSPResponseTmpl := ocsp.Response{ + SerialNumber: serverCert.Leaf.SerialNumber, + Status: ocsp.Good, + ThisUpdate: serverCert.Leaf.NotBefore, + NextUpdate: serverCert.Leaf.NotAfter, + } + serverOCSPResponse, err := ocsp.CreateResponse(serverCert.Leaf, serverCert.Leaf, serverOCSPResponseTmpl, serverCert.PrivateKey.(crypto.Signer)) + require.NoError(s.T(), err) + + responderCalled := make(chan struct{}) + responder := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + ct := req.Header.Get("Content-Type") + assert.Equal(s.T(), "application/ocsp-request", ct) + + reqBytes, err := io.ReadAll(req.Body) + require.NoError(s.T(), err) + + ocspReq, err := ocsp.ParseRequest(reqBytes) + require.NoError(s.T(), err) + + var ocspResponse []byte + switch ocspReq.SerialNumber.String() { + case defaultCert.Leaf.SerialNumber.String(): + ocspResponse = defaultOCSPResponse + case serverCert.Leaf.SerialNumber.String(): + ocspResponse = serverOCSPResponse + default: + s.T().Fatalf("Unexpected OCSP request for serial number: %s", ocspReq.SerialNumber) + } + + rw.Header().Set("Content-Type", "application/ocsp-response") + + _, err = rw.Write(ocspResponse) + require.NoError(s.T(), err) + + responderCalled <- struct{}{} + })) + s.T().Cleanup(responder.Close) + + file := s.adaptFile("fixtures/ocsp/simple.toml", struct { + ResponderURL string + }{responder.URL}) + + s.traefikCmd(withConfigFile(file)) + + select { + case <-responderCalled: + case <-time.After(5 * time.Second): + s.T().Fatal("OCSP responder was not called") + } + + select { + case <-responderCalled: + case <-time.After(5 * time.Second): + s.T().Fatal("OCSP responder was not called") + } + + // Check that the response is stapled. + + // Create a TLS client configuration that checks for OCSP stapling for the default cert. + var verifyCallCount int + clientConfig := &tls.Config{ + InsecureSkipVerify: true, + ServerName: "unknown", + VerifyConnection: func(state tls.ConnectionState) error { + s.T().Helper() + + verifyCallCount++ + assert.Equal(s.T(), "default.local", state.PeerCertificates[0].Subject.CommonName) + assert.Equal(s.T(), defaultOCSPResponse, state.OCSPResponse) + return nil + }, + } + + // Connect to the server and verify OCSP stapling. + conn, err := tls.DialWithDialer(&net.Dialer{Timeout: 5 * time.Second}, "tcp", "127.0.0.1:8000", clientConfig) + require.NoError(s.T(), err) + + s.T().Cleanup(func() { + _ = conn.Close() + }) + + assert.Equal(s.T(), 1, verifyCallCount) + + // Create a TLS client configuration that checks for OCSP stapling for a cert in the store. + verifyCallCount = 0 + clientConfig = &tls.Config{ + InsecureSkipVerify: true, + ServerName: "server.local", + VerifyConnection: func(state tls.ConnectionState) error { + s.T().Helper() + + verifyCallCount++ + assert.Equal(s.T(), "server.local", state.PeerCertificates[0].Subject.CommonName) + assert.Equal(s.T(), serverOCSPResponse, state.OCSPResponse) + return nil + }, + } + + // Connect to the server and verify OCSP stapling. + conn, err = tls.DialWithDialer(&net.Dialer{Timeout: 5 * time.Second}, "tcp", "127.0.0.1:8000", clientConfig) + require.NoError(s.T(), err) + + s.T().Cleanup(func() { + _ = conn.Close() + }) + + assert.Equal(s.T(), 1, verifyCallCount) +} + func (s *SimpleSuite) TestSanitizePath() { s.createComposeProject("base") diff --git a/pkg/config/static/static_config.go b/pkg/config/static/static_config.go index af60efbb8..907d56ba9 100644 --- a/pkg/config/static/static_config.go +++ b/pkg/config/static/static_config.go @@ -28,6 +28,7 @@ import ( "github.com/traefik/traefik/v3/pkg/provider/kv/zk" "github.com/traefik/traefik/v3/pkg/provider/nomad" "github.com/traefik/traefik/v3/pkg/provider/rest" + "github.com/traefik/traefik/v3/pkg/tls" "github.com/traefik/traefik/v3/pkg/types" ) @@ -80,6 +81,8 @@ type Configuration struct { Core *Core `description:"Core controls." json:"core,omitempty" toml:"core,omitempty" yaml:"core,omitempty" export:"true"` Spiffe *SpiffeClientConfig `description:"SPIFFE integration configuration." json:"spiffe,omitempty" toml:"spiffe,omitempty" yaml:"spiffe,omitempty" export:"true"` + + OCSP *tls.OCSPConfig `description:"OCSP configuration." json:"ocsp,omitempty" toml:"ocsp,omitempty" yaml:"ocsp,omitempty" label:"allowEmpty" file:"allowEmpty" export:"true"` } // Core configures Traefik core behavior. @@ -424,6 +427,14 @@ func (c *Configuration) ValidateConfiguration() error { return errors.New("API basePath must be a valid absolute path") } + if c.OCSP != nil { + for responderURL, url := range c.OCSP.ResponderOverrides { + if url == "" { + return fmt.Errorf("OCSP responder override value for %s cannot be empty", responderURL) + } + } + } + return nil } diff --git a/pkg/server/router/router_test.go b/pkg/server/router/router_test.go index 9191c78d3..50811be7c 100644 --- a/pkg/server/router/router_test.go +++ b/pkg/server/router/router_test.go @@ -325,7 +325,7 @@ func TestRouterManager_Get(t *testing.T) { serviceManager := service.NewManager(rtConf.Services, nil, nil, transportManager, proxyBuilderMock{}) middlewaresBuilder := middleware.NewBuilder(rtConf.Middlewares, serviceManager, nil) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) parser, err := httpmuxer.NewSyntaxParser() require.NoError(t, err) @@ -712,7 +712,7 @@ func TestRuntimeConfiguration(t *testing.T) { serviceManager := service.NewManager(rtConf.Services, nil, nil, transportManager, proxyBuilderMock{}) middlewaresBuilder := middleware.NewBuilder(rtConf.Middlewares, serviceManager, nil) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) tlsManager.UpdateConfigs(t.Context(), nil, test.tlsOptions, nil) parser, err := httpmuxer.NewSyntaxParser() @@ -794,7 +794,7 @@ func TestProviderOnMiddlewares(t *testing.T) { serviceManager := service.NewManager(rtConf.Services, nil, nil, transportManager, nil) middlewaresBuilder := middleware.NewBuilder(rtConf.Middlewares, serviceManager, nil) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) parser, err := httpmuxer.NewSyntaxParser() require.NoError(t, err) @@ -873,7 +873,7 @@ func BenchmarkRouterServe(b *testing.B) { serviceManager := service.NewManager(rtConf.Services, nil, nil, staticTransportManager{res}, nil) middlewaresBuilder := middleware.NewBuilder(rtConf.Middlewares, serviceManager, nil) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) parser, err := httpmuxer.NewSyntaxParser() require.NoError(b, err) diff --git a/pkg/server/router/tcp/manager_test.go b/pkg/server/router/tcp/manager_test.go index 02d49bde9..32b3218e0 100644 --- a/pkg/server/router/tcp/manager_test.go +++ b/pkg/server/router/tcp/manager_test.go @@ -347,7 +347,7 @@ func TestRuntimeConfiguration(t *testing.T) { dialerManager := tcp2.NewDialerManager(nil) dialerManager.Update(map[string]*dynamic.TCPServersTransport{"default@internal": {}}) serviceManager := tcp.NewManager(conf, dialerManager) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) tlsManager.UpdateConfigs( t.Context(), map[string]traefiktls.Store{}, @@ -659,7 +659,7 @@ func TestDomainFronting(t *testing.T) { serviceManager := tcp.NewManager(conf, tcp2.NewDialerManager(nil)) - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) tlsManager.UpdateConfigs(t.Context(), map[string]traefiktls.Store{}, test.tlsOptions, []*traefiktls.CertAndStores{}) httpsHandler := map[string]http.Handler{ diff --git a/pkg/server/router/tcp/router_test.go b/pkg/server/router/tcp/router_test.go index b4e4e3edb..1c2875776 100644 --- a/pkg/server/router/tcp/router_test.go +++ b/pkg/server/router/tcp/router_test.go @@ -172,7 +172,7 @@ func Test_Routing(t *testing.T) { require.NoError(t, err) // Creates the tlsManager and defines the TLS 1.0 and 1.2 TLSOptions. - tlsManager := traefiktls.NewManager() + tlsManager := traefiktls.NewManager(nil) tlsManager.UpdateConfigs( t.Context(), map[string]traefiktls.Store{ diff --git a/pkg/server/routerfactory_test.go b/pkg/server/routerfactory_test.go index 648b24e8f..8a536890f 100644 --- a/pkg/server/routerfactory_test.go +++ b/pkg/server/routerfactory_test.go @@ -55,7 +55,7 @@ func TestReuseService(t *testing.T) { transportManager.Update(map[string]*dynamic.ServersTransport{"default@internal": {}}) managerFactory := service.NewManagerFactory(staticConfig, nil, nil, transportManager, proxyBuilderMock{}, nil) - tlsManager := tls.NewManager() + tlsManager := tls.NewManager(nil) dialerManager := tcp.NewDialerManager(nil) dialerManager.Update(map[string]*dynamic.TCPServersTransport{"default@internal": {}}) @@ -193,7 +193,7 @@ func TestServerResponseEmptyBackend(t *testing.T) { transportManager.Update(map[string]*dynamic.ServersTransport{"default@internal": {}}) managerFactory := service.NewManagerFactory(staticConfig, nil, nil, transportManager, proxyBuilderMock{}, nil) - tlsManager := tls.NewManager() + tlsManager := tls.NewManager(nil) dialerManager := tcp.NewDialerManager(nil) dialerManager.Update(map[string]*dynamic.TCPServersTransport{"default@internal": {}}) @@ -239,7 +239,7 @@ func TestInternalServices(t *testing.T) { transportManager.Update(map[string]*dynamic.ServersTransport{"default@internal": {}}) managerFactory := service.NewManagerFactory(staticConfig, nil, nil, transportManager, nil, nil) - tlsManager := tls.NewManager() + tlsManager := tls.NewManager(nil) dialerManager := tcp.NewDialerManager(nil) dialerManager.Update(map[string]*dynamic.TCPServersTransport{"default@internal": {}}) diff --git a/pkg/tls/certificate.go b/pkg/tls/certificate.go index ea7f895ae..f99796783 100644 --- a/pkg/tls/certificate.go +++ b/pkg/tls/certificate.go @@ -7,7 +7,6 @@ import ( "fmt" "net/url" "os" - "sort" "strings" "github.com/rs/zerolog/log" @@ -76,68 +75,6 @@ type Certificate struct { KeyFile types.FileOrContent `json:"keyFile,omitempty" toml:"keyFile,omitempty" yaml:"keyFile,omitempty" loggable:"false"` } -// AppendCertificate appends a Certificate to a certificates map keyed by store name. -func (c *Certificate) AppendCertificate(certs map[string]map[string]*tls.Certificate, storeName string) error { - certContent, err := c.CertFile.Read() - if err != nil { - return fmt.Errorf("unable to read CertFile : %w", err) - } - - keyContent, err := c.KeyFile.Read() - if err != nil { - return fmt.Errorf("unable to read KeyFile : %w", err) - } - tlsCert, err := tls.X509KeyPair(certContent, keyContent) - if err != nil { - return fmt.Errorf("unable to generate TLS certificate : %w", err) - } - - parsedCert, _ := x509.ParseCertificate(tlsCert.Certificate[0]) - - var SANs []string - if parsedCert.Subject.CommonName != "" { - SANs = append(SANs, strings.ToLower(parsedCert.Subject.CommonName)) - } - if parsedCert.DNSNames != nil { - for _, dnsName := range parsedCert.DNSNames { - if dnsName != parsedCert.Subject.CommonName { - SANs = append(SANs, strings.ToLower(dnsName)) - } - } - } - if parsedCert.IPAddresses != nil { - for _, ip := range parsedCert.IPAddresses { - if ip.String() != parsedCert.Subject.CommonName { - SANs = append(SANs, strings.ToLower(ip.String())) - } - } - } - - // Guarantees the order to produce a unique cert key. - sort.Strings(SANs) - certKey := strings.Join(SANs, ",") - - certExists := false - if certs[storeName] == nil { - certs[storeName] = make(map[string]*tls.Certificate) - } else { - for domains := range certs[storeName] { - if domains == certKey { - certExists = true - break - } - } - } - if certExists { - log.Debug().Msgf("Skipping addition of certificate for domain(s) %q, to TLS Store %s, as it already exists for this store.", certKey, storeName) - } else { - log.Debug().Msgf("Adding certificate for domain(s) %s", certKey) - certs[storeName][certKey] = &tlsCert - } - - return err -} - // GetCertificate returns a tls.Certificate matching the configured CertFile and KeyFile. func (c *Certificate) GetCertificate() (tls.Certificate, error) { certContent, err := c.CertFile.Read() @@ -169,24 +106,6 @@ func (c *Certificate) GetCertificateFromBytes() (tls.Certificate, error) { return cert, nil } -// Set is the method to set the flag value, part of the flag.Value interface. -// Set's argument is a string to be parsed to set the flag. -// It's a comma-separated list, so we split it. -func (c *Certificates) Set(value string) error { - certificates := strings.Split(value, ";") - for _, certificate := range certificates { - files := strings.Split(certificate, ",") - if len(files) != 2 { - return fmt.Errorf("bad certificates format: %s", value) - } - *c = append(*c, Certificate{ - CertFile: types.FileOrContent(files[0]), - KeyFile: types.FileOrContent(files[1]), - }) - } - return nil -} - // GetTruncatedCertificateName truncates the certificate name. func (c *Certificate) GetTruncatedCertificateName() string { certName := c.CertFile.String() diff --git a/pkg/tls/certificate_store.go b/pkg/tls/certificate_store.go index 2ead96ccf..57979f45d 100644 --- a/pkg/tls/certificate_store.go +++ b/pkg/tls/certificate_store.go @@ -2,7 +2,7 @@ package tls import ( "crypto/tls" - "crypto/x509" + "fmt" "net" "sort" "strings" @@ -13,57 +13,40 @@ import ( "github.com/traefik/traefik/v3/pkg/safe" ) +// CertificateData holds runtime data for runtime TLS certificate handling. +type CertificateData struct { + Hash string + Certificate *tls.Certificate +} + // CertificateStore store for dynamic certificates. type CertificateStore struct { DynamicCerts *safe.Safe - DefaultCertificate *tls.Certificate + DefaultCertificate *CertificateData CertCache *cache.Cache + + ocspStapler *ocspStapler } // NewCertificateStore create a store for dynamic certificates. -func NewCertificateStore() *CertificateStore { - s := &safe.Safe{} - s.Set(make(map[string]*tls.Certificate)) +func NewCertificateStore(ocspStapler *ocspStapler) *CertificateStore { + var dynamicCerts safe.Safe + dynamicCerts.Set(make(map[string]*CertificateData)) return &CertificateStore{ - DynamicCerts: s, + DynamicCerts: &dynamicCerts, CertCache: cache.New(1*time.Hour, 10*time.Minute), + ocspStapler: ocspStapler, } } -func (c *CertificateStore) getDefaultCertificateDomains() []string { - var allCerts []string - - if c.DefaultCertificate == nil { - return allCerts - } - - x509Cert, err := x509.ParseCertificate(c.DefaultCertificate.Certificate[0]) - if err != nil { - log.Error().Err(err).Msg("Could not parse default certificate") - return allCerts - } - - if len(x509Cert.Subject.CommonName) > 0 { - allCerts = append(allCerts, x509Cert.Subject.CommonName) - } - - allCerts = append(allCerts, x509Cert.DNSNames...) - - for _, ipSan := range x509Cert.IPAddresses { - allCerts = append(allCerts, ipSan.String()) - } - - return allCerts -} - // GetAllDomains return a slice with all the certificate domain. func (c *CertificateStore) GetAllDomains() []string { allDomains := c.getDefaultCertificateDomains() // Get dynamic certificates if c.DynamicCerts != nil && c.DynamicCerts.Get() != nil { - for domain := range c.DynamicCerts.Get().(map[string]*tls.Certificate) { + for domain := range c.DynamicCerts.Get().(map[string]*CertificateData) { allDomains = append(allDomains, domain) } } @@ -71,6 +54,23 @@ func (c *CertificateStore) GetAllDomains() []string { return allDomains } +// GetDefaultCertificate returns the default certificate. +func (c *CertificateStore) GetDefaultCertificate() *tls.Certificate { + if c == nil { + return nil + } + + if c.ocspStapler != nil && c.DefaultCertificate.Hash != "" { + if staple, ok := c.ocspStapler.GetStaple(c.DefaultCertificate.Hash); ok { + // We are updating the OCSPStaple of the certificate without any synchronization + // as this should not cause any issue. + c.DefaultCertificate.Certificate.OCSPStaple = staple + } + } + + return c.DefaultCertificate.Certificate +} + // GetBestCertificate returns the best match certificate, and caches the response. func (c *CertificateStore) GetBestCertificate(clientHello *tls.ClientHelloInfo) *tls.Certificate { if c == nil { @@ -87,12 +87,21 @@ func (c *CertificateStore) GetBestCertificate(clientHello *tls.ClientHelloInfo) } if cert, ok := c.CertCache.Get(serverName); ok { - return cert.(*tls.Certificate) + certificateData := cert.(*CertificateData) + if c.ocspStapler != nil && certificateData.Hash != "" { + if staple, ok := c.ocspStapler.GetStaple(certificateData.Hash); ok { + // We are updating the OCSPStaple of the certificate without any synchronization + // as this should not cause any issue. + certificateData.Certificate.OCSPStaple = staple + } + } + + return certificateData.Certificate } - matchedCerts := map[string]*tls.Certificate{} + matchedCerts := map[string]*CertificateData{} if c.DynamicCerts != nil && c.DynamicCerts.Get() != nil { - for domains, cert := range c.DynamicCerts.Get().(map[string]*tls.Certificate) { + for domains, cert := range c.DynamicCerts.Get().(map[string]*CertificateData) { for _, certDomain := range strings.Split(domains, ",") { if matchDomain(serverName, certDomain) { matchedCerts[certDomain] = cert @@ -110,15 +119,25 @@ func (c *CertificateStore) GetBestCertificate(clientHello *tls.ClientHelloInfo) sort.Strings(keys) // cache best match - c.CertCache.SetDefault(serverName, matchedCerts[keys[len(keys)-1]]) - return matchedCerts[keys[len(keys)-1]] + certificateData := matchedCerts[keys[len(keys)-1]] + c.CertCache.SetDefault(serverName, certificateData) + + if c.ocspStapler != nil && certificateData.Hash != "" { + if staple, ok := c.ocspStapler.GetStaple(certificateData.Hash); ok { + // We are updating the OCSPStaple of the certificate without any synchronization + // as this should not cause any issue. + certificateData.Certificate.OCSPStaple = staple + } + } + + return certificateData.Certificate } return nil } // GetCertificate returns the first certificate matching all the given domains. -func (c *CertificateStore) GetCertificate(domains []string) *tls.Certificate { +func (c *CertificateStore) GetCertificate(domains []string) *CertificateData { if c == nil { return nil } @@ -127,11 +146,11 @@ func (c *CertificateStore) GetCertificate(domains []string) *tls.Certificate { domainsKey := strings.Join(domains, ",") if cert, ok := c.CertCache.Get(domainsKey); ok { - return cert.(*tls.Certificate) + return cert.(*CertificateData) } if c.DynamicCerts != nil && c.DynamicCerts.Get() != nil { - for certDomains, cert := range c.DynamicCerts.Get().(map[string]*tls.Certificate) { + for certDomains, cert := range c.DynamicCerts.Get().(map[string]*CertificateData) { if domainsKey == certDomains { c.CertCache.SetDefault(domainsKey, cert) return cert @@ -163,6 +182,91 @@ func (c *CertificateStore) ResetCache() { } } +func (c *CertificateStore) getDefaultCertificateDomains() []string { + if c.DefaultCertificate == nil { + return nil + } + + defaultCert := c.DefaultCertificate.Certificate.Leaf + + var allCerts []string + if len(defaultCert.Subject.CommonName) > 0 { + allCerts = append(allCerts, defaultCert.Subject.CommonName) + } + + allCerts = append(allCerts, defaultCert.DNSNames...) + + for _, ipSan := range defaultCert.IPAddresses { + allCerts = append(allCerts, ipSan.String()) + } + + return allCerts +} + +// appendCertificate appends a Certificate to a certificates map keyed by store name. +func appendCertificate(certs map[string]map[string]*CertificateData, subjectAltNames []string, storeName string, cert *CertificateData) { + // Guarantees the order to produce a unique cert key. + sort.Strings(subjectAltNames) + certKey := strings.Join(subjectAltNames, ",") + + certExists := false + if certs[storeName] == nil { + certs[storeName] = make(map[string]*CertificateData) + } else { + for domains := range certs[storeName] { + if domains == certKey { + certExists = true + break + } + } + } + if certExists { + log.Debug().Msgf("Skipping addition of certificate for domain(s) %q, to TLS Store %s, as it already exists for this store.", certKey, storeName) + } else { + log.Debug().Msgf("Adding certificate for domain(s) %s", certKey) + + certs[storeName][certKey] = cert + } +} + +func parseCertificate(cert *Certificate) (tls.Certificate, []string, error) { + certContent, err := cert.CertFile.Read() + if err != nil { + return tls.Certificate{}, nil, fmt.Errorf("unable to read CertFile: %w", err) + } + + keyContent, err := cert.KeyFile.Read() + if err != nil { + return tls.Certificate{}, nil, fmt.Errorf("unable to read KeyFile: %w", err) + } + + tlsCert, err := tls.X509KeyPair(certContent, keyContent) + if err != nil { + return tls.Certificate{}, nil, fmt.Errorf("unable to generate TLS certificate: %w", err) + } + + var SANs []string + if tlsCert.Leaf.Subject.CommonName != "" { + SANs = append(SANs, strings.ToLower(tlsCert.Leaf.Subject.CommonName)) + } + if tlsCert.Leaf.DNSNames != nil { + for _, dnsName := range tlsCert.Leaf.DNSNames { + if dnsName != tlsCert.Leaf.Subject.CommonName { + SANs = append(SANs, strings.ToLower(dnsName)) + } + } + } + if tlsCert.Leaf.IPAddresses != nil { + for _, ip := range tlsCert.Leaf.IPAddresses { + if ip.String() != tlsCert.Leaf.Subject.CommonName { + SANs = append(SANs, strings.ToLower(ip.String())) + } + } + } + + return tlsCert, SANs, err +} + // matchDomain returns whether the server name matches the cert domain. // The server name, from TLS SNI, must not have trailing dots (https://datatracker.ietf.org/doc/html/rfc6066#section-3). // This is enforced by https://github.com/golang/go/blob/d3d7998756c33f69706488cade1cd2b9b10a4c7f/src/crypto/tls/handshake_messages.go#L423-L427. diff --git a/pkg/tls/certificate_store_test.go b/pkg/tls/certificate_store_test.go index cbc668bd6..ef4fd3885 100644 --- a/pkg/tls/certificate_store_test.go +++ b/pkg/tls/certificate_store_test.go @@ -58,12 +58,12 @@ func TestGetBestCertificate(t *testing.T) { for _, test := range testCases { t.Run(test.desc, func(t *testing.T) { t.Parallel() - dynamicMap := map[string]*tls.Certificate{} + dynamicMap := map[string]*CertificateData{} if test.dynamicCert != "" { cert, err := loadTestCert(test.dynamicCert, test.uppercase) require.NoError(t, err) - dynamicMap[strings.ToLower(test.dynamicCert)] = cert + dynamicMap[strings.ToLower(test.dynamicCert)] = &CertificateData{Certificate: cert} } store := &CertificateStore{ diff --git a/pkg/tls/ocsp.go b/pkg/tls/ocsp.go new file mode 100644 index 000000000..1517458ae --- /dev/null +++ b/pkg/tls/ocsp.go @@ -0,0 +1,206 @@ +package tls + +import ( + "bytes" + "context" + "crypto/x509" + "errors" + "fmt" + "io" + "net/http" + "time" + + "github.com/patrickmn/go-cache" + "github.com/rs/zerolog/log" + "golang.org/x/crypto/ocsp" +) + +const defaultCacheDuration = 24 * time.Hour + +type ocspEntry struct { + leaf *x509.Certificate + issuer *x509.Certificate + responders []string + nextUpdate time.Time + staple []byte +} + +// ocspStapler retrieves staples from OCSP responders and store them in an in-memory cache. +// It also updates the staples on a regular basis and before they expire. +type ocspStapler struct { + client *http.Client + cache cache.Cache + forceStapleUpdates chan struct{} + responderOverrides map[string]string +} + +// newOCSPStapler creates a new ocspStapler cache. +func newOCSPStapler(responderOverrides map[string]string) *ocspStapler { + return &ocspStapler{ + client: &http.Client{Timeout: 10 * time.Second}, + cache: *cache.New(defaultCacheDuration, 5*time.Minute), + forceStapleUpdates: make(chan struct{}, 1), + responderOverrides: responderOverrides, + } +} + +// Run updates the OCSP staples every hours. +func (o *ocspStapler) Run(ctx context.Context) { + ticker := time.NewTicker(time.Hour) + defer ticker.Stop() + + select { + case <-ctx.Done(): + return + + case <-o.forceStapleUpdates: + o.updateStaples(ctx) + + case <-ticker.C: + o.updateStaples(ctx) + } +} + +// ForceStapleUpdates triggers staple updates in the background instead of waiting for the Run routine to update them. +func (o *ocspStapler) ForceStapleUpdates() { + select { + case o.forceStapleUpdates <- struct{}{}: + default: + } +} + +// GetStaple retrieves the OCSP staple for the corresponding to the given key (public certificate hash). +func (o *ocspStapler) GetStaple(key string) ([]byte, bool) { + if item, ok := o.cache.Get(key); ok && item != nil { + if entry, ok := item.(*ocspEntry); ok { + return entry.staple, true + } + } + return nil, false +} + +// Upsert creates a new entry for the given certificate. +// The ocspStapler will then be responsible from retrieving and updating the corresponding OCSP obtainStaple. +func (o *ocspStapler) Upsert(key string, leaf, issuer *x509.Certificate) error { + if len(leaf.OCSPServer) == 0 { + return errors.New("leaf certificate does not contain an OCSP server") + } + + if item, ok := o.cache.Get(key); ok { + o.cache.Set(key, item, cache.NoExpiration) + return nil + } + + var responders []string + for _, url := range leaf.OCSPServer { + if len(o.responderOverrides) > 0 { + if newURL, ok := o.responderOverrides[url]; ok { + url = newURL + } + } + responders = append(responders, url) + } + + o.cache.Set(key, &ocspEntry{ + leaf: leaf, + issuer: issuer, + responders: responders, + }, cache.NoExpiration) + + return nil +} + +// ResetTTL resets the expiration time for all items having no expiration. +// This allows setting a TTL for certificates that do not exist anymore in the dynamic configuration. +// For certificates that are still provided by the dynamic configuration, +// their expiration time will be unset when calling the Upsert method. +func (o *ocspStapler) ResetTTL() { + for key, item := range o.cache.Items() { + if item.Expiration > 0 { + continue + } + + o.cache.Set(key, item.Object, defaultCacheDuration) + } +} + +func (o *ocspStapler) updateStaples(ctx context.Context) { + for _, item := range o.cache.Items() { + select { + case <-ctx.Done(): + return + default: + } + + entry := item.Object.(*ocspEntry) + + if entry.staple != nil && time.Now().Before(entry.nextUpdate) { + continue + } + + if err := o.updateStaple(ctx, entry); err != nil { + log.Error().Err(err).Msgf("Unable to retieve OCSP staple for: %s", entry.leaf.Subject.CommonName) + continue + } + } +} + +// obtainStaple obtains the OCSP stable for the given leaf certificate. +func (o *ocspStapler) updateStaple(ctx context.Context, entry *ocspEntry) error { + ocspReq, err := ocsp.CreateRequest(entry.leaf, entry.issuer, nil) + if err != nil { + return fmt.Errorf("creating OCSP request: %w", err) + } + + for _, responder := range entry.responders { + logger := log.With().Str("responder", responder).Logger() + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, responder, bytes.NewReader(ocspReq)) + if err != nil { + return fmt.Errorf("creating OCSP request: %w", err) + } + + req.Header.Set("Content-Type", "application/ocsp-request") + + res, err := o.client.Do(req) + if err != nil && ctx.Err() != nil { + return ctx.Err() + } + if err != nil { + logger.Debug().Err(err).Msg("Unable to obtain OCSP response") + continue + } + defer res.Body.Close() + + if res.StatusCode/100 != 2 { + logger.Debug().Msgf("Unable to obtain OCSP response due to status code: %d", res.StatusCode) + continue + } + + ocspResBytes, err := io.ReadAll(res.Body) + if err != nil { + logger.Debug().Err(err).Msg("Unable to read OCSP response bytes") + continue + } + + ocspRes, err := ocsp.ParseResponseForCert(ocspResBytes, entry.leaf, entry.issuer) + if err != nil { + logger.Debug().Err(err).Msg("Unable to parse OCSP response") + continue + } + + entry.staple = ocspResBytes + + // As per RFC 6960, the nextUpdate field is optional. + if ocspRes.NextUpdate.IsZero() { + // NextUpdate is not set, the staple should be updated on the next update. + entry.nextUpdate = time.Now() + } else { + entry.nextUpdate = ocspRes.ThisUpdate.Add(ocspRes.NextUpdate.Sub(ocspRes.ThisUpdate) / 2) + } + + return nil + } + + return errors.New("no OCSP staple obtained from any responders") +} diff --git a/pkg/tls/ocsp_test.go b/pkg/tls/ocsp_test.go new file mode 100644 index 000000000..0cbb69a89 --- /dev/null +++ b/pkg/tls/ocsp_test.go @@ -0,0 +1,485 @@ +package tls + +import ( + "crypto" + "crypto/tls" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/patrickmn/go-cache" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ocsp" +) + +const certWithOCSPServer = `-----BEGIN CERTIFICATE----- +MIIBgjCCASegAwIBAgICIAAwCgYIKoZIzj0EAwIwEjEQMA4GA1UEAxMHVGVzdCBD +QTAeFw0yMzAxMDExMjAwMDBaFw0yMzAyMDExMjAwMDBaMCAxHjAcBgNVBAMTFU9D +U1AgVGVzdCBDZXJ0aWZpY2F0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIoe +I/bjo34qony8LdRJD+Jhuk8/S8YHXRHl6rH9t5VFCFtX8lIPN/Ll1zCrQ2KB3Wlb +fxSgiQyLrCpZyrdhVPSjXzBdMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU+Eo3 +5sST4LRrwS4dueIdGBZ5d7IwLAYIKwYBBQUHAQEEIDAeMBwGCCsGAQUFBzABhhBv +Y3NwLmV4YW1wbGUuY29tMAoGCCqGSM49BAMCA0kAMEYCIQDg94xY/+/VepESdvTT +ykCwiWOS2aCpjyryrKpwMKkR0AIhAPc/+ZEz4W10OENxC1t+NUTvS8JbEGOwulkZ +z9yfaLuD +-----END CERTIFICATE-----` + +const certWithoutOCSPServer = `-----BEGIN CERTIFICATE----- +MIIBUzCB+aADAgECAgIgADAKBggqhkjOPQQDAjASMRAwDgYDVQQDEwdUZXN0IENB +MB4XDTIzMDEwMTEyMDAwMFoXDTIzMDIwMTEyMDAwMFowIDEeMBwGA1UEAxMVT0NT +UCBUZXN0IENlcnRpZmljYXRlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEih4j +9uOjfiqifLwt1EkP4mG6Tz9LxgddEeXqsf23lUUIW1fyUg838uXXMKtDYoHdaVt/ +FKCJDIusKlnKt2FU9KMxMC8wDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBT4Sjfm +xJPgtGvBLh254h0YFnl3sjAKBggqhkjOPQQDAgNJADBGAiEA3rWetLGblfSuNZKf +5CpZxhj3A0BjEocEh+2P+nAgIdUCIQDIgptabR1qTLQaF2u0hJsEX2IKuIUvYWH3 +6Lb92+zIHg== +-----END CERTIFICATE-----` + +// certKey is the private key for both certWithOCSPServer and certWithoutOCSPServer. +const certKey = `-----BEGIN EC PRIVATE KEY----- +MHcCAQEEINnVcgrSNh4HlThWlZpegq14M8G/p9NVDtdVjZrseUGLoAoGCCqGSM49 +AwEHoUQDQgAEih4j9uOjfiqifLwt1EkP4mG6Tz9LxgddEeXqsf23lUUIW1fyUg83 +8uXXMKtDYoHdaVt/FKCJDIusKlnKt2FU9A== +-----END EC PRIVATE KEY-----` + +// caCert is the issuing certificate for certWithOCSPServer and certWithoutOCSPServer. +const caCert = `-----BEGIN CERTIFICATE----- +MIIBazCCARGgAwIBAgICEAAwCgYIKoZIzj0EAwIwEjEQMA4GA1UEAxMHVGVzdCBD +QTAeFw0yMzAxMDExMjAwMDBaFw0yMzAyMDExMjAwMDBaMBIxEDAOBgNVBAMTB1Rl +c3QgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASdKexSor/aeazDM57UHhAX +rCkJxUeF2BWf0lZYCRxc3f0GdrEsVvjJW8+/E06eAzDCGSdM/08Nvun1nb6AmAlt +o1cwVTAOBgNVHQ8BAf8EBAMCAQYwEwYDVR0lBAwwCgYIKwYBBQUHAwkwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU+Eo35sST4LRrwS4dueIdGBZ5d7IwCgYIKoZI +zj0EAwIDSAAwRQIgGbA39+kETTB/YMLBFoC2fpZe1cDWfFB7TUdfINUqdH4CIQCR +ByUFC8A+hRNkK5YNH78bgjnKk/88zUQF5ONy4oPGdQ== +-----END CERTIFICATE-----` + +const caKey = `-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIDJ59ptjq3MzILH4zn5IKoH1sYn+zrUeq2kD8+DD2x+OoAoGCCqGSM49 +AwEHoUQDQgAEnSnsUqK/2nmswzOe1B4QF6wpCcVHhdgVn9JWWAkcXN39BnaxLFb4 +yVvPvxNOngMwwhknTP9PDb7p9Z2+gJgJbQ== +-----END EC PRIVATE KEY-----` + +func TestOCSPStapler_Upsert(t *testing.T) { + ocspStapler := newOCSPStapler(nil) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + // Upsert a certificate without an OCSP server should raise an error. + leafCertWithoutOCSPServer, err := tls.X509KeyPair([]byte(certWithoutOCSPServer), []byte(certKey)) + require.NoError(t, err) + + err = ocspStapler.Upsert("foo", leafCertWithoutOCSPServer.Leaf, issuerCert.Leaf) + require.Error(t, err) + + // Upsert a certificate with an OCSP server. + err = ocspStapler.Upsert("foo", leafCert.Leaf, issuerCert.Leaf) + require.NoError(t, err) + + i, ok := ocspStapler.cache.Get("foo") + require.True(t, ok) + + e, ok := i.(*ocspEntry) + require.True(t, ok) + + assert.Equal(t, leafCert.Leaf, e.leaf) + assert.Equal(t, issuerCert.Leaf, e.issuer) + assert.Nil(t, e.staple) + assert.Equal(t, []string{"ocsp.example.com"}, e.responders) + assert.Equal(t, int64(0), ocspStapler.cache.Items()["foo"].Expiration) + + // Upsert an existing entry to make sure that the existing staple is preserved. + e.staple = []byte("foo") + e.nextUpdate = time.Now() + e.responders = []string{"foo.com"} + + err = ocspStapler.Upsert("foo", leafCert.Leaf, issuerCert.Leaf) + require.NoError(t, err) + + i, ok = ocspStapler.cache.Get("foo") + require.True(t, ok) + + e, ok = i.(*ocspEntry) + require.True(t, ok) + + assert.Equal(t, leafCert.Leaf, e.leaf) + assert.Equal(t, issuerCert.Leaf, e.issuer) + assert.Equal(t, []byte("foo"), e.staple) + assert.NotZero(t, e.nextUpdate) + assert.Equal(t, []string{"foo.com"}, e.responders) + assert.Equal(t, int64(0), ocspStapler.cache.Items()["foo"].Expiration) +} + +func TestOCSPStapler_Upsert_withResponderOverrides(t *testing.T) { + ocspStapler := newOCSPStapler(map[string]string{ + "ocsp.example.com": "foo.com", + }) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + err = ocspStapler.Upsert("foo", leafCert.Leaf, issuerCert.Leaf) + require.NoError(t, err) + + i, ok := ocspStapler.cache.Get("foo") + require.True(t, ok) + + e, ok := i.(*ocspEntry) + require.True(t, ok) + + assert.Equal(t, leafCert.Leaf, e.leaf) + assert.Equal(t, issuerCert.Leaf, e.issuer) + assert.Nil(t, e.staple) + assert.Equal(t, []string{"foo.com"}, e.responders) +} + +func TestOCSPStapler_ResetTTL(t *testing.T) { + ocspStapler := newOCSPStapler(nil) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + ocspStapler.cache.Set("foo", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{"foo.com"}, + nextUpdate: time.Now(), + staple: []byte("foo"), + }, cache.NoExpiration) + + ocspStapler.cache.Set("bar", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{"bar.com"}, + nextUpdate: time.Now(), + staple: []byte("bar"), + }, time.Hour) + + wantBarExpiration := ocspStapler.cache.Items()["bar"].Expiration + + ocspStapler.ResetTTL() + + item, ok := ocspStapler.cache.Items()["foo"] + require.True(t, ok) + + e, ok := item.Object.(*ocspEntry) + require.True(t, ok) + + assert.Positive(t, item.Expiration) + assert.Equal(t, leafCert.Leaf, e.leaf) + assert.Equal(t, issuerCert.Leaf, e.issuer) + assert.Equal(t, []byte("foo"), e.staple) + assert.NotZero(t, e.nextUpdate) + assert.Equal(t, []string{"foo.com"}, e.responders) + + item, ok = ocspStapler.cache.Items()["bar"] + require.True(t, ok) + + e, ok = item.Object.(*ocspEntry) + require.True(t, ok) + + assert.Equal(t, wantBarExpiration, item.Expiration) + assert.Equal(t, leafCert.Leaf, e.leaf) + assert.Equal(t, issuerCert.Leaf, e.issuer) + assert.Equal(t, []byte("bar"), e.staple) + assert.NotZero(t, e.nextUpdate) + assert.Equal(t, []string{"bar.com"}, e.responders) +} + +func TestOCSPStapler_GetStaple(t *testing.T) { + ocspStapler := newOCSPStapler(nil) + + // Get an un-existing staple. + staple, exists := ocspStapler.GetStaple("foo") + + assert.False(t, exists) + assert.Nil(t, staple) + + // Get an existing staple. + ocspStapler.cache.Set("foo", &ocspEntry{staple: []byte("foo")}, cache.NoExpiration) + + staple, exists = ocspStapler.GetStaple("foo") + + assert.True(t, exists) + assert.Equal(t, []byte("foo"), staple) +} + +func TestOCSPStapler_updateStaple(t *testing.T) { + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + thisUpdate, err := time.Parse("2006-01-02", "2025-01-01") + require.NoError(t, err) + nextUpdate, err := time.Parse("2006-01-02", "2025-01-02") + require.NoError(t, err) + stapleUpdate := thisUpdate.Add(nextUpdate.Sub(thisUpdate) / 2) + + ocspResponseTmpl := ocsp.Response{ + SerialNumber: leafCert.Leaf.SerialNumber, + TBSResponseData: []byte("foo"), + ThisUpdate: thisUpdate, + NextUpdate: nextUpdate, + } + + ocspResponse, err := ocsp.CreateResponse(leafCert.Leaf, leafCert.Leaf, ocspResponseTmpl, issuerCert.PrivateKey.(crypto.Signer)) + require.NoError(t, err) + + handler := func(rw http.ResponseWriter, req *http.Request) { + ct := req.Header.Get("Content-Type") + assert.Equal(t, "application/ocsp-request", ct) + + reqBytes, err := io.ReadAll(req.Body) + require.NoError(t, err) + + _, err = ocsp.ParseRequest(reqBytes) + require.NoError(t, err) + + rw.Header().Set("Content-Type", "application/ocsp-response") + + _, err = rw.Write(ocspResponse) + require.NoError(t, err) + } + + responder := httptest.NewServer(http.HandlerFunc(handler)) + t.Cleanup(responder.Close) + + responderStatusNotOK := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + })) + t.Cleanup(responderStatusNotOK.Close) + + testCases := []struct { + desc string + entry *ocspEntry + expectError bool + }{ + { + desc: "no responder", + entry: &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + }, + expectError: true, + }, + { + desc: "wrong responder", + entry: &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{"http://foo.bar"}, + }, + expectError: true, + }, + { + desc: "not ok status responder", + entry: &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responderStatusNotOK.URL}, + }, + expectError: true, + }, + { + desc: "one wrong responder, one ok", + entry: &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{"http://foo.bar", responder.URL}, + }, + }, + { + desc: "ok responder", + entry: &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responder.URL}, + }, + }, + } + + for _, test := range testCases { + t.Run(test.desc, func(t *testing.T) { + t.Parallel() + + ocspStapler := newOCSPStapler(nil) + ocspStapler.client = &http.Client{Timeout: time.Second} + + err = ocspStapler.updateStaple(t.Context(), test.entry) + if test.expectError { + require.Error(t, err) + return + } + + require.NoError(t, err) + + assert.Equal(t, ocspResponse, test.entry.staple) + assert.Equal(t, stapleUpdate.UTC(), test.entry.nextUpdate) + }) + } +} + +func TestOCSPStapler_updateStaple_withoutNextUpdate(t *testing.T) { + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + thisUpdate, err := time.Parse("2006-01-02", "2025-01-01") + require.NoError(t, err) + + ocspResponseTmpl := ocsp.Response{ + SerialNumber: leafCert.Leaf.SerialNumber, + TBSResponseData: []byte("foo"), + ThisUpdate: thisUpdate, + } + + ocspResponse, err := ocsp.CreateResponse(leafCert.Leaf, leafCert.Leaf, ocspResponseTmpl, issuerCert.PrivateKey.(crypto.Signer)) + require.NoError(t, err) + + handler := func(rw http.ResponseWriter, req *http.Request) { + ct := req.Header.Get("Content-Type") + assert.Equal(t, "application/ocsp-request", ct) + + reqBytes, err := io.ReadAll(req.Body) + require.NoError(t, err) + + _, err = ocsp.ParseRequest(reqBytes) + require.NoError(t, err) + + rw.Header().Set("Content-Type", "application/ocsp-response") + + _, err = rw.Write(ocspResponse) + require.NoError(t, err) + } + + responder := httptest.NewServer(http.HandlerFunc(handler)) + t.Cleanup(responder.Close) + + responderStatusNotOK := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + })) + t.Cleanup(responderStatusNotOK.Close) + + ocspStapler := newOCSPStapler(nil) + ocspStapler.client = &http.Client{Timeout: time.Second} + + entry := &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responder.URL}, + } + err = ocspStapler.updateStaple(t.Context(), entry) + require.NoError(t, err) + + assert.Equal(t, ocspResponse, entry.staple) + assert.NotZero(t, entry.nextUpdate) + assert.Greater(t, time.Now(), entry.nextUpdate) +} + +func TestOCSPStapler_updateStaples(t *testing.T) { + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + thisUpdate, err := time.Parse("2006-01-02", "2025-01-01") + require.NoError(t, err) + nextUpdate, err := time.Parse("2006-01-02", "2025-01-02") + require.NoError(t, err) + stapleUpdate := thisUpdate.Add(nextUpdate.Sub(thisUpdate) / 2) + + ocspResponseTmpl := ocsp.Response{ + SerialNumber: leafCert.Leaf.SerialNumber, + TBSResponseData: []byte("foo"), + ThisUpdate: thisUpdate, + NextUpdate: nextUpdate, + } + + ocspResponse, err := ocsp.CreateResponse(leafCert.Leaf, leafCert.Leaf, ocspResponseTmpl, issuerCert.PrivateKey.(crypto.Signer)) + require.NoError(t, err) + + handler := func(rw http.ResponseWriter, req *http.Request) { + ct := req.Header.Get("Content-Type") + assert.Equal(t, "application/ocsp-request", ct) + + reqBytes, err := io.ReadAll(req.Body) + require.NoError(t, err) + + _, err = ocsp.ParseRequest(reqBytes) + require.NoError(t, err) + + rw.Header().Set("Content-Type", "application/ocsp-response") + + _, err = rw.Write(ocspResponse) + require.NoError(t, err) + } + + responder := httptest.NewServer(http.HandlerFunc(handler)) + t.Cleanup(responder.Close) + + ocspStapler := newOCSPStapler(nil) + ocspStapler.client = &http.Client{Timeout: time.Second} + + // nil staple entry + ocspStapler.cache.Set("nilStaple", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responder.URL}, + nextUpdate: time.Now().Add(-time.Hour), + }, cache.NoExpiration) + // staple entry with nextUpdate in the past + ocspStapler.cache.Set("toUpdate", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responder.URL}, + staple: []byte("foo"), + nextUpdate: time.Now().Add(-time.Hour), + }, cache.NoExpiration) + // staple entry with nextUpdate in the future + inOneHour := time.Now().Add(time.Hour) + ocspStapler.cache.Set("noUpdate", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + responders: []string{responder.URL}, + staple: []byte("foo"), + nextUpdate: inOneHour, + }, cache.NoExpiration) + + ocspStapler.updateStaples(t.Context()) + + nilStaple, ok := ocspStapler.cache.Get("nilStaple") + require.True(t, ok) + + assert.Equal(t, ocspResponse, nilStaple.(*ocspEntry).staple) + assert.Equal(t, stapleUpdate.UTC(), nilStaple.(*ocspEntry).nextUpdate) + + toUpdate, ok := ocspStapler.cache.Get("toUpdate") + require.True(t, ok) + + assert.Equal(t, ocspResponse, toUpdate.(*ocspEntry).staple) + assert.Equal(t, stapleUpdate.UTC(), nilStaple.(*ocspEntry).nextUpdate) + + noUpdate, ok := ocspStapler.cache.Get("noUpdate") + require.True(t, ok) + + assert.Equal(t, []byte("foo"), noUpdate.(*ocspEntry).staple) + assert.Equal(t, inOneHour, noUpdate.(*ocspEntry).nextUpdate) +} diff --git a/pkg/tls/tlsmanager.go b/pkg/tls/tlsmanager.go index 7fcbeab76..2c4a9048c 100644 --- a/pkg/tls/tlsmanager.go +++ b/pkg/tls/tlsmanager.go @@ -6,7 +6,9 @@ import ( "crypto/x509" "errors" "fmt" + "hash/fnv" "slices" + "strconv" "strings" "sync" @@ -43,6 +45,11 @@ func getCipherSuites() []string { return ciphers } +// OCSPConfig contains the OCSP configuration. +type OCSPConfig struct { + ResponderOverrides map[string]string `description:"Defines a map of OCSP responders to replace for querying OCSP servers." json:"responderOverrides,omitempty" toml:"responderOverrides,omitempty" yaml:"responderOverrides,omitempty"` +} + // Manager is the TLS option/store/configuration factory. type Manager struct { lock sync.RWMutex @@ -50,16 +57,33 @@ type Manager struct { stores map[string]*CertificateStore configs map[string]Options certs []*CertAndStores + + // As of today, the TLS manager contains and is responsible for creating/starting the OCSP ocspStapler. + // It would likely have been a Configuration listener but this implies that certs are re-parsed. + // But this would probably have impact on resource consumption. + ocspStapler *ocspStapler } // NewManager creates a new Manager. -func NewManager() *Manager { - return &Manager{ +func NewManager(ocspConfig *OCSPConfig) *Manager { + manager := &Manager{ stores: map[string]*CertificateStore{}, configs: map[string]Options{ "default": DefaultTLSOptions, }, } + + if ocspConfig != nil { + manager.ocspStapler = newOCSPStapler(ocspConfig.ResponderOverrides) + } + + return manager +} + +func (m *Manager) Run(ctx context.Context) { + if m.ocspStapler != nil { + m.ocspStapler.Run(ctx) + } } // UpdateConfigs updates the TLS* configuration options. @@ -91,7 +115,14 @@ func (m *Manager) UpdateConfigs(ctx context.Context, stores map[string]Store, co m.storesConfig[tlsalpn01.ACMETLS1Protocol] = Store{} } - storesCertificates := make(map[string]map[string]*tls.Certificate) + storesCertificates := make(map[string]map[string]*CertificateData) + + // Define the TTL for all the cache entries with no TTL. + // This will discard entries that are not used anymore. + if m.ocspStapler != nil { + m.ocspStapler.ResetTTL() + } + for _, conf := range certs { if len(conf.Stores) == 0 { log.Ctx(ctx).Debug().MsgFunc(func() string { @@ -101,24 +132,49 @@ func (m *Manager) UpdateConfigs(ctx context.Context, stores map[string]Store, co conf.Stores = []string{DefaultTLSStoreName} } - for _, store := range conf.Stores { - logger := log.Ctx(ctx).With().Str(logs.TLSStoreName, store).Logger() + cert, SANs, err := parseCertificate(&conf.Certificate) + if err != nil { + log.Ctx(ctx).Error().Err(err).Msgf("Unable to parse certificate %s", conf.Certificate.GetTruncatedCertificateName()) + continue + } + var certHash string + if m.ocspStapler != nil && len(cert.Leaf.OCSPServer) > 0 { + certHash = hashRawCert(cert.Leaf.Raw) + + issuer := cert.Leaf + if len(cert.Certificate) > 1 { + issuer, err = x509.ParseCertificate(cert.Certificate[1]) + if err != nil { + log.Ctx(ctx).Error().Err(err).Msgf("Unable to parse issuer certificate %s", conf.Certificate.GetTruncatedCertificateName()) + continue + } + } + + if err := m.ocspStapler.Upsert(certHash, cert.Leaf, issuer); err != nil { + log.Ctx(ctx).Error().Err(err).Msgf("Unable to upsert OCSP certificate %s", conf.Certificate.GetTruncatedCertificateName()) + continue + } + } + + certData := &CertificateData{ + Certificate: &cert, + Hash: certHash, + } + + for _, store := range conf.Stores { if _, ok := m.storesConfig[store]; !ok { m.storesConfig[store] = Store{} } - err := conf.Certificate.AppendCertificate(storesCertificates, store) - if err != nil { - logger.Error().Err(err).Msgf("Unable to append certificate %s to store", conf.Certificate.GetTruncatedCertificateName()) - } + appendCertificate(storesCertificates, SANs, store, certData) } } m.stores = make(map[string]*CertificateStore) for storeName, storeConfig := range m.storesConfig { - st := NewCertificateStore() + st := NewCertificateStore(m.ocspStapler) m.stores[storeName] = st if certs, ok := storesCertificates[storeName]; ok { @@ -133,13 +189,17 @@ func (m *Manager) UpdateConfigs(ctx context.Context, stores map[string]Store, co logger := log.Ctx(ctx).With().Str(logs.TLSStoreName, storeName).Logger() ctxStore := logger.WithContext(ctx) - certificate, err := getDefaultCertificate(ctxStore, storeConfig, st) + certificate, err := m.getDefaultCertificate(ctxStore, storeConfig, st) if err != nil { logger.Error().Err(err).Msg("Error while creating certificate store") } st.DefaultCertificate = certificate } + + if m.ocspStapler != nil { + m.ocspStapler.ForceStapleUpdates() + } } // sanitizeDomains sanitizes the domain definition Main and SANS, @@ -226,7 +286,8 @@ func (m *Manager) Get(storeName, configName string) (*tls.Config, error) { } log.Debug().Msgf("Serving default certificate for request: %q", domainToCheck) - return store.DefaultCertificate, nil + + return store.GetDefaultCertificate(), nil } return tlsConfig, err @@ -245,8 +306,8 @@ func (m *Manager) GetServerCertificates() []*x509.Certificate { // We iterate over all the certificates. if defaultStore.DynamicCerts != nil && defaultStore.DynamicCerts.Get() != nil { - for _, cert := range defaultStore.DynamicCerts.Get().(map[string]*tls.Certificate) { - x509Cert, err := x509.ParseCertificate(cert.Certificate[0]) + for _, cert := range defaultStore.DynamicCerts.Get().(map[string]*CertificateData) { + x509Cert, err := x509.ParseCertificate(cert.Certificate.Certificate[0]) if err != nil { continue } @@ -256,7 +317,7 @@ func (m *Manager) GetServerCertificates() []*x509.Certificate { } if defaultStore.DefaultCertificate != nil { - x509Cert, err := x509.ParseCertificate(defaultStore.DefaultCertificate.Certificate[0]) + x509Cert, err := x509.ParseCertificate(defaultStore.DefaultCertificate.Certificate.Certificate[0]) if err != nil { return certificates } @@ -289,9 +350,9 @@ func (m *Manager) GetStore(storeName string) *CertificateStore { return m.getStore(storeName) } -func getDefaultCertificate(ctx context.Context, tlsStore Store, st *CertificateStore) (*tls.Certificate, error) { +func (m *Manager) getDefaultCertificate(ctx context.Context, tlsStore Store, st *CertificateStore) (*CertificateData, error) { if tlsStore.DefaultCertificate != nil { - cert, err := buildDefaultCertificate(tlsStore.DefaultCertificate) + cert, err := m.buildDefaultCertificate(tlsStore.DefaultCertificate) if err != nil { return nil, err } @@ -304,22 +365,65 @@ func getDefaultCertificate(ctx context.Context, tlsStore Store, st *CertificateS return nil, err } + defaultCertificate := &CertificateData{ + Certificate: defaultCert, + } + if tlsStore.DefaultGeneratedCert != nil && tlsStore.DefaultGeneratedCert.Domain != nil && tlsStore.DefaultGeneratedCert.Resolver != "" { domains, err := sanitizeDomains(*tlsStore.DefaultGeneratedCert.Domain) if err != nil { - return defaultCert, fmt.Errorf("falling back to the internal generated certificate because invalid domains: %w", err) + return defaultCertificate, fmt.Errorf("falling back to the internal generated certificate because invalid domains: %w", err) } defaultACMECert := st.GetCertificate(domains) if defaultACMECert == nil { - return defaultCert, fmt.Errorf("unable to find certificate for domains %q: falling back to the internal generated certificate", strings.Join(domains, ",")) + return defaultCertificate, fmt.Errorf("unable to find certificate for domains %q: falling back to the internal generated certificate", strings.Join(domains, ",")) } return defaultACMECert, nil } log.Ctx(ctx).Debug().Msg("No default certificate, fallback to the internal generated certificate") - return defaultCert, nil + return defaultCertificate, nil +} + +func (m *Manager) buildDefaultCertificate(defaultCertificate *Certificate) (*CertificateData, error) { + certFile, err := defaultCertificate.CertFile.Read() + if err != nil { + return nil, fmt.Errorf("failed to get cert file content: %w", err) + } + + keyFile, err := defaultCertificate.KeyFile.Read() + if err != nil { + return nil, fmt.Errorf("failed to get key file content: %w", err) + } + + cert, err := tls.X509KeyPair(certFile, keyFile) + if err != nil { + return nil, fmt.Errorf("failed to load X509 key pair: %w", err) + } + + var certHash string + if m.ocspStapler != nil && len(cert.Leaf.OCSPServer) > 0 { + certHash = hashRawCert(cert.Leaf.Raw) + + issuer := cert.Leaf + if len(cert.Certificate) > 1 { + issuer, err = x509.ParseCertificate(cert.Certificate[1]) + if err != nil { + return nil, fmt.Errorf("parsing issuer certificate %s: %w", defaultCertificate.GetTruncatedCertificateName(), err) + } + } + + if err := m.ocspStapler.Upsert(certHash, cert.Leaf, issuer); err != nil { + return nil, fmt.Errorf("upserting OCSP certificate %s: %w", defaultCertificate.GetTruncatedCertificateName(), err) + } + } + + return &CertificateData{ + Certificate: &cert, + Hash: certHash, + }, nil } // creates a TLS config that allows terminating HTTPS for multiple domains using SNI. @@ -412,20 +516,10 @@ func buildTLSConfig(tlsOption Options) (*tls.Config, error) { return conf, nil } -func buildDefaultCertificate(defaultCertificate *Certificate) (*tls.Certificate, error) { - certFile, err := defaultCertificate.CertFile.Read() - if err != nil { - return nil, fmt.Errorf("failed to get cert file content: %w", err) - } +func hashRawCert(rawCert []byte) string { + hasher := fnv.New64() - keyFile, err := defaultCertificate.KeyFile.Read() - if err != nil { - return nil, fmt.Errorf("failed to get key file content: %w", err) - } - - cert, err := tls.X509KeyPair(certFile, keyFile) - if err != nil { - return nil, fmt.Errorf("failed to load X509 key pair: %w", err) - } - return &cert, nil + // purposely ignoring the error, as no error can be returned from the implementation. + _, _ = hasher.Write(rawCert) + return strconv.FormatUint(hasher.Sum64(), 16) } diff --git a/pkg/tls/tlsmanager_test.go b/pkg/tls/tlsmanager_test.go index f91726b4a..1cee20276 100644 --- a/pkg/tls/tlsmanager_test.go +++ b/pkg/tls/tlsmanager_test.go @@ -1,14 +1,22 @@ package tls import ( + "context" + "crypto" "crypto/tls" "crypto/x509" "encoding/pem" + "io" + "net/http" + "net/http/httptest" "testing" + "time" + "github.com/patrickmn/go-cache" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/traefik/traefik/v3/pkg/types" + "golang.org/x/crypto/ocsp" ) // LocalhostCert is a PEM-encoded TLS cert with SAN IPs @@ -76,10 +84,10 @@ func TestTLSInStore(t *testing.T) { }, }} - tlsManager := NewManager() + tlsManager := NewManager(nil) tlsManager.UpdateConfigs(t.Context(), nil, nil, dynamicConfigs) - certs := tlsManager.GetStore("default").DynamicCerts.Get().(map[string]*tls.Certificate) + certs := tlsManager.GetStore("default").DynamicCerts.Get().(map[string]*CertificateData) if len(certs) == 0 { t.Fatal("got error: default store must have TLS certificates.") } @@ -93,7 +101,7 @@ func TestTLSInvalidStore(t *testing.T) { }, }} - tlsManager := NewManager() + tlsManager := NewManager(nil) tlsManager.UpdateConfigs(t.Context(), map[string]Store{ "default": { @@ -104,7 +112,7 @@ func TestTLSInvalidStore(t *testing.T) { }, }, nil, dynamicConfigs) - certs := tlsManager.GetStore("default").DynamicCerts.Get().(map[string]*tls.Certificate) + certs := tlsManager.GetStore("default").DynamicCerts.Get().(map[string]*CertificateData) if len(certs) == 0 { t.Fatal("got error: default store must have TLS certificates.") } @@ -157,7 +165,7 @@ func TestManager_Get(t *testing.T) { }, } - tlsManager := NewManager() + tlsManager := NewManager(nil) tlsManager.UpdateConfigs(t.Context(), nil, tlsConfigs, dynamicConfigs) for _, test := range testCases { @@ -296,7 +304,7 @@ func TestClientAuth(t *testing.T) { }, } - tlsManager := NewManager() + tlsManager := NewManager(nil) tlsManager.UpdateConfigs(t.Context(), nil, tlsConfigs, nil) for _, test := range testCases { @@ -323,8 +331,108 @@ func TestClientAuth(t *testing.T) { } } +func TestManager_UpdateConfigs_OCSPConfig(t *testing.T) { + leafCert, err := tls.X509KeyPair([]byte(certWithOCSPServer), []byte(certKey)) + require.NoError(t, err) + + issuerCert, err := tls.X509KeyPair([]byte(caCert), []byte(caKey)) + require.NoError(t, err) + + thisUpdate, err := time.Parse("2006-01-02", "2025-01-01") + require.NoError(t, err) + nextUpdate, err := time.Parse("2006-01-02", "2025-01-02") + require.NoError(t, err) + + ocspResponseTmpl := ocsp.Response{ + SerialNumber: leafCert.Leaf.SerialNumber, + TBSResponseData: []byte("foo"), + ThisUpdate: thisUpdate, + NextUpdate: nextUpdate, + } + + ocspResponse, err := ocsp.CreateResponse(leafCert.Leaf, leafCert.Leaf, ocspResponseTmpl, issuerCert.PrivateKey.(crypto.Signer)) + require.NoError(t, err) + + responderCall := make(chan struct{}) + + handler := func(rw http.ResponseWriter, req *http.Request) { + ct := req.Header.Get("Content-Type") + assert.Equal(t, "application/ocsp-request", ct) + + reqBytes, err := io.ReadAll(req.Body) + require.NoError(t, err) + + _, err = ocsp.ParseRequest(reqBytes) + require.NoError(t, err) + + rw.Header().Set("Content-Type", "application/ocsp-response") + + _, err = rw.Write(ocspResponse) + require.NoError(t, err) + + responderCall <- struct{}{} + } + + responder := httptest.NewServer(http.HandlerFunc(handler)) + t.Cleanup(responder.Close) + + testContext, cancel := context.WithCancel(t.Context()) + t.Cleanup(cancel) + + tlsManager := NewManager(&OCSPConfig{ + ResponderOverrides: map[string]string{ + "ocsp.example.com": responder.URL, + }, + }) + + go tlsManager.Run(testContext) + + tlsManager.ocspStapler.cache.Set("existing", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + staple: []byte("foo"), + nextUpdate: time.Now().Add(time.Hour), + }, cache.NoExpiration) + tlsManager.ocspStapler.cache.Set("existingWithTTL", &ocspEntry{ + leaf: leafCert.Leaf, + issuer: issuerCert.Leaf, + staple: []byte("foo"), + nextUpdate: time.Now().Add(time.Hour), + }, 2*defaultCacheDuration) + + tlsManager.UpdateConfigs(testContext, nil, nil, []*CertAndStores{ + { + Certificate: Certificate{ + CertFile: certWithOCSPServer, + KeyFile: certKey, + }, + }, + }) + + // Asserting that UpdateConfigs resets the expiration for existing entries. + _, expiration, ok := tlsManager.ocspStapler.cache.GetWithExpiration("existing") + require.True(t, ok) + assert.Greater(t, expiration, time.Now()) + // But not for entries with TTL already set. + _, expiration, ok = tlsManager.ocspStapler.cache.GetWithExpiration("existingWithTTL") + require.True(t, ok) + assert.Greater(t, expiration, time.Now().Add(defaultCacheDuration)) + + select { + case <-responderCall: + case <-time.After(3 * time.Second): + t.Fatal("Timeout waiting for OCSP responder call") + } + + assert.Len(t, tlsManager.ocspStapler.cache.Items(), 3) + + certHash := hashRawCert(leafCert.Leaf.Raw) + _, ok = tlsManager.ocspStapler.cache.Get(certHash) + require.True(t, ok) +} + func TestManager_Get_DefaultValues(t *testing.T) { - tlsManager := NewManager() + tlsManager := NewManager(nil) // Ensures we won't break things for Traefik users when updating Go config, _ := tlsManager.Get("default", "default") From b0d8e08e2b48d0135f11df30495475477868a48c Mon Sep 17 00:00:00 2001 From: Romain Date: Wed, 11 Jun 2025 09:46:05 +0200 Subject: [PATCH 024/172] Fix typo in redirect middleware documentation --- .../kubernetes-crd-definition-v1.yml | 8 ++++---- .../traefik.containo.us_middlewares.yaml | 4 ++-- .../dynamic-configuration/traefik.io_middlewares.yaml | 4 ++-- integration/fixtures/k8s/01-traefik-crd.yml | 8 ++++---- pkg/config/dynamic/middlewares.go | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml index be8be7dd4..6f901cb57 100644 --- a/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml +++ b/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml @@ -1478,7 +1478,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -1497,7 +1497,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. @@ -3908,7 +3908,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -3927,7 +3927,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. diff --git a/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml b/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml index 10382ea4c..f822b08f5 100644 --- a/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.containo.us_middlewares.yaml @@ -863,7 +863,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -882,7 +882,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. diff --git a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml index e82fab171..0dee0fa2c 100644 --- a/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml +++ b/docs/content/reference/dynamic-configuration/traefik.io_middlewares.yaml @@ -863,7 +863,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -882,7 +882,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. diff --git a/integration/fixtures/k8s/01-traefik-crd.yml b/integration/fixtures/k8s/01-traefik-crd.yml index be8be7dd4..6f901cb57 100644 --- a/integration/fixtures/k8s/01-traefik-crd.yml +++ b/integration/fixtures/k8s/01-traefik-crd.yml @@ -1478,7 +1478,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -1497,7 +1497,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. @@ -3908,7 +3908,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean regex: description: Regex defines the regex used to match and capture @@ -3927,7 +3927,7 @@ spec: properties: permanent: description: Permanent defines whether the redirection is permanent - (301). + (308). type: boolean port: description: Port defines the port of the new URL. diff --git a/pkg/config/dynamic/middlewares.go b/pkg/config/dynamic/middlewares.go index c820d9fcf..bb5f95f9b 100644 --- a/pkg/config/dynamic/middlewares.go +++ b/pkg/config/dynamic/middlewares.go @@ -489,7 +489,7 @@ type RedirectRegex struct { Regex string `json:"regex,omitempty" toml:"regex,omitempty" yaml:"regex,omitempty"` // Replacement defines how to modify the URL to have the new target URL. Replacement string `json:"replacement,omitempty" toml:"replacement,omitempty" yaml:"replacement,omitempty"` - // Permanent defines whether the redirection is permanent (301). + // Permanent defines whether the redirection is permanent (308). Permanent bool `json:"permanent,omitempty" toml:"permanent,omitempty" yaml:"permanent,omitempty" export:"true"` } @@ -503,7 +503,7 @@ type RedirectScheme struct { Scheme string `json:"scheme,omitempty" toml:"scheme,omitempty" yaml:"scheme,omitempty" export:"true"` // Port defines the port of the new URL. Port string `json:"port,omitempty" toml:"port,omitempty" yaml:"port,omitempty" export:"true"` - // Permanent defines whether the redirection is permanent (301). + // Permanent defines whether the redirection is permanent (308). Permanent bool `json:"permanent,omitempty" toml:"permanent,omitempty" yaml:"permanent,omitempty" export:"true"` } From 0f862f47926f002e44fe514303fcd18ce585d01c Mon Sep 17 00:00:00 2001 From: Sheddy Date: Fri, 20 Jun 2025 16:36:04 +0100 Subject: [PATCH 025/172] Update Getting started Section with New Docker and Kubernetes Tutorial --- .../img/getting-started/docker-router.png | Bin 0 -> 532685 bytes .../getting-started/kubernetes-gateway.png | Bin 0 -> 624839 bytes .../assets/img/getting-started/providers.png | Bin 0 -> 82464 bytes .../traefik-dashboard-docker.png | Bin 0 -> 899431 bytes .../img/getting-started/traefik-dashboard.png | Bin 0 -> 809874 bytes .../img/getting-started/whoami-localhost.png | Bin 0 -> 617209 bytes docs/content/getting-started/docker.md | 162 +++++++++ docs/content/getting-started/index.md | 25 ++ docs/content/getting-started/kubernetes.md | 331 +++++++++++++++++ .../quick-start-with-kubernetes.md | 340 +----------------- docs/content/getting-started/quick-start.md | 116 +----- docs/mkdocs.yml | 9 +- 12 files changed, 524 insertions(+), 459 deletions(-) create mode 100644 docs/content/assets/img/getting-started/docker-router.png create mode 100644 docs/content/assets/img/getting-started/kubernetes-gateway.png create mode 100644 docs/content/assets/img/getting-started/providers.png create mode 100644 docs/content/assets/img/getting-started/traefik-dashboard-docker.png create mode 100644 docs/content/assets/img/getting-started/traefik-dashboard.png create mode 100644 docs/content/assets/img/getting-started/whoami-localhost.png create mode 100644 docs/content/getting-started/docker.md create mode 100644 docs/content/getting-started/index.md create mode 100644 docs/content/getting-started/kubernetes.md diff --git a/docs/content/assets/img/getting-started/docker-router.png b/docs/content/assets/img/getting-started/docker-router.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff33493a87cefef74b5753999a84a9ef648dd56 GIT binary patch literal 532685 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�a)~1+yFMSwb#ZdC>kCTw5sSY(_3+tw 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
    %@^ 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%0DfsJeS*^}`YDH8)LfWz-v0 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

    !-;&dT+XR|ld@nW0Y;8!}#eK}>8|DZH? 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

    r`84du zL51c)8d#Hv?AipCS>>#G!+B)rJN`k;69Uq?B8t3CnbL8k(-XSsh##SJ!jk?mb37iV zOOKPSL>hA1mbK@2BDBcjQb|#EIxw?j+mURpEd6`@7;-H1rn$pR&j?GGS~AJCX-P{B zsAg9O^#jM36`jw_?`D@3h`Y~je`Zsu#U#PS@a|~T5t-9qb)I-pw08kgZueR2N+xwu zZH}U>mG^P9-)S#S=hLA)p#oIQNpVViK@PyzFWs?g&!t(i6QUON9ZghgjuAVX?mf6( zE23YL8q~u)(SXd$&GE$HIgVv_P-^?kGC63(Lb>CLA$^4DlGmf z6Z7a%$xOT0m~)EppTQV^O0=UY?HgYIQCcrS5(?1!JO*?5uP`iOhH6Q1Y+e4Ago&-K z;Qbx648Lu=zI1}oMxFPwdCPffDutq6S$)r^?qG>W`n>IjQ)YUV?&&vJ9YZtE zF!|V^F1D$ytNVv57ReU95m%zQEV@t7>3D6(XrROBM&PMp8t#{NOJ3C7LbPR8JCB-D z$9s{igcoRzTHUd;Q z?5NP0rtm~kcLN7*O4Hyv*;3Olsgv$`!5h+5UmCNrH1F78#`w=q3^v|)15Yn`G!UKH zqvOf&0_%6{>W0qbmF_rXE;;I5NV`RGm1jkUWGenZBFi@OCCRoXDY*uz&g28sN6A(z zmzbM_mOMq+b>1x1VlPM%6*W90n!^+)T!R^jf^!4SZ_3TvTYTnatR1P_ zYX(h6+yXa`woO}PJ#tK|oLG72GI*+}qiXWM4~1)!hhc56O;40;TQIJ;F2wu{;Me@dXw zYKYEaI>=L<&+e+){{HnB{@o9H(9F|V{Jp$O9!u8!ch5fYbI86MJ@+<75z>%glj(bm z+F{q}r6^pS#H)LJ`1`;7(ZgK-aBGH~-efrgdG=d){S;>poKOT>@`Z@&&TloOjTHV+ zbzWIsK01Eof-RQZ*OL{UmBn-m>R5gEcR&8*ubyDvaZE6(@~?O67SEIgL{^^J$JgI{N4sXJccWCXIXt`*9SLonU!+R zHH7i7v8b2XRV`sl^DGdU^?|iKyQ4^T3QHwkB)*Lar~3OBzd#N<*|$c{w*Ifb@v?4z z?CDq6_0$m3udXVSoX^c{MY~UY91ye@@%!&`+RFS#@?4` zGR~PY6Q~!(M`{ZMPS4IZT%P_zyzs*f(OFBAFZcf4J%43!|M`bkddJ|3U?h5y#gGZfsq@2{@rpI_*EdxD3GfY}I% z2fzE13+MMk$JM^W55KH-@^9T8$>FpA{yKlT zrI+=A;UC-r$mZyNWNA9~@DjS}!_%*HjPH^L6Z6XhRR(@>!r@6g< z&%U4Egqew<@^4iC{u+M8kpJVu?aN?7w5o)%e}5k8cb5Mr7afc~`NP=j-+{@>$4EIJNMtCCuEB7*1f5_dI$xR!BV{;- z-2(GaLuv#!TJva+EAyE4_rk3`%+ve$nz<;0JI>_h`@^027Y?iaH$b)MJDXa$VzwP!IH7x!_%1fBGPoBp zSfZI-PWMR)@tiM|dny$ugzVx>@txv);@r z!hh-){a;?v-cjVAxCfvuKhRg1w9iOm&b9rTsZ!#tW%?gBnosw0-dogJPp#gteugiK z<@jBNU|J4>|4Ifbe(K>&4rt~`)*1bWOyIA}@lpcI;pCBzeJe5jXS@yet-77SO2T}M z2|4j^y~H2<@_Vcny+o?!-|We<{gDFu)+`!#Yj-c7apcUo#vm^HJdMRG=Wd8*o}%*62Q#<<&Zbr(bRWw`2isg>`D-xw-`(nu#QL`{!SxZ4d~t-*xz|CIzy32MxU z_`cgm{>BUYwz~hsx;Q`pj`dMk%(=Z|%8yvwKmX28L*H|s{515vjq#_U?->w&dh|U# z%ukQLcewlM(f^ECz6QXb(Bv63%=mZzX{9Nax)+MXW$ z_@hI8)QPJT>OL`!{?yH-wi<$aJjR%)x__=D3 z3)g(2E(p^}g&d1=6=uSY8d}yc07X-mW>*;3WIppDOY>rXw)sq19cwlyl-`xt_uwz{ zrQ9rz)Q2o&b~+dK4TIDN19$Cdk34??G`Z@WJ>Iz=-g`u}(Ciy?uHm1rsp7BuQ3=k+ z-gprB2dw!&fw@kFszj}+3T*iL1E=|IW=O54P1G{@j{fD0v)kekX4Rq#F0O++3!r*4 zE@3frlm7bd&VlzL#Q{IOo-ZFlYnI%xIQ_ks8@sAZGWS4!tGPmBz;3>>Ibc6NV@!I^ zd&UJ15lTYcC`*%zdLLe%Nw|3UFMfyclvy1MPc4~{bW=~RExNoJdEI~igXSMUNX@JP z-EMUq9W(#*QQUBe)(2|G~i*1&$8z4p@|zk+)*gx6flYPN+h zL3%eUYhPWbVQTtR)zfI(>u(<8AETsi;?Qgk|`*?Vjq+Y_{jWEO!oT$0+5F z{o^m+`exz(b635(MRH8Fu%%FR-?!y*q1q2Kfc@&&XpY$uP@S+GZ)CA)!A`cdnrq>5 zSm9?fXiZv}{)c(+w?Fyi*!kF3gO#?`@ZS74mc|k0BRSR@mJM9PUQC%@CVhUY1)e_N zrengxx>35h@$``*9U_!c>Z=Or#b&!zn*Tqo<+}AR;r3%>=1Z@_ZV7b_`-z<10bv6d zs#A^6Ufm*Ihw<7Zaw&I}-pMIOep!c?$J{`ZSgZ*p?Hzr^<9Vku3|jYHrQ)xGnQO;P zksA-BDhT-tVS;HjmF>~@8(p9%LZMb_?OSQvM+73U#-4^&lPz2sWm8j0^6AQ_b*BHi zRmG35&%e=c&eIPJf$4VftKr+#723XB?SnV(x&OKa^Mb{q&g%Vn5&wlNRFn}li!gln z<<4ONiO$?MEj1oONsF*pr^85Zdf^B@L-$tMi8C~=Tjml`!pIMEw5uvQK~Ibey12Pv zsF+S<-NA$JnJyT%rxne=UK(DgrS^sysEh{fy=VLc=GJ)^;sVQ@?yBD%{<5j-luo&~ zgUSP4KP3+<`qm`vB0iPCwM=#0+WJt=;a3N`N0$v-lkNyEjGzKu&#szwaH~7cwuKAR zN3{rn;MH;wOvxKs?J@C%3HQQi2Z7l#OTo>F;m{+Q*g=bB^IMkL%0Z0HCDzlO2C4i+ zC7c5;0zB0A>jCR9qFD=MhWy(d(P~3mV1vFOYFyA84qN!RXh*56HJ)2GJ(ILDu zICdIV%{c5%ompkmHn4R}%JlC&$a^NeCM)G<)fCoEZkTqwkf7u&sAoQ6jH@9G`B2iP z&aPddFt^+@>`*_Y z<(LyuVw8=61iWZ_HkFI6`37wo#D4Lx~7P&ZlJe2t>IF0+i7 z%b@lAJ>nlc#JP^eKA3oP*3vfz`}DY5SFUdDD1zWgsRzC%s5u2I$`L=Dmg%gt=`o>7 z9vf}O=bspiL14JBfxNefC#Fr^aZHT^X|`OMH_4PkY54V+5aFo{cJpfHi#O@VX1nqY z3yW4urnNzRlWB7!NJ0HLLe=Sx)Bxr&p1;lPDx1v~{GVTe@v1ir@*@=J&(qJfbE-e- z?Wbn-5yu=P8b{T3Hz`bfAZRcTG6$O?2%pOv*1h0s3MI1l?@8?lWuH%=u#~#L{D|Os zs(d;zRRxH7c)uQ&w-NyNHJlsDsXg)*qp;j!-h^DM-glU?NUx7jG3wzoQ;uA^GM66= z;GJljo>2q=3?_>yElcZ3r>lbNgA=$>BHPH4i6QS;2%tp5g};7{p^TZYT9ak9{l_G= zLFYhR$aA|p&-3`%YpnSiI@1?4x7H`RmX_^i^A+mU9B^CaK4fbz&-E!JDHjvDQg@bb z(+qpEYcDohtqf#%YWrC-N)Y)xMoOTu4+3=~{W2$SQ^r)R! zBf!ej1&*t>Cy0iFihe~sD16Nuj4Er4- z^*A945LOIg(bWJO(Toabx!FN?RLgk{ESZ#V(XEW$vc;3W>gnl6mM+{5%U7CHtf$3l z4;6%Xru>9AlSsi0aAYd9|4Kevq+Jg(b6B7Mp5H1I6XkSkZK9`eAjUp8vC`CK zDXeJdeQL}V55GE9+wxxv`V!_WxFq&HW2h3wS)`18Zuqh!i_r4h2=?_8a3N~GOTKmQORUN z^W=vsv6kbkchZ&f7bSEh4&i{r0a*{vx*8~J5b(9lmQ0&0w4$2sXBc$oj1^qH^v6@a z!aadSuCdkB4QKlZSh`rtM_PEdmm{n3L3^jc{8|&rn@R;H)N9Xpv(;i}P8UuQS`=u< zJ`T8yCN{<7>z_P(&4<}$W^+2j7wh(PBhw2~PGX%lgi0jQxxi8h{U%e>axUS5euprf z3>G1p1nXd<@o-1=aLdMGZ+w4pE)Kt$cI(g%rs;#@8fKaxI196|W!j_bdUqGtrLUqA z8i*TE$=V)vFmD@S-~WtG5fIN%@p$dE?adV?CtpdPu5;zvt6{iNwhO-^jz*|vc*{L| zCwqRR?}|qaNOTdGqWjPJP4x2N^A5hcC4=PnvJFR17LC2AsKyzOQkWmKY!VP@6c$(u zO&k1`qdhzBw`H&Mxf&Ha<}L3M?^fNdc+c0Odt{RHv6FFYQgim2FlLKUE&Spar~C~> z?e#y^FsrWk%ohX%3x7WF)pgDXRWNm%vf%}fKgewc>(4xk07*tQ0IgyW-`-pIuS~Uh z+hEW%9+Vb0(vYkCqc61WkHQo~mzkU;DTrVdUXoGjGdJ1R^(y{Az96A159s1v^G&%- zbs=h}i2yx7QVCM6)}hI>w~zjDXIT$%{P@O_NQI3Q8&eowrYU6RdQoY>c+i34Pd;AQ76=D_PK+BcEs7!|f1ZZFA=zAA=NB?-1?;UH%oJE8cM< zmde&=drjmNy=w_O}A4o6l7tHcv{9xLE zCEEG*G~;wa%4f+r#gtbt!kUC-RgZX*bN+JA3QsR-UkR0x-kQW(>2!v`@bf@v#{8P) zncIm{eVt_w8j|kBUaQ|83tMk;-8l)sQ@spC&;lZnw+tAnwzrc}w~!u97eCx$or9FX zcBWK%I)vZaAp2H{)g(Dj|3x!e1zr0ea{@VMfHh$fi2jpEXprb2c>5SEe4*RfM_?%rlmJ@7$N8B4$Y^!L-5%yVh+kYl?Ci|9XC#;tPOx>P5HWo)KeSW zo8p?9-i27*CpwAnywIB$06 z0%6rkOI_wQz-aP>ce1T>2vrO1G~d}&zK%K&yYw;K?)9(i2CZ+yY2u$guB{c!zT4#F zHZfUp^R$h)p#Zl*NG@8x-n=&I7*^&f`Hg~_b$(3K!NvS%52s<=;&K12;q3Szx#cB5 z(HwJSOMXRTrV0qsgSMcrRUMBYB2Z)2Ta@7sB2?wk`#{wkt)2KVK^n93_ACL`ho3xI z(NT43cIV?fQmu&JneZ96bDVw}nY!9lYVAX@ zb}e*@jLX1k2H7O6LmpV&IO$@KnVlwa7756ta_H0q$dX8iql0Lb86226O#MWh70D~S zGZ9;g~mOs zkMU^kJe`E0BorO$mXg`!02-eVBuM%b-YT?n1f-=^;k@?l*EWImL6Mrl(^rltXT}KV za1~`dU4kSnR;y}$$PrO9+gW5TxVzPPIpMr*lyPA)MbxN$zd*d>+5{?5qj)_1$zVwo z@h^rbpA;ae4)BSWIIoGxS+?RL8avi!S2~r&=JyM zSR-Ly1-)F)=?o4M=HqOo;`F#9GZWhnt2_UGjoPT$T30pgVXFY zaW-$1lmK#2R$`wG%$IjowXfFD2KVD#W1LlaNUSLroDYi~E7h0C@f9KblMgSAu=4=M z;(5MC12>KQS8j*%yvL(l%R?$b1eB1ieEF79*+Pv@!EsfE2RWl0qN1G^np~3{xJ9gp z;~&iaa2PLTa3#W4FJYZ?_`RaWh|(&_1E!69iGXyk_VMQrLkMAB&As$!?g^yPME9S* zekXflnOHO6FBxn5nNnBw4I_4PG*nt}!0LZeN-+7gL1x;? zUo%qE1QJa?-=^Sx5S#V{e|x<|n%OXHp_x8le;1>pVY}5@$VGjbMtulkn4+bO%29sg zmn@<35!!2|U9Ir^lTuW)N3bF5qd$ene?eTpEX)hQ$hq@PihU!ZM6dQ*4da=&DVriUs9PunuCyA|GQF)U)}M(FFQXjC zBmyq)voYvBk0o_ybjKrYUBaDL`P^BRG`C@5qkm4$!H)P`@eaF^c7)Ly9tHJm_pFBS zZ-TLm{6(xR0XxEp6&>OQkec{Rn-*p7v9f9VcYzp)v7Sbr5vq8eFQ;Od9>Qg4qvWBJ zu?tk4cA&3eRhj*gg+b{`d(ZHPH~1Io{C)S~3>>>XeoP0CkU{;u)JbBIG zPh{e}>wcKK`sC4$**!rJz~G|;Kx-3jyMv>Xb3#>tE~6|0CC;0gQDTq=H0)@kgs9@i zM2q(WV8s{)208pTVaC1|xCOT1q@WHYhZ-WN!De(eCFrxmAv&GalOa$GBi~hwl0kc( zg%z1*7t$w9wYf4)vAwy<&|dKwVmwdo1*T-GX#U}nx350T%@$nruU%{m+)QBiE`(}9 zwPB_|6RL!$8AiWs5HiV{_5E5)Lt;B1baDJDTgmz}$ftZ3_l=O{3xXDjFFDzDo9P$1 z-5|VrqDe3e({)QpIw41-DediG3DL$;jdthO&*OsEM~{GD&TkXWUGby*Kq?jb71l_f z@91R4+gy+Jk8#;{uorjO_T|wAOj0LNJV%8XkY`5ghKvgBE(Wr5e%=26;)C0JEGcg> zi!k`+UDB-FKqgjf>4D@BCIghE$2RD%h;XfMVF$79v)$Pf>5WVU{RhU10+UO3fr^R>cBZ2b}lud}SGF%r;%4D%@bO9*5 zA)lXAhNk!&OCk5Fk+qJZSFEw7bn5PCQm(Yz` zTE-?u6sBeB%i-(q=sB?kCC{n0R1zV2lY))0W`j(5^9fClapwnY#@WkCS2hKQy2c}Y z+vL?)u$nP9Du2Tkt}40uEtXz^EZQZprnZ&cit#ybwvuz?=sel%g~`yFP~AvBSE*gy z=7nXWV4q;4$tB+mHSb-4;D-{*c}8TD0|}Rb`bLsp@i@wWdtiGamW* zO!_Wlr?qAF17b^Kj#W{+izH24jW1Iu61?t_tg(>BVC&n$zr; zie?Kg>6Bkjo6tgS&-nS0k43EZV;)!UV8(^D<*o2&8xW(8wN@gI3t}WSkkFD-vsc88NS!k%Vj$D@v zo1tDBYf!Ob#u-3vc2A43Ma3ad(n9%;ckU_kchIV=Q47UDiEaT~$w>60@@ia548Gh3 z(D`nt#*>@FyH@uLfkE04vy4aNMLKMDb%Fp6F;(gA&T;eBD6fiRQ5mCzB?0R9qM#N) zxsqtI051OdE&2FcLA-I!n2CYiMGNFVRx@3HUOOo2r9vu4QrxZ=P$3+UUmb;dx?3Q*7tB8LF#|P_to? zEuIv1K}mAIx36(@oyzNkM9yLio8cQ3SC0kksFw9v)ES$1e)K@-&+5#=usx@TK@3H6 zkezyg_vReGDx0O;6sh}lv+I4BH8=2|<4dJ7d*y~DD~awpZXQi=ttej@^42~wg-zW_ z+;ifaPU7M{6P$QCP|GPTqGq%MSu270+5nnCuK}3iDo=V!jWknSr1(cChUaJUt*AY= z7G45jOoRJ^QzMa3d2Pm$tqSe3R(fKbRA|#}eR}kO7Kp`*tI;=fV7b~f+o*V#v8Rzt zVccCTpl*cJTIzS0p2a#9B4+K`>!YEr|k0#3tfA8jMi_ZpT=1;zB^pV*A$VQ1ZcPV`bjZX07F!Q* z*F?nr{z&`PjfdzJlIut)y2gNjD3K-gg~3JMk5z%hRN@0i;xYY%A%%8W&D9eMYTJbm zSI@h1t!V&Nxp{rcQD|C$t*UwZlG&krn}NN? zX_A$xU4FKnnu*Mws0Af*%kbu<MLD4&!0#bsi4d>sfwz*HW?pFtD;lE zirR=n1a}vToU8F;(GV5IC9xZHI~)txO{bsYz!#^abDS5HyoPEhGT6A|An9V?tn^rt z3RK@5u#3g>#<`N{_(odSg%~1-lu|J3RH^JR)$k*N1Y!!FF;Du~n}G@Tkg0LttocfC(e7oMY;KHrtTVaEK`<L>*`Dl6h4FDKiO=s;gQkqBGlkcpajE zFP8P=Er=T*CRDZ^_B}BC`$<1<&9xxvYwL54vf8-~7U^}WS)YsOqVdOX48+ExQSvq_ z0Ktb)p}F!lWOpiDkn4a$7uy3O>DfxtY~xOijrK9tA&1`pe9;YW=JXgIe6&mY$m1x> zNm*Ql4AAikaH(t?G6pRw@5IQRjV@uF_Su5zMn20#jrEJOZ-y#2HgIo5w=+_g@*rP9hKG!TcDl;w^5u?dT>amZIE?2 z+&GdX+1r&s8zU@tbi>UbU>R<4>*K0xoOf{Bx+~OrD06`drjt>uhJSMIHqi>C<+pdU z>n{pm;VA27^StJpp%869#wAs8{2Tk+ckPz5#XQ6vHd3UcToy(GwJr9u1czrra#>?s zi038iXyt$Dkx5fBn|mda%jI$$LLS%H!)A&UoV|beoPxTwHI`Uo<#&0tV>}FU!&e#_ z1#=a8ZF%QqCLY1Ojjn5EX^J-hwDZCNnu zey0g;!L5A?8{JR>r74~1E$Z~g5~~GFD1LJjjjeB7;{^ZPMy%1 zZ8cR0AqS-<`;il7*fOgCx=cISk|q6$gN>J7vcg26(RCwdXZUh5b441U+4=3QJ;qeL-;$qv>S%#sQsyIns z2E}tEA*#I_(bf^^EW{*_KKU0X*RRz zxc#W<%u?<~p|$Yv9S_PD;kh!y`IuqazO@8=4c8^(xApD zZwJ$ik8Z<@AfEfo$lnDlMh;*L3C~O9b&h5TU}h|}K#rU#_oGdZF$s%ufe+*nqf{y_ z-lrg)_FO*E@XQ!n86%_)L62@%VOk7)%G@wL&|AnfW)`sVCI0?v7XN zkgaWPqpLR)F~N-y0*JaL5DUjT_xR3E!kCCT!=?Pm-Eiu)eoN_Wns`h*PtE9Kg`m`z z`ws^ZtJ=<(*VdZ4E`{yaWi0NI`NewQmtFv9%kcuiN9M#UH}`#TXSD;J!)j>hvM51+ zVJ#CG6e`|BtrWO15}XPo%a%iPqfRpnHaJ;q4!G_nb=p>J6H~F7n)S7m`)}yGK^jxl zYg)mwLQcv%AIz)e*~Hzl?FhYaEG3U2TO=Pat>6xrYd~?fc%TxhAs-4|Ly%*u?O1$= zMg6!rs2`iM=C%b~tSZ?zn#%=eKSNonT&mD;gZZ$0XIBDA63V+1t2gOsC|@&JqO(sT z+S(S6`h;;$L0xD<9?2z_sc;D_i=@}@<)xsqwtsqPHpFuR57-lvZt#2_a|Q!Xp}&m~^PMJVP(SS>O%XKL(f zd5Gg$s+6I2Ff_+>SEqUrXYP{xKCIXz#!?I}iNwJ;7)OHt?^Gzab z8@zBcRGb!>H4wh!bH`ALt|8jk21?%5&S9_plfm69w<6R`dg3ih?apic6wa7cPcqJ(AX^Fl-P(R<(VKThoe%7U;p7?~Vn4-5 zR?U3LN}&};;EgyKBf z`O30sp=^A%Bso&$P4ZMXX8H}jKj-EOTS|o%6A^9(1@FYxL}#{arAdn|D}&%^cVFpk zJ%e7`0p!BSNom3~*RH2^v5sqfN2sL-2&~rEZ0rv-$|}~rOAIGhE3xwBx1M^w67cW? zDz_fz(cxMsZXyZ?K-!Zv(q*hmQ9nM2qgGeJtZ&&(Ru&Q|SY%88WR-ZT`0lBt$2R|hj@hc2QCz`4v!d=m8^Y1RdjU+xn6 zahFP?-=6jNl9d*4wjoe4D}!u}eznUnlX1I92G>~%T~pAh<=q+67pxOq)y7~sgd7gt z##DFd?yek=Lp2F(-$spesQbgP_yid*!jQ;^s5-=0Ls;zuyY#q|DhwT8mS{FuYJfmq z-Xws?v#F)DG`gtYeNkRf(>=%5fX3+pEw%kf0IAc?OK5B)u*mKSsB&<$n|5(nGOHOP353o;G)fKE-e@e9xk~gc)PAwIz5eGdRLjO6eoNCX z5d0Fid)jrAX1Qt3qD`*jYKNK)1Mf^3u`1#eu5o*&(E%%1yt>QiU=5dzvPk;KPI@e3 zP*y9`snUH;Eh+A{8zJlMa^`~06AKIUQH0iAci~STc3_(xZ&aF#vlicXcNSh53CwHkPP<`AMx&_xAIZ5?>7o9&JK8Ev(WVi3fjw8L45m{P;+jE^$#q=!It6Nn ziOPxWf%1hu+W{T?M9CEfUNeXJULPV{V^#6tqx`OBm9I)$Ym3aAt``FFlo;jmf-G03 z4o_?SNr3&hGOE%#-bpRN_eN@4YMA+Xx__{{ld4`=-y-E-_EXde;@8>tyJQ$Q%arM* zFM>~^);RKtJ2at=ol~nTw)rX`jXsQODi2A2b0i~`daWC8Y8k)=Ht*W=pp%-$r#uby)qX$buXKia%p-<+H z(kaL2@w&T(+wHqvx{>ej{BJ}h&KHN77ISg;S>-;IEm^3cc>j>>y+={}A%K2Y!(Fab zNc413sqzdT#C1jl?B7L`@~55OysRFClNa}@qJgL99G&Eg=bTc}*-V&zI_s9`E4939 zW&7?Fnyf12B?aF393n!P4z_T<4^}a`6MwHj$$Dryqtry{g3`vR0VOW=?CpO0@vI4J z(WZ4k5MIX5WHT>4I@E03(HGOh+Nag#u;MkREmdYKf#xUYG9ra&W;`Z{!lcIf3n#QJ znW7Tp;-+()Zi;jUx)kZw$biw$mCnB4A>>~P8?)6K2t0!$KF%bvyJgwyv?Qs6=0y=4 zpKVE3QMKtBbY&YLH zTP(~D$_5hKepCWM#;uu2;noj!Z(MR1tpmd6B#F9}`Ph=z!|CqA0lLTdrMWHk8g`X9 z&4uV+?WctnC$zC`T;r4&=+22TAAY>>@i5K(?l{TI`nk7tMu8XheB(g#qOg0NMBOXT zJk=@r-C&7K1*?YBM|WU_t!wW23$6MN79f$^JmJ3X;0{ki?HcF zo!EH!2n(Spa@&L%L?QU16tE~WyH;!mNt_a(onIcp{_zQBWF#^hrO-b`q%H;Q?%E1bwS{#!WX}9fK zs%{1{9i^ibag3+9RHk#dg{np(qk);%>RE zkJh;%@y{PAWYTEy$Db|K@V}KAm0n;((j*dvFXwlhs^B)0uuYM zI+D)Guf3bcZtT}TU|MQpymZK|fiarUfa_zBXZCAcCPGRr^`jYB8dH@7&oxGDHvR=X+mpeMcozz@5Clj;fx4AeD0pPvnK%5kO5!uvY zY40$WnzW3zy#~#3U7?IjnPnCdb~-ZdZiFa`_@~dI)$RPrv0%Re$AJUQ8EU2BJL4mR zCD^{Z%?NXc=BBDqrkx!OI=jWIPS@q&Aefjht6J&U-OPy%UUwHkOmC5*StX9{*ooHQ zKUjy5BL}4fR-Tjcnu*>Fe|P6P6;)!mgYwP#_?Vj@+e&9rw(z)UEfO;XWJG$qlWb?# zuk@?FZwN$U?qT>g`q`ZoKIGkuEfY}>a!I1!z9${sk}p1f1HG>far#QelfDw$CMWf_ z!IC;w#J+mB8;tx!F`-O3>r+b=YgS?u5hM;Z9G<6cb?B)X{TD_R>o-=RYd zjQP+ab)6RC5xNE@zzZ zK=>F6E`N9w>LBDWL-VMSMm1|Y4L`$CXDAL^d1Z>&^&x6mdBNSCh_^N>E;bH_RTOGJ zdaN|&P4>ncs#-SW+mGJ{8-N2M><;xPu_nw&;AYKW<+$z?4>VuzEE&xWs6}6R7|g=+ zVj~5bdq084ydTplD`BtXeR9H&JyX@5KH-t7u z0vDirX6&xyK84AC4vm|d%?j%FVvW)H9qIx#zOLCJ9}Uu^#44?gp%6-#BAh!qnOIxH zGvE|Bnb7%k;qow4aD~~8Ca6N+=xe)n4~j6=g%heGUcXxHv#q$%zq?*5@_m2toa8ai-s}x$784`>NCTrNuhpNI;7zSx^koAg;oBd-gb&sp&O3`=f&89x%K+Eh` z>kGp}Q7Xn{6_5rGxCG--aQobettBRM+A5S@-IYGIE&AcWn#eI}JXeluzLaF(Bs7B( z+c8;hfSTuADhNZNsr>mDpVV{O@i#+FxsdrPpT-TFO+U>ycOE0)+mfglfXzt6!?dkl*hNY zV67Syi3H@8_2X|frKb=vcK@=tNnu+3o+(pRAAwC9R9&~NLmi0R3*z7Bauk`oqeb{& zci?32k{qc+Emih_3+6t4TZ$Z$dc>9kUDhf0zW6MEc>BqNU&U-3ywE-yE%L6tML(%q%URU_XMh694L% zXJAgWD;Jq654|b^%8aV24)3aQgi!f;!0gtHr7K^bZcoQ{;=G9EULN{HqBVRPYp)Q9$V7Zh?MsLmEFn>MO1@`jCwIsQi{{MVlfZQQ>I^l0gphWl zkrGs_VqLcL&$yqawwgb!qj@wJuzH4yraO@qtl4|A9c%$zAC*89-Xe^dp_oM5PR1iL zTJplU^(nE_)K_m$ z?Koqe-6~VvHDHCpW4B)%2^V&t{=jtTC~3%&lGs3x4;e<{A{@7xSh@3Ai8n+5hu?b3 z)`ygR$W){lhgk7cq?3hR+`UY`VrYfyVYe803ytx1K9qcC%C~Zgo@RfBJNKoWr7CQ< z?!A8wvd&7_u8~knCc@rc%!eyOCDS<~Q+MBs~U)VLC|ALF=M zFMK4P=3zIGLf%u0vHl`n;;iN8W!I2EW`QN=Gy(FeiqjFd>MMzgl?PN#PEQlr3wDYmlt z*8w#W(axN~FOFtl#(L1+FUAM#)pnLq(%EgnDpgRq^m;KJS(0|Zc6J?7FM}oA|@`e@z_J=1TtajHH=ut5?v(+hrvo*dH*SdcZ z(Iyktx*yjtxN)nSHq*N^r1B#t8-M_7~KO? z-c<3o&D5ZZH`I!f%FGJ0+Rn(i6`=@GNh`aWn9b%bd8)$sqB&^2@glscQ0@efGoYN} z=Dx*^NHj6vB;K9%lV^lfh-F&_7IEu#&$d`fY*;{AURzPnUlL;Sek$BaW`I<1eM@57 zX*Z$%9h{M6D>PEijETmD^UI_iYOYrro4v{lH|}>Qwr$$lJ{V6H`oo*uR^IPEN3Xla z?9V?n!8_WDda#z2YgGoBm5_Sqh11~1`*Sd82+?_ib_{l#K?-zY>D~F3Q}uXjeur22 zPeJ7*p}x3KA4LZ&6_4oF=bXhCTX^7G32Xvjd=^RYP9bHp+#;Sx;R%h)+j6!ST`$)r zEhzx$gxgFpsuq?Kkt^iX96c%c?vWCeCX-Ik%Q%sG;|uF zB!}Q#HcSc`b5xA?V`9}xZNz*Ti{{u8QcMoMJG^Ck=y!k?q2}$O+ngxqn_osxpoUR&WRX)Z6=?@*EIG(&J=Hp434NhWLbfEcFBn;K-k!lWAAcgSu*^kJcZ$U41xfM~#dQpwiT2=C;5^j<^g7<6ekt-j}g|=|U zlGzeNxyO-{B@d@luJe{Yntrg_mF1wTlrIlyN?5-mZZq%t%L7Y?Zp85eqJm^*Mq~0m zmfulK@7HMZ<>a=5ZV9OD(gm%uBVRwQWA)Yc7owA`Fdweb5#hd|9V+{1nsJelJVms6 znG)FgVi&FjWJ7(UxZ~%})I1!U$!=O|m-Xlh>t|R5(5xNlw>->kX$Tb%jUni@@r?Bo zjJfw@ffk`o>^PG>9(B;N4yj#YJMeOJGa&NPdqi_=?X@LhmYuEj`kn2encUpyk;&S? z7XR}^jB>?jFuGle)OIymQ-#rvmn9v;?6s6s2!i6Yl7=G%Dn{9~L)#3pV^bADRB1V)NWxb}^{ zmDX5};i74K9J5oJQ}N(yZ>=cjRTj*;`@*ocH%s^ZDePg4IoFp%zFKm4mP{ieny-J? z%il<_C#YDO!({hb)NR`vg{`X8qNM#BT4ya^dp0LF{VKLANnBzw2Io=Nx4bj8Dsf2a zCsR|#`4cq|oRLnrT!L%ix!N(^?P$uUHV)8F|Z+6r065R+H6XVFSZaK8;X8dkdqo=0l-ZhBfRM z$S>;Mj?dOD0Ge#-SKN%c5;>kC)|KUo-EFp=V!6^AP41(0`;RamyW-JLw!76)!Kj)B z7ReQispYW0a-P~@JwUH5#k$#B?Yyc>ZUZ-)V|i$HeKIT=*6|j-)@bVDj6``cWspwR z5~V1&Enc_OLh&krtf_O)gp z6`6}iPP9!43$amtn10piye5>=rhfKs6)2A-J$nV7>!jmMzYr<`U<|ucRTASi2Xe5a zf;2Vfc-)7F4Pac8svfE~`jn0{?4c+rH`3vn3dI64=P2ZwmjIeFIN5Swo1g|xLf`qw zrGCDi#aOX;Ip?(4uCw6$tL^Nbj6RMP5@o&UoMXjgJPlvdg%a3px~dkFI%59zJ?Vwl znj(cbR!|9HJOd8&OB-dBsytM~ka>DTk`4#Cgov?IDWDU*R0a)ToF{Ul$ueL+J>lo4 zew9YpsrM#$0qCRAqvj(4*Q=8gBO+}(ohXWI`-}^VwicOEFE*g0glG@pQ$9sK=rJzz z?m?5jD2x(kE9Qk$xkcgHlaZ5fu1rC{_eBzPTR8xMm1DwrQWfD420iR~`bhgvD5+6a zv}$Qs{mF8g{2hioRs~gaIjbJ)ju;Zm;3Iq=XskRfTLCBW%p3AMMxE48R$5Qz>rn%k zk$+J3{xzeNV79cX)kpVG8|YRw?q$D-@zE&P!p#tmrUVYh#Sl`uX7%d3X`X0fFS6@Y zpN+1c_`H>doX`8_>oh0nqbv;A<;Gv|hZ&cc!(khCOJOR0D<2gTB+K|x@o4`79EbJ9 za-)`w3`J(IfA_p&+a`ydL*aE6UxZn9e0>;G1$lhB*>h_2R^=)sbn1>I8d2uE4jm;P3j0n!RhaZaXLR{)9O5 zada8Rg&88LnB)pX#wT== zYlao#B0b#8G;Ml&asI`IK1e?!xPGkCeMH|fp}+7bwH%GCB$g^xuHNv7_jy8-re(!N+44M?rw zKHJ>rSrRp;n=|Q-$=Z0vX-g^I za^Rw?pcoMpI)yJVL(0=@C)+q~i9%|3utp3AT&HdfU#s+>B;UqFk+F1Wu$^R9D_zxE zm>TKO>e4}^o9Tn0gFAm*>?4M)t&!0EiD*UcJkV*N`gSOJ4_^DL z3Em?HD+?3LDxv-QtqVN3*ezu~pwwQdI@2QQfR0>rEy&2_vLnwxK zWfeJTlXQmEmH`RMB@PR7qoFX(-E#k=x6kn^B;T-}#mfNi6KuCaj2-7VCV;R?)rV2E^Bd?(SzZQNaTfMCqzRLN|+N~~@Z zb!Z90{gJkJnYA+FEOM988bCWRfO2-#@mw-w*7ur z@P&C>I!DFJfAdIL%@qE;&0cc26%M#CwQFRG#a$>StAjj|458|vl&}H&ixLVwB-p}4 zV>Z?c@LNqNcA4qaM!7f`8KGRJCHfTTq`V*~3oUKjbe8rx!b%#xwBfYWK*CnGE`y~} z?`XH*r>(SZLjiANo$3k2sG;@($yDsjR`+`ChVep&!%X`b zsa-~zV~8;jg-tIS6iGQ@jOQwjBriNYtx#psS315NczF<^VbZk@6;RG?k=6B+*e)V@ z-nqD&fm+zMSCvGF=a&a)jrz)+k5UBVonjDq3-t7pFw;i7b2qJJ^we-OQ{Ty)9O!8s zaa#U-*r(ok{}-?sBy9wE#3wP5{LX4dT&wt|TN(p&O-&aXDV>!yZYjDW0knNWCKPJu zq=ZLX!<)tv9BbhO7HdIwj@nombj&P}UbuIAd8&=mGOg2=QVxmk(?uhP8U;LbYQ)i{ zbW$%U8GKwH+`{cL?Jd&mXN5O~oAs4t`{w1oIEz33&;MiZEyJQ*zqesU5ye0y6e$}4 z6%_$#3=}1$kx~$lmX;w#L=-{7tw@JT$IvyjQj$v745f5;4$rzN_4jx0{dZmGX?& zEm_Vd-zH)VAL8I(2E_oT=J1F)*LR1=gvn|Vc~nJZe>*n0gWn)af@ZYL3+enKAhf?b zoCu+)TI|UX-h9Z@6I@~>4$u(l@Bq8(nkofo!i1>)QXINF76Rs$&c~`G-Lwk;4ZkP& z>J^a**aYdALTjoM`1^5YGMfR<^NTXoCI zUqK_NfW1LgKHzN1x-yl_&AaZn%wk9$Ue}z&HH2-7M9{q&d88$Im5k4OVs0Jui7+M; zh_M6&w2sT1=Hi3BNJ>{jfFq@@a(+g>JJOqh(9!jbCaL4Lkl5XmEO4}pKDZqlqa+4r zr&QJK`a&NxU<~kw(;;E!4`i6RayoM`(dvL9oNoTw(bm$!cp1)O^=~nC=M*r@$v)S(w*R7$eWpCj-OjOVi+>+eBNybr#fA@hUY% z7H#+^yt>PoeXzxB5VZ2v!l~3NVm3z7g9_`(?L?TMkbNHI3m{n}AZNwj@HRV;@$cmW zw1+Ay@JclqcW-d7m0+C0U3=mv_8I3uV(7_~A_O>-`GA&TIv$J0v)A2deGuO0EHWQU6r~8d@?4}qUD59?hQI~Gk=qQ9Zxq!MaS+6UtkU7ypF6N$aCm~QZG6t zqw8nG`}@94IT0M2OWGvs_2cqxIeTbupWwjV|L~~Gm9tdb7}SJbG6vc(R~HTRQ{BS^|3Jaep%-?pe4 z{`??2N?%KQIsTnx0hIHvrPJhwfM;6$O~EkZJF|ZofSzzTBi3(+Q>7)^yBl08+S8E( zP?!i+Qg7YX^fA!@OLH1%l?VE-m@RQbXrP3^Q0>8UhtZF(cwtnK?5iU4Vc$s1&DYn* z^4~Cl12x1dw%S(l-G)d>e1OlfDn$p!jO0k70nQ)Or4>|3D_GQ!UdhWt>|yPXB>3j; z55`{&e^Sh{6GOu}JlB|rqw<+{Ig5Rebz!Vd0YFNYth}0uNAsMg+vW_DDpHM$zuXgA zvR{Oj$5;Wmd+{+c0onj=0|q6-6xlEpFmir|WKq$dT@; zXY&%B=LF6)tf$p(sml3GYUBF|hNHgxBWZY4(%{@AENhv6DTFpkaz-(?NwoH9)0S)v z(pZrW^TIc_GdR|5py+U3_CwT6b|22zA*KE$a$vg#jk2(s{963p%7u#3Edbwx5T(XS z3*^;-HRVR(CZKV%O0JJO+UDj+exQx+qh$Sz%eQ;p1||W;C3W_DPtY+(JS8awYZTks z{r}HY^p~HMcY!PJ9^0AM_oIhd8n`>-M4Q)iEw-3y$>fa=f}?8RaKgUXy*gKS8< zQpPhj#*TDW2{!I{YHa^?51RlPr0Vn}+954?eXctAvP1d|AU(rT(Q=O}la8gIH9+Y= z4ra5wltx*3g7^*6izJRM-iD*~pE_@^4S@ju(0 z$ug2K)>T|6kk)*`4vuh_k0rnBN3_li(kcwOZ{@$zDF=+^j8QJqp`$gg{c7b-$=x8e z3**-`kl1oor3<+Di#5=h;B?NO#%G=`Fa(sZYT)%p8q1bgCEmFLa-S|FZ_`SWNg*8h z;}xl=|P3u%4-KBP#myZ;aeC>}*DN83eJP{+yI zX|_Ojb%K8+wDf?Q***V|Yy_!*8M0E64lL^R~ zn2Bkn-i41QG?}hX6=E$LfS5JD!Jy((Fpk+IhVJ39&y~md#s$ZV%t?I?5$U*Oe zw_a5{U>5ook2E`3&d=4!A2Ue)EHAY^|C2lKopZ@X;^2sf&3&#=$f@c$`n!tPWFv5P zqy9w22Yl2NLg*>Qe2>eWXNFTrvFU)`9wlb{#$uE;XAzTJeM?A9o_Sr_Nb7n#*vX6f zSPplHU5qtiIl-Oz4pr{2CHnoOE#Em(IU9GWl{{q?i+jW21cxGB5KTa@8q7v-hvQqK zNEakoOQsGplMYN5QIp;YuL7wFn4XpTyES#62P!9(#94Z-C~%{j+!349lt!eQ~*!; zz|=s4J9@E;VGO@8QVjh%%C2J9vIRV&<5ccarL}2!oBNCPhyD-S1eAN&A%zM}J=*<4 zm+>zBe(#1S17WNN&HAr6RLT{ilJ7h=4_@asfHh{*? z3VAIN`6|b3T_@y}++pI|OQz8lK6f)}2>>P^BfcWWij-6_nU&42I6A5nEbtko%GS6k ztLLILIWjaNiZwS{ix zYxX_2t+syeT-s_e;!PB>lej39K^QfiVT_Qlsl-%qNcwGX$4Ir-)>iX%#sJ2;GiZ5U zKI~2qe{u1N18Opg6Ymj86hPG5-@WgTy0(E&{L>3TIp}vr|J?6vIywrCyuys0KyuDD zGYy0bLtMPr-O?KD*mNPo!~xL{K7`4fK25`I;A=HB#c4W^2I3vCayfj?>w%gN$o0zA zDw7&CHbO(R>%9wWWU@PwFk9etib)%^QH)Fnhau5$LpZvFAE5N7Wt`$W&vt!bx~1UD zJxe)m3t47btAY+=P%7;YyqDt}s*{-v^V?C4tRh*FumF z6&He#WPP;b(+8zAjHcctHqEqQoJNTUi&of9gY_!8jw-$5*+7?v16gT{9m4b5$%?%s z6>rA8v=Fclj#F8P9eR9$C7%Wr-B;r|kFpCDX|1}^={U!(9JaWi4 z!K^>ow$*InOx>`h#YNGE+t|QTFB-!vCX2><#kyi0$cbv$5XbR$3$dc$u#IG?Vs1xd zP1XA)^w0x0|0#>bg%*REk%K04lq>ar^Zn8{Ga3$W2YPmw#Y7m-TlNAH=!EpXrO!A{ zhmR6UZ;=LF>UhfUgMK}pq69p`gXh&{y1&2`R7mw0XRg^*^(afbYD;J9#I^$HTm;p` ze3>vNtyzG+tSt2vl{NfaP}LsLr}Oma!Gv4pRLT$Y5AxgGzi9OJeKj^z?#R-quX&q$ z;K=QkE&xz434NjQ-IJ#wY~bF{`}+;k)ntZd&or}*SXmA>G8yKapixlUS6$vZ6UN}s ztl^G3<|r+nX4d=VJSLOyEbHCNK5J(R3>r!`s;NQA2YV2nTkHAB$_Jo^XdWI(_e=Kv zH?(ehD^(Cb=0)$=^rPTCXT6owpoCQb#RPc=SIU|vOxhaWU{8WbLqxmF7PWz5A#{?0b!v~Fb z1o^cUzoe!^C@5hSFKi{8yWDtkA`)C;Wgd`=lZHGpAJ==u;VK_0L!oTBIA#kG7a`^$ zT?0>x%-;7dMG!QL5t@@`1PV`ZovSMbZqr8_#z(C8m zKzze19b^TVdDA8>ZCewH3m{dOr#h*qf3qsgb|H`!I1nl_!Sj=Lj1qyg2<0bhveU(L z4R$iu&FDP;|{@sy;e7PUhZV<9Xw|ajIiL#F10T1%Z?EPzhQM zK<3G5d?l!>3;5%15GPY2jKk$`RTYp-_RF3NiHE%e?7%Jp$@sF8V(5;Dwa$6@1QF7n zx&5xNFF*t}bAi!ovfK(>Y@tCKem_7inkf<|h&_NfOszR`(|PX5J8BYNCD=!%AEyJj z-{4+XDZB+{DKtDv6yU&b)Hj}_nQTPoZjw7#JAZ_nR4fcANu40^@^T3^xU4OReuo9| zkB5_7gjwe2a^W*hnZxybs2Tp#)hQqTW(WPpE|au{)TS=2=C2H5p6rT5tLig1ZqA)MOj*513;wg5XO}~5FHsn@h5Wre2*WC|M zb`|k40BO6lX*7W742VA0A^@5{e-&5HV0wQkODWMgsQ|YC?gHWi$`m?m)?#nbkk34t zZqnaWi11S>F3Q(Q-F~PN#LxJ~oD;g-2ThtnK?G~&{zu}PF{n51rgEVQNS~;@XI$gT+09qnM=2jG&x#$X=feU_ACubLFXZlZWo!@EWIJ+dy_9IY zy2wA-4Z-E|`MW0vE(A0p;)_(19vt}qhguU~9jq=&{g$ETPOquwLlBc%&neMqc@U@$ zwiveXs~!~KACW;C>y5_60f59V6chvei^L&mBZu7_FK^J>#tcpvr0FmK{HPozo@=Ll zJ$#4<4&MY(rnOlpoxHDyazHqRa8x3>XkI_65O13%5X4o(hdYyor((*&oV-O! z)?x}C*uYIf6PT}Vc1!a&NKXVc{Y5k;r7%4ynFI{sB7p46$49?S4kp0e7eUm%V?oLk zJX9+!;o?BXWfmsR#3w;-^TnR)o(s=ND;J_q&dldkS$jOHX%;%wXLjxvZIEVWS~SSZ zyPVJyXf2ymoa+nyqHH+CvVf3nDf*03Vfz^udde?TpHghvgp_-V2U{vQaTK6_FP`7u zH^N3Nf+#pk9kevRMQS5*&o!;p#x!K)dMQbFX#6Y$C$2q1wv9n;@*(CUfY+uk=PZ<7 zxhOqriMk%wtH{>YYB$@luxw3lH{5h^W-+}yBWzRU04DbcN7MZpQV9bjj+S^F8LNFQ zagDS~WP(LaYW99MDq85d8=X2FZFB`dL8jCk$eEtRE#dsq3zHgKwrmSjlWDodBfnnU z^bpHM%X3Qg$_s@8C*{2Qx86kUzcSt}LR@`ClzqeP;O%LDU;GVEGMlsLK$e*JEBe{y z3lDNDI1;9EQ{A8eRYg(Q`f$WMaKr*eDHNtA=Kn_%f zFN5s&fK|_{K*c+T@s}t2&F>}~<%)TJB&o5&oA<;+UCC2=B|dkFW9E5&7@2nwqCgDn znCX{p0jaFk)3WPU_sNzJ-bi6Ps>Ov zZBRqg#pQ4_={7{sxgO%g)OUYK{@e|Z+6CHa*Wl1u#YH*NQYaHGJN=9ZN*r<9^f;Z8 zZ}X|$q;Xb7ko?Aoucvn;9%R!pLzIDi-bv>*M!!~b2RUDCX^#@13X|f}jV;hc-^U=n zbS`IMIx`|u7nc~El)U4VBU$bJn>4Or;sJ*k!~zZl*^J*joiZtPTicWScDNzVhqPG4 zRP^4axZG(JlDR}!RrNJ|e>w0M(N3fQxzG^FAm(aBSP+ZJDrE+&Ch9imd+IJ#)P2Ja zxU6|S4~fIL*9_+0_Ho_2`+XpE;VZakF1*b^MWXfixF(nh(?TzH08>FLGV`@%X`#)y zcqpysshn4wH&Md2J>2NGtpinqrHmh5kgL5QKA;dksHiKae;qv#%h?4v>WgQ)X(}iA z=3e&r4X3q%a->42cmQ%FQ0wjcTSGN$#o=(;_0H}?1<+Bx9hyohOF&?b9-O5HsHjCt zHCnie1^d#4jyfPv;L2#0+6ZH$8&WsO)N-1b>7_McF0tpkk75sm*6EnpueG!NWpPJ| zEkpEReX#7~*8K z6Ewf!@7O^(Q(I2?T_;1~%^8hPH(ol!>A;2pj}uMBla>ei@I%pYxy(DqMeOtYa#)tU zhR@fy^M^9L^P$uPYN}|}TP6>lB@a2VH@@j3VpR%#bPctU3~%|0LuQ=xVsfqn!OkEXBE9TkfMdgpZuG{e+!EU2<{PPR@jBAim zDkpk~J8Z;2!N{E<74+cJ#9M7@Twifq0Mx%%0fLDW?6k_THYv4|Tq`@C;dI*-h*go+ zqOrsHdM=^PS49?D`|OXe|JZ%H!tKv!Fzz4Rxf4%|>RP-NI-qiK+b&uPkicmeq^(!@ zaV5ZSj9Vc+9(wRKOVP0h)e6VeA>H(4d{wG0$P+aN!#E<5_;Nv`AW{;0t!`U-|`=n=$+0xOI&XbMI~)p&(jCcYHG82 z_Uvb(L|!W^Xywm=@T~1bVDDJ*%nNeya{>Uw3+45gc)SGN| z5LTkOU=g`OG(eoo<+cUQYGJkLRhFM$vYi>?w#kz<3VU7+$??-OayZHZ^1x1Rhe$`BrCfugngcAKp(t?0++ zXr<)=;7bkQpo^EP9n;CIMH8F(zT{b;cq&b+F(YR*o6r!})h`;i|QC z@&^N>#(oL6hmTI<^{UcAP1^Ldlmc#a-v>l8@#Qbq{3B9y6Id=Rk>Afz{}h(D?=4~c z0!OS6;WE=bE2l`UzSpts=D3?@WjwDFt~H-AlSA?zxW{a`+&zE)S&m!9`M!TUc=5sA z$_{>8aVLI8|Lv|DF7Mx7yzvLe@|V(n@?SXq_TxkhqCWedGr;}><~&0B(3q%DDpaw= z(WU4%1nR^?M!lAzWKhg&sm>!6?BXgy-v2{^G|Uyk|j+`;OdLua8yg5=JK7 z*gy>Y3Yy>EMmcl3S!lXn9L6uJGrj}NBiy(OXIW?hkr2B1`|tEzSno3bTis><7bVmlnGdw>SPpH=^@{r)kSKL+zR zE3o0QetGf7VE$&g{&<*Q>||q={us>0QvCYjkHP#gnBT9!uXeI=%^!o=Sc+d>{P8e< z4CZfE;1@gDxaN<+Y%ImEFaCI#KL+#r75LRoHm><&FdIwp%ZooA=8wVr%?kWtCmYxN zF_?{|`1QsA*E|e?!P=6@KwB2?zMOH>aGRm<*&RE!QlHqq_1xYt2FcQP$*mNpcS>HS z7!8-*ClvD}I6^j9nC^>u9jUMgrScvMnTHW~_m=U#Ir3O|yD-tyZ(2FjBg?sMgul$M z{$*WBSD7&~YSmEszI$*6w=l;Wu9Aft9{CB^KFk0uqw%jK(Z9E{Uzhg(={16eAmsKv zm7VIp8!qr42<*Rnn!U|-n1^_SA?7C*?*HBG{`~nFfarU*)GHkP-+Rj+fc^Lpm=4Nd z8~+=X!$~zLh?R3TJKA}hWcuw zF*u#*%$YOi@0WOhxVgeEI*!wKo~IPW*VlJa-Tw}@QR0)gByrk(vgfO|d;y!OT!F}h zeBsARb}psR?`zLgXzxKb6JgO-^#_B=Q%;Q<&pXZ=H0*0)IDoACu9uIO((H{V*K|7$ ze77})wjqL$mNoE>=jut&O!K`ONKdm#^r&zQOV}aFIV^OK^yyjd8=nruc2)=P&11@#%Dq{g|xQ{5Dmj5JS#CRy-yTXW(STQGv4mpy; zy{5laJhyTar{2ILxRO$)zD~OTv8+GuPf3K%;Q1iw=#R@nHu+R4VDB57nVW0U>V4{e zT03X4_Rw7^V20r3>DiPc7GOUKiY>hd&tH)=Jci@*+hni4vvqdigz;xGwHJi}dd@0N zb!#Uv9jOlTnF#yOxQ!Vvs-;n4_qYJJLGT#yU@p59h1qihov1For^U^-?jLtfa_wPwY?EtCc+rA$_|o|&m$$c%ViW=^YVmk_jbb;0k1=8E-%nrpFkNt8Z*K`dEx*mR zmw209%*ZFqqKSHJGz=H#?F;!(w5EBDv(bE`@ky$ zMX9@8$>=jRvnGs+NTXP^tYdvwHsCka!^BNX?e)ZCv3@;8PfkR0VpTiLGmJhE??3$I z_~r#8u_qk6SMTNv3;Z*?^TNMPHJyi8iD7tT_=88}p}k=Z`yK1QXGqttrWa96Uz(bz zS#xI93sbJ^M|EoVb22Y|Tc*_6cvc z@KRZjQnpkoK1smc7xhOsr-#K99)|~3@&R@kuSKEn>YlPs0Z(Fc;O7mtVW>Y|1XDv^ z<@-+mrvcz%REU>*ds_8PMe~}qjFXD4KkSGzUzSEiTY4)rz(J%KT|ly$6XfY*Ga{W& z^i=T=WWD^)GvUo^sZK;IaINlh!F^i^U2o@%39?C?*jm;c%PX|Y4F*D|J{^Mnb}krh zbK9GmPiuF*4fdYi-k9RQ=RmAnn8yviB4^hRM{?_AJj{<)_;Q{Vi^V>z_l!v^T}>Y~ zSNw#Tnb|cF5s{Y$3VdbR!o;F_V%tr%i2I6k3 ze){ma2Sl8>gj1E+&WzpN4B$ChZ9b>2_&JAqT5|HkU(66=VMJUWaw}iR;Gau*rYyg; zt?>yk}Bc5>lDr$>}eCSw!~lJ2bhMpDNfnX<#p!=nN0wy*UZ*lH?g zM#11aL|)1~te8xLj%`9}CPg8S8g47e?7W(?w%lilHMg6|VW%g4D9(@i8sHMg`Nf@~+E zCD)%fH8Du3aPz*#Bn)+_LrBy-EiDH3rXX>*-X*%TcOs}w@cWxjEnS^t23I$Dur&4( zYI9c*!`?P9R|sQlrj>S=RdAnq3ZLn^KYqFXlw#G|<~qa#U*Z)u5cbSJ+_t?gNQFmR zEXzu)UnY6MK2*f(T2Er=m4RFJ@~i0soH+<-$C^FX`W8{4o>b8sC7B3z8IhjXVASgb z!jN{G${SPPjV%}r(hhwf&XZXjcxSWnbUaw>-3p^S;{?XdPAep$vdx#;J~VfIU`*-J zjirL)n)cVhed|4q(q1#=ioNh9c4?Zf`}-f}@bgcCQLrJS8cZoSqyye41Zxmj60|A~ z0oiXjp?c--z?ZJ9F&pGf58Bji6w73gY^Q!lR$pt6#`L1>zzcuNak;U4^2IhmHS$$M zJB%i3n;&B_?wex8q{Sl{h}v>Z>YP#xB?S1pkHI_dJ{M8Emeq;l_S_qjBU4rd7}m}%I;_@1StzD>TR32%P5 zlfd}4SZDc?^%m#n7?et~JN>hDR;ULLvc&5B)DnjA7(D@Yrm!LIqm~0HhvEC|LXrym zzb0u{zuVpTt#JEqv#fq34?i#Kh6$*G-}pWhTe`9O%qQdZo2nI3&2A>Ar4=_OXt2m- zo2(@Q7q(}?A(XG+u0L?-x!nH1!E*JcE<`eL9E2%>14RvX97fqyZd`ZumFHeG>|H0m zev@mz>a~2r&Ti((RQ*f>h%7ANIZmeOrJjR(okYSoni#icmAg{mYvd0k=11;( zAkz8AeKW^D`ub5JK|P}#>pZR2w6ghwcM*X?99Xl(X(i-NkeA6{<$IM$Ou0HdDuxx-BY@a@d|g+K3*A3tm`Tk$gx( zIU4EC3H-yxgI|?0LNv7Dlijy|nV=9cm07t9Q~<>=c#;whna4ytNnCr=qdQ~xF0sLJ zy@M_Mn37Nh9{4L1#U;X%+=3vjIAx=9u>&KtaY4LKXxHBEa2gTWvW`{OREmK#E-(seMo%e6j;>^Tfu6`kh?}2HSukmo`WvTVd5$WMu9V zvNFEb)tyMkykC;%So!Qz4tdQEY)Hacn0}^A@~=a%i1D}W9Rx12P+4FUN0Qb|`1)F= zf7nB5-Gnh|Ip>c(F9?t~3~FIlLJIbI7Vu-aPlng%wcC{P2rYLl^A=bA_}}@qQ$dj6 zjZeu4ZCpl4={-|grudx)1Y3lN->kXCH}`h|2TKJ^X8qLjwLeUb|cGCq!m_NBzhp9t(~E zjzXFHoOyi-_a64xap_W*%i1+>F6ZU@Trj)6d+YYv{SZ+^N_tkmgP&BP<<%OgjvOPu;NH=y7^U?NpQK3VzqATA((quD< z_AUI~@B846wqquQ*6#49YFV5p(>At%GT`{Z-GbnaG!5& zGUJ0VuwN}*zxC(y(*pl&65l}_Se`&1?XmvD;G;x)DrG{xmL6aEixUSPJ`DS|TMmwD z`oM%1wXLgn7#sn1?%d2ZaPrSX-umYu|IN1gvy+is`e!Hqao2y`^`Dr$eea)`{3E~l zlX(5VDDk4`YcE$LjC(!me8H#=N6FnQINP!?d-!1{!`R22tOcMo`938j1p}wlXFC*9 z^%ZF!=5793T`kqX2jUc^^{Mwi|K;0N!)6I5K9Td66$yGIh?>(_Ia`&!iH(vH3=}A& zI&Zf)3oN9>E;_D$mA2vr0AfYJq`ncX4Vd{o{ECnNl+)=&+s{imby{2jb6W4(RVz?sA`3(={CCq1lDV@C9@~j%|<-6CQ|SraE)y%@Ei0cV9khi*iH_3Iw*GdGw&- zMvP(-%;;#hKgg~tBkFS@w0ri>7CDSEHB2kMU+%}r+FcbCGpjD8q^$8is?WKy+iBU*6x`%J_%cbG;E?xZVC&QTZPUpeLpbIvW(`b-}gP&~! zwPV-ww)2zNqOi+QCBLi!WnFVRQN^rB#x@;0)tt-(L+d^Fc+$d`L`3I{0I<;8J;SwH zoVr5k5vmh<1&ZLyAp8_Zvhw4@k}^e?8fT6!kcFl8xwD1(al3SOSq}zG>BR(XW*DZWd?c>TeR^u4~ z*oY3Ev2Bp9F*)*;E~-JrG*MBpaf28tmTfhkQOCXKdKaW|Ot3tbhvd{$@9`ypJL5Ud_y1x_?@86_KO`E=@ zcL}tl)Ir%LPH&IHO42R(l^9Ax6iIB*CVLbN;Hdj>f7j~c^0)zy%WBY>ec$0P!pP$~ z@f@Tq3K2ayP=&I-@HW|t-LN(Nfss+wl|fZhU+CcT_w}kuh8db!J$xfCKqsQEVs-|- zJkz8qN1COlr#CQ`Q(s?yX)yj%XS)L#W?(LtFcsGYlSnFx4Bc@4zIJ@1?>5@hN6~)%roh;7H1+=?AinTPX1fruQMs4=iYHcA;J1$xe&u`=V5L(5iQ?;fZZi@4R%f$^-QWRW4jGmy zy4PrV+DMOHZmv{5XFoDGiQ69bAm20``V?~xxysV_BCOP+?+JrxU?K@>kOgi%G46CagA3|A&&PxSMVa`mQvI-5X!~Ug7s*DUWiGA196Y1u|rdL2pbM*H$Woe29eS}CT>vxTf+)T5()juMv?3TFRZrc*mr0n0PuH6w?*IT;<-5 z1UBrzxz*rEAq&BAEeN^_zH%6Vv6e;N{I)2S?_uqUoLL>a$IyhT<-Uf6^3Fn+q=zFE zIUXMeI4nXRCSTpdb(}CCw~VdYY|%!TPV0&c4|Jy6a&6%7x-Nia>v@zbQ{nu*Q_9(q$Fj@l z&Awc2vV4cXn}w>syW(?pxq*%38*@V6%7GEF5ekoh>DSeS7CqGo-_tUN(8KX75P8?U zJf*fw2?Ob2C=_qJ;kW!f7^TcF2&M}nN3WI+%V2Y63t5YxDXUli3V*()G5G+DsAf%X ze}cWzP~&bA%FuJGArn7^@#ZkNQ;|{qn6Rw@PG!pu5Y2-GTH7VqIMz1B;sP%{>wTUK zfNpD$YMimOy}dbK34-|VEr|tWtTnahMXer53=&|Hp70S{CP_^F6pZq@ zPDH4jfrN&y?$BAH>2EPZoY#C7z_4`u$jt?jACAHvM<_B zp|d;$lVK|GLDf^;oVi>JHBKz7Fis>@ZK+?rDab5z(>TR7)vBov3`?g#-V&qV%M|V} z#nyhtF(RDd`>m08IudL{0%0?$C=3Bcs6q<2vqwaplnBHVCXQv3lTFsyx;`1$cBf$i zp0o$jRGsT}ko_%gzX8k!pGE-u>YL^pm&vFi4_zt=ggo%G9b{H~d0Ng?tiCeoQP2p;=1kWHHD|>L74A#p>pmiT-tZe!`tUOvLnqJ; z<55C$Z(@TetXikOMsj%%$(PWeFFPbzO7@9cSEI_-wh@V;D$7QSv~wk} zBHJ=Hhe6A@k4UH)Z4FvtFlrG~_7X|nfc8TlUF7CxVv7mB{Jkk z^`JnKpewQLY}v=uG@M1tY-2HheV0K^xP&_>C7q|40O!NLlYp7&mw1R115GW^$+HfE z;SaVtph%B@KrI3$qYltLi&k6AD(7P3vHa%?D}=(>P^qxO)>`?cy(*GPi!vJk8%Z%w zne^hL3O!YFNT4dWQ3_0yvyD|PFIF|R1(}pGDN3r4?icPLhRIGhK&`uvrgcJKc|u?e zhNKBBEKodn2)XLitqWkBpbX-Qo)1Tt>IOjWA97U?nmE}}g?Cp{3CU~FA8>AD*8@~M zjYyLWqcrg9N(pGkj}I;xNh6PJX&{%NSMGiO7>x;tG#0~X0tO%wH1(cwp*rJ?>|tOZ zc-n%?&gI*~_02;y<@!UFCFSfL>ReOwRJ2-!49M-$FwB+Qc%PkZo98(WGg7V$NIg=)@=rxd6hf%($8cs}<)82U z&@@YCH|l^4i8PwTQ>1GRh0i$1Q`6STbud+;gDl58gO@!reboN*9 zs2=N{S!s(r$O3;_MB}$6Huj@y^K1Ski}Y$j4Wm8R<7jX#kr4N#q||-Ogpp->GXB}S z(+r#z-rtG^2*!($+?Ve`hj?T{%9##wI9(9dUEW=Nu7!r7!x2;SDA4UIf<5SOYX^$H zg<5_F_0c(GS}=BdHt}J{N8x414kYp+)$9EMbd@ze>GP)x+02z|4{8%UDAF&-MUD#w zw-L$iz=%k;K>`D!#6d76_gNvN8Cjp(Gvq&1`g5`6%vBg^p#%0HqIYvmY$z=D`Nfy? zeB3KJKc5;3(~h0bZO-1!K3f-ON7*NVMItMxhjy^I!rEM9wsy1 zXsEeqE!Ma60EBrGAhi@CT^JsKR2CDskk+gleL8EtPT*Qfq;+Pl9*j4*oiLQzg5kWl zw7nLJ_f8ORb%A+N0xjgC4PaY=L%XM^v7OE=>JXL{4=c~ViiI@U#Nmcb7foAzcUCl)D#-Z_ zJ{FtTA2J6Wxgs+3?59D2Kq$h-<{NTz8r0nIpj!Jp2%sZl2n_Y?5^7Hd#CiKdggI6U zhr^PTu-Brhb+h3m< z2&2zuaU*sI=;-KZ_U?x2d}qAKhzOGcCQaVx$pC6$&lkT2cX5wj313Ab(M)H%9E?1=aYfp>NE-#ax{uj4+0&$D)wU`|@++s745Z|SmrO|n= z9)I#Us|vlu>x7ovB_$Z*eibo|*>Y`uatJ#EhZg8psZHBo3qtpY!Gso zu}aIFq_a^N4Cc~E)zr0;zQsxt5{)@IBDL24F=LQtrY*KUqkAEbZS9=Y~4hWYz&1*NGG`0!w`o=S{oI z6;gETxL+odz;3&tX)QT5Y#!>@0Atz(`w`&iMk~e3wC`_~>T!=zTWU{=`yT{twQC59 zHyk|SdgdrKQl>WrwvIwv8HM;(0lpXag+kZsGYAmqTVciehb{KyuBcCe}L*am^%w=P%m z9(+$q!<_1k%Sum3);h5Dd6aYJ&Q-)vgE2m`$O{E7HIL1!JykJFnZvkS&u^RsDY(Hn zJjAu)BhP8~yBuJ3V+A-5NL{{{+8=M}1n=7~?T|^*5bD5eyCb)ywg7p`_k0l);7!$~XsH|6wPQg%zFNM)pcUSWa{p2XoDwnR$R{{t?Z(eb4 zFXGLs94Q%$6 zy5=8Uun@x7EWjwTZCqvVx}9RKy&Mt_e>wtSaqgfid>AP;(xGrnVwS$!f{e1bTnOVj zg%FV10uc7Whqg0UPoQTk(Fa~LN(|S`9EZeIXRI&x(xR)8&9Ue%_`gQTxlOC7@Tp9w zC^Sdn=eO?_Cenmh816@YQq&1S+-Pj$T56a2md<4}hUpFQsPUPGo@a9E09DwkXEPj= zn9_Xn&jZpy^D-fJb*AQI>=D|Fka>0$kW0Lbln$?FYdyGsGh>Kbjqd-% zKzO*=FQ4lS&4Q?64|`C{JZ3kY6eI);U>l^C2WjZDT9y9Pz=U^&NhjwP7IKuWNHI!) z)+(EQ6;h-IadH>S>;V;9rq6t2h$f`V!sA!Pq0SEuXIqR@LdQAc8263Q8g-pGu;rB z<{%%uQ2cLgmqSPx(alsUDKpdMb0kH?>B%`cRPG?St^3O{J9vIDeyI=1?cpR^JQbnyi zkYyIhZw_p%*^^Sr7EPLpbbW_mSRVf&$a9gT_dZE0r$wm4#lE}}I0=Nn(QY6S&qiYb zcGtk`(N<%5QX=0R0q1Ro^wi4U`qBRNe3c0GMg?g(St{6W-F|uj;&D=sR-3VnJZ2B~W0R_Em9 zRP{n^4U$(6PsT!1Fk5kRkZHGMfsD%VS3Eb0Q)5FvDf-%U(B)ixa#@|%!c{4dxDgt9H zhZhJlxeQ2(FINiYb_h@wOSLi+h82H$>LqwOM;%W`IDSE9e_>lg>~}cm0HcI7%YE1w zd1RIYXR;V~o*EhQ3>-s>kIXZ~duvV43Ako2O}BJ~`5BfD^8m!3^l$KcI zf69D5ZqQGlAWh(C?J$qCR>@jk8i})va&=?5`ViOr5ds)eJ*O`d7LsyrZGHxQ9_3t{ z))hVdxxKLc-1!xVHxpHmp8_CMR$j$3yC%dVC3ns*_r(tKlluFktRp0lp2S~AQpn62!*@0VB&3%%-0Mnl9 zFF?O99lU0exhpl>$(;|{ta<`C?+n1$fuy|b-aVf2`*DkH9KsqLW8)y}Nt*@sFTKvYCgr4r62Oqu{$s3cDsxxaoGX^P7 zOkZpR(e6XgKdCATlgyyFAUWdsWRuik!IglbIik*|0u7%lHs4v)K0l*1DLFC*U`#eX zl7kx~3fN>Gg2BQ-Px`p5@mq36sA7qc`PBvqqFby!Q`HYW>+BUAhDQeFbxXea(=7p~ zWY9b>DtJMjWci`8vU0Gk3bewTzYJ46wE%efhPAad?vfs4YNl<|scBP>)S%g>4?~z< z5frQH_yo@k)eJ#K)AM2^v6Jgc+%}s zrxUgwZ|e&40c0v>Iv}`Qs9rt%NO1!Y1Y?wD=t>aVz)Jt~#i=K-1V_z2BL{NUTtMv+ z$q)xN8WwFx3dagr?ao8t``Xr~`X*x`G-SSLd@u82b%$E;6bwG~bmajss;lIfd(2h6 znyWbrxRE08u(xN}AZMgR0Cm)^bfty(NwuwnBF>!KGf6dhfOaxh@=lbiI-Z%-C30Bp zrd2{W?X%+5)6X~AKimF>Fa7L091PQH>R2=zTCZ2+-y+GgOYUT-LV}4VRl3K=5nVdx z6$dN;W3rR1R5NSD$KH{l)8$R^Ft&XR*?XCc+3sO8)q$9c9JtpQa`8(?_Q04_)ry(^ ze9fI0ktyi*NRJH}p?O%?r&t{;c503^G!#_8njJKQY{LOhv=fS{&j^I7l%OsY!r+Vr z<4*Lz-jOGL%MX7$K(G%>se(W@Q9o2s=X=bSANmQG088zsK9mb?yvr+hQImsX$bAT= zee&UFpjTd;(xB?+dQ+o@Zz)4cuoXh2FCQE~;c!9nk!NHK_@EmY`5J5dL?AL}3AL1! zjP_LqSKn5b#W|#cAX}A0^)(A-d=2QO1~fdNF&ES`42`rzyLBA>gBAGbq6|Fzt5$se z>jmn6KK9jT?THB0X1rzDIN=r?vjXo$(!*X9c!7jxq!{aqzsg5)x%!B+nK$5)e3{yl zyK(MeSKh;T4 zYVNw#Va^t0by78uhZBe>$(Y&Xpj44Uwx(v^YM!pP<)t=l`$x9fh}-O2nt}GsOQd0AT@Gcj_c>$rtm%|ESI(R< zSMa9w(M+m#bKhryUUC2+;Mjp23Q@v4GTT!{FR7&)9<8|KyQ7c;?6xC|`Mq&$_zg`2 z?FciB`hj*-6AAHNN=kTUZf17>IqkDu)KZoL2Tm(^5Z8x3Bw7RWCG`n&3i+o`$%0tYbzOxg-O4|7*emk&dPDDB2V5NmMdTAHi@ zTw%Jm#s+7kD+4*mb974!zP@W-O6@Pb?4>zCGU#Bgtlo6_ovHA==M>w$KVGP|wk8b- zf-YQcHt))cY`Xyx{q5;~o}29R$xnSED4{H2)S>G1G06|$+<42mwZ-3c_Tk=fT01fo z#HQUd@VislUl*-W=uEjqx6aE~*ElpM%(iZl-ixSiX|LRw^Fh#+3~q+=6j3;I-H#6C zy5HS!!0_U3FdU26ogC4#aVBN&!Q=K9X#J^=bJrlK1#E0CsQ*visECK-?T1cEerv~$ zKngYnjcY9qwfSl<=qc{w<6fE!7jT83PS)fNE5flyU~yD6BWx54+T&b?5U+e^b~Etv z;^!(Yi&U+LWKH!Ywg5%RZ5B{OAL6blGgn%!3;6N3X_H*XN9w8wU)}8}EOF-Y(+xq5U+|LEy8!%BE$k^;1x7^gDdVr zAPi^|L7RT1O=O?56Al|?2JozgA^SxHh?8KAL5=`!7~=nYp$W;F{Ij!BKkz!iYjEmB zZ!MDja_R)SvN&MIpokAG$?hWWJeF4`Z0az{VzG)9nT z@NpEd7nL}}LPJl$h`$3Qv=0TRwSmnuQZu1uTl3LzXVTqNgnyA`HK7ifOp^!F@R%5a zHB@|n^FFV!?S9Ur2Q`~k!3+$qhgo`OkU`oN-ThTlfX4HNNd&3NKf=Y|`_#GH=+V`z zJ~5*xz0z8DgiIu*(9S3@_gVOeT?z(axbz;|nYGRZP^yA(;%9qc#gG01!9mB=HqDfA zb=f=^kOpd>qvy}I^*^^eoE?J(>K7sQAD8V_?%`Qq#cNQ0{dG}_8W?}45Id7mApJlC zoWMA2)}ygbgoY9~+*I2RS(3K^+AcXY_5ZN<-Qifb|KBCbD5;F1jJnGT$yS7-WbbUH z?3oopR)a)EviHa=dy5K{y{>GM9V#UId7rLJ>Hgm1dmO*#cRc?*|8x*O*ZFzxb-vyb z5FN!g=1S;5EBkHbM01eX1Q?0t=VNdY{b5@W-oiK6bgjaZB$x@m>PJVVAp2#TPEcP@ z2xbAppdRD7#XSWwk5rB7HfSfpySzj9KEqv9Hn0c&^BvazXS)=rtlrx&+w>h8wM`6TgfsGOwS9YnfZ~U5wBZ_$~Emg4NDk*x~>6Fn55Lgu)x8?JT*M4#ApOgTfkX#KOVC`&(Kr?XGq2RTUKu zc!tRnm6JxV6q-UERs|3h#35QOBvH{m3s#0F5c3MBb=yH7P3bev?=HACpTCtc{nNI| za+Rz}A1uy60z!5udcyK67yL`*^n_dc7V--+xbb;p%=#g?JHRg`hpk)UZtTE zX}~*lXl77OPKW{`yLa0kQ1h@Ho6a)5Pj`m)kh>0y@J;Z9&|qK5Jse@_NFF&JcYf=% zWf}c85D0U69wFRSsr|=6&^?b@>ijdI0#RjBU@2uC<^WO3otT)PU#TLI6+0;uC=Vyw z%bSaTlnv6E9dspU;7WOWDpG#?9`pGRP7{(xlNE{Tpd^TqHn+hU=WWdJ#&DL@J$Su+ z)G->9hMjJ|ZXdrp45E8HLK!!aiBqZ#KK*3aUm)(RP(p#X&x;oKC!a*%a0j_7_VSX! zLMmtdfl30JAjttcrTIw8$;ru2gsp5Ke-xjTf^)k|U1BCo*L^MrrE$4Uq^ z%;4Lt9pt|R=I22+eUTgh8bQpX`RwPf4WT1-uc%=6CMF|gQW>+g9@ok?kdatjDSVcvA4jsMw+#*IaX_^{)z>#TGKkvHf+E`(bxvi~#$Aln;yYiX!1 zxZ9PNuQ&)n!{Jm{XXlkDIi4e0I>qbrW^*I2eI@VVeETv^V=# zM@OIPW_v)husYIN#_!3KC!zYgl2KM_GOs(geyV6R%Hh*pYLeEoq{*|`UCT0A&ZE?Y z1EKlToyiTu^Jm4BmjMp6eJ)PHiU$1JMJ71L&lzTUQJ@vehgrNpu;{S`)4k4s)RQ`F zlHX&o^z^i2aOmL9|A(jY2t4ilo#gB5`_&T~lNrU6&;~JA!d&u9LEH;zxWrqhpSJnWB*H4$?~g>>BSI$pvQiLs>n;l-8$p;( z^rNWN7NxJ zfpkCO-Hj9W3n1)%t#fAoY)^lGBzoUR$euP=v0&}8vNW92ho|J$P=-#a;8gi^Bw$@g z*0ts5=Drbb`HothZ3j(7a-oy2lG>Mo1$n^b8&Aq9r!9x3t+`loHiIYl!8P=DqstAO z7Zd#_FaPvNAQRIIuvJGbGH@UYIHe@fGBF&g{{iHz=WIw3gmf8Hp>Qa-Rjm#T8ih&pS}ue}5#%!KMq! zh=4wXK){C*!O^t@hYo#hJiGffRLf0NvnTDlsz1FgZaruyVu#3;gkiyv3nlS+4^-o5 zr!Ct?ZQ@dZT)zM_LQ&up(m9NCy?t@5t7#x?eq>VuI`YFxTqLOlWs9#Fs|K25M z_REgYSX4gEXR2EF4pkw>dt0DLQ968S+dB?m*Rqf*7NLbH70g4HeIB))qg$#()Q+Ny zOP1T%#vRu+=+;X;NH}PA+S&Y6vHvjah;-2*iE>GfQvDNJZ(Zq0ELQ%?0PvjTD`3G)4*yxO?*3 zLEyXelEWVVr}}OFpCJ_M_V%W1z#@o5UqR+7ZQvbNeveW>ND=RsE}{aOiVt%1@=hS@(>q>(7xF1E+ZLLo0Dmj-KfG)3g2CP}4qC#j?2PJE!9}cAn}3 z^1nSogaRpM%=@ZxJ%Ikl44$wf$5IW#oW}`EaeR2o|`%r`28nZ#2Q(mG7bX=u- zoHYPi1p_AjFHfZw2d4s?<%Vn)ozOf^`5gDaXjHK5rGJT--yz(sgD%R@slk!T9de#v zTxy8Rd19#{f`Xeq@(4*WeNPZ#x*k%jo}-I8NLBv|ZAmwB9#g;-JoabF!R#AUfP zz7X1!*j5Vu#c6&r4Ezi!68F(KmS4Z-1#lG`8Nmiz#q)JIz;#y*1#g+a-(ypzGC0Y{ zd3gdX-&0Uv(z);rGr5w!EHq{6{l5ntV%={t`dNz-h<2c02WjPFxLHRgS9_x*BV;2; zEvlkcHiLJ3GZlrcuDP=y7^v&>&KW(B0!jRiLDvTJcdF^GsZTcBs{iDyAK+hMehW7M zC2ogdD84xk;V(J{WS=`QpKSN^__&W@RK$UXGkmPj8d15+v-{Iw2S^)Xv_H)KX1w7L zx;ID~c105VF(TSPz40q4we-`Ly?rTPuH~<(db6iKTt84Cy63jwoF=v*Mn8r8w=cL+ zLd%s~hn>GfoQ-xz=OM$y;j+L)fMIFj9`Bar*00j%H2nU#J0r7+#MIdMp38jK843U1 zk|rg`ReH$$Y0lkL!Udu$Q1Zoalr{H!Ua4Es94l+3VXj%#q$o<0SU(P6t}KBy*@U_B zOQtqSTq7C{t83-mG~T@(!owC3Eq@$xV(2jlr(2S31e!bu4t;&OGCy?PyiThX*1`|Y zW%d<^D21lJ1tNv+v=GG7LGLA4w_W?M4bXjBnRL?}T}l6&-~u1`CzX9Q&sX-xQr zI{zifu$}__NKXmQca!heZw3A;!yz_*L{4;xg#Jgr+Y-l*=;bx%zlwI|A=;T)Z3m<} zPUtLb!d!e_c58*NkMN(Ri)=r-PqXdWnEEfp*scJUU-UH}4!iM$9-L$6{%Z_$>rT>Y z&Ba@5Nrc_$J<+}^4MMtS0{mywHVP4UupCO(1extoPM{k_Ed0EZKC3$iXZs0gqbv%d z|5Mg}Q3Pk$ao&`W8>KTdX?57d4ABXvia*O)$B^j%F?vvr3n%&qGoQbZLZZL&{mhBZ z&Q9u650iHPUPu5OzY4pRm#hQny?qe9elaZ-m4t$Q<29ajadQ6#85@{jm4CT^YJe(f zzhM_~qtep$k51fJ{cYq%RzxDA>mKq?9fpQgGYxekNP6_M?;vu6kRE)4mV^e~N2mEI&D?;Y^RsJzPSGN*gYIIReoxDN_w zKdfXsVa>xeprOi?YeTLxfT=>@y^^10uev@hiVzHeoSSpmzdT`d6G%Tb+vkN}f)|Ra zr;np$0ACN05L%oSA-BId-FQp@13rVROH=nKSXEoY9bt0k#fXklTtY$uI8q;!1pE+E z#^U}aBW9=Amo3|29jOL5(z17j{s6$~U+U~$ZgO#Xt^DEvW^V7~c&4C>YBBMZ$u-)e znkOw1VziEN70I7tklfWo^>*~|fq5w&qKCF}e8Gp;h>srmgF<`Ne|~kf-VlZZCT-3{ zH3&GDw+{|*4%&Rzan2m+9QiPjmfcIU6`xFmJ_`S-+xw*6el0SQE$Bb~{vY>BDmea^ zr2tC$TU+o5vH$cFKDW9}vK9B29`r9OL+ED@n+Lp%6mqU@KI&TwGhvU&;-Q6>Xq-(6 z6Z0pD@~?U75t3<9-FJUJq^7sI%9BT z|LK1^-ue;T|McYbLy~D#^K6{holI{)n!bp0*6%~UWt4jE^}>bKrRjYdfoz)X+@`Lv z%xW20mF6Av{CM~nf+P-OBJ7J^-UkrmWf-%q-dxY8MRig`?&q`2yaBUsIjt;2oa zVyO6c{38X|3I3-i0|i8C2rlvO`$lqW_{jP($;h@+*5k(?Ioo@mqx_O-d*<5OUY0-> zm3Q10&9%yDmpBLV%*c*!^_cKzi^|!KeeV-QK+(ir(({@J%Dv;FxQvg^ScZ(g;K1?e zlkb)p%Z28B;X5`Mw?PmbAAfyIwi7+M$v+1V$5cf0SCt1~NCiuNLXRyZh8~T+0~W6m zW%@$p&ZtL_i}g6o)jd3~Dr2I_OZ;R@g0;}`PQMd)?Hv>Rs!5{Ca$t1CEa%Ze zz8RC^2B`vbfObcFwjHF~M3BGcGvV*Aj^3Z_3NX{FV8&Pw`+8gVf&ktUa6xUUR7#LdXnxKMH5mBTfv)8|L)vT*X9p%ZjCo(eQ z*jIp3*IvEV^!QH#?Eg+gX~f@-%pBsMuS4&JhDZE^PND>Q?A4VeYDEB?wdiX;iTyJVc5nub&ip?n^_MA^h3oB+8s{<1 zF<^yDM3V5tn(E&1gZqAd@ZT95!VDxrlbRa0e;OLHlZcLKuZ(eTxRnCvC~}JTWnCvy ziljDXGnp6QB4ZbE~_B==WSuC?_kYX1)c=qvDSyoIBYUKnh zGUDh)o)64^!&d+Gzc4i8YBT zWdh%7QY6jaOH_cxXaC_MO@jS2!W3YO=wwHKzVBDfFH8JtY*$y=)UsNAaa?-C{Bl{- z+QjDgUu(xE-$MTby=J+;F~d)J6}f;9R`Ah-#1QOx@wIMwb8VgO-@-GUMCZm$=T_4C zxu=-#a%u{l%B$84ZN>q6GcsC`<;oUJ4*9xBxkn=_m_xhkyz_o!1#Q|c4)l_@2VazD>-uml`yhK*}3n}S^8T+a3 z%aj}%My`N-jNy;>4#=fd3awSGW)XU#bAXhR{a#`o@Y)!bhW zT=I>BGg90+S&ieMyB5ibwI`;R$Iq{Sus^TVlZ{z`pC{SG?2Z4cJPI@|SPX0bMN|As zh{;o0p;$#1xr<~Vwx0cE;#60DLz>o$?&Xm)eT=7<{-o7ja_H6P1lT0jA5PDN#3_N% zvyXILt3R56k9l*n&Kjr1^ufURA;sXLf7hBX=+(=FlivK&8l0(lVt_Sd8#;2lTi+JRjLXX4HwYp!5O zbx8?kYG`IUlA`{wYqy(d<2z5Q&hyN?gDD(IWOko14^AS<;E{x-`^7^c z`2%m91QvpC*{tTjDD&s9ypU(L`hF@M%NE2N!e}IsAD(d&VMU9K7$njwLT8K2>QJz` z!Pi)CgT68sqK3Rh1s>_iPP@Gp)!PRs;XvIhaue8hWV#B{NnAKzX+4FdUI(I{QkedR zW641AVbJlpUvl+3&3+wofE=D2z9O5tiF#OP$0CD^25`QRO5|}coAwpgWoy$)E*KE` zO{KdL0gKm+g|GzlJ`RG-Ft5X3AMsU_f3c8X^X+eTuqFtMcHyH0oqxBBe_{=sTx1Kf zGcRQmB(bmIC6CO|=h@Si-^yH;YQyJyIT!nGBy5VX9eWSUazN!Elvf3!lPLaI6UzAWuZjc;gFB* z6j`udY>WF|6lW7f+td``LHxxt-QdV)VWr)XbxkIFm@yP$otS$fF!q8u`sTF+jy(Z) z;QOJ=Nmdud@$UB(?7z+c-h^HG*+#hFqj_r~|0CtdjbH5io3BKkqrk*|ty%Er%ea#f zf!v*okWs>Np71#m%kDyg?wkZE%8)46#kZXviU}7(s$@b#d?;8ctw;psK7t%(6uc3j z#W|^~QXt-Dl8SN}`1{L;F7lSlom`{rElV20o&#SJ4oE+D%v^NC;{9z9aZv}J^k{lp z{ife^PeaC<^}ezPj;=?MUhkdSLTX9zV=RfTuKN9x&{F65suG>d-mk-VkNBS>bq@qy zNZs@G!^tzfKVo}aeZTVla_e2>DC&PxSu46B1J%e3?teP|OZxxjgzf>z3}%rg75*Y| z1&X+=mYzJpnZaWyAbXZilA5lWzpB@sp{}22x%NijD_q}xc~Ghxrhw+;q{bqlVVLoBgBc6p&5xWzdrkKz7lx> zk5)Tgdk}y9FR_2#O#)<`uR6GqlwRimGIrD0c-7*AgLcSOK+lX%>_`~ z17BZo;biI4JrKZe@kjV~;gi)o18*TPlyDvQ=$aVx{p$o1_>mOKEVDHEnQ=e6pa4Qf zUh(1J@1MCzj(+}t9!1ew^qXjhk3yKOV;4fP!NsP;lWZ@T2eIZRZmhPsZ$ZH$*65I_ z-CE#dC&PU{WPdZ3qNC!S|Ky~wANk22K7XNwDjb(YumA4>q=!d@?QtH${q!D?sz_V> zBsh`)1z6{#66FUt1rR{i`c8o|I8jFwTI$%7Fm5;{W?~3I4(|{9caKT<8Xo(AWV49e zLYhW@NRkW7Ai_f6g_!Hs#+&$JhryIz5DYcI`Vuk`APdfWeS}Y}BG^z)Q8I9fgryf~ zHu3l`VjlRZ`|=)m4Yx%Pu1$7<{s?H#)z{VaIPL^6g42Hc_(4B6)MS#7Aq)(Dx1rSQ zhLJ2dWse9w2MQG4TMWeGK9*h_Hc8}Fl&|0a@! zq|mX0Eu0+pvv?+u4<9|V4bj>35q~}r$aBBoPkBZJ!#fOzxMllC9hQ3ZpHKj`Kp--+ zhwvVV@TQo53vw)aNzH%Ylig)~xlBVvi2HneQDpm}^7Ri4*my-0wl9y7)Nhu^`w;j( z-a~f^C(a^~NJ8ZVJz7A1!a)~@A?M@VC6z&6}g2oE)^l07!>djH1Xs|eM6i$*X#o| z`6PMXikgr`R>Z}}ptKqA zi9d}k89pcp)W~u+oY3D}i5fci{BKDd{QEYk@JUoikhuBzKF$(4A_+Y`MkotMy3PW+ zDC_ua!vkDLx=CvNjCw2nH${-blFyW~8?_xpBp>1@cyXeGlfb_`%w1Lyt3yBK84+wN zGR-1_j|{NXBfE|q{xV+l0!oGZivn!9>u^PjTR;|q=Ss$V@xa*Xt@`~mwonjW)+BR! z$omfrz`f$a5qOQ&Spvfi3yUOD0$Iho{t+9NP!6dH`^KK#ukEy4Pz_v|AU8hyZHZu2dv%r9|sTaCpf}8N*uFciDLYL zQ}$`7s`Ksvn`Rz2ASmA%>n^l;w^ZZ+puBgK8UW=TZo*kkeDcC>P#gZx~%`t%+RMz5rdMcbTjGW+482$Zb~zX>91=Jo>)(=@C#t zS0XRRRkm^`kL(TmFO5?1U#*+J3QITsuLPcBEwjlmkde8cU=QyobYAK~=nPdq&MdlT<2<)}D;NN& zp8G;%BGJzYD*4w`KL}NI;Ec>I8Hj~5NH$sOzqF;`w9Sx{{#Bqyh9nxFpfb;D7%=L% zf^}UB9mf)avr=?o#0X}_Q!_)qPj)eCXI74Dj2&8N_)CyuvOPpK6Kx` z4k4^v<>L$YJfkw*TUs~he}*=@0>DURvJL94td`l1DYnF&-wi0h7e{h02C;-R#hnkE z>M3UIp)&vWfE#o^dx=Sg$nztjC0k{4VM8>o=4-mdDp|i8fl2%LKa@|;SrMGhJekx zNiO^-)&LQ{M!}y79VEz98*laQKTmrfqMinn>ks_2$hjB$GNhO zJo7O1Yy-azFe%Tp3a>ZY)ZEk5I;m+y+7Dc_51$he@F`z!`oazAiP=*&ZCcDB$O}KC zU-~anv;yRGoi@eJ;B>uDex?7(qRnOZ^cEOU_zAZ)N0Bwo1#{dD+KhyvE@y#$`)N=LRobk(D z1u#-f$>Mk_kt6>Ox5M81BAv#cand04mf@H?v_1>Pm1C_@c_+<2oMriuKZRsu-uI9D17-*~ou`?O3yI8o}DL{ytQw+P|L%+!5maKp=$?3Ucw`|IIT^L^& z+&!dO$xQEt>(d4=Z*48J8)NC95s+%WFKqnU5PCTK^nT{c26w=q=l_(WOm`M^0(nZB6{Y~N@Anq=v$^Y1*MJ-+98a1z(QBNt*!vI>9i2!jfsdnbt zJMwkl(Dq4=!cTj-%saU!Of_~|0bh7Oo}-emM=7r}dF4Odx=ggpd=L zJuDA}pS`Iw=kL%Y5yYZW%hz{Pzf?lUWlqHgz+*I7j~1{GB-A1?7HLOeG|xpAh*M8f z5{g;%d>eXS=g{Y3*qLi;_%4w7adl@nHQvGz*fnjEZ9OOvN49v=sc&>(3picQQ}&-v z0Eh)ITrho4m&09uZvHWy+wzM+tr#(HZWF==cH%dUp8Hy-0bPPf?v=4IjOk&ntyena zZ{d0Ku6;)rmPef`J)@fVEdU|7Fazo&3D>b(fthw?)gZSp|cg3Cqwf z9$sv0rIQCn<8{8^Ci!qA7V6>yvAiEBDO#9jP&Od>2bSP3g1eI=c zcTn$@dY)N`ac7Qkt<+b_>kwwN9(^x?*jkUG8k;Mmpy7`6@}m`YhLMhmjsTf{=s-t@dw&E`nkmKzks#Z&`2IMqp6b#-sd;939?4`1@d3mw~yxPM<8O2j49eN!N z??q@H+d<236@7r$?5UD?;q{^L=zB_XLOhRIwiQpqUF2E-gwZ3%k7>r4pO<;Tx38h* z+-G$~2(`#>i^SBGQ=GTzfg9I)vt&sTryK+$EDZSYLpg?msfPpZpxc~ydQ$UClFgU|j+laSIQvh(o z>j2e1EfWgj^{r{@Tw^l@04Z>D+kEeh!CigduamC6CMGRenkv@kZJcX)p?`kj0dzoI z-e#dLIFvV_)UjUmqnE=c7AUX)IJx@6#tsUjBIT|t-_8ZMh|sU$&kDJFY=>A;&Gxz* z;Jns(?iRlEnKAWN5kUITc(+XUmUcPabV-V_Vb6)}4+QwsP&f@`L=oOLAe@Gg4D*wj zHoFsgFK;F5Gv~zP%$g!94N_S2Swn&x5V^s!BmSqa0D#&)0zoiKHh{!jE#6z~kU4XL zkziEfVo#A>T~d^5sLsf9H3>Xc)if)Q`#lMu*292q(U9CL)-6EiF~O~B+8FJ=@Hx97 zmXP9evhzG3C1sKs$JGn8!M58oro^=4Ydjz>(X&@qb37OF|5O+I8|8yM5(W`|FGAnq zOax{XoH7Sd9)_5NmpI@Qn9B(9D%UsPJ-^rF!7dvA1N>Hc7cricTa}aLD~znO^Nrm7 zC_8WXicQ&O-+I+ z6fAuPyrK3UAFhHa$Ts*)F&R7)m`pwzUb7PbY~b0Ht5j@nJ`x2e3}FCs$mnutvNQKR zK=8ds!6DIEez@oFGQS4!BDK)m4j+7Xb~+zmbgBfVkX4)I>>z`eht461A$EcxKn~CQ zpqAP}2Ey@FNQpv5qTG6+eP6|NV;nAK$)u1_czpqI1Hr$unN=FpYsqx41cz(xka=C0 zw%;(1r-}_5A`Jj5xTBo@x|V(l17XO`_D==OZxn?X2;Wp5tnq{zM~y{-0t7baqZ^^~ zs$UCu3M+L?FT1s2$<5ZdTj@8%2R*@soHxJTQk-^vV-^6=Ttg?j@@;lKx%Cnt9*pY& z6(#w|#K2{zWYrHBh3|I&md`#e1J&n)Af|YGG?GkN+Bh|fqIg6LT@PeKJAWqW5cI45 zR5AYRoCGQ?>mByr+B3x51+rVMh|Qcqc6}G0L)cn>C78ydprSJqSXbP{OB_D)ppv?TV7@tCF;371mU=p@LKksMh0d=SmW*)*e?=TKLG0|xWM;iPsK%h z1D1jnsW2%ocUL8;IVN3`kIVYwIm6)0^3_fN72=Zcy$<=#$g<3UH*r8V1zY^L+Z40_ zjhYCEf3l^-@1&INr+X(4P6OcT31nmDs2{Y(cxz}E+w-_Aedl2ew-W14p%8JXI$*dz z_mrYWj?n;qM`44yImRP*zR#^MzYNl*67I1bZ)Lu%yLHsOGY9Qgu`Zi7!enTR+AClMh5V0zk$56eLNSgf(lkHY!bce) zs!Ve!x~vE-wQf7JQzt9z)>Pi!;S9su2C>$`HWlb&@&Xa+GD#RcvnB0npG+CbY)^Ws zR(#Uned-k9>$gxwzH1S`=g)TfKe#W_i^|A++7Z-|%vW>E0gc zP;TZRi*G%7AW0~`vz`crxZS3-Yw={0B-07K{+I5<01=vFVWOE6z00z2h;jzBSm5$a zSf>zG2T)5-M&-pbS#$b>)O0vaXuxZeFESbfYqaAf!_p$F}jXwJyWnVum) zG2%k8F@y`cM6B0be<+_NYhFovyDU8uw_S|vTO1wn*Wx)-6FD=#tK75eR;uz%(dDlzGd~|5hrU$8s2=I z8vH0s`#&1bW6JU7f>eYHrR+1Wu4)RvriVJ%R%7Ne36QB=#4}kz>jkk$$79bTbs;NT zcj^xgow|~D2AoM90IQ_Ub=$Vc0E{wcJBIvqQowU%DaiX}KHaJ8b)h)@9l+-~#~Z>u z%bzb=fG#P}1hT5t--HZw7~&i5u6#>Ah|ROM6C`$8KAfat*D?a7-jiMI!37H{*dZyM z-@meE>r1IVRx|~sLz<%cpv`^td<*T`J~_d$KjL1NAdQDX*2J4erDt@V#*Uia(1$(e zsQngz26Gi(UV%Cf({L%z$UYx6Za1zQU-VG=gbHJjz`NPN zehY!(e^*5evA!{t<<=LPi(r1syC=1~Rx*MPvCCUIbj#LRAP!n`g=c!EvUR zXG)AVfN4rCbe~nBX=M_yeGLIr|By|)x}m^s^X7#&tjOa7x**s1NS=8YwO?ji{=?XX zG;j@1VX@hn`tC=xS3a?aW|s7Okoc^|+e|^xruI^0X#*_&7{CvlSZs7CCVq@5G4P}2 z3BMD_eBlM8pZ7w;9%Jm-1@kewZav1CtEDh9BkNpbKRG^&cBOniEiY3w6>BOzV|MQy zsu#?@d;w}EIJpK!AY9%>9f7Xbm%Nyy?#?w0o+)cylALC3%Ld@Tg6UKMj0yoK)&(Z< z=x~m0DbuVQ6jdcK?ipuF=>U|;3LCfp0$igJsjvd7FVB1ta1kD@(86fh$i!;b!e39| zUrk{HP+{*Tt-Sm{sI#wqQ?~(Rz@w+Duku101nL;lur{L(!0>h(M)HKj&PNEd&e9$N zeAMpw`^9B|KQvu$coi-%g*VX7sl~sh$sTjRaS}5UOM5WdR1*`@JH5E9QVPhVa>K0= z=Cd7%6ADqf0QSd6!)IYj`yg>XYuxz5^O%-Qr>OXEhdeTDO4nvXegIaX048y~eI!;m z$xeH`sC`?~P5fGaX+^5X>;8Aw? zkaDJu&*4m2|6D7<-QbW(1TKmwd;O!R^-peKD>yV%LRDC z8lu@O3O2pF$Dc?JU1{;4W!nqidNu8??eVsGKH<7DhpDfmv!suu>?l~0#zZ~AAT4^+rk`NHI-0pU&ocV~sJ7U@7d;wDjxoy;Vj87iM zgPg7X-toqZ#fR-tSxOO&VG&<4gHbI4=_a*M{ zA0SCNao9X=AsZrCN^^uKcq&Hh8D*V|3*0=BjaEz%-+B>pgre*&SWQArk(WTm?{X)3 zhZ6JWx6`7^ooY6G0MZ|@@7;(Rc?zuRxM18Ie{Y}IcZlApb44#V^v2p;pN_M6*z{OV z*cd$XzWhQEa(lcMa-X3H&Fj-Qpn@)V+38{I7H;o*Z&>-dtt&-FwV z?U;Yaj>I*d&{QvV$~A6`7HyImKjXcxibO`4FwujUX9pc~-W}JY)Y%D3>L_#NGOQ1e z@1(OlGHqA~m~)f(@up?mItp|Ml}tR$=z;3Y(!K99t~zS~e#QwH<3qcv4T{$XIpZSt=r2Ve~7QQS>h|M~4-X3)P^ssCt zn(mZo%q`uf-Qf-VgF6iw+|!M$WuSN+LDw^Jen>+)hVjNkbpb%7Iz*06s?Czm0w!YH z{M?NgN5LptN|({G?~9xz={KP?hl)H39M+`Yr{KZorK5yhuIRM349t=LxX|=?qOBUT ztGdzbXlMe|A7=0JVADRovN$J|;>woQ36<#?xsup7Y6!Qm^_Xjg-J-%;Z>h6>3ae5g z!Wnz@VMzKTa0 z`BZ$3_*O5}HCXQW7pLP9a`)B-AJ$)a?CC#_Dxm?c{R$(`m=LThF&OW=1 zim0(}{aB<_=ML%T`mtpA(^F7r`ZT`mTimM*6AMk4!eph}3(JL|cMr{}ae*?#KZR9b76=+I)|{jGb5;)Rqc}(J8!?x^$_~R$Fit27 z+wvAd6OUq3^oU3In-%8XZCp)6NW4ZyBPY9a3M z&1?FhvXsp3eTjKLYsANhRM^nU5z#N~9ez}koIP>JEsE-!kB2A8J)TG#cNe_i!Xz!} zJ2Yvf)nilvTW$*915#eOw+AabBpB>=pZ+4!^u1TF@+zw$S>*6Mxlen(r7oivdt0od zr1wSDWO)VywNkk$sMsf$Glrg0JCW$o)FU3nuz1`$_?&(oSSVW;%bp^h%ko->8M_Sq zXvx|Wq^SC|c~%>>QXJ~l-5;2MRNNAocOFISwoFb0IWpIx&~yjUzh)y_@H)^) zNLXm=#+(}bi3kxfd1vJTg|YL^bS|?GRb;kaMW#xtiO%&$1@wgk#>AQL6`l9x%Q4dQ z-S?4#;12V0z3S}XbvACv+}BGCWt3-ZM;jSZF4kADr=2)E-7*9yfD^}?n;v(TUW3?E zT+Sbp%MSsM=^G8JPujJ}4~HC+3Ei(rSPjjzhzU)Sisg3zGH3|#gGmm3BD6{C4KxVn z;O1KxRHGVDZeXI8I|yYA2eJJ6 z+}?=)h>V+KXW||RzJvVtt(N0ZP$Kkbh&XK6{%HR&2wf;n!w9=4`=n!LeAT!OP;pe@ zOul(nJJSy-7aC^Bq`9G$XGO`F36((DP{gXx23ts4v|u-nxLb>WsaB?Vuj>%tQ=ibl z&zv|rPo$Y=W?kg~d<0msGkq4=5z3CYx@^xx{d4!L9=0 zyJ*pJEtHiazOR7}N?az-DuE7UgmvU!MSQG&R8a6Xiwm%~Y??a>#k_2@j+2I;Qzqo5 z@1Q0*QD@^BDxDiK`#wBOzJKUcI}vTuh^NQajKbm2bH)55GXM%dk|SO*%hzN3c<$gt zdpgaW!<;wXfy2}JpoX)DM0kDh@F{#0;d&UOUaaHHu%t>VHr`V)I#&YWo|sE@Lc;}@ z%y?|92LXhLPwiY`@-(BZ`GjE0l6F*iO1{(FxMV~zZ?j?8=edOhkzhX>K5CcDq@RJ_ z;_-_|4=Q5{d)*eLmG$mt$h4(5h`Y#66t&u=_iuBtSIR;YMD_=tL9$G|Ua2wzS1_IG z(bz3Mpaxxw=k{K!#hFW8H8;Jgc7|3r3yEe8!8Rh#g$dm?6V#tG)Y5Zqe4wjcG}6R5 zr^iCk<>I^Am9f-xq3Nq_FZG>8iim1}M5mg`N?%1W-GQVIpDNCx^UXgL=Vd~7e{*hp zLi;fxAPH4}G=ir*xgUJHU1*$^ymZZ>>GZ=>HT9~O0ghF_vX%ULqD>pWjQ&8)iuFmC zXJ7Ma$$6o(61#9B;w-4PzDKsLB@|gs#W`P}^Q@w$ZYcDfdQUDL^gi}QzSzLBPn8mJ zxQ*@_F~O{`);o>@S@Y)Q=qiJ$*a_9LB4KXVW}Y->9S28L^s17kW;E$ec9qN<4Q;%1 zVe1Vixv>(8kJD^L!?v_eQKO}wg?5`~es!-p&>JftI^DO=JCgN}MjGD4X;to3u(K6* zPz)SB$i+r&0}h%kh1xG+_RwA3rjnepurHLQmL)drQ|8}Y(k3Wj<$c)Fz32jLuRO89{+)opRq-bIJ?DT zNx5?0;W-wOG4QVrt8J$!e1+qhj%ZHYUL0vLsoPDz|0N*)E7A@!cLf(VWoa-RC0isSVZaRC2*yV-Velm z)}w1b?NDf6OJl^%<7||-MDfLI`aT^>=|ArG5QI}oqdT25Y^mtt!a2om(K6yGrGQY~ zhj%Io$*;tSuscX{tEw~>iR~<5c+jiQY;|tr<1RPUoUMb+<4>-nu1+&-1HX8=$yH8h zE^uFbfnJ42{J7$mi2Ca3;ynbbd`6AY$?S7cRqWy zVg+k@{GbIWt2pVO|8PEALiD(xp(XvjeA2lJXfX~$!1>0-XVmt>6i3ik7vrc zFpxcUrP%UbNrrVqy~>OM@!Bd>`@;n!{Gv)KZW7nFbzk)+rg)U0J5O4asYVzic9ViW zZAqSB=owRZ1I_Ei@20(q4C4>wM=y-#R=w&aD;IWIDHwlE!_!FqOHH77-RJ?_SPxCknXv+68hn`RS(|YTx1H6b%~#Nsm-mH z=-TX(f%k$tIN8dHpx}H}PVb_*KJQ#a#^vdG{F6=LkxR7N(;V8x#QMJE>f=kdYv$q> zZDkT?$`m8e&I$#Q!r?F6QEAS$eiMhQ8||T`#{+?@N~^P2CTl=94Vmhr3OhlJw6N); zLWz&&ai*&JazbQmin9lzzusB3VEsxfn>3xaELP3K+q9fsY!ulpr1N0DBgs09_EB_$ z@LWRK*+z#g#O(8wr6Yh|M>%Kc?aCV1eJZlqFuy7~bfVqiIQ1P`zW2B8uw+btr5Y6fS}*TDgHV@ z43L3pT-Gy5?M*)pj7BBud-7vM(;AIw1XCLKW4)jC6g$XiD3XxqI1W*a+?$;8W|LIY zyPs_(;oF^i>-Ewr6HOrv>2&c!d0EhuSAx#1GU>FLGi#?ioNNtSQk{;O~n#a z3TBAanTb~nKYa0`Dhhg8W!d}rgA~hMT^Iu!XcnUdxu3LGy0E=_K+eVwIY`tXtr!FT z6hSxfkyhapDSZwC{RAcMNHq~LfR-2vmbHrV;C#eJOce%2_9nZB6R~7Fy`zsRL0S4U zKCjcO*MkHY8E9sxx289GU-hL-E`D{Sq{8cMdmQ~~HZ8S&kIM725i%*_1O6J()4T8$ zgq)(f!P6_KIGt4}sa85+0CQe(t7#2nE>8-iV%Hm&e@Z^88rPE#iq7b0PpHmHn8%5n z&t=q6=yzWdvPDBEZTcjl@+kixzaNb94>8W=&H0B11NrE6Sp9M-Rpkup50O6ocnxyZ z*m;hlTp&8Q3AfW5)t3)Xs_62Tu64Z%vYn1~+^VUtKZGwwYd-d#$79$Ign4RZ-eYRs zS0*&&JwVkP&-oZyf5A6=E8}>ozC1WU@hFuuv=~;6eno5Dr6KD}8%bK4gI2=HWAv7= zq*9hJH=XGQ#(6ENk=dJv)r?Q^`T;E}f!md_P#Ifx+K4cm#Gg3J)MeEW>k2kKQ z;XQ{aURgPz^4p_BatVv~VhUC33X6QJ_#yMpukRUKCU4C6nwI~e$_(cEPA(P~Gu@ZE zd@nCnkKONW52hfmO}O__{nEugDyDOaTkQooy!jR>{9?!z$JnRj*J}Et1Pkh2T*scq zJJsFDSKA*hM%W|1yL{$>{#+5>Ub~fv6%$tCyw?5iHD}e6=bNAg>!YJcn6&sxds#Sa zd0eF?++$=m!l!tYx)3&J#;)>0^ZO|$TErL;E$(vW6I;=3y9d4U&T|jvixlbOs)`nS zydb(ES!v-cTU&Kztmzdx6OsPqhjgYl{Zs>tvpWaz;^xZ#VWMEY1@^YX=IW-JV-}0N z5s6_|(+wd`EnlLX{xdY#%$v+*fJg*9E6%QU)0TS_vQkeK02KoaOjPonEe7> zqDvFuf_5o3I#ZPbuN9eh)-RDe3cXpG$Sk*~Bt6Q~L7V}7=cuMwXHDa#Sa0D(qkrOJFvWw)?iX2I2+KK#BM8JEoc$GSOtAQ_Oc98U*jtwAwI^N({| zWkNAuS>;ZDJy+}L$^As(f<{R!XXF&7Tl{iesnZvVA4!)6?_<88dq{jXC4;(D``G#Mvmm zhtq6_myAEBMLU%%!lcE>617XxC-$P-CA-tJ38*`T!)AM4Li_c8nL{=O!DmOhv}iZX zHmbwogD$xW71yU?8!x&@EC!+03-s(HO4ItCR#eaGSKIn}sEpJ{Xyz1;&n`u>_UJ$F z`@i74-v(YhGg^kKZtfVn9+w;azNs@*)xGA6);a z7dR(nEcy+NgF;j6z?>M2^u@Z4(q`&sQD`NJD~9o!XVH$sU=$xL8JB&BIbU+IHzR8%1J+X}-T--;@*94PsDA&)N!Ro3f!0Pm<_h)S3_ZGSddod+^?@Mz)%aiOH`_pgX z6C6C}gEy7)yiYsI4B#q1KOK(U2u4YvsF)PR4(qoV$)rRd5Oc`$7gV|DT_MS6`Dm^E z3hmzQ6h8)ojtftO!J_pW&n>DR~h3H8E{)HPG@SJ zfv_dNEHU7Mwtrr8wxL`cJ%s}rA5y*~Q_^tE#eowlb|cwxE`_v~{noy@j+Is=If1@XW-__UWSwiFrWw|iRNdkXwrKm6qli}- zBW!8Q&VJTAvp97gGX%T*^kzf$GCTPv>kwoWyoadO3=SA%>~Px&7O{)u1%R^Ce zIgG79c1=c&KTlWTMwUZ(yce8Pds?^6<+LUE~r}jms z+F{{fTWRjz=KbR^FX>N|WsgZW9Req6n~_lCNpU!{tLifG9nANKu@f?boI)bU70G`r zzz*{Bj-7agFdASwTpOa46Cs>5E09KS?EvMBF^xrN>JM~HQd??6b4DR^qOWK0EJ27< zIiJFof?_t;9m$Zh)Y|89Ue3ZKgT4^ za&CzY*e*5|<&T~pf!pqRQ$^?^MZDzWz%WD2?!C{>ozb#{7L;;C_*w23l=Mb>-1ATW z==YQm-TgMu3?E}0<3~BOMB#n#22@CFEWSbruN7P`w$=Oo@k`HNI$fAPJTKi40bP?V zTf-oLC}4*>LObz9cV;MkctZKLvkC;Oaeu8g`MHcYIeCxjE3dXat|P;5OQLs&eTA=& zA8a?3dUBkT`0~tcLw~w6y+mKGQ?_B*&A*f2D<7FFy;Vtkc)(;atnwSJ>yLr( zn}Mf+M8icB8NMl+B+o_~qAaO-Ovr7dBckxgXkq>7Q;Zn{A+bqgUynG1oyVJ0$!ilD zx3i5tAU98SDLEQ3A5?Zm;md8j&$c>KR=X`%h{u#JBorG}lvUF8Bs88SJ6Zaie0vg^ zm;)NoN7oV#DCKShql;x{`=% ze}8N1w%RWPuj2AddrJ!Ug}I9(RwCRhbC zUzR3qDc5FSdR}O9Fq;avE4{>hAC@;#Rp}(v5qfE&`8=q4QXl!@Js`0f_Uz8KLf>Ip z@&I$zv2M+jNV5kWwwW=`jpxJ%hNuk-e20m_18K}McDXdcb)q`BR`gLd^NUU$2?X!k zdqsFGk3uO_>wdA3MU%E#8T_$a(pRf^rn~Bw$B09}u@XO;xn1cv5=Q>%$-Cv0s>1Q} z^WouBDq;N$h>Huu{X+7q&#lyiu z2UtzYsK{M*eMiTbMoaf?52Cq4(((U?z4wl%y8r*jBg&!TqEL!d2pOg96^Y0SkzHol zgzQME5UK1<_R8KzDtnc^mFx}~$Fcn$uc+Ri-d)#q`+k4l?_b~kb6uTtUeDL#`Iz^| zx>HRzNp~Mz1F|<%S<%O;kN8;@yv9PggM*-5&;scU88RWY$x|qte6SZbQ?us z1b2W=;zjDuS0kTQ1!TXsO`bV;R=CxT^tRbFRBR?Uua@iuXYwm8Zf~{s|LAu9o9fhW z3DueesGaFWO7u(s4{Z8dUeuWmQ*hf#MV+cXP;J4nsmCA&2O7$q;w; zAS9>tD4EC4t$*z)tEg}}%vOOVIr7k6xMvLNlyb~(kh~c_9Gkqq=PN95dbcz&u>f^K zm#+kAaC=Mza_E>t;A<)rDRykXX%L1S5MpnIPlOZQO%mSa{oYi4y(cf6k9o8oA`=*l z1Ub-`?6%M}TTVm(*5LY8K%lwy9y*&v&brj=M3?N=x&AUezC=wR3@9lFQQqFYJh8e1cWl84<0y{;A{5U7HN8**gwXuUYef8iMEEYHw+q24wQY-x=iOl-;YztcFk`Q zx}R|8-UhJ{0sS>nG^Tucl*R^Xd}-MF{Pt_nt(49_a1s1kv2%3BZL?&C{@g$(PLCL4 zNu?!T9N71c(%5*_^h!-H;%?#}G?Tz{BDS)kvPkmw7-_pmSPxh=4ff!KDinfU=ePSp zjm^e4fKWkq|HA-t#jHuF@$t4(jc^@gO>pwb!bnT$IP z-Bk3?;km46n;>AQR1v>+mU~fq>QU3Vhp%lNqa&)cY6Fqn7{6rZQ3*npi;t_cQVNhP zVN~gS^3&aC_Z&R)_GEaU*6qC)GmgvztLbt0MjXQy<8oZM8CJf?Fc!*vTp9Q(;9?X% zqeK1za_`lqV^j%=rw6#21&2$~0Vx05bYVlq7lfV;OhF^|Se5p_Swpakc7S{op81bD z9ioQ_WOga2fAQ_AlvX}nClmh@%Hc@ox!R^@Wn~h0gzCI$75Mh=NelA6R$q9x8^qW{u3L3kP~Bt1c{F!mY^NzO0S3)Axboe1w)YcTPlZGGKd%6_un( zTHI;BlJP-s;`A`nx2a5wxC%2Q{b-v$_1rOliUm2|XC+A4c+(Bd`^yrK&0=O@XW$gg zL)z{c4-$4xWGAfhdaWlDQa);^IVq$KQlbgF8j%gHPj1=74srWV+3qd&uKcv0cAA~| zs#5b+8uaSzg$EYo?`Z}##8ztXF|Xr>2lFyAJC z3=+Kz6qSjDpLhoD=)D&vzGcag;aBQEy~@(vtgrF#o>(U!%jHQd#6pE~^hcntuG9f) z{NgIdO67{L!m`xMW9t0iFT`n=f61;7=kFUC+}tS0afu&ygw>eC4bVg6y^&DS495_- zg+@}d(8DLOo(}W|iROa@=-6{%FC4VSC1D^sE)HDi57TjgTyO)x^EBA(4XyJBpT^GI zfJ9TtIQ{c4bU%4sJust+&`VHCgS|jXoaV z>E*KF7vlT)PTV@>55m=0%{qj7jdz~dz_$r<%XTCQA2{&qbjP22L-!N7s}}=5SmX3Jx@A( zXUKgN$+Hl@@%y4jvpW8f5OywGi7~#-V3xTpi-9lJRbJFzr5jtF0yt7UUV)uk&h> z=wfr{mAxtbO#UiLH>S4=V%Lh*{^0ikI}Cn~-^V;of%e#U*-+x`)13|#iyeeV!{4|i zBkeD(u=0RfK&Vlhgd%{gn<&ExmN_><`pis7zxv6MMhKi=e3>{=7NKLQ1-N$j&^vgF z9MX>2(O*hJdL=y!0}iLVKGL}6L*5HT6)_};xzb~_AbM8fmz$*J-PrSn?t4?P!1i19jAu}2B_UGFl7z|KQ3M{8gj){VSz0KPIe6Asp>HMZoQYu|yVjvR zS$+E3rAJ_Ws4m3M@kz3|cLu@nd2sZkbH$M*@Ih}HDHc-VRu8Z}TzpVD;dF1;-b4E_ zH%K@i8YRt8w)q`;Cixh{-*L>IP?v!vpUl;Q$fL5W49|%8Z3$%Ohp%Q@MOEcI{e&Bk z#<`3L7gnBF==T<5%2RLy5=d;;7*%?r6vqy|B_sI7>7jG}dR|%Kv9@wy4`8;B^OZy+ z1Zw0uL#Lk|xIDh^rNYo-fq1#~xUW3+MbK95yE3Q&f<-K*?EgUL5+lLu#dT>AAfL(& ziWgA1DKJ_>K`0mLwy|7ZG7TlSuio1(BXyJX8!I#J8S+A3L>jQ6Lu4Qvl zP^libuTZ<(eLsoERXqb0%XjuUjz4z_pBUh7KOHvhWIKa~tYDHji=gZ0iD=OSBXNca2DF+cT6xal*p(Nwb<;a$$u+QocjzjCr@3AE5vj|+{m z6K^cK(q7P(M+EqEZ|=?324sb}E$yMHa^MTpU=@|t?Wc;CNhNpOS z4^2qjCyli}x~xPhbiSnB5pz1JS7!CJp-k6-n`Y43rf&M>Tc_;LAo6#A4MADNk)Z7n zPv7h=-d{)^{6yAFe@W*xvLP+Ym|}JW>7cuosFWKW3#P0?Yo=(7mdkReBB>MfkQwYz z-7~eg@;a}w{tEMoyCqZ|L8=X}2Jld-`9ou0VUulUS;u%XZXos@oBH#ornMI>BPf-o zyw>x{uQm98Sw2w$k{v;*ZX9EmB0(aPTk-ZPlztpaL_*=B{ZORJZkr4P$>$`F8o#zx z?-MfbpI5_+lIdwffv9$zOn zWTl%%R1tdYf}@Ew%JOFucnHqFR!`w*{Y2H^Kkea0c)1R!5$RpjK@nk+FGgmHH^p$k zBies2;l2|ZYvrBLNFpYCOoC)l#R7)=hKn#?s8|;Y5}U*JSNqe8`*^JMOI&AuY9cv! z9gyy{aRV2g=;%PHvgvi}10G+YHtn6~Aks@K2<1|!Zb#hok(>yf-~pe5T!2~#4ioS& zQXHKS=A|b>l^mPi1--PR)dNs{bqDFCr3@V6?_H0^OvXY+kGIi@ zclqH%7fj0nVAEGfwF0+f2n(W1lgvtociwNApjFf>kW!2;=uw7Y119T`N3h3_DP;)L z%ZKcOu;E&!?kF;_VJS>w{S+4=O^J6^s@lcr) z8ZC_IDUr^fnwNmHSSQQ$L(YZ+3e*qAt*Q~;=$20L&O2^~i&Xj0=ObZv^*h!>_QpE)vri=F z&Oz{pKQOCRDfiVh`kU_)f;4N6A1IobA-0xEFs5HzTb_@bRHzA_w4}N}3DrsC~wX|j7$;8+UVz%Jv9 zgb$ax$LGhu7s`F0%i<|_er@`UVFNV`zo28%&xY_tvAPADG()rBJdu;!p1N9=r(b{n zbmENELJxFAXendPb!rZW-%F35?|y!ns1m|uUonAX5|n>AJMnj$|=B1OsO8S#QO6`?vak&yPQ zBl39fU`oOhK2>|(KXP>HwxijH_)7^e1ogDnB1uM0oAvJI1jfYM%MR!;JM1b(18ROaGvcY`tez{f}EWLDCTC_>! zz4yB$+zcOG-y;B;rV*;8ujEE7D(RM0aXpRAvK9(&&P1pQ>72o+o31W^g-Up_YZd3d z$B`2oEwJ*tVe@*$F{)BppI3Q>zErH1sep})$X`9+66u7t*KG*&W#!G^2Lrc(1vUe@=ZA2=#x_kRqJuM0p+b|%VZ;;LD&X0i%)vwNfPpQ@LlO z4ob!!^7sl3ZM^%`??Ql>jTAD;LVVBw0y!Z_G=$VUc4u7|zwGan?=iLi>}jMEe7@!) zkyr}jQ;HTb=ljlut98AXh!vi`7~sm!)~nvf6fQSNapCbm0RTfb_&R;B4;AkNXIVX0 z3%q}yN}^*D=U=P{e?p349sP>DC+A&h_2&?&^r)m_FI)JKG_O!m4YjVpU)9T@KhnoT z9MbpB3Sq|$KG!@=0PtS1cf2f)(-#u={O8$;U$@yJPOQN7C*~X&DI&4TjE5z#!ex7o z&G+W?hz+OoP4g0&?3kuv9xE^5fdv+kLpYt5faD>zPom4`u4? zk1L}OgnnTUm27>Ju_iWTHggbT0mAH@fh+NV***NjJMHfjr<)Pq+=RY(AN;Ro4DGXz zJhBcv#IO@{v|+!nt?Uz>5wiCW&41(?`aLjsB_)L-~8nYyQxxU@EkBBU^h|BT5 z^uV2E&n3i6V9WA4Atk4=1Pa@~|)!kalay6S4KLRCqj zO7Fz(CUq%OR`py$RD@) zaEXbbefLw}+$BkG1yczUlH4u^#rLtcY|igV`^`qc#p4Rnvbz?0>x!e0HaM#~6OxOy zf!})g@Ml1`RDX$mC#|j=M>zZ6&?)pFZ@#w8C+rxQl02_R{IaLS-l9#0_>5BYwfOj) z7PVEo@s`&O;e1>v=4^q&&~84gU6)z57|I88b7J#n*$Y*(JUsAo$9b;of1AO*%ocie zhes93KtSVAF?eDFJ~TY+lVlJEy3bT@d~%jgjWS5EDlIYYo2Hs1>z0c#A=a^>(jfAn z)MTwWdgZpugyZ7^f1zvlpoh1ObduCwu@GI=RD88mV!aI*FiE6WjBL6Lr_F^FQ(^$L z*=GZ(+*R&(`O(5O^hC*_Crl!~*yRti-Ytj58%0u?J5a(DyRzk#DJt9@Se>59YNN9m zZI~5`xGfwOfI6>0U0x{#h1QI)JzY+!6~Ri*R%q=H|Ck}~{%Al{QYdipdo92_+<;Rv z?m87rCoyagXNGBOT?edqpl#wmF9iJ1a3eL$F(w3 zn!W_JXeUjfrmQJEVl|lf-Uq8v+=0+B1>;Du%6^83)!3R1m^JbQHI@O9!Fy)~sB?;a z61U3RKjkn+(9Az|3ifdM1Sj-XNfN6#0($IQ>3duv#+3N^l{=y7OTOK?>1IzZ;gX@7 zZ+7qXtDNEXO_%4>iWlYhMxF;NDTthG&|u^bx`0a#ah4tzRwUh+YqDYHodTH7u5wSm z#7D1NnfBp{W~Klp?VNO1oYuW*=JcA7ig*4+=)5hJnFu&{iR;Anoz#66YtJT^-co)| zCll)TE4hbv;L}S7xrlp6wbYs1GOBaCoS<6xaplxPnTOcR-TMxYI|mK1byFh^m(OZ# zKM&v#^zFS;c+Ic1ULWqIjc3+{)*V1kn#Y59*;!p4^lrk&W|W;p+6a4H2; zcr$kXu>QytUZgte!*$i9Kvy-8Y@#ecZIkFeF*)r)Grcx(BW&sRc%R#q51?F!xUp3g z^c?z7Hk@EV07?u0kjSA7iT$qkZ8#GyLM|TqaTPD96GWrmX;2$*wTm&%koF$$wS}P< zNtpr6j@fGfgqZZ_!svvH-luYTSu_|x;Qfv#Z_lk%73bmi-U^Iv#$1cskY%M?z|Ep$a3Ak_aac1)231xATx`uJ%yk1BlU% zdU7SYP{#ovFJJt;J_(Y~2M!IfPnX}N0Yl*F`wHf5d$S2HNhpXC7(O@{jJGR)gQwlp4L4QZujA%7Q9Yxq7&zZwjtd{; zb3r?;IFAi7J%=h1mpX@|#-CuviSSn%m)2W5F|;?`Jh;@OOwzPU z@>eSFF3#m93Z>t2DhOCzhL*6?Bh?;LhCCjGosCV+sVFjPA$LU$H;sow#S1s^-N-pL zIG{PoqITt~t0Yr{30RO2YpDW`zk0x%Pi-j?Bt^g~mFO!b5s4a>T2pTw7Nr!-@rPX( z;^nTjV5+^P11~ zPZI3?Y;{(@B+oE2`-Mv}{pl!A~x?%p7 z$ICN`H(wA~y^JC^AJG1wb4{R;TB^`~RMf#RU8KI6@wK(=Jf^#knfxMd09S6`!%R*T z>B!W_w*Er2Y(Ym_SRjeUE;MJP%d^A4T!XYk1Gc6gxJ8vpP;Jo9@1jAfC3n&$5!ZBi z%(P&@(ZoP2(>}6j5SwAI()<}oFyxho7|qJPYz=3tE}K-zWC_x=uFVbl+|94YF_W3g zW`gUl(`@Lro<2WwF6W>)CbMysW2yve6|P6F7Bp0B&T!oV$YGSY&O3bEq`OS)>+T{R zESHgqN|I8It83uul>sII7wpeHvEit5iPxSJmbr7iOkZ=oad55ixm%Od7XVn&@rAfD z>y5-wr!aOiDb3xV+9!msZI*K4-Ylq=>2GY7AD^lcnGvmVA>v;e|>%nc( zG;3(4!`ZWRe}3wFBtp7CB*WqmQ_%+A?!ztE-li~agE7)gf%T`38LFGZV{*1NbOuIo zRwhap)`PWad~DWEbjBzViCxY!Lt~8H|i)0KewfiUWsMg>uqLAlIug}VHxVx z23)S(BRHk(?p2z>rHgsY%wZS!2?x#*c8(lE;gY;uZx=6exXyat+9}3;*p}tAZ@Sps z9q!ANSyqPS_amZqxL+rOovVj6gBssEY?yJNh~$?V#L|+d9HW$S4Qy@ zii~KYl2Uiu8d128a$p$fsk)^!IY?prrEQ}l=lLg7lpg*S6`n_OgBosT-$eJ0elc~H z=M)zzWSM^@NAtY5Il^~-aDCcdMr=nm%2~LMNo2WpE)rL2RF}-fB%^jg=yIy9LgJAB zS{hKwW8M!csF=r^4QCtNobC@Z-Jy?CEFB``81GsLd2qB8n{L78w%+L`1ZU!CxRVjo z5H~+yLVBhCG!y_`5*7E@-BYg=Irn@rCz8OjO{Rc@CfJ+Iv%Ak^^p-P2+eoU;`mN5^ zk@euy${ZnabTE2XODBlzSzi=+)BE&2))tdI1oSbHSk6jK4!tA|zR9Gx1VWq9dOUK& z78b~kId$v#2_=LddwsNDnDq-~VK;Lj`!Mf$ZdBss8cDIe{QV|2nS9tbrPNi~$$+6c zpO22UW30>8cL`!YZ-fn!E@$7jItlgrF;sc(JKRHve0o-Tp`by_bra|2CQUK8m|tMK zNB-84wh8aJxrRvFd*%!}8PEMQ9Fx>nXZa*u-I$(dlr1>!s(Xb2(l)c9E=zNMfa-!? zReQ#9T-4@rlt6}vo#Q@as7>9JHVy&|7Z`+b)ut%i2RI6HYBC%;zqHjCS*@F_Dj8r1!oZ7!Xq{ya9!)fBc1)(q}SrPX2 z!>wi;?HI1-9eneASEq%r)(~D_Cb64R_B%ftCzv_|i$w3R_2S-v;GbX*R z*PTX1*RRI8x;39ir8`f^=mP_)HpY<6Qo9U~V~A%cSb&KbWq6ywyZ|K9t2Y zMyZxByC|)5H6_S53bs2()8Ww=tteXW!NZSZhgCa#h3v0QyN_ydbUTO1zLcGh7wjA@ zTnxCIML>sv@kB?wz*@R_c0RGt3#8L?`!9O z4JEc$+0kor%wrmPw^WutQK8kcFBO(KPiYLYWWwCMdT97NH!@gamhZOOJE+~nKb6K@ z&8R#92rg^0Lz4~dCa!@Z`x?JZo7_ugf|yok2E1F{YJ)eMqUM>X+3~C}3{e#N;!74A zqZV?hVk`9XiNW#g9FFh3>tHe(#-T`7-!&gHN6$S4a)Str44Q&D-z)}X`R4M3y`Flh zWT}NuNxt!PZ#QNHCIFvA<;hTAbE=(%X(|%!8_rcvhti$R=brjG>-S&{4`~KDn0Qe4 z$at`jFTSVU6Wn~8JUWoSO(t=unA*;fgYm*gJ-XGd;g7b9YZ7 zGt8+`b8i+5-zfep)RW$4`DQOe)L-rOFcm6=EZ6+w{PN-G0XMA8H(gc89yK+xu1-29 zAD1=MT>!7nV$vnhDO1u76-Th~qN{7&tQZ zW6rxK0K~oDmvG|YYe?y~bqtalYLe<;m^|5RvIOb!q$|<$CFtZ6M7;Bl&GGC*jx$^+ zp`8oOD)RIkvA+8n!fUkp|jJ9Fo zcKnxIo0$%$&>reccL`Db+#TmK-9FKkc5b8;(|jP}iA>D^fNVN>$K74i16tAuJb7L$ zIN{%$n)hGq42Lux?5g*Rv<_`!n@YQu`X%x0Ih%=Q*TtOnppZtR+QY~6l9+k!Gq%iv3OvQn+hDgc$dnC_DGu3ToD4{3Ca&S^q5XNF^G z_XLi8CRix&`ZT6(3CIoiJ}>Z}Y|d4Yw*)(!@4#s=%-?kuZo|wFsaLn7&mNt*=Uo0_ zsw}EA(Za^h?1i)3i=xX)N9}|u>Wp?{qQpPXd)lK{`;YK_U_zPH59%yXybXS}3NuyF z>Q3gw((*!Q?CZkwHEIvD;POj%_wH29X^Q+>vWUAhdKW5UJ97tluue)VEY&0R`+H={ zPqMoOeP97=D0$A1iw@j}_REE%g_Khk!#z1YKbOP*&Zlx`JASm#yuPr6<;P}ucRniW zJYO!nngkzHwFzZm7=B~F_F&1>qvqms(-zFtxyFI+G&jKJmE8&>Hs>UVmv??H6?Pk6 zyU*bqgN*9(UH5O?iM8;`L?5O3gr1L>xh>Q@voSq$)y;Sv#>JNPkUeYMvAlC*?UkF* z<>>VjD6G@0w@zOtZ%7-zKE)+&-8}H=yI&GJnyiQ~GqyRit^!ijJL?aSmvR{Y6T!Kf zxwlNhuU=X3yM(!{6CR}LmRbNMS#pT3+ceTw7L_Of-dcjGt8p1O&CyAkQb)qhJngW? zp6;WO(J&^ymTr2p9=#@$hY}3?Ytk)vPI5+s$zM*Og}PsZ!7ABzY*RSvcI3ew)VWsxeAX^c3Bk?f<|sVyK3Lz8n za{7hZCx*mTPwI`@fFd#bhy zxu60E>Tyk1{VJFKjV%*nrum z%~6gncBgB~k_U&1+n8TFpjMND`hwZ^Fx$M?nue0_}=eehQuCy>~!`9@d4FaMDW!?RqgL6)&r*u)=O*7S=hYP$&?a$QMXhput4h+1Tu*Tk43N|@s zCOI)u-9=GJEPw8uAT!EcR%mXmFa5+C-$z?inb~GQa@uudeuZB%MQEhP+$!JoYSd81 zZrZVBzWH2&w$YGM5bG1yD^Uv473Llxy-|3M2XkE`bzcf{xJ=tbv7#t5oAazS@t@8K zKI0!bh>i;2)9GNP_!_}+@D@i%qT!J3fzHS4@1xf&Y!~_bjA+ym^G+fE<=39 z4A}-jhD<2#bvbf+tj>tlVW3%1hyl;!nqK1_STXM>2h}N$ciX z>UyIK%hm-*^wqOGx5{)qYWax2lgeah^Q)>NH8+~Efp+en?&R-W&r_u^i1$8^y~NLt z%^yR&&N<0f*c};m!KM!`MPE$}5Gie@Gi)}hO$hh=YoX_CfNvYeo!2BOB5RSU0hX^! zZ%q_jzHwx(dLBiP6cp0at`nvE#x(k-S=waBZj@zBLB*KgBt<~5EE6_Bb~p4a*y;3l zF~5y&C84N%>U$LP5>S#2DKwPplyZkD%t~xjp#u(nalgOtJb+J%ysU&CfUV=&`%xskzWh&L8n&}|D zu8A_QXY5lgpL?Oj(VA@DzpsgLm2Ts!SG(cb;)ng3K}FW1YUw))%*W(vG`Lv{>L5d{ zWJc6HIua6STE1EBwpJZdo;EW~;rT*#DI^N3l+7o2{UbIjg+LDpdOY<{EU?mS7^!b8 z$ZzHn>m&u4YG!&_w7ton%&c|DwknAVz_m^!MhTC!@Sv9)+pBPnwbYIsIg#zu54#*? zM>C7Y+R$pzN(%ZOlw1QnGWfJ%<%PQ3xKLNk6+T9He3WEz5PBsQol>b?{KDD1otbk8 zYN{q!hi>>gDJ4d4c$%DOi_<2Twj7V~3iLE?$UULUG~>6jE;M$Ds9r{A<-??#(~AW+ z{5f*958C8O+10d8f*bNEpDzpDa$*OO(Z1DwGSRmZcSI4;pU{j^A+LPqq?U+N9*B$6 zCg}8aBux>)!{<6corf*Bx;hsg8J!$LaDQZ(>vcBPD8;pLE-jp6s8*02eUE~=&7!vS zbd19_w@WQ%P7_R)Jb3cU*=e4345p_{{ISvV+P1Y^Vv&RM25LEMAlc=icl++dYdLI4 zS+<)>k4ia|H)@_6lhLtVIg>~b#&pt|(WON@vrS0nSfJ~d1CCuA#km4lnHn{GqE^y= z{29Yx&eqNZw)EMj*s|PI;U?=Q!8Zxhs7cy*{liA(&*tBXe00Yuq-&2gI`OOra$KN^ z|11=|APel|JR6IevBeM@gC~?|-VT{61AH#02!ZO)&ZiH>H-K%a z!K!E0I`Pf>`%Hx_noM&XRE-$rEt@=BQ^p)st$%6;DqqXwL`KGL>QydU&q#}E3OCoU zv)a-vxCW4X#woG}3k@?3=V)7RHW|6do{vKnHw!UhZyqu#()OU5r!^(E^-~()u$nwD z&2zklUZ`uO*Wb?P7Pt<-^Rc!)E8PnaWBM9bCv*RFwTdf}%))C6ZWUNaXBIHU=r51X zLR2XxviQocv0k+1q8}1T=-ZfxjKB_)laNT8Sv+o|Xs8E{{u!s2gTK;-&G(z8+n^%o=7xek=HuFcm`#MYpcPU|SnoAv;Yf zIr-OGc~|S9dZYOZ+>edk6e5_^eR9C0V&b*DcDS=KbJjsi#lo@)deKB_X$5s%MoMM% z@JxHAtL^eCEET9SFN8Yix?b2SlYwX7%^Bu9hE-TFeJ&@ZCe~a0Vo@~RoSq21F@@IF zUd#?sp|K5VBmM_aVXdpelYQrClXn)p*or?h5n?Fj)uU_kZ$ zr;)PYMofCZE4oCvk=Ce<+sG8#dKmOj!p&h;H+H1kKhhV2IUjhC3agvt$$aAQahrv! zwPiz4Z)SSp@Pc-$JbJGIX- zFzZ?i=V2O^XoJ)fx0&>~ucI&wF`=l=!`Nem=50<2>nO6|lKg4>?8T-BC9zfVcD}z`TbFMGfXR^CJOwRlIX);g>h@*QhL30);_W1W^^We zHXjR#=U=O`Si86kA(hDeW9F#mQWd?X(%c7_p3~FcSr7DcTN@rB-54TGI1>4_*c5-W zlB&FACYhf$DBs}tIz;t?m@x#`|H2FHD)si|^AQJiMDR#Z_+;uldi)#^A_O8K0(nb4 zga{~i#eEqhUtd+zY6uM*3I~n7Ll6&x_puVbi=fAYQjA7Dmrq1b%tviHJA5S3>B>Qq zf4&X%_kqZ*G0$9;i<_WcCUyuTxhZn+BQz(zrv-WzzUm zT#-=ytWf3#!w}}Op;o^ts2^In7+jw1XmI4!)Gh>d{v0|;QV!Lp<1S}9eqLGD{MuuZ znO=T2TIe!I)ctt2Wa&bcP#H9#847wyJ z-}!QNr#XNkk~f*Q>orp~FZ}qRoIAyE{wB9PQ`%8HqI=IxMTH=@jf`$mHY+@m+Xq|N z+IRJaJn%HIvE(jfEImr2ZKT8)vkxUD)pDUsf2S+=MzhK#vTCP+`ABO(!LWh`Vw4p5 zUFqR42e*Bx7{W})$kg?_uw_eCZxSrR%%OxX@ECE`P>hixyNZe#FA$s$X->mG9l4mB zh+QSGM#BCk0@LsiE@`G?qPhqCruRDRS}Sl{EnpdE zceP3j@~I~1cSrboiX>Bc)7B^g;VRN@w?>Vz!4f9|(v{|8iH!|7c z9fw55Zw5w>UU%K>RI%dmUr_uXe%00=oM-VprXD1)DtrD&CRThQxM(%p0C=tPeTN9x zw8jwjTq&D*0mh;;gTCzY5zT(JfavK>Qs*sdubT&D8~Yx`0;Bywo! z=CQ;~HJt8N7LKi9DVvV>)fb2}Od>?wAHz({tH>g}k|*^+uzYOe_2r`IUq2+TdxM~gzR*0JUxuiX7n_ieWb3^ECAVJUikg zvUdF%OuKLx<%+t7Ku{(aSh1uUqqjWV3raT804n1QV9QVv{wH#^0;D%` zV{Vvkv#{8FzzJ^0Wm`CF{J4T5~Fb9QB{ zUcNWAtK6T89F&_oD7R}zjf3b#b-m%DdSlmG+1cR@R>aMa-_$LH=wz?`X3`Nnd>ams zuW4B$$0}!3GgMWmB13^EUqX6H7s)IdIv%QqWD+QR=!M+ie&3%t`}4|wp6^>??HdyX z+W?4aBRA>!^JDowz?T|T{VJ$$A9F7{0AYu@P=xOe_m7Ab(Od^V^B>L@@pOw!YIndi zkyuPW{`u3tI{~#3oM5=Gr03#y3&yDk4%}sBdy`Y&j!3NmnX#&TlXE^h+_~YiZ_XWt zb&OiVU)@PBC%3_b7@b8ZR{xli^zEj>)Iq+Uhae)Fn1JY1(p_u;;fUSoEq7Npk{}J; zNRieGMF0M<-~6E~2K1ISt~U7*4OT3nx_G%k3faZ2uvn9m?53Ack3m{;pE~U{z^H2x55LZ=BB}Ui)veHM-{;*7yQJ3 z?%N0d_GF9-qL%#xcE!*EvwdctM7XHo?o9QqJOZOEFx{mo$j5PpfOcif8O#g)b`w7L zz?-)kmoNiXVg#Nxj2%(iCWsng8hWoua}w1*Kl`E*Jll9NO#R2R$$}YmhkeeU-y$PC z0Z!85-6MKelmlM0%yTV#iwUT&A~)8P5R+rj3GTBj1dPFLuBuyB< zJ)PPHk&4oL=lpiKON&}YxPNDg6u4|f3?CLWq5?eXUY!G|4dh{*m*MUoB=f*H?ti3s z90$;CVO4?Tr?e`=qp69uPF%rD1hTNNENL$R(E`xBQ>LbQTT@&=0Fsv`1RxhtLlBU7 zIlxwXn;`VSXl(KMCjWxNtRXmz8=VRL_Y+olB2S|~k{+@pc?}?W2j};7z{*_~pwN%2 zNCA$&m^aoIw!{5A!qY5cw%f<$1g@h=7*L@4d5K&9@;|BIQx0@{KO@feUAoAQDuB@I zedng(qq@TlybH11WJg5pLl5o{=d z`y<$Y1RI~=kH!9}Ik(O2Po+xzJBy9$U#*{ms@oTU*}Zt@O(idtdhXel;h|=7hYq ztOZZUpNII}`E;E@h55?s+(P{{sw8PzHWuBb4mm@`D7xLD^54||#cR=dR)%3_`ONjI zX@^G=k_6xjhrl8qJi2X5|H0lIgQKZAiV6LTy%7d`QHC%Xb_2I^r*b=_hw2aAloI(MC{qCME~vtaYMME|c62PVMn9C^K)`#Id0 z>PK7RZMx~U5vbD`*{Nmgb;EM6xT`K$@MJ{?;f+=jtdDMeh*KZ_^Ff-pG9+mnsK6x8 zyk*~Jm4+N}i5zy>IsUUFayc3t5!9F4vRi-(P@Y=eU6R(dFioQ%;Z~ov6Xsl`ZyU?D zUzJ9|Exy z>-*pm@DL~VLGi!vkRZZCk|MVVzw;1yow|)KxaY{o_%!GVKBZk6{DV;X1hA7@19}3L z@&_EJvTuxOT}&8Yk%qAJJp9hy*wJ&_48;kYPV+!pVK*ojbtD|{E}`8fq$;9ur9U|Q zGee0+Yk~7S`%@ZqeFz{H7Vm~DR58}7oZ7!l?TRF#T<)e*1J^HI%hs<}OwM;iBJZQ_ zgN|eJ^~Jt^at;{Mrv8F7wPK9u*!;2Y-x4EAyS6Fiun2`e*2xCm1?+?C3y~yN4xJ!r z6_ga<-n|>w3f_|F;Foa0*YF+re$eRmf82&B+DP{&!KshC1KtvpXEL3x{(PvIpo@9i z4|KmyWo#CDNhl~&?OJ}fVc7M|>=gtIy^1gC{B>+3P=Gen`blO)wtcrnltd1HCe`=w zY*cB;tH6}S%Wa5BiTzcxdGCwN@HN(XhihZNR27uKm-+8XL~|$wx9a@ zLxbBJ1dLf8eE7l-Us3lq0ko3paGN=25vR-CiGU>Kw=YxMxp!2BNO;?ygds?`yHZnK z;irT1Do{}?21P4wnNik}?G^*+YXkHG%`1I!-!Cti!<{6vFf;u2^bsYw&FszWT<5hy zriM<2Z?Tj3abR5IVlj#BQwxKek424e{4X?e2PdPQ|Q;zO5s z6uQ)T#RYxl;12bzNR-GYzCu8L{aVqQlSyLRI_VR&YXd8F2FJT;Um$e9jGzw}>R)X? zBoGjq{FhD@*sWmU$N7HwgL42;nI&#{Pqv5)_b)~WgSphW)6nQ!>oAh74i+0RDU0QN zkHRPsrh)8IvC_5N8m@XyTu?EDCieJ)o9M7Qn$6B5t#V8EY;bI>f#w4CRMw2&dHpcz z2d~?~=uYE;xxPfU(704y1j2Zr0pe+i^Xu6TFgBTW*BhmNXK#M62Z;MJqId=?o3;!L za&x*QC>SDLZrTG)4z?d{HIgVa1GipmoFxldC#*ZQ>{Uc`a_@L$4?mH)iLiStfwtWz z%*c~f+K>;UBEr@x4%MmlAt!hHZUYGy#fP|b$`jX?2RFtJXQO_GLo({dP(kyRm4O;b~Z z*@D7V>FsB?$fv7J(8JScie8V+zMW_gcf}S98P|$%l=CMUle%uzv=Hm^5dm|h^7Z7h z`o}MOo4ReoA8!9Pr-u8vDLQ7fOP_pQ&)%@a@X0RmtIu(zcJEB(XRvT;YCd>_38h zmJ>G2o)v9h)1(nE#|{?g8!e2f3co&Ht-CZfaC+}ZQqU<@rZOvrQ}A%Whrd>hU zk&lWa*^HCL=NbNvNwz45jGd-BtP3d3I$(7Up1vohf}>MdeV@R@Vz%pWT?Sr z=s&n)n-bsuPcHDvL6R*AL1@G%H3XX&*`OCmv^#h9HFLW8{Vq23+@uxUJ8#0;%Pm zI&VIL+t=;zxi<-KTOh|#ns?s0jKtf_jH}IVE{jB}Jz2sWk<3)Q1^n*rKn`A%e3qQd z)`^wDE!acwlTUsg`9JQ6`WsH%aePwz$7|~15y1X(O+<0h_T;|O=kon-t-$Pfwwa-g zt*+%7TY;4|8=X4S1W$8+N~z{DP&VRW(rIh@Mv>#1;>K5Bc@{)#elSzsZgA5*OVE+# z7VrF}ROdNKhF0rHxBfN0313#pxYM`5D7X_MO1@%Vb}IP6zt{L?SqQVHLG{rhkH zdZrvePI*{`Ip9uyJT>&?;i&Jm06+fcw?7)vD_#x`C|q@$jYJfKjnfUI?HG`#K~#6* zQ+hoe+C0emt;G!QJypKv|MSbgKKfUQakoN@bW>TX*{}cd{Z%TYh}Wz!aU)-3IuR!4 z3Ban}+`2&BTtcuA+16j&G!!GVoTuKKKkWHu-v0Tz+o$AA1m!vUytVfCvVeTvhUsf- z2`zKb+VF~Xx9wE@5gasOFxh=~TtsDc3nB{Gyw*Ekj-b(ZZg$(W=R5!Xul@clIb|V^ z_@2-B4aunS+-EiiWf?Ztr`!aUH`beEN2qXS>{Hyr{P^cox66bfQya)OP%L^6z-#+X165A#u%ie&v7l%l}2>|KKv9r!Qh_$^K3R|K-cS zC*Su67$dRG-T%Yq-Fl>G95`eHibu_+OKr?=teY-)cE|w6JN%KWCc$ z_RHVN`s;bOxZC|Ak^&+6*CYJ%ul)Y&{|U4F{uBS(mmIAKtc~~G{Qmyc{&yewhqZsD z=O5PomHq#)_OH70kJkQG1OL(5ziQw=TKiXr>5oJ5t1tM+A^EScA^Fv~{BcPB%eeePqCXDFF9g}~2O;?{p80J030YJB zAA4^d6=nafiyMea*n*UbfQY1YgCa_!pu{i(BHi5$3M$ei-5@OuLp#zX3^3FX(hMct z{66!>e&O}q-+lJ^?eAG`*Zc3~{_has7Zml&b3Jm|UryCoo%;8Ppx0Tlul{>9&`eje=s%q1f3Nj_ z#|Qr<>^^cD!mrMJ#NhmU6j1tCP}+Zwwy$(@jMweI`P~24!sa-nkHnALaY!G@uj7zD zQjL$R^pR?OT&0hUYR6UjNUJ>t9!G%LG4MD7V2**uG4ME2E{@{WW8iTNJdPyDG4ME= zAcu437i;>v&j=s3KO z!~0(Z$^RAMeH_w98uWjTWd8Y}jz`5KCw3gtN3h@VsCWeX9gm8~qvDZrailpOi{nQ+ z(XlvwJSrY37spuoNVzzQ$Bu!=G4ME=Acu437MkmM^3}_75||0iBqb9;T^6mPo0-p-~6@jW@b+W3+(A{(zF?(+); zC48dplJSfS3iqBtA%oEgH5C1FcpT-=_A%ibgj_)ub%EiH)Q%evo3){Er}d#J3mJ1o znb?(qbGKbjocf>qtM~ft5??Z$lQ@@zPyE~ds?I)9V>NjDfAYHj;T){boXZ}=efaOY z4eU?;LN9De!FBF`^cnneFRrkY?wFE?|ISAO?qv?|611Ms{eL!|{(dj76u~c2GQRY0 z4X+a?%TD2-%sl@7e;=pHe|93rsq)_o$m3M`@73=Ax4VkhsW4`>(6M^o#zuMCiPbdu z%j2pwaVz1p(dd8~NG;V6h`;Y1PN_M2i<7}Qq zy>(xqL0FPZ(3ATLpYPeNOay&?o_NaZf4e-ZUIV`i&bwFY?O#7Z`0t4C zEhbx7@4QNSktVk`|7|q$^8Y4+ICmCwyRRps=??vXB`r6LskX-H=Tur~c;WK)nn5uG zheYr_xs0Cr&SEu}#sDfWl{(FT>ML#ybW6Ki7U6EFb^F0}{S1cAJIe*<@Qdm+0=XzZ!|I40eQUS1<$sXg0zryCksXM8%v7vW;_9noCP#qNuW2#_)ls^WC zIUln1>7T%3b@3Travp}gowcibI=U)R+-Av=sO-*UN#c$J8Igaw`s$eKm8o{E`3MeH zoi;-r+a*_6=9}|ZKg7Cd=yj(TYBmL*S2}dK|BQ`BvH+Z2$f{V4;y#4X4rE`Aem&Ef z|J25AeJ)&4e8_H!f<#C?f!(OTC1Zt^{|9&kdH_iB#TTeGCF(rbv`VHU^4I zc=L|4^ZpeM{TIbP&BA|v@8N?A5E16uh~m@nWl${_yUA}mvMe5Q|D^<^(3pxtzbp90 zgV!aF{Ad5M4jg$hmzBY9l7Hv8ro?yX;?ytMZm*`TP7k%pxst?WnT_3LRsTW#o`TQX zmdT^^Q1<*sB9`A<+8B0eF3Hu<++NjN25I5f62)g@j7O-#W(+C^QN9Tx7s5Gj*pZN&BoWQqGWOu`z5mmBoV$Gq{0`e}?{kXp zIqv**ha=i239~XFg?Ulj&V#K~UdAQ6XYd*(TZJyE67vfBK04uc?q1xPpB)LJ-mdgI zjYod6a4(K(r6V0E4*}1qPLG4ysZQ3?n3(Y*?LO71ClZq_;nDo=#z+3iA6FS5IufSl z9I&-A)#$#pGCmdSvfiL4>O=bS{>yZRES2H_yzBHI_Dv!ja8~VJuTFQM*={8MSC7h7 z1>BwmKGk9Hc_|l15c6G?h*@=9-rIPv2}r^g47oG?r$uhgNDH$RF2xg!PJdK@x1ZIWU)A8v5sz53oCOY|)kLVfIa$Cx)v@-s0@h6+n zWj2iMD}wu*S4sHC@tgDS$Z`>Kcj<(0El&nHZml@j!@0)1v{h%t%dPD`o%@IQ|EoUT z{)C-eFC2=da;;PN#7zFau`ZKAI(ute^2vHgZNc0k@Siq=b~RD$wiimQDS~`m_fhZs z7s*IYAI+9e;{63iQ!G*U*;hn^thgxHS?P54{dIbU5=Nc< zT{~9mxf`VxJ4K2;{@iA-v9*@q26uygWp%Z1+VhI^-Tj?K6G4;jU*cOLIO^#!ozhf9 zjL_TLTr1&hI#Cg9#)GzU36IV6kSSR&GGBjtz$^F7Umm62xO zd+_?3KcrAFG&Bn$*%(NJuwtyCtuh;fzsP(xlxOD3=~R?w+bEZ&oFDqM=d+cfH0e$= z+{$41V@|yDuvE0RMP;SaPD7VTC8whrXzj|y&WZIgXJ;TPh5B?E3fZ>u%qbkC^om(m z_EJ+Jx|7K<-{ciN%>JoF{?$mLE(5?sLbH7+9>|i)B_6&l8_qclufEa&R(`bKc9CBC=*k#;tDOS>bKP!n5zN ztTHPMrB-u@MZM|A%TjSN(Xv_?KcR>SscrK-8sXcTD*4)l>_(lvOLk@J6q*&@|(QBX=JkxxG(+k z;Oq1=gy;mDC z0)adh+Qm8Z&CIloBM(m#ju{W<%Hv(XZ@3AKrAiTtk&5BBGlYj~)VnM<@LJ_L?W{`_ zroSXu>B)vYon%&;wvLQDDZ<9QMt!r4oZ#cXY%e2kKyJ$1?l|+;WxF-p#x^|3#w)d0 zs3PdZJJXpQR z+;g%qh^VQy=*lXk%kL>@eHox7V)qp}JrnIPI1<+m#4J~k{?f4|Gx=0DoK6eDe2Oy2 zOS~#%yLzu+c}cf=p>?6RoP%H2ekijDH>rbsc~xmSyIHC}m#LiJ6p%Q%c5^{V?6*9k zSpMktFCWV#2*ARR=QiZU9C#d|0fs7)Vci{Ql1M`w9ggi;XY}c6-}}19jPo zRh2E_Z0$y4rM%x8W1Ry*Z!EF@)Vx=vk}H?~B5iirEMUv^^x5_1z*_GKuUkc80e3`e z+lSTC6>~0!%koG~h4L%2+U;(}viPVkj`ZegsHkqQZh#fcT)1SryBQG7tf+A6^l9{isQUU(oKBvogLOveXIE&6Y0cOak)ylq&mWB; z^e6^qv9la1?L^yaw{Gukui5NuFASDah0rSo4-^}hIvJubY1FsDmO-U0b27yJ72FSB z+XQHyMy-+`r0vyVXk25u<<&E2Da!H){E z!CqiI)rJnN58N`8=m{RwxBc{K%4gqM7t}@ zLVOG#q@%cV$@wiG2i}z?Wty5X2%2?*q-&aWpucz&n}jjambcZ_E?b(yz86H7Sq5CD zda~WmsG%(DJ=v<+ogSiK&>TeTH;1;Vp6c0I8Wl-XijRU;8p2Ktm6%-(=QV=Q*weAE zmo_)JAHJdL^KR0SoDvA!wdm;?GT7I##RhC^Zy`Zy)%!-@BurKu{q#UX;(Z`ZvUpI6 zT&fI=-qHjYHG@B1`@xACgix;C=+(PY_qLX&!d}qHi-YK;)-TXq257UX!eL_^T*!sf zi~R+9^jGi7Ec=jozdY1$elH-dia4u0l2w%z6LWp}s^QE9LEk=Hmjn=k_B1Yme~H;J z;XI4FV4JEbEKM$16H(Wy9wTzL1hjCP7fS%#ri}IBXCtSCt@K^)!^72|dEXR(JM!3l zz>YhN7&bC$_LJrdN>cwnviY_fm<6@w`#FqN%xWb8q$Wnlpy}H1=9x4nZ`MlU=4&2m57UFlxxN__DBM*mGYo`wqQAwz+6h;4nScu-)N&KHD61gp!u1hn9~%}9HzCg09&5xV=F^S$1H~w z=yr5=1eR}C#KN;;Q<;NRxN45@?fJ|51ytT>APgPK*$(+1R%bzYo{L z03XxKAN)u|=f#Z2;bK;K_j{QQbMuP-yH3j>PYjo_c*5iN<(1)l;82iVV6d0=Ebk^OXM9si*s)jzzq7m$&CEa2zvRk zu-asoI|AVRGNam|bJ@s*)~iC%!GJh|8=>1SjAxI)h2691md9rzm&46(J(LMGHS>*MH=Nn;LyspgW($F^l0GPTC3WGLHrZ*9>bqc4cGv1EP5HRaChz^mV4}Ju5OA zrW6l~IPfvyEE22&({9e(a8>&(W|Znwl4Mx6Zzy8pP(SW^C^3N@F5bEwUJe2XXb_Be98*nGIXd~Ww={Vi7KU8Qgy4NrcT{Xq#SJm@H@Ta0Gtv^D>lpR>kM^ zzlQ%`#X-26y6Zp=J%DnWXC=>0mYR;b52PZO;D8^1)S-*4G6qC2mV*EqK_2CmqxmmG zQ>UI4N@(>}xx|iIYPUvE5t4GQuIp_NI^v*8oy7+!psDn>n@jQI?P2xHviY1gLyl=G z#W5J~wd%__sLRkPw}B6ohp(=h@YMW3aY(XcXo))YBB9wjG!9TNJq}mlEb^M?vLm_8 z+#Mfiei_X~CQCA>%EX#IM3iS36J6$$iDL0XocJ|TOL2^c;WP-(iy@1l%o}1x@?u$_ zJ~od$6k)IuhNw((s&4yeS zVx@zf#i}b*Pd>7s&4(^z+U^cR{i11z)LK)yiQ1x_{Epzfn`XG44YgdPT!K@TVwYg?!- z4vHsz2V0I2SFc}|ZNa43UlF)v)3wSyb|qk&8}3YrE@0Icg zY=@r4CF4`gm3s>PMMf0HD`gr#z?d$Hc;YkoAQ-6u&c02d<`tlqwK~IsqE%z9`7Nj8 zrq?P!gb!9YC^~OV=tu^PoxSCFn@%nzxInK{q7_n@^u#A(xs7kJgdNLQfF|T-KDnxA zcd)lnJ6!eNa;~d!CXSWxDjBEYC&RvS<$b5E9Np@kFX~j(pa&{oY*(iP<_1eejGpET7hooMsR!mxh}fKA8DP>Fu%JF?U$rwyntlz#;lE8tszk95X1K<$XYe0S30X{j z1cChc12HpY)<8i3m~Hs@LRy_;@UlVF93)xJ1e(u|iz7=n=K5%X++tzBXKw=7x`#j- zk;on{VS*=ad7Qn-;C3QSJ~h;Grc)AhV8)G%M3yo@jWjzg@Ag^P?f)nxAlrUB!z;K` zo|q&Ru-s~6Hta*6EEyIGS|TrWBYL1%3n(jK1{5u|*zlb`sI-{Uv0EMwNRkSd>r9np zoeI8s90zToMeDBc&i`W({r`T2yO(1G=K zpI31^Ju42X&=@UOsZu#897Zd9vk#Q)V)5{czs7lPH2|)Uxm=|}8Nx>yI7(zr&#^bO zQAmr-vS-SOU|RHL3UFzk`jQK-4L0_Tzzg(*g2!l`&GqEV5ndO?Yw;$c6RfU5H<0hI zV#$L(xK##L6PxYHqVGj zdPE8oTDsS}gX!|jyYU)9!)G@h?2_Xe|7@41-GD6Aj`{3|Ka;#>0`VvS!>A--OwVmS zQy9>FL|t@}_E@sUTZ0sLcgf0Lcuh^imjsTqyhGDIsEnI2fQ_iMkyg5V=$nkMP7f6O zN$pJ<6#Ec6#$gFBV|1B{UtF+TXl$l zkbtaCKfpYivs}aPD!1#AE=ND|z_G+l3B-Pi?J0J~X)(gX|ICxe&|4 zugX_ofO=91gLkEy#6Nngwc{IYA~;atP~5e@sv$WF(T()%neVSq%mZAo#k)cSR0B{4 zqV99|{ET4NyN`H^!%grFfI7bqM4_MrLRtk3ddT$v`F@dn%0}bXZ%UG8!min}=j* zTVYksMD;o6oQI!C-;w0$HN<&dVp1!TxG%dbr*G=(y`;n8}&ev%zxJJsSPulgY)ckt$B9+buD+-_bBQR}g9k1n+ zptSwkEQ$JwD>M?+T*gD|eQQrVN8pzcUX8uEbvlmQ#nbVKr=na;afjjLAH7cf@^|T_ z$(9(SH1!WRsXQ%bd&S|_7^cO_o$T%}kc)9AcR)`qG%P2MNNH!cv_RB&c#5TWr4fn% z^eBr)JpKEK)S^oF5|o;4PD?l?GZ z0`&YD6s*cw`U4RigKVr|A+Pb!?iuWm>Gh^+e>-D!woio9P>C6mp`J5?>#{Q0N}M%u z-oP}PYl=`(;JtlGS<2IT_JQw7I_;{gw(qu5g0)eiId;h(CMLSl+sc; z{8u%OGhII|GU&A1V+?wOU+~!`YBvOdgh=b^XccMU+@ij@pzd z|5FO~5h-s?5l+Tza&A*s$CWijUr!dt9KJOs7+eap7p;|Epg~Fod_6-rY@mzoN<$`# zcv*+u(Q%mnTH73WM-(p%MZ9}L7L5D+pc7t4i*sutcU~^4ILreXsG0*k@|89|lMCIj25+Yq-@4-o_7b1^F}Z>EHJ_Qym(FF>-z)cyv|k}f>^a~Mqm!39 z6_C~NuW#{gRLTI7A6j9JSpD*yh*Yh@UUc=~bkunQ_Q(?D{7F{3CdGu>b@oF*>ymKw z%acw#FV*CH?q&UkdxC6Yg-TyvC2_|95sDhX858^d?M$=Q{x!h3Tu@Y+_Wl*iDdDge z=xJ7;>wx(BGXgN)S!Q!fuN&_3?cHU>ECx#*w~(*_V){XX6;E4{`9yQ`(&))RFkB%h z;hvNpXB$HqBMFD~2p`Y$T7hpnFJmM)GiMK-*CB$22{>49O?6O-_{Rzs^Ehp1e)GLr zKg!N$vk>fO(9N=HFpyoLg+TbXs+yuRmD!R3JoMDiM`cs35Hl2%g#zFwUI8zhXp82% zfFkdDxagytKczJL1a7&Y$<3ruCuRO4HAs-dL>D8zN<9ceUd0Kb-1G8mmE$N``jJeZ zKqkVAtc+k4#U+^5neNY(*CF9C4`vfl;*@KRpb1iE+|Do4_OYsnDAxDne{L{2vt4rA zFzctmP^R8z&d=TOM3WSmt1bt1GB7^ge<%@u=78`wpdT>(fYK{``0H?8n@^p=9}fbY zeW_zq;^`K=n(d86S~VAr+KzZ8mmEIhn|%90&Gm05P5_A8*B_vWvik$;PX=0X4FTn$ zF-wIDVGg-MufU*OVEZ13Z{3sJ>S&%#Fc^o9@a7lkvrHFpvfn+~&oP&69wHGx6b?O`{h~B46S}n*$x{%= zt=Kkq!RD(qPC8$j8r*TM)pr)&11&XwV+V~!bue`lEszPUFS>kG_uID9#q(Jls-T}} z4haBKXWwNn^kS+^B$E#r*Lma(@*`ZoNouvw!7f#r++AYA62Eg<7GX@RufK`K!t}xP zgA8-d*J@?(yD7kG)kAy(kV2HPHgosjZjY2=!#C$@HP!!oB>(XoMiksqWn;tu-kCj%A)Zd9C^Oz~-@%@+T_sO5 zcNcI`)~L>MJN)qFZj`Z=sTNB5t;&(sJg?xM>!Ou0q-Sd%9R>u9%J01x+$WL>dRq+$&+?pCrr*pw+i` zhptStQo%c3H*ngo-q@O3@x8D}IseMqWp?WQ6`DMp5xu?0#3FTs{ZE6g@87dj_qKs! z;$XJhF<$##L8120XFvIBAlXY+*jqii4k5NYxvIR_D4#0IHI)3X!gm}SzROU_w!?l7 z58;%LGZTPQHV%7$k52|T@he}(7gG2(R4dI}(TIME_UIa`ZTBJ~M4@rFT#TTT{wFR? zZpDTRke1(ieZGz#n!{iTR&KipamTYlDXB<%^s@U)dmvjPirq1m#C?;k5uX;U=UZxf z+=~Y7mK$t_vx3JPgH$M3UvILI@L7MHVZlOVP@ToGvw;k}dAZ0)McPHCK*IdOcA&!dlogr)M+pKsc?8f=n|T6a4sfGH7gxU z?W~r3ed{e&^XM(LWGDkLa8)&yg4qU4CkcGvUWP%HQ4BzBcV5X|_{?w9#_x4zs;K1( zpmovk4S!=aylQ57zB9Qq8%9=E9KBE-Ln-n^^5=G;fg&S@(*Q#5u-a?Z;ck;ZnKc4m zpC4%Iq>+?D#XUR$$2d$fD3ABFsw9k_g$ETWBhkL8(y^m0e$-BfIwtUMc(`VTU2_W1 zUnt*_D>fETgGOjc2T+#Cv}-KIxnbcIIWJ~-6zGXTcoX!H{cr|lRCxX)yS7dhV0H=5YMRqFiYh{&F*_XPn?B|6}&m`+LVZ z&^&3mkrF8a=POwNFi@_@P_F~d?7#@DM}e$b_e{a=zO`&qAJoK5qDarJ%)abjNO!5#$$Vpp-_x+pwlEw+=rB7 z*l`Y@LnJhFIBbHLe_V7d-cl=m)Wc$BQbb@N-lvjPq0I%Uu?E%Jrs? z;`KulGx&fB{}ObHmE^E9=aLzYpxAOHI@(pl;qDMYHu4lLVZ*X^J~6b|i`JhCk0|J zB0XL7E-B@x3QSCQP^HvgXI6d0Y242MF(k>eqc367Rb||+a31rVaA^w{kgPm#4pEmT zwd5T4jyDnXyCO<0pVE>L?@2iT=;0)Z35f*J_?k%1TC17Pmq1{8)oZr_KIlvvo5}+m z9>TUc)P)wzSzM0B%&rWYI)wc6Sc8FN>`-2Faf~b&v@8?U#^^laEeL*+#qGGYm|>8HgX>-W&9pac$zyGOL#R1KUbd zzE1l@A2L-gwJkLT6Uje8pAnm7GgeplhGMqjQaPvq&+)Fen5-$!ahm~ER9`OD7)JLp zz2KYQt>IY*v~-EZl#Ds1M;b8*W|Dv{e4>c#MzR{KViR=WV5tSEGw$k!PsH?I=E+cS zvjol@S|5^i6%m{s{hQ~nCL0Y{8<#4Q9IjkALxOIhj1kREA@p~?y~hm4kXkQhFy`T) z1c1p;aBuu7)?y~vrJS!F(y7%X0k|m!m(+T1;`ZdRnIpaEw`LNcB5d%uKu~A%OZ+lm z5BRL|05lDb7x7ZzbjI&vFOlY2>gtcRx59`ISkH?dL^~{{tnuV)xA}t--*n4mceE=C zD+mD|N}?m-7EkxEe6-;i)I6ZHi;U3s3k_Uee}XIK46*7iT|(06-GJo!eYl}7XsOXi zNXF%z1vzhX7S)%o*db~#5@&4Q`z0V2_~9Dm_!8D=r%s=q$jC`;uxSn(m?$EK605Fw z-YscEatPQg4uwE@^1XZ7-x~7S%!i&jgV%3my((3zl=~wOh^X_v@sYdQ%@KWHJiGKd z8$gxKn)P%{*1k7>o+q7SMFHfMZIK?bX(al-m3}ylER(Ht5ehOU67W7)Y56l1Q0t>>^Z>mYT+ z(_ZprVDJf~6ydeo9)BP2N0jfpGjASwQWtWr2e|k;ZUfk(->sjflomKjZ*mrOMy=ZQ z-8Aat`!TuCoU&tM16Fj%V~b5j|nL4Sh?O5s$e- zEmCH*o#5(;z=SHx?~w=O+9~-&`XlD+Ta}VR zr?MhqQlv?nfv1hIhY?axU|6D?Az-^CoTu3~y`;0z&@q-k2J6)ix+@(FrVf(I9#Vm< zZu~wh`q7nc>xr<-5R~C+i+HcW#?vK+!i% z(4z(gGSNTz0q4*B2-xE4Uw;<;QWUX(i~hONPN0VQdG;bj0N`~71TGTh00J*;u+(Yb zdyX;Mo)yRfh^fmwB?~=Sk%9C&7qH%lZo6dZop^E{d#Ts;zDB5KL)0`dkv4>6pa@4{ zKwVnhwoe>sLjn+X#V(|&&Q;{?Al#_z8l7BM6CgNgfYnRI!y=m3N(*463ogEerZ4ct zJc{}4R+@$?CYkfg=u6s0zZzQJQ_d@i;%$>&)$-s&9dXo>0>Vgy-Q(dKXnlWh3gUD*) zWh1X5iOaz-NsI7wro4Ddkf6{Bv>?p}|M<`<8z&xHmM+=`w?pUsd-b?<-^~D(Epgzy zr-@AQk)grg+uA& z@A5c~e|qe96FnNGK0h)u0-tCO6_4c1k_xk1?L7~iG~V4dh58C%pvaSK=fH{|0u3Cq zWa$S`{q?3WwpHYh=T0O7n)r(&a4-}!Z4BqIW@5gNCZ^N`0-+f=`;rTEhg!a*$O>+~ zAYy=i^WMF%_~^(^g)83~LxBO)DROlRgXW7u5d4ySsbRCN}vyotYY6-<#@e_l;8DqA;R(`5POrvJk{e(9YpSgR8) zH>mq?NSic;#6i06hyD<<;Q|U>$i3%soJO1rgEI>jc!Duy9vF7&Y{xCU<)8JjV%_@P z)L_ryLRb#p6QLD@@uf~$lFYwhng z;KH^blS=!oKH* z8VJU}m!5v-OlRQ+slU_Dbr3$48mm!`ob2w95ndD2YD=t;EU(S1t|^M}u_aXi@C}~t z`K;PKtC7Xkxg%YV*SEUgxx=8jvzvb*Pq*U{Vru6ic_3hYc${u=BRirwM6$ag?D7ST z7Y2Dc3ng_^mzSZ@AS>jOl93g2Kx!GnJ&Fs05IUKe{C(i{n- zS*M}rPyB9P?V%~NEUy^hMW5%56xIdQ63+Ur^7fo}mi$!Pl}jv5#9`WnDaDi}Oq=I1PYAp& zPy~Wv+|&l+!)~#qMDo2UHwBimK;Y;J1dX(QDu)jLS2yA!9zY0ctoEz-fFA=stsS^v zEFN?>q(-Fj5@1QO+c7p57khq2fzkeanGNQCzRm%&tBeq`I-TmNp9<&2&Fu`j&MFt7 zj6%KWuJ^GrA9@teaF_u4Gu>y~eEFJWNoao7*i>vI*hL^f8~sKTz=ajvG3791V*3V= z5UJsAS`8^1UiP>qj4JG5z(=X%q)@2O(XmaIC5pGjrUE$iK7fK=x@1u{eWFa{cQ%9} zQr8|t7VnPCF)pRVav69+)3B{Ks)w0~POd>4mh>76vy%5eYc|S-`moEVijU=S9A*Rl z-j9X9f%Q73*Q#6!KL5coy1L5$DZS6XP*dc!V=FP9Z0YO#@|;RBlz6fdOgSwdrr7Vz zVz(^D8`QVVJE=>p=hM{*A^tpe%h%}C;@#yje2$y`SQmW3B2Zmv01lJ!NsMj^rDLr3 zyT!JOa_@@~$U0pMswFJ&+j{~x9T}>=8Kp97itwsxdoEQ_BCCdWq``QO@lB)f9R+Q8 zd7`Naj8g;{u^9eRXt`zWtVP8EeK7NsX>0rp3$PY<@mO2XPfp|Bdj>t3p@83M z01lKW`v-#KU+>CpNk9s8^^|hBKv$F7qj-^E`@jyU`tpNVIyu?30C12AZ>uN~Jkg|Y zWDdunt1F=!K=Ug5ZOes3yEH0lDk=?Y|Tb?3)X{jm-KhDfNj3UfN zO0%wvw}F){{vt?cYHUv^VDN*$DBKLR)67Z>EekR9vqxN^EC$(c^7PO>JMXVV7{}z= zuR&4`3N0zH!hv&9ks{}W`%K{al_Ele&iVX?xoJ$?n&ZyZM z*qG<0xm5Ie;y!ji1wa%jV0G5JF*Ono)>EGPa>W9IL=5Z$4ShEmO{iT4-bmivT)g%O zN=5zFa^+j8y81b&>b?|?K!6a#o;W+p6-+;EyZJ=uQ2qOR!+7V4ZOql)b%BRklBvST z@?C{s&5TRIX4iYw`fc%9WTi0 z{4tMyXIB6E#vHQ_^Qu3)IP$w@ro){A+qu9BRy;D=sq{^wE32b8rSFG9qvj2XmWU%x zu<(U}-FWd$30U)3nt)n^8uMF>a)cEOW;ce6s!e z<|o!IX9w2NK82AF)mYh|f>;hFI&fi|ljKy;z2|p2hJPCM7p-i;Mqs=Tcn^DagiFpx z2{$~XDw7XI2XY50}s83OyLxmIDPh_Bq-g{m345luT!yBEUR392Ac!` zdtIx8C1$YY$ws4I7FOVx3!Sn78C)C%NS`3Bk?MVg$uzmt(0rZKj6zkw2NIP2@;+I% zc!U2piR<(Y@girlwv&Oqq%Dfjku9vxXQY`!gc60B-!6&U3S&~fBjQPLg)rYTSqnIC z>OPXtPBcZD3}Kp-Rz;6kzK=%T@KvxKvypwC{?GzKb=Il3_}8(NXNi@R$r+RuSS9u) z7g*>iBxUn4es#ubJ0tMt13_-ras~_+8+Q2!IsoD_cW)FqiX6 zsY+z2HmHxzkQ^8pz$sE>_ul{!VH2wN5HnDlBQDlB-*1M zps%E)slRC}0voK&O)oPxu7DC{and3e(L4;%TOJs z5UdG}khCjkexN8^wNlNw0$7nN$u2W78vNQ{xy}K4;3=?k`h$fB6`xR`*phG>z5&}+ zjh3NUCokDtRsw@uLo0kMh{8y z$HB#gtaXsaG>7GUFs3#zuu#iymGHRu0|Nqav>bMe*wJ|p#$xu>R=LPA97}-A#L~^{ zVr)DlJ-(CtqG9|Mh>kMAWEfjU&2X5|+Q0+$*Cx4FGi_M8W&bp;#BgQZYhjxh?>;4U z&Phki&aRav0$Fpz^KdK4>wKv;IllKmE%RUQ-!0R**R2JPNR*P;jF!nlbMz z3Q(iNfy^exSjvlT05D?&e4e+2oTWeqH=2$G<*n2VS?DgRlM}+{j+r~N8p5b3L&~X3 z{nq5$`>Kw6q3_vO--e0UGEnFRJnD7{0je;O_Ys>HuH8 zc{u`NMh?)MVW$cayr~sqWLsN}A4&50dETnj13I{&6leiIfeClE{Ggf=?4*RLS9+nlmsx5X9uSf9> zH7peZ)~tA(R@P^`<+Y_^wWm#ppu{mNvxC_kKnPSsCh4X~-1Gu{vqZhLMM?dYz9m7OfKNR*0GU(1u8qfoF>` z)TF1rZ@Z>LI+%mNY@q1Y#P?AIc9F(QNW)^PH4JWr;hB4S_Fwf|Zfw7eGN_d})Njv) zxGspLpYei=q?JVgUYZRenS+xcWdENg@?aqHe-l6os5d{Y`J)2a#K? z^loGW|FG@PM|k7yw7_2Yr8FfT;VD^cjFzt2cw!0z0?Rw&n9F%*O`P}lS)I0}%1}etNF-VW^ox$ODf`^Ycw?;Q zK#@@>>HR$c{T|DFl`M*+U()ff92fpabw2VGb}tr0%HUm1BIrw?ym@|Y{UWvb$Nmk1 z_3>vvtEZ;XGR|XlR&|b4MemuP{7o^O9BH=tJP#%2$J-;v0WhF@=xrLW&y~tmJv?orda79o zvb*^(a6=jeH$dHNRIA=SvmW;rxci}&v_G)>t@=h_qc%j%xs*0{>|1Wx|lvQ+Oon(s$ys9J+JBB}srJ{*ijJw#G?Kw4U3Dwz{Bw|(FHlYGjG$uV*RVpt(@W%c5me8SbZZ{ zqZP%Rm@5QiyjZhBmgwo$E3`6({Z<1#S)nJ&0ORw)Q}@hAay_;=73`Eg!Bf3Dp`>SOiFtvpRrM8KI4)A-7g1WEOS3FEQ*$%kV z>APpQTN3ZfeO3j4?-j9c!P^{cQ!PIjB#0?ImOf2V1`;7%HmigYa{1yOQ zzK~!5lZt({0qOR}Tn9|MElPb8>T&+`69O*Bh0ijKce)6|(fLD}eio~2SC<_Ke?rS` z11#q|l~=3046AnSWq;H;p}N&){Qio@U%nE&4;X1b)f=IQUN!^BSYX(qg(ET+UeEfb zjB0^L<$M*-3d_W+6cwn{3z;r`8E*(cP&8ZF5!e6|>9?W}i>qZ|H>&}@RtK~9Aj;%> z07SB;FZ(#>uZWFod8d?dd(A;XN$mrER`rhwqC$bUijCPEou}4~8e;@9(!!O$!xdVQUn787%8@wbl1P?w<9J;VD$a`*qJB~&i4_RHjV?7<>UP$saiOs`x+ zlgG;?H!atGR|osnlh1NzYzfJ_!dfG_NPJP!ciN%^h||q@4uhoMyW5>2SK|wPIVNg- zVE+bj)oufAlWb7D(3z$|>lN7_P6&J&&q>%#}tSHMRFPy@H4X-V0YqVg|g=S>hW*Qi&Vph$i6UXzDQ< zm{(nS_l!-``V=-qH$^lO5wx*gffNHi`(VBe2G;qv)=GcVp#B1k*spG3CzpDrbIpfd zwo@&C3XaKIaK>b()M`8|i=34~Ea255*Sa&*)Br~~m7NUd_vQ1z6tHCLhcuZljhsYU zNo~y<=nV}zKK%hGYw?)DQYpWkat&G%4*deO1@h4#@Y#G?&wa_BUKV{6)e9R(f9t?c94#1+5r!$ya zLlzY>EoW7~TMQQ&Wnh;o^t-o}nnIXOxS8@m7%h74@9kjMNexNU4i*GZ|? zYy<^{rAUyG>tJMggSI2v*=dAZO;S3Kl0Z|nS0>v6fLaJy7zVE+X{WPLp^O}6Qeo=O zK$+?j{LK#8c5ahH{~j49%5U*6pWf~YBGC3i&n^c+^9 z1G~uqz*09%6Y%G&90XF-4o-IFsJVpIC9)mK2<-g+n8^)HPXNSJjDsocf-Kl+)J$l< z8o_Ba*`<9J(B}d1YL1kEyt3vlvIe_qDIZA%Anb<2iV$5eiO!R*zD%(cm%OC>47q~z zIWuoWFzo~AV?#D4ctJv;2xTO$mQnw%2O3UQkqyb$RIo@I>-)XBN`pEL;Hd2P!s(8R zNbnX6ILG^%uEQW6bcn_Krj$04FkI|6z=q4utNGf^5a zOk%}&uz@o1U6pThha+$egHm4W9=^wT`kcUL^{G1vu{xI!)ViZ@%?E#10{ zxSUoh3MgCbg}e*kEoXsX39C8%<+{fx`5Bae$(uZC+t{U&mM-*k25$!n0`InJihJl` zwC{-Vo&$FH5Gw;z<(8c|Aj_kwUX^_+SImiF)!1f7IKn5p4SKM1@_aUr=yFoZ+h$P3 z0yzv&lHg50S-#j!V=eG@vkr$=1^k>5UP4&QC(7vQ_P`=+ho5MA$uRnf6r{FPBnR56 z^2yrlZ(b!7DtkB>kOzF_3zmQBX4tQyuK)J>2e5j-JW_L7=c1XU5aAf=+5WrUuT&-3 z#ueLgRnAUfrLSv0(qJb)AXPhAWM+M_oR2$c&0)|J2qtUsZGxEz#6@KIK1F&vlR~Bv zC3XWY7OeQe!YWs7*9W&uowBD{Z~RJAyFSHP9iEqs<&*|eiQe@BZG$|ZFE)QyM;IB; zS%dfcNK*LruzxbbB{7Fmn9TM5Oo^niAAbY8!Cp{f#ajzxbzm=Io&aWsP?n4u53h!@ z#r;Jd|2|eAB&Du^XqQ~&309T_bTWg8DUtY}UI5j+u7U+ou0CB(38&RRbV>6t60~Y#@|Gsf%f80 z7ew0(%r(-eq#8M}u+F+C^Z&8;mSI(P(W0mz_z4IGB_)_N2#C@kh(R|lS`ZMB?hXY+ zL_!g1q`Q$Wl}<@%kdp4MJD0Lp?+5JX?0wJP=brmK{(D)xG3J<~$CzWNjxnrCp8xI` z#EP8)ia63nYC{!&etS!=-5BNz!haZ0?aX3dL!Tv}OrLv4S5R2j`w1bv*C729$x+XAu~@rAK?w z<^|IY6HWRlX1z^jGmzcBCgAqQkH`L$_42x}QlW(`gGv#VOPc& zhdbd{R~%5#?;n_@<#FmdM{D+v?B{{ZKm+et{J?SO1s0_tHCp3G>UYs%K-Z<|z6#rQ zXgR@}WdYLm-?ti*(NCQcT2L1p1sO-TG}ibO^$H=Wc%vuZuZ(~a+KZKNCmfU()R|3( zu$u}ssT5z=Zd6*VB0oC{h%VD;2sL<3sF`92U&(U$*ZH~~!;V`g()pZS{5V93J#Dwq zFz#VZt!O%8SDk^~Ow{;6TVye&67lc495vxVcuG4-3p&S|AK*^b8(eV8D49Zd}rMtYVvnLhO5`{?D#rUg*hq?KsDX!h}ddZAObdBOQ zMLoqE^ymi?(Qn@SGW$7EL@-}vB|cBh;G>R$CV9X76SizQ|M_U#)6Nq7{10Ee-{T0s zvG=lQtz@fzZFKa*fU;-B8TPf_EXS>Dw1&2`C0NX&!Mb8osf7l~1>L#}n|f*Oy8k46 zf1+DG&}H7gG5k|lmE&3~%b6>DPXB6r8nFYBWw%bm{z0|wpNP5i6*IDg|U%a z&gPGQyCcRO(|0|3Nrt@pS=7aX)#h&Y=w+r>nXkpet3AUdTeJFWP2Dff?y7@Z82&XA zodSu22rg9OPJhaPE0+&`^La$Us?4!SyBDVOT>LEY-VPRM!^XJ0tPx<-pZQEFAV_y+ z*@JA@+wu8c-6zWdQ&o5DErY_9j`e!&UHVp(ZW}9A_QiO%rTV=|v&Wm0%O4b<_dmhS zXfzPR9_qImUirvjJ}LDz^Hyr``cKb{(GS7ex-SEW6TQfJc~*O;mV~+VzPudQaQ8MK zmyQ)lsPdiYbhKTf&zSif_2HtTf2H{Z)}XwSwRv<}zs0DKYE-{tseN#!wscsytpoq^ z+(7Bq>!g;`^20wp8Edn@wH3`c8WyKmJY!bYDSf^(l)^ldzs92mJf4}`kCarrra{@t_W)0uV$l(GkJneaJ7th#%Ei0+J%-HTxygb@i~F^;9>YDhnPnFBm3H~2 z0SXYzm3BauP2Hot&yQ{~wx(GE!~BT}>`Vfb3A}dN z(+u96Jo}?mxZwiNR##KSDU#>s1~wWU8CU9)QgH$u@jy^6R<8<`UaZ{xnpSm1W|s54rNb!WCn42;{y}thC(| z?ASRIt{>3#rGU+NGv9JOeN}Z*xS=bze>1$0ZFrA-w7^BS+)7?X zDb8wQr)(+pG|G`b+r9BF{LNIVV!;zdmYJ0e-IWmU#JME?BB{Bs7_AOzD^Ln zotTvRCd!+Gxy7Bc(1gt9$56)bTh7lt>jqg3w>=AIOLAK$Y&P?~F0PCOhPghQh)N4K zC@?Ns|AHmVjzeBzz_mPo)t8vBqfiALRlk`3{nbYhZ|gj}bO#qA8~>#!HgKEs7#!I% zt{_RhPD!mJ8MeT(z=P9L*y3L6 zC3`^XV8yk!Z5sMkoH1g+UVMvDzI3HSk;$Uo!x)H=9NWhkSso9(x*32Tn}4V(WiS`S zG(7V|Z3i1POq>wjUc}*?K3BTAviJ0L2GI*Kt_3~g^0lfv8j0PcdMP<_q}vsYg1SFC zJ32b%i^RDW?vXn7$`6Cy1k)`_2~U)Dw=I^xSA82(eC|8Z4`b1;q>c-_K)5sir9kwo z<6>)gg+Zacu7`E&r{3%VRmYu`f+pcL6_be=sW)WX?Bk~-Uek_%^Tn6&DD6f~d~ za%GS}XIV5mml4H<6KIF7gvM?qm+qcg2p;GsO<<66)7zT)?B#yR=9!0toT7e?)yVhK z`?}EseNzv33$j<2jIz>}{U)Nkc?bkLVcH%EtynRgDyE`J4jY=jle}I^wzK*2Ar6~F zzLQc%`9sdxENrA_U{`L&?yhY^T4v)rU6!~|hx^l|dnkd#2AZLkFmK^;j27#66=`Ov z&q_geO)c+!-MWTh5Ia`7<;Zb$wLYuKa=qMRHpKt2-9qkwg(9ilJR!3^MK(B>?AxeD zYT3Ks8x*Pkd7_dDl-^#aYhe!p{Fj?5F3yuH85PFWnsshgn|DXYZlg{(+YMC*8`30Yel`cQWT#p zYz+*M!&RvT1(UK~YQC0|`HFbZqWOq)iGxXqsfDYG&vFgr$m1(>{e$Zrz0~CDL02jmu6=@_HaLE*L!Md_4@`VYfAu-Om5b6@w7a$^gUS7pmaC`S` zsrNtRRyV_JXS=S?iZ_)^FOpZ??y-w*wN?e{OUY`;)wm~Rj|3FXSQUykv|Mg8?;s)w z@7|F%ZoaGf2K!EL`m91Lp=GIckj$OuLr}^rj2!GhJ7_GI1d}TOB{f;S*hB8 zF0E)$D7H{aAm@Ej=^o29x3lDzqCWR9-1j2JPtfVg%xjs86J{*Fwma9zsR0jA@mxuv zCA-vTJ7=#xu(O&r6FjRl0lTxa*|`ADK~;wDF2_CGdN$<0m<^Og<@%heL|vC{T3fb3 z@5XpVPNxbkWASo}RO#-gv-VVQ1D5Sq#EU49oXSxZcYoq&RKBLSMYBO>+iSew%1GKa z)KZvbD0Q{k?A)!LOCta1TMi6MGa2-*P44CgmL!MF3X4*;?tbKTbSRt>!oGf|%dC}c zGCoSLfw(7YLX4qT075Fx$*2KJCdMH~+r~_wL2h!c83#ie?#a-G%kZjH(XZ{3D_YVbnzw!QFv7 zxmT`2+=0O=-V(02yt6+(f)nJi3k}5YgJfbDzrVe-H`C% z+($C<1U|$+xp#kPWHdbZ>|v&s#3|45G63hDSkSUmN=-*dm+8+Py;LHgNwkvl#}s_u z1Y3g=Y5Fj$pN0#)SxtgHwfY&W-2!@yr!Ct?Xjs#2Ct^G@7Ai@q%A8*is|ax{ul~eh z{FdC6r9MCCe}(nD;twvmsgbneRfXt)$W|rk0bs67bxx&}s-);B>-M*Y(z2#1nzzg9 zndVPoMW1?!OId;^9b0ssMZ5k@jysMQ(2Qvvq|9Vu24nsX-qGVRgacct&3D{Vv&3S# zVonB7r!k6#T%1tTt)1cc>Q?a&&%ComK!D1$`0#DudDYj=O_n^$;93qS{pNnVJ6_R| zAm&9uf_2{)UdFM8P{pN(rQQR3yK9ykYf@u;*w+pa%jd**-+7?VL>LrK*nG$OL}aL_ z`(vCZS6gZQtEVn@Tdf8CHoN8OG<#0Cq`Z=Gg_P?$D28a)RWdBu(3;V}HWUw6(JKgd zU{E#BX;=S|{^Waiw?g7abSUS+ho8|oIxnLXFj0nGOjwXEo*L$yy$H0{zv=+zHD^+oqJslNdktq)jxs$&IR<`5!0JDG3+E)0%aT7JnCa;E;J?)I0adB#q$`93TM*A`Dkb-4k}CI& z)Z($AhpITr1oAe{R!zmLua_E02x(KYTQaR)vL6Kolg>w1hSG}+7qnD|jZw9DejP4# zygQx#6(?|x$>%5_Wwz)yO4ijw%vyfr?QW{JIV9{kq2zd9CpE2iyeBM-brT5`M7txF ze)`<2(_T~0PeN|`aBh7{b&q(@d@Oeu_{Uw@rz{el^j)&u2Ga(#p1&bw_hUP{fzD#+ z@Q?@FWOdrNml#c!Yz*xoC3e4_7;jF*RXL%Y^tf=;3V-&x%zmwp#1WY7>f@mnZvo@# z*M{6chAkj`b+B$e7}~8=THzZNcMtX=q6W2zYspN>w1IWOb1F53?AvrBtNOQB>(k?_ zZ;DsDX**OMU(AXOU4ks~k0t5+8nZrxJ*wmVY$UnLMGys6<{x@NzO4qg_L`SxU2S{xQ|Y&_XSwmxN;ud-s6uXwQW@CB zIgWCw_Fg}pwu)*jId*e>?$u5DVe}Oni!cfOr~@-1tOi<38^arg&CQka_Lq(Y!GkI4 zAO`Xs#Q5##+jOC(@^N@PKY()4X#m4IZV9|I#m1 z`A(JQ*TvK4|LcoBSp9!^(Hsw6?uA(p{vY1)pF{7lk6$MQ(UuVmf=mA^n))x{WB+Di zeDHF~yK6`32g&{aZ{7>Xa>NMSs^BXBg0w3BH_&j1DEOkl%UNlDIUHfw{{}R@R|3M? zkMgnAp^qNBKmXNxp2>ih-$(Bg|L^0RgC#rrVLellUqr+5{%-;G(9U~dK2z$9kJv)W ztp9x?K_EfG1PDZ-Ftwrchd%mWMelKsM@WK~6XTol9w6$!@j{3p!dSTmmyYXyf)a1h zfR{(P%u@dMan1o{{1xWM>Vm(*{8$$HE6k6hmj7#n`OTHV6Np*>giQTU%Z$H*{W#hE zSFj&PNPn&L0|g4b_-myfCvE;(>Bq9rUn~7s6XUOyehjtzwbGBXyD0uz>Bq9rUn~7M zYWcs$N~fSjS(>{I6wx9HSpcNPjK!V|nSXW&YPP|4*~f|6$7bCPAS64ztUl|55k|^3l_H`Y|Ctm3SRQoO2fG6_A3L z)fr5ytN=|7heO%3^t>jOkar`rZQXqe)=b3=RpI5S&I|Scy4z=KHj;HE*~NWE4@dN4 z&PlkN+(^VDft@?_BEHLLZIPJ1H$0K$66y6Im#e6iedERf75nfyw?!LtBnL8SuO?q7 z=xk}Z0FtAgyNa88%7Z zDeTRm=gJlVj0#f9WV+VV{7pz`{=krUC4xZKU&Qm>0XF$8K!PDtk?7HZT#jf)1)X@_ z2D0?O1#J%7em?$@EcUK|Kd$}fq3nrs2$l$F)cE;}tLQYCm4bir6wYgho!XtD6FKoA zh9Y%`lV?Jd5jdkFG84CRoDj(02j00CQznPNzvt!SiwEfq=Su`2!RKDi{q_J>u(pq& ze&ZvHt=!Ca;tqQ6Ggdba?*DTkVeY(ksbdBrRJ&9D z%H_F0-C-2bT#<-TkP(!k5kZnsAlS*eZ%@x1e9ZYLW)b&J3Mc_*&pFZE-5r^elap8e znEl{}{fme})QR*l(C=7JGC5DZ^x`e67?%gxBa7{kLjGdqhjUQq1QPBvMvHWz2P@vc zkhtlb*%^uX0jKWz0WGE1!^=s=zFj)_g->k*gKjr+o>(vWJUx90Rnd0lP|cyGpKvb4 zdcP78tMH!eNNr?w0ARP0#V4#so?*s%pF9E#y{?D5+Jx$<=6_ zhULiWDg-P&g&j`(O0YYF?!Q%_QNNz?n%)HY$$xNYvYi!VKDBBu9Qr7q2YTBlp%A4{ zhj|dq8#D-Xg} z8}M=i$G3tH5qu@VF$d>ObeAXFX%%|h z?t#%4SokjihFUZ;4r9m_V2CEf?$Z%~Y#vAa%89=;wg?)KAQtQj%E42OsI%0NKZRn| ze_XJr2hHMJIY?X&Fo&SIbIzc(z=O>eqtXw%Oh$tdF3Fp7buykbG6i&pD~96p0OeHN zahg9QAy81csU$`eWX>{M;~lVuGe1bi%2#K@ZXthKMF)Ki30q^u5_Z%T6&15Te~yG6 z7We~Fbv_>;D;(X}q#XT+%M-1XJyuXIG()K;1z;lqQ0+&XB`+KohE(F3)~V8d_Q8%wOISuDs~ z_bC@0_wl;x5E!!Yprm^r=9dh>$El+gP;h*- z1AKgg;zJqWBT~D06N!&)0dRaFkV$Xs%`-hc&yEf`hGSvjvNnlMJF`Z9^Cr-gKL2yT z49-j#R&dVMf6r@tdt{ICWGGlug#TfcSISU5LtG@48YSUbYi>h_RA&2Z)|}wP@gAEW zAterkd9yUCV4~p4dyjF1paN&F3P7=rU{k~jlH=FiL4$W`_5LF3j7nlXctso`l8E=w z!Ybj4%sk~Su2}{_( zi$B8EQ4aV{MzE~zi)>9c86tnXda)X2zfptA0O~;2ot8?OMD_9;)AOYn89Dgn(w45VJTY#om zV!$Ig{6BOQ^W)6c6V7(0@nQ)4&(bF$!SQhf$XyJ-N{d8`&m(}{z>h~x#hxBfh@f)6 z)gEb5>~)mMB;M_12$A zIR5ZyEuF-BfgoK;&3;$)!*rBL5rHG?O6Tc&@Z$XopR>-9ZIO$gH1Uz(EW(kyYx>j` z`4cmS6^sq{-Cg7_e_(c2+NYz`T;GZ##?d5Zyg>VP<|E>SFX9oZV1ghkwNfiYo)iOl z5+j~*;($~WuMBDqB|cRMIrLS&K=jup52fi7>kB2GAO0Ucu%;7zG?@-q0P%&z%M$Mu zWO%ZZkADXINxt$5IYX02A zrwoXy;NCIEK5spOv(F7zJz@maqM*jWs}h%~2`CVx$tR0eM5pvGujtQKQDyN-;^-s_ z`dbseMq0jq{ul28OdkA9y8Fl%?*qdFmlCz^A7l||IDM|V6d-z|$rm4qqUvh^(;_0L zj_jZb{U4gj@4tUkgT~VWq6(-!armProNr(N_Gync5=BK~e->FlZgiQvbBO*aRMVDbVH;#)|e(0mQfK0$b?I>=|< zs{mu6CGN4)!Q-;$=QE9Dnd!w2eKn%~k3f_iQ>MCo_c)&^0*wy!*n6eejHP3%p8l6A$ZveIjUp=uZ`jtvGCbzK8u0h_yvn755K8By$(Y zLrfUK)q@xBUr><4rNpQ}9Sstk5mkWP?eS_%BwC(c0NA~8;|21jeOk}orz0i9tA7>i zU&Z=Yu_AQ9|JRBYDOCW^{#B;G#ob?JO7T~j{#B+((+U_{f4x+=q?GvUrT+C&|6?!p zuQL7Xnf~=m|9Ykf&G|Rv`#&4b+L2K*$g<9IQw#5&-p&faflSz!Vsvu1}m0Au7%Y|Y@mnQM-Z7(f!>!syz((Qz1 zfh4q?vU&S6ef^o10iD(X?QpA~9$?bveRtD1cK0(xQd_o;EV~Yc^V%+V2JBeCEcHtu zKc1Z87;4_(u~s~1uiSkmtz=V|Yo$#(1GE5n0Po~yW=I_Jb9X6xPibr8@{V#zlpe@> z=NNx=KkJ>-p^!9d%25YX(5{u;v`&kOiJ4Uj#eO&?z9DR#Y#B3d0J`rnJ!_5-bMFXd zX?VBF-;G;CSJ$Mx(lORq#|V!?%7WOZW2eVKuxUSx6dwtXeP%Ie9SWd1l`WnJfim5V zUsf~+ktOG!7$9U-6ar&H{$zokxR^O#yw*>0r_W3p^!tocc5kaziwm`QJ(D|7^3_d0 zA)`zuE>uqMM@Qe(`mlFX@3o&5gsN}m?B{HA#$(*DC_{|+;~GW?R9ivMJCcMN70a|H zyD=8f)*#-(P`rVw(wkg$D+l!B%kCIS?e{01-x>UeHy)ew=c}vgU^+^grSMFrw8pEc zv{If+cJt*p!SgAZwKN%3mu$aP`(9;f(1Fx?tfF1AU;dsqoms~`6kYma_H&OxPHa6a zRdshUz_?S{Qjn9*x9npdMF0sd!wabbwZn)Ei&x~HXH*bm3^;6=TkV;5DieaRPB!-VB>fniC5Hk;3oQGz};W6`HMA?ut>wD*@w(7nl zEWmUf=F3i=ZM!lH3cSFCrE8!ZMptxN#eSt7-XW1-#(l4<(cbBS?5I8I-aG!&*HHK| zFvu?0{Bt)*3QXK{mIc)~DER0d75I{ml{3mBBO`w$z50P(;quTI-S^5XJV6N|Dq#%P z_Yy7d*4PQPL$U)oYwAb(IR}=wxN7SY!cF_MXS-}2X($Z7y*ht^j4X7VSQ5nqbi2UE zrwS;1s;%84aJlUw=xuI2DU+%M!_uc!F33)u5_i>#r#PiZ#9DqNdJ2`QK=1hx zK*w3ONzFL;=OXzj;k|S{JUrMt2nh)(*LqF8U%q^qHyw-#8E-d2@Hj`;KUpbXYK!gG zEg6>=FHB`5QJ&Y-)UfkRwI#gkwdm1jU>dMn67}%*?wm{*$jTRXuumGurJ+*jQ~gEX zlWQ0t=t-c1()>BnVc>zFU=1iN83kQ|*$bqG`igB?aBVi??Qd030t?SE?m4w1;#qI^KY5VrDYk*yvmyt z&S8{}ebdUG;9yv^aDM_c(`~g$-4uEBsKz)gkweP;^np_0hBDRXq}ZTD&C^y z$IM4su&)Q67?*JPJVbYNfXg|m`zTocF+9Em1A_T~ZFU~IL$-9~J zpzkOhP0?L{&~oh2-tJC}RE&_tIeZ?Yv3ep{hPvx?Z@%kJ|CYaW>I1v}F zD=KsD1?E#KA$Hr(a z1>l}bIevZ$aIxqIdc_-$9zE(_1D*OmoWdq%BWq;x(FgtWBl!bO3Gr2O9rqkk=0M*! zUDdUzPVp_W`wROir+Tue||PI zNixcfYq?oq-d_m(DwuC(p4+rUae=<&sXKP8ib24nPR3~UCIp(KOj<6;uG&r+pea4e z>h4WWNUwS`tj8OgPw-n-drg~khR|e__Lq;adW$Lqj&y8@qMUUGnIAk2vWzHwD zl(M=9=oLRdvo)%t&waQu*^V_MAbX|4gVi0hdDnF;lI0>&vIJvGtbu`b?dnwlh0o8a1>AAkQP&xi@+gdr zjZFsZ*YItKv@lY)HmA}w!6c?`4sxqOlmx|GgHN3z5Y(eBpU%T|iQNolH;o0Y!0*$@ z#8ZGq%ElZoIm^uxqwe%u3E+^jQQWxX}~rjn-7zsC|`=TXQe2*_9aAouJxy#vRE`T3MF0# z5_2(pZ~H-ECk-q!nxKr3h-jjvHq?hbAan;-9?HYQ!ZHdbYY?t9f$G+p9~l}eI0D?f zxHszrg5-ES7qf)lj$S!DBGM@w(+FoYj-)B`D6crHpSxKHlVNJUc?}{XW5Gn&#`isy z(U1qKY1KvpT*+SG8x&03nCL6a?PNd^Kh>E6REEqmHyT_@vG>3>g^zI3oM?&Z);`O- zoi3B2kRzeTBy7~D9d3VvcW3$C=ll3=aj08V5YDucF6$fQP^3}>gURbZG6~4ADc-H< z8!Q0RCixt8R^(F(!NYR={QMydJ23$&esEET1I9%Afw9(k(L&F<( zE8S}!Ysoj&&IdNEa$_9=-+es(?wIWIYc7*vJ}!I?s9Lzxw!Mg20PBaXwc3(Ofsmyj zgbeR#fbg@0^~4bTA%v60>5rpywHFoYQ4wSh{xghqPDy*4Tip%vvR@a{7wf*fy^En) z_rV_wY7)*j88yq#Q>>9LH>crJ2d;t1%A{<9a^YvL^}!e2GE!1f*-g^Y(lOwE6JT)V za|))E0J-C^KJ?GVSg>I>ds1_O?Od_E4BIJm$hQqK@<^28P)FP5rsCtNBriX0d|g;> zo~6~`2cKGCWtGRZG4f7qtHf#{(jqP5HD=jA&C75AHCSBPlOA3fWi?asg!OTI7T%?U)^&m0>H???p(t( z^wNrN->jDX=4FifKo9%TI>yqrvD@n3PV01MC)kIn+OPOO|B-$d6%`fCnV^;`v9r$Y zRQoWpL;|3HEL0XcSO5&18c?B@y)uPy z!IUx&4B4UwqsXtM%ypzF)-`_;2<1rHA~PR|5(43& z-!f(4CLL6!z-JekDOSFO@I=TwC zb=c|Dy4qSlFfG0sOtQ$1_zc`35v+tP|8L*!&Di2AMW9}nNq<>bL04|Bt4t{#_8u-a z#6mgzH3GrBiHtdAV0!|=@I(33B*dEYc~Hg#45|vC#_1lA;hV)ei0`fT7=jUj9FK&B z-<6f|ZEOwfF?|32T}+VdWY_(-qzO5ubcu6dK5R9pZq)?z-7SCl^5w-}QQo>kx{bA9 zKG-N2m)V(U2IfwI0^A5&OUvmWm&xsyedS8^I#XM64OIj5OLtZkH-IUXV}tG*pKy~4 z|8-n#pXESkRc6FpJ1~%>(qYJzFnbGIHVpJFZRmz&xYp-?JMRnF(i-$yzXl9*`EW4I zvUaVXft?*z*#FsZz#v>NN4Nbcn363Oc@KkI`qNu-%#Wj&MU%n>H-=)Wj&4s`6B?WQ zVivY`K7=LqX_Ai#JWH2&(c>a9L_kPm0O6E4qn-(Q0FQ2vkrB(VH%}5vUgF8Qd{01c zC>AuQ#az$e#adm-n*~GN+FiP3BuyoU%<}61eLw9?RhG(p`Y7g)0FX}CdThV-s3O|u~oq>(P2K*L9%n@nLVEXf-6^>(TTyl}_SnR58)K^bkgu_)Hi zi;*f#CK|>C>k-hd=;I+_)ddqv&iI1)O;i1d9eJQjqC0RJchj&5h5M)=3;kasblZ%=3r0g=gWGV%%xHdFmM zJUlu-^wrPT_sJbhOw1PkO9sFx>MO_mTnYHbcGO>fQ<{YmnS6W^oUQ)9y&HWLUKQfh&boW0Tg8WVeOv5qmP6j)Uf9A>{FlEh_e zyE?V1s2Zg{>$KWYxC!bMj=Ph%uR5*>)H^Kj9XF?f>-g7+J6bLeGo<$K5j z)#7F0ssv)d`Tzm3YT#1A>D$lWKju94#hZL!D%h_Mbm_K14pwitu}C6~jtd{FQMLd^ z_eG)Sy1Kj9;fiy8;%w$O|K%}Qpz5$8$g@2!pzn~|Z<7SVd0jF78deoxw_?nvIv9G` zl8i=c@g-5nXr6stb>vTwaCh7uCNKCZ@cI@CF;cEQ76W1}6}V#;NJxS;yg+~fu8|}^ z)lBBbaaJ(-h`Pph@h5^wqlvD1X^%7b-;#00?tGSawz6^1=&1w)xAMUB8^tZXP!98_ zU~G3m92iK%49n8;l2b*$o2%C;Cf@_x!dfiGqKNhsFpugD8K>NqB|ZbU>6i%Ikp+Fj z?_-U~-F39_WOSL5p;`q$WalRimOpxTBR?dJ{%I<(y_kV-7qGG-lfFWPiyPHf_2YGc zw)EvGnr(4q^2riI(1Tau@fCCwc~mW6VTCtED$QIzZW@x-xk1v}GlkzsA)A6=Aidu< z7IAkn)W(_vHrBYk#(l(1a4w@nEuypYvL0^?T?ArTZ|@R5{&kvrWua1Sg9VoT)(^1M zO>^^b89r^U-ZSb0bISooseF%3L}it+3Qfv1n~;JPTBOM7Z?7*%Woe1Zi<&v^wacs4 zxM7oIZ_+Fq4wg9=^hiNHonR*oqdvg0F~B3c^p%<_ukp4MCRH$}WokSh8~*D%aLb}4 z+9P$LwWVbQG_c3RuLu4%Xj*!M=Bc=NAg^Ny+!a@7hr4mWVO+V@I$0llM|^d`RTuLyv%dpv~zzCl<}5KWA5 zK*wqvm~NUHTf64K0C(QlJr|d-{6~?5g)nR<(AnIXcL*|1AZ0V+s_Yi37P}`iHWe;p z_Ikue;91j-VXIjoZUZ(N*L6@Y?f7UHXxIk$zLyDmHfEZ{Wr9R_>|9~qC9W1s zrg{ou%?g&-#J7CFcG)KCZ6Ze{&R=!@c_vl59t?``fw%f)W?=!d<(Yr$@Vz!^nbWzL z!*ZI{K9^g7*a~O>M#Oc-qInk!@(V;n)F5n{S9kj@J`lNr=nV-bede7tgXJ$YXQ$HY z$_3ovz6a>Nje&uMWtt?eiq^^gmPxJb#Kez`s5*86Ft|3T4Q%355GCl|p6p1W1vA=8 zXKi@{JR@DMqk~w+4Q2o11@|jtr__kyfvPN7 z5j@BP4IG|Rf; z1#`b>c(>u!uoJt)ubec;H2h4C#Mr}`T!JxjnM$rYz}UlWgjr5eS)|yqXmo#9|g_f71lu* zU_d_{JWlo$FrC5L_{?Adh#FNtAh(ZhNYZUjWH$bJFF-8Oz!<$VLE^4?n(6%DUHwMO zUSs!c{hkhedE#|%xC+l+guUNW(ocpW?+@v2!<rI(NnS`=F%QFejI#WY?9kyl+l&M{@ zQ>9V#;nQm32a6PPbZg*4eDr!jqv2YX);M7Wn}W7fWkrxAxT`$Fg|D;*jGS7)HlMs; zX)4_G(UD*@ul1OZpWl_a(!CORoNY_YRX+Y4mbM@ao~a3X6ekuM4Xn}&#Kb{{?~;@0 z0`C}x74H?!76=0qETPUt2x987VP3opY-R4GoA5DqI?^PZ7Rjr&isG9N{El z5|SiWb$3_SQJuufb$Dc@HCD9SlIE8I2xVR%B~8};NNP^{Vo>M<9W@PC(LIj~%+`xf zsf#!^u>!#?(n|Hy$z*xP83Vfxw8$tl;2$%Dnh;{$5v~`=Edp7ODE=Q3cMr$V) zvt((W8};Q5IM5C_?iF`=2Nedg74rD;t9@?98N^xyx$$97i zYZnlt$IdFsJPQhwU|%7zZVX}X=6*ZVA8Wt0DwU%v>+$-vA4pf!fUtw+*6PgaK=b9x zmlfE;!fZXZQ%~bx+krc`rF;4@z?WnO*&cpnK0%DsDIo3I;w8WGq!tWt0&{?1+hU~p zyyVb8A{sjSBaj-50q-mre}AUOXnN3T=&vU#e|^XJI~C(aQNj3w%Z&B?BR1yTNF`~Em_ za{6x#vXXc4_BK09uK_O%%Ql!<^EE+wTy6-Dy@FOlPz<^P7*KoP?F`Y+%mhr|U>^Gd zxik<5X4a~|7@&`t7=g;f1EyMmD6(bO10|&pIL|B0yM;x%FoJn=oRZE?G-tlbN`Arx zo)Fv5kutjcNs%CVF5CSa7gb z@!jFplUTbBEZa8Jj6P~_?$wV^pFRcr94~nl3<-YUx(Up{5B2pT2`a?}1oJb=@wSmb zqjp_li=Rxgz(X^^g1ex!;ey7p$8g~;1qj&iPBZJ>I~uTgb6M>}7L~>`CM<}-@P-jc z(uK8GM39$72$zwo5XcQ-(-h6le-bbmn}+3^P5AZ2D&?C1zPJj^W_)~yF)^c%tMj9E z0iz&O+xF!Q2;ooyryd*~Xb7gXU7Ky^9|vkDCCN)82Ce`>tZD>gQs039{V&};5HqX& zB;fwEIpS{1XMIIw{Sevi3=Ma9ya({h)!J@3nd*C^wf-?0Rc~7|HS74jqP}dj^@p+< z^G^*B@Wrn_auuc0Znp$sd#rX|FGx%~9RsjyHHh_I2WG=An8j0YM%46y0hs!_2;h7+ z^c_qnPOFPeNJv-&dDvR#lm9%OA1qgp$mx%CNm-ljx(dcrw|rS7J=xhd_X{YuM}S9T zK#aay!Bas-Z5?Eg8Q`IPvUug@kGCn!9W6lMJ3l0--~l}QIRccX^<-jBf)S6oc;qaZ zZbvdTHpy+XE^P<=5)hz(l{yrs&KE>PP)zg}7lM(pUnd^J^A_d{T2E|bv?O=~x`9e4?#bll-KYJEmmFf!gm!zYNgfpk0 zYX&?z5_*Guk|4I2`7{Ow_3}q_Rv8d4efSAjJ(sXI)4k$QQQOJ!`G!)nstASMksthk z`w%#DWo2dj|0r;tq^>tKTIsn%N0;2(Nb^l><tme_g>0(XpvBIaTPV2=CIPe zk@o$EJ{G4}Sx-wVHeN5AYR$VMTgGk0_jfd)DvOF-8THJIW9)@{z?KNV$#NQ^h7gcA zy#gVa*A4v0Ri8ky2f=^|(?|ly?QVpFnoqtOp2t0giIjdvfEpu}46frJ-3Sx`czW#D z%o7vDCy@X;#r#f>QJWD!pmrjJ&uqTJpbRl&28B^n2v%cmYg|5@Z8(A24}55Wpb$Z8 z?Y)U(tk!vdV9}QNX^}!n06`WY@tPqGg)2fFkb%8e8w4L^^T2C+zD}?10=;oRzb6dO z`_{nT*QG?GLeRB;r`j`=#!qL8xkYde6ypJ&)8E6Xkj}MH9fGs@NRWL}`4*!G0oINh z_%9`GT6B=#_8%$ZgnO;;vZ&^!d5a;^3W21O3&1#$Z+Qd3?g8@Qg3kgI3fD3Syu~$n zC_t8ZQ3agm!Y&mQIS0M*&)1Ep|M+eu`TjBpd_q7xLl4C6r(E}%W47!AJYxGkrWtky zf-@C(*uyi=%onsV8l}L@cxLJ{9Yj%HTQfSIcCd*G2nSPsb6%bAUI>h1Ti8( zr2ezc@_9N+0xYVfOaRV4;XvG0E zrzr*n0ml`+67GbM!nzcYHueb(k0HP9KjLHwFTns|i~cT08%V?lff~E(K-#256a53h zE&@t8(M|s=)bR@>hs45hb0GM*Sp?XP#KH3;#nA-}O6`jp6WRoXXoY}yQ30@ZD%@5rR$t#)s6m?AC@spO8m?iw3Sr(i)PQ-J z)?8r_eL48qiMI%(^V1YZhWdK?J}<x%?V6i~K$L3@+#T~qK2a8qD(49M*vzpLz%gXL znG%1vILhfeqNweSh4M}E!!UwuMJo{L)(Y=;kY{AY%5rw5TORROT2JF2V@J{6ww~`Y~h_3(uv! z*Wn9<=F%$Y_>7d93{OBq)`QgWa<1Nmq_a=!+G)cg7d;)iKQLS+F(jEK)YJ5Z5a#c% zJO)J_e+oi`I&t-m0SXgX*{}6ZLaBEjQDq>j1d<#6|3GE4ng!5&^(8Or$&pVu^P(qj zX3ppSvsSAgT&f+8b$PyhMLEVWbkp_OBitiMS z0&z93`kR90a579F@9l+`OK>ylLVPZ@$0$i9blcw8w3>~+0&eDa7Qa#c&UK4#PNEIi zH=e)cd{USoYTe5J{u0z1b?Snb!fxR(J3^k=#e-uM ztrLId0%cz6Gly)bc^p`_@J$3(cvaBhhyNADv$6OXNur^CCK~UgT4FS*6BI6|KeYdT z5e2QD9xh`6HEPZ#xpzU(hA@pbfkJ9A6cmMg7$M%ABjKPXK1+&*IwiYTf#BbpW~D_E zM0%c+tSZ3`03;zpxw+s{6!iWLjOV@nG^#sRvT}1m3z!mXH)2LUhygQe+EFO27 zLhU(%J~dRy>W>K#%!dH_49kk9JO)OTaX5XdlS3`_<4tg5gh6zq)A2s`;}y*(E>o{9CeAC#-{Mt(Y*YkV;|e0A15|kl{%>W$?YTH(z(RbKYb5LdN8yKaUxmCBvHQC>;HurRhp@vF zsWbVWz|+Ucq%#OY0E@o)@nDOIk8JV4UeFEc0ba_QiLQ#*=ZTg0!}2+$3T`vPl9$ws z0ES9_=lCXJ@7F9po`<{?fkX{ZxT*QZUX1|3K1f)ccz+iakgvKxGfRUQfakeBJtT)b zaFOqT=RFVcd|4@azmg5Ce{)vK_k5~1_V>*nq~Qu9C6%jZ0=BkX@$<v>vr>vrRIe>!J0PG7&(!heIbk%Mjv!FG&#}r1-eGFlo z9sxc+3~$Q~u|PNyj<;;u16;k%Dan`IbLv%&`n;SfDW4eN;d2pRPM-PNfZi2aPDL^0 zd^!yIcO$u3ahi9x=Q0--W7G>B0FB+YIfWEzHxu~Or9O!4{c=g(y4rq~*62(s$=W1) z7wKG}gWiC4n`ej}~x%FL!s4D8{dqwj=Y4|4n~TJ9u>7E7N; zF<>CR`b)Qn2qcQTb7kX2O5;KvjEiWWrjRK5T|ATsN`DKt-W->(7Xw;x0LF6Rn6=IQ zHWAnC)psD!{=x?ViZr|x$oAg+t!q}zjry{GxH0FOQ(|D8S?+$jXEOG(H}{GEbMcbN z9H!@FxJu*Z>ZcF_2JKw>tFmBW#yZ6T<;8W~A~FCw*Jtg#-T}t?VbeHp1cB<(fhpN# zejlmY4&Gn~H@W8;h@fRf`^-5n|J#(D+D$h=vMX9IfW1+f30nWECIL4kr;`Q?K9*5f z&lEJal#1DhPtWJSe;Sx=>~Cj9Q=T+@UTOSaR0|+qD~+v*w!BcB8Dw01^{H7nv%dQDRVPht(sfAx4JHc zPcED&1UA^>$~*rU^?ObaI`0DF8ni{|;ek1}tH;EmE3THY%Pi!v&>TZt-oJ^fs`yC* zWEFV#odyfO#D9lIB2Qw%6|vzzoh$UJcX^5?4HQ`A{pvwbQ^lWefuFti%MAs^c9GCh|1&_q_YbIo4Ct(N6#-9)1Bb)ZL6 z5xUSg?TpsH1kfMQtmFWXG}*L}99@PJU-@ri=PY#Z{zGFY{mzRi^%ugmiTy946|B0{ z2L{G-Qv)1ldS(`^LAcdeiUS$GNcSnLR8C;tO)(Xdzh!7A*j2(S8sb{#HAQwg<)_dj zPI4XhV3DSL$f_aMH&fQL?Qr@lD+~#{L4y0X`YguYyY*-+KOaB3n!vyos>tLvFDlBMuXT@RUYWG;6u6=N zgJxycX9hvP(Zyk@2EHyJTZjS#Ah zv;EV4Hwl9>WEFI&eq=p0hp+Tjwio}xg$qwXS{fAh&=lLQeSjCHgtfpcIl#dIsZadq zDf&)?bCeya%Cv=+b02Pq233P2UGcVWW$r~#ArL6o#o2ufX=}mrS0aTKN)RL=nAY^S z;P0)iM;4s`DF9Mfs&eKHSYVlpU=nRM(I4$ttu@nu3FUS8WvG4 zxj>gKZbihw(yR*ep-OC9Y|ooGvd69{9iXy`sa`?WX;YIvKnmSdP%VFRKPktTFguHIc;sYx4M#hBG2u^2sw>n%uX5DYOcj51 z%E8cILu~kgfi>(*sy;t_dFlhU4=&Tx)SR_;NzCgbm?l8$p^aji<78?etYeDGdlCi+ z2SP$=!}i0+#fb;%O2sPFM;7EF7x&1}jw7WI2P$@H`jGj56fu%PzLdeFKXV{yPZj%{ zInY-k@S;YW zu>(AbADFF>P*e<1<^SO8?Trw zj>}g4_~8R4-(Eg(-csFO#Eqpq?Vdem^LI21lpgdI`$9AR)_0Nc94PBiP`~McH~vme z9iYc_y~~SJYmb3AdJ0N$dygQxTGx#q38zOsNsXC9EB*+oJPCj102VJO$LRG>*e7`Y zwI}l;o3Tx?W(x0_&s>gibs1@oaW`X{D3~fXk>28PKu$@lvak-yPDApRtWs0{#3IaESp21T%AM^nw)kQsyz@)&Mo@)A6{^cNKlTDhPhkTaOQ zOOr_fLv>(8?Z|s~_k~Fduwu-{p><>RVI0-!{$O;bst>ni)hGQ;BC6?3oiO|fzUyvo@<-0G#Sl9Q@s z1MXuZew+Exva4=p`aN&*Iv*0@x7E4ysE0kDY&OjU^L(3I17-^W8Xt05=7~$2A=t#+ zy}tA8z&@J)tWs$RNvc97$UW*^gA*#Xx=q7{N?qg&L^kyDz>a=q$$&;#WY|c3iCQ9J++d;{PM^cu6}Jnn_cRxr>VZvLpyWEZry|g=@yjn%_2(&_ zL;9N5cG+58+M3#I)#9#+?sKf-Y%2&r)x3MdX5s00g-zj${gU(fnjZ}c#o-b~#}WE@ zD;gbswrtTu5tCUumSdWtU-GqwgvRQBOe87A*jvB?OI)icDbpvupH9$1M9QDAqCWeH z?PC5JnW{8NaWm#sw~xeE7`RGnBtp_ZkjP%Ui#jLRD5m;6c1jTbh=g6s*Zt*{N7o|@ zT3E=hC{({fe{oHDr1$*IcP(DV^|~McveNw=2N>`J1H&iaN4BLb50()Nw=CZw<=V3I$MhhztZohs_m=q5F+qp>%b0 zUfRcVF==I`0~;y6DnZpc2#pDdr?3jh~l5+9kKXu0M|18^||H#fIT-?oYy zZHhh6`OAlheESX+&aD?d@&B#V1B@Ebu}b~ zSj}1k!#xRK>RDcCIqz(lZJGTzzkAaQz7%ZWRZK=QElufY{>q~u*F!+cP7xUn2JFd} z0k*Z~{TavCOI$|X$^e}dOZc6SC6HaiccMAY{V1*66Kyc#tL$8CuOJMDhW()#XpLUe zN@_6oS{J^s0T4vrdH}%Sf?Br0ho3)xo^O`DWeCVG`~Vg!380aUrFHWx%(GK~?4-@5UY@BFoUkPNx<3WL&MYzA34{Y3Zfnx50Bzgc866${ zqQpo>aPAcu1s3u+0QtXjOG>aSpumtnNnCq>WugZ8PRahyuIKz0c7T|Xv^&F~h*c_zT-O!yh2~?pk{Yo_(1HQ`dQ64vX z&=~!&@?sCb9gvm$3bI_#PY)a%neFF%R9d4JTUutDvZB6qzlM^Tla={i??ju{0g3Uj zl8qjL;UXfImEm=EALX1oA520Ltxn_C~@q#$Lw8N z##Hry!)>WPF=N4pxd{B3E^yp1x{FGner1*UbpDt! z(k&Nmg|+;=(pA6urk77q(b-8$-OBa&JHz27uia@qr_+S7Methz(?6&vrt}b9TAM8Q z+sPipb;kSTHuAicOyV7j&_k?QP06*w&exN@7)$i-?!&&MWUlvM9W%Nf)>6-rBTe|J z5HL9K-A2jxw>#}WNKZ%iZKS|*8;D&P%JwxS{0(3>NPio`W!$U&hL|=qO3$GLCXCz2 zAX6PnmQU5x00>2ffq{Wl#e9cGX`VQm)WF7Yd{$s4+lL$1UbvgW*+nxY~;x-rzykl_C4=>6h;p4xOc|b|QBl^*A zWb@5g>P~Uu2^E!VcCAY3ymJ;_s%*CN6c)IbJ+82A@7?n>wq}^ ziGJbY8NQIuFT>2U!s&8TjSf!87JA)Cl^1o9$T=DGqp;r*m#G-a_f>2?2Qum0CU>1L z>-whN{~1WzUX1%HB}S>9`qFESvP0#XMXS<$Ye(^Ng4D#drZ~M5FO?CI@%G(tPT5|8 z^Bk4eu4QH)WR~|8Ej-k*K6jTk;q&KfFUrT#=Lc<4v`BrhGly!UGlr>~pWB^F`L0=h)TgDIMQjiZ>~~$;lP1A+JzXT^HagJ~py| zE3c`j37ncfi7l2(d?VJ5+tS&XF{=!KEf-_i$**WcC5hKaG)5j+Th@B;arH2^Dq_(h zMLPeQ&a<)tPWd6l_v?RZ;2ceNa z3Z}drd@k4#!CRxP+`hi zjRuSl^>d%|4uL!}X1WZZPcv8J9X=vE(XU?V-kYA1RZZR~Rp5&2TfdegE%i*h6gTX()HiY@ zHACvFQI&5~oPyP77dQ;=F6J6ac}vw<*NP7|w?4;<^V3N*VAWA>Ag zb2YIb3!WrMj(htc1*Lo$Ir$9Nd&a&Xb4cv-Mx}I0efs|W^L-fPeRm1R*H_yQnIHGh zzY>|uI&odu<>1!QeZgslt`F81^7NH1KL}XfQVY$B4=>aK+98>b6#pDfx0;BZ=35&t zHu#X7V1n2#u!Jc^DlG-e;|Kss z4W?&gl+>HdT1vQz>@qIaK;&cik+DP50M!2(1m`dJTQQ%nO^ffpPO5GRDpu>2u7`>1 zGTuPsUl8X`iZmcJ>UP9!KFYV87DRV%b0Dm%d#?VtNd1VpEuwPl@6m?`QMw}G*>vSR=XcnvU?010orskGk)a5L0g&+hC( zX~Ju1+IXJ*I0fK%QlYE0013;Mkz-sD;t}&m-0E9XzDMkE- z{HG`7Zlu#oW{2w_*yS-)jmGj!9|wzKa>Idf$j2BuWJk6EzR>y_h&#+1kOJxeEYvE( z6d=Oc0A0C9RUuS;?fN8YqMivwlTI|VHclYMk@cEnD+Sm5_7-isN z4jP}7+fz&VM!i4jX7ofte_kA#E8vPDfBqe2cwN|s&s{uKb)ft)aF1;mu~s|(%BF)~ z9X9N=*zuKF24{?X!HB(~H_?`pT|M^5mtoQ!d$hH!?FR}#j=Sy0>Z{GW96x$XGw_DM z$G)26rrb;Jrs=vLSyp;184YsgmY>I8ZjG#)(XmNUr5a9LOOM5ckPM#M_W^zp-5 zr`G!4-$Xo%mh|K3_0y)L>@)!bh9ALzVGW8-?e3vebyls*p^ZhjY&qZ!qY#Cdajw1} za7J%^N5^Doq0bKXJaL%BVv>_w0P4>0bfC+3Ue~0Q9A))k3wG{o``bjV$XD9LqIq{; z?#6>F>fuAte!js72hs_SAzQH@<2Q9O4|QSVYR36=7Yu_145Sqvl~{D)jt5iOo9AS@ z9m__-;!;ZqP_GXK`gn4To)Bv*Hk)a+IF6_hk^sO%56bKJj(s(c1Kffb$j$;=I4Y0= zm2dYy|NI%{avIdnt_)RrBT)(^b~uO0E8>zesG9&I83Y}4*;mvuV?>(s{8*`+vk9AO z=2uiLb$6^oR8m70a1-SB1M;N+JWFtGJc@)S6t~$9NF(R~KTpe=+@^FeFQ-@^(6EmR zNr;}q`I9xKQyVUwnK;GnBM68K;k=;rL#lkm6xDf9OChrk8>Ap>FS3WT$=4~iY_#&r z%MREBC^F2pYQ#!7Q>TVZ1w>4R8i3a#8j#%)E=L_8Qn(tC0y+64c%2Wb#3Gep~gzLvh`@3xBk=+O}^o$yZ$FxOlXcd^j*+)SQTG) zkoIdcbId?b!D#z3Ri9ILrfwE0b@&v*>Iqpyu^@BjIuNt?UEppLd+Dba8EUD2b6-9pHyepbnF`0?EWf~CU zEJr{rIe_*zu)n|9WlO!brmF-7kcJ-t2^nhQ1_Xj#oru#f?os&E4UwS`Mkb^ic5wr? zF`21ph5KKo^Edc40Qm^3TK0o=3Brg3ksE4N)VEQI3M{$6LWb0_Sp|WpL;?Vdj~Oh0 zJk#x(0s~;c3bma~I1f{}ul4k4vmF#|e=b_P~r%({_ z*?}-Xwj^txc+Fz`;Y$!=IBO>zrh#Z$?6u-74JonxuFH7w&eYFAWCUnSlniEd1fTi@Og0?>aLC_cnl3iVV^E@8Q~3K#|Ce5Va1 z-v98eD~#4(>RhgWbp86XSu3q-`-YRS{dp(oCwVz-u(5$G&1#aMA0;HCgeBwdQo@{q;vlobsDwO1!m3&|OSUN+j9ak-PM|Hz%mgC-f}p#R2fo#X3h5W$ z1~}IQ!t#WxSB1)f95N3}y)NWq$t{~`*-+>YVFnC5F$RFnY8^X2QllSXS?8wRpbjF| zXMhf4c{2CTxcrOYqu$M3VTo}r82NsUTRNbsn{KlI?H2$;+uer=NHRn(WCvQ%wKEM#!n!+a?Rrka9iukvCOA9u3bz21_SkvcSnij z83Y9dD+}rYwD?zw`Xj-q2yl>y1DDRg%q&r_!&onb4Tg}fNuVX9Vbkw?SUubP_~xaY zItKFp!g&%D&_50ce4VoP;A3F6ztOHTC%)zSSX^+aNifS$eg zEs^-8EprZLnhaGV5N~9lq%4OIRezy5 z813*(6j@P|YBnvpFsyv)q*etPwNI-u6A@{h{A!AJPsOw=%R+wZ2$t?WL$!_Zi5|@7IxuS5-Gn5+|Nz2wSFj z9F}oZ#m;*3sLkg1fFOEY1yNw(mB>6DnJDpg{2U1h#itonj@X!LC(XRy4m^AE0Io`8aH`#3JEHi4wSd4|^qw>){iNY+o&9 z4U8r=V8LzZ=_VpPY|zo!d3(x0JFy;&`jUgOL+&DFQQU2N<%OMw=%vK|JdmMOgOp74 zbs%6S`FZmU>10e1ixQ?&=u^fZ2r5a>#~m0B_6Hm$RRF+klsZVkgnV3bpd$;d>I4Ig zW%_UB_D*?L)oTkkMP9FX(hB$X8e_oE0%C7B2m5y$LUbSr8tbW#m%9y>5b9Tw6jRb2 z1+^=V69Hzhtxz8yI*!6c-%WumvaHLxqA8*&;{H%`0^(bf2Zj*ouxYyr$UCMD4<5^@ zH=Pm$0(QtV^)wqUorKHuK`%6THG&3CmP zKp);gIghE*r!#v>%CAAs_Rg2kqX>AOruOHi*bKGwz^3MB{ch#y%T49yr;Xg07~SC~ zd|SnctH0IujZK)#c2PYOF}Q@Rs7{>+qfYPF1`97PX@BqMuOy_-v(|iLUo4-kUicKZ z(r#GBkhrMjybpNVeBC9I)p2%sz_mTEM7UQ`jhh6vTifq(?rm@x$r2cd?L2|9wAlv?zuDScuN)J`t&RhRaldu_69~!DMc+chYX4Uw z4E0TGN@k&I#)Vv(HY5JeFNh$h%GQ0I(T7oh%-F$nG9gZ}=SzQH;(r~- z`i$=3NAK4)Ytr(E7_terSH)@PBuqM<1ELe6BZq$8+vTV~GOP|NwROjy!SQGA=#es^ zCBGPws#{?c?+i`e@lN&6Fzs&P%NQKbcc9`(Rc;*al`%?#buYA`Ikk0~i*a$(_bPPO z9pf>uFZlzXk$vy5J*!=cwf@-tykV2#&<%OJ$@g#1)vxxyy;tcl(-AvYzeIqlRp%9c z(>tG30e8%;cQ#%7VddIcbOVD}Y1E2SbSR3H`|jIZ=T4)M*QV1=X0EE2Jx+{CIDEy`?dJHtNWdnoCU zAPuvLYJbixPs+JUN=HxA)cSW_qjheGs_!%ELIPG^=w&`8>6fl16{>Xx$G4X)JcY1s z4bwH(!cwCeY>68XVip#jX@65)?0v2=B?T$_*?8kv4f+e*a9{7r70ICwS0s}#FTEpr zhVmRKs;hW(|Z->Pw|Jn2a1YnyJCHa=UytYy)Oaq_JQX28*={C6oC2IcWDR>x@c1ooBH{##5fYE?SJH{>%IWV9XGOx93gZtv?7X-u z$Ij|U0E4P1rGd+iNIQw339HxAOw8xD(NJVa}lmmC$Q#Jw6zz1oM4dr*0; znJiAJYMtt=xLkxzl^a|!#mZ}dF(J_-2+7-RCvihFRNki83u2WKT?TzCW5zKroTJqpG53RwnC5zfYebGq&g&O6^XM zy~GeVCX8ce7_dR&Jc`xo@*?e+|+N=q(N;t zY~8yv<<*s>WQU$w+pwY@X$D>_*i7t^2jtjKX|%+V`G z5+%6)mfBMJyrbRblQ}d^QCoi==;~DxJIuOPsMQP16tsg=OSr4jVuE~iXF=!7OL${| z*#ByN7K*d-{28(Hrgw+JQgcVYSOY?57Dv$Ju(Df9(lSg#ER5BszS>H$UnW3h*-SjZ zA1b^fbq}LNWN(tOqXlHS0;;b5dGLzJ6#};=cV@!uJNRQheux0mdFV#~UUGe2i>PQd z8GzA=lst>~fik$R@yz$-D~+$j1|{n^b)u|{`%=`p?H8}W-iBvohTztJzT(AIiSd|L z>KoNC=NQ563f|CGJx+V|YW8>!5+Q`EZ1%3y4Rt7(3$3aQBNJGpZC@D+6B4*ku`#0Y zmM<=Z%0ACh-_jEu8gj}pzpfpKCdP3ohIigsfC?aQgnDVUExYm&o7v^(#Xof)p2;sX z?O7)lVn5lf*Oj*{Ti-vDq*#8~XjODWXYPwr0IuDD)amI4M|CLi>Tjg%3qybYH>I*Zk<4dby&%cqMx>VUlqK*VT zvR_V>tey`v$3F4H^mHDONLYbmjP4*8kct_|DyK*#1BX~(MGW)<0#m}G-L4SHMTY|b)Ca4>sY zF5}O?rt?1Ff}U3RMmZW(V|?J-X+j?e)<^<%DaWnIvT_w>oy z(@Q8D^QVtfdm9^4;O_O+D%f6QBbgnQ9wD@vi48Wxi}GGFX^sV3!yr>x5=` zP!+xkNzB4|XrHK|uZG#itqT)7r!9%Vk9Y*-++Z(w-gYmrsQ;6LzfX=>Y{7cHe^vj| zooQ||ioot-BOnFFBo;h+cbjKN0!nAv!Y&aZsNiDFUkg2_&3jxmxSl^gpVRfl(W|yg zK_3JHGmN3u7abOY`o4q4Jn%Ow18*yVaqSvbhD;Mdc}n3)zF{BUfmdg^d2LComuGNW zGjo7Om}e_F02oLU$tTv}(1!P5JRr}s4mz!B4jhOSIad!x96VONe>uNr2vOunGf{}FQ<8z$IG%E zeg+7=yZjeUQe1uP3X&z1#)l1-T)V+S;+L+)A|PlvviyOUP} z(@j%V%&0^nzcN7V$lHtC!Wv&yc)DDSTQ5$V4Czbq1!J1?%f-^mcXkZ)j)af%9uQqs z&PkrR3kznf75__3PJ$5sYsLk5SRCt#P4wCKTM@=ABp?vAW*dUqi`<2L+arDHe!S%1~(GTI5ag! z%!4p}ai=(EGCb;OTmzwCRJVE(-PYai}% zHoA$cuGh%g?&&a1TA9;{gXA=h_O|D(a5GPrtGOb~k<`|A&u{h)_~Y!#j-43-V>T2~ zwo6{-Z)Qm1yxO@AEl;&RBYwXDtCxPq>1dNVH=`T8QAN>|WR(;u!*gcaO?KXSyfvsW zSK?@A?-x+CTw3C}--7B`XqWPM_gaZn)gf*&2cE5JwxB8F7F`s z<**a&1E=7z3;}B8gsCJ@F!K-pW{>Te#bW5`X8|K((o{qj4!1c=6{vZxC!gm;pJv~4 zpm**=UIOfZyFH^MipL7my@GPwL{*GkAc~fpOz*Ljx>M)ploJ{z(euwSk|xxF!| zRIE2|1)W_7odQP^k8M*kE_dfBq5#E|N6=|}B;h=eC$uhs8Lk$yj^e$_j`GEeg)`9} z3tS3`x7E|xNxOG76bw)R}ez7ibt~g=@ybk&E)cFIxs%OMBV8r$~T^BF&44Fv|Q0tE4Uh}c~v-;O{@3Wl#T#~43~+$RU5kM zD>ma^qZQn}l7Y3DK1X|wm;TM-6sg}>?fdnyS}%qqMKO{s%i2XQS{$R2c?nGXNEbMf z=NxXebFsoyLjdMhwzlNmbNINMD2vkfX7lGnX$#_oK+RXgb`cU`^| z3Ncr5E2whT;owtPvey;!vG1-KeR@xq3PbwH!@Bfw)k5_JoA(N4>iW1jsf0{SJPgKZ z)vy!f*U4(V-}VJl60@l{@Q#8)hiP+T++D~oItCInZBFw$TLf86kkFpHL7#0rPJ738 z*-PBK*XwYvtPeuUGc|Jyj|&KAs7Q29q>5uh0K zg*Il(K5T6H5qKMdi6(!a3?(i5ERqKS8=IZzcbB~0X?yX-s?^gvaS+L=!5Q`&fvRB& z!6$|%dd5X__a20CMv33=i+D?O4!9npg1FvOdBYX9GYMqsfj{{`w6)Uc?QjUP#27}y{pzcTm+SkvA>hmooNcvVPc$oJap*7Km2N;AU^***-PU`>>p|(3) z_KN}?KoD;VPFmnfSmN$7kfRLx8It^Y%6MzTs;ueESiL>Q+#l{Maw8zdX1htaPXbr~Xi!n46?DKhlW(KipHi6!))qh*wC6Vbw_(yF}) zQ98@Q0%U*dm9osXUNI5V?{Qtfa^&z!L}z2jTR-RxCgY1Vs+Z_;5L~txh8@kM^SR`l zUKHIC00cL83wsbm7hRq&6h?e!^ZKOi*}2iZ*KcOktVb%Lj8eWBZwC3ryG9vprsgS!NPAij6jjIdB}9bCA)22tM$;<+X^Cqsmu}~NhQQPZXs+Feh*pv;3KbY0TUaPZ7r1^+E#s;-vTT}HHh-7{auyHemoKKhI|PixtX zzW-EcrqG&EkP0X{Cf@ly4SKWXsT~LsYAu`L-WK%9B^=NFt3_s*Xw5>PBy$d{B{m?rx^|o+j(0$G? zY$JNE9?HO(pO~_N`i9@s94H$lJ@`zJt>Lgb;#r4AEP!)=%E2K$rP^t{cn9Vo#feL>$%z9N^}0ylr-d`G$k*+SG!&pug(gBGg@gTaZKt! z8^U(2-gHxv<3=4S!+ea_sK1}r+C62+*s6=s7BVFvvk%n;ClXd3f^zJ(apva7=1?{d zu3f4B4!a&(?yDgFtpAJt0=veb>%qg7arZDZZ;kWsSWLI@weo3x=3(5j9~_!%nL-ZA zER2C~>)#$Hi8~0#zV|~?lhIOUOBNveoStJj^{WO~!miX;oZyi15+kcKHVb&>b!lzc zJwpsb#z@@7U<)(6X@V&SrP*T5PZT_b^G%1AB!azZZ_rmvW$K>Ku3e@&(I2mR_u!5n z;5+?kYq@$QNV2azx@StbK+I!v>f2>3;zX*N@JFK-U9GOip2xf<$j7L$M&aF^CV5M^ zo4KYv4-0I0;An=R$~M=$7P#8;A;_Fb^edCRTdtCENGBOpKyx{6ZLB~^3sia;^0{;J zJ(&A9HbF;u-#iC~L5;y-9Qh>aA?hGKcu#HFe&Hk-XTE>C0dyIwBwnZ>jd})?GwR%) zl)d5l%$Pey;iun0SXqidK;%*7vfb+Qm8bb(>+p@uueo&bD+viJxc z=8GvSP=hcnnHQnem*pD3p+y5~!tcO=$T^Rim&yqI_@H`!bq4oik%eNvl;Surf~R;M z%+ykW=5J!lEJ*o`hh`p$=R76(5~vPJVdlYbOs-TcQ?=w5ooP{pO%A{R4|Pm3nvrJV zL%V5ze_K@Cjk4Fo-KUj`*UW-`_R^HVY7OnS=5^*KH*!JZ zR<}^S!ROD1#B_1kTD;_Id9rDUP%Y%|RWG>OtC`NU21B0?!eXd;@>|H2(?POjZQkhe z328TR&Retab!+RYAcgdAV=}DOPmB0Wjg?kU7pF30FE9c{d+nBYMxF~PC!+O@oPkH^ z=H)mGM)LJbWRg9F;~p8nq988B}l$5$49%Qf*(dKN+Gs|<$q2Z(2gXLYIw zdU-^yd6vaYMO|~ZkT_jWq^NtOOqf*}nSO^-`aKdmRIwwjddv4}kyNhlsod|pb2A+o zYctkW4t_8|yRS~f_~7=?WUlWzAk|kU3YHA5spalswOwqtrmz(CfrhoVWJHc9aH%ipnt8_UCwn)0Tvr|}gkk!(qd=8sz9{x}dpR z%k1&yzlnr`$MmJTb#1a#Xi@HL9*mJ{sRPB$Z7KnO?k0|O!L3~(y0Y? z6_x|j58{1GIq)q?9{e2)__s?uptGsW3t-3u3vMCUcN|ko&WQ+>lb>=;9L}$=p$P5HcB9#sN^Kcc^Z%epda(u|nnm z+E>42mWHZu#)UoiXcb(OYav4Iw$)6Nldh!Lh%^B}o zu3vC7{Tr(bL%_Lvf{M73;v|T1)$QiW8-b;}%tHRV!@@nsX+pL87TX`fO~6jSX8C+# zCk5Ye1_Vcc?er68!#z7)0e1S@A>{ept2k%=+G$k~S5jm6SH^h_#+P6EMRAv>2^(8js zJxfWdIPP)KO6`o#*hLXKDrYE>1;$QIB^h)~Iqg-gMt_-=SI?XfsYb)Et>Y|i>8IVk#^)+~3l*^rrA8Vh^5U=My` z{^-oEn0T@KHUOe|#qk<_1h<3@b7wfxXxBbES0F)*u z&^=Pa=L8K1u$!I!eS`QfcS>)+Q{XslaYy*d$Z5uVeMUW92ntx8MVF-C(D2)tqy|qS?6+d`mzqy{;5TtQg1#$4TW!80(|9xP;}6BpDmKb*cRCABB8^}PNDEz- zWp;z@ero4*2i9Ow6OG$B3W12ZAuR2A$BZ(s&w_Fp0jypeUiktJt7{(eP{EBkwQ5%@ zBTQQ%7Fd1n%llcCx_WlzjmMXk5l zhfy6l^&?K?w`4Pi$-LG$jep|b@6f3!LYp`(Rr{CB(=`-8Z!{^k`|wU8hCs6Q%&)oO zUlH@G6AU^S`o}i11_UaFG4>A^$D0_kzTie`QG*+YXS_h&GbX#D^F7#7X#>1`kPz8T z=kd+u&$;X0Y$U8)bYJj7%Te}$DT~dw*mr4R)XJa7fUz#WBp1+D@ODUS$*rdD+`|Ry zgG8r(6z{wePUao;t{vE^c6HtZuVi?>_BQ^>w;%YS1|+AGjGXvh_CDvkU?z7A|5eZ& zhn#F1D8&q!Y&>@zoUx)NeQT6qZ-MU4tqt{=0LjCW+~o>VzsnUXwqB2z_9_@>Nj%x`S5w5KGVYu434wn{)}1?L z56|kEVN2nE6-0FE#Tn>{~$;|&4jKjoj$FO%znC4MW&@GGCw}is_S<&7o4kWJ)ZS)u4XLkJz5ja zpa?*j;tK|oQXra8sKZAS)C&F6Hc5l&TCL=oJinZ*gy9n_w%p6NtRZ}tXhix>M# zVAOdVCwH~#;blmvx`wv}aTZqcC; z8Q74gPWB`ANamyP-*H}R^?Yu~u0HI@8O474_|lKn_jWJ2BO9;DK|e8Zw&5h+g3w(8 zFGP7u?al60L^^*(Lc}1*Z#8;`rAd?Pd(+NMl!k5-iseu~#lap-UeB&hk)f0-k>AY) zV2g<7%s?%6RNH`V+gNmRyvxh=_25gquw`VS)p}7R{QH6J;sA-Ts@FZd(Eq;mi;LmJ zBhEXQ*}dMW9}=-#zR0YXh>9>-9q7Bs(g*@##e|RcyQ(>? z&|kzDSgwRKS7g;J%F{r$C#l7)v@ss8cmlUH23Vuuea?%7Zu7p+Rp7D{O6^Dgl6*TL z`6E#$E&nQ9j34y|gPo&e?!W zvhPE3fjS2=>QD9z$%!p`9<)M#sIn!yAVNpG^K5p4gnuv3eJv4MW_xWG{BG{7N%CnR ziV}r8k_lEkUJ49X7)sy6JBc5K(4La1qw>ULOf=9N-BPE~ILH;<#?yGJr7W29;CDWNAhx*h8Yb*3{T8pOxZq8gO48S5P-C|< zL57-+YYJ(jZ)vD<1p-scl)ddm65D0Gd+Yc8EQo; zR-nz5DhkSzp3cp;`oFY=q0esG!o1kltlk?QvU>kyW`gX}TT4%&H!$}%nj!ic)w~A? zB*0?*O2?R2heoV-Z@vA&`QCneCgOv;YqRq~L=n;$oslQh_;(W}2kF@2(N5u=FYR-- zg8U%JFWQ6#!CQ=t8R5ST-M}Yn#|fit)x39=Y5PNiCa~$#48|J&`y&x2k;*fW1sqbS zc#mHYgD-%;PRiVz9Dnz2A}CmNHQo{xOn>nNQ{etJViVNrghMQzpU&3v{^MQ2u{pmL zl!+KWxwd_=@F-w9U>_v}@M*`+Up5KBfRUc#6@eX{I7RpHIIza$@qS<=byp;rA@wYt z?GG_+%?wNo?Q=Ro$lh(azOr>oEb31QK1#o{B@Izelm2+jea?!Isc@?Y$;h7y2|EI1 z5|tm0<4r|F1YvW|^488Q009a%J})4+vqmDHp$(dyiIw*9qsdKu5K}$H$}{7re7+dO zlPS6v{#g0&r5!ubrqpo!&-*(+g(8b6X-n~41>gR_iINh&D`B@l$az38#^8fyk zuAu~Eko+qL`&aOn|Giqy$D#eI_WAw@|Cgg|peNHXl3{~?x|yRNSG5O(3$Af_Z8d9D zYrOpya+sEs_FUc_YAXtfKi+Tn)-OYqOYZ-6>>JHryYlkb_?;Lw0|)%ow{Pv71u0Pi z#h!=%&zXny%2Hv6`TDt4-HNfIlQ!-B#Fo^gVIAguf(GS(-p-l-mkaEG%fbR`P5!*4 z$N)&cjw)TFy1XNpI}&;6l_=r; zb@(9doU_+_+AOW+=W|-{r|KIvjipU32)2{y#xplfJ9-aSynTadAZz~Y`iCWX!3YJ! z9Y6%97b%nj{`f1MPaeq3C%=>JECpVxtU=ejkcn{5i-dCn)z0Fh6x|g8I_v@JY3+eN zsgU#7I%_@}INH-X+VxHQbYH$qf#d9`>55`k`JBMir*++yLwIxb>n6^Vzl1nyDKb&1 z?g)OFf6K@J`&@ZNnO9U@?k~4=jRdMa+saZ3oeKEV_8f_(4=45~Nq+gqqk`?_J_R}Z zi9PcDU(Vji`?a~&MJoE8t=(BwdD7oERgir7=LU$-p@5~&W%sVdM-AIQlVE^cc|rsA zp2*e>1V4|yb8+DXm6gzrH8>_aYtN(o{{6%ekTggY##>ApEB>{-ir}Uy;%fM0d*`{J zP50l^>;2D7ze!eS|K7l7=Qlg@@DNBc$ID4k1-6*KtNQA|5{%>ta_`B9fB&B8SLPpc z+lm7JlvhAmOY$_T1#hR)&(5Zq1a!9Td9>fRjlKjqjHSq?gkqJy_Du!23mpc-J&t*AdNfUFyrXg9_SAI@uz<7KcE0v(^yUU z)<@_56zEewvVh${)M%UIFZBD0pwtBUVP=cBcnSg1u19D?koLwB>qo1|0(A`<@~3dJJ!(opXdDN zIsbXif1dNVK>)eTzp(aSSo<%m{g-p@q(=X8&VMZA{H&h?OPMZ#XZ?_o>(FPQsTs?Wqp&FJQ zG3iEG`T%pu`K0t!yHWo1Q$R8Vr`KJt znDJZnUrj{=FuIX$n*A4A!b#*Vm~7C)PbB;wGuB&avuwz2634aXFulY(;NN*b5S|7& zK*dl94gI_^;jJOz!Pn%P@vrjjN3Vw^OoWDQ3^UFRx^q-~eNr~q9JXcA3I}JER9FKF zlqf*&Kev<$4tFytTq2LJq|ZeH(gah8ya$|Al89;jlQ1mYo&Xxn1am3Va`s91!Km$) zar&8tx7Br>5`Vq5*RNSVu~feWe8>^60A>tR9#!C{1%Bj;bO@6bZIk->GcTf1#;$r0 zlLv z5UBoWDHK*e>uGEkMe-Q+CFx65o;l+o0Zfi|ux01V6qTmJKOR%0`qv!CRAKzb8Ux#% z=E_bRT_hj0{j=ai20I3Kr(;Xk@C0I~n!HMA`Vjx4l(S$AP(lQWf8QVO(A#P9L{AI! ztx8)=cft;?(HCIAUcCd9@InBNp|ZL<-WUa8D^pZsBM+kte@0K1oY-F5-JY-+7^VQD ze!cG1t#_VW|KlC@IiCdr_DF;akEYsvfeff^e`PNe?f;rn0=xk!Y)w-g8AI^Cbxl@{ zyc^lQw&<0OF=4GN2N!fA3FYp~Z-0QO4}U*Yc*`D2uI;~OCV^sP{=6C<=(ODsZ;1G{ zbPq*MmG>+iG_reC5Q!JBAAZo%AsBPm6KZ4}=KZYa%E_bjQ3z8&-zPQ(U`woEl2=fu zcKMG%e}2TT$wWAqGQ8<5y^D?7ekzNz{||fb9Z%)||Bp9Rnv#&MyecCkBwGnZl%1_) z?>N@!7$Id=R`$v~9DA>%kiCyR66bJijy=B5BjdbY_4)sI``zCET{o9=UC-JOAl4k#-CFe7%|69?Ptc^LqiE6-tadBY0<>x-12|KP4b(G~)Sm8>dJ@fn7OWCLLa4v|aaB?3Y5{`z!+*gn zBFFbg{*0vQ$v@s&d+7~O9J%T&rB5)EX zgdJXEwgBl=n}hyKlJ-jj&>2va&zTY=X`!KbWxqChcc)#>>`54kfSwBn+rNv+upw>s zFj98(I$*0^_TUS^9T`mu<2k8)28|{K7$a2|6dq{E{sJSw;bD#=BVbG2E%8#p*EZ^c z+5LE}#&+}s=pqmpg+;e8;5sLw2g{v0%s`|o&<-*Te>5%l~F#jSsEWolhU z@H8U|T3yhk=)8;|w!O=|eA8(D=G*^}n*rTU4at(G!n(p>${(9KiPJ^dc^CE%Z1*BM z?lefQceG%BZ5;f@h!o&$-~pBge|gFFWXaDR^ik~vT>)`5p>Jty`#6ehrc|vuJZaT~ z-4=7L2j0ASbBWK|08G(J)+50yP57;)C--2E-O2-=2T$HTY!d+g{8!oQ-uf7J*7w2q z*W|%(CIIeQ*)J&b;4d$4;MRu(ZHMlSIV?@8Bv*lY-{(C!hM<7m_8VxHrFznwe`{rA z1WX1%z*UviEyYS!$HD^b{a1|(*$RJsd|F`f>t42Z0QB5@J8yLCHphQAnEpE8b6zGl(_MBtSTo;F^97pd zi@pbiJ<-wt(Up5L?%@HM009LA;=ogje$~}~zL-sRWpY@J)uX|Ly;l?RQJ(!ay=h}# zH$W>4A5I#~7OG1x%v80+6wDWz+njMKzcu#dD3Ld)K`orP z^*3F_2ddRT0VfdpmBMci9lZEA#kB%09$5D6+`;zlii;W_oB%02oQ=n&yZ{Ryyl|wO zcK-lfRCi=PYX#(8M}+MFh3z2B*4=cbblI1)@lM>euM%`HF0+E+H?>`$?-UQN?+4k8 zRMoZRe~?Ux;TKL&TZnW(2#|_bZ|w`I-xt<)d-USrbpG(c2L6_A@t^{M8TO6_52xs| zUEK()=22vGq~1;#H;Xx{ijEE#{Z*6>ok=TrqCWK1-IJdFwL^$!61gQu06Z26x}l8x zR0{Xb6FJR#>=bK+p;NhkGuOCe>$S^?tG}>6i9%5VBbx%K@RCR*?`|{gd*WYiKxHo< z6_>!9qe^HAn#0|D^%_l!*FbyVlr=Wkz4R;s4u`jaSHU5e&hBwU!Ov4u8I|W~DU6Mc zxxu&@Q_vQl%u6g-{pCAcFGwZ7bujk`3rcZQVq)$xF)>l{n1zFplmdBoEg~eYoT7K$ zoAC1c>iiOJsCYJfM$CQl9>Ly#jf1rnl^j}sqT%RCL65hz-QM%(ZynL=_BuszlMjE0 z^4rtr)yaR7++RL;$oW~NXn6UJNmGl6;lSYF#1pi3UubUxhlZwvnHBwjYZn5oVFX+Q znR)P?YM@+HNmVseupUuR@Kihm$l*>EJusE62ef-B4ZVis03!Q7m~&-HOHM)(2MSB` z)T(lY;^>s%xeaSqu3QNS2}uS+uF}^eFCR2E-@WP*+WTD7sP06?Kkkdr+Z~w{J=PQ& zgtvN;-`nD1L4LDNQ=y=VWJKa%qrRwtvnvUVrN-Nz%WTaZT4a%6b~fm_$-aK$QIwE| zc!nA@Dp=Fuq1LN8_tF}iX#?hf_Q5GOzz84E^3y!IsHmuaUL4&AM#e|Gp5v>5JNVo~ z=**5q1HCE%gpOI582OE-(O?{2TUg4Z?$4h;t-+{^d@2hRMEBzTgB9(r))|aFzTAK) zBPV_TBVO(=U+PBC<#8(JM>GrGD1lw_5Fy|BRPw0fZ}5j*4C3b4Qe7pzd_Y7QuwzAQ zbzeb8kzCDJb7E5kBfdq8tx|%|sVc0%fQD8uuYntk?x47AG2jSBP?`{>*VWavfo{<+ zvb!feRMV8=6B3wtc#yQJ$Wo}SIXowLeXg2rN~fy`0QVVkxs!N5=+&a9)+D?A740p;qa`#tIx6|-(c*H1!tls!?|AF4Y6q1vS|zut z;eAw*5Ye{9hqm#Hh-K^|P)UOjAeuHtyV*(LPDHT@IC#TcsB{20G)W~ryMul2~}Ji(jC?|Y9qt@ z+uku>It*s8|Ik#>9*a`_b9pY>;PXju81~%#%jbi)U*vShm!ShE!6>5$l6bs5BD6oO zNp^0PDb^Klk-J~uEb;s00oBQ$@gK9dwpJj2+!q&{dGXG7_tDW(CqL=3r%1(cUc$S1 zgc0~Ghb)sR54O@p`_ycf#m!v9(+7XsyCU>V1=6HhoEb@-{W{NX-CwllI0LeQSDEJ(#Q{?6`JC!@1dUF1CO23~%0JJZWVHP>* zr`1HIKbJ@U6es+pLT&KQa*ro)Z~y)XkHVduZNbRlF zA8aN4Cmh>7GVS@-Dg9pH5r*Gff2w{%p5@QwoxcG#|MgXA{y!EDmI&VdJOO`KzVPGJ zo>eUVn8VBLU+TVI78bKUf3V2Ct69e1FQ2~?c=6!7_OI@#I>VCQN7C})shhncwPre; zJt+oZvOey*_a}O1kweD_5vS?d6!E4~pMQj7yM)`O_@}h{6Bpu}VBYGa*fG5=&`THZ z#D0GiVG!8-ijN62f7}5}1aIe%$KREq2q13cw_bUjg~@gnPMw%+){D^&yw{WZHDhpA$VA|8i&=UfCb44DU z2AZa|O%(N)Lu12f`Xn~@Ms2*CgwcTV4u6X`!lTpIOn~hw+7npu{{KvQ=Kd&EHe>AQ?tMAQu-2{BRaFHzxWrk;^r~n5Rg71!MC)( z)C0RL#C{3QzehGeT(SX+d~)+;MmJ?nZh~e9w_K@D0N>0g`Fjx*WkO%($0or706 zn|ZKM|JUBX9Xg`%2v|;nj}2h13bKasx}?t_k-3Zq6Qj>FAF<3NyZTLq^sb{u(xa1` zxSct|yz5AyZ$-cSi_tNJ^P<8(9sgrP!Ef_$F0ALte_6W!mlK&UEY`t|WrimO*QB0a z&3%LyN>C-vc<}HfvFAHq=N-c>+UxXhE3;_j-V3{f&)dCf9t9^kF)v?#2+v~Pbv|6) z1J^)Pp~ks|81Gx|se_Qh`6&7#JcqMC9)CC(>*#lpV-ul?jksFfU z*>B8Fj8ou_L?m(7_=|`%V%~ijzQoLf1D~TeFskY=Ys%OOb3Bzk<%(yrMw0;Yf*kP^ z#rpx_Rp9fO!EVDug^v~#rHOq zUf>vE`spTn{dPk7^R&Bm>FiTK?|+4oc3xJ50L##@HKW+s$9+E8;eqo;xMiH;=2^ot zT1Ap@u5b#cXgS{3&&mSQ?ysn2G3`<99*Vp29dFxi`iZ;>7kg)^v|#-ya%bswz}&{g z#O96onD!^sA26F+Dp=BGes1eC2Oqz8g?@=!(!|TzGkE*vatOqQ$myS^;2j`+7mk4b z(bSMn&zfJ;etdWePf(q=cKQ5`@cVrUf>I629Y2aNd^c2MVeA}=xA;B6)g}bq!x`P4 zztGnCn>+Ce6TIjD-|-3>d4)mxv_XaI+-@5I{|ejiv1@;DxF*5;wRJTm=`ikl>A7~@ zshCVn^szrFs96?75%`#^E&t#_aC&8@0Q1)(EoEu7B2Pk-Ys7A8W`x0ff1Z1Bsq)_e0Hnl42jFRQ!5LU z&*0|GAL9c(J+sikq>8mDh0&EY^b@o*FKdty90mlX;wF-f~p?oYqp7R3^&&U zR9|Rf$wx{t71mJx6u+ebrcUaJ#9%^tZB_6E2@!mJz9LTuHefz>lWAv*wga(QHL=IJ z-M*Pe(mqsDNeha$YbD$fDcZaI>!NX@-FN?$`^td;7e)~|Eie4%!8nV6*cqO%tTe?;CoGj+ZVz3~|)dOn&{7(lpuRNmR~* zv-RFB_SFeCYm}?Y6O^TEKdz0Y!)5OpMtuCq5a3T6U%7-%h+BH7aKg-xwyBM%oE51r z90*T9Y(mW?mmlaZd&?;~1lTnCC^mhbEu>5BeWD*_JFrE?LE8~~9O(j5I zBw8*iAfxJh>e9%@aJuAXPO98hDoj8GS=t9tIZ|?x7@{&(BukW;+&y)-H?)B%f;NPj zpG@hUqQY-;Ja(t*Lv{2H3b+(afBUY|&dO%plzxa+ct>;;ef}*3Ql!{~kK@H$b`SsA zKOlT@N&2=Zo|xIA+PrMsiRW>WG#s!Ny*4EXpFHAJ1W=uQN^n`ik*ungo_uMVP6Y&# zcbrDp%)OS`#0KqQj*cs}^<1#;Zg9wY+62q{;n+8R;-B##FX*be2L+McI)*iLBkBqi z=|LBk61O~_AZyiWpd%KsX$~cN+jf*kug(Z7c;;p^t-Z0a_0p96lHLt6FU^opxOe0* zsVAAi2-S>QT$3Z*;`T!OXZ5qSzDvp7y|gNDo?w$aI?lzR7e1x*{fQ$Dnq6(+;C(5! zvZH%Y#!Z$w$_AqL;1E+CAbNm>?4 z>qw2qWSGG8+jV-Mt#jwQ8F*x}C3KmYDx7rcSW-K?<>z73>BP;qCu=UA6~5d-`+`g| zN+evue~f%QVkUn@pk8C`+e8s(8{eYZH&hj$rHGhrsh&_KqJv`qB9^e!%_MW(TP-=I z$N|a%Ym3G91@t)+Fy-C$7TFY9WhhrAZ?sO`)_f?tG%K#p_$r zIPLT7`mRM)9RI`l4@n>G1rib+->(G>ALyg~tIIcVVWRWbJ{#l7Gq(T`Cc4Z`V~rm! z_C4*kUiURuT)Re30FR`P{Et2%EeKQ z;>$xG7Q-0lW+ipf-XftHg?$PC;BURv{%TX>sp-rb45^24u9#ERP=`~EkujHln_E8Z z_oxMe`fQp$oZCH3E^OX$mIz_vSZ-nBYeRR5>g6Vvl?Pj-X7r#EZ{z6^t8EA@XOOMz zn5ge3*=ViP)DY?dosu!{#@n3lnqbRZTNbL-<)ezpc``kwA|~)*@Aj-hzlB-TIXb$Uqh36nmag?HQ~J9J~W5Jo;E=h0n|7oP2z5M7D%NmR}~5m1!8w zgwCyxc~|}_@cPF2Y4+2>$~`%`SuvFp!?f!8SxMre ziNAVXb(d%^CZ4EToa>oih{`uw%p1xt_(WJL40YyQF{{)Is}g*Y6gAH>g>9e>0TT7m zY|*s##WVMx$lhEtO}H(znR(AvSS|LabS~e^<@?g5vH4eSl)01HpEBe0mylSSFx(i< z^3~e1&Q1`{?Ub<_eJBVSXG%_cx%P6(en-C0NgPs}`NdeuC8+#CX|PitYQ<+WO$p1& z`Kq!FL+U4Myw-uEmJ4Kb? zVtH%FVH+^_Yd3CKJC@r$*P8l7()QtM*UwKpWnHnoQ3j_F#kx<;&(;{J*lK9FZuapU zIi|Il^~jydI07;?z@xNKh0R>%c|vE7^lov)5yQ2yWD8e@g2qcTSk$5sBq@x=L{&`{ zP8V$2!9N(x?>gZ9by+A z6qMg6NiLD$_ErCM4)#^BV0wJ{_V_fpXM|1E2GsedPU&gE!nJ8d)%kn|>v42H3HJi? za&!DdsDrfXlh1xm$xr0M71IY>9%ph8(}X69P+xo-9V@cfHVL`S^&qh0b~;jVVa@^2 zMX_Jv7L?MdAXSHfa3M~sc1qpV>UplgbD1#f0Zk}SO?+Dkq$zM)wo-nGwW?9;+ zGh2QwkI=ouWQhYoPv;LIDVfOu75JBGHVJbrd`a-$;?!Kt9a!gZ)&;ze(0 z!X~kwV65o6(39Wne^IL2&NiMbT3);1C%OWUR#ooLmJEYWOzA?cz1msYtVl^{_?Bhj z{K)HXSR9|!aB>J`yCW1owUC*2_XF`Mg9pzRs*YmUzY(qrqO|On##)Od#&h|tB2XHP z>b9|Q@xQ)3@WXijHt1qlaeAT>#?G9hOkDaeC;B%d3xI^eX!qL-c)DO;Q*7b<+yEzW zDOS9@)-YfW6m3y+-rJW1E;oq@mxJA<>P)h_sbfTGR^6Z${Xg@0j2i2%$`tucQ$&BW zYXW^dsW8^_-vS$lLVMZkn;)jRUFn{n;+lz<1NK#m_Xmo*XAyHbv`2^)ekDtnEo*#{ zw+Nfz4#f~Y9w7>b2SWY4er9sTYHtT*C;dAgu-lV<$YI_ksW9@C-G#S-@C z$QSgErLkv^yUo=_h((14!0&dqn0a(|Q(6z@)=eT?x@rhvHrpcRDS5$#R+gEZ1c=uj2W^=GQGPJH;a%A@XK$-9#WrDw$Xx}1H>v9Gf(84w&; zU3*s`r?dX#KRKO!QO&cHeKf^8G5WuUB5_CN<9q=kkS_y*1UCw%3yJEuFe(xjK0wN- zWv?;CtG%d+Vn@&bvHT(V(4$tB#}%g6D8xOA$9Kdp?BwNzW9!MbJmUl8UQ-_TRahO& zmkwS1Cbl9c2G_+snXoC!8u zTJSZtkZCd~y~&y{CM@2h64&Hp>$bV87to6Z-lzB|)%B_QQ6X5>jSmcu*cq-$rZ-Na zf`xLG-mx2BJCBl;aK$h)V<0PN-NwuPHh1612z9}x2+lNkd1|0;!Xn|S?K5mA$;$ObKBV1c3CFHi(M2S&9rAg)8h>2 zN4G@(lDfQie+R7hRg7o;!De^UGdCvmpbcdCgJSEIQ0r89`^?$1%diiT5f z_<&;#H#@0>mGo&hJNg`UPA02^$DpH!a1h(5-oV1v{i3avG_VI+eWy4i@v$zXG-yLJ+3Cz%%hO0>_N1hkyQ(S*X<9+b z@UpwLQ>1BI-LjJNv4Y60ONZ~5U$QF6lu=_gk(7F;kRHG|b^E50Qj>-)RVat=Ms6;% zs+O@9ClKDX5B=n#G-Wl9b^Ib#f@^C;EYVS?qmvT2GoNKk3$wyMau6B*P@2k>FLAh* zJE;zl25Wd00GGY*CU!LIITs_p7s%dP9maXC{rfWURA~yj|rZtp5TU<_| zOzVA`2t2xV`@l99RoAuqP*t`x$Ef@~aTa8|LH`>*5XTMZXHng}Rbs`%%;l|2j!aI< z5y$X!Fy%r6fJ++C%ilUexx}@lovP#HK#8i*f*a+SKzyFZvQFsSd2t^u!D8H)!2-`n z20+Pt)~9gxZEJO_;Qhkplvi_{3nk}c1B5WF|kEWD){U-Q6gbNTi6Q8M#XxVa--4hC~w z>gGi>K!Yqxw}G$ZC@uBYr}>Kz$C7cVrIsP44b2B>;e!>m6Tj`+P&dJJnOS~F8(47E zR7x8VOx5hK^e)1foLyR9)#U${XD>X5njt~XrLv}VFy*J_Y$roa+y+Xa(M`*9RclA= z`yW2OTF{6&&2$VnEiUItanY4wfH;h;^Dx5?J?-+ECQdtXlj8n)Px$R$@iF1dRGD-B zm3VgvsQ|Bi)k~pZ+z)7oD3jwvUBe}HWkrqj?UF*-bVrr3GYOU&iI%d&e0u5kH5?>~ zbeFu1Y)?`>d!D_m7HeD9A6whAMyAUtAICje^CH6Gfvx_X<_042?#ck~n@LMT06<$k z(=RR0hM7{TCw#*Ha`9yc#XGZ)2*I>OHld33FISPZWt*jP$_*;I+imU=3FsoL(69EY z7&Swc2)1w~ZClPGR$Eq9zSUotbxLNo3&h@KDwW=5KvLv%sy=BMa^zTBZoBG$>1Abx z=M+LJ2x_kXQAjt>2(%IcuwIODPR| zl@>(G`#PIaSXRla@ecjNxF#v9H?%?v71vnpN^{&FzOr_!ii|+WpBo>Tkh^tcjx9_> zdwY7vVoP}x#r`Amb+0q zmJ(66P6|e2{@-ialg*xy0`>Z#`1-`_5xHC|Gw)3(!_f3cekG>#&s8I#9EcEPl3;q$Up6rz#+?0*qF3Z2GwI%zED4tvB`c`)F79@FnvzM?0y4ZkSn;?=P z{EVqK%0#D%`g2dDMtWMFP8jJV#(_Jl5kX(`A4(T&sNBHA{w>; zpw}Dk>xt8aQ@|D6F&~YJS#>1MJ-?_xX@r)|`pwzg{4@R|X`y^qMAx_DbQyyz!)1{x_U>!O z(slGnV^~TT4WhwMrbOa=MvL=GqSLAvsr)p}icVi6GMQmXX0n+A zJ9HY8i!MF8q(kyN)d8whZc`aXR+e{nVZg$TmLiI&5}HqCBmYzm-e%rl_2x}OIfn#v z`n<7lp8b=SN}gY65X|fmo$gr=FVeD=rX8j|{!4YMPAhMsQ^HHttt3||k%K)OQLmt+ zTIc*VP4RaBqDaivvMnaYumQt4W;DmjoA!pLh%fP~m|Ir0vw8Z~kvz8Y zYGMa;11h89WGKuuh(}BLmcr>c$t6e|vLpGG>np#Mj`cVPMbFpW+;(eKtYR1$qK^~JI=_}V425EFSgo0_2 zqRQvShm)D3%4Qx}^fwTZPHaZiPEFzb=F{e8r|2+~_H7|MhId>A#3>!ol3{4y$QuHc z&g-3VuG1q!C%%#xLcc%yk?U8+3l00nZF~j-%>|9pbRom3sF3Bl#Tjxh!AOsz4%G%@ zHD|DOZ}aFdlp+&t_Y9R*++an;$A%ks2D*l={s^%Uy(} zf>7t!D`AddmrkrLEI(ZERfjEu*tCss8OHMwO__4F<1$w#RTAc01tdbH;fA#G9u^>; z8W-hvd$SviNosz|x`>wx+v5~;0kG$3@<;IV1pD^mATBR6+MC3Pk62y7Wv|MtnraSI zU(qL=t8J1n#K-VDyM4v$@f!Y74muIaOQN8JscE5kGUAWKK#-dn#=8P{K-c)CXD3PYD)Jy*?B1%7O+ajaz& zNt{o)atHb+|Gc8HvBlC4LjRt4t#F5Uai;VP$?bI=_?E>b~P9hoFl8XM5TsX7{nU7Kz?Rl2Dm->kV19b4s!5>k$>7Va|GHV103G_92t z(qsE1e5vp9-G?WYHdUVJ5_K7Mk!|RCFT}?AV^`M0CY|^<=uYX$eq02;v@WhpWp;gmKw59R>#L#mIM*?bkbnI?I)n$48>-6y=mqivo@_ zW}y!D@=5-fD@8Ni7X;^GD(f5_#l+BW1ux`^+N53>VF=JtNLzMdRBp-B=7WEaC7K>j zce?{G-AKJIwb-XGU9FFO+Zj`QjgduA(vax`bNAE4Iy#p9a`Ld(D7dE?> z>n1U+Z*|q?kxHnItD8>IV|QIi!j(V(lyCIC8Rh$qOiVM)`*rJK!#NDyOV zdd#J9os#8N;{sLVBjo$aqT&wIf=0X4r*Ka=_w?`b$lnMgc|@ z61GRSOX=AtY5mSe^wTG3P9iwj%HyUr;?1{=ifqg6s}IFr(keM)ja>ODYUX7p}S_P8((dexoSWEqlq*n$;OTAcDZnxs(v54vY}M`2y}#& z$NW(gS-GtdhSGYoT-o?X)-`|3~Hfbr)hZ6-mFt zY;r!*^S5%gInIa+^131R#frw=#lK{k0qz#Y_-_!-u31e;-)z4Fk#_vtj<1RB2!U9k zU8rX~5G!9r==-$DmTWB|goEmb!k@B+erk(N;U_1@tTxdMKd3^*#>rV@DFh?#8u>Um zt-~8a=M*xTjeQEP8G58%5_FXE#i`^>I+#|B|S)}2~zGnr}e88jTuo@ zRRdabh%h?CQ=7b|+y6*Y4%DTw-&S*F3)hS;KTUJjS=^%i+X8gFV6)G4#rq{uNyY%{ zB~x_84@&4=d1rsi654WBm$r!Ny!DKfm!#pWr_%mntCcS9AGnCCe6G z{TQc6qfmZfP)%*?>Z3Mc-TOLsZ6ZCb(Y|;j>k&=v4BF7>XcF6N!Ih83e%WYUh19l zLv&m(=UW?C;l&KS=(l!MJ$-s)eVFr9PEK^K<8-N$tvvm6V;E>>kVYx&%D5Ql^ck)TUlRzs8gB_%Ttk$ zv?j2ibmUC0U0f|ObQFn3@Pk;JgHaOBe(svyi}U5J--|hlAF=z*lp@!0Af$ijJ^m7# zC$s~R-BQN%6Zh}#$6*f>e8qu~ZfYGmL$_yJh(u!uagipylL&ZHDw0Ddn7>kGCpptY zXuzqYzaZjY7?+j1jhJh6FGl;Eb(qb?E^X^4h+_gN3a8kN82*9VTLf8(NW8`%qOw)B zwgxVyE`0C1>*@QFXmoz`40LmWbq)FR%KByC60<-40XfZSl!^(m7jsxXAz>#S(D5^e z+VW8fLMU5zr4=caZ`7_XA>vPb2wS`8Xy#(w;OdFX$c`FG?Zzr#eUyj<_+0*57LR+TZrNiQGo438iXZY&7oxd#m$jmS+( z2U^8rFhl)zT*ha9_NMj^&|;6X+(ZatR*{-JdG=jVbNMkI@dlIjhO9l@Uz2>Pioa4^ zvaKLaE^Qxl^8qK|Qg2GJC2iy_%XrQ&hJJl_SU(L3`5`d9 zPyNITloq~7AZtP7)G78aMZ*U z$P|2b?Q^BpVC^lEq0oH=!l$EaIsve8e;_lpBp3tdLIiI~c}$Jdwxf+B#8=s!x>F3j zkSU*25#NV_l_6*?N_Tbw_(%GwiK61H@)|JLO}^!BnClDEt5WSx>y`yHQh_DjXM}7N zs3D&2*jVG(9+hLY>m_cr?f4-G`SHV4E3SvqY5`b?>fD!mHhXlb)s)%O`V|tfVVLl{ z?|mRLeC7Ev{NDu8tt*XMD4%rWs=?)>aWKGp)0xDS?}upP;3jGlx3l8l2iVP(S9XU~J0C{c1!>kh8a`oB74T#Mp~9 z-CgWjjbe{0AmS0?+QSWg7kQC2(e;;D3zGdd9qk6QubN#>mzWMpqEOZ=IJR1ZkayY^ zGE9X|_T2;dyS}Z#Wb)UuQ9)Ql-7?}}FGTgar6N!MGl%uqJ!y_%an%i9A@?5xc7o~g_4v7T?RPf5z_#_&SQ zr$Yr|^RpY3g?dvBAM?Eq^0tUWnKdaYsRlH$l!639aD#e$6i{=<;tx94m(R@>Y9NoM z7*9Zc7LfL+E1GXFj9y=CCQZazz^y+>;(;k zg?zA|lB8y-xybb<7fT0=ROoq)h2yAF^%VEs*Tvp5njxK!Lj-A1GC!_`$rReVa}vxJ zlolEGkWTB&+aH>u&Hyn3Q8SJ48*@8`MN@wdpw>nZz=cvCwbBSnoQnGVuo4P++Z>#6 zLyKx<(c_d)NPd-l*KZdjk0t{py;;TWuqKZQf2Q6o7z_ChSY=!4D)YeP({x-af41sI zzV^40uSOAqR|mH?WmGtTime;U$T}4!-e0U*o^BHkt*R#c#1&f;x%MJ%!Cas2V{F)) z_`+kM(xFMi?eoc&6{aOApFk)b7b365iJ&1f|+7AB?9hgSBirf7f25lNV z&=knYrm=GhFS4J=XsMS1Lw5~Ze!%TeE=>*t11Hl)mxpyJ|6ikQr&gZ_2 zV7O_hEuOjs4TC<2YO?#dwYlgZxH@-yJtic%#lg@)OYG^5#uR`s^Ph&b5F1&I-ThHC z93IJM`Bl<1*_vRzAAoqy4YIVTI7+!oSNmzjgz|YbZ6dKPj>X>!A!#6TltWCxXI7q9 znKFj+XW3lzwS+TV)t(O6Z!!$^(L!OkKu^?XbDi5zbXw^b6A z%WMevD5F3wqkY`ts__hs&eY|A0moM->*n(st6r9;rM7&x9pfdUg4z_lp&ea^MQ6Uw zFB?ehr8Pd4#`&7_x*s}z<%XD(bTq|-TF34AX^hez0{?AnhHJs!BjmPZ=B^r z8h@{oUxzTxwg(UKjW`Am^rwU`GENE6%aBtC_n1W|@>ro7>~-2l>O$w1H@_GR1`ib# zBoSgkc4~0ZAj1BsWN}3v0_j!{+}vB)T45$(wV25mV;?&6dlVi`jLoe_s@IHI3);z* z&4B{QqkZ+Pl&ln)W213Gccb%@@NKF73q3^Mr@zhkFK^|Gk^CT06J?p>=brhX5ZtiU*s45S_}ywyWcP1m2&PyUe6N-;liu0NAKd--+s~n zwU*gU^qY8{0JOt)B11t#MJGXY%@st~vO8IrhnR;DbKc}s@Tm7rv zl?mpmIgw!>F=xz-ZnO&|84Q1-o)TirYnW!U%T-tyya93C9^G`kNZNf7VcUMTE~hYM zU~BWo_9UX0ZEDIAjR>lq?3U&f*UPz6rRN{Ck*PSiB^$$i6~cTYts}wHp`)`Co|SjE zBNv+j52mD~z6=8rI@J=DSllrp<=odUW{jQS37e`;1Ui!{yXTx3=su{pHpVVt(LW6v z$(bD+I*!~dO%bn5;5p_ijkAyz&T|EWw4(mtfOUO=mBaWXga4$C-E`%x28X=yaEFyQ zLOsyy%U?wO{3qn1W3x1)wiFQYEbv?#SX!q^lDt@;v?BM}loZafjJpu5uRW&_CwoJC z%eKiWZLX~`oZ;A+SuW_aMRoaOr9MKgVvUlAkDSLkdGU){qRw*tHAQtG1Qzxgwm@J=KJ1p*kR#oc3*tr*gIevu@Bt)1R)^P>G=w zul%DNe)?Jo9n@;oi>SIv7s3|QNM&K`rLA5q(N6s0!AYs zcRaE~i2<>^>zDXG`Bvq}jwl0wjQosozrqt5l%`8EzO7#^VeKrrQ-imBU^s458zUX> zr=u?ae(fA4?Xt((_4@WGBn@&EScknV6r;FgM)Q8Qv54hu-BP< zE_S%OsuJ{WtSARgLu2lj|Kk5z8S3P%9oKg5L8}icfr&3gS6do*Tr#Eh@t(Ikd%}7E z{PgrSYoUV1B+NuNJm*D-4mF~}9Hh-#b+b=TIt?!#DR!_r&cda@k>x}VX>ucEW9Y7bwnKz{0ts0aOrhk~P-d6`ltb-^4#MIT7 zqPWjdhO(S;;V=CHa@fBJ zU1a$SR7eDLsK8af1f9U|&!KGt=(b+Sb@3ofaLC1U$E{I$jk(sq-pW5{p4p^o^!)Qc zNI%dLWvjziO1I-iExW3 zY;;(N(6|!6Bm~nuz}BCjoXwY2s=)$TO$MN9QgfIiegn6rkO3?3{zabr%(Mcwg31xCc*D1pWSd( zeHSSVTin}}3{^f~@POwN9v8GcY|8l$P9SFCXSx2=JW|js~{S z7IGoxHkzhXD_Wbu+-^Q?i;`-46V2#VdtCy7$PA~CHZ|{LRkIY|ZI>e$(prORk4M~e zEL@nKqESbgH;u7z=biFFd( zn^B6C_U7`3etuhUFs^y#%RP)iC7kF)k7zMZdeCIZmrNI5E^c7P5&MYw89o6AKeJH# z_;v1Iej7#_cd`wqgl+*0GgX(3w)z6Fiq^LI3)7G5L2j6^fg$Z%0_JC|wK~1aXHJN( z$AF%FSw9j;u5)SVn3dlY^_Us$=VoQQeUCUO$R)q5VC{l>K2Yxr`sp?UBpQ#yfBSsU zbN-9VGyYAEDa}4aX_>aV>06nhJZ#lSse56goA&*drf#4Ik~Hy7>!)7nU8HHdjT$|d z_kI+5KlZ%x5QM6Q@5-Ism!k*&gX@0-I$=-~{;L_p7d8JvHgm7o{PIUvRb%(INSKHBlg|Ev4nOWE_Co{hr`b)IoLd$ zLFC7Zx|LDrnf)C_|5M#j>mYM(T8T+N+wRs8AHjJM5kIMUD$@WQ4bBY-6b znITB|Khm@<@Q$rj{v`Cz@ndVIfjVV2J5jG?L!_>8ptMJS^F>DM7Fi}rh)w9ir(Nw< z;VwSZZp^s`myp9)SuK7VWrkZ247tl&Xn^X1b9ANkhPOAm6f~^Fn{4{Sn%2wH8$0h7 z^S%xj+KjoUGsb(*)4S>0vr@IQvI{vwel*$ls92~mc2D%YBg6ZY(|!pX0&rCXKO{c8 zXop@OKbE1o-McvOk=5Z>!&#a16*M8tZbn2Uj1`+{bsGDl^(8cL7mO*WID=iDd6g~Z zpXaVec|w}*LyXQcW(+%rIOZ`BlunAFu80%`%I%w%TKN_iZJR&|Vs2(Z0tE~Vo&L4i zt&cDJHy*?+n5Q?P(>0S>MR_%djA%9WU**q4-x0i-u!)g}x)LdX97GdU+;&+ih0`FB z_mU{k?dWP^o*T;cfg@WMKR~RwwvxNG?JLoJi~gdskRp>#W)R&nHXkTJQB)KF2#D2> zl}Ckl$!Q>^1r$H9 z)$p^`wac#O(0s|t%TW@&hDt`1RXEmvul|hg;S9UiP@>UIf+8I+H67MJF-@J$i_|Zs z=@D>7`-E%;Mz%VhZ(TWY8av$Ndx&XdVYvTjJ8R5l2EY0G`VJ66Py*dYTWHBQ_vN1k zyISH$wmn-9L%I3{2~raB?p~L9I(){o82Tb8fmIWArov${p=_<%`IA!Evh9-(#&=?f zix%c{9H&&vaLBZu7lOD^p(ZpdL=w)Sa}>9)YB`bf-GiR%=e}#}S8D{J25?0h;WDN} z>_EJpd5;VKTdRGEBfgMt_tN)@s?@vQ1Y6Y4=Yrd-*Veba?H!g8Ta6i2I0v-VEifgQ zx3PHB=55<1&l=gRZo4JUDYb%ZjvE#Y*)4ymsbU{oA0(50l~bc)13iIU?QQE_D6@Cg zGDc19+4PD_zhXMdP<BY`O#g}R z<5~Qt6$&z$>ZhmSSv`V0o2%>J0IL?AaRt2I_&&Tg|*IGrEib3q-2z4!!& zDkfCH)rM0{gI1Eo&VQ}sjRznE&3m$cNhFFyx9!xcE{Y`Yd!N9bzDW$~FdtnDeRdG_ zv4*)=IH`2qsDRuKv+gSxZFJ71$$Gx{?Q`DIJUu~`RFsgFn=wUHqS=p*Xd&s#;y}JA zfZA5?$SIGc8^681T;#Ky)n6}`GZN{xQd>!v$?o(PZWjslm7JB9LRxUsrh^4{O&U6>lb7d>l3FNeHVmyBeDDNe%MlTnY7Bk~w-Z#%| z(2%3r%Wg)sKc;z;|i>}kJtve@=(gNy@V>eBT=~xQf{XcArny`muHHs z9$B7FNDkJ|;s1pc9*hlnoUSMxF%sIdQix8v=)>2$d{bd$MT7vkx?aMuHohBN5mtDO ziQLropLRfuQ}UYLf8*Pmu2ziE1J$5c(#WuqrW7wQO(0BTTc5j}YWYTxGJ^7VwS>vc zAgJZkutXXKD)J!`=URvz46J=YNfzxy*PTmFTSBW#%aR)0`hler5!pJ6EB|b}>#nUA zjqrs4Z{io*7Y-b*%;0y|#6ho9X^Nuecy8OCQ#T0GYxDiy41c*rz_(Kb98$P$&=XY zLValU%-^w!+wLS3F3O2AHS#}#_-IP3N*Z~Y#nz`TuuI90g={`$_=Qd>R)%ZCd^Wdn z;bcox@d;AXKDk8yYpK@9#iu?{CH|;{G9?0#*-i1CWbet-rz18OE>4bOl6f2&DPdbs zd5ce$8_ok94r@!DqB^HKJJI#M3#we4mY`CJHwPNlaN-*iGnvSgS z7*P5)fVnler|Hyo!(}6k!NO#_(o)?%-w6_vVq5%pz7uFOfpZgrPn*k1{KTA_}`eGsFXc^}U|YSwci$Iv;@c43kB1{^3})pAs=?Bbzs zOpo+VE=~mxL>RL<7j}z|bp(@DIH|e;U!zzi%UZmAjs9WK$S{=cSzb}rZL1je4(?cf zFJ(%o*Bv0T5YgF5m9-PjZ>@KpmRYy+V-K7!+Is-x;E^K4b}06r9?CM`Ly~ ze61KZ5L20J^zIdCigHlQ%c6dlj><~Z&Di_-Dk00kg^pIfpcbYEwJl@?rgLVk+9>W# zVX(Rfw=*}e9l^XJwHQ9wA!6NyYm9&wKaf)^e|+t^4SXswgRB86C4edK#3VgG!8OpT zcsH?`ZNqPKg-|1E8I`263-PL)wOol0x)y2b_`UF9#j0c%rOYCkQ5BfSRf_t3`scQ# z`Hd%-M4GcOUMAdPpjI#82 zi>WfRe@n1iS;+3!_eemV19l`(@*r!j059FnAN{#+8K_wS3SNNy=*QoOK>4D-e_Iaq!dprpl2TAq z?r6{IxyGYCs}sNNSxu3okrM9;*e>zTyA=OK$UvHfpFygD%4EywcA-YjTO!Q@AXs^K zG2%|t8;i0;C@R`)8IS^Ytl)p~d2Fj5l8y|DcJj#koPN)48&{QzcM{J-$dFEMYD)TcMS`v8gCX*HsVp;p{DjVS z+%GKj;&(>xCqMjfIL35A{#si1EheV2R$;_vE^3UzZFLh@tDZDUs|;QQgR2!R9b$kS zq+n(Y@bLvf>%(SSeLdkL<@6)TW0wY*vkl+D6EGPY+#_I~3lAXidFJeBIWB5Ixl0M~qNKtdrK_;P!H~>yUGnEDs{XgT{M>KjxoNg(pn8t5Nne!av@s zgfmzif)sd}o4X(@IESUIqPv;WeCp*(3MuslW5v+7ncNSjN+%~YV1w=bscz%*gr2q2 z?jlTgJHD)}cq1lPc3mVY-3Av88g-Dn@*2aRR5i;4D(#oM0=oUY^f0~`d!U+Pbi-t2|f~O4fD;NZC=Z5D#%^)_U^3*uV@gMnHmC=zs&ciZ*fJa$?t zO!)X-I2#i+wDm&AZV6S|wDiMVrwfSdd;7->=`Cs>yYDHk(=%}k2uZj?7*RL+D?)p zic~GPSQ4jMo7v&Awb`YGjqSh#IK|+1>qyb7R}w~Ig$lPe?=F>g74dHj_x6`7xC5X5 zA7Xqv{Z_xnL}@7WIrxtwDx`G8X^c0mbg|K&`~P*&K|1cUG)a|fbd%_lNOCeUDErJl z$8Dnzld$#?@8Q7XP#3&_Y15J(A=l)mf@!(=aogO~(5B{VSwn1<1ytYLH~-Mqb=U&o zH|QkEo$fDBHR!yUcDfIq9n|Ks*s+7;2n`f~(j#R36ej>V>;4Q9Kj3^Z+-BH61$v38`OVstW6@4O47TiFqT?(;#->x;0D}qJm}*+WwYgwa zcvE9AZ55{(v+UvP@-AKN&ie;q?13Cw#qmTM9p4vXt8&J2no8$1f*Mo~_wFtuBteNV z?VRnLwq6*5oQCrjy9mgzE<1SUV7`hY$ST{uv}VX8rV6y*B4kT-Q^&2SmjRLCLt90j_StXwzYbL8 znMQ2(;DJWQLxoI44aV-Td3C{k5=E`s8gH>97e%HT+9HM@?GKsI71!m1mv#4BRLL6^ zz*?f6L3frBZA0LPn$CMMTu;Mey%TnO)pR202-ybPlX8(JZI`B|5V6B4@eT`g3p&N3 zfe}vNjHRJfHOKW1At++BUz4GjP0n!_K!U|J&#?YLxg4>7z|=5IY&+6Vu^0oGF&A>N z1FOT=sn}HiZm=7KbAZ8a3;}m zOHRi4P?JY%9|_&Qw0=qK;$$0Ghm>xA$eT~pwqsDKTPxmqS9r?FO&0C;jcPPm^{{(()0c($qJf=Rc1+ zw8NWZsv2G8*4l4&U2Cp*jX!M`3lT$Z#N#8ZyIeHK`eE&2A1MwOJ)Q6oWjXeTLx%?U zoma}JTye;CbZ&vr(7`WTyCOoN$*SeHg-uLt)k*6mB+#@P!*?1uZWRi`1ODE;SChpmu1)<5TG^q zf}yPVRB2uem1$b8?;h#)5~3|qLgE04n|AGL$7ua`P)8Ui6g;# zYi@33H(H(YPWM5PP;(7a_`|AHozYxDSNpDaI|JayroH{?hU4pdVM`>^bbP#xaPyLQ zHLk}xhkHBo9IExa{A|8uwA#cbefVZ?3%f#c*9PlseTV}Gjr?0+3w`;nE_XXP=M1W} z$*Nr9I38yVwAasH%4cf)Fx%ogDtB+j#bu&##)&&6AYhSw|NY!0*EG55M0?2Utyz{0 zP|IMAzyajr+Kj6F*aC%QengP-Zt%|RP$)FEIpTs&RGGn2`Bd+Q04GFrbYtFol7Blp zkbFt(7JH;n!TjJSV$r-*u~Fnl9MD>xhrql_*VF+Ne=Gw$QoRR3jy#NpQ4EdWpMn%c#YqwLT}f)3V_>Dc{-U>d}PVgos!Io&4QA}>O#UN}-iwqNah zxvIq6nuR&3w1;ms%QJlBD=hZ@jk@ZMsjd|9!L zFEPs&)w(;hyS5?pxS_I4&L=2F_%oTpfojL_%1bco8!pfl(Y3&VwN3-@=)L*0+1MwQ z?11d@AaL@gDJ1kY-&TZZ2|qHHT-Lvjt^~9sRF=!AA(@zBVy;OhhV01;5F>8Tl;r+W zp&uC3M^_1=cB(H3ziHG=7Jyvd{ygb6wt9CM4&|ky5+M^)mQ2hmrps5(yfihN<;+uQ zwb9uRcs9uT{;fz}Gpg&z<&vPGX@|DDgS85(u=;>vwjd~I4ob%o3(fT|kMyHv-wy_c5t>8~swLCv#&VbYv*{!ZRuvLk29O#nk z&l0eL?Q|WyUa66S4sMpl;JR4KOI zAMS1&`4TfgD<<7HQeNI$4j8_jG`nTmHUx~pZIoY+uhXEmw~^UZ6$zsXZEQn=9ELaU zxe4d4&womN4-N7)Skc-);L7ZsvmNedJABBoZq=$vRzE(zCjd)Qv)p_tbYAHBnq7lI zr542-Uw@=y5PiUm-%McGp`ns6_|SLl>-G|D*QYo8#eIFQ1p-++Ym?y>8<3qwhe$VV zGCU*b7*m+mhQ0H0ELq>A;B;#ARCdr1Tt9T{-q50z!TwIa@%u3;c$fhyV$j{h&ZF+k zaAY&ywDTiH+nZlUVHL>%amLVox!h0tbmDqDL_Ade(G-!xyQ6c8+{FvAd9ps+A|-zW zFsR6+T@phD_-=;YmUxD`NWoJLmU%Wx6W&gq=O!TXfbV(-d!Hyzk+!@bW1~qu07I{X z^kz15xm-0jXvY1d?kcd-`9MQ6{BtXa@(tdYrJdFx(&^~epGdIbLLP!&@_`0JslJi~ z?1?J&EzK{^HUlZc$9~{l9_;-2yBS*i6q24PQdN&LD1Fl2OPjkYi)nZGm?tsXDTwIw zv+D5ncWbK+Rf*EN=xHri)aLK#z`|#&G&AD+nIwrnRp^_I+M7);)P!?Z8uaUXH)w0* zmgW|c<4^DPX3-VVYgCLyRMreu$x|~b1T+hEwv8=R)-czRhi zM%&Jrm6YhMZ4}xMl-h6ldh|bC4-Xds4ePg17Z*wUZ__zio5{vJ*_XvPyYjePm1mqa zq91>|=idI16J2pr{*D8)Xi8}2@ajfR)8;5qB=B;3y}Rvk@X$mAPT=Oi+Adg>Qgy5# z3EmGktljP2mvoJJB1&O`h~1~|&*gV4?hG%m&o;bJJidku&mZcgVk4_^qSeV`56yZ) z2fXtM`Y04&@+HyGu%xMA^pmSWk5ga)SUQhx9x=3Mm7lyOJ;=R`yro{^7&lW^$XLK| z%XA(Q;LON#)0_yrcB^DjeoC(~Fu+ZU%qa^dmtv+7jTAhoh%h+v|&QpH}^X)&-$HOGO7ojizjK3j5k zhQZE{u;RIXm^7;}#t2(`V3mUC-gZ!ZkZU0;!GOU-=jo*ib#q6-s7?6Z@PH9?RQ|Ix0MmJq z0a1^13IMx^gD+lgC&C!o+x}WTz6aR|GMQ3N<|?1Cb2Mwj#Fpq`zVivTIT?0Z#8p zkv`|>)-3nrNOr8!`Z-xZsXThIw4LA;xfb)K0_)>xYbDBdV6zKgqRZ{U7|{TQ;5)+~ zd2*R-!-t209deja{TgZm+?Oj%ov~WPM~~wtrNx=frb^g6h zTNIlajBen_N54i9;49UMAqJcUtaSMMloLu<4k(?3a={M=T~Rr;q3?m7tU779a2nGm z`318r8yHFw;@;<;-AYO$>xrlOl80{OSBLoLQYCnCr@7G6{MD3)8QGVI{)02(_~@)A z?h0U-Rjzi_9;ZNauBXGi_}kVxKP)C>XCtgQ?i@Abv2a#4`~sKRxBdlec0J(NN8&$O zbHdB+QM7iZ(a>dn)Wpx&0t{|D;Pmx1ojs^y$Hdh!TB0C)=n?nZ0?a5HX~#ulE_kQ<`NTw5&M$#5tUn_{Uo4W;T~CS$7fiF$c)iMwYS|hH z!cYd8rZSi{=yz^#zH}E1VY~CYLA$INii+ISXlLk;iI8dsS=O`Qyn*dBpe_DL2-?S_9q88jV1~5O?+`ED`t8rT>71h8cjx<9_Z{ zbo)Q2B_4)ism=AO9JEvlP=hIYPl-OEuzC&`!YZ7H095_MXB@pP%8^B>-gT_w;iTZo zM)VUaGj278$H=P%+o0rL4JY~X;+`^_vC|3$=#TZYqAFAn!Ow?z)W$J*)n@>E&%Ar( z7#s08EBP4FyeIkjLrm)Air&T}t&wP%AHmXs3J7?~Kct|seWVKD zv@oOn{rGMzz^+)BoLvSMYWDVUKtR$+&&afEK(1;h3z zG{eSN*{_yPN+fge zrrI&Y==LOe)sCcWlmM5!*ukbccWH2?dBs-m&J2ImB@i?)AjoA2RA{HMt6pYnrfEOn zm1{bXH~7RL%2H~nbTKRQJSofL3?Dpp$mKIQI8!RwjwX}7(#3)0!c_S4 z?t8x>bIPNY1SsfiE`LIL1ji8waa2DFIyz`B-7wHr0OGW_NK9YQa&#S9!$3v zqU^&bAn1)~VAC!aaCCI!<8w!Rkruruv;qNjUCIV)s+R93kXJAV0zbTN94PS6&JS3e zY5u5evNP*{B!*v$a&wxf8pE;*vYry5`ftC@?li_S5l}rBl&JK_1uQ941uEsOiwY+K zG(}uPO#?dg4|5ki%z?csMpLC%%)ky!8j~e$E-N{gOr@tvhs?{^vdY)L4N_-2jVw+A zH1$vTIKra6=4anxqTRK*GEiWt1qOqoYdao{uE0!A5cwe#t_%{8;^kpDN%DV7Pw4^E+kEb0E{FZ zJ5_sJiZ@4#n#}&AsnWG6C^YH*d%gM2WTpKL9MM&ea9)#MGU9>2MjM@-TJp&WZ@R$w zt`um=Yz&pEmW|4=<6>qZZ_Bs069=skEwI2%3qqll5`8c;RZ^GNYTdx}p1 zlHG`Mjz6y7v<^d=QrC3Lk?&vMPlYJU`*OIh`Ev;fP?RkfX=FN#KrE;DWaf(avJiE2 z$O{eS4Sgm$h(Y^-CT%i8(H&jQ7hkUx9@;i@LFSK@Me2&x8G`L+YPJ#jD8?kS6PFZrV-=yolP5mz-xrR4}Vx#k5i#6TO0 zdY`YYIkY)xM_JUKjl5>9LDi?_x;t$-8*SJ4>MZf({zhAnFELZ^31FdnXsVLgYmFFCj zyi@^YN5O*-^Mk#uwVrHO-WAAHp!&@qG31VY4W2gV)!d;@hCe%%x1{~`j^K1-gq zNhO;ompYQ%F)Zx`C^>g|ICvcMMqCmlXTwRa<2`llE+{$McQx8bo>9%#)-sud12d=x zsB9cCrr#D*!BqmxdS&5rcA$oN$u+=;PDWX^`d;GJH>EB%jIf*VB5zEP^w--Su?ymE z6-b=GF9fU@${UIToN1g20zLu(t8y!!6@gv4*<0ABO~pTI50Z@$zSSzSJ^ZBH-m(dh zwA%L!wfxBgn46ny1W#HpROI)KJOygMELI_K5**qS{F1 zR<&IL3osC#x>V?!SkRXls>K`*tMD3iqK|}UC zT`tTSqjpYZ$-f*&Ls_5%)U5OAQTiRLL$%>KYsB-3Ox`S(;i|O&aQ$-en6^v})!0s> z!2W8ThOuU`eoKV9MCs(AL0b$>O0?}@j#0%*De%#j4Zm!F?hLkLF55)K)xhjYIYw;y zwASq0w(SbH$B^*izM0C^T0D@h?q%d82l9$G;O}}X`GI)xho%Fc7nozA+zQyVnfYiS z)jA2@T5kErZtBR!rC&u= z!Y4=hd^m2fx(JYdF`MHk+IF_z{-OU#fc__z_;XYW(7NrfQ3%bLrI zbecMW;L)UITxzd$t&wU9Up$d$#t+%+3J9r4(Ps{axzr;u@&^EQ1#_ zZli_!NE{IExvOgE(6Z+ODk)$9#+9eZV^g--DFYfQwLyhQ_A}hEmk!rC4j&Gk3gF42 zqM-0WdECxqnaEKdNl=MZn+Wi=kJ!o{yW(C*7Sc%pf4#T3k~d}}YSxrm83?G9r?Al) zg&OzU2fxfy@*oeH%kqTXnDuHUTxqhzPX`Oud<#pC1tT)M&%-ss6X* z?Q-ES6?{n_wQ(H_mf#0bW zcN;LJXX1tbFr}Aseq^FU)TyV@?LE2+aL(_lIyxB};XtJ!kw%)uw#$Q%@9$*vCThK? zh{b?!EeXNOfy49m*9SLHQR5Uo*j}P8a;9j=+@B@8JP*EaqP-De-@u~HwN!@UthQ#p zzTD>aHk3eUDQ7?c6?yb&*#&?CZ|Q%w44~p?2htSchC>9JI6n>MH}YRW;k3c%n?F?Q z1$KA*w=KSt8}okL6ZZ|3XREXZ_oMv+4?~=#7PorL30qNv64nlj&hCT#KDPta%#TCT zKrl|kt;CaA_I=VHWaj3!Jiy&1%nevg-X$khO-spPz=m{mbrBmx+dOWLx@A>=E5=dR z!h#bO{>X%~`l2F4huLWUr7~2AoSCM*X7lZON_`Cu-SDb#gC`ytt52I7a-+}=3Fzz1 zn1dyQpdI9`*(l=0-b|{sk`!8jxj4_sWw4u5U7Hhn*Va#d8OHviuCb0(z}?@~a!wWy zc5Ac03OW$@WuHowfDfLeQ!O{3pV4(fnNE>M0r!ua(IvquJ;+;a;UA+$CEio3b%a5n zAdw>ai6L;6NF`zf*4QcpqfUu+bp6y0|ggSiJ)6Y>UA{Mc3>m%&*T-^OnIz)$5+*Wjl9tx z2tWU!#Mb#J9p;}EH$_uv@H)T?A>IJ=w_kKgu+xFW z1^g#Go{<8UddgFMV#9L?Pft&!{p=^IEILDbt}IrL-oFi$SsG_-k7ner`0vpVdHIzPaUUzR$75iRw~1tn5PIN(iopIx0$IOnf5X0*5?B+z{Qz;0*vAja&F=1ERZ$rAbCB;>3My&yU=| z;I*H7!pm-&Q~%eU06Pfha8o4$0?X9U`uOWH6%rr?PuDZAmpu}ncpNF|iJxVs!3@x@_cYm%*0Cp|%L&;B*Wxcey9_asEfWzCO(Ud#tRSOlbrArpFOf~+&nKyyJ z-p@HmBswPh#WzJsRKR*;M(PB1>O}33EK*+B5n*sI%!va43vpf#MH{AHEHHcsXb!O3 zosoFa@(&!nQR}Nu?y&v=eR~7S?rTM1#G{31_!-EI&8B%yWK12zfO>B(wV)|?)N2^Z zz#1zpe}h>5!I^*R3dr`Ky8ctwf9i_b4FAu&{`0Ot{`LRDyQ-P=ygsT0IEobhd0HS0 z`2Qv_u0Djex`<0#(k#`vbt_3?dz@0b>PX}hcmd-s|Hw7=+ylY0S(bKD^}bUP{g!&r zK+xfGec+V93WaR(Jnntmj;mNcSNz0r&u(d}P9s*%M=Yzb7?F!u5zNMo2-&S10RQN3 zH;aMxc?K^Ge|6e(?NH&LOx(N zP5w5_pN-aF?TCbU;^Rh2{Ox&j-O~oU>C{V%{kZ`Q1(lPHEZu*Un0%+{Ywr0)&Dd{B09x(ycpmp>qH`ZYrxbV%Bw;pws6Xp(_ z{qYr+u*5r=@z>6*15Q4nGKoWrsEQvH3O^Al!{gPFDPn1 zmOt6i(NqOBtJPdtn_=;S&No(19SQxUP~z&aqo&JJ3B1QoAI%=6Hx{0_oRF0>m+skm zo}8fby{`3J?Va5(XZG}Y`h4R`$(rn*-9PH>WCQIr00S0vbssDIZCuQk&k8gJdF{%Q zFtPqk02Zz&0Ke@f4`7~b+&b`-=b|9=qx4At#l7)X>E$-+Gugzg3eU+Ew#?w=WBsks zISfEmZB7dk-v8T>O5@%0_n(Bf-LA<)z?>wUh81(c66*r6|LG*ZxNMQ`n~D7NK-_8y}g6 zpy5srPnezKKc$H*LSYHi4gSj~&7FH99w(%=L)vFK@t8IwaqeCifB*$T($&3Y7WDD1 zsl7QV+aq=Ws^Pg<+8QH$QlXDq8M*(1Q3eU6T^Y}G{xWKa(hovW^~4^WWUqS#Ho$$b zQm^z0@IBZsj!Q(mo}g-?>UcQTDVbPX_t!}-qVy)3T;?xQ0f6jh9A_0Ho8eX}3gGy= z#spp+XC0Hg_3qNpofEyEmL>!2B|{LwkkrXvS+I8Aei9{Aqm}-( zN5DzMj{)K@|HY$`Rpnrsq~qU@;8l#H!bS0DM3=c=@+4*YCEaUmY@a^6c6=uw~oP6d;lXblSnPpV#DgEuD_~}SMB+y!C#&0w9Gl3_YKbk@H zQ!Ky=FngZ{Nt|Tq_&C5$tJTwb8z+C&O#`_7NQSqMUqU4-FC=jKz264pC~;O=$AV=sR9iErDeuv*e9o9aUMYFdXR((Uc2HW z!UDlYNDk@A>&Mfi1T27BVng2FF1lkBo%?B&LNXbe5B@r-sUL$1WM~XMLLN2W>Rf=^ zv;9+by-LS=3H+*u8k91xN_zXFA=6wcyuVUg8n7PG3;}2U%gm!0n`;7gFqbpdx72d> zveSQP`tug??H~GI+UAp!a&l6Ju>c_kXQ34*HFTU4(0^h>Bjej3%fz}jXQ}?94M%-u zprVLEJ=VV)Ze9Ohf*ZJ5I{a7HC=iMY38tSIo8q6e!qlpO-~xsCO#c&|WS|Uy`%i=P zd3f*~e-Gcpj#z8_q#mynk`=?nU^6d`cIB=|)e2%R)db0&m+rVaZ(Mb8H8r&aGiiEh??r82f<;L@m*)ic_WoR`lH-hno0=Y}81guvSq@wHpt$eRr(xYu9OH?<`*%r?l0 zpK<~Z(f^QiJNLai1#xcUvvMa|w)DrD>e89CZ{`f7b^Aopm<848D`qEGUQP??*A{0B zn)*%|r_|{30?t$gBXED9Y|``^fw0@f=O0z15Z@OjUUCsi>orSAj8FDj(vJYH-B>-B z^CWo3X2m@K2vjown?t+rhyE5 z&Nf@FS=_D~sJO5pMI!7hB3MpSL|fgtfs~4tkSmniG4C|@0@vo(alWug%8VLra~E$M zGO%2jlKCd26eOv)lvroj(|}(hg+78pwx*1`{^{8CQRh;%Kjh;264Zw#-|u`%2-ASoa7>Cr9F1fd1pLUS z#5w)&8f6G>r4cLJyuQEOGi>-HGYOb!MgB*-5>eWvl$Q~9G7O7mZ65*LYfoysW{+vU zqx8PL_A5VA^(ddgVMlwcQc%yzfW@{Y|3G8+7@ahH&pEC6B}Ym^U;X7sL_N)Oj}^Va zff}2Zt(N{g*0Y7GR96jxF5AgE>tpTJW7QN_Wh={y$+RJ;YzVk=Qm0ak(WTazTNiq#j5*t;26?kHsxhD$-S`k_#nNc632p)#;AEq3Xh>Q1NCR#OcbWxOJG z1*xrM!RZ_ZH$L2njlIiPZ=Bj{z-Ja#4{Q!%k6V8!c)@zl1a!et#@?IfLyZkh?Y9Si zGjXS|t$`Q^T03&^ky&2zZ~A7z@WZ?FzvM+6*+rBM^=Q2S1o#Hb8x$u+JBQ`5f_$qF zQeyzB#Y{t2eCXQ3V$hR$Q-X-%u-oFKjDDIe zwQoEcn_A~zLeB{F6y$G~S1HY2!1Nacm-<<#5b6ZA3SAC*_AoBrb5Wf#BG(lu%0u=! z$<~VlS8`a4QLu+utyDV-v2ZhRUx}uD`+ed@^K1Cvx#0arf?1{hNu0O=5Itsbhd7)+DJbig;&yKL@+%>y z4UG%cN*P>*bwbsA&5F}J7xi5Phz@37MVL-S+!yN5WWiYtP#2--Xba3KQ5aStn`8eJ zO`}r|iT9EC+#-UKl{HLho*@FNI~QF=vC;MRph~mAHre1r(~p5ed|K+Z+V(tKuIw?fRQ_>)nJK<|h2R zzU6GJNYJ=y8306UJw@w((jXiGYpsKd1ug8{7}F80itwmE@A04llCw(x(%|L+^8etL zgi4zqhS{9VpW=wIOA!(gTi9Ff%Oy5*0Drk5S;Pvbh`mddB%s!1!+;qX0t>l!Ha|$a zBw-ET>Hva;(o^CMddoM{avqvjIR?~>GPm**OX&tH4f z92lLy0>t-or~62NAdWp-!&<2xQKho z!_qt${7%)TN2zy{_SB^)5Pt2ndrPP}qSaE=7K2?+o$)0rba0}li`YYA{{l&m@~u~F zH8#C)Ijbyl^$;wT=kK3esbJoD_5G1fmV}Kfjq%3f_{8#=vD2cfbaVJH(V1Bvi&T~@ z>DX{>saf5jiNP7GoN%{;Er|r#=xx5(FuwDSpyYFs^V4%QBgC{KA}zg_&*KG!Jg}-( ztlGR`h@C~l>H!|3U8PGB&2GUa^R=q{{sepB0p&RV7aS1=7dF8l-XIQYnVa8~-m3=f zB{an%H7olO3b|$@4e_CDFeALe- zT_BS>{ypXd>C$tR*i1IoHxGhT;}#yUQOZztFcjdtl-{e;NffKiyj+M?=~8}yvsnjr z;W^Wd_RisS7cH)ix8F8;QrS|aVMdMFcoAj(4k|G!0i(*E6Eg!`i-u;}Y!BKVCGus< z3%*u>6!+RRg^rgtu1j6d$mgq~ZAmA?BG?F9!RDEL$NoND%ImQT3%hfeKL{MFJgS`w zVyx%YGR=y~ve@QwW%sFkr1N3c8RT_N)WzijXAaIj4pkMQkNNZ0?2K=h02vEY(lYJ*RPs7Y|*fEKdFKujO%SQ(#Xn- zM#XU*NFc6$mVAz%&aPs&$ClmC>C8xB(Yhw7pTgq@Q^rfkL=jN@P%*qY#eeZdFfw#v z_gQm$rZ-i+*htGTWFeH?q!glncWJ0=fp@rbjdc1(Ub>=X{Fy>8o7MI0w=-psz8=k4 z8HL9Qx$0h`$}bCHLHN{PdYuTJS{4UC7cz@z1eBWCbnem$4AY$^sk^Vdt!%C7A3c<0%nGn`T~}(m=W!x2sQqE80w6%L2&^kWikF88ugrrIFqB zZL>;`(BF)>fE5m@$a~I44CS>U)c&C5*{S@Y^Pm#Ku|YTP`F71izs*Wx*0Ue>{ZPo8 z7^V~Q*#g^qlpngZL*uecl2-{yShA8HbWR*2>>uO<-ap)c{&l_L6m|x%JV1wMw{4J+ zaY;G!uP-(NZ~RysOQ#!>Jh==eO$;mpBnIFP{pYO!)eomZL!`-cC-7mcn6C+rOvghe z@2`bsqX*@j%R!(HJ1LILzBX6av(V97DXOFGIcEYl>s}dnGfdktwJTo5>H9e7xVcup zran~TWsaRqBv-Ac|9v53vhvI8k>NqC`f~7pKppvNh4r`<0c)Qo2Z!#d+cPphr zq>@IY4^K6Gqp@_P2RGi~9_&&zfj)WFYo;CL)0oHjO7?tpEr*`$nOAY7Z(F;*KlE{c z?37Vtatca7#SY~N2&!JFJDRK*D7PD=Q(pnG=G=>FVnR9)@v1Itruzd4jO^Yru#OQy z5Ka8lB1N>s2X8SeVMX0jTg1FFi=rTjBY`&Xm4euT;_ViiyY3yyY`YN1{EY=XO8kr7 zcX4#T;ejsj3|fpQ8@9dPJ!{Bn_O93exyDpn`lF|Z;G2qX)fv6~jm-5bqSnGJAGB+( zb=*vxOd@e<`i$!RrIuO>1U(^i09a>B%vGew@uhLS(!zXa2#x3dfGW^8F;>BfBT#!ra} zKIh3>W5c^!_+@`q@)@|5-`n1TW=03SZd^_wbkKqlQebDQY zcTe>s)2#4Knc zDkaf=F)U14(J?_i!i}Y<<>hB@mpY~mLK23JgN^k<4TBA;?`+W~S8$itd!3VnoiuN7 z%>?7Vangfm@4`o&`a#LP1;ReOvWq5*F$e;g25Aur z`VU-%Jz?FTA+xm3Ek46HVr0&|Bc`0G-Bp>`tGL$CZ#4NKoGnETmNp7R?B>l4g&_|; z7sEe?;Wdg<`vzC}bPGN14GXi}R4_pfFM42!P&O341er1u>R)Nb`^ z_kxL)jd3No=^%Rs=|m^^#>6+dQ>KXz`XD}MGUobnG%F98iCZY~tmgNY1J0GTr}~)f z8S|bV2Tr3$wE)az23zzbNg*}dUub0b8z0aYeky8qi&n*uG}t$bvOaun%p#`jYbJL8 zLsp_vkhIILau?n z-aLxuPc8*icc5OHFiYD#L;Pn2h#9s19ull8bn@4Bc~t88sls#duHn!qPEf*RhO6Pn z8O4Tu-gBN|+sfL;c&_=@0^VcXr_^*ba|;9*MZ_-F!7g3>Fy;Wh;TQC!hW21~>&~V! z1F+`d`H=H{ZcEP)X)gGU#7?cKqh!QlWUhWK`?L)aHIuf`j<;+@p4n}ONqi!GtGQ%Z z&CwSvreb&RNpE&ZB)`Rzh{WYd7glAcAa#%tlXYVIW*Dt%OLk@V?5%oPQ<>t%E0;S7 zQ^YELfZ&9CD6|M8;?rc|Od}cfE{KsmtA$%bdZ$*ge&2z5*hSXc{$u8sd#8zBg~J=w z-q%Q9Id6hAcptpKX&DmzP6D%z-0R8;jCczQp>gRt|DYgA%q&aK^{U86bIw<_iXvBD zO?@ilI#bsiSZVv-HRQsLJg3Jrtk)4#+dYcjwNrzPD5?-uX zO9JO4%h}TFhI5$jiIQclu%Bt_(M-GD*>&l)1gi~vb!nO&yMF$)dl9J+T%JtcEyRo{ z?TLxkE6bRzr>C}t@>*SuC z6MYOHY+|Fpi+;E;|3iDf`-lp{FZ6zT#KL4&0$h6oM2^ek z^q|G5Zj-q9YPFW=PNXxX!68$mPuy@M@nqow51A%Y?O1Q)l9W||ZFP3;8nMYfTOY!B znPM@^Z3a%>HwUqsHi=)M%+XVzmfxQe&g1{SsFH8JaUSdZR`Jl20-Ct|nfF}eu}G1m zRoRx7N0;OEOCmn=_9Jv7F0L}QCId^i5$7d%_(e-$u?J(tVCK-XbtnfY;A`GY968wcJ; zx-WgAxl$uhoH*vA=2G_+4i+(PB3-o|#xw=gmV4AqHN%sJb&N-y9%*Mt)z%rEkx<0v z6~}_M9y(KMj`YyK_EkulSZKYH27xGORl0-@ToxfxXRN&zX);|{KOFJAWj_yE;UXi! zT^S9L;fmaeoOr0K`3)QtS+1~+5A)a|WV%mp2k)=HRc1R#`&>J~&5>D3jCri@(%{|Q zEvt(mi@^|YjZ(``U*CS0;E1mG;(g&08Sivjqwi)5e16n(EL4!(X+;b$;u=#xv`hT7hQw36|z{3jAT&Y^WPQE!AG zWn#q7mmzt=e=~s=cYnOjCtB`jJbnyVViQOJQg3R@NB{k`|1xR;w7||Hdh8VV(eu75 zx;`9x4O@4_lQ<}wRKCbuzw^|%8fo&8aP?H1B*%?}dEdHmBXx3NUL5m%m>Dm-_q@))IXofWs= z+zinkvfMr$lBDwBklf>LfXa>TY2M4$4;3~)l3^U)u1x)wcDrWcA_>hqPoH|mS}C$@ z-`nHNZkZoHQEA__e@?*;W_vrx06$B+7!(uiIwx`+7Zbej8OxB`o*grcFCFv!tNZrO zV632X?&(FBk_~QH?s}UTrYU<5Qs5=_=keS>D@g; z2FXo#cQ>->?oD^|U+B5-$1}$Hy?x#}7RrFV_qx`+=KRdBXbpK7RH|PxO@Wt0hWLGy zY6#9js+y>~q|h6})zk?Lw6bN6$r)^u_lnwbEg% zf-6QvRfWtdE0+-vsBR}B;__a|q30LJr54=#ePY`M`y3u#w0z%#MBT=?CyASleuneR z`i#HmC1?h=X{!|L)O0jEJZ9^-Rq@`%X#N^}vbZMW$$?v#g_KJ?!?B+Ip3r?$nAzy@ znjq|GW{TLzCCSz!?`lrlUg>~!dEf)T` ztfmlPJt#UgXj@u4ojJ71Ep}4q$DJokD2{zTFwOU?))vqnVQnJtl|pDKZZ5{HQ}U|9 zHfCO}0=GFzJxKu>c9d3Ty`(?o~cQ-F<79vjH zVeuNX^T|*2s6`O}C#T_ikNb$CeG}1UQ~xhb2r69c7MaU3WE>Nl)NBysC@cXq+bn9vvQa0)F#hqd&Ivp_> z*8Vv^v8opm$G+$Ppmgt3<4=!>kt(+gnXsVOUX!W_;_C#3gfY;`9}ytJ#< zy@yf(tP3VAVM7IC)vRW3_4u$5rn9RT;O)kr@a;l#1c3RHJ5ks=eY6y z>VuYIV7MbT9<|tVaza-^YZ{fJ(z9)In;h67Fb(dqg(!@sN|DJ8kzjM=Xqt?p5ewLH zv$87<{5?6pqe=^d z?q=B4kp!L@Y8j=FM36{8YYsOUk3uGJwd|I3*$tN`xLrO_r6GekH42e`0Y%~MP_kNa zrypWI;_cv{AO=Z*Y8p88ka+QoIi41EF4nE`-VGaJmF741ZrkrMc$sxDTC3QErFHDEG(j| zyI4y90Q=rG4fP&NaExfqu|`OFJ)DmBLvRxL+Hj_|)+u{C+YU@SHNYvEdrc0%61VCp3=f6bY>$B~Nh6 zB`u&8{lqHTQ8aznQ%zQ<_%~z7?*f5f+PBycFnBXKB)Fr}i-vObBn>+r&|*bCbD^r^V@)ZTfx73!M3 zmHiNk`^n)t)2gWbIWoB1WswO~)T9(TFC-N98IfEZj4XB8u;89jj^ z?{zw&xB!tq)U_Ku8_gSr}X)jLXO6*z$^UD%CN~sCnYQv9wZzx5gCYJG-uRa zIivPfH-c11g&d-YsU?K~`EC+pRBzUPrmcu|iG4Ha`YarMgowB_hs1N0gQf6&phF03 zT`LH%K0lE+Dp%t_CT!SuYL*zgy#~yi>>p@@jYFv5ajQg5PwRsvTEP^WFIXYWJbf6UlV*WG z%qMNl&@c`BKIjrMf61$YL$cU6DlXmXyK=hx1^6)6?n?z|tsp94>w|Ww7`tCpXLh$Z zFT&uBHTc0)be8>JKTZ(zolH*&M7kc#L4HJ^ZjIuj58f?# zZj$K~%Xkwz9W60>yIDeE9f$P@@$}tF7?b9$_4faUCjT{QNq(n& z4lmiOzWkj9Mlb=qvlJO=)qkr+YgDB>C9LHa5)oqnX$*`x5BKE2ejkZ8Zegp20NHDNU<2>5exI4(r$Ias zjJM$U2#iJz8T}-i%Wrr;!L1p*{KzE_y+(Z=t0^P^Lqm)niT#CRmie9wSKIWUNrOn6 z79_gXpL^1Sdam)z(vurhjSVKeSa{|?3_*vjeeVag08i+TuY9EbG@wqn@r6^(ZY%r4 z*HpwkGZZzHwN@{&`hn2GY_gO$?$ z5%QmGVpIj{(p9L^Y^P)6XIir$7b7~1et;wxCE80HuIl?ovkfoV->aYQp?>Suxjf_W z7q<+AotapM@{_u6XQ>j-w-x75e)L_wmRK4%PbCqa&SO}Q3YY}@v8Hr%9;|)l2UMy0 zeLGX*iJHF&5WfZ0z2Oz_>TH*&r5U>Vh@vv9hbwnK+Mzr>Ey7y z;!vs}yDyts;k@LdE7pC~T(Fs(zEro8X*}f?dF^g&VKWKXd?#|fX89Jeupe#TCS?-X znaXW_pRhui99TUtraXDdTft#gA%tH%p5g(_mXs%TmY)Gn9^aE+hjs0}?aY(`Q=Nlg zC2fuTT=kv@ha3_U9#Ud2;g#nfcGknb2T3Bh%i- zK(ipu&5{kG)#?7H{ajsbjOzTSWkrq&=@xZ&JqxaQdBeRhhKAM}wJ*>G@6PQpQo*lf^J=mn z2r_umLg@3Qw}Pm8;qnd2Ue z*owNHwz(8|n)P|HY7iJ1Hg?Gh4`k}+Vo9oTB{`w{rZ2=&Ulf6?7#Fn{!#HuA>FXoi z*+h|xxvPUm1}nc^&~=7+(&~fBJ{$n4yny@Me<4EuYNHmVe~^H_v7?W?fA7}+xQk0Y zzag?0#AVk1{xd);*}Z&($i~b{nE$?N7WfEQj4!l;a@rC**sOJ8!}?G-$AZvwp9jQo zcR|B-0X%|Pm%!-t=jx1tW9MO@6%%IDk! zU>fB8`zsOLoLJc#X&-5!p)m(&-x44FnyF0&wim}gkxY5n>BnqbSZXduk++j6GxW_v zE$hq_WMD9hhu{Pln!dcgGb(EZd zrVknE-LZQ&Z=RN~WUzWGPK`@{OndigPvve2Pc}#49~D&baH}}rZksV_155`1H*L>F zKt*_wd^IeQ)$Are?fr*cs%bSL@x0?G6C93Sz=4sdrWxdP)AoRe1S=+i*w5*_0K>Me z@Pamet#4i>D64z?`|AK-s0@2w>D`c@%yY3-SCAeSHo5$_KL1Ym_MfTM*v{N$=Hvse zvi#yI6`=79&%P@GU~MLJh6u|BOj^aCEN(0v_WzWtQY*)vcQd7{+3z7&Se{c;%bJG` zxHR03ji;H7zMOgwPykHdU#%Gfb6^@>k2UT2>DmS~WEO*U1ex%oU2;{{J`tvyme9K! zqnPYDn*Mm=P;in$74UOAzPZ{qGRw1!zGi_P%4rtF2b}5h(0CK-gw05`+(2C4-O2XB zEqef>E%6!>q~5A(6p7o|7Z4XKRyeKvCiHgRzistm2-GJ9vbF~V{=ydj8(Zf#MLJu?5LS0=g>z{WUegs&dq+C*C!aci5#Q%!YkwiTh*m?pEx zx32wO09{6O`*LP`&42jn^g2^=B5&MF>EpY z+2IcS`E&jtM6iyKW9sp_zaB<+kDi&gv$^fl=h_fmk^TRJ-wyuQt?N}UL;as_ozri( zZj^Ld@b8Jj6Y}WR8NZxD|NCmihez(z{9vgr5yv!B$_yhjv+Pd}^Y-8(g)GP|Reqdt zHXaa@B}=q{8;Qvhz{<2#~BL$8nw0&khq3##CQ6JL|+P}qYEe8OydGn zi&YugpJ&-YhSEmWgezduDc|q+E!E8le35ono=^P`ZDi)H%*jxg+#uzy=kHfIBOp~! zNcd1#%#v9pjlRoP;dXJ{7E}*UNtgd~a`rJVJWe7Bn|f3t_w2v2ECJCt`EDxDKW-Zc z((7$AUIFQL_1+{dkUIEHOU`j);-nI1|FV_B02i>@v}`Msz4sE?_e&p~pGA90aMqbd zJ(C_(>wyw|DjR-P?TG)Wz41FkpS+6UY>|VaVGAZX(>zI_zf=T;cPfeVPhxR;-Pzy5 zNmcqlN&r8&G!lK>;_E)I(C$7=+-=~fiBZbh@Kz((5;Nsnqn?GAbOYCXT!DHc}d~s4LXR)fGO! z_~#I&wkdSZmR;u48#FbS-V?UpYfT5y`nUjr(LMH;R>obNHWQmiF*1#vY5g{cMoyD zSCC(50pDjXXlOsr_003_I|Cuo&q%`&Edg#wW({P(M<8ZWJ+JMW7fFV~;P&S?EG`{S z(rTwWtaYawqW>sbWB!X@#w1snbAqMw6@u_SFMcgMuT)yzgqB`-U0qX59vW+zw%Dfe z;Z_Sk5Ihzhb{5$GAfXjv4xl@W6N^%N-LJ=G`;BpkM*MdNp>%IlbCPW9K#1QKR{hv^ z?xl+`MX?g9C; zNgt%}Ukk+)8`q`cbXuNk_dEGP2jEIVS1rM&D+jaVo0ea+t4zUWUXo-LRH*Ft8RRm> z{9Gyo`K89wUYVO79y8;r^gu~ToXr=q^k$_k7KDZ0CxAx9crg5@R7`0py8N z>ag;HW)&~~z1Xj1T%G6IF8fdt61TI8F)lS$5L-}b@5tClegnv(3%15B|7pRwpdBIP z>pHKY1(f{-qNC6#dX5&qHMjD2xiOpQ>a+F=A<6gxN#vio{gzREf2Pn1;UqkylB+sn z$&MZw9Y1qJhBV*Na#V4_e^kE%-UmRiOT43y4g%ZMQv4PGCUspB1C@T;8~q z8&PjeTIZcqv~g)BXqK42&v+g1C-VL!;+U|kjgvwg5q%*c%pTQQ{v!}KWr_=daahd& zdW@ULY$&J2GNh19Avy0Tc&*l+rH^Z*1z;V!4VzKNRW?h5_ofk)o87S6o~ie`>b0`` z1EY$KdCmM0yJ%NqTDs|EHPrUt*7hH%U{NmzEC$wJX$;lyXA%rSEs`qMI0;a#tfkmV znyXK{yloh=TxJOB+i*ReoM@CduxMn^v5hw*mxD-WeAzfJvuek;BUx9bW*rd2rkuo- z2jC#Vg22rfzA=MeenPVoOi6gtqnNF|eS~b){6ghQ>t}ks_&+Sbvz~2usvT7ZQHRNQ z3)%ko&r!hjHCzM;dQlJydNZ2?E7wbRX>SO@FQfK3@m?**1#|eBiowyURq{(Ycoyp> znmb`e$FO+#HZB4D#-ot1GF>uNG45@`Z|tSnX0WiPhnrX7}y z!~`vYGZ7$_ru)@rwF0dml%}K*T^zrGA-wl#jYgy2PkLvT_^?b=oang49J_K5tT$} z!i$Mz3xY}Q*7P6pZx608j#|qG?LSA)>ZpKlj3(R!YTz`Gue>a4W3cthe^JW1gt(wUnG|lkd7c6nG4O z+`Z1@oix1nByRjrD~S5X_daW!&5S`@}D*AzX}Clz}q>+{KDW74fF zg!ykw@AKQ=Jp&gE@HiSH8S{h) z(sqUKX_f5a8cbt;FUif5!{`TfdYW6P;cz_+{i1Q8FgCNkyZIyP=)#faY2M>A@xC;j z@aP25SPzToOl|_5n!{v`72cq&SSrCf!o(~F*j*cMXo!sD>~wSuDbbtag0Fog%kRt> zm%;#9_xa`awoxuC$EbpueoNaz+||%CfzSc(l8V`yHkP6bN z8OH@}yJQpfOhh5g2Iqk3qe;}MXi>39)(Pa%yax5~$0p2M$?wy3Gsx<=+82+miWa_h z^(POeTloB^T%5#X3rl?O)%wc2?KGa<$M=A7(!JOp@Qd&?Gl{i-^4?39ic3#qC7bv` z0Ub#{my?&Tk#8{rHNtXp^xl5>zp?PQ(1T5IPi>S%Q;j-v^$yh_X-;D)G^JXPY z&^v+&?gj*WZ-S@8!U{#z9AZB?{T5{+z8iJxIGCy0#gO9{ML*Rl7*aFpKfW7#=mdc} z!916zN3r({SL09Vu&pe#y00?qiw%1vgoj-WF+!`Tp;75ee5HCD%|ok~ zi|Zc5SZmdWrX&r;)jxrPoR>OCIM3^-j_}c2=hOB8W1KfU{Ax5ELnGuesqi}2U2n2m zlJms8ajsBOR>^LQsK>}S)((HW@|jXl{jigxvG%=F7Ha*z3c{j!KoISlPtUGyWU|~> z1>-&+UM`G1eDF&4>DO8t_HE}Fs=m#ldif@frjcczSNyWXgrb^9ZO_em0(gB^J78<- z66M_{P<3(lwCl{_VFRuho%iAy6JY9r2)T4i>*S(D?E;VT$YA=NRex1Sn|IK)SE<0B zdBL| zbIYGZp0<`1*_)X5?dy?-$QV6xwH?hmUVIp_v-WHzH1&RbrXTC1!mHZ;Y$r1Gr`vj!sN!$VGzLv=MEC_ecX(^7b;Kr0KQ zp5W;D8#VwnDBbm946Sx}I8eO%Q=pMRu9#(G6^R#f6io4NV)xkQ?EO73=6yC_$CMP2 zH450DG`W^re#LdJs1#<{9B)QY-A^dmebF{v#WEXNXNfjuxqoj%=+*t?GzA~Fxk+FN zZv{zBK@I3oP~8od_grhEQ#n>G@r{~{LSo@pdqF7z0?R8K8S4NsA1degEe6shBmgKz z62md=fl@TbiOtSK4+O)p1F7e8n_HGYqs}_j49aoJk`R&%(gl9!s&_{I*vw~7R{>U7n|)wDLfwA%UjYK8#* z^pF0q-(!|xmD0%JV^V$=J#?>61(>UBZe&ws5y8mZi!lHx2U421hP-m5otrf7&269v z^n?SrZ#n4tNEKj!UXV>DwVz3xsS8=Ajzz>ZOQt`}DLT$aFSuMd|7f!SRVP_PN*>Iw zv|Ua>oy<2Y*%YmR$faXm{(YlUj z&YgoECQ!Ka=R20gy#lX38uR!{Ubf55RbRQc{F;|Qp4KM+kw!AEZkL>&fklk}k^vGh zih%*(prdyBnmetNoz52aw_sqYW$(UUaalsbkIi(~iu5o2eDgCX1xb5#WB?$n?>RBJg$S zUhEq0A@b1}gAG)h_k2<#>3;32@()D(W==PjxrX_75ydt^_36U0TC?NM`tXo=64<8y zd9(?gKJ7mfs!zUs(Bkhc=^tSt`~!&AUEb@2bol+<5^D*5oKWI^ojLzCp<;foR+N6w z-#!OIj6verviNDL5nqGh;99a7IJ!Ml@^^`PT^~Vg7MSO0FN>7i`#am=Tu8L^*$zb= z7sFA`)48g3-Sb@DVQ$=+<{wvOr*l~IuTkS0E{bjU-8%}#19$Ujdnrd`F|pDi&~2;` zUG!3~B*!ydUwZB6V;%qSCUW(l&qv3Qok-g>-TW$E=GL{`yZeKyFNM`mx zT4dXvmxJa{@QF~iMW*&l(v#b*`nb%-PDko=aEz_`X>)H&_8=sy3NS3BVV>7f;#i|S zcukUV;P#4m12!v%U&R2NG9D>?JJrbT zoMkDsa<~RTOdk!O;CnsK#BDCwKt^wLlDXpFZ$v^&U7Xbi{V~Ij-#B(H@o8;DAa-bQ z8&zY&Pk8IH4!C=N?alw)EqH%cXU$L}?=p`mlF11nD&1^qAA1Eb_8qsw6=GW)Vr5h| zdx6{DA#LZg7n!I24PXUtBPM`$ug&!260R3qVy&-$BdlwnPh=u`AqqgM z+pCbh+UI=r1~**}MUb1M%G6wn3C*$Kjoz1{{&ju&((oEv3K~IE9`(appgD9~#)qiN zT?1~)B7>UdKdqo?=D}{?C;C{?>!C_6DiT6sHJh?jSN>4%Um=uQY4L^$G{OAiRGi4c z1^+E;V!i4HEy0UrpG+A%l;)HGpc0oEShcC{^y?FLayeIx4Nxx6ih^XBj@dJpDj#8` zmmiVKEBP{5ld_B5?0Kxw9b<=NS2u_XlsMd2ee-#5XcMYGga4i6)R?Yj2pB}bW<3C{ zd{v*$@Wao)`~EeMQes#Vr~!p?;>`mw&vcRy{=3Roh-~Tya$HEVzsujEh0KBj*{ae9_oSY7SEzLpS^d}m+!ki-+j&%BAq5PT&4NoxcL6jDuvR}r<^gkBPAhP6bb55LYuD^g!q>I zFaJaezb>Ty*xAb-Lsi$DLd9=4`(~b3k<6?K{{LOOBz;u_<|@V~-lV3_{HL(fJ6+;t zPnFLKd21Z7fEPi}8u3a~m;LZ9Zo*yh+b!;X*AdNl`KX0BDJr)8;ANS+$pG~{2BK0H z77?T*HoVU-(Z^=SLaeKE(r&{@^l|x0X*ay{NZ~6EMl*Y6Uj+Wx3Q*q`HH*bN0GxvI zi3-47v7|YGU7Hi$x^`+aFC?K_-2US~tEnXNee9!eTfz2LL+lR^svHQ)d00msy1gi? zXhy87<+W$go=3~td~#`E{Fw#^9+MFs*y$EmG1Aj-;C$-XJswkqr^*! zG^BNeo`XG<-aA!@=Ii+{PG}d2od36lg2-+?*h2+ z-Bxix5cgi!@YT6M7W&J?>pnBoTF=j;7LQT=$=5rXsZ1b${!g&%|K4A;XoizG#V2Kw zOOD>w9H5;_mR5ipkqAfsutrLcKfI9DA?5-w9Y>Hq@tf0X?yQB*Yz0!W-P50O>XnZH z2a;K-mtcfj&}V(2CMEjJh|FvKB@0-kn3amn`CN!*MnHS_H~Vq(t#9fNX3f*FrB3!c zsZ$&F{15MfR%)Va2~JG^=5BaTu!quw+YLz)qvCMt>9flcOr?L0_B-InAQgqo(Y5Vk z$FMDFJR}7HxIr>tmG zkq$92qskO!>gNqjx1z|0i4mzy+(Z(@|pNaz(^W!ZUfKxC!_yMUIgmTt-zJ4^a!HCmGXlUc`?{#QC}_wg~a zKHe(%uOz!f^f7?i4g#!*mu7?h$!6~>WnMf#Q-9ed$TzT-yYIQg2B!WYV=Vd;&hXy* z=X2&_Vr^RAr43I(G!}4xUov*8bo;Ml2^r5iA0A+61c!W0l~IE&({9u*G4x0p1*)Q? za8nO!uhuWW>5&8*xS);gEdEX|LK(*_sZPz-<=cHQ;Sgj?Hch1}&N=b5O~cI}od!2c zALZhLYQ|XGh+ilkBcxFP*LO&~hUP-6LM@nU<)�E{p=BSHjr&*WH&nIaj8BUL3?}Zb zDV-8pbpXFs@jLfhXhdirij91nHHUKNAG0Mc6uNrB(8}|eF4+w_WmeKHCS`}df^b^2JDgej$Cd!bi4bAkPnMfqFvVBOL zZF*EFwF{^t^r+36u++%27xvbt5)kz%D`6%eV#kPXHO!xO0cHe(qC=sQyUy;19}tQ= z?}?q(Ag@VRy6~b+dEhAxH9e46J!2z&w4bYZhxBJVUIAK3slQdxP6v>HRyS|+v2D12 zr)da#XVTS;RBv*dN?P@Ma(UMaUr_jPW=#}$k0;Il~*pqFUurd zyJSQs?cWl!WGZUw3DYfK7sbh+eUl*OVg^V1CqM0fPKBsKFYdjQ_jG~*4wzD#44PHi zBx=OhBGxt?F5Sw%dZ}-P2L7g~&TO@g0 zAN_G%vQUx!)Ap2M?{ANdllS{Y5-)(K#q`O77)g7A8}p3o<@fOrh27cJLHA$UMLwbR zjGw~%-%RQjb#{GuD^pXp(b)PM8xl=ha5W2{umpFuzV}kEpqX5{1bRCMMi&6GSMxJK zA2^rjtSfnhjhiX9#W|;=Ly!Zoex^v=(1iWeJ z@A*PvG~tI84NB(Ptrmog7+30Q6j4X<9-??5O1v~~~AOSbp^BEx|4fp9 zwwvEJs}yjUB5+jVeDr@GikSImyS|t7{jUQQh53IMog)afX#%miqH{hGp0yQ7;o>y;%nz!@J| zq!cFBLEm!=naY9xjZ#JhRvcg~sLqS*5lQk$6P(;E1<@P72Iu6Po!wfgD2lj~*v zEWPgVZ}KTwd4?BYIo^4K3RN-X_Q9eg?q^xp5x-QYfOVEL2iU5o$_$%vZ>hPkK6BoE ze}za^Oo~Va%MadV>4;Zgm4T7Vft|JzsN@t=6DP&uzUYi0=x!+r^Nr_MCBD zTzzo&g4XN{ifT%MXy1W+8dJGUe-@BoOb$?Lb!#~`k3S4{l{WXZKDSPMEN}0{e<4d3 zI7O%2Sl#Fh&h0INxU(9n=)HS5;mMRMJ5S;!(56Mt;#_!gJ-GcPPDrYiedL3ApxMEZ z3vig15lC@4&DbFBXv4LrO7)}4a^QFRKFdsUvalls3xw3~DTU%I-^^urG-uuFKl(Y- zMRKOABp6s{G_B7XEpv|yr>*`cPpV0ovQbDa21RH(YHMvq*gQ!q2m}tq8p(a)dUh(_ zd1bM-PcOXwMH6W0e@?iCrJ@R63vDgo1;)NpJNeB3V%shTZTsK{(kXSlxzBgaqk0!;a1ir= z=fPEy56(Q2^8_&3!_|1p{6B?igMd>4CN#Zgfe}R=yfFsIY@nPZx zEPOWrS6eok7c9;=jxHFD;+?!bZPaN6L5_eTW@oyZeBNddBiqsRG7tp>ouj5sHu27a z4IajyYZe1!`2vpL5@eA;Ma@FdH47Jx-Wccop%zW&CgwIyTQakhBgk5)9Ph84hd|!3^l6NE;h18 zbS)g|h}l0?)oX0GNd?0;JHK(o?1VB=4y`P*s5P@cO?X-0m{*I2kiuu~!UDq6R`Z_x z%qd&lzwB{LC@HDmi%`CP^3^bOM@dZP?jD4zP3r}TxD&yb^!Cn`lP*Rin!Eqzm)i%u zW#+s0NhbtdU}gu>Rzf%r>x^g}QxiW=6kwC=J6^O0THjmKA%FQ9uv`an#3HmJ$DSJv zQrav711sZQ59M;)#jdznpyu6%1wurV6H(y3Dn&8r(LoP2`GA9a;VG^L-w?qkYPeIG zZkvy68-hYuemPrfS9p|_HxHj+CCHub>+9;Dw5ObBXOj6r-5GnX|M%qFN4)IoZ@a&L z7sK!Pf3%Zl;XbYF##Hl{dH?+_4j+%ccI$svLjL#Ft?bXufF3Jq1#MQV81~QKSevME z%Y2FR?0`umS=>s$m(uQWJo&`&>DOop*S!DbxGTg5n&;ZP5avQLKOFu z7CLIzMd$gWjE5|nm|@*v$QSzN6<#=AgA00XBndRBT$sYk5SJ=YTsRv|WIi5#OMxS; zw1WNRyGvGgPf6BD!`U4wRP()j9fzQlOI19au&L7bLDFba)&_nY)l{f#_VTC+1%o5x z<nUXKYJ4tq3uTRdWe zPZi6&w<8jFvMc^mj@%>fiQ8~e)s@!~@i->;+s%rIpWO}oK<5Cv`8wUYCIaz3=y|4u zvg$L`b-A%R&RFjLJ8Thp*~Qf0sN5mD`UqACcq(G%cId8 zMTs0ue~mPmfs1k8RVyrrB=9nJ+{fO`Wz?%elil01H`LM7=I5G=eE}EjY~`~f+z~M* z1Ig$@evyw3N#FKGTBc7AA|?-Csf^X9F>M94f#&m*%f8bU$fHZ_Zb_SsbDDuUHHO*) zcVI8pO#Wd3tVI_$nqNPETfSlyun9b^b1M#dS9`o0*|im(wV^k$VC75WS)dRpHZ*A? z+sJ7U29C)kQ>sSzLQ$zD3w7%TH?%WIvC-%4nBSq9Y(+w3t>L~PP z#}+^XJ_{_@mICy^Q7TM*Rk|(b2q$ZnwU<`cIGNFv3@Y)p&+Jydi;`f9q{XJ9pmQG) zJC8Dcu;1}>Jhp|ATDF#XI6rjK30?XH;@&UgJ*O(?40@g};hI4dP$oH%WKmMv6l^(- zHcLS9l4@#sO13$_WAb47KGCqxR+8d|__=&zQ-dW&U$s_*<@P56(y;G|;1VSNea%|S zptRg?o<8o+SG0?1g;@JexNA1L{DL#jZDD39F z`g;>>pE2WER+-I_!x*-Xut`x;f`Ei?pj1WDs3#o}rP}q0 zXEZ=`Y>6Y!)Tevp{VkeJpb7(*^p^i{jMIK3%ZwwITf}?d_#iAo?zT$vc1Ag{+2H#Y zg&#CV@gwoyBkKP<=?nbq)4H*Nw>M4SuQ$gY|8o~bfo*bN?IU2Cmiqh4u6_Uv*$!NZPHqZEa5KI8w6` z^X5b5N4BKXRg0L9Br8QKhSCYGS<=UyPZ4exPqu>Is&yDnrgpFP^Iv3Ko0-}vK;(n< zzqk#{`P(>U>3Gi$Si9O@)9{)Z^u2fyeRt+mt!mm@zge;wyvhYb8o>~9H|%E7&^}TZ zalFo}GIie~k~oqHww7~cBMvTKJ-o`-IacfE9`d1)SS@MZPjFUdnO6#KR3MQsGB>S> zWk;oOi}LiqGN(u4bQ2tV3QLXvo^>?Pf`9 zpLM-UJgRztAYVf~}hO5We5PE>fdlTCjhRZ&V3uZ02YAj_0Gnz0M*k ztZ2#>PJ06i{-xvNyfiUuYQNHKx^AZcU74XJ#1U zM0pUv%T8ojN<-{{&7!EsBi`gMG|GRq+%kSe_or4_;mBN`gb2oI=ojyIkfC zB7>)y+-vZD=UcM?yoPV{6cRW%V~bNw$AuJz2mlz(oTcz-c_Fb@lN$@i+huUhMA3mn zbM?IU2#tP8W(F5K2?U(Xcvnf=oiXM(N)GMib5%;ji?9?bcXhI|X5Mr4zLu=u(i~gK z5#+)aYu>o5PIY2#c1gv3LSGeEidAzxzhBI5BbT9)e!|bX(j%m>y0V~IpHJmvKa-i6 zz0^J@6`8iA({E4j6{vG^&s2XbbAOH*?okJZ%5zH_)PKL(?H;QvUzy{$I~tWv;qIZ= z(2^xqWt|S_!j`owp==thT zsnw8Xg|0wHuFRro>=n+3^s|2mz%O75YXIHbNTy+?d zZx5c6+{y~h6vAeaRuZ$zhw=htpI!G2Gjde$2Sdqe`2U4?r+sFG(R0(70v_}ZoRPOF z{|m^x^!;2s7kUgQdmjDwmlr62dYNq;+_}%+SCJ7ffg)`q8kjwaU4OOuqD_4??A79M zM;!S_7k);nTm8-904?O63C`kx%L9g*@fAQSOzhc?=l~Fo@&4Y#gJgi_b1;#qZ zb4kO<{6$2Ac2FpSg`&sIlL`%3xEvu~c)#Lue_Ie5IPsyF9_T2wr8g&cO@r3CT3x6x zDQ-46K6(qF8I(pmjT28)>RD(W7EUG%v0O-5R&^CYP}VVciY!Pcvi#GSO^0LlGPop~ zk~_z+r!U6lDHk6Drz&CTLnN(YQ#sKFpDdyOVMr==c!fl8Pn{s#p7q|;;UJ0fUa{Eq z*t3CqsK3qT0OG3WPY9l?G{Wm9MlGdR_vq|pN39Zej z2j^D_jQl!c8Gg}j)~~znTkNujm2_@akt9BfHBdNuCcSG_;N6$^UxMm@>H66$jh0Gx0%;hA4GxQ@CL8$ z{W(miA#IUd5znzGOo-}_R&^UB0^Dw?-5TkaLt&jg^#Ri8ZVH>LQ;ZTp0~1U6)j6{A zlZib0kj2>04GZ?JPpmjb`+N5_7fxtrCI*CzVN<8cjY`6cOL)O?SAj>)2I@MqLRZb~ zJeSIXzAt>)9>~AdqXq5eGKTR*Too)PE!@3YM7O$@XJOeL6Z4;B`UE0^g{^<-qydug zSH$;H^j%?P*cD|)7!2wfQQ4NRr@``R9h!~Wn5Eme;TSr|7ai<{rS@&N%H3M^uS0sGkNFXgj=SXJ#!dz(wQ^sA`2rL>}Y7W-v1$4K2lvTb+HBq)OKGd zK5%>D`qNkuD;Fkx6MQm%ZnttWjgi^lp z5yFk-qS|1|cLbRfcZL0_@NMa&RCJ4Q8EDS&xOtK39amr7M!f6iJS47H^sIr=;HELU zUX5s%kuqZiT?M@fcWDR^5OffC;AtTz;vCfGUXS15sW}Z12gI17ZV7cyai(8am z@zMZk2rLwtF9vcTEJFO%u+gXy0t1qdgSMG)FA)H>BpU9aBJ&FdpY$!m~A zx_KwA*{K=oFrLk}mqoqNf*8&R+nL%kK>&?=MM^7Lv(hDH(38)R#X{oW5+(dYn{;`I zIY9N@{W{_gm~q30dau~P@>CTH3)g4(_Z}g$FcxEco+nH!WQEZ;%n^$n+ogn_3b9U2 z-$Z2==_J=M(PA68$IU5ByIaHw_oPmmzebMcMMiXtXw9MYItQ;x`YhZ&uKe69{2C+V zMeXSX^2@iA42fyYxdue2&CE~z)Uu?T-`=?6Kpyrm$fA6Ib-rP~zEJiT&#Rj+LOh*w zIPeNOG>jQ!*JZ>?kg?>abhX%@Ax5PS z>OrF?^t#a(&!We1-?2!e!abWR_(C_WZB9VL+V;9!HAlKT6{KETz~yl)0Id2MU3~vr z?xrCBv+Dmm={x>kf2W1`_o~l5Q>yUymk%W$SN+w(lK;B8<@31ePtPv#iLmHi+M2V~ zf9h>Eau<*Lia3IZjB;$&l~9l{Ix~k1%9tslAa@i)d3SA+*8s}>lDSkD5fOAqW>kxn zbFJ!6>rcf&Ghw`?BBk>o9EmcT(&lV%xn}fo7 zU_K>KTs_i>Y=2XZ#Djcjn(AUDgn;&in{JX;JvE5zWFD!19V54qDie(8%FJV1m7Mdy?h&W`U_YDu@tc8WxhcEB>7JNC+H+>gKLS=>| zq#jti-5pGeJot)Nt`D|LGyfl5UmX@z`}{440@4W5sg$Hjx1@qJ(kV!HcS=Z#q|zV~ zBHi7Hba#UYONTVP_af_~zwh<_XFP z{)Ws-6%C}LpLl;sgIW`hXg$Aq!4^wxoWX-*%?FGB*~U&iTa+5j!pBz(mLh|q#U)A^ zo?xQiX7-Q=&xEd3;y{{N_#d~W;$9!*AS*8~1|?_M1V1$K66@xU%yCwbVyxXXyATe-Rz@7XgNcW0`9z@ z+s$K-DW!X0E`+9?e9s@pPtEX&JCzQ5+)l^BR~FD@q50zIIlGt#$CrGEOsDER9|+DY z1<|J)H*Sww6Z|QTcz4qD9Z=~y9unWZ>swI3!qwF??ZWWitbv;64a!>geu3e!HOAcq z%&?>HOM4xrxvaELz%Cq>U3rS;uYdjHNXE*5SuU}?A6@_610|Sz2kI%J<^{K&c}lGg zvbD8c0cIPj5hm0o3Xa1xQb@jOMELAyJV$zq_UR`f9|9bv%j?&0pSljidZrxfWEtqhd5BAFF( z2Bx8{E;sWA8ZG)JZ-F0@)97ze+k!&(Fw@X>KInoHkl|+&LHnpi`fHmx>8^C1yFwin0^i|Cidq(NWJiRRp3t9GO8fc~mD z`8zvN2JFlhiIu|bBUx50BQf)*eA0EQsKqnbb#!IM^+bLY92p0$m*d`>x74J}Rf_G1 z2qhV9dDoI&gw%V+$rL`S=*j$S+F%F9{ogcr$b|{}#x=5n9kFk!(Zk^!v^eM2v0>rH zG|blE#6E&utD|plm8;`%T<3ya`Hph*y_R-ayyxEEuxS<+uuzGEWhFZOFV@)>hVul? z>14hTkW%yg?p``zB2)GF-kx^cLI8cTFmzkl+$?-G8JADfp~SQp5)yL5r(}%w0`(_T zdCfjo1d&hqxhTJW(JjZNF_`H7nn9+eOCUs8P{)g>RrNF3tsnvB_AtcVPoxO`w{=?E z=rQl%O@#C9x{U(2+R1T2ta70xz+bl|@k0_v3n9+7AYgA&okCjJcfqkzNMY8-F5C1$ z%D)>gooQQa$nf9FrV|;MFr8TXS@ptXXI~L2Ob^>#U>8vJ;j}C9*xs#p>HRan=soCh zQ;?4||9j|B3fZl*a|$U>)I6S({6Wrr4eydQYW}EDEJuTb#XC!RS2RtjNBC}=WA$TD z9>-J8d!&s$bNZPoPWW>SG+_}J5l{Q*Q)s`*oNP*63Y=eZRO$!_r1(+(lkyU+L@65N^{nJX>^we3R21rOql4+gyptghr?{-)h4A$KT z5#sCz`d?8nRXdAGOHc3HZ&Z_;hzsX{nqQr}H1%f<6d&fb7-f;ZVEh78PJQ9+A$%*y%gi$2wb42w0Z&&q4 z@N=T97v)2bIBF1b4r}abP`|bB!k6>q%W0`AY5_#qWAo282R!(?-J*hefxE4Ku+@=X zmPp%LQI=hIU17RH@Ddq_P1eO-FdFwStum($cx3PE@hi)Jt|~Unk`3&)&vBEY!-@M7s$3!=I^ndN4v1$!|cbOd0(E4cSZ=l$7tSfdVDxW?6E zjOUL|5N}Z46m<^Acl~F>*cNo(o?|bD>whK&+_(IShi{Ko)+(yJgK-S(PT=><(7(cy zL9d3%l9w`y)1qY42mqloF)*N-lumph8UHi<;tV|dx6wK?6t($u{f%d_=W1zZKQjM< z^`3fP0PXE6ch21U&&I0;4k+H4Xs<=>9Ep-Ze+?mufvEwQ%2mJI@p6-N4q^Z%SJ*v(~AH~>RK zLP;U8modi-?|%N?Dj;1VL#TvF$$%~X1aGY&4?8X{jl>!btgZ`6a|c=cm9ynN1^94Od|j@c$mif_v*xx>m8bxVI42kudj6u;xMT zD1_od@s&chVxLh-ALL7wd0x6kpv1CGIckCJ^Oiqi;*{!@U&FAz)hpsWKcE|XecqdD z;JCN<_ie0T&)HAE5;1Yg&5wWn7Q8@yDoj~rOQXYV(&A#+N3Y(i*OeavI>LBaU^MuP z^!P~NWe_11e|rRDf|MvhRn-p*-u5I`%(u6+kYA}W zwTNG1NPnpC^WhvlGs-CdG-*`Ap0B|V;*Evctj_X@3Yy<+;dNySXfNXl!s7luJ|9@$ zpxHa6@}Ij3&Z9*G4LHCsUr5Y@f0o!@Gl(DtbR*eKRwWp7>og$$JaAD|R;FiXl6rHG zQ0k4QE8EG#xEIu`dr7xP?9GQ%$+ct<@58U#acjzaDJK1Me5?PC-vm4Uel1WI_Jn&{ zinI9~o7ZY+F8`{)ro9rd`1itDuS`J4J;jh^7=uD-JeP6pAlKOG7OBH-3nMfzW=;=) z>k(d|0waYt95qbEJuKux$%PnAnmumR$qEol7Y&riXkl7r$JfcEr6Gd3S}7Q?ieL`L z=OihZ-m!WPxF&)5*6pz!78q>=jiHWO#(u^4f8QD$@^%iW4BlSrveEeKd>$~uZ^iKb zqiB8;9{(MbY2FQfe+ttHb3%fvv2R{Je3|^F|3IHI8nr;-%P{68h(Y*P@BGm(f^bAI zGqO+wb1np(0h8GDM*XWirtU(`-DaqN#=lGp0z$OE2q>%Lb(P5n$00}g(EJx;U;lVi z3BKN$8=TeA_16=?`5i?o=`YRTs2K8*V`&+(vo-5KrhD8I7l-dZN=MltcKyr?;KKdp z>5EzkE|+T#-UXiCawXlCsIx^IA&h8aSAjtf$sdNgdjCn_;s2;a=sT~4W}$#_&eu*` zC;#X3SH95`>QqM<769G?3id;La1Ztpbp(;{L&XB|{92PG%swJ9vVKIO`nXoi4lFhh z&ca{E0|l?5%mRN))?6%1Q7^{^NBUl~>u;Mv8V%fd%WwB!-;@FBte!cCaXS1_-_WyC z0{)aK`F8?_7Q?kv2IJBEadNIr3RGWuO#<$)jSsp76NPO#xD0JqtaL5YX-l(KF#9y(xsn&QfGFRY0*@6kN>2KWu9to8r zCWOC_j*1Blzku4isZU}1&nmp%oFRY*+_Yro8|cZuZ^hDZ?c?GSWH19&K~nLa84c(< z!OTIrSDi49z}d!taqw>V@He?@fjbcc@@A&#%$#F6LZA-g>;^ul#4XPlsRaFVTpcTt z(ZA>gWH9hIOH{!Xz2o|4h1?aZdnH4+WB20S2)Le+gr5TScwfJM9TX~kH`Pzk(xa{l<)GZcWXJuBY84b}@Sf)UsAinbS=9K=ul z=1Ld9164^`h3J1@tdad~3KQ{|BplxU^X-0QWOc3;et}B2RtsY%6FXia z!{@g`6S37AzO7C8D`!>5@R}1nC}1+@QHam=>{{l8pfbn*U`w>pvh_WT8EEfAnKp`m zQ5_~8Q1)wR0B?4>Az3f%FYmlT<|@DfPDF>$3JZ)euXO}C<4p|^9N%>F;o`l1AQ^I0 zbo8TwJjA`POOnlx9z8-rLGe}ly7^Q_1vb6X+nWh?)SK=kHg4C)%0O^p&M|xsqQNH| zBd~lxgY6Y79Dh^!XFvS~9pKx`1jn$yOu5dDYqyxlEBK=@><0fiB1frEjb=5#rT_b= z4L9yyYcw;(-x{HHV$aXN1*O?Q;mHf?NXlst!*VA|N0j|%t$`C8(gh}H{vyI-@MTT9u`nVv_Okt4!js+#62$U%lxhwK`Gw-Z`m{M5v zK5B-PQBB{Q?WekZpWaYVauEZN$bD$VsBcrSe#TJzoHRw zol=r{Sn^>~c3+Mzh$H&GOV&MTS&H2LUAxpU9)WDhXB<$08j4j55u)_LipUWYk>GsQ zE=r-N`WW8#=9ESC*9?-^>JP0g7M+KZ*q{BNm~WJ&@uxHv%N^1ZQLC8TsC=kWR0mHp z!|Qug*pGj@XoldAP?baJIXf`s6C7Y77o90?o(k8f`}A2HVQ`3PvL^7P)V(lVtwdo>@5Xe8Qi6GW7hA%ng=USBC!_Il+givu zVW8GmfhFZ~H?4>@kO1p#mabZhOpp(Nz7!>1(546|1>9#&@_+akL2rvBXj^1*QP{Ht z9b`kA6c>+C;y2&~&k#ubr=o%ybU>59N=1(Q(&C=}f%=e)7#$=bEJC#2mS%{fbaF>0JrO0wv| zi-Wa#ao}U6U0L)yH35~QzC^&575vw%gtPq;F1;UVC#~Q};cYkBO-NPM+gN`zv;zq% z3G;s8P@}AW5+3gm z5^-9sm&G?u&cO!BwnlFrN!aML>hWr3#+mE-Xj4*N;y9TRh|1PBmFU+6QGmlcmMW!z z6hP+h_mSCO?7q}_c0&xT-ALaeSgN3Zv8 zyH1{QAsrb2ClcA-qonP^MxYhCvzH{`=W{5r@nfp$l_0p&RFe0jSu!6TDXVh#pY)!E z3Xbi=rM?omUpo6gt4Er?e1=f(&T=YQ5?`&oGF?jl!(lj#9xDy4kS^wM|2eViaY&}- z`|lX_d?b+`Tm#0MSa}X-%RlZ_CfO$Jr$bLRbwW-o?)fxVYdi9-88JUJKkxU5 zvdE26!?#zaZWG|_`dk`X{v*Yv9%5_fs2O*;tN)<;t?ifC(AS}~Cnc!2$YP%BCT^Mm zwBt9m2%oNKItxULO^+j%I|2-mAIW}o+r7Am-g9=y#E^*YI9{f}ad*=)vG~cD9e486 zDC4664@{o}6(S8B`t}T10O*yEOnd&m0A?x{uw5hZSm9BkD@IQ7~7!0ybuwtQQ zF7>bXzipD$F;p9GeFc_zE41<&{N^Qa#YdhAL}4HPHeGyJAO?{cQu$|1ycX?s(St?^ z!aiF$s!JY^lwyOUgNsS*bt_+bmAyt9EI+H!<6zn>#ZVjg8do^BgxsH|Yv`|I6tn!8F^fgLhH|cd&$esC zchP$Y-WKtzI+=@1qyTLO5lQzio$Ne!K56nH*(N3aEOFC54koF3l9xxKV4|s7K8a^u z#RsQ(r>wL@_u##`5rgrX@m(Z$NQtc6&9uX6W_n*?tPm9`xI1z&K*FbMFUG;21XG(K@+GfBwPSwuS2v z{?5jW7SvHt*2ekT{ndzf_RYcp7`<3p42p9MdMF5aM=SaddV`CJz91o?(q2SJQWg zQ*`(}_F?YVpwVjUgXsFPi0Z|n%_wlJyNnJ?FKg!(gIbC##Vn|E&v z@V{Sa*KLc``(&F@+^v3dp{7*ZLaHtt7klMICV%|lEdzfMM7`zD^q9n?>w4+iGn+ro z)-Z$kxtZ;)uCej8iLZOF*r#C&>T4fLdfm9@v1CjZ!ca`+JHZ0cW51JQ60B@!mZPfb+ z7WP8}))Z!F5(Y2FEb?z%dJcmYZ;nac`sVthgx5CDr$30F;b~8^`10-|8GewQBSvAo zGnU&ye_Fmyl@W4_q$Y8ArDwdIs#2h)7ok_yJQmajZ_R=kv)6cQ4Q7bH{tM3m=P@Oq zD&0IJ(bb3;y|pQqHowPaPJ~wLyWc9Cc9gwvTMsW{`GGj@uuRw)3gB=WbY0?RuZSfD zKB95i2z_VMgdPSmv_kB&zKAlBny0Y8v0@zY))%BbO`Rbu8T=h>kG=We)Agp43VtWC9A?y;9K4`ybDUB^{7#r{MWT|SF~*E)_5bFMavH03}JcP4o4 zz6$$wyY=?{tH?-Pp(z!Xy}IHmWuPG;xMcLOTq^WpgDW(O>z;uQF0d4k7*QAMc-0O? z>KAKBZ=R?-q&>{ndKl~SlJ^I{A=xt;_$hw%It2^JcTbt8peh(^PA}KM{qDsZqtJRs z+9Hc*ji*oQqT(GnDyS|GipLI@kR@vcufW9p{&thyHJN+X>&ukcFP_=4C~c^Cc?nK_ zs+4m4vCza+tJtPm0hWGN`IkGJ80S3F-8kUUWhj3mr)s&0FzU|YdiTX}Ohf$U_t9jw zxu5lS-aYoj9LSTly8K@(o19C8cWh`|em8hSLVJPULwWrnl4l?a4~0ec1K@`b(h{8Myx@<(oLvHq~5I zV80^g(ptu3pGm#F?`XBZ5#Xxo!=5@U-b#TcQQ-jd)bnrnqJ4jNXt?rU>R|WzGM&RvpRl&AaM; z{S*AV9^6y(C#}-g!96jk7luK6VB&9ydmWE{az)Kmcq3;b(h=*g_v%&3;A#|vSREG8 zHhh6qXuf~J!{WKFvHcVVj{lnQloo3@h(#OpUjEieAO!+-{RNV#Vfh*;KX}1gKrE91j- zz%ov5ZlD&c{f2}yO)8}c9)|^w9c=5igoQRmX@>|pNpN=Eeln9>q-rq(w9yrads;p_ z$>AAip5~L$*Lb~oeBp@#Tn}Q^>#WfMrsH@E8WA`wGaYXYCgX?ZzRd2KG)LrDJ;NoG zjQ{kwrwKlhtzfay7xYq4xF;6Tf@Utpr+%+&!Fc#QwsC}uZWj~c$9YmV#&go%X)+QK zd%^c@`l-meMfL-q#pk%sGduJ}TGLhLao-*XPMlu8A_0~Ib<>E+9-4e4a0r0bA@yNv zM0ZTJv(g;(>dGa0|LDA|ZBuYFw&OvK!rIFu$r64_F~kM~Aoz$Ex*-7^U`$(2kH2$peSk>2X8Ym+PF^92qSBTPFJw zk$(Lm?e2gQ@?rjMs%D52^Y_!0c)sgj&{AFHd?le4>)aq#}iqqYd?EG<5bxKHcWi~Zvsk5=%PnIx)FEI8|p9}YM*%09j_$?pZU z>pai_@_AtP=1XrRbVp({syfRj<*5(z@1bRcvJ8K~;!^R=T1R?AlcV`dim4AhzAq!` z_UJNSVmJUpKJOOO&$6Cg`95MqOVLUo~u$) zAW|bzm$l7-i?^7)AB)$h@Z9zl^TGWaInO#1e(Cf4l84((;$l?REVRzUd2Cb*!VZWv zT}hr9lv&`7jLn`ltKKKl)rqVy?rL6@Yji^ktJ3z%Cl+%On@fuH`dPR zD~NZ5Gxy@=QskD&N_&ak$)U`Vej>sb@>(jeYk=H9gB9MF=kBJ6il(6K%53~W_tDvB zVmhZMCULhV1(Nje0#}R$H4Y-U->mtV!9Nu>6n*!qHOb_S$;&_jJtCh~BNi#Vcsb{k zd&q@re4a=CGyK=s4f!~nC1yfE}{rD;!91|j2Kc4JPy1Kf3T@6hy%|7auvn?Vm z%_PDkCNwJiHbBl=c4}H;4~9934L7Rce-AM-w-6pnVR`T(tjt)LGj`=CmcXO$%Lm#e z(<&o@{sYw6QVL%Q=AX|8zQFKxC}>-?gtKM{IuG1f^wUl)EtEQ`515YeFFZt#u4eFv zS0yXf#Iu(9Q3{e|xRoyhUnmGiju1>i)^8YFnzsAZx?~MKWnXF8M5o1qH)AiM1WOBz zzkTMshiXWqOItqn)Cr^KLaZA&= zN*;Pp1C1aMZ-st6dG`OLfQ3q=k6mLW_RUjD8e{ztzrU~{{_VedcY?g`@3Kp*A)D1T zjt>AJfd6ojd{f31WGRz^3a>YJHq>7sfIWM$#sAqLa0qpZ>u@Fib}E3$xz-5FSAD7~ zLO<=&ODley_h51x-n~2yx zLGsCBqWl}R+jFxw`^tcf!DM%;y?cf)aF4CXBsesq98#a7HQQ@-_4tvx1 zkcD4nBC)j-tq0vU^<`PcyZ_EvIOmIjY~3Oy`uRCd4*JM=bSNRIH3%9#R3|^7ENFEj#^W(cgesQwsj)jr+~pcbDTNf%o9402f0Ok4=9!Lf-W?;zTZkMG zLiIN8tTTeMybfUHc!C-`u^*l96xtBzI&I4w56t4#^Me)^^WJ%ApYlN>y^jJ&IOM8;C*`PpUwJ=;f;9+q7n)q=H6&Fb{es6%X2UX(Ar@j3NXNy~FZ~JNz>%R$u z#ERzR&R`nLg?KZTKAfp^Y^FEHTG*KOPV`^6>zCMtoq&LRpw6f1X5ntEUK|C9aWKms)wIzpAqej}_jn=`VYZT}tg5`Nm_0jn1;P@9^X zQk3ZT$b1QmMu;(fdmRn2e|*Z=QT)?u@Q#%-NX<+|@AlY$B2waBlh$?kS|fD@`-&$z z{bx|FB`&B8miM5ZUT2JcSBWrSs$)3OqQQ{f;hV0l0x7}U_54hpL_Y;fT)nNWF!eeN zgcx^T6ktnA&M&v$VHlVTfgGIr6Z|xkwj6U5OiUc|Xv53?%nz9(TVyq!6-apRN;UDnAM}p1yrlT3#xQ(EN4|ztA25HK2iZl9 z2Fgy+zv+7AQOhFSVRZJSZi=kN$gmmdDa1p0cerkRZ0gwLPYh<=ze_IToY_REJ92Av&~{LIvDN^UqBl^o9md z4YnnI~L?FaknCjAM$^ay9+Acei))BUj%FNo|T>%@fPQ)~G-qtT7N zy<^T3p@{uLc6wsvdcK=Pbst)Ah-zS1fZ&P9GK%0==3mF0{OrC?JE@~TJRFv=f1EEP z^s9UIXgA5-fx>j;^v(c+M5E>eYH0J${*MWBcYdqVyw*d_d^QQrG!o98Eg@pJA0;JW z)zk3a1mVGzr5Imu;9Mp>>}1go>_?>Ac11$YXJoG$d?|%qE8w9PWy=@sz&l*<_8K1< zjs6n%Fl3=Vv#U7U*@;E5-dT=SB)V9oFZk5-nRW){9mPZMgzl0q3EKvQcqA@#g^(7LY{o-TxNM+DDb@q`5pbN zHP#BdQcCxb|Hr|DEPj1t9qf3cCoB(SPwH<9-;8j0Nr`RPBH@WgAqTM>_xrdQ(?HUX zh}HC-l?VOflI&2jsZdATodlP~gsGY6OAZ3iNI#{e&WCpME)OQ0inhBY*~CZ2RCcJ@ zTjLSN;?uZkuYnJCaOm*Ph7>0!w|89Pc2Wqw-Fs!#I!n{JxcPG(B*2!eQunEl+Kgnu$LPKFVLX zKgyfQr8gAgGvAxSTORZ9Oq$9?`YfrQaKrrb?T<@VCF~_ByoZ!MZt@nk8a<$?QhD(8 zp}Vd96VNve#)ggUs4;lhQp3YDK8@;Ohon55rezfK;JJ&K+$pa2JW>Dkcn=Np5YkUaGVnF-&MJj7dJG9wTAXG^>e*Zjc3$5+wlv_BRdo9|$)+>K=6;=Fh zGL0rd@X<~`$k?ZsWs%}m=g3AYhl5JW>Je*U9X$OXAD&;1bH4Z|H!Ysc|g|T?p2~*{sX3-gmTtEzE>za3c>_Aox zq)v!*3w7DuA%yR#Mm}%j0?xJ&Vokek`mXQ+LI3^Ift8WPx167aR}y+qR)pxw4Uj{>wyp1p;CgorTCVXp*uN?$+>W z#iaw*Uj%?f2Ja-LE`B9`!ui;MwVUbKs(vc4|O5@R_c+d6yryIpG`2au|oXc zizT@2>@QY;gDNcP6h2q*O?h z{{TGCDgHwy8dH|^8JTUd(e*P;ZfgkEu$meDJiC19JmX`Ic6;nV>D|F~CV1vgBsWw1 zYV7WHF3$!i)r^FU^3oPpxf%BR>oDid^$Od37+6U2cd=~S0$_ig56=o5|GsLaeuXum ztdQ18cG+XtO%h-XD7Jgyg(PfjS%^?(Z`L?L9&+4>8B%k9aFtgTG4rhu#}6jKK=u~h zW8dDT#Un}40Y^9rIF++mW03zcS1$Y6EWgBShRlK0NH58sz<7(QviN`%H8cxu8=uyM?ASP za@@S5cKw!+w8XVo&0g$dSMLkKz_wo>2V%jV^MIS6t)BF%+=McZEe)!mLj3un=*aB@ zGC#&N(p!!l2RR(mZ9KmYX@GuepbK$R3sc!iDH&wn(A=xjrgrDQ9&!`^7!0`~(H1c< zW!ZZR<|Yv>vpndUP#wY=RmVDs2DS0e=2$ott34X=+vCebD}wiZ>T}tt@~4v$BBSlj z&e}j}ycXxX6DUuBtkmWKfxqJ9#ua?=|To}!yuqaw~d^T#{%wcO~oxdFS zbL_Xbt49)3jy{PBIt{-w=fCS+eq|o`ON~(N(NdeDK7&+AJYv7ma3f*v<%vb5J7k+@ zXMVhNrErfXU};O!?^f_^pDURFMKs18jFup@JxoG9R}CIwRDs`_+W=6{S!{wK?&fUn z{DtiJj*Z#d?TQfPW~}mN^sQ8;ty_Jwt5|o^b$tO~i(n{5Yusyp>-Kwq%|`n)zV5*Q zf;s`)?uhF|&lIR<0^o31!18t7=}K$NZGp${9pX0Z{N=Bq;zJ!Xh3vVin6`Tf(7_}w zc@4`Gn7YsIZ*|$>pA5;3PlGKnv*AB1BW{MbU9h0&ZFW0M1vuy|nseFw3{Nk>Gfdnv z##a${r9{oJTfDV?a-dt8-}5WFij!2qgYOO)+T$Rq7O%Fm*%G?Da(}C*Fk069*3-WLI~rZdBO}Ipj~^sCqFK5sRiwfN2mN-ch#6$$>+nz8ZOrVepjX zTg9&@m%W&<23Rk(6{d15@ig#|9`uAg?aHDRF*NN5Rr3j_3YE*Euby-5B<6A zi)Qj^m%#9BB%V_Bx_FSkq)!$KO ziD8qRcLPJ;Zf(f6Qv_(w6eBLHGg>^k`IqLM|JSw4@g7}l{nF}Q*+!`gI z4*>zvIkcQy9&K$-X>jJj051%`!Enl5!Q}oN-avq_ag}%z%u59GyJ$RT+4^=C`1!zO zH^{y##6LdgV}VOY21|qBod4H7bNJ1w+oQ(v%?105_NRUN{GwR{u4IzeaBdswnOZ9ZgqiZZMkGSVab z?9Jk$w8l+k?c#2123KR-6ZN*xz2nrCJ?s5jlH2(fQTImOSUTrV>^Lf937M#|t z2!7`&+1j?l_E@|RWqVRl9i!h+qrl- z91ETBRrU__Y+GjN4KQ=}&Qi+SZS0a{F&8DsEYgVT_7goJW@r5F;jrPrnoyeSJzt&) zKF2d@Q!a4bZJh`eW|RMf`FGca`ljK5gPxA2wO$Z-T=-(>;)zDX&Bu}3v| z=rFrYAD#t)PO97bXS2p8%<0Ktj%fM#gKKwZKg&n^C zEdQ7T!$!m8;%NG`8S+uiIsj|^g$u(M>OKl5&4gFs5|Qqpx7D$zX$2AW)^<;)Z7Rrxaa%%AFIQ}J3Y zFoO=>^7Ya8#TOfHv>1k?QR;Q*2r)GRD8N6q(2OpdE+?ac&}S5ZaXVdS=PD0ggqMCX z1tsa;#dcX>UN0t-Ns5VtED7p+(68mC3npp!?It(-Fr|pmxX+ zu`%q`SN9^FFK#{Y2eH=QRAQFw%!b9+wp*oQwt2DMlncI@(wxXm1cNRMUp3=OH|L5( z2Ti{mb8FYCtjlb)&zz-eOKK16JjgsVKq#t@n77g5ud@lpc|gEJfvsH2Hu%|X*c(`n zHjC9K%DOMETc0zE0B7H=k}K1V8X0|)x8f`gMx&GObXNcRt}C0SX)uR zYEOSfZez>Iv0Xnq7tZ6~*`6NRueIT1&Dk7`jSdmQtSV&&(&c-_2LY$DRjX-=2K|?x z$2BagZ;y5#HRJ2&y;v>dGc~lXnTo3JW2z`jhig6-bF0#cpPIRHtlN5QO9w_RWO_Oz zxYd$T68*l|2bj2{V=hylo8kL=R-f*zUI>u3cZ>!t8}K2|Z%o8Cg-aBkDvNVjp1 z=iXNVPvb!4&QsR)UOMz8t5<)ts*w{KE0Op{S0XTWJaE42`JCk zJ(5}f{V>^-d}tL$QJbg09R?zTnqO2LXtQqAhb7LxjPaQk)OBAsx0;6L(N8wDN(dNN z?bcdkQ7^@~->PQ0IgbqracmxxrECi_I5`J3lVbqkML%0b zkUm=hpzanOwmfx?{7E+V->4q#hmnuVy0OVifdZ#Wudpc zBa(mTZ2lNf3-caPP|W9htePyTYgUZXXNMtD4T@bx0_?aget3rTZzJvb+*O~@Eg=|Srkq7*6#@3)YDKr>&0R8n#wyV&o6fB>f zlnel_0izrZeO@Pr{c>DygnP)gZ`QpLny_QwU&sBLb(o+l$>{1s zx2qbEMoE-5mds3~%Ro_3qs@^0bptu|fj)*Rg}&o2&g!VK_pc?jE_x#h%*KoCsWep& z*E|k*-3LTgl3aUMh&z%TH;?UC7P17pf#)7s$1Oio>1w)U7+Pg8RV(~@J=Wj8LTZpe zBh#ncVz!2Mvt552%`~Hkw`P+s(=J+6raMGq?}s_$z5rRtn@^>vl;$M6`mh%J3S5)Mzt*r-c3;)*P-bG*YS z-Exd~NeT((LL;wqN!&N0ay?VH+{$aMiepAeH60{IW@p``9yZ$3C?!R+9kP2GPFLyb zc5S@`qlsPezMO=47|&Nnq|AH}Af)%TG(lHZoE2c!ER`_ny(K(L#8Jnl9LC5)HR)+X z-m*-rKq;A&jN5u~!ThT;Ae;o+s3AmTwH4&%>XN9kXd$!?Nnk`3$Oe zk4Xs&KE-x9+sVgoDtWw0Pnf)SF>SE@_4VVuRO{#AZ&9!WZ@?im!6S?o-o=Feh$%>} z3GYINT{dpEU={VO?&~?BVbu?z`V*v|&PHPv<-sT6Kx2EZKTpOQM1e;l_qqX(^pj2} zrnyPUlUkyeEt47C0^EmN!Anii&?J6QYbdR&P&xz~dg~kBcF1uV_oDNT2br(`7J7qm zYC$W_vahszPp=LD{ih(;YnW`{1zkm+oPKK}WVxv)r|*J}K;ywE?-SwO>N3y1hfZ|l zom*26UIsMl%1_h8d>{6#6M8`7f?@(zm>pX3ER8`7oA6eGmVT74WgYZbU>YN_`(Ko< z?B^Bz?D!#@62_0vaXVz=Y?Xify!!t9JnquBVb6~gJ=U6&^)J)EP2^j|E?Op`m98#) zizbTgjc(fXi!fF4Fo;Z;w0pFF$iJsiw7p|&El`hFrX7WQSwS~oF@Gr)&HtoY{6cHx z3yPncbGZM_N@_k9Au)Fct9XwmSQ?q|??$G|HKp@-@d$cfkN%3G_u$pC+2ckZkqD?K z6rrSezB;D7x~|}y?A*&}$exICi^)YsQF5b|J3HU}UDZdI?8DIj0pa;v34)ytxW~)t z>5H3Bhv&AECm9S!T!qYEaxR2gc15IlY#>$}ua)?U1!!~A5!Dyc4=j8%Gz>C56Hl%e zi!jWr!9|`{4E^lp8WnQX(tvKMelcY|em1xHEZ$VRh7x<*Y3_qw(ekM)tj9l{zw7OX=e#yy9nFluJ5$XTyMMZrNahF@u$gUstubn^IwzL zR-?~Xtpc+8YDV%udlj4w@K%}+zLc{pM^#jS`&=69gT4P|W2o0JdzO@{d28KC^W~u3 z?NNK8mkgtIoIEoQNVn{gJVr@OR`7LViIiCb3fT#=4;5vVrR~bJjCEgBk;eK}iGdugcl$SF*}nlQ|zuk|860%^vOkvJzYidgo77h}zCC zs8l_~ZEqL>w`Vx>+-5h?)@DcW<nrG7rmX34lI#lntxW=9sv&42 z7-$M|FE4^yS)w1Thq*1ghSIouKk`sOH3+%R1GwU$v=IF^m1`{oRRSzUHyZ85v`E_g zum1GvA3=C{CC_J1qUWkmc$mHi@x(Xx-8=IL+D{z5pLdacu=09%rA%x>^Smp>DoZjr zc4V%~annUcI{*1uL)@LU4^Fcz1P7HA*6m*iAAl7F@C`}vb@FRpnvu2j>R46UW_c(# z&lLlw_LR@~aDvjbA~(rM*?Q2lC+Wns&=4yt+G4-4_4Wi!u5=8qEKM_;1(#IMmjW`C za1p;A^sQd%v!xNsTFNZ^;_;g%FCe^Bs8;yVOxWcEF8ez4ZM2%)+BR z)qZtX`Q~#FA*8oHH_&cXUspWIbvn#7bJ-To=DHi`82{~54Xgs5{jxPfTDiH~i}wEQ zVfc_+vOZy%R^|wtOs9ngeKew5L>}I`an*jp+WNNAS7GuM0siOTe;nM=EM6%O&~NYk zD4c~&U|aviljl-TH;YsEKT58O;&a5w~(uys$D^O>TlRpK2Nm*ojI zdF7X6$I_K2ALtkSpOLb=Zg7H{JH`I&%7w}MeQo>;QmxAdX|5BsBgaqk$@t_7^(5#@e5F4U za;xaiTxFm3x>Xu4!>_(FJ#`gXrpPxt`*9i}YryERaceYtc1268Mh%|qmT}pIbLB7k z?x(G4^~I$j0qjuG7`}y+SA2r5b8&4}>E{klMM-d!JlA$?aAE_SpBhz?#)v_Ldv7+I zSRjlMnEMf6{5GTJx4LXp#@2d83LUQuIwnixjZ)etUzH5nB^VzTUrdqwHoq^Bpyn5u zX!GrV5(Oj@DeuW*&Le~0mitNoUm>XgK(?X}1ijWtp55J6S>&MXFz@}@!dRmSang) z-6Fs9@>*$xYuD+4{wha(=4V%?dcE3;Sqwy3v}2VIT~1CKOI0KS<20@wo)7j9nM5mX zAQSW%!L^H(>mD^44i{%Sdurx&^1G6|!k+ou>ye{*rlgs74kF7w*hiSg!ygO@u$I2` zbRg4yXiNG56Spdz>qQnxbfUmCO|>Up(ifM5xQUnd`1wnxZ{)^If9lkpz7HlQg+BS< zj%#_7YBJMRIfJ2IPxt{tcYnRC*p%~!{kT4<^;)y{v%}PyyS7v`0?IL-ZnYXyi)d(~ zl0aCn-1dI`Fjagv0<12sI){4A>Zg5=17jcvEX0AIwUp0BISK6aRF}3GeZz+Yv@X{e z=tz_X=J~#aoh+47btlJi2_%zm##!RQumCsnR_|8*7$eGjJ+160mZwZ1$*z3H^~oa8 z3#QT)pMn2J+j~Yu(KT(Of~X`BMRF8HkSquYh>RkFph(V936hl@B&mRcAVEMtlH`nJ zhN$F>9iyS6y{g=pJh;6}63xmJ~hngK@fn zqvWS?Zly1#XkKg(oRKMTHQ)O|H?XZ=Jkrl~Ht@wZ(Fc=XBHA3;+T~X_EQ2er%ini3 zk?r2&IN76^qb0X;S8)GVsw6e(34x=q;Kce#e=$4~Jn+u1!E0(qReOQXnn&|y*J#OH zW{anarMxaSo^77CD=zAeWD_lsYcnsuXwqlG$o;bJd4&l@H5AU5V37 zB2_;1U446_3vlA2MVU!qwa4|L1nTt90`fFQteln{1@js?qD7PfR}^|U1w9NmjC6437NZv@!hB47Rrj4<6>GjEJ`)ThAoxX!1BEc=Eo08TWBd-muZ5#+HldAP;Wn(T#(fCEfZV9R?QEeYxMG*f~?N#R`eH!QSOP zG1Ktin9KHNI>T3Kn0xQ06Q@_oI7w5z@{22CMiXE~1ppCe4qqx3?(14Q5IPE4?MA*^Vhr_gD=#E~Y!I%M`Z5QC@_0Ui%b#YEI0n=T-_`c-*0tog`MvMe=W|1iAOVrMUT%y+|jD!40Q+eQWW_({)h(YAxJ2c1Vv z{-V;!y`O`X?9F{Q;=c2gJ|^@&t2L}~&2l*R(wg>{OV2r&hu3%)s8rbd_HFIF>1->6 z94$<&8B#)j3X!UpEY{g}s*)daF7viC5zxnk2JHE`sdACqDZeYvKv=js-{~&ci@D9J zL67ey+U}%ZMpzbS8CmhzvW#J6U*V>{RC(Q)fMVUS2z%Pd^vY7un$csgt*K6dX-T=t zFDcs^r)xH&#UV6> z{mna$N0rT&U1|xk2oBy4e^s@z5|%tg8W={F<@3gHGkhY*v(jAqL&3Ir*hF)?*K+FJ zTjWRAgjl!(J)3QwM*%7=Qpz^fsu3ybyiOO%en3`3;2mfi@Ges za^;G|gXYv(KKogdu17%tiJvA!HtJAcx_oqPcN=VF|Dlev!3w?q{lgO5=UP+WSk($` zTqX|!V=5kAbvs!5Bqs7_@w(%RGe}zss5J#PIa0Uz-VACTmfYc4Jq*0Q*X69$^N8q{ z^~1uKqPOmorXX#0Zpp<|o^y3%*|2=NLdiH$G0eD_D>qq?Xqu2#CbV(*p58yimB6XN zcU?uA#X&%2vTka<=EvBmA<>kZ2xnwvY3aaLSa8D8mwr)_UeO!{{|d6h@Bz8!TCJW` zj*hET#=pG}uD&$*^uEG0C7*Ch(IZmj(A9~NUT=^QV!bvDfKU$|6KZ+V-wwBa*?F6; zr&i!*NGo-e^(}yud&=rv*TCu#i??GUg&-X5r%BQNY%oe&*MRcN3`PV;6DwQPsH42E zR5n-nWtdgtpjfqTEd?g4ehpZ)p(<0|TMQ0x8Y^8iAzbRYR&D8w!RCm@<)*&!Thd5> zmUro{#%>{Ht_s#EP5br9k^^OQa(%|&=h+Gl%QAK~*C}B3O**17jAi^R;30)-hX!+d zyMxA+&q|C6^fVw-qe&UJV04Q-D8w1IjVp{76_vdDvOw@kQe4&@?Q%Om#h4Vla?y>6 z1N~jM_vS@o^FAhyJ867@+eWu&xgjejN)eO{7ZVme$?HM@DH)A?A zl|JT&gYUQBZNRfb{q&~PL$2VKk%3Lk~N=l-;3frn{!=%4x zv?4kj;1IMM-mxiAF7nuC_lEbK)DxL~mIK82b!?RKSAZfoJw+m_iF@`|Uh1WHpP^#> zrY(|e4=Q2&XL4y>=Mv2J>#{mNsk@Q$pUr>td?dU2P7Lcu(`GT}%ims_yjQ5WE_MGU z&(`+udFMi@+Oc-;tfku}idn9^K6V`Hg-U+E0JY`+>e^dS_H8GV&T%0)^72u)(9f?1 z9Z%2^t$W*?ksxgDr%<_@UD2VSzykAx!OuA7wk*B^B4% zpFJvJKyE%xQQ$XTw(7KU-*e6aT8@TT{b2v(puXG zx**xJF5es%$vsMa8u+zD%?|$ywXTv`8G**KvsY-TB{K z3IuKf;`}Zv)j8q2qiWZS9(|gs5Ty$=KPutsu9*3l#q%3k5g0I$drCzA@TtNR|4IXv z*w%37qB7^i$?006$d?C61y;tDT-}dBmOp=xd2S{2;4$sFf`aX9#06)x%Pk&VA>`Jo zEHxR3$%l$txpMA5k!G4o({JEpb_P_{Bvt+TUHro|tz}R#4EvpsR>wB6nYla^2ro{i9=_e<1AfvEo(i1uPuaac5zu zfHR4=fH80$GX`)$25FoO@I*SONoJnRIITUVVJN~Qcg3zw!lC|#PllVWH;tCv)!f$> zYIzK-Et2JNe8pK=NEz))$MQe^-Y1oiTH5T=(UGM1@}?_2#AX4~XUaOw72kn6%8mYM zx}dWsHS8wTQ*RLy@ym^y`X1d9GfVt>(l}z-?zpTZ5VO9H$MZAdwp`c1UX31z&xakA zQ)H73uf`sRjCN_6CuQ7S?sc{G{`_)5b5;aO47E!b#yfJ7{FNN~b?P$S4jX|QPD8)5 zSCMJd!>XZ1r5XL!@}bLm3gQR&`m6NG(sJR2Ik};)AB4H_towL=T&$R%T@VX3~ zT`>dS+io*_2}G?(vUPr8H{@fxBTky(B<&Q>ai9hspZW`9fKRYqB6)%#z()j#&F#eZP zK-`ATI;P#4JnJ%c<8(FFhm)ZjK_HR!p<3D9i>w^8S}Mui=ov7-8>0UB_pfNyYjn@T z%D$8}XhfgmY>cEIquALq=-Uh(5RIbfO8QzM7dn!!oYs_nd8M8pt2AfgOGdG^Lc+n% z$i1ePBbu1sNU&v~(tPAPi+phIeSlmHElp2-DE(sSNjD23Gpgc*5Bb2xZ0*xQe02HTeM6fHQB_RBtgkHl2ZOtXtQGe z>A`{U`S~^(!eFu!|_msT@*yWL`w^3Os-QNnn9yP>5a!S0Up8nwutE#hm#9eO}v1yDvF+tKWZG?{U_Ow8)+Nre!r- z5*$~Vw$hYDEMidbd$mwB9h>~*+OJniowC%2S%qPw_r5F4i14fJa?Da%@1x6tM`cZo z?SUUGwXT%xnD=c>&Ref7lNXBbz9rY35uOWH3Cr+(X&3cWit*0ZtW_qf*1SBSeVX;F zkoO{pfsySKcYq3f6hE^%oEyO0!2wMPqSS|# zbov>Sm37``tj9*~HuSsEu`*Tr3}v|V+{s?t)heNJ+_9M~uUIc_ex>u+yh|C>k&rpR zM%Ht8moo!zDO2m16tA3y7McMZs$}KfSNCOnG18{3%H!!i++7p(ATK zSlVD%q&jhhRAdlmzXxeLRh3siRb5Xc{@vbZm$a#%UFTAvMPbSdue)klnjB{jy*esq z!loOCb!39H6`}%VuaK(dFV#Cw{T^dw?9+Db(+&RM!OnJ53$Uf{# zXw2sQK=4b-K}(`T z8*;rGTf+-4&6%hoG5ewO^Y=E_7B5gn;uCA_fjU*`Hxj;4hi|rQqU9h5Cpx2>>YhYB z_K8G5mkT`a*4N$aOQ7O8J!G!DKp9LAba^5uiMS6k=XA*EsFH44W>O|MN&&8y833U&upiwC$1F54y^rd zW;U4UvllN2KRoyc_PkMjnFMn!p_#(U!ni8j-LQ}oP4*re)$wvItGswq;}k8w&!Xd6&f=f! z=N%bNE@n%wQe=flllFR}B5Mxx92V!5`kSwYX^m)nj+YX5QE}K(Y5XA|^PozL`G9Qm zV=!B_UjBTKP_ayb+lz7GK#@V`P=#qxekEjo#L0e>w!S80cEQ2uGk_;e()Sck%vB{C zTo)VJ&{pBA@4XYf)LK4u#;~jCc7PbyjibZ(QMP#ymy_Y_@8QCj=q&)Dv z!!xcUao>e#q?C1P#BGFZXXnf4dveX>L8z=~^`}>9cO z^9y%U99C9V8-k2HbT^L!8EOgCneqtHE>_JMCjGgs@aXBO!TWdF&}h&hR>kh^nF)S` zmCp1LJ-QCbgy4|kda(Ngd4mM_EK~_WUm5V5mR)Om3~;d_ z$=MZ);4?D0M-@CnsEyy?^Vlr3$x26&nd!A}&1f6<)GP?u`yx`mh+17XM?yJjL8gK2Axn)ls4|G1hk@s!Pl8z~R-TO`~zNQG5e( z&%WVnU;DjQt$~YSq*8j>*m%l)?~WcK()|A1d`p*YYekr^$jm_sdo&U0{_p*-D zqvfkT$)+`VL)4_$iLaE%LIni#;!g*^72T1NJEQv zo%E{vm;60u&~jL)*nQ^Zw58^ftFB#Yti>`ZRsQkdC-t6>shLV@IYofAhKQ9@l!lZy znP&x0T2pn*2jF3Lhh~+FhfCuPPAzbOL0i2@L$TBgc^VYnWCRZlt&3F@PLj$`(Wo(g zON-SMQsl5z+LY^)+1X;DTz%)UG^%oH#N6q*ivDt1+%CJI#6@X~J6W2;Gk*Bjal(?(^XmU4N0on8=+3@~m^7ne}N?Wlj zI9xY4RibU^`;>h4$Xzzdl_?`EV+1)Rr`eH&?FB8`*t$ zrk%Xh~}65Y~&=7BUL5TqHt`Er$(XVnKK%o6!a6qiGuvdMVATH4j>5tFHKx!svn z{u3ENz_&JEU>aYc(X(>>B-v(Y=OuBT--8u$Sfx%`rd>Zn$G+aq&yLidx3=mUBDf-u zUAv;mv7t!3tP#^sGbK3AR;|CGB_@2s6_w|>t=qffAF@S~6TR46O#K+&+$IUiMjM~| zIW~CZ%JXshl;~1|37V;9$qd8G6(;nI0c&dQ6eA2T zHe|76iM%W$#?b%6eZ1f^DYT&!s9KB%fdN8{+n|#<^ zt0?>&&{5c?+m&t0*nXx>M2f?+H1sq<|M^YTtj&er1k8X4+$KE8!^bUg0bOYa zI*3N;PcB?OGk&f}Kll5wzV@TnKb&<^T{oAz%G2eQ-5k@qKfiN%CUfeP*1^WZfqnYY z$&JC^-`alIp9{s?E;#G1xKcoPVqUO3o!yB?=o3eH?QKx?F+0jGm-}{iX)_+1J=t~L zit?p(WpNQQzf!9ArGbQEj#`GV)w;F*ualScCz;Q@t7((Q*GhUdSa@qAPBA9K&)IV3 z(}nPZE}2S$5S zpy@lolgeH26{zjH{aN3^>{2%cPGNcx3Z%B@rBUQ^TCqzxC}=ar>}_H9tJ|#&Z-fNK z=D}&2-=T%F`R4vW=I+pHuuJaDw#1V*gWk)aI&#+K@=D^os*VCzWJR8|e?>1%#L)RK zyX8jTvXk=nN*{KRe>_Jod}WI3^ILo#MVINxnT7z3CjEK)y0=H4b+k*Y9!)BL#l91g zj{ou2pD>aoBIAvjGt!l(L@tk8ux4x&`l(1oU*?+Ts~^3|5m`~1{)jupbcLC?j;q?JkV?ZPPC2OjaIc@*^+J0&j_=M zSoeJ=Us5Rr9xL6aoJZG)ieuvVj&dK# ztH5UI`Z8WorMn@eo$w>r-cBBzRl4j@tq-&p+oM@i*|+)5Ag6q8HsKrmEO61EH9rs{ zJS7Bj?t#OJ@?Rof4t_`Ahs+hldV_JTph=r|QHDxdavaVvw^&IR+I&~u=unx&S5GUl zsLlm2Qo7b7D07PKOAqqBWWOnwf*BO%L)WZFvG4I~sI06-DP3m_BKCaG9E?w#nR&oG+c>dPv|dp59utFMbt(3yM*}PPJgW2ym#a*3t|_=4q<;YK8S(KJZto49uzf8 zPtN8lKm~VNWfiL;c1M5y*ZkgSL2*#O?RX*Y}jh&C-_#sdhil zk$$$BwPe=sDyr6thh_(NK0LznyA~3rKC@NvSYyk1KQk|PoLZQPSwLd?Hh7AiwQo5> zv9A#-yj;$X3eEKt(I4fyT4b#5QpYvqny(_0Z7-d}Q+8%edOcyL+k!_|j-Jv=T2yXK z#qyxiFOIlu>+Y~j#w|ALiXGQyM69230KJg6j=Mj4RC`Bow{9-wAoliC6U(!uPu&d# z3jFtCgc!-U_iF6Rc4k8GXXp99+&ev{dG)o$EE`Ca`K>o-w;O#PTZF3H%htK-<-9L9 zau`k&`ugj=*`KX5LBYY7^W1o}ciWZ*#`);?*W6$JiL93IufFPgbn_9-$-#5H-4jOk zUAk>%cFo_6J~Zw`g(UzosDF^P)7ZaY zBAI5-sIa?n6(+Ytl59d;t(}`1+6jqPCftS@md};(OcwHlufFcr3w!ibS(M)HU@PGB zn5!Ho?Z&$sk}2(!=RSnok!~J*_^91hY3z(?B~nW!<0kV6Cs(NWkpKs)4NvI8jyav0 zZ99MJdQbCYw%^C|F=nFAil#O<51j@!(_dSeRG%s-Zl~ULQFa;IikSZRO?t1{y|z4I zEkI@TFnK$nm*nHz7%hjG#S*=xar`S%Ur?3+jWsC?SBv3=XE3e!1o|uQ9Dh*3J=ApE zSr^HE!@PIZa*R8Lg|_7BpLia-;B4Hwk@0;2pMap&V&%_~QG9#D+$k)a3S1?+<5>Vy znsq$Zp#XPZ8{UAf?ZXu7#~c9S@>zbIhVStdAB=SvJQTU_iP6$o1$|rI(FkrdSwdYd z=mM0B-O-VqPoEFYU6^Gg<(7BprN?*8Em=!Q3DZ(IA=i9cDOM_nhl1BeqS?KNqD)i@yU8tis)KY3N{smZ6j>s7A5Kl% z($pki=dRH>%Kwxa+ZDi}u5r#+zeiO&S}JS(Tjdrfsokt739&O*~n;M(XdiL3F;A;{}#`1LNy*0WO)4P&= zv>j!&5z-as#!06SMlhoKEmHI(T+(y04j$7JoQkufmSZPy6XsZ!y}RDl`eR=tt)kj2 zarO1)zLDt_hifdguW5rK`+5}x>+roysdDhEni@m+MculiH)FP>V{^5AcF7XC(wG-VKs_Uauddk~?^xv3`2O%dMbHrd7h~UY_;upk2zan2vTg5jVT^m7LuV-^cR3 z>X_y!rbwOzfGX&htuXvWwnaIR%jge30;Ff6`Em2$p56V3v5Kj*4tuk*vBor_y@Zqu z*)^ZRLcgL9Pd8~ddLL9NP~-P@U8qRvL#Da^xOew@k4q2TTRuyU>G{0GyB~eekQVG{ zdfpa0-0fHqTh*S=``!7={<25N@wi7>vjaV3Rt$I`G6x|hF2Lb3SF>tj_3hA7uR$nI zFT~3;ab9`2%u}V;6=08oHuyq%~M!p2!=9yiAG-ant}b5-P7K>o8BFG>1YKcXws5CHYc6h+wxzUGX)+ z?|>x9))IF~m)GA^d|-7^XvfOwkI@q~`%9dY6wA5JGd!C283Y^4YpiTRU+7LfS-LP-D$^2D`?Y+eKjVDeQL^k~a%sKDLHjA%!*N=SM7VPMM! z3Zh%kkO}Ty^&R_G!nF$38aaq&5rMG-!lasRBnLiT{0oR3*l!fROm zDoG{JU9*v!#2GWlj<8i6qRN-@{I2DK@7uJM8BT_61a{sbx;9UKTXs=cn}c~&kPRxB zKa6z<(8_YwE42A)e|a8K9FWJ=|F&o(Q%M|I70Cvpj)hvq$UAa`4Tcu|-P zWgQ+HkdMW1h}dU=n9;U5Z2@cJ%4OY9bwwWQ2`YF4P(GBw0-TLhB}x$PBBB(Qc;cL~ z&y8+A$)7J7*!sdApp>gG6N~(!PE@H5p3f9v0tLIFvtOGz8UpEpOCOAdj~F!6?@H@^ zc-3+?LilpWJ8X}p*bJnzuV%ko>Q2@vk#&R7_~3;4i$v6>_nURA4Fs}6nod@9;DQ19 z*oRKKil-&2Gr{sb7ReckIrsWLQNpa8Sh{LuTUuP))8eN8uM013`q(af@F$j3u9{h& zC(}-@L%3_@vVF6K*O!kPj);EuWE=i+Y$b53gGX~eD1foN|4Q^88&;1hwqdIHS0@Y; zVTgU?{!_?YCjTzvfN;CC>Nl_vO6@Pmrr2(!K5Ex;3I@pM-33ok%~K^#XXxx3VgC|V zp^mtBr|;Ia*$A#g5F9i*YCn@a?Z!=Dkp%;6B$iQuVq8%HT?->iXKqc;G&DRu`|-N{ zxxoFP{fjG2Q&CL6QQa}qk)V~9;02w}OrTZLhUD9ZHkKXCTt_j5MLj@mjH)K$R4;h` z)~U>lKhnn9t}mW#7lBa05;=EvXvyvx8(Wv{OB;At+MN_ij6NBGKA~_pFC;TU2uxll zDuh+|L9-$(Y~OCeYkWq=EzRM>C-!gAC$P+cEgD;YA%*b`r6Vu$pO;#HU*O|^+Z~;L z-uT9T(DlCs76!Ic`$qd#bI%L9qtCrP$`IYyQv-4Rw;LxL7#S_g_-xPrm{pbZqfgIF ztswHAl=nrWb;WRMaCKc=fM|qY2?^1=B6D6=&vrgGhmMO>bq0F=q%}#x9zf|JnlLH8 zrA0qrLM$l*m8u=DvX*R4vBLYMP5_449;?c^tAG4!%oIvcaEaf&&Uw72V4?4!e%BA> zH>;TCpafv>{M9{u-O|6Ga6fp!`5zjAzsv*5>sr%`B`AfSz>d0xnt``lu#!&B6ZWu0 zN_IXl!kcx}MNRF@EoQ`7)5BlPl|l=fUPv2^^4Nv|;Fg5ntTn`NWqo;Sc(`%lGi!jf zq4<9d5D1%(N35CL`c4_cR4KIGy>G;avCN*8DlZ!Sy-;@oMh%P}{|S#!u!&#k;Z1IE z#VRMl7xs|`bAoNI+=ibDu$^eBu9k6{7U7bh7AlzsEhTb`Q|3*sm4f-MAu>pta#kn7te|_G9E74mC7a6psknN z6Bhg9wL+5Ds463O3UK(>oP^a);6uv$HEU~>VhIQ!jy%rvWFA9=D_6jN-qpNu|DW+! z6+<5HY>u1FyBuwxk8v_Ac?W252-%&27c#&htF0ZqfrFPJ9pO*#h#_F!LyuHF`TK$c ztSfhSJFGk!vgvS^B~vMBc!OahWgymYSHCC>4}W>Ikpmx0TQ?}ajG>@uNH?Ds>QXTF z_Sxksv4|y0pI8Bw%~2=2|CsWC<` z_i!9}!5fQKB{g$45yr^(sBn71<2^KG!rgw)z$WrJtThtgQ9P@^u5ZYIUUH9d_b@JO znb!eiBx2y?{~a>?!&1OB)vK^qjDB7^Ql~M7&d?@6Mh2Go-M1YMzq#76Wo5U<1qaRe zU)+?sGG-|KN1YQ<)q>qfM@1)OlMQ-hv23*}(xLWfT9-JC4o{B=5eb*BTJEM@1@7A6Fe(0hz&0f4~1 zTHtYS<3NjmgH<`kMM_Er}0(G?(b`Y39hWk+pW7t3xz<(_x6YFEpgBH{Y1#7!u(ELfw zP7QN%iwDeai@+FTr2lxa32LAncjIK22z*6K@MIU5Ff8R889~+7z9tpkxLbvf{f>s} zYH=IB@GC)7$ecx$+Ha90_W5+7o-c3@0eV$4E(lK_g(_=giK6gAzN12@Hl~7N|1Tjl zeE0$%pzWNpTz($+jZ;+a*!eN~HEz}_VSX7#21FV}gjgFk;eVn~KrHC#-CcNJ;`*L- z9h+Q){0cE{4ei_JsSC+nltr}gP&8n3x1eC)Gvb339nd;MGkb*Kwp zQBm>j*vbcC*W|p?$sw~BLqASnrQ_k8#9DRWtcfZdu?Wk}%`IMn%L8DM0G7|7Vc8HQ zL<42WmP}rtVp}hsZIs34M7XO(zsns&a_hi%MV%c)3M5q%%)*FERl3+TWc>ZFxM?uX zgD(x`Z+W*89&oU}tDS;#IB9~9VPU2bZrP(Qdr5aE`Oav44fT^X$khV;5DknT(bDF`vnJJ#JtwC=jstj?o!=ZVJoVr>4%M@Yfa zdPt^>t3THrYiBZjgw4a6nPifAErh9#*Zs|Q5pD9hYCxs@*__r3gpf+(T0~GP&A6%? z3ix9oXA3#{L~z(cA3QB2t?a*mItBiN`_l<;&$ERLgecqi7fPW|l6R}v&l!WEpm za8S$d#CEOJ0b>a_C~uya9ZSjdBRxZG0BKEa500nXkiRPj7GAJ>3@)-$3u}maMCZ;CK zAWi-a-v87NKD`B%0|D~FDr{<=S zyvJj5z((0G{>*t!#>uMi-vHi>2TK_`6!DM(QW1jL!^a07jMhEazVEKpX`}hR%}WA83>dyFe; zzv)Z-QeSYNq+=o=Cqe=Iq;vn0UHqdD=u}4c8BnB`Hr;7&SUa2`4%+A?1hWJ94iWcl zR773vAv1)QbGnq=7$Q=F_B^N9?_s!p0E<%&5ILiW z3|xlOq2ybauova8CcGvj`14X5)CcA1JW=5~+)C624)X3jI4NRk=C$Fd_W-yn0i;y3 zoeH-%1slJJ2kVgs7`(coVMsA1A(}o9*y1hIT1l9Jp~B^?tb6r$GtA;4+GMNtVbA`! zvrWZ|I<+CgT^kHnvxDL4MRlv~np2>L`RAq51zem9mBl@zZ+a6SN}fS2hKwwh$Y8wI z2u>G5p;5{bCZq2h0DZpF!q?~ag50LAB#mKyJf#{Rf&n z!^=ZoBOeBGgIV*MpYYx=f@)$S2s>dvE@&qcT#iam1JhdHO;W(`!agY)>bhlult5uD z6ko)k_=3i?C(xr@I;xLAveu*gc?T6qD6~-7uQ1PTjGMlPh9TsXU%faE1;7Xbz5o#w za3-xV&O6rP3A7fm_zA>dEmC2TY9|vBEvzzD$($44mGpLRpCOGYk_yXGQjNmToH*`7 zq~ghXOZ|Ozj5{5waAwg=$lL<~hfzHr#_U*Y2*c-T&Mv?DXJ76+&{L^LR6NIl6}s_V zz;+BTV@M4f(+TWpa_(la2=Jzf%DzviVDJ7Fo-VN%IW6uUW%1GG;}--sG4Y3)yFTSN zbh5A)6rcYqBxtz{Db9Ospe<7k*kZWt6ovgQV2i77;9~d*j~3LMD+DhsqYw&xZVA+5 z>2tcSj-jgSFO;K$y?|pOcMjBY@&%k zza9jIIUX$#724s`#li5ZS;i_oJuQkk6oohz6xMA+3YrT2F#q0)LIrk4fI~I}*$VnN z{c8FX`p+Z2ArQBs36OrV85!@Zghp=6!Jg<*h}|96Pl~=zhdjv0_r93{#B3>i@*YKc zs^(E-%_ZuSC%OEHlP!hq;m%0|4Q9$DbGrOM_ZM*Uxe&BIBk**?3GA;B1aZCR1i@#P zt>zD`g|{34EH5s=sE>A|L13L-)Ax>NJ0W=pxqz6}T<1?>pwqEBf1v~Ti?E>6XfZis zx8wA_FWBfXO4~X7u)b4NB~&^>ho7O~wuUw)j}1V7q$;o5!>a{}I?!I3(}1uYNNh?A zTj0ce4+`8(hatM?87-6x&t3*FblZOe!|M@sAl`glWzs!?-jibo2Y*F0p=nx^^dlIe zaj!7N&UonYosf9(j#xLWTVC~$F{YjEwq*z>5!|DKuX2SQLCdPggQn$GRzO7dqDikP zZZIasdG;i{V=zODV7@1Y;W_M36RK9=L>G*>kfs{w04q0YSLY$YI1k=~oGi41kBBt2 zpe*tIC1{@`Td(dEVq-79|C;YbFAiV`z0pr?OEiDk2-(j0qFZJNhU*}D|LYwCYUvB8 zrIFn-=yNQzkH9gnLjl5ck(q}&7)sL5gZdjFlROItZXjHhJn-?tZYy53|B|#p9-SLX z3ovw{c9J^^YP-V=n>b?mcD=r!m^RS(Ne4OD2Py*?~U(95|_x%LYhL7PY z?V3-M$qceKpX9@bpPh&3PqXGTn7E^Dkr5=l1hAS=meOzmQe)#?p0ocYT+VSwoHK8l zL@k-{Dr%qkuonpnt4>q+qk~N#u__cF;dl`13!w2ILNtS5m^&O~zxyUt+*U|X0Jis7 z1yrcHNN9m+bY!>ya8CI)T*Q!1778`!=b|x;@P7z3h%M-8>%HC^UA*|Gv45>AJ%EN6 zS^mq36F7kt+KM@$9i<6aVMf{RT)1#S%0_V~8w@Y^A>}o(Xum&+)xV?Ac03F4Pe<_p z9E~mQ^hHt(o&!cV{=gBfOUju1EWKU zD1>y$!Pa=|pDx)U%=w$Y|2qx}b_6&rYXMgaQrP>=;Dm)C9f-%B5exX){L%$JL9{!Q zT+NXozmINpF_;6??z}Hu534{`2AJVgsAdtKf^Vl^kUx9_?lOp*d3o!*VS4jJwO2;gAy>r^JIGfisfYKT5gPLg>4%X{j>Tp^ba26G-U-MaGNE6EoFnfW}VEGvAf%FJw+~=yr zBmpJ=Q$f-Y?Z~av9?NKWfaqd1x=}`VX~aMZu_E@}u2ie3sfmY=b{T#T&k1ZiNX8Ss zNof59K>dg}#q2$w)ITPMMmEBt6N6fy`o(697x0|G{$Ga`3K;|~#n#?I+|ewGK-RWw zjibsGo#w=_+gKd@KvgvWcq9NCq3Gl?2fx7tD;o`8U?MZ~pVA<4*|i^b}N#N;DQUMn61p=~Q=|9_YXh_2cGr`Q>&A zLGHb(*>T{C(>Et0(W+Gj|Ir<9D@ujw$CMcLt^d6WwV_RB zEo%$441O8e`g^@_?L-fnK_JvAK#7KcEehVk0Dgel#_@^hhCA_FP?%_P8hWMvakKX` zC9E+pcL|jz7%?~w?*FQzyZJebS zw6K4u{QNR=cMy9a;=a`Ls0!2jmT28-0No-z=TN0cs4Wa~*aOqgi-f7-OlZD|p!@&>l-csD@}4<1KOnV`7%0}a$xhS3%R&K>%_|_XFjlw*CM=;NsxcbcJIl_` zqK9Fx;QaDzH^w9N?UP`v&K)odvScInj=ve${46~fN`KJ2LnQ5>ORhLB^dPYr0Z2S7 zgAGY6Q6e??{rBL6^z!(Z#`ETe8Z^SM5s6tL@UVBO)S* z#F~DMrih=Ec!4)=`_4VFUm0MUN#)I`wvGy8%b3*d?$KYz9yWaeWbXg?2*m>s9|Dyx z=RJ)h3sG}h_DAUtbikm(Veqx5n1#b&sBkDB#mBeO0_0zot%Q@GEb8>RHEr`ExzK%O4k&=MD zq~zyxqKcX)utSMK#C>PrFZ{qn?!~*mjROuy<|jWeY#M=x1iWwX^Rwf{1J%2aLuK?o zOiwUFA9|Y*n&^13EZ+%xiiZrTWWC;a5+1Q`U#fI?ckADZND#7OQ~bYZ3r0?h;8?E;x_z0sQ-g$4>MAT8-RyV$uS_s32>L>|12g2T!LsIZuAh0RsX?VgwXkj z5T}q9e6!fs?!DFD#k`3g?OHgU?iWPWk7bK~p@sFT#sVP;Stl>kUpYa8 z5Y%_H)K%v&-{R9o4oadkk=7Cz=b`NgVF}xW)JjM)y0f=&J|!h3An8O-sL1>a*TWco`^x&RVro0YyTJh6A-7{Lj!Nx{HnpRJMR#)d`z;#8kHsEF) zs()y3WTF64z`wg;1AYb#6pN?6xnP(xcPX%DL!CQy7?iR~0;1w<7&vpR_5Z5+Ahz&R zz(Y?F5t7hw)I*IwVbNH2$3c?AnVi`(e9lEu_0;!7Ys+U*CS@Y`9HNvT48j{9Pz+qK zrnMNJM8U!t1V!DZHmy4xtipXEYUpzwK(NPSTvLt_L%_S%fY9n3b?|CY@Par43GMv< zMd%aQPIxIluiGNj4kSK=;pbT2^x2$cHQoKaQ}%0Jd5(uZ9;Y|8v4$X1!Mxi+$>DF= zszV1j;$hOpaYua)ijJ;NP2|ArTV-?cNfg@$Q$X^*xxWUvjWG5-2-HwHDfzPgwZ9Qn z?hrNl`Gxxm#(C(CVYq|FjBlQa=r_=i5qDg;8;W}p%Z|~B?t=0b3MGsfn*(|a)wf$Z z;>5ayh=kyrxhf5?^$g@%3*2D!SS0RHSLqPafaHwW!Y^RSjG;Q-flrW0yleI8#Rwp( zDuBl=WQp)%q~JUdXbimKq5Usma}v-gc;ixI0=!2Zs9Fo0gM-;Iz7b&!s=r1&%fnPU z!U-y?$c;oJX7z1+Z_iD|<9FCbfcolJ>SHZXl$lu+gq;8GtGkRW;H!eAEFdCzyQ3C zS~*YoEpMUfzhar=@7oyQjQa*Krl-sp78}3>Y@#j5 zQ=bZBJK%rUHHJ;1sdMOKBMJ{^*<*=%(@t=0${&qPSv>&5n|jrC7s4xgb$K#f46WUx z;GCUJeAo_X+iOhBq*6su(dH)krlah*a~WF62sgl0|260hK^RPQ2?4q;`a+gC;u8uB zqKX>nO3ymCj#0g2kOPo?fixaH>wr4*G$_U9+#&bU!+`c<@W4YCP8mh^cQfE{%!h&X0jT3elsD9VG{7w!d1)s5psHT?AdT=c+eNLxbL7 zYy~W|yCBdARN9%u!c2Hd&%!b0D4D~LV#%#iZlxM;wa*ZoYS#Z(>To>x{+q!%bz%Z0| zP?tZ2VhIxgQvgRgi{vIe#((s7LJR|pbioZ^T{&a)Y=$tl`rYAftPV4Rl}?_Od;ETs z=g#h-8buev4NJ{iUrOHWO;B`*qO9JwQG1Ba`eTEEH`?;tEP}%}Lp8R#2~YQzUtAXo zSk@0eFw6S-R8|_pX)_pg1iF?=#&W@k)d7zna@S?TL;epnq`{m)e`j+$TxPEH{2_`3FvMenNuMuwkwQ)e6M!)7marrv>1k%=jCNNWlP@S&DfQ_QFfJ#qeJG6jd5# z)gJNlD9?UnJUnD7?)OUg!_n{n90%UdSKnfboe#kN($MRaaz;IWIkU&ldx4~=+ch&x zLe{s?*=u^2 zD#K4=LH6a1PGcF>mRc%VgpGO2o3|?W@Z5&g+M}lMQ^Yt_+FWpOi5U>FpRrBkO4pOf zdJYbieCJ17Xi4AvVqwF7KY@ikfO8|Od0PMC-$NeX32w4${<#>=@b?h< zLu@=kO}kUkcm9*qN$4)_2ni1`Oj=)8*Lm7NsWRwfH7_skoCICp?}lfWBKnL~!zB1? z!D-+wI8IE!>Dkm?;Gw>E{Z#iCx<+4h#X^xZJuQCbc+}-ic$h)r8EE*){S^-f_nD^A zIp|B!Rd9(@-h!?r>4OA=e}~|IDnyU(w?K&phn2duuw*)rWSh;^))s@=%9at>a`z* z*^M<^d)fD8)V)m3aZP&+jh0p{FULg2f@^T4;FYtp0*AInZJLJ@eu_B9XL~>hQk)Ly zzoo%8afH(Z`k66rna}?dsK~v}cB(CAfaLF?el{R_>;Jpx46#qkNU7Y%;n~f0FWU#Bb#--L2F#TCJm-)W<(s|YePN4Z364>| zuoKLF08+Yr7V$*=RZ$7SkyhF=y;^^<`wNm+1^9b2?C-H*D0ApUn4zo&r8T7s9mQEv z1Nmgfhdk6Fe_zY?}_lSD~)QVlcFkQI=hfI?7;2O6jYkFGN#G@9<5boEZdaN44#)z67XG+^;LJw z4eP3s;V^MrHj!(#wkAj2ayA43sBF1u z0<_$*cd-o|A1H97-HmLMN9|NTwlr>rcdBVEC`nz>PariBGH`?* z4z$-yGd%qKWUYpI-0MrV_ndxIafTZ`%{l+t@4nDff|{09fx5yE*FR&98Hq$Yf*p-| z$P>p5hGENiEyxD^dJ2NSszQ~nQ$MtDakz{rOqfM6Y zPF`MKPhP$(!&R8uqoE;N7A`q+0s6iN69izyu&x-=5xs)|yOe(%`YHHEs9h*+yL~X^ z84Y`c9l^&$GA5mWGUDo!03joTF#-cV7trgtg8nOvvtW_@(RT2Z^(-v62(Xwxx})LY z;r$gZ&JQ0x+~{^K`4%je(`v{Y)NWfIM8nj&5Q+>+a<%18TNur;fMisq1={R+v8{*_ zSoS^^gjYPv8sHDZ*3Z!P#x_Cjr6hQ!7xX#MM#%6O%Wq+=`y$#?!TqaP@o%!1`TU`K z^!Ft6hlU5RGN(R1*F!14isuv!nKlh)dMnRdX~m;zfms@IQ*pz2?TAL zXj}AM)L+vW0t!ZRf$~||i_-b@3+7m7@lU6Vr;2Cl?iGiiWZF=SWiLpHX2g~Gdwbw0 zRDDV;;i2$Fz^!F1vAjJOqTJG%Q6BnFqiL69L&I+Ld`bH{mhlR@UK1NPFE5Ekp_!T$ zR^z3f)z#HCPAgAduJ3Vre*I)JPl6&RBR+kS6cv^&|K7T6htgfnL!e26?Pad=a9~?8Ple=?U7_giizE$3$-JpDx`I{6Lwxf|TgBLn{A`O+-L`Tl}iz-_@W$ z%(B3e3MF-dSz)lI4r>n?Z@u6o+XrGfNS&z9PUG?CHMkUOufR)O10y3%8j82z-8J`+ z;UgfvHN4i>?fZaPrjhUZ^&h^!ou3L_8CKB# zhQ9A-;4N0CN&R7^A;4UuMo`a}f7OHzlYEta@b*bFUZ(HzC#_`c*r0~D9pmtmQH(OVq$UK{o-r* zd$W-s_Kc;7yhZ(0Q3jGr>ObTXL&>FI&H7KS3{4-s;my=PQZ*%mIUVpc!} zK|w-`1VuoyWLg@LjDZ{_3J6HfR9D-If&@V_0xBYsqd*Z=g2WA@+BsA^EYiOY)~z_}3BHommv{b!2{ z0ynMBlS)OjV&qm^6%hDqdu*h|2|exuIY#pzp_g9u<#G3*Nq>9+f5i&F;Z7w1+@U;w zK{DmNdg|b5KVx#^;%UE>dzG;9p$$(YN}XqCFqMKoH0fF#m1dtO2 zz^+%6reXs#LqDF65@9Cp4uHe+S7}H0;84=w2sm^40cfxLUNooY`?uC1SGF>qdy~})dHezyIfBt z3m;fbQIf-=ZCoC2kek^2vF>kJ=gP7mF09o)*o(MB=)2>dgHyKMmdA!I1vw!Qm@?%~$=K0z<->ZCZ5F1hl^!yuV)528D27$rQB7bN-uBy_CKaU`fT zxI{gGgf*W!5Bh1b;>~rNiyBmQ(IJ(f87Pkq4)?3E31*A;d`^=G#$&YzMMh#%ye}& z#rUaN3Tw68FQ}7U#OPc&f{3Z$RHD>~(lti-F%v(63Jyn0Owaqa_jVsB5#XlOgHZaL zR3!2qNR`olfmmBT@Q?7Ld(uINK-}ft@B3~XQToGb`UE1lt;bCQpZ-alWIFkYIoB8# z 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 M#P5t#$7U4$013ll`v3p{ literal 0 HcmV?d00001 diff --git a/docs/content/assets/img/getting-started/providers.png b/docs/content/assets/img/getting-started/providers.png new file mode 100644 index 0000000000000000000000000000000000000000..c1933b65697954f8496158aee02d5f3b05daf67b GIT binary patch literal 82464 zcmeFZbySs6_bv(uilCr$NJ&Z~-3UsDba!`mi3%#P0YN&I?(UQnkd#j8?(VZT_{BN* z_wn7o?j2_g8Dj_UyZ4H@W<2wmYwb_3r9~bh;UU4mz&sQaeJKY6gJ=N*1DAq$7hKWy z;dX(6LCP@|5_&BrBt-n$&f3V-!Vm^V^iz1`J%zAQv^QH<=^x%>RegCa6e$h!?CZUd zDa-d{0#r=!Z;>)GX!9EUzde0x_(JI!Ql9u@?r$Sluq}D`FX0Cq3yG$fdl()LW7~ZmYq19mVYqy46A$tWII;2`gs;aE@9X?zlHkyOM@23;D>M6?{G>Rn zF?o?A02`MolaBnSH(#sJEVjQOd9BR}-{#(#n?yGW-5f*hUQ}plwAf5tsJ%|taL)qs zqP@{e39~sH-r7a|r(`>CC7s)~-VW%9@vsky%=Y|13d`wwsnvZ_`aP6c(&z-ChY1lz zw*hJ7&fTOt$n!6#JLdDcV&cBijIll;@#RiK@vd!)<3z&H^v2HP!7|p+Jtq#*vNBv1@!?j9BvYf zf)7P6f?vaf%svzjSoYrt=K_xq?=k6c>bxThx%*xR^9KUH04x>Ucmw@wSd=&KlCYj2 zw7sC=xI_Pz=J(xY*o)tfAH5^lMhf%^)VG zZ!TtRTyWzM)0;+Z_-ZieKV;94+8}#8u7f>l(mTfF2|Aw_`}*be7!@-H!GaHxV9PhO z*Mb9F3M5$%6d`6WOOvZ!m&@u6m=74UU`f4@?=v!?EMee+>k>{+9{w88hq6nP{_M2glQEAJ&@Gz)2CK4JtbWvM#CtfD5IZ-lKe)9dyfNJsC7+M+;bS%?#2do zeaF&2(v2;^E~p)OvCe_=LB1vWcbx4D4lH_f_zKnv-wOM4cwA3hzn^x|7SYe6(Vv$a zXmz3)JT%}nP%TqZ<)Ai@|Zw@64d|i3D zY%yTk@A^$*Aa#vmd2?W+m*Cg0e)XKl?BS%N*NI6o!!rHTxznlqx&q7}pO0AdnlTE> ze`PWqEx9|UFI4n3TenKLbcTR5=kX*}i%FtvFq4Iad7OcUsYfR~TOspI^g8njYfBVY z)UH&v)K>K8pEyRUMh}hdEQ&9}F5-8ocTLj{sN+=IoHge8PSaV?$7w zSd@Dh8(OrKWtCLvOO+j#X<1JiT@1B0`u)o5ZK`x;V^~bir`pJ&`tPmc5R{)1`(R`(z|@) z@#I0~t*)J~eOg0Zli;@ILg~it5_~dpI)ALO-Ew?-W_48CHlR}!?f8?4-@U%nEB=z~ zit!5R${4m4w(-qj%eG#93pW-&$^h#8y|TML#74bANtEA9e((SOMKTidJES87`)kD4 z%CDNbUkWgF4|Iu|CYvN0iC*Cde|*aI)bMGf@X#yim#)I$!k?0{h4UeGkCU;Q0!#y1 zT7+8({Ry;ZOAUrYzowQ+AV*AT3agj7jg~H$b;?I3YLXPcEuDS&go2(rk8hKP=A&X4 zUa)cN7KBLOy}-Fx+jfG3n=@I%*y@=x$9K-JEV^WUoVFsfCZXnXs{Q5(_wwH!v5m5y z2<*NTf88e$W_4cp=of+!sR_C+$4rSoB;*Kb18D0`>@=0fJ&YwK&PtAlG2c)#z;HZ6Zn6>$r4BeXPUG0!oRGo$9Z z8}uot_MCNdxVr5k*f}mK(S#?{+s>LfwXy)gO!e3Ep_l<`s{qqA-Ua8ZCV(Gc~N*bY6IMQ4k`~dYc^cZ zItUiy@h^NXYMn_pr|Qf16OQ?oE`PimxMxjd#2e@F1PMbZ|kz$c|>)(}om=nASI=o+a$+G3JYOw3E+8GVFmn{YCKhrDgLh@?jfPA%c zdp;|_B7b2zu&&hm=<3pi+R{wC0jHZbo?{+$Or|G+mAZ}cV~27Hci4DiH`hus+oOq4VI=no{8=fUo|BDq==bQZUruJt7P|EFKI3cn1p} ze6aZcd@l@31#{>6Ivfnl2U8gMKcA5Xuh72`@PK~j=JigfAIv@Q9~yYLB*FdT(})&H zcmDAnE(P3!c_A+(CI(*R_3aD|t?W bTF%L+{+T5mmK^fx#k&K48V<$hJZI!=?%< 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 Nv^DhA31@Bp_8*hWcw+zn literal 0 HcmV?d00001 diff --git a/docs/content/assets/img/getting-started/traefik-dashboard-docker.png b/docs/content/assets/img/getting-started/traefik-dashboard-docker.png new file mode 100644 index 0000000000000000000000000000000000000000..82cbb53ad3eea7f643c39604c07a9d9b265e75f9 GIT binary patch literal 899431 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%0ApdGF?hyOq!Vytv9!0yq8=Pp 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%0A2(Ky1 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%0D>>-4Zvy_Jr*!LS=a~M89 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

    sc-0FEuf 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 + + + + + #ddee6d + + + diff --git a/webui/public/favicon-16x16.png b/webui/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3d57b6754a58210a38b166aa1dc7a129c944f2eb GIT binary patch literal 664 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 literal 0 HcmV?d00001 diff --git a/webui/public/manifest.json b/webui/public/manifest.json new file mode 100644 index 000000000..73d155b68 --- /dev/null +++ b/webui/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "Traefik Proxy", + "name": "Traefik Proxy", + "icons": [ + { + "src": "favicon-16x16.png", + "sizes": "16x16", + "type": "image/png" + }, + { + "src": "favicon-32x32.png", + "sizes": "32x32", + "type": "image/png" + }, + { + "src": "favicon-96x96.png", + "sizes": "96x96", + "type": "image/png" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#ddee6d", + "background_color": "#091827" +} diff --git a/webui/public/mockServiceWorker.js b/webui/public/mockServiceWorker.js new file mode 100644 index 000000000..34057e898 --- /dev/null +++ b/webui/public/mockServiceWorker.js @@ -0,0 +1,307 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker. + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + * - Please do NOT serve this file on production. + */ + +const PACKAGE_VERSION = '2.7.3' +const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') +const activeClientIds = new Set() + +self.addEventListener('install', function () { + self.skipWaiting() +}) + +self.addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) +}) + +self.addEventListener('message', async function (event) { + const clientId = event.source.id + + if (!clientId || !self.clients) { + return + } + + const client = await self.clients.get(clientId) + + if (!client) { + return + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, + }) + break + } + + case 'MOCK_DEACTIVATE': { + activeClientIds.delete(clientId) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } + } +}) + +self.addEventListener('fetch', function (event) { + const { request } = event + + // Bypass navigation requests. + if (request.mode === 'navigate') { + return + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been deleted (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + // Generate unique request ID. + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId)) +}) + +async function handleRequest(event, requestId) { + const client = await resolveMainClient(event) + const response = await getResponse(event, client, requestId) + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + ;(async function () { + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + body: responseClone.body, + headers: Object.fromEntries(responseClone.headers.entries()), + }, + }, + [responseClone.body], + ) + })() + } + + return response +} + +// Resolve the main client for the given event. +// Client that issues a request doesn't necessarily equal the client +// that registered the worker. It's with the latter the worker should +// communicate with during the response resolving phase. +async function resolveMainClient(event) { + const client = await self.clients.get(event.clientId) + + if (activeClientIds.has(event.clientId)) { + return client + } + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) +} + +async function getResponse(event, client, requestId) { + const { request } = event + + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = request.clone() + + function passthrough() { + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) + + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } + + return fetch(requestClone, { headers }) + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const requestBuffer = await request.arrayBuffer() + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: requestBuffer, + keepalive: request.keepalive, + }, + }, + [requestBuffer], + ) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'PASSTHROUGH': { + return passthrough() + } + } + + return passthrough() +} + +function sendToClient(client, message, transferrables = []) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel() + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } + + resolve(event.data) + } + + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)), + ) + }) +} + +async function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } + + const mockedResponse = new Response(response.body, response) + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) + + return mockedResponse +} diff --git a/webui/public/providers/consul.svg b/webui/public/providers/consul.svg deleted file mode 100644 index b9b33d374..000000000 --- a/webui/public/providers/consul.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/consulcatalog.svg b/webui/public/providers/consulcatalog.svg deleted file mode 100644 index a692dede2..000000000 --- a/webui/public/providers/consulcatalog.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - diff --git a/webui/public/providers/docker.svg b/webui/public/providers/docker.svg deleted file mode 100644 index db4a729e6..000000000 --- a/webui/public/providers/docker.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/ecs.svg b/webui/public/providers/ecs.svg deleted file mode 100644 index aad9305b5..000000000 --- a/webui/public/providers/ecs.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/public/providers/etcd.svg b/webui/public/providers/etcd.svg deleted file mode 100644 index 3c270f632..000000000 --- a/webui/public/providers/etcd.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/file.svg b/webui/public/providers/file.svg deleted file mode 100644 index bf4d1cae1..000000000 --- a/webui/public/providers/file.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/http.svg b/webui/public/providers/http.svg deleted file mode 100644 index 338e1afca..000000000 --- a/webui/public/providers/http.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/webui/public/providers/hub.svg b/webui/public/providers/hub.svg deleted file mode 100644 index 1df28d7a8..000000000 --- a/webui/public/providers/hub.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/webui/public/providers/internal.svg b/webui/public/providers/internal.svg deleted file mode 100644 index ce0fc3496..000000000 --- a/webui/public/providers/internal.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/webui/public/providers/kubernetes.svg b/webui/public/providers/kubernetes.svg deleted file mode 100644 index b6670fe5d..000000000 --- a/webui/public/providers/kubernetes.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/kubernetescrd.svg b/webui/public/providers/kubernetescrd.svg deleted file mode 100644 index b6670fe5d..000000000 --- a/webui/public/providers/kubernetescrd.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/kubernetesgateway.svg b/webui/public/providers/kubernetesgateway.svg deleted file mode 100644 index b6670fe5d..000000000 --- a/webui/public/providers/kubernetesgateway.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/kubernetesingress.svg b/webui/public/providers/kubernetesingress.svg deleted file mode 100644 index b6670fe5d..000000000 --- a/webui/public/providers/kubernetesingress.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/marathon.svg b/webui/public/providers/marathon.svg deleted file mode 100644 index 0d65d89b6..000000000 --- a/webui/public/providers/marathon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/webui/public/providers/nomad.svg b/webui/public/providers/nomad.svg deleted file mode 100755 index e71d75007..000000000 --- a/webui/public/providers/nomad.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/webui/public/providers/plugin.svg b/webui/public/providers/plugin.svg deleted file mode 100644 index 5a6a63769..000000000 --- a/webui/public/providers/plugin.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - plugin - - - - - - - \ No newline at end of file diff --git a/webui/public/providers/rancher.svg b/webui/public/providers/rancher.svg deleted file mode 100644 index 7d9a4e776..000000000 --- a/webui/public/providers/rancher.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/redis.svg b/webui/public/providers/redis.svg deleted file mode 100644 index e0944a282..000000000 --- a/webui/public/providers/redis.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/webui/public/providers/rest.svg b/webui/public/providers/rest.svg deleted file mode 100644 index 9a877e0d4..000000000 --- a/webui/public/providers/rest.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/swarm.svg b/webui/public/providers/swarm.svg deleted file mode 100644 index db4a729e6..000000000 --- a/webui/public/providers/swarm.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/webui/public/providers/zookeeper.svg b/webui/public/providers/zookeeper.svg deleted file mode 100644 index 0b9f1be63..000000000 --- a/webui/public/providers/zookeeper.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webui/public/robots.txt b/webui/public/robots.txt new file mode 100644 index 000000000..1f53798bb --- /dev/null +++ b/webui/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/webui/public/traefiklabs-hub-button-app/main-v1.js b/webui/public/traefiklabs-hub-button-app/main-v1.js index 2c912be53..9a90cc6b2 100644 --- a/webui/public/traefiklabs-hub-button-app/main-v1.js +++ b/webui/public/traefiklabs-hub-button-app/main-v1.js @@ -1,3 +1,3 @@ /* eslint-disable */ -!function(){var e={110:function(e,t,n){"use strict";var r=n(441),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},l={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},o={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function u(e){return r.isMemo(e)?o:i[e.$$typeof]||a}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=o;var s=Object.defineProperty,c=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!==typeof n){if(h){var a=p(n);a&&a!==h&&e(t,a,r)}var o=c(n);f&&(o=o.concat(f(n)));for(var i=u(t),m=u(n),g=0;g