From bfef7f0d2bb71b085398c35ec95c1b2aacd07187 Mon Sep 17 00:00:00 2001 From: arouco Date: Wed, 28 Aug 2024 00:21:10 +0200 Subject: [PATCH] feat: support multi account Datadog metrics provider (#3787) * Adding support for multi datadog accounts. Signed-off-by: Ariadna Rouco * Removing default secret name in the manifest. Signed-off-by: Ariadna Rouco * Adding secret ref to analysis template, analsys run and cluster analysis template. Signed-off-by: Ariadna Rouco * reentering removed command Signed-off-by: Ariadna Rouco * Documentation updated Signed-off-by: Ariadna Rouco * Update docs/analysis/datadog.md Co-authored-by: Thibault Jamet Signed-off-by: Ariadna Rouco * Adding removed code and removing string from log. Signed-off-by: Ariadna Rouco * Rewriting documentation with the correct flow. Signed-off-by: Ariadna Rouco * updated credential finders logic and added tests Signed-off-by: Ariadna Rouco (cherry picked from commit 36a9c0601eef055eaa88faa8cfd04fd76fc54b87) Signed-off-by: Ariadna Rouco * Added test case for credentials not found. Signed-off-by: Ariadna Rouco (cherry picked from commit 7703ff960f2b27f1fffef234d4c9a686d1375397) Signed-off-by: Ariadna Rouco * added tests for findCredential method. (cherry picked from commit eab99be055cff27cab44e76955d8a6611807aaeb) Signed-off-by: Ariadna Rouco * updating generated.pd.go Signed-off-by: Ariadna Rouco --------- Signed-off-by: Ariadna Rouco Signed-off-by: Ariadna Rouco Co-authored-by: Thibault Jamet --- .gitignore | 1 + analysis/analysis.go | 4 +- analysis/analysis_test.go | 2 +- analysis/controller.go | 2 +- analysis/controller_test.go | 4 +- docs/analysis/datadog.md | 42 + .../features/kustomize/rollout_cr_schema.json | 33 + manifests/crds/analysis-run-crd.yaml | 7 + manifests/crds/analysis-template-crd.yaml | 7 + .../crds/cluster-analysis-template-crd.yaml | 7 + manifests/install.yaml | 21 + metricproviders/datadog/datadog.go | 71 +- metricproviders/datadog/datadogV1_test.go | 43 +- metricproviders/datadog/datadogV2_test.go | 32 +- metricproviders/datadog/datadog_test.go | 70 +- metricproviders/datadog/finders.go | 79 ++ metricproviders/datadog/finders_test.go | 122 ++ metricproviders/metricproviders.go | 4 +- pkg/apiclient/rollout/rollout.swagger.json | 17 + pkg/apis/rollouts/v1alpha1/analysis_types.go | 10 + pkg/apis/rollouts/v1alpha1/generated.pb.go | 1095 ++++++++++------- pkg/apis/rollouts/v1alpha1/generated.proto | 12 + .../rollouts/v1alpha1/openapi_generated.go | 36 + .../v1alpha1/zz_generated.deepcopy.go | 17 + pkg/kubectl-argo-rollouts/info/pod_info.go | 12 +- ui/src/models/rollout/generated/api.ts | 25 + 26 files changed, 1280 insertions(+), 495 deletions(-) create mode 100644 metricproviders/datadog/finders.go create mode 100644 metricproviders/datadog/finders_test.go diff --git a/.gitignore b/.gitignore index ab4b2ac69e..ce23e23261 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ server/static/* !server/static/.gitkeep coverage-output-e2e/ coverage-output-unit/ +junit-unit-test.xml \ No newline at end of file diff --git a/analysis/analysis.go b/analysis/analysis.go index 97497c4c4d..b603d9f1ae 100644 --- a/analysis/analysis.go +++ b/analysis/analysis.go @@ -332,7 +332,7 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa logger := logutil.WithRedactor(*logutil.WithAnalysisRun(run).WithField("metric", t.metric.Name), secrets) var newMeasurement v1alpha1.Measurement - provider, providerErr := c.newProvider(*logger, t.metric) + provider, providerErr := c.newProvider(*logger, run.Namespace, t.metric) if providerErr != nil { log.Errorf("Error in getting metric provider :%v", providerErr) if t.incompleteMeasurement != nil { @@ -744,7 +744,7 @@ func (c *Controller) garbageCollectMeasurements(run *v1alpha1.AnalysisRun, measu continue } logger := logutil.WithAnalysisRun(run).WithField("metric", metric.Name) - provider, err := c.newProvider(*logger, metric) + provider, err := c.newProvider(*logger, run.Namespace, metric) if err != nil { errors = append(errors, err) continue diff --git a/analysis/analysis_test.go b/analysis/analysis_test.go index 9e7d3fe5f8..5b15af7782 100644 --- a/analysis/analysis_test.go +++ b/analysis/analysis_test.go @@ -1113,7 +1113,7 @@ func TestGarbageCollectArgResolution(t *testing.T) { defer f.Close() c, _, _ := f.newController(noResyncPeriodFunc) - c.newProvider = func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { + c.newProvider = func(logCtx log.Entry, namespace string, metric v1alpha1.Metric) (metric.Provider, error) { assert.Equal(t, "https://prometheus.kubeaddons:8080", metric.Provider.Prometheus.Address) return f.provider, nil } diff --git a/analysis/controller.go b/analysis/controller.go index 1afa6ab556..5972c9d936 100644 --- a/analysis/controller.go +++ b/analysis/controller.go @@ -54,7 +54,7 @@ type Controller struct { metricsServer *metrics.MetricsServer - newProvider func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) + newProvider func(logCtx log.Entry, namespace string, metric v1alpha1.Metric) (metric.Provider, error) // used for unit testing enqueueAnalysis func(obj any) diff --git a/analysis/controller_test.go b/analysis/controller_test.go index 601139a6d4..ad6730807c 100644 --- a/analysis/controller_test.go +++ b/analysis/controller_test.go @@ -143,7 +143,7 @@ func (f *fixture) newController(resync resyncFunc) (*Controller, informers.Share c.enqueueAnalysis(obj) } f.provider = &mocks.Provider{} - c.newProvider = func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { + c.newProvider = func(logCtx log.Entry, namespace string, metric v1alpha1.Metric) (metric.Provider, error) { return f.provider, nil } @@ -370,7 +370,7 @@ func TestFailedToCreateProviderError(t *testing.T) { f.objects = append(f.objects, ar) c, i, k8sI := f.newController(noResyncPeriodFunc) - c.newProvider = func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { + c.newProvider = func(logCtx log.Entry, namespace string, metric v1alpha1.Metric) (metric.Provider, error) { return nil, fmt.Errorf("failed to create provider") } diff --git a/docs/analysis/datadog.md b/docs/analysis/datadog.md index 7bca70be10..fe58c1565c 100644 --- a/docs/analysis/datadog.md +++ b/docs/analysis/datadog.md @@ -41,6 +41,48 @@ stringData: `apiVersion` here is different from the `apiVersion` from the Datadog configuration above. +!!! important + ###### Namespaced secret + Datadog integration supports referring to secrets inside the same namespace as argo-rollouts (by default) + or referring to a secret in the same namespace as the `AnalysisTemplate`. + + To use a secret from the `AnalysisTemplate` namespace, include a `secretRef` section in the template, specifying the `name` of the secret and setting the `namespaced` property to `true`. + + The process for retrieving Datadog credentials is as follows: + 1. **If a `secretRef` is defined in the `AnalysisTemplate`:** Argo Rollouts will search for the secret with the specified name in the namespace where the template resides. + 2. **If the secret is not found in the specified namespace:** Argo Rollouts will then check the environment variables. + 3. **If the credentials are not found in environment variables:** Argo Rollouts will look for a secret named "Datadog" in the namespace where Argo Rollouts itself is deployed. + +--- + +Let me know if there's anything else you'd like to adjust! + + ```yaml + apiVersion: argoproj.io/v1alpha1 + kind: AnalysisTemplate + metadata: + name: loq-error-rate + spec: + args: + - name: service-name + metrics: + - name: error-rate + interval: 5m + successCondition: result <= 0.01 + failureLimit: 3 + provider: + datadog: + apiVersion: v2 + interval: 5m + secretRef: + name: "mysecret" + namespaced: true + query: | + sum:requests.error.rate{service:{{args.service-name}}} + ``` + + + ### Working with Datadog API v2 !!! important diff --git a/docs/features/kustomize/rollout_cr_schema.json b/docs/features/kustomize/rollout_cr_schema.json index 2a1baf7bad..6798ef3c1a 100644 --- a/docs/features/kustomize/rollout_cr_schema.json +++ b/docs/features/kustomize/rollout_cr_schema.json @@ -280,6 +280,17 @@ }, "query": { "type": "string" + }, + "secretRef": { + "properties": { + "name": { + "type": "string" + }, + "namespaced": { + "type": "boolean" + } + }, + "type": "object" } }, "type": "object" @@ -5135,6 +5146,17 @@ }, "query": { "type": "string" + }, + "secretRef": { + "properties": { + "name": { + "type": "string" + }, + "namespaced": { + "type": "boolean" + } + }, + "type": "object" } }, "type": "object" @@ -10003,6 +10025,17 @@ }, "query": { "type": "string" + }, + "secretRef": { + "properties": { + "name": { + "type": "string" + }, + "namespaced": { + "type": "boolean" + } + }, + "type": "object" } }, "type": "object" diff --git a/manifests/crds/analysis-run-crd.yaml b/manifests/crds/analysis-run-crd.yaml index 99122a2f87..6050b5df72 100644 --- a/manifests/crds/analysis-run-crd.yaml +++ b/manifests/crds/analysis-run-crd.yaml @@ -207,6 +207,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: diff --git a/manifests/crds/analysis-template-crd.yaml b/manifests/crds/analysis-template-crd.yaml index a4bbb59116..f040d2a219 100644 --- a/manifests/crds/analysis-template-crd.yaml +++ b/manifests/crds/analysis-template-crd.yaml @@ -203,6 +203,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: diff --git a/manifests/crds/cluster-analysis-template-crd.yaml b/manifests/crds/cluster-analysis-template-crd.yaml index 3b570c7f7b..2de306119e 100644 --- a/manifests/crds/cluster-analysis-template-crd.yaml +++ b/manifests/crds/cluster-analysis-template-crd.yaml @@ -203,6 +203,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: diff --git a/manifests/install.yaml b/manifests/install.yaml index d8bb697324..df6cc0614f 100755 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -208,6 +208,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: @@ -3509,6 +3516,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: @@ -6688,6 +6702,13 @@ spec: type: object query: type: string + secretRef: + properties: + name: + type: string + namespaced: + type: boolean + type: object type: object graphite: properties: diff --git a/metricproviders/datadog/datadog.go b/metricproviders/datadog/datadog.go index 47623b6b9f..8778b51827 100644 --- a/metricproviders/datadog/datadog.go +++ b/metricproviders/datadog/datadog.go @@ -2,17 +2,14 @@ package datadog import ( "bytes" - "context" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" - "os" "reflect" "strconv" - "strings" "time" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" @@ -22,7 +19,6 @@ import ( timeutil "github.com/argoproj/argo-rollouts/utils/time" log "github.com/sirupsen/logrus" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) @@ -369,18 +365,6 @@ func (p *Provider) GarbageCollect(run *v1alpha1.AnalysisRun, metric v1alpha1.Met return nil } -func lookupKeysInEnv(keys []string) map[string]string { - valuesByKey := make(map[string]string) - for i := range keys { - key := keys[i] - formattedKey := strings.ToUpper(strings.ReplaceAll(key, "-", "_")) - if value, ok := os.LookupEnv(fmt.Sprintf("DD_%s", formattedKey)); ok { - valuesByKey[key] = value - } - } - return valuesByKey -} - // The current gen tooling we are using can't generate CRD with all the validations we need. // This is unfortunate, user has more ways to deliver an invalid Analysis Template vs // being rejected on delivery by k8s (and allowing for a validation step if desired in CI/CD). @@ -422,32 +406,13 @@ func validateIncomingProps(dd *v1alpha1.DatadogMetric) error { return nil } -func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, metric v1alpha1.Metric) (*Provider, error) { - ns := defaults.Namespace() - - apiKey := "" - appKey := "" - address := "" - secretKeys := []string{DatadogApiKey, DatadogAppKey, DatadogAddress} - envValuesByKey := lookupKeysInEnv(secretKeys) - if len(envValuesByKey) == len(secretKeys) { - apiKey = envValuesByKey[DatadogApiKey] - appKey = envValuesByKey[DatadogAppKey] - address = envValuesByKey[DatadogAddress] - } else { - secret, err := kubeclientset.CoreV1().Secrets(ns).Get(context.TODO(), DatadogTokensSecretName, metav1.GetOptions{}) - if err != nil { - return nil, err - } - apiKey = string(secret.Data[DatadogApiKey]) - appKey = string(secret.Data[DatadogAppKey]) - if _, hasAddress := secret.Data[DatadogAddress]; hasAddress { - address = string(secret.Data[DatadogAddress]) - } +func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, namespace string, metric v1alpha1.Metric) (*Provider, error) { + address, apiKey, appKey, err := findCredentials(logCtx, kubeclientset, namespace, metric) + if err != nil { + return nil, err } if apiKey != "" && appKey != "" { - err := validateIncomingProps(metric.Provider.Datadog) if err != nil { return nil, err @@ -465,3 +430,31 @@ func NewDatadogProvider(logCtx log.Entry, kubeclientset kubernetes.Interface, me return nil, errors.New("API or App token not found") } } + +func findCredentials(logCtx log.Entry, kubeclientset kubernetes.Interface, namespace string, metric v1alpha1.Metric) (string, string, string, error) { + finders := []CredentialsFinder{} + secretName := metric.Provider.Datadog.SecretRef.Name + namespaced := metric.Provider.Datadog.SecretRef.Namespaced + credentialsNs := defaults.Namespace() + + if namespaced { + credentialsNs = namespace + if secretName == "" { + return "", "", "", errors.New("secret name is required for namespaced credentials") + } + } + + if secretName != "" { + finders = append(finders, NewSecretFinder(kubeclientset, secretName, credentialsNs)) + } else { + finders = append(finders, NewEnvVariablesFinder(), NewSecretFinder(kubeclientset, DatadogTokensSecretName, defaults.Namespace())) + } + for _, finder := range finders { + address, apiKey, appKey := finder.FindCredentials(logCtx) + if address != "" && apiKey != "" && appKey != "" { + return address, apiKey, appKey, nil + } + } + + return "", "", "", errors.New("failed to find the credentials for datadog metrics provider") +} diff --git a/metricproviders/datadog/datadogV1_test.go b/metricproviders/datadog/datadogV1_test.go index af58d47617..1e10d02137 100644 --- a/metricproviders/datadog/datadogV1_test.go +++ b/metricproviders/datadog/datadogV1_test.go @@ -29,7 +29,6 @@ func TestRunSuite(t *testing.T) { Query: "avg:kubernetes.cpu.user.total{*}", }, } - ddProviderInterval10m := v1alpha1.MetricProvider{ Datadog: &v1alpha1.DatadogMetric{ Query: "avg:kubernetes.cpu.user.total{*}", @@ -37,8 +36,20 @@ func TestRunSuite(t *testing.T) { }, } + ddProviderNamespacedSecret := v1alpha1.MetricProvider{ + Datadog: &v1alpha1.DatadogMetric{ + Query: "avg:kubernetes.cpu.user.total{*}", + Interval: "10m", + SecretRef: v1alpha1.SecretRef{ + Name: "secret", + Namespaced: true, + }, + }, + } + // Test Cases tests := []struct { + name string serverURL string webServerStatus int webServerResponse string @@ -47,6 +58,7 @@ func TestRunSuite(t *testing.T) { expectedValue string expectedPhase v1alpha1.AnalysisPhase expectedErrorMessage string + expectedErrorProvider bool useEnvVarForKeys bool }{ // When last value of time series matches condition then succeed. @@ -125,7 +137,7 @@ func TestRunSuite(t *testing.T) { useEnvVarForKeys: false, }, - // Expect success with default() and data + // Expect success with Default and data { webServerStatus: 200, webServerResponse: `{"status":"ok","series":[{"pointlist":[[1598867910000,0.0020008318672513122],[1598867925000,0.006121378742186943]]}]}`, @@ -140,7 +152,7 @@ func TestRunSuite(t *testing.T) { useEnvVarForKeys: false, }, - // Expect error with no default() and no data + // Expect error with no Default and no data { webServerStatus: 200, webServerResponse: `{"status":"ok","series":[]}`, @@ -155,7 +167,7 @@ func TestRunSuite(t *testing.T) { useEnvVarForKeys: false, }, - // Expect success with default() and no data + // Expect success with Default and no data { webServerStatus: 200, webServerResponse: `{"status":"ok","series":[]}`, @@ -170,7 +182,7 @@ func TestRunSuite(t *testing.T) { useEnvVarForKeys: false, }, - // Expect failure with bad default() and no data + // Expect failure with bad Default and no data { webServerStatus: 200, webServerResponse: `{"status":"ok","series":[]}`, @@ -185,7 +197,7 @@ func TestRunSuite(t *testing.T) { useEnvVarForKeys: false, }, - // Expect success with bad default() and good data + // Expect success with bad Default and good data { webServerStatus: 200, webServerResponse: `{"status":"ok","series":[{"pointlist":[[1598867910000,0.0020008318672513122],[1598867925000,0.006121378742186943]]}]}`, @@ -226,6 +238,22 @@ func TestRunSuite(t *testing.T) { expectedErrorMessage: "parse \"://wrong.schema\": missing protocol scheme", useEnvVarForKeys: false, }, + // When secret passed name passed in the analysis template, expect success + { + webServerStatus: 200, + webServerResponse: `{"status":"ok","series":[{"pointlist":[[1598867910000,0.0020008318672513122],[1598867925000,0.0003332881882246533]]}]}`, + metric: v1alpha1.Metric{ + Name: "foo", + SuccessCondition: "result < 0.001", + FailureCondition: "result >= 0.001", + Provider: ddProviderNamespacedSecret, + }, + expectedIntervalSeconds: 600, + expectedValue: "0.0003332881882246533", + expectedPhase: v1alpha1.AnalysisPhaseSuccessful, + useEnvVarForKeys: false, + expectedErrorProvider: false, + }, } // Run @@ -320,8 +348,9 @@ func TestRunSuite(t *testing.T) { if test.metric.Provider.Datadog.Interval == "" { test.metric.Provider.Datadog.Interval = "5m" } + namespace := "namespace" - provider, _ := NewDatadogProvider(*logCtx, fakeClient, test.metric) + provider, _ := NewDatadogProvider(*logCtx, fakeClient, namespace, test.metric) metricsMetadata := provider.GetMetadata(test.metric) assert.Nil(t, metricsMetadata) diff --git a/metricproviders/datadog/datadogV2_test.go b/metricproviders/datadog/datadogV2_test.go index b8319423f3..9723580340 100644 --- a/metricproviders/datadog/datadogV2_test.go +++ b/metricproviders/datadog/datadogV2_test.go @@ -62,6 +62,21 @@ func newQueryProviderSumAggregator() v1alpha1.MetricProvider { }, } } + +func newNamespacedSecretProvider() v1alpha1.MetricProvider { + return v1alpha1.MetricProvider{ + Datadog: &v1alpha1.DatadogMetric{ + Query: "avg:kubernetes.cpu.user.total{*}", + Interval: "5m", + Aggregator: "sum", + ApiVersion: "v2", + SecretRef: v1alpha1.SecretRef{ + Name: "secret", + Namespaced: true, + }, + }, + } +} func TestRunSuiteV2(t *testing.T) { const expectedApiKey = "0123456789abcdef0123456789abcdef" const expectedAppKey = "0123456789abcdef0123456789abcdef01234567" @@ -278,6 +293,20 @@ func TestRunSuiteV2(t *testing.T) { expectedAggregator: "sum", useEnvVarForKeys: false, }, + { + webServerStatus: 200, + webServerResponse: `{"data": {"attributes": {"columns": [ {"values": [0.006121378742186943]}]}}}`, + metric: v1alpha1.Metric{ + Name: "success with default and data", + SuccessCondition: "default(result, 0) < 0.05", + Provider: newNamespacedSecretProvider(), + }, + expectedIntervalSeconds: 300, + expectedValue: "0.006121378742186943", + expectedPhase: v1alpha1.AnalysisPhaseSuccessful, + expectedAggregator: "sum", + useEnvVarForKeys: false, + }, } // Run @@ -401,8 +430,9 @@ func TestRunSuiteV2(t *testing.T) { } return true, tokenSecret, nil }) + namespace := "namespace" - provider, _ := NewDatadogProvider(*logCtx, fakeClient, test.metric) + provider, _ := NewDatadogProvider(*logCtx, fakeClient, namespace, test.metric) metricsMetadata := provider.GetMetadata(test.metric) assert.Nil(t, metricsMetadata) diff --git a/metricproviders/datadog/datadog_test.go b/metricproviders/datadog/datadog_test.go index ed81977296..4d82a24f8d 100644 --- a/metricproviders/datadog/datadog_test.go +++ b/metricproviders/datadog/datadog_test.go @@ -3,14 +3,18 @@ package datadog import ( - "log" "os" "testing" "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1" + log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/runtime" + k8sfake "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/scheme" + kubetesting "k8s.io/client-go/testing" ) func TestDatadogSpecDefaults(t *testing.T) { @@ -179,3 +183,67 @@ func TestValidateIncomingProps(t *testing.T) { }) } } + +func TestFindCredentials(t *testing.T) { + + testCases := []struct { + name string + secret *corev1.Secret + expectsError bool + metric v1alpha1.Metric + }{ + { + name: "when secretRef is set and secret found, should success", + secret: NewSecretBuilderDefaultData().Build(), + metric: newMetric("datadog", true), + }, + { + name: "when secretRef is set but secret not found, should fail", + secret: NewSecretBuilder().Build(), + metric: newMetric("datadog", true), + expectsError: true, + }, + { + name: "when secretRef name is not set but namespaced is true, should fail", + secret: NewSecretBuilder().Build(), + metric: newMetric("", true), + expectsError: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + logCtx := *log.WithField("test", "test") + fakeClient := k8sfake.NewSimpleClientset() + fakeClient.PrependReactor("get", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { + return true, testCase.secret, nil + }) + + address, apiKey, appKey, err := findCredentials(logCtx, fakeClient, "namespace", testCase.metric) + assert.Equal(t, err != nil, testCase.expectsError) + if !testCase.expectsError { + assert.Equal(t, string(testCase.secret.Data["address"]), address) + assert.Equal(t, string(testCase.secret.Data["api-key"]), apiKey) + assert.Equal(t, string(testCase.secret.Data["app-key"]), appKey) + } + }) + + } +} + +func newMetric(name string, namespaced bool) v1alpha1.Metric { + return v1alpha1.Metric{ + Provider: v1alpha1.MetricProvider{ + Datadog: &v1alpha1.DatadogMetric{ + Query: "avg:kubernetes.cpu.user.total{*}", + Interval: "5m", + Aggregator: "sum", + ApiVersion: "v2", + SecretRef: v1alpha1.SecretRef{ + Name: name, + Namespaced: namespaced, + }, + }, + }, + } +} diff --git a/metricproviders/datadog/finders.go b/metricproviders/datadog/finders.go new file mode 100644 index 0000000000..3e66121c09 --- /dev/null +++ b/metricproviders/datadog/finders.go @@ -0,0 +1,79 @@ +package datadog + +import ( + "context" + "fmt" + "os" + "strings" + + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +type CredentialsFinder interface { + FindCredentials(logCtx log.Entry) (string, string, string) +} + +func NewSecretFinder(kubeclientset kubernetes.Interface, secretName string, namespace string) *secretFinder { + return &secretFinder{ + kubeclientset: kubeclientset, + secretName: secretName, + namespace: namespace, + } +} + +type secretFinder struct { + kubeclientset kubernetes.Interface + secretName string + namespace string +} + +func (sf *secretFinder) FindCredentials(logCtx log.Entry) (string, string, string) { + address := "" + secret, err := sf.kubeclientset.CoreV1().Secrets(sf.namespace).Get(context.TODO(), sf.secretName, metav1.GetOptions{}) + if err != nil { + logCtx.Debugf("error searching for secret %s in namespace %s: %s", sf.secretName, sf.namespace, err.Error()) + return "", "", "" + } + + apiKey := string(secret.Data[DatadogApiKey]) + appKey := string(secret.Data[DatadogAppKey]) + + if apiKey == "" || appKey == "" { + logCtx.Debugf("credentials missing in secret %s in namespace %s", sf.secretName, sf.namespace) + return "", "", "" + } + if _, hasAddress := secret.Data[DatadogAddress]; hasAddress { + address = string(secret.Data[DatadogAddress]) + } + return address, apiKey, appKey +} + +type envVariablesFinder struct { +} + +func NewEnvVariablesFinder() *envVariablesFinder { + return &envVariablesFinder{} +} +func (evf *envVariablesFinder) FindCredentials(logCtx log.Entry) (string, string, string) { + secretKeys := []string{DatadogApiKey, DatadogAppKey, DatadogAddress} + envValuesByKey := lookupKeysInEnv(secretKeys) + if len(envValuesByKey) == len(secretKeys) { + return envValuesByKey[DatadogAddress], envValuesByKey[DatadogApiKey], envValuesByKey[DatadogAppKey] + } + logCtx.Debug("credentials not found as env variables") + return "", "", "" +} + +func lookupKeysInEnv(keys []string) map[string]string { + valuesByKey := make(map[string]string) + for i := range keys { + key := keys[i] + formattedKey := strings.ToUpper(strings.ReplaceAll(key, "-", "_")) + if value, ok := os.LookupEnv(fmt.Sprintf("DD_%s", formattedKey)); ok { + valuesByKey[key] = value + } + } + return valuesByKey +} diff --git a/metricproviders/datadog/finders_test.go b/metricproviders/datadog/finders_test.go new file mode 100644 index 0000000000..62f2a8b2e5 --- /dev/null +++ b/metricproviders/datadog/finders_test.go @@ -0,0 +1,122 @@ +package datadog + +import ( + "fmt" + "testing" + + log "github.com/sirupsen/logrus" + "github.com/tj/assert" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + k8sfake "k8s.io/client-go/kubernetes/fake" + kubetesting "k8s.io/client-go/testing" +) + +const ( + DatadogUrl = "datadog.com" + ApiKey = "apiKey" + AppKey = "appKey" +) + +func TestRunSuit(t *testing.T) { + + testCases := []struct { + name string + secret *corev1.Secret + expectedApiKey string + expectedAppKey string + expectedAddress string + expectError bool + }{ + { + name: "When secret valid, should be successful", + secret: NewSecretBuilder(). + WithName("DatadogTokensSecretName"). + WithData("address", []byte(DatadogUrl)). + WithData("api-key", []byte(ApiKey)). + WithData("app-key", []byte(AppKey)). + Build(), + expectedApiKey: ApiKey, + expectedAppKey: AppKey, + expectedAddress: DatadogUrl, + }, + { + name: "When secret is found but no data, should return empty values", + secret: NewSecretBuilder(). + WithName("DatadogTokensSecretName"). + Build(), + }, + { + name: "When secret not found, should return empty values", + expectError: true, + }, + } + + for _, tc := range testCases { + fakeClient := k8sfake.NewSimpleClientset() + fakeClient.PrependReactor("get", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) { + if tc.expectError { + return true, nil, fmt.Errorf("api error") + } + return true, tc.secret, nil + }) + + secretFinder := NewSecretFinder(fakeClient, "", "") + t.Run(tc.name, func(t *testing.T) { + logCtx := *log.WithField("test", "test") + + address, apiKey, appKey := secretFinder.FindCredentials(logCtx) + assert.Equal(t, tc.expectedAddress, address) + assert.Equal(t, tc.expectedApiKey, apiKey) + assert.Equal(t, tc.expectedAppKey, appKey) + }) + } + +} + +// SecretBuilder helps in constructing a corev1.Secret object +type SecretBuilder struct { + name string + data map[string][]byte +} + +// NewSecretBuilder creates a new SecretBuilder +func NewSecretBuilder() *SecretBuilder { + return &SecretBuilder{ + data: make(map[string][]byte), + } +} + +// WithName sets the name for the Secret +func (b *SecretBuilder) WithName(name string) *SecretBuilder { + b.name = name + return b +} + +// WithData sets the data for the Secret +func (b *SecretBuilder) WithData(key string, value []byte) *SecretBuilder { + b.data[key] = value + return b +} + +// Build constructs the corev1.Secret object +func (b *SecretBuilder) Build() *corev1.Secret { + return &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: b.name, + }, + Data: b.data, + } +} + +// NewSecretBuilderDefaultData creates a new SecretBuilder with default values +func NewSecretBuilderDefaultData() *SecretBuilder { + return &SecretBuilder{ + data: map[string][]byte{ + "address": []byte("datadog.com"), + "api-key": []byte("apiKey"), + "app-key": []byte("appKey"), + }, + } +} diff --git a/metricproviders/metricproviders.go b/metricproviders/metricproviders.go index 916fc85aa2..565935e00b 100644 --- a/metricproviders/metricproviders.go +++ b/metricproviders/metricproviders.go @@ -43,7 +43,7 @@ type ProviderFactory struct { type ProviderFactoryFunc func(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) // NewProvider creates the correct provider based on the provider type of the Metric -func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) (metric.Provider, error) { +func (f *ProviderFactory) NewProvider(logCtx log.Entry, namespace string, metric v1alpha1.Metric) (metric.Provider, error) { switch provider := Type(metric); provider { case prometheus.ProviderType: api, err := prometheus.NewPrometheusAPI(metric) @@ -72,7 +72,7 @@ func (f *ProviderFactory) NewProvider(logCtx log.Entry, metric v1alpha1.Metric) } return webmetric.NewWebMetricProvider(logCtx, c, p), nil case datadog.ProviderType: - return datadog.NewDatadogProvider(logCtx, f.KubeClient, metric) + return datadog.NewDatadogProvider(logCtx, f.KubeClient, namespace, metric) case wavefront.ProviderType: client, err := wavefront.NewWavefrontAPI(metric, f.KubeClient) if err != nil { diff --git a/pkg/apiclient/rollout/rollout.swagger.json b/pkg/apiclient/rollout/rollout.swagger.json index 2fb5247d85..2e6cd847b0 100755 --- a/pkg/apiclient/rollout/rollout.swagger.json +++ b/pkg/apiclient/rollout/rollout.swagger.json @@ -1217,6 +1217,10 @@ "aggregator": { "type": "string", "title": "+kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area\nAggregator is a type of aggregator to use for metrics-based queries (default: \"\"). Used for v2" + }, + "secretRef": { + "$ref": "#/definitions/github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretRef", + "title": "Secret refers to the name of the secret that should be used for an analysis and should exists in the namespace where the controller is.\n+optional" } } }, @@ -2470,6 +2474,19 @@ } } }, + "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretRef": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name refers to the name of the secret that should be used to integrate with Datadog." + }, + "namespaced": { + "type": "boolean", + "title": "Namespaced indicates whether the secret is in the namespace where rollouts it installed or in the namespace where the metric was found" + } + } + }, "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetCanaryScale": { "type": "object", "properties": { diff --git a/pkg/apis/rollouts/v1alpha1/analysis_types.go b/pkg/apis/rollouts/v1alpha1/analysis_types.go index 90762ef66b..bef20a9120 100644 --- a/pkg/apis/rollouts/v1alpha1/analysis_types.go +++ b/pkg/apis/rollouts/v1alpha1/analysis_types.go @@ -620,4 +620,14 @@ type DatadogMetric struct { // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area // Aggregator is a type of aggregator to use for metrics-based queries (default: ""). Used for v2 Aggregator string `json:"aggregator,omitempty" protobuf:"bytes,6,opt,name=aggregator"` + // Secret refers to the name of the secret that should be used for an analysis and should exists in the namespace where the controller is. + // +optional + SecretRef SecretRef `json:"secretRef,omitempty" protobuf:"bytes,7,opt,name=secretRef"` +} + +type SecretRef struct { + // Name refers to the name of the secret that should be used to integrate with Datadog. + Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` + // Namespaced indicates whether the secret is in the namespace where rollouts it installed or in the namespace where the metric was found + Namespaced bool `json:"namespaced,omitempty" protobuf:"varint,2,opt,namespaced=dryRun"` } diff --git a/pkg/apis/rollouts/v1alpha1/generated.pb.go b/pkg/apis/rollouts/v1alpha1/generated.pb.go index 9f2149493e..74fbc1259e 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.pb.go +++ b/pkg/apis/rollouts/v1alpha1/generated.pb.go @@ -2713,10 +2713,38 @@ func (m *SecretKeyRef) XXX_DiscardUnknown() { var xxx_messageInfo_SecretKeyRef proto.InternalMessageInfo +func (m *SecretRef) Reset() { *m = SecretRef{} } +func (*SecretRef) ProtoMessage() {} +func (*SecretRef) Descriptor() ([]byte, []int) { + return fileDescriptor_e0e705f843545fab, []int{95} +} +func (m *SecretRef) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SecretRef) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SecretRef) XXX_Merge(src proto.Message) { + xxx_messageInfo_SecretRef.Merge(m, src) +} +func (m *SecretRef) XXX_Size() int { + return m.Size() +} +func (m *SecretRef) XXX_DiscardUnknown() { + xxx_messageInfo_SecretRef.DiscardUnknown(m) +} + +var xxx_messageInfo_SecretRef proto.InternalMessageInfo + func (m *SetCanaryScale) Reset() { *m = SetCanaryScale{} } func (*SetCanaryScale) ProtoMessage() {} func (*SetCanaryScale) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{95} + return fileDescriptor_e0e705f843545fab, []int{96} } func (m *SetCanaryScale) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2744,7 +2772,7 @@ var xxx_messageInfo_SetCanaryScale proto.InternalMessageInfo func (m *SetHeaderRoute) Reset() { *m = SetHeaderRoute{} } func (*SetHeaderRoute) ProtoMessage() {} func (*SetHeaderRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{96} + return fileDescriptor_e0e705f843545fab, []int{97} } func (m *SetHeaderRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2772,7 +2800,7 @@ var xxx_messageInfo_SetHeaderRoute proto.InternalMessageInfo func (m *SetMirrorRoute) Reset() { *m = SetMirrorRoute{} } func (*SetMirrorRoute) ProtoMessage() {} func (*SetMirrorRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{97} + return fileDescriptor_e0e705f843545fab, []int{98} } func (m *SetMirrorRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2800,7 +2828,7 @@ var xxx_messageInfo_SetMirrorRoute proto.InternalMessageInfo func (m *Sigv4Config) Reset() { *m = Sigv4Config{} } func (*Sigv4Config) ProtoMessage() {} func (*Sigv4Config) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{98} + return fileDescriptor_e0e705f843545fab, []int{99} } func (m *Sigv4Config) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2828,7 +2856,7 @@ var xxx_messageInfo_Sigv4Config proto.InternalMessageInfo func (m *SkyWalkingMetric) Reset() { *m = SkyWalkingMetric{} } func (*SkyWalkingMetric) ProtoMessage() {} func (*SkyWalkingMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{99} + return fileDescriptor_e0e705f843545fab, []int{100} } func (m *SkyWalkingMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2856,7 +2884,7 @@ var xxx_messageInfo_SkyWalkingMetric proto.InternalMessageInfo func (m *StepPluginStatus) Reset() { *m = StepPluginStatus{} } func (*StepPluginStatus) ProtoMessage() {} func (*StepPluginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{100} + return fileDescriptor_e0e705f843545fab, []int{101} } func (m *StepPluginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2884,7 +2912,7 @@ var xxx_messageInfo_StepPluginStatus proto.InternalMessageInfo func (m *StickinessConfig) Reset() { *m = StickinessConfig{} } func (*StickinessConfig) ProtoMessage() {} func (*StickinessConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{101} + return fileDescriptor_e0e705f843545fab, []int{102} } func (m *StickinessConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2912,7 +2940,7 @@ var xxx_messageInfo_StickinessConfig proto.InternalMessageInfo func (m *StringMatch) Reset() { *m = StringMatch{} } func (*StringMatch) ProtoMessage() {} func (*StringMatch) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{102} + return fileDescriptor_e0e705f843545fab, []int{103} } func (m *StringMatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2940,7 +2968,7 @@ var xxx_messageInfo_StringMatch proto.InternalMessageInfo func (m *TCPRoute) Reset() { *m = TCPRoute{} } func (*TCPRoute) ProtoMessage() {} func (*TCPRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{103} + return fileDescriptor_e0e705f843545fab, []int{104} } func (m *TCPRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2968,7 +2996,7 @@ var xxx_messageInfo_TCPRoute proto.InternalMessageInfo func (m *TLSRoute) Reset() { *m = TLSRoute{} } func (*TLSRoute) ProtoMessage() {} func (*TLSRoute) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{104} + return fileDescriptor_e0e705f843545fab, []int{105} } func (m *TLSRoute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2996,7 +3024,7 @@ var xxx_messageInfo_TLSRoute proto.InternalMessageInfo func (m *TTLStrategy) Reset() { *m = TTLStrategy{} } func (*TTLStrategy) ProtoMessage() {} func (*TTLStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{105} + return fileDescriptor_e0e705f843545fab, []int{106} } func (m *TTLStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3024,7 +3052,7 @@ var xxx_messageInfo_TTLStrategy proto.InternalMessageInfo func (m *TemplateService) Reset() { *m = TemplateService{} } func (*TemplateService) ProtoMessage() {} func (*TemplateService) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{106} + return fileDescriptor_e0e705f843545fab, []int{107} } func (m *TemplateService) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3052,7 +3080,7 @@ var xxx_messageInfo_TemplateService proto.InternalMessageInfo func (m *TemplateSpec) Reset() { *m = TemplateSpec{} } func (*TemplateSpec) ProtoMessage() {} func (*TemplateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{107} + return fileDescriptor_e0e705f843545fab, []int{108} } func (m *TemplateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3080,7 +3108,7 @@ var xxx_messageInfo_TemplateSpec proto.InternalMessageInfo func (m *TemplateStatus) Reset() { *m = TemplateStatus{} } func (*TemplateStatus) ProtoMessage() {} func (*TemplateStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{108} + return fileDescriptor_e0e705f843545fab, []int{109} } func (m *TemplateStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3108,7 +3136,7 @@ var xxx_messageInfo_TemplateStatus proto.InternalMessageInfo func (m *TraefikTrafficRouting) Reset() { *m = TraefikTrafficRouting{} } func (*TraefikTrafficRouting) ProtoMessage() {} func (*TraefikTrafficRouting) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{109} + return fileDescriptor_e0e705f843545fab, []int{110} } func (m *TraefikTrafficRouting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3136,7 +3164,7 @@ var xxx_messageInfo_TraefikTrafficRouting proto.InternalMessageInfo func (m *TrafficWeights) Reset() { *m = TrafficWeights{} } func (*TrafficWeights) ProtoMessage() {} func (*TrafficWeights) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{110} + return fileDescriptor_e0e705f843545fab, []int{111} } func (m *TrafficWeights) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3164,7 +3192,7 @@ var xxx_messageInfo_TrafficWeights proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{111} + return fileDescriptor_e0e705f843545fab, []int{112} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3192,7 +3220,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *WavefrontMetric) Reset() { *m = WavefrontMetric{} } func (*WavefrontMetric) ProtoMessage() {} func (*WavefrontMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{112} + return fileDescriptor_e0e705f843545fab, []int{113} } func (m *WavefrontMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3220,7 +3248,7 @@ var xxx_messageInfo_WavefrontMetric proto.InternalMessageInfo func (m *WebMetric) Reset() { *m = WebMetric{} } func (*WebMetric) ProtoMessage() {} func (*WebMetric) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{113} + return fileDescriptor_e0e705f843545fab, []int{114} } func (m *WebMetric) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3248,7 +3276,7 @@ var xxx_messageInfo_WebMetric proto.InternalMessageInfo func (m *WebMetricHeader) Reset() { *m = WebMetricHeader{} } func (*WebMetricHeader) ProtoMessage() {} func (*WebMetricHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{114} + return fileDescriptor_e0e705f843545fab, []int{115} } func (m *WebMetricHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3276,7 +3304,7 @@ var xxx_messageInfo_WebMetricHeader proto.InternalMessageInfo func (m *WeightDestination) Reset() { *m = WeightDestination{} } func (*WeightDestination) ProtoMessage() {} func (*WeightDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_e0e705f843545fab, []int{115} + return fileDescriptor_e0e705f843545fab, []int{116} } func (m *WeightDestination) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3409,6 +3437,7 @@ func init() { proto.RegisterType((*SMITrafficRouting)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SMITrafficRouting") proto.RegisterType((*ScopeDetail)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.ScopeDetail") proto.RegisterType((*SecretKeyRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretKeyRef") + proto.RegisterType((*SecretRef)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SecretRef") proto.RegisterType((*SetCanaryScale)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetCanaryScale") proto.RegisterType((*SetHeaderRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetHeaderRoute") proto.RegisterType((*SetMirrorRoute)(nil), "github.com.argoproj.argo_rollouts.pkg.apis.rollouts.v1alpha1.SetMirrorRoute") @@ -3437,16 +3466,16 @@ func init() { } var fileDescriptor_e0e705f843545fab = []byte{ - // 8922 bytes of a gzipped FileDescriptorProto + // 8969 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x64, 0xd7, 0x75, 0x98, 0x1e, 0x87, 0x43, 0xce, 0x9c, 0xe1, 0x92, 0xdc, 0xbb, 0xbb, 0x12, 0x45, 0x69, 0x97, 0xeb, 0xa7, 0x54, 0x5d, 0xc5, 0x32, 0x69, 0xaf, 0xa4, 0x54, 0xb6, 0x5c, 0xb5, 0x33, 0xe4, 0xae, 0x96, 0x2b, 0x72, 0x97, 0x3a, 0xc3, 0xd5, 0xc6, 0x1f, 0x4a, 0xfc, 0x38, 0x73, 0x39, 0x7c, 0xcb, 0x99, 0xf7, 0xc6, 0xef, 0xbd, 0xe1, 0x2e, 0x65, 0x21, 0x96, 0x6d, 0x28, 0x76, 0x5c, 0x1b, 0x71, 0x93, 0x18, 0x45, 0x3f, 0x50, 0xb8, 0x41, 0x8a, 0xb4, 0x4d, 0x7f, 0x14, 0x81, 0x8b, 0xf6, 0x47, - 0x80, 0x16, 0x75, 0x53, 0xd8, 0x40, 0x5d, 0x38, 0x3f, 0x5a, 0xa7, 0x05, 0xc2, 0xd4, 0x4c, 0xff, + 0x80, 0x16, 0x75, 0x53, 0x38, 0x40, 0x5d, 0x38, 0x3f, 0x5a, 0xa7, 0x05, 0xc2, 0xd4, 0x4c, 0xff, 0x34, 0x68, 0x61, 0xa4, 0x70, 0x11, 0x54, 0x3f, 0x8a, 0xe2, 0x7e, 0xbe, 0xfb, 0xde, 0xbc, 0xe1, - 0xd7, 0x3c, 0xae, 0x94, 0x26, 0xff, 0x66, 0xee, 0x39, 0xf7, 0x9c, 0xf3, 0xee, 0xe7, 0xb9, 0xe7, + 0xd7, 0x3c, 0xae, 0x94, 0xc6, 0xff, 0x66, 0xee, 0x39, 0xf7, 0x9c, 0xf3, 0xee, 0xe7, 0xb9, 0xe7, 0x9e, 0x73, 0x2e, 0xac, 0xb4, 0xdc, 0x68, 0xab, 0xb7, 0x31, 0xdf, 0xf0, 0x3b, 0x0b, 0x4e, 0xd0, 0xf2, 0xbb, 0x81, 0x7f, 0x8f, 0xff, 0xf8, 0x50, 0xe0, 0xb7, 0xdb, 0x7e, 0x2f, 0x0a, 0x17, 0xba, 0xdb, 0xad, 0x05, 0xa7, 0xeb, 0x86, 0x0b, 0xba, 0x64, 0xe7, 0x23, 0x4e, 0xbb, 0xbb, 0xe5, 0x7c, @@ -3458,7 +3487,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x07, 0x34, 0x0b, 0xe7, 0xf9, 0x18, 0xa7, 0xe3, 0x34, 0xb6, 0x5c, 0x8f, 0x06, 0xbb, 0xf1, 0x57, 0x77, 0x68, 0xe4, 0x64, 0xd5, 0x5a, 0x18, 0x54, 0x2b, 0xe8, 0x79, 0x91, 0xdb, 0xa1, 0x7d, 0x15, 0x7e, 0xe6, 0xb0, 0x0a, 0x61, 0x63, 0x8b, 0x76, 0x9c, 0xbe, 0x7a, 0xcf, 0x0d, 0xaa, 0xd7, 0x8b, - 0xdc, 0xf6, 0x82, 0xeb, 0x45, 0x61, 0x14, 0xa4, 0x2b, 0xd9, 0x3f, 0x2e, 0x40, 0xb9, 0xba, 0x52, + 0xdc, 0xf6, 0x82, 0xeb, 0x45, 0x61, 0x14, 0xa4, 0x2b, 0xd9, 0x3f, 0x2a, 0x40, 0xb9, 0xba, 0x52, 0xab, 0x47, 0x4e, 0xd4, 0x0b, 0xc9, 0x2f, 0x5a, 0x30, 0xd1, 0xf6, 0x9d, 0x66, 0xcd, 0x69, 0x3b, 0x5e, 0x83, 0x06, 0x33, 0xd6, 0x65, 0xeb, 0x4a, 0xe5, 0xea, 0xca, 0xfc, 0x30, 0xfd, 0x35, 0x5f, 0xbd, 0x1f, 0x22, 0x0d, 0xfd, 0x5e, 0xd0, 0xa0, 0x48, 0x37, 0x6b, 0xe7, 0xbf, 0xbb, 0x37, 0xf7, @@ -3490,7 +3519,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x6f, 0x39, 0x1d, 0x8a, 0x1c, 0x42, 0x9e, 0x82, 0xe2, 0x8e, 0xd3, 0xee, 0x51, 0xde, 0x48, 0xe5, 0xda, 0x19, 0x89, 0x52, 0x7c, 0x9d, 0x15, 0xa2, 0x80, 0x91, 0xb7, 0xa0, 0xcc, 0x7f, 0x5c, 0x0f, 0xfc, 0x4e, 0x4e, 0x9f, 0x26, 0x25, 0x7c, 0x5d, 0x91, 0x15, 0xc3, 0x4f, 0xff, 0xc5, 0x98, 0xa1, - 0xfd, 0x87, 0x16, 0x4c, 0x19, 0x1f, 0xb7, 0xe2, 0x86, 0x11, 0xf9, 0x74, 0xdf, 0xe0, 0x99, 0x3f, + 0xfd, 0x47, 0x16, 0x4c, 0x19, 0x1f, 0xb7, 0xe2, 0x86, 0x11, 0xf9, 0x74, 0xdf, 0xe0, 0x99, 0x3f, 0xda, 0xe0, 0x61, 0xb5, 0xf9, 0xd0, 0x99, 0x96, 0x5f, 0x5a, 0x52, 0x25, 0xc6, 0xc0, 0xf1, 0xa0, 0xe8, 0x46, 0xb4, 0x13, 0xce, 0x8c, 0x5c, 0x2e, 0x5c, 0xa9, 0x5c, 0x5d, 0xce, 0xad, 0x1b, 0xe3, 0xf6, 0x5d, 0x66, 0xf4, 0x51, 0xb0, 0xb1, 0xbf, 0x5d, 0x48, 0x74, 0xdf, 0xaa, 0x92, 0xe3, 0x1d, @@ -3525,7 +3554,7 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0xf6, 0xbc, 0x1b, 0x6e, 0x18, 0xf9, 0xc1, 0xee, 0x8a, 0xdb, 0x71, 0x23, 0x3e, 0xa0, 0x8b, 0xb5, 0x8b, 0xfb, 0x7b, 0x73, 0x8f, 0xd7, 0x07, 0x21, 0xe1, 0xe0, 0xfa, 0xc4, 0x81, 0x27, 0x7a, 0xde, 0x60, 0xf2, 0xe2, 0xf8, 0x31, 0xb7, 0xbf, 0x37, 0xf7, 0xc4, 0x9d, 0xc1, 0x68, 0x78, 0x10, 0x0d, - 0xfb, 0x8f, 0x2d, 0xb6, 0x0d, 0x89, 0xef, 0x5a, 0xa7, 0x9d, 0x6e, 0x9b, 0x2d, 0x9d, 0xa7, 0xaf, + 0xfb, 0x4f, 0x2c, 0xb6, 0x0d, 0x89, 0xef, 0x5a, 0xa7, 0x9d, 0x6e, 0x9b, 0x2d, 0x9d, 0xa7, 0xaf, 0x1c, 0x47, 0x09, 0xe5, 0x18, 0xf3, 0xd9, 0xcb, 0x95, 0xfc, 0x83, 0x34, 0x64, 0xfb, 0xbf, 0x5b, 0x70, 0x3e, 0x8d, 0xfc, 0x10, 0x14, 0xba, 0x30, 0xa9, 0xd0, 0xdd, 0xca, 0xf7, 0x6b, 0x07, 0x68, 0x75, 0xbf, 0x64, 0x0c, 0x58, 0x85, 0x8a, 0x74, 0x93, 0xbc, 0x08, 0x13, 0x91, 0xfc, 0x7b, 0x2b, @@ -3555,11 +3584,11 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x00, 0xb9, 0xc3, 0x27, 0xa7, 0xfd, 0x86, 0x1e, 0xf5, 0xc9, 0x31, 0x77, 0x84, 0x79, 0x6d, 0xc3, 0x18, 0x9f, 0x3a, 0x6a, 0x62, 0x03, 0xdb, 0x83, 0xf9, 0x9c, 0x0a, 0x51, 0x42, 0xec, 0xef, 0x58, 0x50, 0x3a, 0x86, 0xed, 0x73, 0x2e, 0x69, 0xfb, 0x2c, 0xf7, 0xd9, 0x3d, 0xa3, 0x7e, 0xbb, 0xe7, - 0x2b, 0xc3, 0xf5, 0xc6, 0x51, 0xec, 0x9d, 0x3f, 0xb6, 0xe0, 0x6c, 0x9f, 0x7d, 0x94, 0x6c, 0xc1, + 0x2b, 0xc3, 0xf5, 0xc6, 0x51, 0xec, 0x9d, 0x3f, 0xb2, 0xe0, 0x6c, 0x9f, 0x7d, 0x94, 0x6c, 0xc1, 0xf9, 0xae, 0xdf, 0x54, 0xdb, 0xe9, 0x0d, 0x27, 0xdc, 0xe2, 0x30, 0xf9, 0x79, 0xcf, 0xb3, 0x9e, 0x5c, 0xcb, 0x80, 0xbf, 0xbb, 0x37, 0x37, 0xa3, 0x89, 0xa4, 0x10, 0x30, 0x93, 0x22, 0xe9, 0x42, 0x69, 0xd3, 0xa5, 0xed, 0x66, 0x3c, 0x04, 0x87, 0xd4, 0xd2, 0xae, 0x4b, 0x6a, 0xe2, 0x6a, 0x40, - 0xfd, 0x43, 0xcd, 0xc5, 0xfe, 0x89, 0x05, 0x93, 0xd5, 0x5e, 0xb4, 0xc5, 0x74, 0x94, 0x06, 0xb7, + 0xfd, 0x43, 0xcd, 0xc5, 0xfe, 0xb1, 0x05, 0x93, 0xd5, 0x5e, 0xb4, 0xc5, 0x74, 0x94, 0x06, 0xb7, 0xc6, 0x11, 0x0f, 0x8a, 0xa1, 0xdb, 0xda, 0x79, 0x3e, 0x9f, 0xc5, 0xb8, 0xce, 0x48, 0xc9, 0x2b, 0x12, 0xad, 0xac, 0xf3, 0x42, 0x14, 0x6c, 0x48, 0x00, 0x63, 0xbe, 0xd3, 0x8b, 0xb6, 0xae, 0xca, 0x4f, 0x1e, 0xd2, 0x32, 0x71, 0x9b, 0x7d, 0xce, 0x55, 0xc9, 0x51, 0xab, 0x8c, 0xa2, 0x14, 0x25, @@ -3597,405 +3626,408 @@ var fileDescriptor_e0e705f843545fab = []byte{ 0x67, 0x54, 0x85, 0x98, 0x66, 0x4f, 0xbe, 0x6e, 0xa9, 0xad, 0x51, 0x4b, 0x74, 0xe6, 0xb4, 0x24, 0x22, 0xf1, 0x4e, 0xab, 0x05, 0x4a, 0x31, 0x27, 0x3f, 0x07, 0xb3, 0xce, 0x86, 0x1f, 0x44, 0x99, 0x93, 0x6f, 0x66, 0x92, 0x4f, 0xa3, 0x4b, 0xfb, 0x7b, 0x73, 0xb3, 0xd5, 0x81, 0x58, 0x78, 0x00, - 0x05, 0xfb, 0x7b, 0x63, 0x30, 0x21, 0x4e, 0x42, 0x72, 0xeb, 0xfa, 0x1d, 0x0b, 0x9e, 0x6c, 0xf4, - 0x82, 0x80, 0x7a, 0x51, 0x3d, 0xa2, 0xdd, 0xfe, 0x8d, 0xcb, 0x3a, 0xd5, 0x8d, 0xeb, 0xf2, 0xfe, - 0xde, 0xdc, 0x93, 0x8b, 0x07, 0xf0, 0xc7, 0x03, 0xa5, 0x23, 0xff, 0xc1, 0x02, 0x5b, 0x22, 0xd4, - 0x9c, 0xc6, 0x76, 0x2b, 0xf0, 0x7b, 0x5e, 0xb3, 0xff, 0x23, 0x46, 0x4e, 0xf5, 0x23, 0x9e, 0xde, - 0xdf, 0x9b, 0xb3, 0x17, 0x0f, 0x95, 0x02, 0x8f, 0x20, 0x29, 0x79, 0x05, 0xce, 0x4a, 0xac, 0x6b, - 0x0f, 0xba, 0x34, 0x70, 0xd9, 0x99, 0x43, 0x2a, 0x8e, 0xb1, 0x6f, 0x5a, 0x1a, 0x01, 0xfb, 0xeb, - 0x90, 0x10, 0xc6, 0xef, 0x53, 0xb7, 0xb5, 0x15, 0x29, 0xf5, 0x69, 0x48, 0x87, 0x34, 0x69, 0x15, - 0xb9, 0x2b, 0x68, 0xd6, 0x2a, 0xfb, 0x7b, 0x73, 0xe3, 0xf2, 0x0f, 0x2a, 0x4e, 0xe4, 0x16, 0x4c, - 0x8a, 0x73, 0xea, 0x9a, 0xeb, 0xb5, 0xd6, 0x7c, 0x4f, 0x78, 0x55, 0x95, 0x6b, 0x4f, 0xab, 0x0d, - 0xbf, 0x9e, 0x80, 0xbe, 0xbb, 0x37, 0x37, 0xa1, 0x7e, 0xaf, 0xef, 0x76, 0x29, 0xa6, 0x6a, 0x93, - 0xbf, 0x63, 0x01, 0x09, 0x23, 0xda, 0x5d, 0x6b, 0xf7, 0x5a, 0xae, 0x6c, 0x22, 0xe9, 0x1f, 0x95, - 0x83, 0xab, 0x56, 0x92, 0x6e, 0x6d, 0x56, 0x0a, 0x49, 0xea, 0x7d, 0x1c, 0x31, 0x43, 0x0a, 0xfb, - 0xdb, 0xe3, 0x00, 0x6a, 0x2e, 0xd1, 0x2e, 0xf9, 0x20, 0x94, 0x43, 0x1a, 0x89, 0x26, 0x91, 0xd7, - 0x5c, 0xe2, 0x72, 0x52, 0x15, 0x62, 0x0c, 0x27, 0xdb, 0x50, 0xec, 0x3a, 0xbd, 0x90, 0xe6, 0x73, - 0xb8, 0x91, 0x23, 0x73, 0x8d, 0x51, 0x14, 0xa7, 0x66, 0xfe, 0x13, 0x05, 0x0f, 0xf2, 0x25, 0x0b, - 0x80, 0x26, 0x47, 0xd3, 0xd0, 0xd6, 0x2b, 0xc9, 0x32, 0x1e, 0x70, 0xac, 0x0d, 0x6a, 0x93, 0xfb, - 0x7b, 0x73, 0x60, 0x8c, 0x4b, 0x83, 0x2d, 0xb9, 0x0f, 0x25, 0x47, 0x6d, 0x48, 0xa3, 0xa7, 0xb1, - 0x21, 0xf1, 0xc3, 0xac, 0x9e, 0x51, 0x9a, 0x19, 0xf9, 0x8a, 0x05, 0x93, 0x21, 0x8d, 0x64, 0x57, - 0xb1, 0x65, 0x51, 0x6a, 0xe3, 0x43, 0xce, 0x88, 0x7a, 0x82, 0xa6, 0x58, 0xde, 0x93, 0x65, 0x98, - 0xe2, 0xab, 0x44, 0xb9, 0x41, 0x9d, 0x26, 0x0d, 0xb8, 0xad, 0x44, 0xaa, 0x79, 0xc3, 0x8b, 0x62, - 0xd0, 0xd4, 0xa2, 0x18, 0x65, 0x98, 0xe2, 0xab, 0x44, 0x59, 0x75, 0x83, 0xc0, 0x97, 0xa2, 0x94, - 0x72, 0x12, 0xc5, 0xa0, 0xa9, 0x45, 0x31, 0xca, 0x30, 0xc5, 0x97, 0xb4, 0x61, 0xac, 0xcb, 0xa7, - 0x96, 0x54, 0xe5, 0x86, 0xbc, 0x23, 0x57, 0xd3, 0x94, 0x76, 0x85, 0x4d, 0x4a, 0xfc, 0x47, 0xc9, - 0xc3, 0xfe, 0xd6, 0x19, 0x98, 0x54, 0xd3, 0x36, 0x3e, 0xe4, 0x08, 0x43, 0xe0, 0x80, 0x43, 0xce, - 0xa2, 0x09, 0xc4, 0x24, 0x2e, 0xab, 0x2c, 0x56, 0xad, 0xe4, 0x19, 0x47, 0x57, 0xae, 0x9b, 0x40, - 0x4c, 0xe2, 0x92, 0x0e, 0x14, 0xd9, 0xca, 0xa2, 0xdc, 0x2f, 0x86, 0xfc, 0xf2, 0x78, 0x35, 0x32, - 0x8c, 0x2a, 0x8c, 0x3c, 0x0a, 0x2e, 0xdc, 0x96, 0x1d, 0x25, 0xcc, 0xdb, 0x72, 0x2a, 0xe6, 0xb3, - 0x1a, 0x24, 0x2d, 0xe7, 0xa2, 0xef, 0x93, 0x65, 0x98, 0x62, 0x9f, 0x71, 0xee, 0x29, 0x9e, 0xe2, - 0xb9, 0xe7, 0x93, 0x50, 0xea, 0x38, 0x0f, 0xea, 0xbd, 0xa0, 0x75, 0xf2, 0xf3, 0x95, 0x74, 0xa7, - 0x15, 0x54, 0x50, 0xd3, 0x23, 0x5f, 0xb0, 0x8c, 0x05, 0x4e, 0xf8, 0x5a, 0xdc, 0xcd, 0x77, 0x81, - 0xd3, 0x6a, 0xc3, 0xc0, 0xa5, 0xae, 0xef, 0x14, 0x52, 0x7a, 0xe8, 0xa7, 0x10, 0xa6, 0x51, 0x8b, - 0x09, 0xa2, 0x35, 0xea, 0xf2, 0xa9, 0x6a, 0xd4, 0x8b, 0x09, 0x66, 0x98, 0x62, 0xce, 0xe5, 0x11, - 0x73, 0x4e, 0xcb, 0x03, 0xa7, 0x2a, 0x4f, 0x3d, 0xc1, 0x0c, 0x53, 0xcc, 0x07, 0x1f, 0xbd, 0x2b, - 0xa7, 0x73, 0xf4, 0x9e, 0xc8, 0xe1, 0xe8, 0x7d, 0xf0, 0xa9, 0xe4, 0xcc, 0xb0, 0xa7, 0x12, 0x72, - 0x13, 0x48, 0x73, 0xd7, 0x73, 0x3a, 0x6e, 0x43, 0x2e, 0x96, 0x7c, 0x93, 0x9e, 0xe4, 0xa6, 0x19, - 0xad, 0x95, 0x2d, 0xf5, 0x61, 0x60, 0x46, 0x2d, 0x12, 0x41, 0xa9, 0xab, 0x94, 0xcf, 0xa9, 0x3c, - 0x46, 0xbf, 0x52, 0x46, 0x85, 0x0b, 0x0d, 0x9b, 0x78, 0xaa, 0x04, 0x35, 0x27, 0xb2, 0x02, 0xe7, - 0x3b, 0xae, 0xb7, 0xe6, 0x37, 0xc3, 0x35, 0x1a, 0x48, 0xc3, 0x53, 0x9d, 0x46, 0x33, 0xd3, 0xbc, - 0x6d, 0xb8, 0x31, 0x61, 0x35, 0x03, 0x8e, 0x99, 0xb5, 0xec, 0xff, 0x6d, 0xc1, 0xf4, 0x62, 0xdb, - 0xef, 0x35, 0xef, 0x3a, 0x51, 0x63, 0x4b, 0x78, 0x6c, 0x90, 0x97, 0xa1, 0xe4, 0x7a, 0x11, 0x0d, - 0x76, 0x9c, 0xb6, 0xdc, 0x9f, 0x6c, 0x65, 0x49, 0x5e, 0x96, 0xe5, 0xef, 0xee, 0xcd, 0x4d, 0x2e, - 0xf5, 0x02, 0x6e, 0xb0, 0x17, 0xab, 0x15, 0xea, 0x3a, 0xe4, 0x5b, 0x16, 0x9c, 0x15, 0x3e, 0x1f, - 0x4b, 0x4e, 0xe4, 0xbc, 0xd6, 0xa3, 0x81, 0x4b, 0x95, 0xd7, 0xc7, 0x90, 0x0b, 0x55, 0x5a, 0x56, - 0xc5, 0x60, 0x37, 0x3e, 0xb3, 0xac, 0xa6, 0x39, 0x63, 0xbf, 0x30, 0xf6, 0xaf, 0x16, 0xe0, 0xf1, - 0x81, 0xb4, 0xc8, 0x2c, 0x8c, 0xb8, 0x4d, 0xf9, 0xe9, 0x20, 0xe9, 0x8e, 0x2c, 0x37, 0x71, 0xc4, - 0x6d, 0x92, 0x79, 0xae, 0xe1, 0x06, 0x34, 0x0c, 0xd5, 0xdd, 0x7b, 0x59, 0x2b, 0xa3, 0xb2, 0x14, - 0x0d, 0x0c, 0x32, 0x07, 0x45, 0xee, 0x4a, 0x2d, 0x8f, 0x56, 0x5c, 0x67, 0xe6, 0x5e, 0xcb, 0x28, - 0xca, 0xc9, 0x17, 0x2d, 0x00, 0x21, 0x20, 0xd3, 0xf7, 0xe5, 0x2e, 0x89, 0xf9, 0x36, 0x13, 0xa3, - 0x2c, 0xa4, 0x8c, 0xff, 0xa3, 0xc1, 0x95, 0xac, 0xc3, 0x18, 0x53, 0x9f, 0xfd, 0xe6, 0x89, 0x37, - 0x45, 0xa1, 0x00, 0x71, 0x1a, 0x28, 0x69, 0xb1, 0xb6, 0x0a, 0x68, 0xd4, 0x0b, 0x3c, 0xd6, 0xb4, - 0x7c, 0x1b, 0x2c, 0x09, 0x29, 0x50, 0x97, 0xa2, 0x81, 0x61, 0xff, 0x8b, 0x11, 0x38, 0x9f, 0x25, - 0x3a, 0xdb, 0x6d, 0xc6, 0x84, 0xb4, 0xd2, 0x4a, 0xf0, 0xb3, 0xf9, 0xb7, 0x8f, 0x74, 0x5f, 0xd2, - 0x37, 0x36, 0xd2, 0x97, 0x54, 0xf2, 0x25, 0x3f, 0xab, 0x5b, 0x68, 0xe4, 0x84, 0x2d, 0xa4, 0x29, - 0xa7, 0x5a, 0xe9, 0x32, 0x8c, 0x86, 0xac, 0xe7, 0x0b, 0xc9, 0x9b, 0x1f, 0xde, 0x47, 0x1c, 0xc2, - 0x30, 0x7a, 0x9e, 0x1b, 0xc9, 0xf8, 0x23, 0x8d, 0x71, 0xc7, 0x73, 0x23, 0xe4, 0x10, 0xfb, 0x9b, - 0x23, 0x30, 0x3b, 0xf8, 0xa3, 0xc8, 0x37, 0x2d, 0x80, 0x26, 0x3b, 0x1c, 0x85, 0xdc, 0x89, 0x5f, - 0xb8, 0x7b, 0x39, 0xa7, 0xd5, 0x86, 0x4b, 0x8a, 0x53, 0xec, 0x87, 0xa8, 0x8b, 0x42, 0x34, 0x04, - 0x21, 0x57, 0xd5, 0xd0, 0xe7, 0xb7, 0x56, 0x62, 0x32, 0xe9, 0x3a, 0xab, 0x1a, 0x82, 0x06, 0x16, - 0x3b, 0xfd, 0x7a, 0x4e, 0x87, 0x86, 0x5d, 0x47, 0x47, 0x73, 0xf1, 0xd3, 0xef, 0x2d, 0x55, 0x88, - 0x31, 0xdc, 0x6e, 0xc3, 0x53, 0x47, 0x90, 0x33, 0xa7, 0x60, 0x19, 0xfb, 0x4f, 0x2c, 0x78, 0x4c, - 0x7a, 0xe2, 0xfd, 0xb9, 0x71, 0xeb, 0xfc, 0x53, 0x0b, 0x9e, 0x18, 0xf0, 0xcd, 0x0f, 0xc1, 0xbb, - 0xf3, 0xcd, 0xa4, 0x77, 0xe7, 0x9d, 0x61, 0x87, 0x74, 0xe6, 0x77, 0x0c, 0x70, 0xf2, 0xfc, 0x5e, - 0x01, 0xce, 0xb0, 0x65, 0xab, 0xe9, 0xb7, 0x72, 0xda, 0x38, 0x9f, 0x82, 0xe2, 0x67, 0xd9, 0x06, - 0x94, 0x1e, 0x64, 0x7c, 0x57, 0x42, 0x01, 0x23, 0x5f, 0xb2, 0x60, 0xfc, 0xb3, 0x72, 0x4f, 0x15, - 0x67, 0xb9, 0x21, 0x17, 0xc3, 0xc4, 0x37, 0xcc, 0xcb, 0x1d, 0x52, 0xc4, 0xe0, 0x68, 0x5f, 0x4e, - 0xb5, 0x95, 0x2a, 0xce, 0xe4, 0x19, 0x18, 0xdf, 0xf4, 0x83, 0x4e, 0xaf, 0xed, 0xa4, 0x03, 0x3f, - 0xaf, 0x8b, 0x62, 0x54, 0x70, 0x36, 0xc9, 0x9d, 0xae, 0xfb, 0x3a, 0x0d, 0x42, 0x11, 0x92, 0x91, - 0x98, 0xe4, 0x55, 0x0d, 0x41, 0x03, 0x8b, 0xd7, 0x69, 0xb5, 0x02, 0xda, 0x72, 0x22, 0x3f, 0xe0, - 0x3b, 0x87, 0x59, 0x47, 0x43, 0xd0, 0xc0, 0x9a, 0xfd, 0x18, 0x4c, 0x98, 0xc2, 0x1f, 0x2b, 0x9e, - 0xe7, 0xe3, 0x20, 0x9d, 0x3a, 0x53, 0x4b, 0x92, 0x75, 0x94, 0x25, 0xc9, 0xfe, 0x4f, 0x23, 0x60, - 0xd8, 0xa2, 0x1e, 0xc2, 0x54, 0xf7, 0x12, 0x53, 0x7d, 0x48, 0x3b, 0x8a, 0x61, 0x59, 0x1b, 0x14, - 0xdd, 0xb8, 0x93, 0x8a, 0x6e, 0xbc, 0x95, 0x1b, 0xc7, 0x83, 0x83, 0x1b, 0x7f, 0x68, 0xc1, 0x13, - 0x31, 0x72, 0xbf, 0x0d, 0xfb, 0xf0, 0x75, 0xfb, 0x05, 0xa8, 0x38, 0x71, 0x35, 0x39, 0xb1, 0x8c, - 0xd0, 0x32, 0x0d, 0x42, 0x13, 0x2f, 0x0e, 0x8b, 0x29, 0x9c, 0x30, 0x2c, 0x66, 0xf4, 0xe0, 0xb0, - 0x18, 0xfb, 0x27, 0x23, 0x70, 0xb1, 0xff, 0xcb, 0x4c, 0x5f, 0xf1, 0xc3, 0xbf, 0x2d, 0xed, 0x4d, - 0x3e, 0x72, 0x62, 0x6f, 0xf2, 0xc2, 0x51, 0xbd, 0xc9, 0xb5, 0x0f, 0xf7, 0xe8, 0xa9, 0xfb, 0x70, - 0xd7, 0xe1, 0x82, 0x72, 0x18, 0xbd, 0xee, 0x07, 0x32, 0x36, 0x44, 0xad, 0x20, 0xa5, 0xda, 0x45, - 0x59, 0xe5, 0x02, 0x66, 0x21, 0x61, 0x76, 0x5d, 0xfb, 0x87, 0x05, 0x38, 0x17, 0x37, 0xfb, 0xa2, - 0xef, 0x35, 0x5d, 0xee, 0x73, 0xf4, 0x12, 0x8c, 0x46, 0xbb, 0x5d, 0xd5, 0xd8, 0x7f, 0x59, 0x89, - 0xb3, 0xbe, 0xdb, 0x65, 0xbd, 0xfd, 0x58, 0x46, 0x15, 0x7e, 0x8b, 0xc0, 0x2b, 0x91, 0x15, 0x3d, - 0x3b, 0x44, 0x0f, 0x3c, 0x9f, 0x1c, 0xcd, 0xef, 0xee, 0xcd, 0x65, 0x64, 0x79, 0x98, 0xd7, 0x94, - 0x92, 0x63, 0x9e, 0xdc, 0x83, 0xc9, 0xb6, 0x13, 0x46, 0x77, 0xba, 0x4d, 0x27, 0xa2, 0xeb, 0xae, - 0xf4, 0xe6, 0x39, 0x5e, 0x38, 0x8d, 0x76, 0x7b, 0x58, 0x49, 0x50, 0xc2, 0x14, 0x65, 0xb2, 0x03, - 0x84, 0x95, 0xac, 0x07, 0x8e, 0x17, 0x8a, 0xaf, 0x62, 0xfc, 0x8e, 0x1f, 0x1b, 0xa5, 0x8f, 0xce, - 0x2b, 0x7d, 0xd4, 0x30, 0x83, 0x03, 0x79, 0x1a, 0xc6, 0x02, 0xea, 0x84, 0x7a, 0x3b, 0xd0, 0xf3, - 0x1f, 0x79, 0x29, 0x4a, 0xa8, 0x39, 0xa1, 0xc6, 0x0e, 0x99, 0x50, 0x7f, 0x60, 0xc1, 0x64, 0xdc, - 0x4d, 0x0f, 0x41, 0xf5, 0xe8, 0x24, 0x55, 0x8f, 0x1b, 0x79, 0x2d, 0x89, 0x03, 0xb4, 0x8d, 0x3f, - 0x1e, 0x37, 0xbf, 0x8f, 0x07, 0x70, 0x7c, 0xce, 0xf4, 0xe7, 0xb7, 0xf2, 0x88, 0xaa, 0x4b, 0x68, - 0x7b, 0x07, 0x3a, 0xf2, 0x33, 0x5d, 0xa7, 0x29, 0xf5, 0x18, 0x39, 0xec, 0xb5, 0xae, 0xa3, 0xf4, - 0x9b, 0x2c, 0x5d, 0x47, 0xd5, 0x21, 0x77, 0xe0, 0xb1, 0x6e, 0xe0, 0xf3, 0x3c, 0x03, 0x4b, 0xd4, - 0x69, 0xb6, 0x5d, 0x8f, 0x2a, 0x33, 0x8f, 0xf0, 0xba, 0x79, 0x62, 0x7f, 0x6f, 0xee, 0xb1, 0xb5, - 0x6c, 0x14, 0x1c, 0x54, 0x37, 0x19, 0xa9, 0x3a, 0x7a, 0x84, 0x48, 0xd5, 0x5f, 0xd2, 0xc6, 0x54, - 0x1d, 0x14, 0xf1, 0xa9, 0xbc, 0xba, 0x32, 0x2b, 0x3c, 0x42, 0x0f, 0xa9, 0xaa, 0x64, 0x8a, 0x9a, - 0xfd, 0x60, 0x8b, 0xdd, 0xd8, 0x09, 0x2d, 0x76, 0x71, 0x1c, 0xcc, 0xf8, 0x7b, 0x19, 0x07, 0x53, - 0x7a, 0x5f, 0xc5, 0xc1, 0x7c, 0xcb, 0x82, 0x73, 0x4e, 0x7f, 0x04, 0x7a, 0x3e, 0xc6, 0xe3, 0x8c, - 0xd0, 0xf6, 0xda, 0x13, 0x52, 0xc8, 0xac, 0x40, 0x7f, 0xcc, 0x12, 0xc5, 0x7e, 0xa7, 0x08, 0xd3, - 0x69, 0x25, 0xe9, 0xf4, 0x43, 0x75, 0x7f, 0xc5, 0x82, 0x69, 0x35, 0xc1, 0xf5, 0x0d, 0xb8, 0x38, - 0x62, 0xac, 0xe4, 0xb4, 0xae, 0x08, 0x75, 0x4f, 0x67, 0x50, 0x59, 0x4f, 0x71, 0xc3, 0x3e, 0xfe, - 0xe4, 0x0d, 0xa8, 0xe8, 0x5b, 0x95, 0x13, 0xc5, 0xed, 0xf2, 0xd0, 0xd2, 0x6a, 0x4c, 0x02, 0x4d, - 0x7a, 0xe4, 0x1d, 0x0b, 0xa0, 0xa1, 0x76, 0xe2, 0x9c, 0xa2, 0xa2, 0x32, 0xb4, 0x85, 0x58, 0x9f, - 0xd7, 0x45, 0x21, 0x1a, 0x8c, 0xc9, 0xaf, 0xf2, 0xfb, 0x14, 0x3d, 0x12, 0x94, 0xe7, 0xc1, 0x27, - 0xf2, 0x5e, 0x8a, 0x62, 0x5f, 0x12, 0xad, 0xed, 0x19, 0xa0, 0x10, 0x13, 0x42, 0xd8, 0x2f, 0x81, - 0xf6, 0xd9, 0x66, 0x2b, 0x2b, 0xf7, 0xda, 0x5e, 0x73, 0xa2, 0x2d, 0x39, 0x04, 0xf5, 0xca, 0x7a, - 0x5d, 0x01, 0x30, 0xc6, 0xb1, 0x3f, 0x03, 0x93, 0xaf, 0x04, 0x4e, 0x77, 0xcb, 0xe5, 0xf7, 0x16, - 0xec, 0x7c, 0xfc, 0x0c, 0x8c, 0x3b, 0xcd, 0x66, 0x56, 0xb2, 0x9f, 0xaa, 0x28, 0x46, 0x05, 0x3f, - 0xd2, 0x51, 0xd8, 0xfe, 0x77, 0x16, 0x90, 0xf8, 0xa6, 0xd9, 0xf5, 0x5a, 0xab, 0x4e, 0xd4, 0xd8, - 0x62, 0x47, 0xb8, 0x2d, 0x5e, 0x9a, 0x75, 0x84, 0xbb, 0xa1, 0x21, 0x68, 0x60, 0x91, 0xb7, 0xa0, - 0x22, 0xfe, 0xbd, 0xae, 0x0f, 0x88, 0xc3, 0xbb, 0x9e, 0xf3, 0x3d, 0x8f, 0xcb, 0x24, 0x46, 0xe1, - 0x8d, 0x98, 0x03, 0x9a, 0xec, 0x58, 0x53, 0x2d, 0x7b, 0x9b, 0xed, 0xde, 0x83, 0xe6, 0x46, 0xdc, - 0x54, 0xdd, 0xc0, 0xdf, 0x74, 0xdb, 0x34, 0xdd, 0x54, 0x6b, 0xa2, 0x18, 0x15, 0xfc, 0x68, 0x4d, - 0xf5, 0x6f, 0x2d, 0x38, 0xbf, 0x1c, 0x46, 0xae, 0xbf, 0x44, 0xc3, 0x88, 0xed, 0x7c, 0x6c, 0x7d, - 0xec, 0xb5, 0x8f, 0x12, 0x7e, 0xb1, 0x04, 0xd3, 0xf2, 0x1e, 0xba, 0xb7, 0x11, 0xd2, 0xc8, 0x38, - 0x6a, 0xe8, 0x79, 0xbc, 0x98, 0x82, 0x63, 0x5f, 0x0d, 0x46, 0x45, 0x5e, 0x48, 0xc7, 0x54, 0x0a, - 0x49, 0x2a, 0xf5, 0x14, 0x1c, 0xfb, 0x6a, 0xd8, 0x3f, 0x28, 0xc0, 0x39, 0xfe, 0x19, 0xa9, 0xd0, - 0xa9, 0xaf, 0x0f, 0x0a, 0x9d, 0x1a, 0x72, 0x2a, 0x73, 0x5e, 0x27, 0x08, 0x9c, 0xfa, 0x9b, 0x16, - 0x4c, 0x35, 0x93, 0x2d, 0x9d, 0x8f, 0x5d, 0x2e, 0xab, 0x0f, 0x85, 0x07, 0x62, 0xaa, 0x10, 0xd3, - 0xfc, 0xc9, 0xaf, 0x59, 0x30, 0x95, 0x14, 0x53, 0xad, 0xee, 0xa7, 0xd0, 0x48, 0x3a, 0x64, 0x20, - 0x59, 0x1e, 0x62, 0x5a, 0x04, 0xfb, 0xfb, 0x23, 0xb2, 0x4b, 0x4f, 0x23, 0x2e, 0x88, 0xdc, 0x87, - 0x72, 0xd4, 0x0e, 0x45, 0xa1, 0xfc, 0xda, 0x21, 0x0f, 0xad, 0xeb, 0x2b, 0x75, 0xe1, 0x70, 0x12, - 0xeb, 0x95, 0xb2, 0x84, 0xe9, 0xc7, 0x8a, 0x17, 0x67, 0xdc, 0xe8, 0x4a, 0xc6, 0xb9, 0x9c, 0x96, - 0xd7, 0x17, 0xd7, 0xd2, 0x8c, 0x65, 0x09, 0x63, 0xac, 0x78, 0xd9, 0xbf, 0x65, 0x41, 0xf9, 0xa6, - 0xaf, 0xd6, 0x91, 0x9f, 0xcb, 0xc1, 0x16, 0xa5, 0x55, 0x56, 0xad, 0xb4, 0xc4, 0xa7, 0xa0, 0x97, - 0x13, 0x96, 0xa8, 0x27, 0x0d, 0xda, 0xf3, 0x3c, 0xe7, 0x21, 0x23, 0x75, 0xd3, 0xdf, 0x18, 0x68, - 0x3e, 0xfe, 0xf5, 0x22, 0x9c, 0x79, 0xd5, 0xd9, 0xa5, 0x5e, 0xe4, 0x1c, 0x7f, 0x93, 0x78, 0x01, - 0x2a, 0x4e, 0x97, 0xdf, 0x65, 0x1a, 0xc7, 0x90, 0xd8, 0xb8, 0x13, 0x83, 0xd0, 0xc4, 0x8b, 0x17, - 0x34, 0x11, 0xa4, 0x93, 0xb5, 0x14, 0x2d, 0xa6, 0xe0, 0xd8, 0x57, 0x83, 0xdc, 0x04, 0x22, 0x03, - 0xdb, 0xab, 0x8d, 0x86, 0xdf, 0xf3, 0xc4, 0x92, 0x26, 0xec, 0x3e, 0xfa, 0x3c, 0xbc, 0xda, 0x87, - 0x81, 0x19, 0xb5, 0xc8, 0xa7, 0x61, 0xa6, 0xc1, 0x29, 0xcb, 0xd3, 0x91, 0x49, 0x51, 0x9c, 0x90, - 0x75, 0xd8, 0xcb, 0xe2, 0x00, 0x3c, 0x1c, 0x48, 0x81, 0x49, 0x1a, 0x46, 0x7e, 0xe0, 0xb4, 0xa8, - 0x49, 0x77, 0x2c, 0x29, 0x69, 0xbd, 0x0f, 0x03, 0x33, 0x6a, 0x91, 0xcf, 0x43, 0x39, 0xda, 0x0a, - 0x68, 0xb8, 0xe5, 0xb7, 0x9b, 0xd2, 0xf7, 0x64, 0x48, 0x63, 0xa0, 0xec, 0xfd, 0x75, 0x45, 0xd5, - 0x18, 0xde, 0xaa, 0x08, 0x63, 0x9e, 0x24, 0x80, 0xb1, 0xb0, 0xe1, 0x77, 0x69, 0x28, 0x4f, 0x15, - 0x37, 0x73, 0xe1, 0xce, 0x8d, 0x5b, 0x86, 0x19, 0x92, 0x73, 0x40, 0xc9, 0xc9, 0xfe, 0xdd, 0x11, - 0x98, 0x30, 0x11, 0x8f, 0xb0, 0x36, 0x7d, 0xc9, 0x82, 0x89, 0x86, 0xef, 0x45, 0x81, 0xdf, 0x8e, - 0x13, 0x36, 0x0c, 0xaf, 0x51, 0x30, 0x52, 0x4b, 0x34, 0x72, 0xdc, 0xb6, 0x61, 0xad, 0x33, 0xd8, - 0x60, 0x82, 0x29, 0xf9, 0x9a, 0x05, 0x53, 0xb1, 0x63, 0x64, 0x6c, 0xeb, 0xcb, 0x55, 0x10, 0xbd, - 0xd4, 0x5f, 0x4b, 0x72, 0xc2, 0x34, 0x6b, 0x7b, 0x03, 0xa6, 0xd3, 0xbd, 0xcd, 0x9a, 0xb2, 0xeb, - 0xc8, 0xb9, 0x5e, 0x88, 0x9b, 0x72, 0xcd, 0x09, 0x43, 0xe4, 0x10, 0xf2, 0x2c, 0x94, 0x3a, 0x4e, - 0xd0, 0x72, 0x3d, 0xa7, 0xcd, 0x5b, 0xb1, 0x60, 0x2c, 0x48, 0xb2, 0x1c, 0x35, 0x86, 0xfd, 0x61, - 0x98, 0x58, 0x75, 0xbc, 0x16, 0x6d, 0xca, 0x75, 0xf8, 0xf0, 0xc8, 0xd4, 0x3f, 0x1a, 0x85, 0x8a, - 0x71, 0x7c, 0x3c, 0xfd, 0x73, 0x56, 0x22, 0x11, 0x51, 0x21, 0xc7, 0x44, 0x44, 0x9f, 0x04, 0xd8, - 0x74, 0x3d, 0x37, 0xdc, 0x3a, 0x61, 0x8a, 0x23, 0x7e, 0x37, 0x7f, 0x5d, 0x53, 0x40, 0x83, 0x5a, - 0x7c, 0x01, 0x5a, 0x3c, 0x20, 0x5b, 0xe0, 0x3b, 0x96, 0xb1, 0xdd, 0x8c, 0xe5, 0xe1, 0xf0, 0x61, - 0x74, 0xcc, 0xbc, 0xda, 0x7e, 0xc4, 0xdd, 0xd4, 0x41, 0xbb, 0xd2, 0x3a, 0x94, 0x02, 0x1a, 0xf6, - 0x3a, 0xf4, 0x44, 0xc9, 0x88, 0xb8, 0xeb, 0x0d, 0xca, 0xfa, 0xa8, 0x29, 0xcd, 0xbe, 0x04, 0x67, - 0x12, 0x22, 0x1c, 0xeb, 0x86, 0xc9, 0x87, 0x4c, 0x1b, 0xc5, 0x49, 0xee, 0x9b, 0x58, 0x5f, 0xb4, - 0x8d, 0x24, 0x44, 0xba, 0x2f, 0x84, 0x83, 0x95, 0x80, 0xd9, 0x3f, 0x19, 0x03, 0xe9, 0xc3, 0x70, - 0x84, 0xe5, 0xca, 0xbc, 0xb9, 0x1c, 0x39, 0xc1, 0xcd, 0xe5, 0x4d, 0x98, 0x70, 0x3d, 0x37, 0x72, - 0x9d, 0x36, 0xb7, 0x3f, 0xc9, 0xed, 0x54, 0x39, 0xe3, 0x4f, 0x2c, 0x1b, 0xb0, 0x0c, 0x3a, 0x89, - 0xba, 0xe4, 0x35, 0x28, 0xf2, 0xfd, 0x46, 0x0e, 0xe0, 0xe3, 0x3b, 0x5a, 0x70, 0x1f, 0x1b, 0x11, - 0xa1, 0x27, 0x28, 0xf1, 0xc3, 0x87, 0xc8, 0xc2, 0xa4, 0x8f, 0xdf, 0x72, 0x1c, 0xc7, 0x87, 0x8f, - 0x14, 0x1c, 0xfb, 0x6a, 0x30, 0x2a, 0x9b, 0x8e, 0xdb, 0xee, 0x05, 0x34, 0xa6, 0x32, 0x96, 0xa4, - 0x72, 0x3d, 0x05, 0xc7, 0xbe, 0x1a, 0x64, 0x13, 0x26, 0x64, 0x99, 0x70, 0x9b, 0x1b, 0x3f, 0xe1, - 0x57, 0x72, 0xf7, 0xc8, 0xeb, 0x06, 0x25, 0x4c, 0xd0, 0x25, 0x3d, 0x38, 0xeb, 0x7a, 0x0d, 0xdf, - 0x6b, 0xb4, 0x7b, 0xa1, 0xbb, 0x43, 0xe3, 0xf0, 0xb8, 0x93, 0x30, 0xbb, 0xb0, 0xbf, 0x37, 0x77, - 0x76, 0x39, 0x4d, 0x0e, 0xfb, 0x39, 0x90, 0x2f, 0x58, 0x70, 0xa1, 0xe1, 0x7b, 0x21, 0xcf, 0xe2, - 0xb1, 0x43, 0xaf, 0x05, 0x81, 0x1f, 0x08, 0xde, 0xe5, 0x13, 0xf2, 0xe6, 0x66, 0xcf, 0xc5, 0x2c, - 0x92, 0x98, 0xcd, 0x89, 0xbc, 0x09, 0xa5, 0x6e, 0xe0, 0xef, 0xb8, 0x4d, 0x1a, 0x48, 0x17, 0xcc, - 0x95, 0x3c, 0x52, 0x1b, 0xad, 0x49, 0x9a, 0xf1, 0xd2, 0xa3, 0x4a, 0x50, 0xf3, 0xb3, 0xff, 0x6f, - 0x05, 0x26, 0x93, 0xe8, 0xe4, 0x17, 0x00, 0xba, 0x81, 0xdf, 0xa1, 0xd1, 0x16, 0xd5, 0x61, 0x4e, - 0xb7, 0x86, 0x4d, 0x5e, 0xa3, 0xe8, 0x29, 0xb7, 0x25, 0xb6, 0x5c, 0xc4, 0xa5, 0x68, 0x70, 0x24, - 0x01, 0x8c, 0x6f, 0x8b, 0x6d, 0x57, 0x6a, 0x21, 0xaf, 0xe6, 0xa2, 0x33, 0x49, 0xce, 0x3c, 0x3e, - 0x47, 0x16, 0xa1, 0x62, 0x44, 0x36, 0xa0, 0x70, 0x9f, 0x6e, 0xe4, 0x93, 0x39, 0xe1, 0x2e, 0x95, - 0xa7, 0x99, 0xda, 0xf8, 0xfe, 0xde, 0x5c, 0xe1, 0x2e, 0xdd, 0x40, 0x46, 0x9c, 0x7d, 0x57, 0x53, - 0xf8, 0x2e, 0xc8, 0xa5, 0xe2, 0xd5, 0x1c, 0x1d, 0x21, 0xc4, 0x77, 0xc9, 0x22, 0x54, 0x8c, 0xc8, - 0x9b, 0x50, 0xbe, 0xef, 0xec, 0xd0, 0xcd, 0xc0, 0xf7, 0x22, 0xe9, 0x2b, 0x37, 0x64, 0x70, 0xc9, - 0x5d, 0x45, 0x4e, 0xf2, 0xe5, 0xdb, 0xbb, 0x2e, 0xc4, 0x98, 0x1d, 0xd9, 0x81, 0x92, 0x47, 0xef, - 0x23, 0x6d, 0xbb, 0x8d, 0x7c, 0x82, 0x39, 0x6e, 0x49, 0x6a, 0x92, 0x33, 0xdf, 0xf7, 0x54, 0x19, - 0x6a, 0x5e, 0xac, 0x2f, 0xef, 0xf9, 0x1b, 0x72, 0xa1, 0x1a, 0xb2, 0x2f, 0xf5, 0xc9, 0x54, 0xf4, - 0xe5, 0x4d, 0x7f, 0x03, 0x19, 0x71, 0x36, 0x47, 0x1a, 0xda, 0x51, 0x4b, 0x2e, 0x53, 0xb7, 0xf2, - 0x75, 0x50, 0x13, 0x73, 0x24, 0x2e, 0x45, 0x83, 0x23, 0x6b, 0xdb, 0x96, 0x34, 0x56, 0xca, 0x85, - 0x6a, 0xc8, 0xb6, 0x4d, 0x9a, 0x3e, 0x45, 0xdb, 0xaa, 0x32, 0xd4, 0xbc, 0x18, 0x5f, 0x57, 0x5a, - 0xfe, 0xf2, 0x59, 0xaa, 0x92, 0x76, 0x44, 0xc1, 0x57, 0x95, 0xa1, 0xe6, 0xc5, 0xda, 0x3b, 0xdc, - 0xde, 0xbd, 0xef, 0xb4, 0xb7, 0x5d, 0xaf, 0x25, 0xc3, 0x76, 0x87, 0x0d, 0x73, 0xdb, 0xde, 0xbd, - 0x2b, 0xe8, 0x99, 0xed, 0x1d, 0x97, 0xa2, 0xc1, 0x91, 0xfc, 0x3d, 0x4b, 0x87, 0xe2, 0x4c, 0xe4, - 0xe1, 0xc4, 0x94, 0x5c, 0x72, 0x65, 0x64, 0x8e, 0x50, 0x14, 0x7f, 0x5a, 0xfb, 0x5d, 0xf2, 0xc2, - 0xaf, 0xfe, 0xe1, 0xdc, 0x0c, 0xf5, 0x1a, 0x7e, 0xd3, 0xf5, 0x5a, 0x0b, 0xf7, 0x42, 0xdf, 0x9b, - 0x47, 0xe7, 0xbe, 0xd2, 0xd1, 0xa5, 0x4c, 0xb3, 0x1f, 0x85, 0x8a, 0x41, 0xe2, 0x30, 0x45, 0x6f, - 0xc2, 0x54, 0xf4, 0x7e, 0x6b, 0x0c, 0x26, 0xcc, 0x3c, 0xa4, 0x47, 0xd0, 0xbe, 0xf4, 0x89, 0x63, - 0xe4, 0x38, 0x27, 0x0e, 0x76, 0xc4, 0x34, 0x2e, 0xb8, 0x94, 0x79, 0x6b, 0x39, 0x37, 0x85, 0x3b, - 0x3e, 0x62, 0x1a, 0x85, 0x21, 0x26, 0x98, 0x1e, 0xc3, 0xe7, 0x85, 0xa9, 0xad, 0x42, 0xb1, 0x2b, - 0x26, 0xd5, 0xd6, 0x84, 0xaa, 0x76, 0x15, 0x20, 0x4e, 0x98, 0x29, 0x2f, 0x3e, 0xb5, 0x3e, 0x6c, - 0x24, 0xf2, 0x34, 0xb0, 0xc8, 0xd3, 0x30, 0xc6, 0x54, 0x1f, 0xda, 0x94, 0x59, 0x05, 0xf4, 0x39, - 0xfe, 0x3a, 0x2f, 0x45, 0x09, 0x25, 0x2f, 0x32, 0x2d, 0x35, 0x56, 0x58, 0x64, 0xb2, 0x80, 0xf3, - 0xb1, 0x96, 0x1a, 0xc3, 0x30, 0x81, 0xc9, 0x44, 0xa7, 0x4c, 0xbf, 0xe0, 0x6b, 0x83, 0x21, 0x3a, - 0x57, 0x3a, 0x50, 0xc0, 0xb8, 0x5d, 0x29, 0xa5, 0x8f, 0xf0, 0x39, 0x5d, 0x34, 0xec, 0x4a, 0x29, - 0x38, 0xf6, 0xd5, 0x60, 0x1f, 0x23, 0xef, 0x6c, 0x2b, 0xc2, 0x61, 0x7a, 0xc0, 0x6d, 0xeb, 0x2f, - 0x9a, 0x67, 0xad, 0x1c, 0xe7, 0x90, 0x18, 0xb5, 0x47, 0x3f, 0x6c, 0x0d, 0x77, 0x2c, 0xfa, 0xb2, - 0x05, 0x93, 0xc9, 0x6d, 0x28, 0xef, 0xab, 0x0f, 0xf2, 0x97, 0x60, 0x3c, 0x72, 0x3b, 0xd4, 0xef, - 0x89, 0xc3, 0x76, 0x41, 0xec, 0xec, 0xeb, 0xa2, 0x08, 0x15, 0xcc, 0xfe, 0x87, 0x63, 0x70, 0xee, - 0x56, 0xcb, 0xf5, 0xd2, 0xb9, 0xe1, 0xb2, 0x1e, 0x82, 0xb0, 0x8e, 0xfd, 0x10, 0x84, 0x8e, 0xdd, - 0x93, 0xcf, 0x2c, 0x64, 0xc7, 0xee, 0xa9, 0x37, 0x2f, 0x92, 0xb8, 0xe4, 0x0f, 0x2c, 0x78, 0xd2, - 0x69, 0x8a, 0xf3, 0x83, 0xd3, 0x96, 0xa5, 0x46, 0xfe, 0x72, 0x39, 0xf3, 0xc3, 0x21, 0xb5, 0x81, - 0xfe, 0x8f, 0x9f, 0xaf, 0x1e, 0xc0, 0x55, 0x8c, 0x8c, 0x9f, 0x92, 0x5f, 0xf0, 0xe4, 0x41, 0xa8, - 0x78, 0xa0, 0xf8, 0xe4, 0xaf, 0xc2, 0x54, 0xe2, 0x83, 0xa5, 0xc5, 0xbc, 0x2c, 0x2e, 0x36, 0xea, - 0x49, 0x10, 0xa6, 0x71, 0xc9, 0xf7, 0x2d, 0x98, 0x11, 0xe6, 0xd9, 0x8c, 0xa6, 0x11, 0x37, 0xba, - 0x7e, 0xfe, 0x4d, 0xb3, 0x38, 0x80, 0xa3, 0x68, 0x96, 0xd8, 0x5e, 0x3b, 0x00, 0x0d, 0x07, 0x8a, - 0x3c, 0x7b, 0x1b, 0x3e, 0x70, 0x68, 0xbb, 0x1f, 0x2b, 0xdb, 0xfd, 0xab, 0x70, 0xf1, 0x40, 0x69, - 0x8f, 0x35, 0x63, 0xbf, 0x6b, 0xc1, 0x84, 0x99, 0xe3, 0x8a, 0x3c, 0x0b, 0xa5, 0xc8, 0xdf, 0xa6, - 0xde, 0x9d, 0x40, 0x79, 0x3d, 0xeb, 0xd5, 0x62, 0x9d, 0x97, 0xe3, 0x0a, 0x6a, 0x0c, 0x86, 0xdd, - 0x68, 0xbb, 0xd4, 0x8b, 0x96, 0x9b, 0x72, 0x0e, 0x68, 0xec, 0x45, 0x51, 0xbe, 0x84, 0x1a, 0x43, - 0x38, 0x2a, 0xb2, 0xdf, 0x75, 0xda, 0x08, 0xa8, 0x8a, 0x91, 0x30, 0x1c, 0x15, 0x63, 0x18, 0x26, - 0x30, 0x89, 0xad, 0xed, 0xc4, 0xa3, 0xf1, 0xe5, 0x50, 0xca, 0xae, 0xfb, 0x6d, 0x0b, 0xca, 0xe2, - 0x9e, 0x03, 0xe9, 0x66, 0xca, 0x4f, 0x39, 0x65, 0x89, 0xa9, 0xae, 0x2d, 0x67, 0xf9, 0x29, 0x5f, - 0x86, 0xd1, 0x6d, 0xd7, 0x53, 0x5f, 0xa2, 0xf7, 0xf6, 0x57, 0x5d, 0xaf, 0x89, 0x1c, 0xa2, 0x77, - 0xff, 0xc2, 0xc0, 0xdd, 0x7f, 0x01, 0xca, 0xda, 0x7b, 0x47, 0xee, 0xa1, 0xda, 0x04, 0xae, 0xbd, - 0x7d, 0x30, 0xc6, 0xb1, 0x7f, 0xc3, 0x82, 0x49, 0x1e, 0x76, 0x1f, 0x1b, 0x15, 0x5e, 0xd0, 0x0e, - 0x75, 0x42, 0xee, 0x8b, 0x49, 0x87, 0xba, 0x77, 0xf7, 0xe6, 0x2a, 0x22, 0x50, 0x3f, 0xe9, 0x5f, - 0xf7, 0x29, 0x69, 0x89, 0xe4, 0x6e, 0x7f, 0x23, 0xc7, 0x36, 0x94, 0xc5, 0x62, 0x2a, 0x22, 0x18, - 0xd3, 0xb3, 0xdf, 0x82, 0x09, 0x33, 0xa2, 0x8d, 0xbc, 0x00, 0x95, 0xae, 0xeb, 0xb5, 0x92, 0x91, - 0xcf, 0xfa, 0xb6, 0x66, 0x2d, 0x06, 0xa1, 0x89, 0xc7, 0xab, 0xf9, 0x71, 0xb5, 0xd4, 0x25, 0xcf, - 0x9a, 0x6f, 0x56, 0x8b, 0xff, 0xd8, 0x1e, 0x40, 0x1c, 0x9e, 0x7d, 0x24, 0x0b, 0xd8, 0x98, 0xb8, - 0x40, 0x11, 0x1a, 0x1d, 0x4f, 0xb5, 0x31, 0x26, 0x46, 0xf8, 0xbb, 0x7b, 0x07, 0x69, 0x8c, 0xa2, - 0x16, 0x7f, 0xc8, 0x23, 0x23, 0x52, 0x33, 0xf7, 0x87, 0x3c, 0x32, 0x78, 0xbc, 0x77, 0x0f, 0x79, - 0x64, 0x09, 0xf3, 0x67, 0xeb, 0x21, 0x8f, 0x4f, 0xc0, 0x71, 0x73, 0xfa, 0x32, 0x05, 0xed, 0xbe, - 0x99, 0x7b, 0x43, 0xb7, 0xb8, 0x4c, 0xbe, 0x21, 0xa1, 0xf6, 0xf7, 0x46, 0x61, 0x3a, 0x6d, 0xa7, - 0xc9, 0xdb, 0x05, 0x86, 0x7c, 0xcd, 0x82, 0x49, 0x27, 0x91, 0x3f, 0x31, 0xa7, 0x57, 0xc1, 0x12, - 0x34, 0x8d, 0xfc, 0x7d, 0x89, 0x72, 0x4c, 0xf1, 0x36, 0x75, 0xad, 0xd1, 0xc1, 0xba, 0x16, 0xdb, - 0x04, 0x5c, 0xae, 0xf6, 0x06, 0x54, 0xba, 0x73, 0x4f, 0xc7, 0xe6, 0x66, 0x51, 0x8e, 0x1a, 0x83, - 0x3c, 0x80, 0x71, 0xe1, 0x2c, 0xa3, 0xbc, 0xa2, 0x56, 0x73, 0xb2, 0x27, 0x09, 0x7f, 0x9c, 0xb8, - 0x0b, 0xc4, 0xff, 0x10, 0x15, 0x3b, 0xa6, 0x63, 0x43, 0xe0, 0x78, 0x2d, 0xca, 0xdb, 0x5c, 0x5a, - 0x40, 0x5e, 0xcf, 0xcb, 0x74, 0x87, 0x9a, 0x72, 0x35, 0x68, 0x85, 0x32, 0x32, 0x52, 0x97, 0xa1, - 0xc1, 0xd9, 0xfe, 0x15, 0x0b, 0x66, 0x06, 0x55, 0x64, 0x03, 0x85, 0xaf, 0xba, 0x72, 0x44, 0x19, - 0x09, 0x19, 0x9c, 0x20, 0x42, 0x01, 0x23, 0x17, 0xa1, 0x40, 0xf5, 0x46, 0xa5, 0xb3, 0x47, 0x5e, - 0xf3, 0x9a, 0xc8, 0xca, 0xc9, 0x55, 0x18, 0x0d, 0x23, 0xda, 0x4d, 0xc5, 0x3b, 0x8c, 0xb2, 0xc5, - 0x33, 0xc3, 0x60, 0xcf, 0x71, 0xed, 0x0f, 0xc3, 0x31, 0x53, 0x40, 0xdb, 0xd7, 0x80, 0xa0, 0xdf, - 0x6e, 0x6f, 0x38, 0x8d, 0xed, 0xbb, 0xae, 0xd7, 0xf4, 0xef, 0xf3, 0x8d, 0x61, 0x01, 0xca, 0x81, - 0x8c, 0x02, 0x0f, 0xe5, 0x9c, 0xd2, 0x3b, 0x8b, 0x0a, 0x0f, 0x0f, 0x31, 0xc6, 0xb1, 0xbf, 0x3f, - 0x02, 0xe3, 0x32, 0x65, 0xc1, 0x43, 0x08, 0xb6, 0xd9, 0x4e, 0xb8, 0x38, 0x2c, 0xe7, 0x92, 0x69, - 0x61, 0x60, 0xa4, 0x4d, 0x98, 0x8a, 0xb4, 0x79, 0x35, 0x1f, 0x76, 0x07, 0x87, 0xd9, 0x7c, 0xa7, - 0x08, 0x53, 0xa9, 0x14, 0x10, 0xa9, 0x6c, 0xf1, 0xd6, 0x7b, 0x92, 0x2d, 0x9e, 0x84, 0x89, 0x17, - 0x03, 0xf2, 0x73, 0xcd, 0xfd, 0x8b, 0xc7, 0x03, 0xf2, 0x72, 0x9a, 0x2e, 0xbe, 0x7f, 0x9c, 0xa6, - 0xff, 0x9b, 0x05, 0x8f, 0x0f, 0x4c, 0x64, 0xc2, 0x53, 0x02, 0x06, 0x49, 0xa8, 0x5c, 0x2f, 0x72, - 0x4e, 0x0e, 0xa5, 0xdd, 0x21, 0xd2, 0x59, 0xdc, 0xd2, 0xec, 0xc9, 0xf3, 0x30, 0xc1, 0xd7, 0x66, - 0xb6, 0x72, 0xb2, 0xb5, 0x57, 0xdc, 0xe6, 0xf2, 0x7b, 0xbd, 0xba, 0x51, 0x8e, 0x09, 0x2c, 0xfb, - 0x5b, 0x16, 0xcc, 0x0c, 0x4a, 0x10, 0x77, 0x04, 0x3d, 0xf7, 0xaf, 0xa4, 0x82, 0x95, 0xe6, 0xfa, - 0x82, 0x95, 0x52, 0xd6, 0x46, 0x15, 0x97, 0x64, 0x18, 0xfa, 0x0a, 0x87, 0xc4, 0xe2, 0xfc, 0x5e, - 0x01, 0xa6, 0xa5, 0x88, 0xf1, 0x11, 0xe5, 0xc5, 0x44, 0x88, 0xd5, 0x4f, 0xa5, 0x42, 0xac, 0xce, - 0xa7, 0xf1, 0xff, 0x22, 0xbe, 0xea, 0xfd, 0x15, 0x5f, 0xf5, 0xd5, 0x22, 0x5c, 0xc8, 0x4c, 0xc5, - 0x46, 0xbe, 0x92, 0xb1, 0x53, 0xdc, 0xcd, 0x39, 0xe7, 0x9b, 0x0e, 0xc5, 0x3e, 0xdd, 0xa0, 0xa4, - 0x5f, 0x33, 0x83, 0x81, 0xc4, 0xea, 0xbf, 0x79, 0x0a, 0xd9, 0xeb, 0x8e, 0x1b, 0x17, 0xf4, 0x70, - 0x5f, 0xd3, 0xfb, 0x33, 0xb0, 0xd4, 0x7f, 0xb5, 0x00, 0x57, 0x8e, 0xda, 0xb2, 0xef, 0xd3, 0x40, - 0xda, 0x30, 0x11, 0x48, 0xfb, 0x90, 0x54, 0x9b, 0x53, 0x89, 0xa9, 0xfd, 0x07, 0xa3, 0x7a, 0xdf, - 0xed, 0x9f, 0xb0, 0x47, 0xb2, 0xbc, 0x8c, 0x33, 0xd5, 0x57, 0xbd, 0x39, 0x10, 0xef, 0x0d, 0xe3, - 0x75, 0x51, 0xfc, 0xee, 0xde, 0xdc, 0xd9, 0x38, 0x67, 0x91, 0x2c, 0x44, 0x55, 0x89, 0x5c, 0x81, - 0x52, 0x20, 0xa0, 0x2a, 0x74, 0x50, 0x3a, 0x70, 0x89, 0x32, 0xd4, 0x50, 0xf2, 0x79, 0xe3, 0xac, - 0x30, 0x7a, 0x5a, 0xa9, 0xb9, 0x0e, 0xf2, 0x4b, 0x7b, 0x03, 0x4a, 0xa1, 0x4a, 0x8c, 0x2f, 0xa6, - 0xd3, 0x73, 0x47, 0x8c, 0x48, 0x75, 0x36, 0x68, 0x5b, 0x65, 0xc9, 0x17, 0xdf, 0xa7, 0x73, 0xe8, - 0x6b, 0x92, 0xc4, 0xd6, 0x96, 0x09, 0x71, 0x6f, 0x06, 0xfd, 0x56, 0x09, 0x12, 0xc1, 0xb8, 0x7c, - 0x1d, 0x5b, 0x1e, 0x67, 0x57, 0x73, 0x0a, 0xed, 0x92, 0x8e, 0xff, 0xfc, 0xc0, 0xaf, 0x2c, 0x72, - 0x8a, 0x95, 0xfd, 0x43, 0x0b, 0x2a, 0x72, 0x8c, 0x3c, 0x84, 0xd0, 0xdc, 0x7b, 0xc9, 0xd0, 0xdc, - 0x6b, 0xb9, 0x2c, 0xe1, 0x03, 0xe2, 0x72, 0xef, 0xc1, 0x84, 0x99, 0x14, 0x95, 0x7c, 0xd2, 0xd8, - 0x82, 0xac, 0x61, 0x12, 0xff, 0xa9, 0x4d, 0x2a, 0xde, 0x9e, 0xec, 0x7f, 0x5a, 0xd6, 0xad, 0xc8, - 0x0f, 0xce, 0xe6, 0xc8, 0xb7, 0x0e, 0x1c, 0xf9, 0xe6, 0xc0, 0x1b, 0xc9, 0x7f, 0xe0, 0xbd, 0x06, - 0x25, 0xb5, 0x2c, 0x4a, 0x6d, 0xea, 0x29, 0x33, 0x12, 0x80, 0xa9, 0x64, 0x8c, 0x98, 0x31, 0x5d, - 0xf8, 0x01, 0x38, 0xbe, 0x27, 0x50, 0xcb, 0xb5, 0x26, 0x43, 0xde, 0x84, 0xca, 0x7d, 0x3f, 0xd8, - 0x6e, 0xfb, 0x0e, 0x7f, 0x8d, 0x04, 0xf2, 0x70, 0x3e, 0xd1, 0xb6, 0x7e, 0x11, 0x8e, 0x75, 0x37, - 0xa6, 0x8f, 0x26, 0x33, 0x52, 0x85, 0xa9, 0x8e, 0xeb, 0x21, 0x75, 0x9a, 0x3a, 0x02, 0x77, 0x54, - 0xbc, 0x04, 0xa0, 0x74, 0xfb, 0xd5, 0x24, 0x18, 0xd3, 0xf8, 0xdc, 0x2e, 0x17, 0x24, 0x4c, 0x1d, - 0x32, 0xdd, 0xf7, 0xda, 0xf0, 0x83, 0x31, 0x69, 0x3e, 0x11, 0xf1, 0x48, 0xc9, 0x72, 0x4c, 0xf1, - 0x26, 0x9f, 0x83, 0x52, 0xa8, 0xde, 0x9d, 0x2d, 0xe6, 0x78, 0xea, 0xd1, 0x6f, 0xcf, 0xea, 0xae, - 0xd4, 0x8f, 0xcf, 0x6a, 0x86, 0x64, 0x05, 0xce, 0x2b, 0xdb, 0x4d, 0xe2, 0x09, 0xcd, 0xb1, 0x38, - 0x65, 0x1d, 0x66, 0xc0, 0x31, 0xb3, 0x16, 0xd3, 0x6d, 0x79, 0xb2, 0x61, 0x71, 0xd9, 0x6f, 0xdc, - 0x8f, 0xf3, 0xf9, 0xd7, 0x44, 0x09, 0x3d, 0x28, 0xc0, 0xbc, 0x34, 0x44, 0x80, 0x79, 0x1d, 0x2e, - 0xa4, 0x41, 0x3c, 0x17, 0x21, 0x4f, 0x7f, 0x68, 0x6c, 0xa1, 0x6b, 0x59, 0x48, 0x98, 0x5d, 0x97, - 0xdc, 0x85, 0x72, 0x40, 0xf9, 0x29, 0xaf, 0xaa, 0xfc, 0x24, 0x8f, 0xed, 0x11, 0x8e, 0x8a, 0x00, - 0xc6, 0xb4, 0x58, 0xbf, 0x3b, 0xc9, 0xdc, 0xfc, 0xaf, 0xe5, 0xf8, 0x30, 0xbd, 0xec, 0xfb, 0x01, - 0x39, 0x42, 0xed, 0x7f, 0x3f, 0x05, 0x67, 0x12, 0x06, 0x28, 0xf2, 0x14, 0x14, 0x79, 0x72, 0x46, - 0xbe, 0x5a, 0x95, 0xe2, 0x15, 0x55, 0x34, 0x8e, 0x80, 0x91, 0x5f, 0xb6, 0x60, 0xaa, 0x9b, 0xb8, - 0xde, 0x52, 0x0b, 0xf9, 0x90, 0x36, 0xed, 0xe4, 0x9d, 0x99, 0xf1, 0xaa, 0x4d, 0x92, 0x19, 0xa6, - 0xb9, 0xb3, 0xf5, 0x40, 0x86, 0x55, 0xb4, 0x69, 0xc0, 0xb1, 0xa5, 0xa2, 0xa7, 0x49, 0x2c, 0x26, - 0xc1, 0x98, 0xc6, 0x67, 0x3d, 0xcc, 0xbf, 0x6e, 0x98, 0xc7, 0x87, 0xab, 0x8a, 0x00, 0xc6, 0xb4, - 0xc8, 0xcb, 0x30, 0x29, 0x53, 0xb2, 0xaf, 0xf9, 0xcd, 0x1b, 0x4e, 0xb8, 0x25, 0x8f, 0x7c, 0xfa, - 0x88, 0xba, 0x98, 0x80, 0x62, 0x0a, 0x9b, 0x7f, 0x5b, 0x9c, 0xf7, 0x9e, 0x13, 0x18, 0x4b, 0x3e, - 0xfa, 0xb3, 0x98, 0x04, 0x63, 0x1a, 0x9f, 0x3c, 0x6b, 0x6c, 0x43, 0xc2, 0x01, 0x47, 0xaf, 0x06, - 0x19, 0x5b, 0x51, 0x15, 0xa6, 0x7a, 0xfc, 0x84, 0xdc, 0x54, 0x40, 0x39, 0x1f, 0x35, 0xc3, 0x3b, - 0x49, 0x30, 0xa6, 0xf1, 0xc9, 0x4b, 0x70, 0x26, 0x60, 0x8b, 0xad, 0x26, 0x20, 0xbc, 0x72, 0xb4, - 0x33, 0x05, 0x9a, 0x40, 0x4c, 0xe2, 0x92, 0x57, 0xe0, 0x6c, 0x9c, 0xb6, 0x57, 0x11, 0x10, 0x6e, - 0x3a, 0x3a, 0x87, 0x64, 0x35, 0x8d, 0x80, 0xfd, 0x75, 0xc8, 0x5f, 0x87, 0x69, 0xa3, 0x25, 0x96, - 0xbd, 0x26, 0x7d, 0x20, 0x53, 0xab, 0xf2, 0x47, 0xec, 0x16, 0x53, 0x30, 0xec, 0xc3, 0x26, 0x1f, - 0x83, 0xc9, 0x86, 0xdf, 0x6e, 0xf3, 0x35, 0x4e, 0x3c, 0x38, 0x23, 0x72, 0xa8, 0x8a, 0x6c, 0xb3, - 0x09, 0x08, 0xa6, 0x30, 0xc9, 0x4d, 0x20, 0xfe, 0x06, 0x53, 0xaf, 0x68, 0xf3, 0x15, 0xea, 0x51, - 0xa9, 0x71, 0x9c, 0x49, 0x06, 0x75, 0xdd, 0xee, 0xc3, 0xc0, 0x8c, 0x5a, 0x3c, 0x05, 0xa5, 0x11, - 0x04, 0x3f, 0x99, 0x47, 0xd2, 0xfb, 0xb4, 0x3d, 0xe7, 0xd0, 0x08, 0xf8, 0x00, 0xc6, 0x84, 0x47, - 0x44, 0x3e, 0xc9, 0x54, 0xcd, 0xb7, 0x27, 0xe2, 0x3d, 0x42, 0x94, 0xa2, 0xe4, 0x44, 0x7e, 0x01, - 0xca, 0x1b, 0xea, 0x21, 0x22, 0x9e, 0x41, 0x75, 0xe8, 0x7d, 0x31, 0xf5, 0xa6, 0x56, 0x6c, 0xaf, - 0xd0, 0x00, 0x8c, 0x59, 0x92, 0xa7, 0xa1, 0x72, 0x63, 0xad, 0xaa, 0x47, 0xe1, 0x59, 0xde, 0xfb, - 0xa3, 0xac, 0x0a, 0x9a, 0x00, 0x36, 0xc3, 0xb4, 0xfa, 0x46, 0x92, 0x4e, 0x13, 0x19, 0xda, 0x18, - 0xc3, 0xe6, 0x2e, 0x32, 0x58, 0x9f, 0x39, 0x97, 0xc2, 0x96, 0xe5, 0xa8, 0x31, 0xc8, 0x1b, 0x50, - 0x91, 0xfb, 0x05, 0x5f, 0x9b, 0xce, 0x9f, 0x2c, 0xc1, 0x02, 0xc6, 0x24, 0xd0, 0xa4, 0xc7, 0xaf, - 0xef, 0xf9, 0xfb, 0x2c, 0xf4, 0x7a, 0xaf, 0xdd, 0x9e, 0xb9, 0xc0, 0xd7, 0xcd, 0xf8, 0xfa, 0x3e, - 0x06, 0xa1, 0x89, 0x47, 0x9e, 0x53, 0x2e, 0x91, 0x8f, 0x26, 0xfc, 0x19, 0xb4, 0x4b, 0xa4, 0x56, - 0xba, 0x07, 0xc4, 0x60, 0x3d, 0x76, 0x88, 0x2f, 0xe2, 0x06, 0xcc, 0x2a, 0x8d, 0xaf, 0x7f, 0x92, - 0xcc, 0xcc, 0x24, 0x6c, 0x47, 0xb3, 0x77, 0x07, 0x62, 0xe2, 0x01, 0x54, 0xc8, 0x06, 0x14, 0x9c, - 0xf6, 0xc6, 0xcc, 0xe3, 0x79, 0xa8, 0xae, 0xd5, 0x95, 0x9a, 0x1c, 0x51, 0xdc, 0x6f, 0xba, 0xba, - 0x52, 0x43, 0x46, 0x9c, 0xb8, 0x30, 0xea, 0xb4, 0x37, 0xc2, 0x99, 0x59, 0x3e, 0x67, 0x73, 0x63, - 0x12, 0x1b, 0x0f, 0x56, 0x6a, 0x21, 0x72, 0x16, 0xf6, 0x17, 0x46, 0xf4, 0x2d, 0x91, 0xce, 0x67, - 0xff, 0x96, 0x39, 0x81, 0xc4, 0x71, 0xe7, 0x76, 0x6e, 0x13, 0x48, 0xaa, 0x17, 0x67, 0x06, 0x4e, - 0x9f, 0xae, 0x5e, 0x32, 0x72, 0x49, 0x84, 0x97, 0xcc, 0xd5, 0x2f, 0x4e, 0xcf, 0xc9, 0x05, 0xc3, - 0xfe, 0x62, 0x45, 0x5b, 0x41, 0x53, 0x6e, 0x82, 0x01, 0x14, 0xdd, 0x30, 0x72, 0xfd, 0x1c, 0xf3, - 0x0e, 0xa4, 0x92, 0xdc, 0xf3, 0xb0, 0x26, 0x0e, 0x40, 0xc1, 0x8a, 0xf1, 0xf4, 0x5a, 0xae, 0xf7, - 0x40, 0x7e, 0xfe, 0x6b, 0xb9, 0x3b, 0xb9, 0x09, 0x9e, 0x1c, 0x80, 0x82, 0x15, 0xb9, 0x27, 0x06, - 0x75, 0x21, 0x8f, 0xbe, 0xae, 0xae, 0xd4, 0x52, 0xfc, 0x92, 0x83, 0xfb, 0x1e, 0x14, 0xc2, 0x8e, - 0x2b, 0xd5, 0xa5, 0x21, 0x79, 0xd5, 0x57, 0x97, 0xb3, 0x78, 0xd5, 0x57, 0x97, 0x91, 0x31, 0xe1, - 0x57, 0xfd, 0x4e, 0x67, 0xc3, 0x09, 0x43, 0xa7, 0xa9, 0xad, 0x33, 0x43, 0x5e, 0xf5, 0x57, 0x35, - 0xbd, 0x14, 0x6b, 0x7e, 0xd5, 0x1f, 0x43, 0xd1, 0xe0, 0x4c, 0xde, 0x84, 0x71, 0x47, 0x3c, 0x94, - 0x2a, 0x83, 0x3c, 0xf2, 0x79, 0xfd, 0x37, 0x25, 0x01, 0x37, 0xd3, 0x48, 0x10, 0x2a, 0x86, 0x8c, - 0x77, 0x14, 0x38, 0x74, 0xd3, 0xdd, 0x96, 0xc6, 0xa1, 0xfa, 0xd0, 0x4f, 0xf9, 0x30, 0x62, 0x59, - 0xbc, 0x25, 0x08, 0x15, 0x43, 0xf2, 0x65, 0x0b, 0xce, 0x74, 0x1c, 0xcf, 0xd1, 0xa1, 0xbb, 0xf9, - 0x04, 0x78, 0x9b, 0xc1, 0xc0, 0xb1, 0x86, 0xb8, 0x6a, 0x32, 0xc2, 0x24, 0x5f, 0xb2, 0x03, 0x63, - 0x0e, 0x7f, 0xc2, 0x59, 0x1e, 0xc5, 0x30, 0x8f, 0xe7, 0xa0, 0x53, 0x6d, 0xc0, 0x17, 0x17, 0xf9, - 0x50, 0xb4, 0xe4, 0x46, 0x7e, 0xd3, 0x82, 0x71, 0x11, 0x7f, 0xc0, 0x14, 0x52, 0xf6, 0xed, 0x9f, - 0x39, 0x85, 0xc7, 0x32, 0x64, 0x6c, 0x84, 0x74, 0xce, 0xfa, 0xa0, 0xf6, 0xad, 0x16, 0xa5, 0x07, - 0x46, 0x47, 0x28, 0xe9, 0x98, 0xea, 0xdb, 0x71, 0x1e, 0x24, 0x1e, 0x6a, 0x32, 0x55, 0xdf, 0xd5, - 0x14, 0x0c, 0xfb, 0xb0, 0x67, 0x3f, 0x06, 0x13, 0xa6, 0x1c, 0xc7, 0x8a, 0xb0, 0xf8, 0x71, 0x01, - 0x80, 0x77, 0x95, 0x48, 0xf7, 0xd3, 0xe1, 0xb9, 0xc1, 0xb7, 0xfc, 0x66, 0x4e, 0x0f, 0xc6, 0x1a, - 0x59, 0x7b, 0x40, 0x26, 0x02, 0xdf, 0xf2, 0x9b, 0x28, 0x99, 0x90, 0x16, 0x8c, 0x76, 0x9d, 0x68, - 0x2b, 0xff, 0x14, 0x41, 0x25, 0x11, 0xf7, 0x1e, 0x6d, 0x21, 0x67, 0x40, 0xde, 0xb6, 0x62, 0xbf, - 0xa7, 0x42, 0x1e, 0xe9, 0x8d, 0xe3, 0x36, 0x9b, 0x97, 0x9e, 0x4e, 0xa9, 0x2c, 0xbf, 0x69, 0xff, - 0xa7, 0xd9, 0x77, 0x2c, 0x98, 0x30, 0x51, 0x33, 0xba, 0xe9, 0xe7, 0xcd, 0x6e, 0xca, 0xb3, 0x3d, - 0xcc, 0x1e, 0xff, 0x1f, 0x16, 0x00, 0xf6, 0xbc, 0x7a, 0xaf, 0xd3, 0x61, 0x6a, 0xbb, 0x0e, 0x24, - 0xb1, 0x8e, 0x1c, 0x48, 0x32, 0x72, 0xcc, 0x40, 0x92, 0xc2, 0xb1, 0x02, 0x49, 0x46, 0x8f, 0x1f, - 0x48, 0x52, 0x1c, 0x1c, 0x48, 0x62, 0x7f, 0xc3, 0x82, 0xb3, 0x7d, 0xfb, 0x15, 0xd3, 0xa4, 0x03, - 0xdf, 0x8f, 0x06, 0xf8, 0xcf, 0x62, 0x0c, 0x42, 0x13, 0x8f, 0x2c, 0xc1, 0xb4, 0x7c, 0x09, 0xa7, - 0xde, 0x6d, 0xbb, 0x99, 0xe9, 0x9b, 0xd6, 0x53, 0x70, 0xec, 0xab, 0x61, 0xff, 0x6b, 0x0b, 0x2a, - 0x46, 0xd2, 0x07, 0xee, 0x73, 0xc6, 0x6f, 0xbc, 0xd2, 0x3e, 0x67, 0xfc, 0xaa, 0x4b, 0xc0, 0xc4, - 0x35, 0x74, 0xcb, 0x78, 0x27, 0x21, 0xbe, 0x86, 0x66, 0xa5, 0x28, 0xa1, 0x22, 0x03, 0xbe, 0x74, - 0x3e, 0x2b, 0x98, 0x19, 0xf0, 0x69, 0x57, 0xb8, 0x9a, 0xc5, 0x2e, 0x6e, 0xa3, 0x87, 0xbb, 0xb8, - 0x15, 0xb3, 0x5d, 0xdc, 0xec, 0xdb, 0x30, 0x21, 0x7c, 0xc3, 0x5f, 0xa5, 0xbb, 0x47, 0x7e, 0x71, - 0x99, 0x8d, 0xf6, 0x94, 0xcf, 0x1c, 0xab, 0xce, 0xca, 0xed, 0x7f, 0x62, 0x41, 0xea, 0x19, 0x2e, - 0xe3, 0x06, 0xc6, 0x1a, 0x78, 0x03, 0x63, 0x5a, 0xed, 0x47, 0x0e, 0xb4, 0xda, 0xdf, 0x04, 0xd2, - 0x61, 0x53, 0x21, 0xb9, 0xd0, 0x16, 0x92, 0xaf, 0x95, 0xac, 0xf6, 0x61, 0x60, 0x46, 0x2d, 0xfb, - 0x1f, 0x0b, 0x61, 0xcd, 0x87, 0xb9, 0x0e, 0x6f, 0x80, 0x1e, 0x14, 0x39, 0x29, 0x69, 0x7f, 0x1b, - 0xd2, 0x76, 0xdd, 0x9f, 0xaa, 0x2d, 0xee, 0x48, 0x39, 0xe5, 0x39, 0x37, 0xfb, 0xf7, 0x84, 0xac, - 0xe6, 0xcb, 0x5d, 0x87, 0xcb, 0xda, 0x49, 0xca, 0x7a, 0x23, 0xaf, 0xb5, 0x32, 0x5b, 0x46, 0x32, - 0x0f, 0xd0, 0xa5, 0x41, 0x83, 0x7a, 0x91, 0x0a, 0x7d, 0x2b, 0xca, 0x20, 0x6c, 0x5d, 0x8a, 0x06, - 0x86, 0xfd, 0x75, 0x36, 0x81, 0xe2, 0xb7, 0xc8, 0xc9, 0x95, 0xb4, 0x23, 0x70, 0x7a, 0x72, 0x68, - 0x3f, 0x60, 0x23, 0x1e, 0x6a, 0xe4, 0x90, 0x78, 0xa8, 0x67, 0x60, 0x3c, 0xf0, 0xdb, 0xb4, 0x1a, - 0x78, 0x69, 0x1f, 0x1d, 0x64, 0xc5, 0x78, 0x0b, 0x15, 0xdc, 0xfe, 0x75, 0x0b, 0xa6, 0xd3, 0x11, - 0x9b, 0xb9, 0x7b, 0x27, 0x9b, 0x69, 0x25, 0x0a, 0xc7, 0x4f, 0x2b, 0x61, 0xff, 0x49, 0x11, 0xa6, - 0xd3, 0x6f, 0x24, 0x32, 0xce, 0x2e, 0x37, 0xb6, 0xa5, 0x56, 0x7f, 0x61, 0x65, 0x13, 0x30, 0x3d, - 0x5e, 0x46, 0x06, 0x8e, 0x97, 0xeb, 0x50, 0xf6, 0xbb, 0xea, 0xc0, 0x2f, 0x84, 0xbb, 0xa2, 0x8c, - 0x35, 0xb7, 0x15, 0xe0, 0xdd, 0xbd, 0xb9, 0x73, 0xb1, 0x00, 0xba, 0x18, 0xe3, 0xaa, 0xe4, 0x67, - 0x94, 0xa5, 0x62, 0x34, 0x91, 0xa8, 0x49, 0x5b, 0x2a, 0xa6, 0xe2, 0xfa, 0x83, 0x8c, 0x15, 0xc5, - 0xe3, 0x24, 0x8c, 0x19, 0xcb, 0x31, 0x61, 0xcc, 0x5d, 0x28, 0x4b, 0xdb, 0xea, 0x89, 0x12, 0xa5, - 0x70, 0xc2, 0x77, 0x14, 0x01, 0x8c, 0x69, 0xa5, 0x32, 0xd1, 0x94, 0x72, 0xcd, 0x44, 0xf3, 0x12, - 0x8c, 0x6f, 0x38, 0x8d, 0x6d, 0x7f, 0x73, 0x93, 0xeb, 0xe7, 0xe5, 0xda, 0x07, 0x54, 0xc3, 0xd5, - 0x44, 0x71, 0xc6, 0x90, 0x52, 0x35, 0x98, 0x56, 0x40, 0x95, 0x3b, 0xb2, 0x32, 0xfb, 0x6a, 0xad, - 0x40, 0x3b, 0x2a, 0x87, 0x68, 0x60, 0x91, 0x67, 0xa1, 0xd4, 0x74, 0x43, 0xf1, 0x8a, 0x77, 0x25, - 0xe9, 0xad, 0xbe, 0x24, 0xcb, 0x51, 0x63, 0x90, 0x97, 0xb5, 0xb7, 0xda, 0x44, 0x1c, 0x48, 0xa2, - 0x3d, 0xd5, 0x0e, 0x08, 0x24, 0x91, 0xce, 0xb8, 0x6f, 0xb3, 0x89, 0x19, 0xb9, 0x8d, 0x6d, 0xd7, - 0x13, 0xd9, 0x47, 0xd8, 0x6a, 0xf1, 0x0c, 0x8c, 0x53, 0xf9, 0x8e, 0xb8, 0xb8, 0x3a, 0xd1, 0x83, - 0x45, 0x3d, 0x1f, 0xae, 0xe0, 0xa4, 0x0a, 0x53, 0xea, 0xc2, 0x58, 0xdd, 0x77, 0x89, 0xac, 0x49, - 0xda, 0xbe, 0xbe, 0x94, 0x04, 0x63, 0x1a, 0xdf, 0xfe, 0x3c, 0x54, 0x0c, 0x45, 0x8c, 0xeb, 0x2c, - 0x0f, 0x9c, 0x46, 0x9f, 0x7f, 0xf9, 0x35, 0x56, 0x88, 0x02, 0xc6, 0xaf, 0xe5, 0x44, 0x70, 0x64, - 0x6a, 0xaf, 0x97, 0x21, 0x91, 0x12, 0xca, 0x88, 0x05, 0xb4, 0x45, 0x1f, 0xa8, 0xa7, 0x5b, 0x14, - 0x31, 0x64, 0x85, 0x28, 0x60, 0xf6, 0xb3, 0x50, 0x52, 0xb9, 0xed, 0x78, 0x82, 0x28, 0x75, 0x65, - 0x64, 0x26, 0x88, 0xf2, 0x83, 0x08, 0x39, 0xc4, 0x7e, 0x1d, 0x4a, 0x2a, 0x05, 0xdf, 0xe1, 0xd8, - 0x6c, 0xfb, 0x0d, 0x3d, 0xf7, 0x86, 0x1f, 0x46, 0x2a, 0x6f, 0xa0, 0xb8, 0xd5, 0xbe, 0xb5, 0xcc, - 0xcb, 0x50, 0x43, 0xed, 0x3f, 0xb5, 0xa0, 0xb2, 0xbe, 0xbe, 0xa2, 0x8d, 0x5d, 0x08, 0x8f, 0x86, - 0xa2, 0x85, 0xaa, 0x9b, 0x11, 0x35, 0xdd, 0x67, 0xc4, 0x4a, 0x34, 0xbb, 0xbf, 0x37, 0xf7, 0x68, - 0x3d, 0x13, 0x03, 0x07, 0xd4, 0x24, 0xcb, 0x70, 0xce, 0x84, 0xc8, 0x7c, 0x2e, 0x52, 0x2f, 0xe0, - 0x0f, 0xcf, 0xd7, 0xfb, 0xc1, 0x98, 0x55, 0x27, 0x4d, 0x4a, 0xaa, 0xb8, 0xe6, 0x1b, 0xf6, 0xf5, - 0x7e, 0x30, 0x66, 0xd5, 0xb1, 0x9f, 0x83, 0xa9, 0x94, 0x5f, 0xc7, 0x11, 0xf2, 0x68, 0xfd, 0x6e, - 0x01, 0x26, 0xcc, 0xeb, 0xfd, 0x23, 0xec, 0xd9, 0x47, 0x57, 0x85, 0x32, 0xae, 0xe4, 0x0b, 0xc7, - 0xbc, 0x92, 0x37, 0x7d, 0x20, 0x46, 0x4f, 0xd7, 0x07, 0xa2, 0x98, 0x8f, 0x0f, 0x84, 0xe1, 0xab, - 0x33, 0xf6, 0xf0, 0x7c, 0x75, 0x7e, 0xa7, 0x08, 0x93, 0xc9, 0xc4, 0xcc, 0x47, 0xe8, 0xc9, 0x67, - 0xfb, 0x7a, 0xf2, 0x98, 0x77, 0x80, 0x85, 0x61, 0xef, 0x00, 0x47, 0x87, 0xbd, 0x03, 0x2c, 0x9e, - 0xe0, 0x0e, 0xb0, 0xff, 0x06, 0x6f, 0xec, 0xc8, 0x37, 0x78, 0x1f, 0xd7, 0x1b, 0xc5, 0x78, 0xc2, - 0xed, 0x2d, 0xde, 0x2c, 0x48, 0xb2, 0x1b, 0x16, 0xfd, 0x66, 0xa6, 0x3b, 0x76, 0xe9, 0x10, 0xf5, - 0x21, 0xc8, 0xf4, 0x42, 0x3e, 0xbe, 0x9b, 0xc1, 0xa3, 0xc7, 0xf0, 0x40, 0x7e, 0x01, 0x2a, 0x72, - 0x3c, 0xf1, 0x03, 0x27, 0x24, 0x0f, 0xab, 0xf5, 0x18, 0x84, 0x26, 0x1e, 0x1b, 0x18, 0xdd, 0x78, - 0x82, 0xf0, 0xdb, 0xe8, 0x4a, 0xf2, 0x36, 0x7a, 0x2d, 0x09, 0xc6, 0x34, 0xbe, 0xfd, 0x39, 0xb8, - 0x90, 0x69, 0x76, 0xe4, 0x57, 0x3e, 0xfc, 0x2c, 0x44, 0x9b, 0x12, 0xc1, 0x10, 0x23, 0xf5, 0x5e, - 0xd3, 0xec, 0xdd, 0x81, 0x98, 0x78, 0x00, 0x15, 0xfb, 0xb7, 0x0b, 0x30, 0x99, 0x7c, 0xbf, 0x9c, - 0xdc, 0xd7, 0x97, 0x14, 0xb9, 0xdc, 0x8f, 0x08, 0xb2, 0x46, 0xb2, 0xdf, 0x81, 0x97, 0x9b, 0xf7, - 0xf9, 0xf8, 0xda, 0xd0, 0x99, 0x87, 0x4f, 0x8f, 0xb1, 0xbc, 0x55, 0x94, 0xec, 0xf8, 0x2b, 0xe0, - 0x71, 0xbc, 0xbf, 0xb4, 0x5d, 0xe5, 0xce, 0x3d, 0x0e, 0xcd, 0xd6, 0xac, 0xd0, 0x60, 0xcb, 0xf6, - 0x96, 0x1d, 0x1a, 0xb8, 0x9b, 0x2e, 0x6d, 0xca, 0x87, 0x20, 0xf8, 0xca, 0xfd, 0xba, 0x2c, 0x43, - 0x0d, 0xb5, 0xdf, 0x1e, 0x81, 0x32, 0x4f, 0x63, 0x78, 0x3d, 0xf0, 0x3b, 0xfc, 0x65, 0xdb, 0xd0, - 0xb0, 0x13, 0xc8, 0x6e, 0xbb, 0x39, 0xec, 0x63, 0xd5, 0x31, 0x45, 0x19, 0xe2, 0x61, 0x94, 0x60, - 0x82, 0x23, 0xe9, 0x42, 0x69, 0x53, 0xa6, 0x5d, 0x97, 0x7d, 0x37, 0x64, 0xea, 0x60, 0x95, 0xc4, - 0x5d, 0x34, 0x81, 0xfa, 0x87, 0x9a, 0x8b, 0xed, 0xc0, 0x54, 0x2a, 0x0f, 0x55, 0xee, 0xc9, 0xda, - 0xff, 0xd7, 0x28, 0x94, 0x75, 0xe4, 0x25, 0xf9, 0x68, 0xc2, 0x68, 0x1b, 0xeb, 0xf0, 0xd2, 0xda, - 0xca, 0xce, 0x4d, 0x1a, 0x39, 0x65, 0x80, 0xbd, 0x08, 0x85, 0x5e, 0xd0, 0x4e, 0x5b, 0x65, 0xee, - 0xe0, 0x0a, 0xb2, 0x72, 0x33, 0x5a, 0xb4, 0xf0, 0x70, 0xa3, 0x45, 0x2f, 0xc3, 0xe8, 0x86, 0xdf, - 0xdc, 0x4d, 0x3f, 0xd3, 0x58, 0xf3, 0x9b, 0xbb, 0xc8, 0x21, 0xe4, 0x65, 0x98, 0x94, 0x21, 0xb0, - 0x4a, 0x89, 0x29, 0x72, 0x3d, 0x55, 0x3b, 0xeb, 0xac, 0x27, 0xa0, 0x98, 0xc2, 0x66, 0xbb, 0x2c, - 0x3b, 0x36, 0xf0, 0x14, 0xfc, 0x63, 0xc9, 0x9b, 0xfd, 0x9b, 0xf5, 0xdb, 0xb7, 0xb8, 0xf1, 0x58, - 0x63, 0x24, 0xa2, 0x6c, 0xc7, 0x0f, 0x8d, 0xb2, 0x5d, 0x12, 0xb4, 0x99, 0xb4, 0x7c, 0x47, 0x99, - 0xa8, 0x5d, 0x51, 0x74, 0x59, 0xd9, 0x81, 0x67, 0x17, 0x5d, 0x33, 0x2b, 0x1e, 0xb9, 0xfc, 0xde, - 0xc5, 0x23, 0xdb, 0x77, 0x60, 0x2a, 0xd5, 0x7f, 0xca, 0xa8, 0x67, 0x65, 0x1b, 0xf5, 0x8e, 0xf6, - 0xd0, 0xe3, 0x3f, 0xb7, 0xe0, 0x6c, 0xdf, 0x8a, 0x74, 0xd4, 0xc0, 0xf0, 0xf4, 0xde, 0x38, 0x72, - 0xf2, 0xbd, 0xb1, 0x70, 0xbc, 0xbd, 0xb1, 0xb6, 0xf1, 0xdd, 0x1f, 0x5d, 0x7a, 0xe4, 0x07, 0x3f, - 0xba, 0xf4, 0xc8, 0xef, 0xff, 0xe8, 0xd2, 0x23, 0x6f, 0xef, 0x5f, 0xb2, 0xbe, 0xbb, 0x7f, 0xc9, - 0xfa, 0xc1, 0xfe, 0x25, 0xeb, 0xf7, 0xf7, 0x2f, 0x59, 0xff, 0x75, 0xff, 0x92, 0xf5, 0x8d, 0x3f, - 0xba, 0xf4, 0xc8, 0x27, 0x3f, 0x1e, 0xf7, 0xd4, 0x82, 0xea, 0x29, 0xfe, 0xe3, 0x43, 0xaa, 0x5f, - 0x16, 0xba, 0xdb, 0xad, 0x05, 0xd6, 0x53, 0x0b, 0xba, 0x44, 0xf5, 0xd4, 0xff, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0x4e, 0x36, 0xf6, 0x90, 0xb2, 0xad, 0x00, 0x00, + 0x05, 0xfb, 0xf7, 0xc6, 0x60, 0x42, 0x9c, 0x84, 0xe4, 0xd6, 0xf5, 0x3b, 0x16, 0x3c, 0xd9, 0xe8, + 0x05, 0x01, 0xf5, 0xa2, 0x7a, 0x44, 0xbb, 0xfd, 0x1b, 0x97, 0x75, 0xaa, 0x1b, 0xd7, 0xe5, 0xfd, + 0xbd, 0xb9, 0x27, 0x17, 0x0f, 0xe0, 0x8f, 0x07, 0x4a, 0x47, 0xfe, 0x83, 0x05, 0xb6, 0x44, 0xa8, + 0x39, 0x8d, 0xed, 0x56, 0xe0, 0xf7, 0xbc, 0x66, 0xff, 0x47, 0x8c, 0x9c, 0xea, 0x47, 0x3c, 0xbd, + 0xbf, 0x37, 0x67, 0x2f, 0x1e, 0x2a, 0x05, 0x1e, 0x41, 0x52, 0xf2, 0x0a, 0x9c, 0x95, 0x58, 0xd7, + 0x1e, 0x74, 0x69, 0xe0, 0xb2, 0x33, 0x87, 0x54, 0x1c, 0x63, 0xdf, 0xb4, 0x34, 0x02, 0xf6, 0xd7, + 0x21, 0x21, 0x8c, 0xdf, 0xa7, 0x6e, 0x6b, 0x2b, 0x52, 0xea, 0xd3, 0x90, 0x0e, 0x69, 0xd2, 0x2a, + 0x72, 0x57, 0xd0, 0xac, 0x55, 0xf6, 0xf7, 0xe6, 0xc6, 0xe5, 0x1f, 0x54, 0x9c, 0xc8, 0x2d, 0x98, + 0x14, 0xe7, 0xd4, 0x35, 0xd7, 0x6b, 0xad, 0xf9, 0x9e, 0xf0, 0xaa, 0x2a, 0xd7, 0x9e, 0x56, 0x1b, + 0x7e, 0x3d, 0x01, 0x7d, 0x77, 0x6f, 0x6e, 0x42, 0xfd, 0x5e, 0xdf, 0xed, 0x52, 0x4c, 0xd5, 0x26, + 0x7f, 0xc7, 0x02, 0x12, 0x46, 0xb4, 0xbb, 0xd6, 0xee, 0xb5, 0x5c, 0xd9, 0x44, 0xd2, 0x3f, 0x2a, + 0x07, 0x57, 0xad, 0x24, 0xdd, 0xda, 0xac, 0x14, 0x92, 0xd4, 0xfb, 0x38, 0x62, 0x86, 0x14, 0xf6, + 0xb7, 0xc7, 0x01, 0xd4, 0x5c, 0xa2, 0x5d, 0xf2, 0x41, 0x28, 0x87, 0x34, 0x12, 0x4d, 0x22, 0xaf, + 0xb9, 0xc4, 0xe5, 0xa4, 0x2a, 0xc4, 0x18, 0x4e, 0xb6, 0xa1, 0xd8, 0x75, 0x7a, 0x21, 0xcd, 0xe7, + 0x70, 0x23, 0x47, 0xe6, 0x1a, 0xa3, 0x28, 0x4e, 0xcd, 0xfc, 0x27, 0x0a, 0x1e, 0xe4, 0x4b, 0x16, + 0x00, 0x4d, 0x8e, 0xa6, 0xa1, 0xad, 0x57, 0x92, 0x65, 0x3c, 0xe0, 0x58, 0x1b, 0xd4, 0x26, 0xf7, + 0xf7, 0xe6, 0xc0, 0x18, 0x97, 0x06, 0x5b, 0x72, 0x1f, 0x4a, 0x8e, 0xda, 0x90, 0x46, 0x4f, 0x63, + 0x43, 0xe2, 0x87, 0x59, 0x3d, 0xa3, 0x34, 0x33, 0xf2, 0x15, 0x0b, 0x26, 0x43, 0x1a, 0xc9, 0xae, + 0x62, 0xcb, 0xa2, 0xd4, 0xc6, 0x87, 0x9c, 0x11, 0xf5, 0x04, 0x4d, 0xb1, 0xbc, 0x27, 0xcb, 0x30, + 0xc5, 0x57, 0x89, 0x72, 0x83, 0x3a, 0x4d, 0x1a, 0x70, 0x5b, 0x89, 0x54, 0xf3, 0x86, 0x17, 0xc5, + 0xa0, 0xa9, 0x45, 0x31, 0xca, 0x30, 0xc5, 0x57, 0x89, 0xb2, 0xea, 0x06, 0x81, 0x2f, 0x45, 0x29, + 0xe5, 0x24, 0x8a, 0x41, 0x53, 0x8b, 0x62, 0x94, 0x61, 0x8a, 0x2f, 0x69, 0xc3, 0x58, 0x97, 0x4f, + 0x2d, 0xa9, 0xca, 0x0d, 0x79, 0x47, 0xae, 0xa6, 0x29, 0xed, 0x0a, 0x9b, 0x94, 0xf8, 0x8f, 0x92, + 0x87, 0xfd, 0xad, 0x33, 0x30, 0xa9, 0xa6, 0x6d, 0x7c, 0xc8, 0x11, 0x86, 0xc0, 0x01, 0x87, 0x9c, + 0x45, 0x13, 0x88, 0x49, 0x5c, 0x56, 0x59, 0xac, 0x5a, 0xc9, 0x33, 0x8e, 0xae, 0x5c, 0x37, 0x81, + 0x98, 0xc4, 0x25, 0x1d, 0x28, 0xb2, 0x95, 0x45, 0xb9, 0x5f, 0x0c, 0xf9, 0xe5, 0xf1, 0x6a, 0x64, + 0x18, 0x55, 0x18, 0x79, 0x14, 0x5c, 0xb8, 0x2d, 0x3b, 0x4a, 0x98, 0xb7, 0xe5, 0x54, 0xcc, 0x67, + 0x35, 0x48, 0x5a, 0xce, 0x45, 0xdf, 0x27, 0xcb, 0x30, 0xc5, 0x3e, 0xe3, 0xdc, 0x53, 0x3c, 0xc5, + 0x73, 0xcf, 0x27, 0xa1, 0xd4, 0x71, 0x1e, 0xd4, 0x7b, 0x41, 0xeb, 0xe4, 0xe7, 0x2b, 0xe9, 0x4e, + 0x2b, 0xa8, 0xa0, 0xa6, 0x47, 0xbe, 0x60, 0x19, 0x0b, 0x9c, 0xf0, 0xb5, 0xb8, 0x9b, 0xef, 0x02, + 0xa7, 0xd5, 0x86, 0x81, 0x4b, 0x5d, 0xdf, 0x29, 0xa4, 0xf4, 0xd0, 0x4f, 0x21, 0x4c, 0xa3, 0x16, + 0x13, 0x44, 0x6b, 0xd4, 0xe5, 0x53, 0xd5, 0xa8, 0x17, 0x13, 0xcc, 0x30, 0xc5, 0x9c, 0xcb, 0x23, + 0xe6, 0x9c, 0x96, 0x07, 0x4e, 0x55, 0x9e, 0x7a, 0x82, 0x19, 0xa6, 0x98, 0x0f, 0x3e, 0x7a, 0x57, + 0x4e, 0xe7, 0xe8, 0x3d, 0x91, 0xc3, 0xd1, 0xfb, 0xe0, 0x53, 0xc9, 0x99, 0x61, 0x4f, 0x25, 0xe4, + 0x26, 0x90, 0xe6, 0xae, 0xe7, 0x74, 0xdc, 0x86, 0x5c, 0x2c, 0xf9, 0x26, 0x3d, 0xc9, 0x4d, 0x33, + 0x5a, 0x2b, 0x5b, 0xea, 0xc3, 0xc0, 0x8c, 0x5a, 0x24, 0x82, 0x52, 0x57, 0x29, 0x9f, 0x53, 0x79, + 0x8c, 0x7e, 0xa5, 0x8c, 0x0a, 0x17, 0x1a, 0x36, 0xf1, 0x54, 0x09, 0x6a, 0x4e, 0x64, 0x05, 0xce, + 0x77, 0x5c, 0x6f, 0xcd, 0x6f, 0x86, 0x6b, 0x34, 0x90, 0x86, 0xa7, 0x3a, 0x8d, 0x66, 0xa6, 0x79, + 0xdb, 0x70, 0x63, 0xc2, 0x6a, 0x06, 0x1c, 0x33, 0x6b, 0xd9, 0xff, 0xdb, 0x82, 0xe9, 0xc5, 0xb6, + 0xdf, 0x6b, 0xde, 0x75, 0xa2, 0xc6, 0x96, 0xf0, 0xd8, 0x20, 0x2f, 0x43, 0xc9, 0xf5, 0x22, 0x1a, + 0xec, 0x38, 0x6d, 0xb9, 0x3f, 0xd9, 0xca, 0x92, 0xbc, 0x2c, 0xcb, 0xdf, 0xdd, 0x9b, 0x9b, 0x5c, + 0xea, 0x05, 0xdc, 0x60, 0x2f, 0x56, 0x2b, 0xd4, 0x75, 0xc8, 0xb7, 0x2c, 0x38, 0x2b, 0x7c, 0x3e, + 0x96, 0x9c, 0xc8, 0x79, 0xad, 0x47, 0x03, 0x97, 0x2a, 0xaf, 0x8f, 0x21, 0x17, 0xaa, 0xb4, 0xac, + 0x8a, 0xc1, 0x6e, 0x7c, 0x66, 0x59, 0x4d, 0x73, 0xc6, 0x7e, 0x61, 0xec, 0x5f, 0x2d, 0xc0, 0xe3, + 0x03, 0x69, 0x91, 0x59, 0x18, 0x71, 0x9b, 0xf2, 0xd3, 0x41, 0xd2, 0x1d, 0x59, 0x6e, 0xe2, 0x88, + 0xdb, 0x24, 0xf3, 0x5c, 0xc3, 0x0d, 0x68, 0x18, 0xaa, 0xbb, 0xf7, 0xb2, 0x56, 0x46, 0x65, 0x29, + 0x1a, 0x18, 0x64, 0x0e, 0x8a, 0xdc, 0x95, 0x5a, 0x1e, 0xad, 0xb8, 0xce, 0xcc, 0xbd, 0x96, 0x51, + 0x94, 0x93, 0x2f, 0x5a, 0x00, 0x42, 0x40, 0xa6, 0xef, 0xcb, 0x5d, 0x12, 0xf3, 0x6d, 0x26, 0x46, + 0x59, 0x48, 0x19, 0xff, 0x47, 0x83, 0x2b, 0x59, 0x87, 0x31, 0xa6, 0x3e, 0xfb, 0xcd, 0x13, 0x6f, + 0x8a, 0x42, 0x01, 0xe2, 0x34, 0x50, 0xd2, 0x62, 0x6d, 0x15, 0xd0, 0xa8, 0x17, 0x78, 0xac, 0x69, + 0xf9, 0x36, 0x58, 0x12, 0x52, 0xa0, 0x2e, 0x45, 0x03, 0xc3, 0xfe, 0x17, 0x23, 0x70, 0x3e, 0x4b, + 0x74, 0xb6, 0xdb, 0x8c, 0x09, 0x69, 0xa5, 0x95, 0xe0, 0x67, 0xf3, 0x6f, 0x1f, 0xe9, 0xbe, 0xa4, + 0x6f, 0x6c, 0xa4, 0x2f, 0xa9, 0xe4, 0x4b, 0x7e, 0x56, 0xb7, 0xd0, 0xc8, 0x09, 0x5b, 0x48, 0x53, + 0x4e, 0xb5, 0xd2, 0x65, 0x18, 0x0d, 0x59, 0xcf, 0x17, 0x92, 0x37, 0x3f, 0xbc, 0x8f, 0x38, 0x84, + 0x61, 0xf4, 0x3c, 0x37, 0x92, 0xf1, 0x47, 0x1a, 0xe3, 0x8e, 0xe7, 0x46, 0xc8, 0x21, 0xf6, 0x37, + 0x47, 0x60, 0x76, 0xf0, 0x47, 0x91, 0x6f, 0x5a, 0x00, 0x4d, 0x76, 0x38, 0x0a, 0xb9, 0x13, 0xbf, + 0x70, 0xf7, 0x72, 0x4e, 0xab, 0x0d, 0x97, 0x14, 0xa7, 0xd8, 0x0f, 0x51, 0x17, 0x85, 0x68, 0x08, + 0x42, 0xae, 0xaa, 0xa1, 0xcf, 0x6f, 0xad, 0xc4, 0x64, 0xd2, 0x75, 0x56, 0x35, 0x04, 0x0d, 0x2c, + 0x76, 0xfa, 0xf5, 0x9c, 0x0e, 0x0d, 0xbb, 0x8e, 0x8e, 0xe6, 0xe2, 0xa7, 0xdf, 0x5b, 0xaa, 0x10, + 0x63, 0xb8, 0xdd, 0x86, 0xa7, 0x8e, 0x20, 0x67, 0x4e, 0xc1, 0x32, 0xf6, 0x9f, 0x5a, 0xf0, 0x98, + 0xf4, 0xc4, 0xfb, 0x0b, 0xe3, 0xd6, 0xf9, 0x67, 0x16, 0x3c, 0x31, 0xe0, 0x9b, 0x1f, 0x82, 0x77, + 0xe7, 0x9b, 0x49, 0xef, 0xce, 0x3b, 0xc3, 0x0e, 0xe9, 0xcc, 0xef, 0x18, 0xe0, 0xe4, 0xf9, 0x9d, + 0x51, 0x38, 0xc3, 0x96, 0xad, 0xa6, 0xdf, 0xca, 0x69, 0xe3, 0x7c, 0x0a, 0x8a, 0x9f, 0x65, 0x1b, + 0x50, 0x7a, 0x90, 0xf1, 0x5d, 0x09, 0x05, 0x8c, 0x7c, 0xc9, 0x82, 0xf1, 0xcf, 0xca, 0x3d, 0x55, + 0x9c, 0xe5, 0x86, 0x5c, 0x0c, 0x13, 0xdf, 0x30, 0x2f, 0x77, 0x48, 0x11, 0x83, 0xa3, 0x7d, 0x39, + 0xd5, 0x56, 0xaa, 0x38, 0x93, 0x67, 0x60, 0x7c, 0xd3, 0x0f, 0x3a, 0xbd, 0xb6, 0x93, 0x0e, 0xfc, + 0xbc, 0x2e, 0x8a, 0x51, 0xc1, 0xd9, 0x24, 0x77, 0xba, 0xee, 0xeb, 0x34, 0x08, 0x45, 0x48, 0x46, + 0x62, 0x92, 0x57, 0x35, 0x04, 0x0d, 0x2c, 0x5e, 0xa7, 0xd5, 0x0a, 0x68, 0xcb, 0x89, 0xfc, 0x80, + 0xef, 0x1c, 0x66, 0x1d, 0x0d, 0x41, 0x03, 0x8b, 0x3c, 0x80, 0x72, 0x48, 0x1b, 0x01, 0x8d, 0x90, + 0x6e, 0xca, 0x63, 0xd1, 0x2b, 0xc3, 0x5a, 0x18, 0x24, 0xb9, 0xd8, 0xa9, 0x51, 0x17, 0x61, 0xcc, + 0x6c, 0xf6, 0x63, 0x30, 0x61, 0x36, 0xdb, 0xb1, 0x22, 0x89, 0x3e, 0x0e, 0xd2, 0x9d, 0x34, 0xb5, + 0x18, 0x5a, 0x47, 0x59, 0x0c, 0xed, 0xff, 0x34, 0x02, 0x86, 0x15, 0xec, 0x21, 0x2c, 0x32, 0x5e, + 0x62, 0x91, 0x19, 0xd2, 0x82, 0x63, 0xd8, 0xf4, 0x06, 0xc5, 0x55, 0xee, 0xa4, 0xe2, 0x2a, 0x6f, + 0xe5, 0xc6, 0xf1, 0xe0, 0xb0, 0xca, 0x1f, 0x58, 0xf0, 0x44, 0x8c, 0xdc, 0x6f, 0x3d, 0x3f, 0x7c, + 0xc7, 0x78, 0x01, 0x2a, 0x4e, 0x5c, 0x4d, 0x4e, 0x69, 0x23, 0xa8, 0x4d, 0x83, 0xd0, 0xc4, 0x8b, + 0x03, 0x72, 0x0a, 0x27, 0x0c, 0xc8, 0x19, 0x3d, 0x38, 0x20, 0xc7, 0xfe, 0xf1, 0x08, 0x5c, 0xec, + 0xff, 0x32, 0xd3, 0x4b, 0xfd, 0xf0, 0x6f, 0x4b, 0xfb, 0xb1, 0x8f, 0x9c, 0xd8, 0x8f, 0xbd, 0x70, + 0x54, 0x3f, 0x76, 0xed, 0x3d, 0x3e, 0x7a, 0xea, 0xde, 0xe3, 0x75, 0xb8, 0xa0, 0x5c, 0x55, 0xaf, + 0xfb, 0x81, 0x8c, 0x4a, 0x51, 0x6b, 0x57, 0xa9, 0x76, 0x51, 0x56, 0xb9, 0x80, 0x59, 0x48, 0x98, + 0x5d, 0xd7, 0xfe, 0x41, 0x01, 0xce, 0xc5, 0xcd, 0xbe, 0xe8, 0x7b, 0x4d, 0x97, 0x7b, 0x3b, 0xbd, + 0x04, 0xa3, 0xd1, 0x6e, 0x57, 0x35, 0xf6, 0x5f, 0x56, 0xe2, 0xac, 0xef, 0x76, 0x59, 0x6f, 0x3f, + 0x96, 0x51, 0x85, 0xdf, 0x5f, 0xf0, 0x4a, 0x64, 0x45, 0xcf, 0x0e, 0xd1, 0x03, 0xcf, 0x27, 0x47, + 0xf3, 0xbb, 0x7b, 0x73, 0x19, 0xf9, 0x25, 0xe6, 0x35, 0xa5, 0xe4, 0x98, 0x27, 0xf7, 0x60, 0xb2, + 0xed, 0x84, 0xd1, 0x9d, 0x6e, 0xd3, 0x89, 0xe8, 0xba, 0x2b, 0xfd, 0x88, 0x8e, 0x17, 0xc8, 0xa3, + 0x1d, 0x2e, 0x56, 0x12, 0x94, 0x30, 0x45, 0x99, 0xec, 0x00, 0x61, 0x25, 0xeb, 0x81, 0xe3, 0x85, + 0xe2, 0xab, 0x18, 0xbf, 0xe3, 0x47, 0x65, 0xe9, 0x43, 0xfb, 0x4a, 0x1f, 0x35, 0xcc, 0xe0, 0x40, + 0x9e, 0x86, 0xb1, 0x80, 0x3a, 0xa1, 0xde, 0x88, 0xf4, 0xfc, 0x47, 0x5e, 0x8a, 0x12, 0x6a, 0x4e, + 0xa8, 0xb1, 0x43, 0x26, 0xd4, 0x1f, 0x5a, 0x30, 0x19, 0x77, 0xd3, 0x43, 0x50, 0x7a, 0x3a, 0x49, + 0xa5, 0xe7, 0x46, 0x5e, 0x4b, 0xe2, 0x00, 0x3d, 0xe7, 0x4f, 0xc6, 0xcd, 0xef, 0xe3, 0xa1, 0x23, + 0x9f, 0x33, 0x23, 0x09, 0xac, 0x3c, 0xe2, 0xf9, 0x12, 0x7a, 0xe6, 0x81, 0x21, 0x04, 0x4c, 0xcb, + 0x6a, 0x4a, 0x0d, 0x4a, 0x0e, 0x7b, 0xad, 0x65, 0x29, 0xcd, 0x2a, 0x4b, 0xcb, 0x52, 0x75, 0xc8, + 0x1d, 0x78, 0xac, 0x1b, 0xf8, 0x3c, 0xc3, 0xc1, 0x12, 0x75, 0x9a, 0x6d, 0xd7, 0xa3, 0xca, 0xc0, + 0x24, 0xfc, 0x7d, 0x9e, 0xd8, 0xdf, 0x9b, 0x7b, 0x6c, 0x2d, 0x1b, 0x05, 0x07, 0xd5, 0x4d, 0xc6, + 0xc8, 0x8e, 0x1e, 0x21, 0x46, 0xf6, 0x97, 0xb4, 0x19, 0x57, 0x87, 0x63, 0x7c, 0x2a, 0xaf, 0xae, + 0xcc, 0x0a, 0xcc, 0xd0, 0x43, 0xaa, 0x2a, 0x99, 0xa2, 0x66, 0x3f, 0xd8, 0x56, 0x38, 0x76, 0x42, + 0x5b, 0x61, 0x1c, 0x81, 0x33, 0xfe, 0x5e, 0x46, 0xe0, 0x94, 0xde, 0x57, 0x11, 0x38, 0xdf, 0xb2, + 0xe0, 0x9c, 0xd3, 0x1f, 0xfb, 0x9e, 0x8f, 0xd9, 0x3a, 0x23, 0xa8, 0xbe, 0xf6, 0x84, 0x14, 0x32, + 0x2b, 0xc5, 0x00, 0x66, 0x89, 0x62, 0xbf, 0x53, 0x84, 0xe9, 0xb4, 0x92, 0x74, 0xfa, 0x41, 0xc2, + 0xbf, 0x62, 0xc1, 0xb4, 0x9a, 0xe0, 0xfa, 0xee, 0x5d, 0x1c, 0x6e, 0x56, 0x72, 0x5a, 0x57, 0x84, + 0xba, 0xa7, 0x73, 0xb7, 0xac, 0xa7, 0xb8, 0x61, 0x1f, 0x7f, 0xf2, 0x06, 0x54, 0xf4, 0x7d, 0xce, + 0x89, 0x22, 0x86, 0x79, 0x50, 0x6b, 0x35, 0x26, 0x81, 0x26, 0x3d, 0xf2, 0x8e, 0x05, 0xd0, 0x50, + 0x3b, 0x71, 0x4e, 0xf1, 0x58, 0x19, 0xda, 0x42, 0xac, 0xcf, 0xeb, 0xa2, 0x10, 0x0d, 0xc6, 0xe4, + 0x57, 0xf9, 0x4d, 0x8e, 0x1e, 0x09, 0xca, 0xe7, 0xe1, 0x13, 0x79, 0x2f, 0x45, 0xb1, 0x17, 0x8b, + 0xd6, 0xf6, 0x0c, 0x50, 0x88, 0x09, 0x21, 0xec, 0x97, 0x40, 0x7b, 0x8b, 0xb3, 0x95, 0x95, 0xfb, + 0x8b, 0xaf, 0x39, 0xd1, 0x96, 0x1c, 0x82, 0x7a, 0x65, 0xbd, 0xae, 0x00, 0x18, 0xe3, 0xd8, 0x9f, + 0x81, 0xc9, 0x57, 0x02, 0xa7, 0xbb, 0xe5, 0xf2, 0x1b, 0x13, 0x76, 0x32, 0x7f, 0x06, 0xc6, 0x9d, + 0x66, 0x33, 0x2b, 0xcd, 0x50, 0x55, 0x14, 0xa3, 0x82, 0x1f, 0xe9, 0x10, 0x6e, 0xff, 0x3b, 0x0b, + 0x48, 0x7c, 0xc7, 0xed, 0x7a, 0xad, 0x55, 0x27, 0x6a, 0x6c, 0xb1, 0x23, 0xdc, 0x16, 0x2f, 0xcd, + 0x3a, 0xc2, 0xdd, 0xd0, 0x10, 0x34, 0xb0, 0xc8, 0x5b, 0x50, 0x11, 0xff, 0x5e, 0xd7, 0x07, 0xc4, + 0xe1, 0x9d, 0xde, 0xf9, 0x9e, 0xc7, 0x65, 0x12, 0xa3, 0xf0, 0x46, 0xcc, 0x01, 0x4d, 0x76, 0xac, + 0xa9, 0x96, 0xbd, 0xcd, 0x76, 0xef, 0x41, 0x73, 0x23, 0x6e, 0xaa, 0x6e, 0xe0, 0x6f, 0xba, 0x6d, + 0x9a, 0x6e, 0xaa, 0x35, 0x51, 0x8c, 0x0a, 0x7e, 0xb4, 0xa6, 0xfa, 0xb7, 0x16, 0x9c, 0x5f, 0x0e, + 0x23, 0xd7, 0x5f, 0xa2, 0x61, 0xc4, 0x76, 0x3e, 0xb6, 0x3e, 0xf6, 0xda, 0x47, 0x09, 0xfc, 0x58, + 0x82, 0x69, 0x79, 0x03, 0xde, 0xdb, 0x08, 0x69, 0x64, 0x1c, 0x35, 0xf4, 0x3c, 0x5e, 0x4c, 0xc1, + 0xb1, 0xaf, 0x06, 0xa3, 0x22, 0xaf, 0xc2, 0x63, 0x2a, 0x85, 0x24, 0x95, 0x7a, 0x0a, 0x8e, 0x7d, + 0x35, 0xec, 0xef, 0x17, 0xe0, 0x1c, 0xff, 0x8c, 0x54, 0xd0, 0xd6, 0xd7, 0x07, 0x05, 0x6d, 0x0d, + 0x39, 0x95, 0x39, 0xaf, 0x13, 0x84, 0x6c, 0xfd, 0x4d, 0x0b, 0xa6, 0x9a, 0xc9, 0x96, 0xce, 0xc7, + 0x22, 0x98, 0xd5, 0x87, 0xc2, 0xf7, 0x31, 0x55, 0x88, 0x69, 0xfe, 0xe4, 0xd7, 0x2c, 0x98, 0x4a, + 0x8a, 0xa9, 0x56, 0xf7, 0x53, 0x68, 0x24, 0x1d, 0xac, 0x90, 0x2c, 0x0f, 0x31, 0x2d, 0x82, 0xfd, + 0xbd, 0x11, 0xd9, 0xa5, 0xa7, 0x11, 0x91, 0x44, 0xee, 0x43, 0x39, 0x6a, 0x87, 0xa2, 0x50, 0x7e, + 0xed, 0x90, 0x87, 0xd6, 0xf5, 0x95, 0xba, 0x70, 0x75, 0x89, 0xf5, 0x4a, 0x59, 0xc2, 0xf4, 0x63, + 0xc5, 0x8b, 0x33, 0x6e, 0x74, 0x25, 0xe3, 0x5c, 0x4e, 0xcb, 0xeb, 0x8b, 0x6b, 0x69, 0xc6, 0xb2, + 0x84, 0x31, 0x56, 0xbc, 0xec, 0xdf, 0xb2, 0xa0, 0x7c, 0xd3, 0x57, 0xeb, 0xc8, 0xcf, 0xe5, 0x60, + 0x8b, 0xd2, 0x2a, 0xab, 0x56, 0x5a, 0xe2, 0x53, 0xd0, 0xcb, 0x09, 0x4b, 0xd4, 0x93, 0x06, 0xed, + 0x79, 0x9e, 0x6d, 0x91, 0x91, 0xba, 0xe9, 0x6f, 0x0c, 0x34, 0x5c, 0xff, 0x7a, 0x11, 0xce, 0xbc, + 0xea, 0xec, 0x52, 0x2f, 0x72, 0x8e, 0xbf, 0x49, 0xbc, 0x00, 0x15, 0xa7, 0xcb, 0x6f, 0x51, 0x8d, + 0x63, 0x48, 0x6c, 0xdc, 0x89, 0x41, 0x68, 0xe2, 0xc5, 0x0b, 0x9a, 0x08, 0x0f, 0xca, 0x5a, 0x8a, + 0x16, 0x53, 0x70, 0xec, 0xab, 0x41, 0x6e, 0x02, 0x91, 0x21, 0xf5, 0xd5, 0x46, 0xc3, 0xef, 0x79, + 0x62, 0x49, 0x13, 0x76, 0x1f, 0x7d, 0x1e, 0x5e, 0xed, 0xc3, 0xc0, 0x8c, 0x5a, 0xe4, 0xd3, 0x30, + 0xd3, 0xe0, 0x94, 0xe5, 0xe9, 0xc8, 0xa4, 0x28, 0x4e, 0xc8, 0x3a, 0xe0, 0x66, 0x71, 0x00, 0x1e, + 0x0e, 0xa4, 0xc0, 0x24, 0x0d, 0x23, 0x3f, 0x70, 0x5a, 0xd4, 0xa4, 0x3b, 0x96, 0x94, 0xb4, 0xde, + 0x87, 0x81, 0x19, 0xb5, 0xc8, 0xe7, 0xa1, 0x1c, 0x6d, 0x05, 0x34, 0xdc, 0xf2, 0xdb, 0x4d, 0x69, + 0xde, 0x1d, 0xd2, 0x18, 0x28, 0x7b, 0x7f, 0x5d, 0x51, 0x35, 0x86, 0xb7, 0x2a, 0xc2, 0x98, 0x27, + 0x09, 0x60, 0x2c, 0x6c, 0xf8, 0x5d, 0x1a, 0xca, 0x53, 0xc5, 0xcd, 0x5c, 0xb8, 0x73, 0xe3, 0x96, + 0x61, 0x86, 0xe4, 0x1c, 0x50, 0x72, 0xb2, 0x7f, 0x77, 0x04, 0x26, 0x4c, 0xc4, 0x23, 0xac, 0x4d, + 0x5f, 0xb2, 0x60, 0xa2, 0xe1, 0x7b, 0x51, 0xe0, 0xb7, 0xe3, 0x54, 0x11, 0xc3, 0x6b, 0x14, 0x8c, + 0xd4, 0x12, 0x8d, 0x1c, 0xb7, 0x6d, 0x58, 0xeb, 0x0c, 0x36, 0x98, 0x60, 0x4a, 0xbe, 0x66, 0xc1, + 0x54, 0xec, 0x92, 0x19, 0xdb, 0xfa, 0x72, 0x15, 0x44, 0x2f, 0xf5, 0xd7, 0x92, 0x9c, 0x30, 0xcd, + 0xda, 0xde, 0x80, 0xe9, 0x74, 0x6f, 0xb3, 0xa6, 0xec, 0x3a, 0x72, 0xae, 0x17, 0xe2, 0xa6, 0x5c, + 0x73, 0xc2, 0x10, 0x39, 0x84, 0x3c, 0x0b, 0xa5, 0x8e, 0x13, 0xb4, 0x5c, 0xcf, 0x69, 0xf3, 0x56, + 0x2c, 0x18, 0x0b, 0x92, 0x2c, 0x47, 0x8d, 0x61, 0x7f, 0x18, 0x26, 0x56, 0x1d, 0xaf, 0x45, 0x9b, + 0x72, 0x1d, 0x3e, 0x3c, 0x26, 0xf6, 0x8f, 0x47, 0xa1, 0x62, 0x1c, 0x1f, 0x4f, 0xff, 0x9c, 0x95, + 0x48, 0x81, 0x54, 0xc8, 0x31, 0x05, 0xd2, 0x27, 0x01, 0x36, 0x5d, 0xcf, 0x0d, 0xb7, 0x4e, 0x98, + 0x5c, 0x89, 0x7b, 0x05, 0x5c, 0xd7, 0x14, 0xd0, 0xa0, 0x16, 0x5f, 0xbd, 0x16, 0x0f, 0xc8, 0x53, + 0xf8, 0x8e, 0x65, 0x6c, 0x37, 0x63, 0x79, 0xb8, 0x9a, 0x18, 0x1d, 0x33, 0xaf, 0xb6, 0x1f, 0x71, + 0x2b, 0x76, 0xd0, 0xae, 0xb4, 0x0e, 0xa5, 0x80, 0x86, 0xbd, 0x0e, 0x3d, 0x51, 0x1a, 0x24, 0xee, + 0xf4, 0x83, 0xb2, 0x3e, 0x6a, 0x4a, 0xb3, 0x2f, 0xc1, 0x99, 0x84, 0x08, 0xc7, 0xba, 0x61, 0xf2, + 0x21, 0xd3, 0x46, 0x71, 0x92, 0xfb, 0x26, 0xd6, 0x17, 0x6d, 0x23, 0xfd, 0x91, 0xee, 0x0b, 0xe1, + 0xda, 0x25, 0x60, 0xf6, 0x8f, 0xc7, 0x40, 0x7a, 0x4f, 0x1c, 0x61, 0xb9, 0x32, 0xef, 0x4c, 0x47, + 0x4e, 0x70, 0x67, 0x7a, 0x13, 0x26, 0x5c, 0xcf, 0x8d, 0x5c, 0xa7, 0xcd, 0xed, 0x4f, 0x72, 0x3b, + 0x55, 0x61, 0x00, 0x13, 0xcb, 0x06, 0x2c, 0x83, 0x4e, 0xa2, 0x2e, 0x79, 0x0d, 0x8a, 0x7c, 0xbf, + 0x91, 0x03, 0xf8, 0xf8, 0x2e, 0x1e, 0xdc, 0xbb, 0x47, 0xc4, 0x06, 0x0a, 0x4a, 0xfc, 0xf0, 0x21, + 0xf2, 0x3f, 0xe9, 0xe3, 0xb7, 0x1c, 0xc7, 0xf1, 0xe1, 0x23, 0x05, 0xc7, 0xbe, 0x1a, 0x8c, 0xca, + 0xa6, 0xe3, 0xb6, 0x7b, 0x01, 0x8d, 0xa9, 0x8c, 0x25, 0xa9, 0x5c, 0x4f, 0xc1, 0xb1, 0xaf, 0x06, + 0xd9, 0x84, 0x09, 0x59, 0x26, 0x1c, 0xf6, 0xc6, 0x4f, 0xf8, 0x95, 0xdc, 0x31, 0xf3, 0xba, 0x41, + 0x09, 0x13, 0x74, 0x49, 0x0f, 0xce, 0xba, 0x5e, 0xc3, 0xf7, 0x1a, 0xed, 0x5e, 0xe8, 0xee, 0xd0, + 0x38, 0x30, 0xef, 0x24, 0xcc, 0x2e, 0xec, 0xef, 0xcd, 0x9d, 0x5d, 0x4e, 0x93, 0xc3, 0x7e, 0x0e, + 0xe4, 0x0b, 0x16, 0x5c, 0x68, 0xf8, 0x5e, 0xc8, 0xf3, 0x87, 0xec, 0xd0, 0x6b, 0x41, 0xe0, 0x07, + 0x82, 0x77, 0xf9, 0x84, 0xbc, 0xb9, 0xd9, 0x73, 0x31, 0x8b, 0x24, 0x66, 0x73, 0x22, 0x6f, 0x42, + 0xa9, 0x1b, 0xf8, 0x3b, 0x6e, 0x93, 0x06, 0xd2, 0xf9, 0x73, 0x25, 0x8f, 0xa4, 0x4a, 0x6b, 0x92, + 0x66, 0xbc, 0xf4, 0xa8, 0x12, 0xd4, 0xfc, 0xec, 0xff, 0x5b, 0x81, 0xc9, 0x24, 0x3a, 0xf9, 0x05, + 0x80, 0x6e, 0xe0, 0x77, 0x68, 0xb4, 0x45, 0x75, 0x80, 0xd5, 0xad, 0x61, 0xd3, 0xe6, 0x28, 0x7a, + 0xca, 0x61, 0x8a, 0x2d, 0x17, 0x71, 0x29, 0x1a, 0x1c, 0x49, 0x00, 0xe3, 0xdb, 0x62, 0xdb, 0x95, + 0x5a, 0xc8, 0xab, 0xb9, 0xe8, 0x4c, 0x92, 0x33, 0x8f, 0x0c, 0x92, 0x45, 0xa8, 0x18, 0x91, 0x0d, + 0x28, 0xdc, 0xa7, 0x1b, 0xf9, 0xe4, 0x6c, 0xb8, 0x4b, 0xe5, 0x69, 0xa6, 0x36, 0xbe, 0xbf, 0x37, + 0x57, 0xb8, 0x4b, 0x37, 0x90, 0x11, 0x67, 0xdf, 0xd5, 0x14, 0x5e, 0x13, 0x72, 0xa9, 0x78, 0x35, + 0x47, 0x17, 0x0c, 0xf1, 0x5d, 0xb2, 0x08, 0x15, 0x23, 0xf2, 0x26, 0x94, 0xef, 0x3b, 0x3b, 0x74, + 0x33, 0xf0, 0xbd, 0x48, 0x7a, 0xe9, 0x0d, 0x19, 0xd6, 0x72, 0x57, 0x91, 0x93, 0x7c, 0xf9, 0xf6, + 0xae, 0x0b, 0x31, 0x66, 0x47, 0x76, 0xa0, 0xe4, 0xd1, 0xfb, 0x48, 0xdb, 0x6e, 0x23, 0x9f, 0x30, + 0x92, 0x5b, 0x92, 0x9a, 0xe4, 0xcc, 0xf7, 0x3d, 0x55, 0x86, 0x9a, 0x17, 0xeb, 0xcb, 0x7b, 0xfe, + 0x46, 0x3e, 0xce, 0x1c, 0xfa, 0x64, 0x2a, 0xfa, 0xf2, 0xa6, 0xbf, 0x81, 0x8c, 0x38, 0x9b, 0x23, + 0x0d, 0xed, 0x22, 0x26, 0x97, 0xa9, 0x5b, 0xf9, 0xba, 0xc6, 0x89, 0x39, 0x12, 0x97, 0xa2, 0xc1, + 0x91, 0xb5, 0x6d, 0x4b, 0x1a, 0x2b, 0xe5, 0x42, 0x35, 0x64, 0xdb, 0x26, 0x4d, 0x9f, 0xa2, 0x6d, + 0x55, 0x19, 0x6a, 0x5e, 0x8c, 0xaf, 0x2b, 0x2d, 0x7f, 0xf9, 0x2c, 0x55, 0x49, 0x3b, 0xa2, 0xe0, + 0xab, 0xca, 0x50, 0xf3, 0x62, 0xed, 0x1d, 0x6e, 0xef, 0xde, 0x77, 0xda, 0xdb, 0xae, 0xd7, 0x92, + 0x01, 0xc3, 0xc3, 0x06, 0xd8, 0x6d, 0xef, 0xde, 0x15, 0xf4, 0xcc, 0xf6, 0x8e, 0x4b, 0xd1, 0xe0, + 0x48, 0xfe, 0x9e, 0xa5, 0x83, 0x80, 0x26, 0xf2, 0x70, 0x9f, 0x4a, 0x2e, 0xb9, 0x32, 0x26, 0x48, + 0x28, 0x8a, 0x3f, 0xad, 0x3d, 0x3e, 0x79, 0xe1, 0x57, 0xff, 0x68, 0x6e, 0x86, 0x7a, 0x0d, 0xbf, + 0xe9, 0x7a, 0xad, 0x85, 0x7b, 0xa1, 0xef, 0xcd, 0xa3, 0x73, 0x5f, 0xe9, 0xe8, 0x52, 0xa6, 0xd9, + 0x8f, 0x42, 0xc5, 0x20, 0x71, 0x98, 0xa2, 0x37, 0x61, 0x2a, 0x7a, 0xbf, 0x35, 0x06, 0x13, 0x66, + 0x06, 0xd4, 0x23, 0x68, 0x5f, 0xfa, 0xc4, 0x31, 0x72, 0x9c, 0x13, 0x07, 0x3b, 0x62, 0x1a, 0x17, + 0x5c, 0xca, 0xbc, 0xb5, 0x9c, 0x9b, 0xc2, 0x1d, 0x1f, 0x31, 0x8d, 0xc2, 0x10, 0x13, 0x4c, 0x8f, + 0xe1, 0xf3, 0xc2, 0xd4, 0x56, 0xa1, 0xd8, 0x15, 0x93, 0x6a, 0x6b, 0x42, 0x55, 0xbb, 0x0a, 0x10, + 0xa7, 0xea, 0x94, 0x17, 0x9f, 0x5a, 0x1f, 0x36, 0x52, 0x88, 0x1a, 0x58, 0xe4, 0x69, 0x18, 0x63, + 0xaa, 0x0f, 0x6d, 0xca, 0x7c, 0x06, 0xfa, 0x1c, 0x7f, 0x9d, 0x97, 0xa2, 0x84, 0x92, 0x17, 0x99, + 0x96, 0x1a, 0x2b, 0x2c, 0x32, 0x4d, 0xc1, 0xf9, 0x58, 0x4b, 0x8d, 0x61, 0x98, 0xc0, 0x64, 0xa2, + 0x53, 0xa6, 0x5f, 0xf0, 0xb5, 0xc1, 0x10, 0x9d, 0x2b, 0x1d, 0x28, 0x60, 0xdc, 0xae, 0x94, 0xd2, + 0x47, 0xf8, 0x9c, 0x2e, 0x1a, 0x76, 0xa5, 0x14, 0x1c, 0xfb, 0x6a, 0xb0, 0x8f, 0x91, 0x77, 0xb6, + 0x15, 0xe1, 0xaa, 0x3d, 0xe0, 0xb6, 0xf5, 0x17, 0xcd, 0xb3, 0x56, 0x8e, 0x73, 0x48, 0x8c, 0xda, + 0xa3, 0x1f, 0xb6, 0x86, 0x3b, 0x16, 0x7d, 0xd9, 0x82, 0xc9, 0xe4, 0x36, 0x94, 0xf7, 0xd5, 0x07, + 0xf9, 0x4b, 0x30, 0x1e, 0xb9, 0x1d, 0xea, 0xf7, 0xc4, 0x61, 0xbb, 0x20, 0x76, 0xf6, 0x75, 0x51, + 0x84, 0x0a, 0x66, 0xff, 0xc3, 0x31, 0x38, 0x77, 0xab, 0xe5, 0x7a, 0xe9, 0xac, 0x74, 0x59, 0x4f, + 0x50, 0x58, 0xc7, 0x7e, 0x82, 0x42, 0x47, 0x0d, 0xca, 0x07, 0x1e, 0xb2, 0xa3, 0x06, 0xd5, 0x6b, + 0x1b, 0x49, 0x5c, 0xf2, 0x87, 0x16, 0x3c, 0xe9, 0x34, 0xc5, 0xf9, 0xc1, 0x69, 0xcb, 0x52, 0x23, + 0x73, 0xba, 0x9c, 0xf9, 0xe1, 0x90, 0xda, 0x40, 0xff, 0xc7, 0xcf, 0x57, 0x0f, 0xe0, 0x2a, 0x46, + 0xc6, 0x4f, 0xc9, 0x2f, 0x78, 0xf2, 0x20, 0x54, 0x3c, 0x50, 0x7c, 0xf2, 0x57, 0x61, 0x2a, 0xf1, + 0xc1, 0xd2, 0x62, 0x5e, 0x16, 0x17, 0x1b, 0xf5, 0x24, 0x08, 0xd3, 0xb8, 0xe4, 0x7b, 0x16, 0xcc, + 0x08, 0xf3, 0x6c, 0x46, 0xd3, 0x88, 0x1b, 0x5d, 0x3f, 0xff, 0xa6, 0x59, 0x1c, 0xc0, 0x51, 0x34, + 0x4b, 0x6c, 0xaf, 0x1d, 0x80, 0x86, 0x03, 0x45, 0x9e, 0xbd, 0x0d, 0x1f, 0x38, 0xb4, 0xdd, 0x8f, + 0x95, 0x67, 0xff, 0x55, 0xb8, 0x78, 0xa0, 0xb4, 0xc7, 0x9a, 0xb1, 0xdf, 0xb5, 0x60, 0xc2, 0xcc, + 0xae, 0x45, 0x9e, 0x85, 0x52, 0xe4, 0x6f, 0x53, 0xef, 0x4e, 0xa0, 0xfc, 0xad, 0xf5, 0x6a, 0xb1, + 0xce, 0xcb, 0x71, 0x05, 0x35, 0x06, 0xc3, 0x6e, 0xb4, 0x5d, 0xea, 0x45, 0xcb, 0x4d, 0x39, 0x07, + 0x34, 0xf6, 0xa2, 0x28, 0x5f, 0x42, 0x8d, 0x21, 0x1c, 0x15, 0xd9, 0x6f, 0xe1, 0xf1, 0x2b, 0xed, + 0x0a, 0x86, 0xa3, 0x62, 0x0c, 0xc3, 0x04, 0x26, 0xb1, 0xb5, 0x9d, 0x78, 0x34, 0xbe, 0x1c, 0x4a, + 0xd9, 0x75, 0xbf, 0x6d, 0x41, 0x59, 0xdc, 0x73, 0x20, 0xdd, 0x4c, 0x79, 0x48, 0xa7, 0x2c, 0x31, + 0xd5, 0xb5, 0xe5, 0x2c, 0x0f, 0xe9, 0xcb, 0x30, 0xba, 0xed, 0x7a, 0xea, 0x4b, 0xf4, 0xde, 0xfe, + 0xaa, 0xeb, 0x35, 0x91, 0x43, 0xf4, 0xee, 0x5f, 0x18, 0xb8, 0xfb, 0x2f, 0x40, 0x59, 0x7b, 0xef, + 0xc8, 0x3d, 0x34, 0x76, 0x74, 0x56, 0x00, 0x8c, 0x71, 0xec, 0xdf, 0xb0, 0x60, 0x92, 0x07, 0xfc, + 0xc7, 0x46, 0x85, 0x17, 0xb4, 0x43, 0x9d, 0x90, 0xfb, 0x62, 0xd2, 0xa1, 0xee, 0xdd, 0xbd, 0xb9, + 0x8a, 0x48, 0x11, 0x90, 0xf4, 0xaf, 0xfb, 0x94, 0xb4, 0x44, 0x72, 0xb7, 0xbf, 0x91, 0x63, 0x1b, + 0xca, 0x62, 0x31, 0x15, 0x11, 0x8c, 0xe9, 0xd9, 0x6f, 0xc1, 0x84, 0x19, 0x4b, 0x47, 0x5e, 0x80, + 0x4a, 0xd7, 0xf5, 0x5a, 0xc9, 0x98, 0x6b, 0x7d, 0x5b, 0xb3, 0x16, 0x83, 0xd0, 0xc4, 0xe3, 0xd5, + 0xfc, 0xb8, 0x5a, 0xea, 0x92, 0x67, 0xcd, 0x37, 0xab, 0xc5, 0x7f, 0x6c, 0x0f, 0x20, 0x0e, 0x0c, + 0x3f, 0x92, 0x05, 0x6c, 0x4c, 0x5c, 0xa0, 0x08, 0x8d, 0x8e, 0x27, 0xf9, 0x18, 0x13, 0x23, 0xfc, + 0xdd, 0xbd, 0x83, 0x34, 0x46, 0x51, 0x8b, 0x3f, 0x21, 0x92, 0x11, 0x23, 0x9a, 0xfb, 0x13, 0x22, + 0x19, 0x3c, 0xde, 0xbb, 0x27, 0x44, 0xb2, 0x84, 0xf9, 0xf3, 0xf5, 0x84, 0xc8, 0x27, 0xe0, 0xb8, + 0xd9, 0x84, 0x99, 0x82, 0x76, 0xdf, 0xcc, 0xfa, 0xa1, 0x5b, 0x5c, 0xa6, 0xfd, 0x90, 0x50, 0xfb, + 0xf7, 0x46, 0x61, 0x3a, 0x6d, 0xa7, 0xc9, 0xdb, 0x05, 0x86, 0x7c, 0xcd, 0x82, 0x49, 0x27, 0x91, + 0xb9, 0x31, 0xa7, 0xf7, 0xc8, 0x12, 0x34, 0x8d, 0xcc, 0x81, 0x89, 0x72, 0x4c, 0xf1, 0x36, 0x75, + 0xad, 0xd1, 0xc1, 0xba, 0x16, 0xdb, 0x04, 0x5c, 0xae, 0xf6, 0x06, 0x54, 0xba, 0x73, 0x4f, 0xc7, + 0xe6, 0x66, 0x51, 0x8e, 0x1a, 0x83, 0x3c, 0x80, 0x71, 0xe1, 0x2c, 0xa3, 0xbc, 0xa2, 0x56, 0x73, + 0xb2, 0x27, 0x09, 0x7f, 0x9c, 0xb8, 0x0b, 0xc4, 0xff, 0x10, 0x15, 0x3b, 0xa6, 0x63, 0x43, 0xe0, + 0x78, 0x2d, 0xca, 0xdb, 0x5c, 0x5a, 0x40, 0x5e, 0xcf, 0xcb, 0x74, 0x87, 0x9a, 0x72, 0x35, 0x68, + 0x85, 0x32, 0x26, 0x53, 0x97, 0xa1, 0xc1, 0xd9, 0xfe, 0x15, 0x0b, 0x66, 0x06, 0x55, 0x64, 0x03, + 0x85, 0xaf, 0xba, 0x72, 0x44, 0x19, 0xa9, 0x20, 0x9c, 0x20, 0x42, 0x01, 0x23, 0x17, 0xa1, 0x40, + 0xf5, 0x46, 0xa5, 0xf3, 0x56, 0x5e, 0xf3, 0x9a, 0xc8, 0xca, 0xc9, 0x55, 0x18, 0x0d, 0x23, 0xda, + 0x4d, 0xc5, 0x3b, 0x8c, 0xb2, 0xc5, 0x33, 0xc3, 0x60, 0xcf, 0x71, 0xed, 0x0f, 0xc3, 0x31, 0x93, + 0x4f, 0xdb, 0xd7, 0x80, 0xa0, 0xdf, 0x6e, 0x6f, 0x38, 0x8d, 0xed, 0xbb, 0xae, 0xd7, 0xf4, 0xef, + 0xf3, 0x8d, 0x61, 0x01, 0xca, 0x81, 0x8c, 0x3f, 0x0f, 0xe5, 0x9c, 0xd2, 0x3b, 0x8b, 0x0a, 0x4c, + 0x0f, 0x31, 0xc6, 0xb1, 0xbf, 0x37, 0x02, 0xe3, 0x32, 0x59, 0xc2, 0x43, 0x08, 0xb6, 0xd9, 0x4e, + 0xb8, 0x38, 0x2c, 0xe7, 0x92, 0xe3, 0x61, 0x60, 0xa4, 0x4d, 0x98, 0x8a, 0xb4, 0x79, 0x35, 0x1f, + 0x76, 0x07, 0x87, 0xd9, 0x7c, 0xa7, 0x08, 0x53, 0xa9, 0xe4, 0x13, 0xa9, 0x3c, 0xf5, 0xd6, 0x7b, + 0x92, 0xa7, 0x9e, 0x84, 0x89, 0xb7, 0x0a, 0xf2, 0x73, 0xcd, 0xfd, 0xc9, 0xb3, 0x05, 0x79, 0x39, + 0x4d, 0x17, 0xdf, 0x3f, 0x4e, 0xd3, 0xff, 0xcd, 0x82, 0xc7, 0x07, 0xa6, 0x50, 0xe1, 0xc9, 0x08, + 0x83, 0x24, 0x54, 0xae, 0x17, 0x39, 0xa7, 0xa5, 0xd2, 0xee, 0x10, 0xe9, 0xfc, 0x71, 0x69, 0xf6, + 0xe4, 0x79, 0x98, 0xe0, 0x6b, 0x33, 0x5b, 0x39, 0xd9, 0xda, 0x2b, 0x6e, 0x73, 0xf9, 0xbd, 0x5e, + 0xdd, 0x28, 0xc7, 0x04, 0x96, 0xfd, 0x2d, 0x0b, 0x66, 0x06, 0xa5, 0xa6, 0x3b, 0x82, 0x9e, 0xfb, + 0x57, 0x52, 0xc1, 0x4a, 0x73, 0x7d, 0xc1, 0x4a, 0x29, 0x6b, 0xa3, 0x8a, 0x4b, 0x32, 0x0c, 0x7d, + 0x85, 0x43, 0x62, 0x71, 0x7e, 0xbf, 0x00, 0xd3, 0x52, 0xc4, 0xf8, 0x88, 0xf2, 0x62, 0x22, 0xc4, + 0xea, 0xa7, 0x52, 0x21, 0x56, 0xe7, 0xd3, 0xf8, 0x3f, 0x89, 0xaf, 0x7a, 0x7f, 0xc5, 0x57, 0x7d, + 0xb5, 0x08, 0x17, 0x32, 0x93, 0xc0, 0x91, 0xaf, 0x64, 0xec, 0x14, 0x77, 0x73, 0xce, 0x36, 0xa7, + 0x83, 0xc0, 0x4f, 0x37, 0x28, 0xe9, 0xd7, 0xcc, 0x60, 0x20, 0xb1, 0xfa, 0x6f, 0x9e, 0x42, 0xde, + 0xbc, 0xe3, 0xc6, 0x05, 0x3d, 0xdc, 0x77, 0xfc, 0xfe, 0x1c, 0x2c, 0xf5, 0x5f, 0x2d, 0xc0, 0x95, + 0xa3, 0xb6, 0xec, 0xfb, 0x34, 0x90, 0x36, 0x4c, 0x04, 0xd2, 0x3e, 0x24, 0xd5, 0xe6, 0x54, 0x62, + 0x6a, 0xff, 0xc1, 0xa8, 0xde, 0x77, 0xfb, 0x27, 0xec, 0x91, 0x2c, 0x2f, 0xe3, 0x4c, 0xf5, 0x55, + 0xaf, 0x1d, 0xc4, 0x7b, 0xc3, 0x78, 0x5d, 0x14, 0xbf, 0xbb, 0x37, 0x77, 0x36, 0xce, 0x96, 0x24, + 0x0b, 0x51, 0x55, 0x22, 0x57, 0xa0, 0x14, 0x08, 0xa8, 0x0a, 0x1d, 0x94, 0x0e, 0x5c, 0xa2, 0x0c, + 0x35, 0x94, 0x7c, 0xde, 0x38, 0x2b, 0x8c, 0x9e, 0x56, 0x52, 0xb0, 0x83, 0xfc, 0xd2, 0xde, 0x80, + 0x52, 0xa8, 0x52, 0xf2, 0x8b, 0xe9, 0xf4, 0xdc, 0x11, 0x23, 0x52, 0x9d, 0x0d, 0xda, 0x56, 0xf9, + 0xf9, 0xc5, 0xf7, 0xe9, 0xec, 0xfd, 0x9a, 0x24, 0xb1, 0xb5, 0x65, 0x42, 0xdc, 0x9b, 0x41, 0xbf, + 0x55, 0x82, 0x44, 0x30, 0x2e, 0xdf, 0xe5, 0x96, 0xc7, 0xd9, 0xd5, 0x9c, 0x42, 0xbb, 0xa4, 0xe3, + 0x3f, 0x3f, 0xf0, 0x2b, 0x8b, 0x9c, 0x62, 0x65, 0xff, 0xc0, 0x82, 0x8a, 0x1c, 0x23, 0x0f, 0x21, + 0x34, 0xf7, 0x5e, 0x32, 0x34, 0xf7, 0x5a, 0x2e, 0x4b, 0xf8, 0x80, 0xb8, 0xdc, 0x7b, 0x30, 0x61, + 0xa6, 0x63, 0x25, 0x9f, 0x34, 0xb6, 0x20, 0x6b, 0x98, 0x94, 0x83, 0x6a, 0x93, 0x8a, 0xb7, 0x27, + 0xfb, 0x9f, 0x96, 0x75, 0x2b, 0xf2, 0x83, 0xb3, 0x39, 0xf2, 0xad, 0x03, 0x47, 0xbe, 0x39, 0xf0, + 0x46, 0xf2, 0x1f, 0x78, 0xaf, 0x41, 0x49, 0x2d, 0x8b, 0x52, 0x9b, 0x7a, 0xca, 0x8c, 0x04, 0x60, + 0x2a, 0x19, 0x23, 0x66, 0x4c, 0x17, 0x7e, 0x00, 0x8e, 0xef, 0x09, 0xd4, 0x72, 0xad, 0xc9, 0x90, + 0x37, 0xa1, 0x72, 0xdf, 0x0f, 0xb6, 0xdb, 0xbe, 0xc3, 0xdf, 0x41, 0x81, 0x3c, 0x9c, 0x4f, 0xb4, + 0xad, 0x5f, 0x84, 0x63, 0xdd, 0x8d, 0xe9, 0xa3, 0xc9, 0x8c, 0x54, 0x61, 0xaa, 0xe3, 0x7a, 0x48, + 0x9d, 0xa6, 0x8e, 0xc0, 0x1d, 0x15, 0x6f, 0x10, 0x28, 0xdd, 0x7e, 0x35, 0x09, 0xc6, 0x34, 0x3e, + 0xb7, 0xcb, 0x05, 0x09, 0x53, 0x87, 0x4c, 0x34, 0xbe, 0x36, 0xfc, 0x60, 0x4c, 0x9a, 0x4f, 0x44, + 0x3c, 0x52, 0xb2, 0x1c, 0x53, 0xbc, 0xc9, 0xe7, 0xa0, 0x14, 0xaa, 0x17, 0x6f, 0x8b, 0x39, 0x9e, + 0x7a, 0xf4, 0xab, 0xb7, 0xba, 0x2b, 0xf5, 0xb3, 0xb7, 0x9a, 0x21, 0x59, 0x81, 0xf3, 0xca, 0x76, + 0x93, 0x78, 0xbc, 0x73, 0x2c, 0x4e, 0x96, 0x87, 0x19, 0x70, 0xcc, 0xac, 0xc5, 0x74, 0x5b, 0x9e, + 0xe6, 0x58, 0x5c, 0xf6, 0x1b, 0xf7, 0xe3, 0x7c, 0xfe, 0x35, 0x51, 0x42, 0x0f, 0x0a, 0x30, 0x2f, + 0x0d, 0x11, 0x60, 0x5e, 0x87, 0x0b, 0x69, 0x10, 0xcf, 0x82, 0xc8, 0x13, 0x2f, 0x1a, 0x5b, 0xe8, + 0x5a, 0x16, 0x12, 0x66, 0xd7, 0x25, 0x77, 0xa1, 0x1c, 0x50, 0x7e, 0xca, 0xab, 0x2a, 0x3f, 0xc9, + 0x63, 0x7b, 0x84, 0xa3, 0x22, 0x80, 0x31, 0x2d, 0xd6, 0xef, 0x4e, 0xf2, 0x55, 0x80, 0xd7, 0x72, + 0x7c, 0x12, 0x5f, 0xf6, 0xfd, 0x80, 0xec, 0xa4, 0xf6, 0xbf, 0x9f, 0x82, 0x33, 0x09, 0x03, 0x14, + 0x79, 0x0a, 0x8a, 0x3c, 0x2d, 0x24, 0x5f, 0xad, 0x4a, 0xf1, 0x8a, 0x2a, 0x1a, 0x47, 0xc0, 0xc8, + 0x2f, 0x5b, 0x30, 0xd5, 0x4d, 0x5c, 0x6f, 0xa9, 0x85, 0x7c, 0x48, 0x9b, 0x76, 0xf2, 0xce, 0xcc, + 0x78, 0x4f, 0x27, 0xc9, 0x0c, 0xd3, 0xdc, 0xd9, 0x7a, 0x20, 0xc3, 0x2a, 0xda, 0x34, 0xe0, 0xd8, + 0x52, 0xd1, 0xd3, 0x24, 0x16, 0x93, 0x60, 0x4c, 0xe3, 0xb3, 0x1e, 0xe6, 0x5f, 0x37, 0xcc, 0xb3, + 0xc7, 0x55, 0x45, 0x00, 0x63, 0x5a, 0xe4, 0x65, 0x98, 0x94, 0xc9, 0xe0, 0xd7, 0xfc, 0xe6, 0x0d, + 0x27, 0xdc, 0x92, 0x47, 0x3e, 0x7d, 0x44, 0x5d, 0x4c, 0x40, 0x31, 0x85, 0xcd, 0xbf, 0x2d, 0xce, + 0xb8, 0xcf, 0x09, 0x8c, 0x25, 0x9f, 0x1b, 0x5a, 0x4c, 0x82, 0x31, 0x8d, 0x4f, 0x9e, 0x35, 0xb6, + 0x21, 0xe1, 0x80, 0xa3, 0x57, 0x83, 0x8c, 0xad, 0xa8, 0x0a, 0x53, 0x3d, 0x7e, 0x42, 0x6e, 0x2a, + 0xa0, 0x9c, 0x8f, 0x9a, 0xe1, 0x9d, 0x24, 0x18, 0xd3, 0xf8, 0xe4, 0x25, 0x38, 0x13, 0xb0, 0xc5, + 0x56, 0x13, 0x10, 0x5e, 0x39, 0xda, 0x99, 0x02, 0x4d, 0x20, 0x26, 0x71, 0xc9, 0x2b, 0x70, 0x36, + 0x4e, 0x18, 0xac, 0x08, 0x08, 0x37, 0x1d, 0x9d, 0xbd, 0xb2, 0x9a, 0x46, 0xc0, 0xfe, 0x3a, 0xe4, + 0xaf, 0xc3, 0xb4, 0xd1, 0x12, 0xcb, 0x5e, 0x93, 0x3e, 0x90, 0x49, 0x5d, 0xf9, 0xf3, 0x79, 0x8b, + 0x29, 0x18, 0xf6, 0x61, 0x93, 0x8f, 0xc1, 0x64, 0xc3, 0x6f, 0xb7, 0xf9, 0x1a, 0x27, 0x9e, 0xba, + 0x11, 0xd9, 0x5b, 0x45, 0x9e, 0xdb, 0x04, 0x04, 0x53, 0x98, 0xe4, 0x26, 0x10, 0x7f, 0x83, 0xa9, + 0x57, 0xb4, 0xf9, 0x0a, 0xf5, 0xa8, 0xd4, 0x38, 0xce, 0x24, 0x83, 0xba, 0x6e, 0xf7, 0x61, 0x60, + 0x46, 0x2d, 0x9e, 0xfc, 0xd2, 0x08, 0x82, 0x9f, 0xcc, 0x23, 0xdd, 0x7e, 0xda, 0x9e, 0x73, 0x68, + 0x04, 0x7c, 0x00, 0x63, 0xc2, 0x23, 0x22, 0x9f, 0x34, 0xae, 0xe6, 0xab, 0x17, 0xf1, 0x1e, 0x21, + 0x4a, 0x51, 0x72, 0x22, 0xbf, 0x00, 0xe5, 0x0d, 0xf5, 0x04, 0x12, 0xcf, 0xdd, 0x3a, 0xf4, 0xbe, + 0x98, 0x7a, 0xcd, 0x2b, 0xb6, 0x57, 0x68, 0x00, 0xc6, 0x2c, 0xc9, 0xd3, 0x50, 0xb9, 0xb1, 0x56, + 0xd5, 0xa3, 0xf0, 0x2c, 0xef, 0xfd, 0x51, 0x56, 0x05, 0x4d, 0x00, 0x9b, 0x61, 0x5a, 0x7d, 0x23, + 0x49, 0xa7, 0x89, 0x0c, 0x6d, 0x8c, 0x61, 0x73, 0x17, 0x19, 0xac, 0xcf, 0x9c, 0x4b, 0x61, 0xcb, + 0x72, 0xd4, 0x18, 0xe4, 0x0d, 0xa8, 0xc8, 0xfd, 0x82, 0xaf, 0x4d, 0xe7, 0x4f, 0x96, 0x60, 0x01, + 0x63, 0x12, 0x68, 0xd2, 0xe3, 0xd7, 0xf7, 0xfc, 0x65, 0x18, 0x7a, 0xbd, 0xd7, 0x6e, 0xcf, 0x5c, + 0xe0, 0xeb, 0x66, 0x7c, 0x7d, 0x1f, 0x83, 0xd0, 0xc4, 0x23, 0xcf, 0x29, 0x97, 0xc8, 0x47, 0x13, + 0xfe, 0x0c, 0xda, 0x25, 0x52, 0x2b, 0xdd, 0x03, 0x62, 0xb0, 0x1e, 0x3b, 0xc4, 0x17, 0x71, 0x03, + 0x66, 0x95, 0xc6, 0xd7, 0x3f, 0x49, 0x66, 0x66, 0x12, 0xb6, 0xa3, 0xd9, 0xbb, 0x03, 0x31, 0xf1, + 0x00, 0x2a, 0x64, 0x03, 0x0a, 0x4e, 0x7b, 0x63, 0xe6, 0xf1, 0x3c, 0x54, 0xd7, 0xea, 0x4a, 0x4d, + 0x8e, 0x28, 0xee, 0x37, 0x5d, 0x5d, 0xa9, 0x21, 0x23, 0x4e, 0x5c, 0x18, 0x75, 0xda, 0x1b, 0xe1, + 0xcc, 0x2c, 0x9f, 0xb3, 0xb9, 0x31, 0x89, 0x8d, 0x07, 0x2b, 0xb5, 0x10, 0x39, 0x0b, 0xfb, 0x0b, + 0x23, 0xfa, 0x96, 0x48, 0x67, 0xd2, 0x7f, 0xcb, 0x9c, 0x40, 0xe2, 0xb8, 0x73, 0x3b, 0xb7, 0x09, + 0x24, 0xd5, 0x8b, 0x33, 0x03, 0xa7, 0x4f, 0x57, 0x2f, 0x19, 0xb9, 0x24, 0xc2, 0x4b, 0xbe, 0x12, + 0x20, 0x4e, 0xcf, 0xc9, 0x05, 0xc3, 0xfe, 0x62, 0x45, 0x5b, 0x41, 0x53, 0x6e, 0x82, 0x01, 0x14, + 0xdd, 0x30, 0x72, 0xfd, 0x1c, 0xf3, 0x0e, 0xa4, 0xd2, 0xeb, 0xf3, 0xb0, 0x26, 0x0e, 0x40, 0xc1, + 0x8a, 0xf1, 0xf4, 0x5a, 0xae, 0xf7, 0x40, 0x7e, 0xfe, 0x6b, 0xb9, 0x3b, 0xb9, 0x09, 0x9e, 0x1c, + 0x80, 0x82, 0x15, 0xb9, 0x27, 0x06, 0x75, 0x21, 0x8f, 0xbe, 0xae, 0xae, 0xd4, 0x52, 0xfc, 0x92, + 0x83, 0xfb, 0x1e, 0x14, 0xc2, 0x8e, 0x2b, 0xd5, 0xa5, 0x21, 0x79, 0xd5, 0x57, 0x97, 0xb3, 0x78, + 0xd5, 0x57, 0x97, 0x91, 0x31, 0xe1, 0x57, 0xfd, 0x4e, 0x67, 0xc3, 0x09, 0x43, 0xa7, 0xa9, 0xad, + 0x33, 0x43, 0x5e, 0xf5, 0x57, 0x35, 0xbd, 0x14, 0x6b, 0x7e, 0xd5, 0x1f, 0x43, 0xd1, 0xe0, 0x4c, + 0xde, 0x84, 0x71, 0x47, 0x3c, 0xd1, 0x2a, 0x83, 0x3c, 0xf2, 0x79, 0x77, 0x38, 0x25, 0x01, 0x37, + 0xd3, 0x48, 0x10, 0x2a, 0x86, 0x8c, 0x77, 0x14, 0x38, 0x74, 0xd3, 0xdd, 0x96, 0xc6, 0xa1, 0xfa, + 0xd0, 0x8f, 0x08, 0x31, 0x62, 0x59, 0xbc, 0x25, 0x08, 0x15, 0x43, 0xf2, 0x65, 0x0b, 0xce, 0x74, + 0x1c, 0xcf, 0xd1, 0xa1, 0xbb, 0xf9, 0x04, 0x78, 0x9b, 0xc1, 0xc0, 0xb1, 0x86, 0xb8, 0x6a, 0x32, + 0xc2, 0x24, 0x5f, 0xb2, 0x03, 0x63, 0x0e, 0x7f, 0x3c, 0x5a, 0x1e, 0xc5, 0x30, 0x8f, 0x87, 0xa8, + 0x53, 0x6d, 0xc0, 0x17, 0x17, 0xf9, 0x44, 0xb5, 0xe4, 0x46, 0x7e, 0xd3, 0x82, 0x71, 0x11, 0x7f, + 0xc0, 0x14, 0x52, 0xf6, 0xed, 0x9f, 0x39, 0x85, 0x67, 0x3a, 0x64, 0x6c, 0x84, 0x74, 0xce, 0xfa, + 0xa0, 0xf6, 0xad, 0x16, 0xa5, 0x07, 0x46, 0x47, 0x28, 0xe9, 0x98, 0xea, 0xdb, 0x71, 0x1e, 0x24, + 0x9e, 0x88, 0x32, 0x55, 0xdf, 0xd5, 0x14, 0x0c, 0xfb, 0xb0, 0x67, 0x3f, 0x06, 0x13, 0xa6, 0x1c, + 0xc7, 0x8a, 0xb0, 0xf8, 0x51, 0x01, 0x80, 0x77, 0x95, 0x48, 0xf7, 0xd3, 0xe1, 0x59, 0xc9, 0xb7, + 0xfc, 0x66, 0x4e, 0x4f, 0xd5, 0x1a, 0x59, 0x7b, 0x40, 0xa6, 0x20, 0xdf, 0xf2, 0x9b, 0x28, 0x99, + 0x90, 0x16, 0x8c, 0x76, 0x9d, 0x68, 0x2b, 0xff, 0x14, 0x41, 0x25, 0x11, 0xf7, 0x1e, 0x6d, 0x21, + 0x67, 0x40, 0xde, 0xb6, 0x62, 0xbf, 0xa7, 0x42, 0x1e, 0x89, 0x95, 0xe3, 0x36, 0x9b, 0x97, 0x9e, + 0x4e, 0xa9, 0xfc, 0xc2, 0x69, 0xff, 0xa7, 0xd9, 0x77, 0x2c, 0x98, 0x30, 0x51, 0x33, 0xba, 0xe9, + 0xe7, 0xcd, 0x6e, 0xca, 0xb3, 0x3d, 0xcc, 0x1e, 0xff, 0x1f, 0x16, 0x00, 0xf6, 0xbc, 0x7a, 0xaf, + 0xd3, 0x61, 0x6a, 0xbb, 0x0e, 0x24, 0xb1, 0x8e, 0x1c, 0x48, 0x32, 0x72, 0xcc, 0x40, 0x92, 0xc2, + 0xb1, 0x02, 0x49, 0x46, 0x8f, 0x1f, 0x48, 0x52, 0x1c, 0x1c, 0x48, 0x62, 0x7f, 0xc3, 0x82, 0xb3, + 0x7d, 0xfb, 0x15, 0xd3, 0xa4, 0x03, 0xdf, 0x8f, 0x06, 0xf8, 0xcf, 0x62, 0x0c, 0x42, 0x13, 0x8f, + 0x2c, 0xc1, 0xb4, 0x7c, 0x83, 0xa7, 0xde, 0x6d, 0xbb, 0x99, 0xe9, 0x9b, 0xd6, 0x53, 0x70, 0xec, + 0xab, 0x61, 0xff, 0x6b, 0x0b, 0x2a, 0x46, 0xd2, 0x07, 0xee, 0x73, 0xc6, 0x6f, 0xbc, 0xd2, 0x3e, + 0x67, 0xfc, 0xaa, 0x4b, 0xc0, 0xc4, 0x35, 0x74, 0xcb, 0x78, 0xa1, 0x21, 0xbe, 0x86, 0x66, 0xa5, + 0x28, 0xa1, 0x22, 0xf7, 0xbe, 0x74, 0x3e, 0x2b, 0x98, 0xb9, 0xf7, 0x69, 0x57, 0xb8, 0x9a, 0xc5, + 0x2e, 0x6e, 0xa3, 0x87, 0xbb, 0xb8, 0x15, 0xb3, 0x5d, 0xdc, 0xec, 0xdb, 0x30, 0x21, 0x7c, 0xc3, + 0x5f, 0xa5, 0xbb, 0x47, 0x7e, 0xeb, 0x99, 0x8d, 0xf6, 0x94, 0xcf, 0x1c, 0xab, 0xce, 0xca, 0x6d, + 0x07, 0xe2, 0x44, 0xd4, 0x47, 0xa0, 0x76, 0x15, 0x40, 0xa7, 0xc4, 0x17, 0x8e, 0x78, 0xa5, 0x78, + 0x40, 0xea, 0xbc, 0xf9, 0x4d, 0x34, 0xb0, 0xec, 0x7f, 0x62, 0x41, 0xea, 0x8d, 0x31, 0xe3, 0x92, + 0xc7, 0x1a, 0x78, 0xc9, 0x63, 0x5e, 0x0c, 0x8c, 0x1c, 0x78, 0x31, 0x70, 0x13, 0x48, 0x87, 0xcd, + 0xb6, 0xe4, 0x5a, 0x5e, 0x48, 0x3e, 0xc5, 0xb2, 0xda, 0x87, 0x81, 0x19, 0xb5, 0xec, 0x7f, 0x2c, + 0x84, 0x35, 0x5f, 0x1d, 0x3b, 0xbc, 0x55, 0x7a, 0x50, 0xe4, 0xa4, 0xa4, 0x89, 0x6f, 0x48, 0xf3, + 0x78, 0x7f, 0x36, 0xb8, 0x78, 0xac, 0xc8, 0x55, 0x85, 0x73, 0xb3, 0x7f, 0x5f, 0xc8, 0x6a, 0x3e, + 0x4b, 0x76, 0xb8, 0xac, 0x9d, 0xa4, 0xac, 0x37, 0xf2, 0x5a, 0x8e, 0xb3, 0x65, 0x24, 0xf3, 0x00, + 0x5d, 0x1a, 0x34, 0xa8, 0x17, 0xa9, 0xe8, 0xba, 0xa2, 0x8c, 0xf3, 0xd6, 0xa5, 0x68, 0x60, 0xd8, + 0x5f, 0x67, 0x73, 0x34, 0x7e, 0x68, 0x9d, 0x5c, 0x49, 0xfb, 0x1a, 0xa7, 0xe7, 0x9f, 0x76, 0x35, + 0x36, 0x42, 0xae, 0x46, 0x0e, 0x09, 0xb9, 0x7a, 0x06, 0xc6, 0x03, 0xbf, 0x4d, 0xab, 0x81, 0x97, + 0x76, 0x03, 0x42, 0x56, 0x8c, 0xb7, 0x50, 0xc1, 0xed, 0x5f, 0xb7, 0x60, 0x3a, 0x1d, 0x14, 0x9a, + 0xbb, 0x03, 0xb4, 0x99, 0xb9, 0xa2, 0x70, 0xfc, 0xcc, 0x15, 0xf6, 0x9f, 0x16, 0x61, 0x3a, 0xfd, + 0x00, 0x24, 0xe3, 0xec, 0x72, 0x7b, 0x5e, 0x6a, 0x83, 0x11, 0x86, 0x3c, 0x01, 0xd3, 0xe3, 0x65, + 0x64, 0xe0, 0x78, 0xb9, 0x0e, 0x65, 0xbf, 0xab, 0x6c, 0x0a, 0x42, 0xb8, 0x2b, 0xca, 0x1e, 0x74, + 0x5b, 0x01, 0xde, 0xdd, 0x9b, 0x3b, 0x17, 0x0b, 0xa0, 0x8b, 0x31, 0xae, 0x4a, 0x7e, 0x46, 0x19, + 0x43, 0x46, 0x13, 0xb9, 0xa0, 0xb4, 0x31, 0x64, 0x2a, 0xae, 0x3f, 0xc8, 0x1e, 0x52, 0x3c, 0x4e, + 0x4e, 0x9a, 0xb1, 0x1c, 0x73, 0xd2, 0xdc, 0x85, 0xb2, 0x34, 0xdf, 0x9e, 0x28, 0x17, 0x0b, 0x27, + 0x7c, 0x47, 0x11, 0xc0, 0x98, 0x56, 0x2a, 0xd9, 0x4d, 0x29, 0xd7, 0x64, 0x37, 0x2f, 0xc1, 0xf8, + 0x86, 0xd3, 0xd8, 0xf6, 0x37, 0x37, 0xf9, 0x11, 0xa0, 0x5c, 0xfb, 0x80, 0x6a, 0xb8, 0x9a, 0x28, + 0xce, 0x18, 0x52, 0xaa, 0x06, 0x5b, 0xe7, 0xa9, 0xf2, 0x78, 0x56, 0x96, 0x65, 0xbd, 0xce, 0x6b, + 0x5f, 0xe8, 0x10, 0x0d, 0x2c, 0xf2, 0x2c, 0x94, 0x9a, 0x6e, 0x28, 0x9e, 0x28, 0xaf, 0x24, 0x1d, + 0xe2, 0x97, 0x64, 0x39, 0x6a, 0x0c, 0xf2, 0xb2, 0x76, 0x88, 0x9b, 0x88, 0x63, 0x55, 0xb4, 0x33, + 0xdc, 0x01, 0xb1, 0x2a, 0xd2, 0xdf, 0xf7, 0x6d, 0x36, 0x31, 0x23, 0xb7, 0xb1, 0xed, 0x7a, 0x22, + 0xc1, 0x09, 0x5b, 0x2d, 0x9e, 0x81, 0x71, 0x2a, 0x1f, 0x49, 0x17, 0xb7, 0x33, 0x7a, 0xb0, 0xa8, + 0xb7, 0xd1, 0x15, 0x9c, 0x54, 0x61, 0x4a, 0xdd, 0x49, 0xab, 0x2b, 0x35, 0x91, 0x98, 0x49, 0x9b, + 0xf0, 0x97, 0x92, 0x60, 0x4c, 0xe3, 0xdb, 0x9f, 0x87, 0x8a, 0xa1, 0xeb, 0x71, 0xb5, 0xe8, 0x81, + 0xd3, 0xe8, 0x73, 0x61, 0xbf, 0xc6, 0x0a, 0x51, 0xc0, 0xf8, 0xcd, 0x9f, 0x88, 0xbf, 0x4c, 0xa9, + 0x13, 0x32, 0xea, 0x52, 0x42, 0x19, 0xb1, 0x80, 0xb6, 0xe8, 0x03, 0xf5, 0x2e, 0x8d, 0x22, 0x86, + 0xac, 0x10, 0x05, 0xcc, 0x7e, 0x16, 0x4a, 0x2a, 0x7d, 0x1e, 0xcf, 0x41, 0xa5, 0x6e, 0xa5, 0xcc, + 0x1c, 0x54, 0x7e, 0x10, 0x21, 0x87, 0xd8, 0xaf, 0x43, 0x49, 0x65, 0xf9, 0x3b, 0x1c, 0x9b, 0x6d, + 0xbf, 0xa1, 0xe7, 0xde, 0xf0, 0xc3, 0x48, 0xa5, 0x26, 0x14, 0x17, 0xe7, 0xb7, 0x96, 0x79, 0x19, + 0x6a, 0xa8, 0xfd, 0x67, 0x16, 0x54, 0xd6, 0xd7, 0x57, 0xb4, 0x3d, 0x0d, 0xe1, 0xd1, 0x50, 0xb4, + 0x50, 0x75, 0x33, 0xa2, 0xa6, 0x87, 0x8e, 0x58, 0x89, 0x66, 0xf7, 0xf7, 0xe6, 0x1e, 0xad, 0x67, + 0x62, 0xe0, 0x80, 0x9a, 0x64, 0x19, 0xce, 0x99, 0x10, 0x99, 0x32, 0x46, 0xea, 0x05, 0xfc, 0x55, + 0xfd, 0x7a, 0x3f, 0x18, 0xb3, 0xea, 0xa4, 0x49, 0x49, 0x2d, 0xda, 0x7c, 0xa0, 0xbf, 0xde, 0x0f, + 0xc6, 0xac, 0x3a, 0xf6, 0x73, 0x30, 0x95, 0x72, 0x1d, 0x39, 0x42, 0xaa, 0xae, 0xdf, 0x2d, 0xc0, + 0x84, 0xe9, 0x41, 0x70, 0x84, 0x3d, 0xfb, 0xe8, 0xaa, 0x50, 0xc6, 0xad, 0x7f, 0xe1, 0x98, 0xb7, + 0xfe, 0xa6, 0x9b, 0xc5, 0xe8, 0xe9, 0xba, 0x59, 0x14, 0xf3, 0x71, 0xb3, 0x30, 0xdc, 0x81, 0xc6, + 0x1e, 0x9e, 0x3b, 0xd0, 0xef, 0x14, 0x61, 0x32, 0x99, 0xfb, 0xf9, 0x08, 0x3d, 0xf9, 0x6c, 0x5f, + 0x4f, 0x1e, 0xf3, 0x9a, 0xb1, 0x30, 0xec, 0x35, 0xe3, 0xe8, 0xb0, 0xd7, 0x8c, 0xc5, 0x13, 0x5c, + 0x33, 0xf6, 0x5f, 0x12, 0x8e, 0x1d, 0xf9, 0x92, 0xf0, 0xe3, 0x7a, 0xa3, 0x18, 0x4f, 0x78, 0xd6, + 0xc5, 0x9b, 0x05, 0x49, 0x76, 0xc3, 0xa2, 0xdf, 0xcc, 0xf4, 0xf8, 0x2e, 0x1d, 0xa2, 0x3e, 0x04, + 0x99, 0x8e, 0xce, 0xc7, 0xf7, 0x64, 0x78, 0xf4, 0x18, 0x4e, 0xce, 0x2f, 0x40, 0x45, 0x8e, 0x27, + 0x7e, 0xa6, 0x85, 0xe4, 0x79, 0xb8, 0x1e, 0x83, 0xd0, 0xc4, 0x63, 0x03, 0xa3, 0x1b, 0x4f, 0x10, + 0x7e, 0xe1, 0x5d, 0x49, 0x5e, 0x78, 0xaf, 0x25, 0xc1, 0x98, 0xc6, 0xb7, 0x3f, 0x07, 0x17, 0x32, + 0x2d, 0x9b, 0xfc, 0x56, 0x89, 0x9f, 0x85, 0x68, 0x53, 0x22, 0x18, 0x62, 0xa4, 0x1e, 0xa3, 0x9a, + 0xbd, 0x3b, 0x10, 0x13, 0x0f, 0xa0, 0x62, 0xff, 0x76, 0x01, 0x26, 0x93, 0x8f, 0xb3, 0x93, 0xfb, + 0xfa, 0x1e, 0x24, 0x97, 0x2b, 0x18, 0x41, 0xd6, 0xc8, 0x27, 0x3c, 0xf0, 0xfe, 0xf4, 0x3e, 0x1f, + 0x5f, 0x1b, 0x3a, 0xb9, 0xf1, 0xe9, 0x31, 0x96, 0x17, 0x97, 0x92, 0x1d, 0x7f, 0xe2, 0x3c, 0x4e, + 0x29, 0x20, 0xcd, 0x63, 0xb9, 0x73, 0x8f, 0xa3, 0xbf, 0x35, 0x2b, 0x34, 0xd8, 0xb2, 0xbd, 0x65, + 0x87, 0x06, 0xee, 0xa6, 0x4b, 0x9b, 0xf2, 0xad, 0x09, 0xbe, 0x72, 0xbf, 0x2e, 0xcb, 0x50, 0x43, + 0xed, 0xb7, 0x47, 0xa0, 0xcc, 0x33, 0x25, 0x5e, 0x0f, 0xfc, 0x0e, 0x7f, 0xb6, 0x37, 0x34, 0x4c, + 0x11, 0xb2, 0xdb, 0x6e, 0xe6, 0xf1, 0x4e, 0x96, 0xa0, 0x28, 0xa3, 0x48, 0x8c, 0x12, 0x4c, 0x70, + 0x24, 0x5d, 0x28, 0x6d, 0xca, 0xcc, 0xee, 0xb2, 0xef, 0x86, 0xcc, 0x4e, 0xac, 0xf2, 0xc4, 0x8b, + 0x26, 0x50, 0xff, 0x50, 0x73, 0xb1, 0x1d, 0x98, 0x4a, 0xa5, 0xba, 0xca, 0x3d, 0x1f, 0xfc, 0xff, + 0x1a, 0x85, 0xb2, 0x0e, 0xee, 0x24, 0x1f, 0x4d, 0xd8, 0x85, 0x63, 0x1d, 0x5e, 0x1a, 0x74, 0xd9, + 0xb9, 0x49, 0x23, 0xa7, 0x6c, 0xbc, 0x17, 0xa1, 0xd0, 0x0b, 0xda, 0x69, 0xc3, 0xcf, 0x1d, 0x5c, + 0x41, 0x56, 0x6e, 0x06, 0xa4, 0x16, 0x1e, 0x6e, 0x40, 0xea, 0x65, 0x18, 0xdd, 0xf0, 0x9b, 0xbb, + 0xe9, 0x37, 0x28, 0x6b, 0x7e, 0x73, 0x17, 0x39, 0x84, 0xbc, 0x0c, 0x93, 0x32, 0xca, 0x56, 0x29, + 0x31, 0x45, 0xae, 0xa7, 0x6a, 0x7f, 0xa0, 0xf5, 0x04, 0x14, 0x53, 0xd8, 0x6c, 0x97, 0x65, 0xc7, + 0x06, 0x9e, 0xe5, 0x7f, 0x2c, 0xe9, 0x3c, 0x70, 0xb3, 0x7e, 0xfb, 0x16, 0xb7, 0x4f, 0x6b, 0x8c, + 0x44, 0x20, 0xef, 0xf8, 0xa1, 0x81, 0xbc, 0x4b, 0x82, 0x36, 0x93, 0x96, 0xef, 0x28, 0x13, 0xb5, + 0x2b, 0x8a, 0x2e, 0x2b, 0x3b, 0xf0, 0xec, 0xa2, 0x6b, 0x66, 0x85, 0x3c, 0x97, 0xdf, 0xbb, 0x90, + 0x67, 0xfb, 0x0e, 0x4c, 0xa5, 0xfa, 0x4f, 0xd9, 0x0d, 0xad, 0x6c, 0xbb, 0xe1, 0xd1, 0x5e, 0xb1, + 0xfc, 0xe7, 0x16, 0x9c, 0xed, 0x5b, 0x91, 0x8e, 0x1a, 0x7b, 0x9e, 0xde, 0x1b, 0x47, 0x4e, 0xbe, + 0x37, 0x16, 0x8e, 0xb7, 0x37, 0xd6, 0x36, 0xbe, 0xfb, 0xc3, 0x4b, 0x8f, 0x7c, 0xff, 0x87, 0x97, + 0x1e, 0xf9, 0x83, 0x1f, 0x5e, 0x7a, 0xe4, 0xed, 0xfd, 0x4b, 0xd6, 0x77, 0xf7, 0x2f, 0x59, 0xdf, + 0xdf, 0xbf, 0x64, 0xfd, 0xc1, 0xfe, 0x25, 0xeb, 0xbf, 0xee, 0x5f, 0xb2, 0xbe, 0xf1, 0xc7, 0x97, + 0x1e, 0xf9, 0xe4, 0xc7, 0xe3, 0x9e, 0x5a, 0x50, 0x3d, 0xc5, 0x7f, 0x7c, 0x48, 0xf5, 0xcb, 0x42, + 0x77, 0xbb, 0xb5, 0xc0, 0x7a, 0x6a, 0x41, 0x97, 0xa8, 0x9e, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x68, 0x77, 0xe5, 0x89, 0x8f, 0xae, 0x00, 0x00, } func (m *ALBStatus) Marshal() (dAtA []byte, err error) { @@ -6192,6 +6224,16 @@ func (m *DatadogMetric) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + size, err := m.SecretRef.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a i -= len(m.Aggregator) copy(dAtA[i:], m.Aggregator) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Aggregator))) @@ -9760,6 +9802,42 @@ func (m *SecretKeyRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SecretRef) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SecretRef) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SecretRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Namespaced { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *SetCanaryScale) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11591,6 +11669,8 @@ func (m *DatadogMetric) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Aggregator) n += 1 + l + sovGenerated(uint64(l)) + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -12878,6 +12958,18 @@ func (m *SecretKeyRef) Size() (n int) { return n } +func (m *SecretRef) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + return n +} + func (m *SetCanaryScale) Size() (n int) { if m == nil { return 0 @@ -13860,6 +13952,7 @@ func (this *DatadogMetric) String() string { `Formula:` + fmt.Sprintf("%v", this.Formula) + `,`, `ApiVersion:` + fmt.Sprintf("%v", this.ApiVersion) + `,`, `Aggregator:` + fmt.Sprintf("%v", this.Aggregator) + `,`, + `SecretRef:` + strings.Replace(strings.Replace(this.SecretRef.String(), "SecretRef", "SecretRef", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -14863,6 +14956,17 @@ func (this *SecretKeyRef) String() string { }, "") return s } +func (this *SecretRef) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SecretRef{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Namespaced:` + fmt.Sprintf("%v", this.Namespaced) + `,`, + `}`, + }, "") + return s +} func (this *SetCanaryScale) String() string { if this == nil { return "nil" @@ -21963,6 +22067,39 @@ func (m *DatadogMetric) Unmarshal(dAtA []byte) error { } m.Aggregator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -33557,6 +33694,108 @@ func (m *SecretKeyRef) Unmarshal(dAtA []byte) error { } return nil } +func (m *SecretRef) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SecretRef: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SecretRef: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespaced", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Namespaced = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SetCanaryScale) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/rollouts/v1alpha1/generated.proto b/pkg/apis/rollouts/v1alpha1/generated.proto index 1f69804e81..832258d4b9 100644 --- a/pkg/apis/rollouts/v1alpha1/generated.proto +++ b/pkg/apis/rollouts/v1alpha1/generated.proto @@ -664,6 +664,10 @@ message DatadogMetric { // +kubebuilder:validation:Enum=avg;min;max;sum;last;percentile;mean;l2norm;area // Aggregator is a type of aggregator to use for metrics-based queries (default: ""). Used for v2 optional string aggregator = 6; + + // Secret refers to the name of the secret that should be used for an analysis and should exists in the namespace where the controller is. + // +optional + optional SecretRef secretRef = 7; } // DryRun defines the settings for running the analysis in Dry-Run mode. @@ -1718,6 +1722,14 @@ message SecretKeyRef { optional string key = 2; } +message SecretRef { + // Name refers to the name of the secret that should be used to integrate with Datadog. + optional string name = 1; + + // Namespaced indicates whether the secret is in the namespace where rollouts it installed or in the namespace where the metric was found + optional bool namespaced = 2; +} + // SetCanaryScale defines how to scale the newRS without changing traffic weight message SetCanaryScale { // Weight sets the percentage of replicas the newRS should have diff --git a/pkg/apis/rollouts/v1alpha1/openapi_generated.go b/pkg/apis/rollouts/v1alpha1/openapi_generated.go index cc82d6bac0..69b7cd50a2 100644 --- a/pkg/apis/rollouts/v1alpha1/openapi_generated.go +++ b/pkg/apis/rollouts/v1alpha1/openapi_generated.go @@ -123,6 +123,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SMITrafficRouting": schema_pkg_apis_rollouts_v1alpha1_SMITrafficRouting(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.ScopeDetail": schema_pkg_apis_rollouts_v1alpha1_ScopeDetail(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SecretKeyRef": schema_pkg_apis_rollouts_v1alpha1_SecretKeyRef(ref), + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SecretRef": schema_pkg_apis_rollouts_v1alpha1_SecretRef(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetCanaryScale": schema_pkg_apis_rollouts_v1alpha1_SetCanaryScale(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetHeaderRoute": schema_pkg_apis_rollouts_v1alpha1_SetHeaderRoute(ref), "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SetMirrorRoute": schema_pkg_apis_rollouts_v1alpha1_SetMirrorRoute(ref), @@ -1963,9 +1964,18 @@ func schema_pkg_apis_rollouts_v1alpha1_DatadogMetric(ref common.ReferenceCallbac Format: "", }, }, + "secretRef": { + SchemaProps: spec.SchemaProps{ + Description: "Secret refers to the name of the secret that should be used for an analysis and should exists in the namespace where the controller is.", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SecretRef"), + }, + }, }, }, }, + Dependencies: []string{ + "github.com/argoproj/argo-rollouts/pkg/apis/rollouts/v1alpha1.SecretRef"}, } } @@ -5063,6 +5073,32 @@ func schema_pkg_apis_rollouts_v1alpha1_SecretKeyRef(ref common.ReferenceCallback } } +func schema_pkg_apis_rollouts_v1alpha1_SecretRef(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name refers to the name of the secret that should be used to integrate with Datadog.", + Type: []string{"string"}, + Format: "", + }, + }, + "namespaced": { + SchemaProps: spec.SchemaProps{ + Description: "Namespaced indicates whether the secret is in the namespace where rollouts it installed or in the namespace where the metric was found", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_rollouts_v1alpha1_SetCanaryScale(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go index ab36a4b653..5229bb83f8 100644 --- a/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/rollouts/v1alpha1/zz_generated.deepcopy.go @@ -1147,6 +1147,7 @@ func (in *DatadogMetric) DeepCopyInto(out *DatadogMetric) { (*out)[key] = val } } + out.SecretRef = in.SecretRef return } @@ -2696,6 +2697,22 @@ func (in *SecretKeyRef) DeepCopy() *SecretKeyRef { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SecretRef) DeepCopyInto(out *SecretRef) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecretRef. +func (in *SecretRef) DeepCopy() *SecretRef { + if in == nil { + return nil + } + out := new(SecretRef) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SetCanaryScale) DeepCopyInto(out *SetCanaryScale) { *out = *in diff --git a/pkg/kubectl-argo-rollouts/info/pod_info.go b/pkg/kubectl-argo-rollouts/info/pod_info.go index 463657d70d..e53f350848 100644 --- a/pkg/kubectl-argo-rollouts/info/pod_info.go +++ b/pkg/kubectl-argo-rollouts/info/pod_info.go @@ -53,12 +53,6 @@ func newPodInfo(pod *corev1.Pod) rollout.PodInfo { }, } restarts := 0 - rs := make(map[string]bool, len(pod.Spec.InitContainers)) - for _, c := range pod.Spec.InitContainers { - p := c.RestartPolicy - rs[c.Name] = p != nil && *p == corev1.ContainerRestartPolicyAlways - } - totalContainers := len(pod.Spec.Containers) readyContainers := 0 @@ -75,7 +69,7 @@ func newPodInfo(pod *corev1.Pod) rollout.PodInfo { continue case container.State.Terminated != nil: // initialization is failed - if container.State.Terminated.Reason == "" { + if len(container.State.Terminated.Reason) == 0 { if container.State.Terminated.Signal != 0 { reason = fmt.Sprintf("Init:Signal:%d", container.State.Terminated.Signal) } else { @@ -85,10 +79,6 @@ func newPodInfo(pod *corev1.Pod) rollout.PodInfo { reason = "Init:" + container.State.Terminated.Reason } initializing = true - case rs[container.Name] && container.Started != nil && *container.Started: - if container.Ready { - continue - } case container.State.Waiting != nil && len(container.State.Waiting.Reason) > 0 && container.State.Waiting.Reason != "PodInitializing": reason = "Init:" + container.State.Waiting.Reason initializing = true diff --git a/ui/src/models/rollout/generated/api.ts b/ui/src/models/rollout/generated/api.ts index 135408898b..63068ec02c 100755 --- a/ui/src/models/rollout/generated/api.ts +++ b/ui/src/models/rollout/generated/api.ts @@ -1055,6 +1055,12 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetr * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric */ aggregator?: string; + /** + * + * @type {GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1DatadogMetric + */ + secretRef?: GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef; } /** * DryRun defines the settings for running the analysis in Dry-Run mode. @@ -2713,6 +2719,25 @@ export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretKeyRe */ key?: string; } +/** + * + * @export + * @interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef + */ +export interface GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef { + /** + * Name refers to the name of the secret that should be used to integrate with Datadog. + * @type {string} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef + */ + name?: string; + /** + * + * @type {boolean} + * @memberof GithubComArgoprojArgoRolloutsPkgApisRolloutsV1alpha1SecretRef + */ + namespaced?: boolean; +} /** * * @export