From f28a14470bdbf8ecf6885bb568c4cdae04271957 Mon Sep 17 00:00:00 2001 From: Geoffrey Muselli Date: Tue, 7 Feb 2023 13:32:32 -0500 Subject: [PATCH 01/18] 11073: SyncPolicy per applicationset Signed-off-by: Geoffrey Muselli --- .../controllers/applicationset_controller.go | 19 +- .../applicationset_controller_test.go | 333 ++++- .../create-only.yaml | 35 + .../create-update.yaml | 35 + .../guestbook-ui-deployment.yaml | 20 + .../engineering-dev/guestbook-ui-svc.yaml | 10 + .../guestbook-ui-deployment.yaml | 20 + .../engineering-prod/guestbook-ui-svc.yaml | 10 + applicationset/utils/policy.go | 67 +- assets/swagger.json | 4 + .../commands/applicationset_controller.go | 7 +- .../Controlling-Resource-Modification.md | 50 +- manifests/core-install.yaml | 7 + manifests/crds/applicationset-crd.yaml | 7 + manifests/ha/install.yaml | 7 + manifests/install.yaml | 7 + .../v1alpha1/applicationset_types.go | 27 + .../v1alpha1/applicationset_types_test.go | 11 + pkg/apis/application/v1alpha1/generated.pb.go | 1255 +++++++++-------- pkg/apis/application/v1alpha1/generated.proto | 5 + .../application/v1alpha1/openapi_generated.go | 7 + .../v1alpha1/zz_generated.deepcopy.go | 7 +- test/e2e/applicationset_test.go | 306 ++++ 23 files changed, 1583 insertions(+), 673 deletions(-) create mode 100644 applicationset/examples/applications-sync-policies/create-only.yaml create mode 100644 applicationset/examples/applications-sync-policies/create-update.yaml create mode 100644 applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-deployment.yaml create mode 100644 applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-svc.yaml create mode 100644 applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-deployment.yaml create mode 100644 applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-svc.yaml diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index b008c12d3b877..203ba765bee03 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -62,13 +62,14 @@ var ( // ApplicationSetReconciler reconciles a ApplicationSet object type ApplicationSetReconciler struct { client.Client - Scheme *runtime.Scheme - Recorder record.EventRecorder - Generators map[string]generators.Generator - ArgoDB db.ArgoDB - ArgoAppClientset appclientset.Interface - KubeClientset kubernetes.Interface - utils.Policy + Scheme *runtime.Scheme + Recorder record.EventRecorder + Generators map[string]generators.Generator + ArgoDB db.ArgoDB + ArgoAppClientset appclientset.Interface + KubeClientset kubernetes.Interface + Policy argov1alpha1.ApplicationsSyncPolicy + AllowPolicyOverride bool utils.Renderer EnableProgressiveSyncs bool @@ -206,7 +207,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if r.Policy.Update() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).Update() { err = r.createOrUpdateInCluster(ctx, applicationSetInfo, validApps) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, @@ -236,7 +237,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if r.Policy.Delete() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).Delete() { err = r.deleteInCluster(ctx, applicationSetInfo, desiredApplications) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index 76e46659d9639..661fbcd2c48ad 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -1846,7 +1846,7 @@ func TestReconcilerValidationErrorBehaviour(t *testing.T) { ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: &utils.SyncPolicy{}, + Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, } req := ctrl.Request{ @@ -1929,6 +1929,337 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { assert.Len(t, appSet.Status.Conditions, 3) } +func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) argov1alpha1.Application { + + scheme := runtime.NewScheme() + err := argov1alpha1.AddToScheme(scheme) + assert.Nil(t, err) + err = argov1alpha1.AddToScheme(scheme) + assert.Nil(t, err) + + defaultProject := argov1alpha1.AppProject{ + ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, + Spec: argov1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []argov1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, + } + appSet := argov1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "argocd", + }, + Spec: argov1alpha1.ApplicationSetSpec{ + Generators: []argov1alpha1.ApplicationSetGenerator{ + { + List: &argov1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "good-cluster","url": "https://good-cluster"}`), + }}, + }, + }, + }, + SyncPolicy: &argov1alpha1.ApplicationSetSyncPolicy{ + ApplicationsSync: &applicationsSyncPolicy, + }, + Template: argov1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ + Name: "{{cluster}}", + Namespace: "argocd", + }, + Spec: argov1alpha1.ApplicationSpec{ + Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, + Project: "default", + Destination: argov1alpha1.ApplicationDestination{Server: "{{url}}"}, + }, + }, + }, + } + + kubeclientset := kubefake.NewSimpleClientset() + argoDBMock := dbmocks.ArgoDB{} + argoObjs := []runtime.Object{&defaultProject} + + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() + goodCluster := argov1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} + argoDBMock.On("GetCluster", mock.Anything, "https://good-cluster").Return(&goodCluster, nil) + argoDBMock.On("ListClusters", mock.Anything).Return(&argov1alpha1.ClusterList{Items: []argov1alpha1.Cluster{ + goodCluster, + }}, nil) + + r := ApplicationSetReconciler{ + Client: client, + Scheme: scheme, + Renderer: &utils.Render{}, + Recorder: record.NewFakeRecorder(recordBuffer), + Generators: map[string]generators.Generator{ + "List": generators.NewListGenerator(), + }, + ArgoDB: &argoDBMock, + ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), + KubeClientset: kubeclientset, + Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, + AllowPolicyOverride: allowPolicyOverride, + } + + req := ctrl.Request{ + NamespacedName: types.NamespacedName{ + Namespace: "argocd", + Name: "name", + }, + } + + // Verify that on validation error, no error is returned, but the object is requeued + resCreate, err := r.Reconcile(context.Background(), req) + assert.Nil(t, err) + assert.True(t, resCreate.RequeueAfter == 0) + + var app argov1alpha1.Application + + // make sure good app got created + err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) + assert.Nil(t, err) + assert.Equal(t, app.Name, "good-cluster") + + // Update resource + var retrievedApplicationSet argov1alpha1.ApplicationSet + err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) + assert.Nil(t, err) + + retrievedApplicationSet.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} + retrievedApplicationSet.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + + retrievedApplicationSet.Spec.Template.Spec.Source.Helm = &argov1alpha1.ApplicationSourceHelm{ + Values: "global.test: test", + } + + err = r.Client.Update(context.TODO(), &retrievedApplicationSet) + assert.Nil(t, err) + + resUpdate, err := r.Reconcile(context.Background(), req) + assert.Nil(t, err) + + err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) + assert.Nil(t, err) + assert.True(t, resUpdate.RequeueAfter == 0) + assert.Equal(t, app.Name, "good-cluster") + + return app +} + +func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + + app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) + + assert.Nil(t, app.Spec.Source.Helm) + assert.Nil(t, app.ObjectMeta.Annotations) + assert.Nil(t, app.ObjectMeta.Labels) +} + +func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + + app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) + + assert.Nil(t, app.Spec.Source.Helm) + assert.Nil(t, app.ObjectMeta.Annotations) + assert.Nil(t, app.ObjectMeta.Labels) +} + +func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + + app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) + + assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) + assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) + assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) +} + +func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicySync + + app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) + + assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) + assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) + assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) +} + +func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + + app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, false) + + assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) + assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) + assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) +} + +func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) argov1alpha1.ApplicationList { + + scheme := runtime.NewScheme() + err := argov1alpha1.AddToScheme(scheme) + assert.Nil(t, err) + err = argov1alpha1.AddToScheme(scheme) + assert.Nil(t, err) + + defaultProject := argov1alpha1.AppProject{ + ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, + Spec: argov1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []argov1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, + } + appSet := argov1alpha1.ApplicationSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "name", + Namespace: "argocd", + }, + Spec: argov1alpha1.ApplicationSetSpec{ + Generators: []argov1alpha1.ApplicationSetGenerator{ + { + List: &argov1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "good-cluster","url": "https://good-cluster"}`), + }}, + }, + }, + }, + SyncPolicy: &argov1alpha1.ApplicationSetSyncPolicy{ + ApplicationsSync: &applicationsSyncPolicy, + }, + Template: argov1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ + Name: "{{cluster}}", + Namespace: "argocd", + }, + Spec: argov1alpha1.ApplicationSpec{ + Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, + Project: "default", + Destination: argov1alpha1.ApplicationDestination{Server: "{{url}}"}, + }, + }, + }, + } + + kubeclientset := kubefake.NewSimpleClientset() + argoDBMock := dbmocks.ArgoDB{} + argoObjs := []runtime.Object{&defaultProject} + + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() + goodCluster := argov1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} + argoDBMock.On("GetCluster", mock.Anything, "https://good-cluster").Return(&goodCluster, nil) + argoDBMock.On("ListClusters", mock.Anything).Return(&argov1alpha1.ClusterList{Items: []argov1alpha1.Cluster{ + goodCluster, + }}, nil) + + r := ApplicationSetReconciler{ + Client: client, + Scheme: scheme, + Renderer: &utils.Render{}, + Recorder: record.NewFakeRecorder(recordBuffer), + Generators: map[string]generators.Generator{ + "List": generators.NewListGenerator(), + }, + ArgoDB: &argoDBMock, + ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), + KubeClientset: kubeclientset, + Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, + AllowPolicyOverride: allowPolicyOverride, + } + + req := ctrl.Request{ + NamespacedName: types.NamespacedName{ + Namespace: "argocd", + Name: "name", + }, + } + + // Verify that on validation error, no error is returned, but the object is requeued + resCreate, err := r.Reconcile(context.Background(), req) + assert.Nil(t, err) + assert.True(t, resCreate.RequeueAfter == 0) + + var app argov1alpha1.Application + + // make sure good app got created + err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) + assert.Nil(t, err) + assert.Equal(t, app.Name, "good-cluster") + + // Update resource + var retrievedApplicationSet argov1alpha1.ApplicationSet + err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) + assert.Nil(t, err) + retrievedApplicationSet.Spec.Generators = []argov1alpha1.ApplicationSetGenerator{ + { + List: &argov1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{}, + }, + }, + } + + err = r.Client.Update(context.TODO(), &retrievedApplicationSet) + assert.Nil(t, err) + + resUpdate, err := r.Reconcile(context.Background(), req) + assert.Nil(t, err) + + var apps argov1alpha1.ApplicationList + + err = r.Client.List(context.TODO(), &apps) + assert.Nil(t, err) + assert.True(t, resUpdate.RequeueAfter == 0) + + return apps +} + +func TestDeleteNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + + apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 1, true) + + assert.Equal(t, "good-cluster", apps.Items[0].Name) +} + +func TestDeleteNotPerformedWithSyncPolicyCreateUpdate(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + + apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 2, true) + + assert.Equal(t, "good-cluster", apps.Items[0].Name) +} + +func TestDeletePerformedWithSyncPolicyCreateDelete(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + + apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) + + assert.Equal(t, 0, len(apps.Items)) +} + +func TestDeletePerformedWithSyncPolicySync(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicySync + + apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) + + assert.Equal(t, 0, len(apps.Items)) +} + +func TestDeletePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { + + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + + apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, false) + + assert.Equal(t, 0, len(apps.Items)) +} + // Test app generation from a go template application set using a pull request generator func TestGenerateAppsUsingPullRequestGenerator(t *testing.T) { scheme := runtime.NewScheme() diff --git a/applicationset/examples/applications-sync-policies/create-only.yaml b/applicationset/examples/applications-sync-policies/create-only.yaml new file mode 100644 index 0000000000000..7758a70b45765 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/create-only.yaml @@ -0,0 +1,35 @@ +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: guestbook +spec: + goTemplate: true + generators: + - list: + elements: + - cluster: engineering-dev + url: https://kubernetes.default.svc + foo: bar + # Update foo value with foo: bar + # Application engineering-prod-guestbook labels will still be baz + # Delete this element + # Application engineering-prod-guestbook will be kept + - cluster: engineering-prod + url: https://kubernetes.default.svc + foo: baz + template: + metadata: + name: '{{.cluster}}-guestbook' + labels: + foo: '{{.foo}}' + spec: + project: default + source: + repoURL: https://github.com/argoproj/argo-cd.git + targetRevision: HEAD + path: applicationset/examples/list-generator/guestbook/{{.cluster}} + destination: + server: '{{.url}}' + namespace: guestbook + syncPolicy: + applicationsSync: create-only diff --git a/applicationset/examples/applications-sync-policies/create-update.yaml b/applicationset/examples/applications-sync-policies/create-update.yaml new file mode 100644 index 0000000000000..277e8d6e18884 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/create-update.yaml @@ -0,0 +1,35 @@ +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +metadata: + name: guestbook +spec: + goTemplate: true + generators: + - list: + elements: + - cluster: engineering-dev + url: https://kubernetes.default.svc + foo: bar + # Update foo value with foo: bar + # Application engineering-prod-guestbook labels will change to foo: bar + # Delete this element + # Application engineering-prod-guestbook will be kept + - cluster: engineering-prod + url: https://kubernetes.default.svc + foo: baz + template: + metadata: + name: '{{.cluster}}-guestbook' + labels: + foo: '{{.foo}}' + spec: + project: default + source: + repoURL: https://github.com/argoproj/argo-cd.git + targetRevision: HEAD + path: applicationset/examples/list-generator/guestbook/{{.cluster}} + destination: + server: '{{.url}}' + namespace: guestbook + syncPolicy: + applicationsSync: create-update diff --git a/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-deployment.yaml b/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-deployment.yaml new file mode 100644 index 0000000000000..8a0975e363539 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: guestbook-ui +spec: + replicas: 1 + revisionHistoryLimit: 3 + selector: + matchLabels: + app: guestbook-ui + template: + metadata: + labels: + app: guestbook-ui + spec: + containers: + - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + name: guestbook-ui + ports: + - containerPort: 80 diff --git a/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-svc.yaml b/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-svc.yaml new file mode 100644 index 0000000000000..e8a4a27fbae40 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/guestbook/engineering-dev/guestbook-ui-svc.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Service +metadata: + name: guestbook-ui +spec: + ports: + - port: 80 + targetPort: 80 + selector: + app: guestbook-ui diff --git a/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-deployment.yaml b/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-deployment.yaml new file mode 100644 index 0000000000000..8a0975e363539 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: guestbook-ui +spec: + replicas: 1 + revisionHistoryLimit: 3 + selector: + matchLabels: + app: guestbook-ui + template: + metadata: + labels: + app: guestbook-ui + spec: + containers: + - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + name: guestbook-ui + ports: + - containerPort: 80 diff --git a/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-svc.yaml b/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-svc.yaml new file mode 100644 index 0000000000000..e8a4a27fbae40 --- /dev/null +++ b/applicationset/examples/applications-sync-policies/guestbook/engineering-prod/guestbook-ui-svc.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Service +metadata: + name: guestbook-ui +spec: + ports: + - port: 80 + targetPort: 80 + selector: + app: guestbook-ui diff --git a/applicationset/utils/policy.go b/applicationset/utils/policy.go index 926a50926cd05..df5f0284b4519 100644 --- a/applicationset/utils/policy.go +++ b/applicationset/utils/policy.go @@ -1,55 +1,22 @@ package utils -// Policy allows to apply different rules to a set of changes. -type Policy interface { - Update() bool - Delete() bool -} +import ( + argov1alpha1 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +) // Policies is a registry of available policies. -var Policies = map[string]Policy{ - "sync": &SyncPolicy{}, - "create-only": &CreateOnlyPolicy{}, - "create-update": &CreateUpdatePolicy{}, - "create-delete": &CreateDeletePolicy{}, -} - -type SyncPolicy struct{} - -func (p *SyncPolicy) Update() bool { - return true -} - -func (p *SyncPolicy) Delete() bool { - return true -} - -type CreateUpdatePolicy struct{} - -func (p *CreateUpdatePolicy) Update() bool { - return true -} - -func (p *CreateUpdatePolicy) Delete() bool { - return false -} - -type CreateOnlyPolicy struct{} - -func (p *CreateOnlyPolicy) Update() bool { - return false -} - -func (p *CreateOnlyPolicy) Delete() bool { - return false -} - -type CreateDeletePolicy struct{} - -func (p *CreateDeletePolicy) Update() bool { - return false -} - -func (p *CreateDeletePolicy) Delete() bool { - return true +var Policies = map[string]argov1alpha1.ApplicationsSyncPolicy{ + "create-only": argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly, + "create-update": argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate, + "create-delete": argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete, + "sync": argov1alpha1.ApplicationsSyncPolicyPolicySync, + // Default is "sync" + "": argov1alpha1.ApplicationsSyncPolicyPolicySync, +} + +func DefaultPolicy(appSetSyncPolicy *argov1alpha1.ApplicationSetSyncPolicy, defaultPolicy argov1alpha1.ApplicationsSyncPolicy, allowPolicyOverride bool) argov1alpha1.ApplicationsSyncPolicy { + if appSetSyncPolicy == nil || appSetSyncPolicy.ApplicationsSync == nil || !allowPolicyOverride { + return defaultPolicy + } + return *appSetSyncPolicy.ApplicationsSync } diff --git a/assets/swagger.json b/assets/swagger.json index 4bbb97c796914..813a8c8e4fc5f 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -5905,6 +5905,10 @@ "description": "ApplicationSetSyncPolicy configures how generated Applications will relate to their\nApplicationSet.", "type": "object", "properties": { + "applicationsSync": { + "type": "string", + "title": "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync\n+kubebuilder:validation:Optional\n+kubebuilder:validation:Enum=create-only;create-update;create-delete;sync" + }, "preserveResourcesOnDeletion": { "description": "PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted.", "type": "boolean" diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index 618acbd3af103..1cee63a90ace2 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -54,6 +54,7 @@ func NewCommand() *cobra.Command { namespace string argocdRepoServer string policy string + allowPolicyOverride bool debugLog bool dryRun bool enableProgressiveSyncs bool @@ -90,7 +91,7 @@ func NewCommand() *cobra.Command { policyObj, exists := utils.Policies[policy] if !exists { - log.Info("Policy value can be: sync, create-only, create-update, create-delete") + log.Info("Policy value can be: sync, create-only, create-update, create-delete, '' (sync)") os.Exit(1) } @@ -175,6 +176,7 @@ func NewCommand() *cobra.Command { Recorder: mgr.GetEventRecorderFor("applicationset-controller"), Renderer: &utils.Render{}, Policy: policyObj, + AllowPolicyOverride: allowPolicyOverride, ArgoAppClientset: appSetConfig, KubeClientset: k8sClient, ArgoDB: argoCDDB, @@ -202,7 +204,8 @@ func NewCommand() *cobra.Command { "Enabling this will ensure there is only one active controller manager.") command.Flags().StringVar(&namespace, "namespace", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE", ""), "Argo CD repo namespace (default: argocd)") command.Flags().StringVar(&argocdRepoServer, "argocd-repo-server", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER", common.DefaultRepoServerAddr), "Argo CD repo server address") - command.Flags().StringVar(&policy, "policy", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_POLICY", "sync"), "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion), 'create-delete' (no update)") + command.Flags().StringVar(&policy, "policy", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_POLICY", ""), "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion), 'create-delete' (no update)") + command.Flags().BoolVar(&allowPolicyOverride, "allow-policy-override", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ALLOW_POLICY_OVERRIDE", policy == ""), "For security reason if 'policy' is set, it is not possible to override it at applicationSet level. 'allow-policy-override' allows user to define their own policy") command.Flags().BoolVar(&debugLog, "debug", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG", false), "Print debug logs. Takes precedence over loglevel") command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") diff --git a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md index f0bf6d37693ba..0b258d2a0f72f 100644 --- a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md +++ b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md @@ -14,17 +14,50 @@ To enable dry-run, add `--dryrun true` to the ApplicationSet Deployment's contai See 'How to modify ApplicationSet container parameters' below for detailed steps on how to add this parameter to the controller. -### Policy - `create-only`: Prevent ApplicationSet controller from modifying or deleting Applications +### Managed Applications modification Policies The ApplicationSet controller supports a parameter `--policy`, which is specified on launch (within the controller Deployment container), and which restricts what types of modifications will be made to managed Argo CD `Application` resources. -The `--policy` parameter takes one of the following valid values: `sync`, `create-only`, `create-update`, and `create-delete`. (`sync` is the default, which is used if the `--policy` parameter is not specified; the other policies are described below). +The `--policy` parameter takes four values: `sync`, `create-only`, `create-delete`, and `create-update`. (`sync` is the default, which is used if the `--policy` parameter is not specified; the other policies are described below). + +It is also possible to set this policy per ApplicationSet. + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +spec: + # (...) + syncPolicy: + applicationsSync: create-only # create-update, create-delete sync + +``` + +- Policy `create-only`: Prevents ApplicationSet controller from modifying or deleting Applications. +- Policy `create-update`: Prevents ApplicationSet controller from deleting Applications. Update is allowed. +- Policy `create-delete`: Prevents ApplicationSet controller from modifying Applications. Delete is allowed. + +If the controller parameter `--policy` is set, it takes precedence on the field `applicationsSync`. It is possible to allow per ApplicationSet sync policy by setting controller parameter `--allow-policy-override` (default to `false`). + +This does not prevent deletion of Applications if the ApplicationSet is deleted + +#### Controller parameter To allow the ApplicationSet controller to *create* `Application` resources, but prevent any further modification, such as deletion, or modification of Application fields, add this parameter in the ApplicationSet controller: ``` --policy create-only ``` +At ApplicationSet level + +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +spec: + # (...) + syncPolicy: + applicationsSync: create-only +``` + ### Policy - `create-update`: Prevent ApplicationSet controller from deleting Applications To allow the ApplicationSet controller to create or modify `Application` resources, but prevent Applications from being deleted, add the following parameter to the ApplicationSet controller `Deployment`: @@ -34,11 +67,15 @@ To allow the ApplicationSet controller to create or modify `Application` resourc This may be useful to users looking for additional protection against deletion of the Applications generated by the controller. -### Policy - `create-delete`: Prevent ApplicationSet controller from updating Applications +At ApplicationSet level -To allow the ApplicationSet controller to create or delete `Application` resources, but prevent Applications from being updated, add the following parameter to the ApplicationSet controller `Deployment`: -``` ---policy create-delete +```yaml +apiVersion: argoproj.io/v1alpha1 +kind: ApplicationSet +spec: + # (...) + syncPolicy: + applicationsSync: create-update ``` ### Prevent an `Application`'s child resources from being deleted, when the parent Application is deleted @@ -57,6 +94,7 @@ spec: More information on the specific behaviour of `preserveResourcesOnDeletion`, and deletion in ApplicationSet controller and Argo CD in general, can be found on the [Application Deletion](Application-Deletion.md) page. + ### Prevent an Application's child resources from being modified Changes made to the ApplicationSet will propagate to the Applications managed by the ApplicationSet, and then Argo CD will propagate the Application changes to the underlying cluster resources (as per [Argo CD Integration](Argo-CD-Integration.md)). diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index c44b1ec15a9f4..9c8b9ca5e26c3 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -14275,6 +14275,13 @@ spec: type: object syncPolicy: properties: + applicationsSync: + enum: + - create-only + - create-update + - create-delete + - sync + type: string preserveResourcesOnDeletion: type: boolean type: object diff --git a/manifests/crds/applicationset-crd.yaml b/manifests/crds/applicationset-crd.yaml index c92231734f93d..539b466d4e4bd 100644 --- a/manifests/crds/applicationset-crd.yaml +++ b/manifests/crds/applicationset-crd.yaml @@ -10261,6 +10261,13 @@ spec: type: object syncPolicy: properties: + applicationsSync: + enum: + - create-only + - create-update + - create-delete + - sync + type: string preserveResourcesOnDeletion: type: boolean type: object diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 593f458fb319e..5180198604ab7 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -14275,6 +14275,13 @@ spec: type: object syncPolicy: properties: + applicationsSync: + enum: + - create-only + - create-update + - create-delete + - sync + type: string preserveResourcesOnDeletion: type: boolean type: object diff --git a/manifests/install.yaml b/manifests/install.yaml index 51e887b3e63a8..7ea6f3c2ce08f 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -14275,6 +14275,13 @@ spec: type: object syncPolicy: properties: + applicationsSync: + enum: + - create-only + - create-update + - create-delete + - sync + type: string preserveResourcesOnDeletion: type: boolean type: object diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index 508fc226fe736..49b23c8f90ead 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -82,11 +82,38 @@ type ApplicationMatchExpression struct { Values []string `json:"values,omitempty" protobuf:"bytes,3,opt,name=values"` } +// ApplicationsSyncPolicy representation +// "create-only" means applications are only created. If the generator's result contains update, applications won't be updated +// "create-update" means applications are only created/Updated. If the generator's result contains update, applications will be updated, but not deleted +// "create-delete" means applications are only created/deleted. If the generator's result contains update, applications won't be updated, if it results in deleted applications, the applications will be deleted +// "sync" means create/update/deleted. If the generator's result contains update, applications will be updated, if it results in deleted applications, the applications will be deleted +type ApplicationsSyncPolicy string + +//sync / create-only / create-update / create-delete +const ( + ApplicationsSyncPolicyPolicyCreateOnly ApplicationsSyncPolicy = "create-only" + ApplicationsSyncPolicyPolicyCreateUpdate ApplicationsSyncPolicy = "create-update" + ApplicationsSyncPolicyPolicyCreateDelete ApplicationsSyncPolicy = "create-delete" + ApplicationsSyncPolicyPolicySync ApplicationsSyncPolicy = "sync" +) + +func (s ApplicationsSyncPolicy) Update() bool { + return s == ApplicationsSyncPolicyPolicyCreateUpdate || s == ApplicationsSyncPolicyPolicySync +} + +func (s ApplicationsSyncPolicy) Delete() bool { + return s == ApplicationsSyncPolicyPolicySync || s == ApplicationsSyncPolicyPolicyCreateDelete +} + // ApplicationSetSyncPolicy configures how generated Applications will relate to their // ApplicationSet. type ApplicationSetSyncPolicy struct { // PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted. PreserveResourcesOnDeletion bool `json:"preserveResourcesOnDeletion,omitempty" protobuf:"bytes,1,name=syncPolicy"` + // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Enum=create-only;create-update;create-delete;sync + ApplicationsSync *ApplicationsSyncPolicy `json:"applicationsSync,omitempty" protobuf:"bytes,2,opt,name=applicationsSync,casttype=ApplicationsSyncPolicy"` } // ApplicationSetTemplate represents argocd ApplicationSpec diff --git a/pkg/apis/application/v1alpha1/applicationset_types_test.go b/pkg/apis/application/v1alpha1/applicationset_types_test.go index 67fc502470a06..bed1631b9aa26 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types_test.go +++ b/pkg/apis/application/v1alpha1/applicationset_types_test.go @@ -38,6 +38,17 @@ func newTestAppSet(name, namespace, repo string) *ApplicationSet { return a } +func TestApplicationsSyncPolicy(t *testing.T) { + assert.False(t, ApplicationsSyncPolicyPolicyCreateOnly.Delete()) + assert.False(t, ApplicationsSyncPolicyPolicyCreateOnly.Update()) + + assert.False(t, ApplicationsSyncPolicyPolicyCreateUpdate.Delete()) + assert.True(t, ApplicationsSyncPolicyPolicyCreateUpdate.Update()) + + assert.True(t, ApplicationsSyncPolicyPolicySync.Delete()) + assert.True(t, ApplicationsSyncPolicyPolicySync.Update()) +} + func TestApplicationSetSetConditions(t *testing.T) { fiveMinsAgo := &metav1.Time{Time: time.Now().Add(-5 * time.Minute)} tenMinsAgo := &metav1.Time{Time: time.Now().Add(-10 * time.Minute)} diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index 4410d283aae43..8c69a7f5713bd 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -3918,611 +3918,613 @@ func init() { } var fileDescriptor_030104ce3b95bcac = []byte{ - // 9659 bytes of a gzipped FileDescriptorProto + // 9685 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0xdc, 0xa1, 0xef, 0x8e, 0x04, 0x4f, 0xe4, 0xe1, - 0x6a, 0x58, 0xa6, 0xa9, 0x88, 0x04, 0xc2, 0x13, 0xa5, 0x30, 0xa6, 0x4d, 0x19, 0x0b, 0xdc, 0xe1, - 0x70, 0x07, 0x1c, 0xc0, 0x06, 0xee, 0x4e, 0x22, 0x4d, 0x49, 0x83, 0xd9, 0xde, 0xc5, 0x1c, 0x76, - 0x67, 0x86, 0x33, 0xb3, 0x38, 0x2c, 0x2d, 0xcb, 0x92, 0x2c, 0xd9, 0x4a, 0xf4, 0x41, 0x85, 0xfe, - 0x11, 0xb9, 0x92, 0x38, 0x8a, 0xed, 0x72, 0xc5, 0x95, 0xb0, 0xe2, 0x54, 0x7e, 0xe4, 0xab, 0x52, - 0x15, 0xdb, 0xf9, 0xc1, 0x94, 0x52, 0x15, 0x55, 0xc5, 0x65, 0x39, 0xb1, 0x03, 0x53, 0x97, 0x4a, - 0x25, 0x95, 0xaa, 0x38, 0x95, 0x8f, 0x3f, 0xb9, 0xca, 0x8f, 0x54, 0x7f, 0xf7, 0xcc, 0xee, 0x1e, - 0x76, 0x0f, 0x83, 0xbb, 0x93, 0x8a, 0xff, 0x76, 0xfb, 0xbd, 0x7e, 0xaf, 0xbb, 0xa7, 0xfb, 0xf5, - 0x7b, 0xdd, 0xef, 0xbd, 0x86, 0xd5, 0x86, 0x97, 0xec, 0xb4, 0xb7, 0xe7, 0xdc, 0xa0, 0x35, 0xef, - 0x44, 0x8d, 0x20, 0x8c, 0x82, 0x5b, 0xec, 0xc7, 0xf3, 0x6e, 0x6d, 0x7e, 0xef, 0xc2, 0x7c, 0xb8, - 0xdb, 0x98, 0x77, 0x42, 0x2f, 0x9e, 0x77, 0xc2, 0xb0, 0xe9, 0xb9, 0x4e, 0xe2, 0x05, 0xfe, 0xfc, - 0xde, 0x0b, 0x4e, 0x33, 0xdc, 0x71, 0x5e, 0x98, 0x6f, 0x10, 0x9f, 0x44, 0x4e, 0x42, 0x6a, 0x73, - 0x61, 0x14, 0x24, 0x01, 0xfa, 0x69, 0x4d, 0x6d, 0x4e, 0x52, 0x63, 0x3f, 0x3e, 0xeb, 0xd6, 0xe6, - 0xf6, 0x2e, 0xcc, 0x85, 0xbb, 0x8d, 0x39, 0x4a, 0x6d, 0xce, 0xa0, 0x36, 0x27, 0xa9, 0x9d, 0x7d, - 0xde, 0x68, 0x4b, 0x23, 0x68, 0x04, 0xf3, 0x8c, 0xe8, 0x76, 0xbb, 0xce, 0xfe, 0xb1, 0x3f, 0xec, - 0x17, 0x67, 0x76, 0xd6, 0xde, 0x7d, 0x29, 0x9e, 0xf3, 0x02, 0xda, 0xbc, 0x79, 0x37, 0x88, 0xc8, - 0xfc, 0x5e, 0x57, 0x83, 0xce, 0x5e, 0xd6, 0x38, 0x64, 0x3f, 0x21, 0x7e, 0xec, 0x05, 0x7e, 0xfc, - 0x3c, 0x6d, 0x02, 0x89, 0xf6, 0x48, 0x64, 0x76, 0xcf, 0x40, 0xe8, 0x45, 0xe9, 0x45, 0x4d, 0xa9, - 0xe5, 0xb8, 0x3b, 0x9e, 0x4f, 0xa2, 0x8e, 0xae, 0xde, 0x22, 0x89, 0xd3, 0xab, 0xd6, 0x7c, 0xbf, - 0x5a, 0x51, 0xdb, 0x4f, 0xbc, 0x16, 0xe9, 0xaa, 0xf0, 0x89, 0xc3, 0x2a, 0xc4, 0xee, 0x0e, 0x69, - 0x39, 0x5d, 0xf5, 0x3e, 0xd6, 0xaf, 0x5e, 0x3b, 0xf1, 0x9a, 0xf3, 0x9e, 0x9f, 0xc4, 0x49, 0x94, - 0xad, 0x64, 0xbf, 0x09, 0x93, 0x0b, 0x37, 0x37, 0x17, 0xda, 0xc9, 0xce, 0x62, 0xe0, 0xd7, 0xbd, - 0x06, 0xfa, 0x38, 0x8c, 0xbb, 0xcd, 0x76, 0x9c, 0x90, 0xe8, 0x9a, 0xd3, 0x22, 0x33, 0xd6, 0x79, - 0xeb, 0xd9, 0x4a, 0xf5, 0xd4, 0x7b, 0x07, 0xb3, 0x1f, 0xba, 0x73, 0x30, 0x3b, 0xbe, 0xa8, 0x41, - 0xd8, 0xc4, 0x43, 0x1f, 0x81, 0xb1, 0x28, 0x68, 0x92, 0x05, 0x7c, 0x6d, 0xa6, 0xc0, 0xaa, 0x9c, - 0x10, 0x55, 0xc6, 0x30, 0x2f, 0xc6, 0x12, 0x6e, 0xff, 0x51, 0x01, 0x60, 0x21, 0x0c, 0x37, 0xa2, - 0xe0, 0x16, 0x71, 0x13, 0xf4, 0x39, 0x28, 0xd3, 0xa1, 0xab, 0x39, 0x89, 0xc3, 0xb8, 0x8d, 0x5f, - 0xf8, 0x8b, 0x73, 0xbc, 0x27, 0x73, 0x66, 0x4f, 0xf4, 0xc4, 0xa1, 0xd8, 0x73, 0x7b, 0x2f, 0xcc, - 0xad, 0x6f, 0xd3, 0xfa, 0x6b, 0x24, 0x71, 0xaa, 0x48, 0x30, 0x03, 0x5d, 0x86, 0x15, 0x55, 0xe4, - 0xc3, 0x48, 0x1c, 0x12, 0x97, 0x35, 0x6c, 0xfc, 0xc2, 0xea, 0xdc, 0x51, 0x66, 0xe8, 0x9c, 0x6e, - 0xf9, 0x66, 0x48, 0xdc, 0xea, 0x84, 0xe0, 0x3c, 0x42, 0xff, 0x61, 0xc6, 0x07, 0xed, 0xc1, 0x68, - 0x9c, 0x38, 0x49, 0x3b, 0x9e, 0x29, 0x32, 0x8e, 0xd7, 0x72, 0xe3, 0xc8, 0xa8, 0x56, 0xa7, 0x04, - 0xcf, 0x51, 0xfe, 0x1f, 0x0b, 0x6e, 0xf6, 0x7f, 0xb4, 0x60, 0x4a, 0x23, 0xaf, 0x7a, 0x71, 0x82, - 0x7e, 0xae, 0x6b, 0x70, 0xe7, 0x06, 0x1b, 0x5c, 0x5a, 0x9b, 0x0d, 0xed, 0x49, 0xc1, 0xac, 0x2c, - 0x4b, 0x8c, 0x81, 0x6d, 0x41, 0xc9, 0x4b, 0x48, 0x2b, 0x9e, 0x29, 0x9c, 0x2f, 0x3e, 0x3b, 0x7e, - 0xe1, 0x72, 0x5e, 0xfd, 0xac, 0x4e, 0x0a, 0xa6, 0xa5, 0x15, 0x4a, 0x1e, 0x73, 0x2e, 0xf6, 0xef, - 0x4c, 0x98, 0xfd, 0xa3, 0x03, 0x8e, 0x5e, 0x80, 0xf1, 0x38, 0x68, 0x47, 0x2e, 0xc1, 0x24, 0x0c, - 0xe2, 0x19, 0xeb, 0x7c, 0x91, 0x4e, 0x3d, 0x3a, 0x53, 0x37, 0x75, 0x31, 0x36, 0x71, 0xd0, 0xb7, - 0x2c, 0x98, 0xa8, 0x91, 0x38, 0xf1, 0x7c, 0xc6, 0x5f, 0x36, 0x7e, 0xeb, 0xc8, 0x8d, 0x97, 0x85, - 0x4b, 0x9a, 0x78, 0xf5, 0xb4, 0xe8, 0xc8, 0x84, 0x51, 0x18, 0xe3, 0x14, 0x7f, 0xba, 0xe2, 0x6a, - 0x24, 0x76, 0x23, 0x2f, 0xa4, 0xff, 0xd9, 0x9c, 0x31, 0x56, 0xdc, 0x92, 0x06, 0x61, 0x13, 0x0f, - 0xf9, 0x50, 0xa2, 0x2b, 0x2a, 0x9e, 0x19, 0x61, 0xed, 0x5f, 0x39, 0x5a, 0xfb, 0xc5, 0xa0, 0xd2, - 0xc5, 0xaa, 0x47, 0x9f, 0xfe, 0x8b, 0x31, 0x67, 0x83, 0xbe, 0x69, 0xc1, 0x8c, 0x58, 0xf1, 0x98, - 0xf0, 0x01, 0xbd, 0xb9, 0xe3, 0x25, 0xa4, 0xe9, 0xc5, 0xc9, 0x4c, 0x89, 0xb5, 0x61, 0x7e, 0xb0, - 0xb9, 0xb5, 0x1c, 0x05, 0xed, 0xf0, 0xaa, 0xe7, 0xd7, 0xaa, 0xe7, 0x05, 0xa7, 0x99, 0xc5, 0x3e, - 0x84, 0x71, 0x5f, 0x96, 0xe8, 0x57, 0x2d, 0x38, 0xeb, 0x3b, 0x2d, 0x12, 0x87, 0x0e, 0xfd, 0xb4, - 0x1c, 0x5c, 0x6d, 0x3a, 0xee, 0x2e, 0x6b, 0xd1, 0xe8, 0xfd, 0xb5, 0xc8, 0x16, 0x2d, 0x3a, 0x7b, - 0xad, 0x2f, 0x69, 0x7c, 0x0f, 0xb6, 0xe8, 0x37, 0x2d, 0x98, 0x0e, 0xa2, 0x70, 0xc7, 0xf1, 0x49, - 0x4d, 0x42, 0xe3, 0x99, 0x31, 0xb6, 0xf4, 0x3e, 0x73, 0xb4, 0x4f, 0xb4, 0x9e, 0x25, 0xbb, 0x16, - 0xf8, 0x5e, 0x12, 0x44, 0x9b, 0x24, 0x49, 0x3c, 0xbf, 0x11, 0x57, 0xcf, 0xdc, 0x39, 0x98, 0x9d, - 0xee, 0xc2, 0xc2, 0xdd, 0xed, 0x41, 0x3f, 0x0f, 0xe3, 0x71, 0xc7, 0x77, 0x6f, 0x7a, 0x7e, 0x2d, - 0xb8, 0x1d, 0xcf, 0x94, 0xf3, 0x58, 0xbe, 0x9b, 0x8a, 0xa0, 0x58, 0x80, 0x9a, 0x01, 0x36, 0xb9, - 0xf5, 0xfe, 0x70, 0x7a, 0x2a, 0x55, 0xf2, 0xfe, 0x70, 0x7a, 0x32, 0xdd, 0x83, 0x2d, 0xfa, 0x15, - 0x0b, 0x26, 0x63, 0xaf, 0xe1, 0x3b, 0x49, 0x3b, 0x22, 0x57, 0x49, 0x27, 0x9e, 0x01, 0xd6, 0x90, - 0x2b, 0x47, 0x1c, 0x15, 0x83, 0x64, 0xf5, 0x8c, 0x68, 0xe3, 0xa4, 0x59, 0x1a, 0xe3, 0x34, 0xdf, - 0x5e, 0x0b, 0x4d, 0x4f, 0xeb, 0xf1, 0x7c, 0x17, 0x9a, 0x9e, 0xd4, 0x7d, 0x59, 0xa2, 0x9f, 0x85, - 0x93, 0xbc, 0x48, 0x8d, 0x6c, 0x3c, 0x33, 0xc1, 0x04, 0xed, 0xe9, 0x3b, 0x07, 0xb3, 0x27, 0x37, - 0x33, 0x30, 0xdc, 0x85, 0x8d, 0xde, 0x84, 0xd9, 0x90, 0x44, 0x2d, 0x2f, 0x59, 0xf7, 0x9b, 0x1d, - 0x29, 0xbe, 0xdd, 0x20, 0x24, 0x35, 0xd1, 0x9c, 0x78, 0x66, 0xf2, 0xbc, 0xf5, 0x6c, 0xb9, 0xfa, - 0x93, 0xa2, 0x99, 0xb3, 0x1b, 0xf7, 0x46, 0xc7, 0x87, 0xd1, 0xb3, 0xff, 0x75, 0x01, 0x4e, 0x66, - 0x37, 0x4e, 0xf4, 0xdb, 0x16, 0x9c, 0xb8, 0x75, 0x3b, 0xd9, 0x0a, 0x76, 0x89, 0x1f, 0x57, 0x3b, - 0x54, 0xbc, 0xb1, 0x2d, 0x63, 0xfc, 0x82, 0x9b, 0xef, 0x16, 0x3d, 0x77, 0x25, 0xcd, 0xe5, 0xa2, - 0x9f, 0x44, 0x9d, 0xea, 0xe3, 0xa2, 0x77, 0x27, 0xae, 0xdc, 0xdc, 0x32, 0xa1, 0x38, 0xdb, 0xa8, - 0xb3, 0x5f, 0xb7, 0xe0, 0x74, 0x2f, 0x12, 0xe8, 0x24, 0x14, 0x77, 0x49, 0x87, 0x6b, 0x65, 0x98, - 0xfe, 0x44, 0x6f, 0x40, 0x69, 0xcf, 0x69, 0xb6, 0x89, 0xd0, 0x6e, 0x96, 0x8f, 0xd6, 0x11, 0xd5, - 0x32, 0xcc, 0xa9, 0xfe, 0x54, 0xe1, 0x25, 0xcb, 0xfe, 0xb7, 0x45, 0x18, 0x37, 0xf6, 0xb7, 0x07, - 0xa0, 0xb1, 0x05, 0x29, 0x8d, 0x6d, 0x2d, 0xb7, 0xad, 0xb9, 0xaf, 0xca, 0x76, 0x3b, 0xa3, 0xb2, - 0xad, 0xe7, 0xc7, 0xf2, 0x9e, 0x3a, 0x1b, 0x4a, 0xa0, 0x12, 0x84, 0x54, 0x23, 0xa7, 0x5b, 0xff, - 0x48, 0x1e, 0x9f, 0x70, 0x5d, 0x92, 0xab, 0x4e, 0xde, 0x39, 0x98, 0xad, 0xa8, 0xbf, 0x58, 0x33, - 0xb2, 0x7f, 0x60, 0xc1, 0x69, 0xa3, 0x8d, 0x8b, 0x81, 0x5f, 0xf3, 0xd8, 0xa7, 0x3d, 0x0f, 0x23, - 0x49, 0x27, 0x94, 0x6a, 0xbf, 0x1a, 0xa9, 0xad, 0x4e, 0x48, 0x30, 0x83, 0x50, 0x45, 0xbf, 0x45, - 0xe2, 0xd8, 0x69, 0x90, 0xac, 0xa2, 0xbf, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x08, 0x50, 0xd3, 0x89, - 0x93, 0xad, 0xc8, 0xf1, 0x63, 0x46, 0x7e, 0xcb, 0x6b, 0x11, 0x31, 0xc0, 0x7f, 0x61, 0xb0, 0x19, - 0x43, 0x6b, 0x54, 0x1f, 0xbb, 0x73, 0x30, 0x8b, 0x56, 0xbb, 0x28, 0xe1, 0x1e, 0xd4, 0xed, 0x5f, - 0xb5, 0xe0, 0xb1, 0xde, 0xba, 0x18, 0x7a, 0x06, 0x46, 0xb9, 0xc9, 0x27, 0x7a, 0xa7, 0x3f, 0x09, - 0x2b, 0xc5, 0x02, 0x8a, 0xe6, 0xa1, 0xa2, 0xf6, 0x09, 0xd1, 0xc7, 0x69, 0x81, 0x5a, 0xd1, 0x9b, - 0x8b, 0xc6, 0xa1, 0x83, 0x46, 0xff, 0x08, 0xcd, 0x4d, 0x0d, 0x1a, 0x33, 0x92, 0x18, 0xc4, 0xfe, - 0x33, 0x0b, 0x4e, 0x18, 0xad, 0x7a, 0x00, 0xaa, 0xb9, 0x9f, 0x56, 0xcd, 0x57, 0x72, 0x9b, 0xcf, - 0x7d, 0x74, 0xf3, 0x6f, 0x5a, 0x70, 0xd6, 0xc0, 0x5a, 0x73, 0x12, 0x77, 0xe7, 0xe2, 0x7e, 0x18, - 0x91, 0x98, 0x9a, 0xd3, 0xe8, 0x29, 0x43, 0x6e, 0x55, 0xc7, 0x05, 0x85, 0xe2, 0x55, 0xd2, 0xe1, - 0x42, 0xec, 0x39, 0x28, 0xf3, 0xc9, 0x19, 0x44, 0x62, 0xc4, 0x55, 0xdf, 0xd6, 0x45, 0x39, 0x56, - 0x18, 0xc8, 0x86, 0x51, 0x26, 0x9c, 0xe8, 0x62, 0xa5, 0xdb, 0x10, 0xd0, 0x8f, 0x78, 0x83, 0x95, - 0x60, 0x01, 0xb1, 0xef, 0x14, 0x98, 0xad, 0xa0, 0x56, 0x21, 0x79, 0x10, 0x86, 0x66, 0x94, 0x12, - 0x5b, 0x1b, 0xf9, 0xc9, 0x10, 0xd2, 0xdf, 0xd8, 0x7c, 0x2b, 0x23, 0xb9, 0x70, 0xae, 0x5c, 0xef, - 0x6d, 0x70, 0xfe, 0x5e, 0x01, 0x66, 0xd3, 0x15, 0xba, 0x04, 0x1f, 0xb5, 0x6e, 0x0c, 0x46, 0xd9, - 0xf3, 0x04, 0x03, 0x1f, 0x9b, 0x78, 0x7d, 0x64, 0x47, 0xe1, 0x38, 0x65, 0x87, 0x29, 0xda, 0x8a, - 0x87, 0x88, 0xb6, 0x67, 0xd4, 0xa8, 0x8f, 0x64, 0x64, 0x49, 0x5a, 0xbc, 0x9f, 0x87, 0x91, 0x38, - 0x21, 0xe1, 0x4c, 0x29, 0x2d, 0x1a, 0x36, 0x13, 0x12, 0x62, 0x06, 0xb1, 0xff, 0x5b, 0x01, 0x1e, - 0x4f, 0x8f, 0xa1, 0x96, 0xc6, 0x9f, 0x4c, 0x49, 0xe3, 0x8f, 0x9a, 0xd2, 0xf8, 0xee, 0xc1, 0xec, - 0x87, 0xfb, 0x54, 0xfb, 0x91, 0x11, 0xd6, 0x68, 0x39, 0x33, 0x8a, 0xf3, 0xe9, 0x51, 0xbc, 0x7b, - 0x30, 0xfb, 0x54, 0x9f, 0x3e, 0x66, 0x86, 0xf9, 0x19, 0x18, 0x8d, 0x88, 0x13, 0x07, 0xbe, 0x18, - 0x68, 0xf5, 0x39, 0x30, 0x2b, 0xc5, 0x02, 0x6a, 0xff, 0x59, 0x39, 0x3b, 0xd8, 0xcb, 0xfc, 0x3c, - 0x2c, 0x88, 0x90, 0x07, 0x23, 0x4c, 0xc3, 0xe6, 0xa2, 0xe1, 0xea, 0xd1, 0x96, 0x11, 0x95, 0xc8, - 0x8a, 0x74, 0xb5, 0x4c, 0xbf, 0x1a, 0x2d, 0xc2, 0x8c, 0x05, 0xda, 0x87, 0xb2, 0x2b, 0x15, 0xdf, - 0x42, 0x1e, 0x47, 0x44, 0x42, 0xed, 0xd5, 0x1c, 0x27, 0xa8, 0xe8, 0x54, 0xda, 0xb2, 0xe2, 0x86, - 0x08, 0x14, 0x1b, 0x5e, 0x22, 0x3e, 0xeb, 0x11, 0x4d, 0x9b, 0x65, 0xcf, 0xe8, 0xe2, 0x18, 0x95, - 0xe7, 0xcb, 0x5e, 0x82, 0x29, 0x7d, 0xf4, 0x55, 0x0b, 0xc6, 0x63, 0xb7, 0xb5, 0x11, 0x05, 0x7b, - 0x5e, 0x8d, 0x44, 0x42, 0xb1, 0x39, 0xa2, 0x68, 0xda, 0x5c, 0x5c, 0x93, 0x04, 0x35, 0x5f, 0x6e, - 0x6a, 0x6a, 0x08, 0x36, 0xf9, 0x52, 0x85, 0xff, 0x71, 0xd1, 0xf7, 0x25, 0xe2, 0x7a, 0x74, 0x2b, - 0x92, 0xf6, 0x0d, 0x9b, 0x29, 0x47, 0x56, 0xf4, 0x96, 0xda, 0xee, 0x2e, 0x5d, 0x6f, 0xba, 0x41, - 0x1f, 0xbe, 0x73, 0x30, 0xfb, 0xf8, 0x62, 0x6f, 0x9e, 0xb8, 0x5f, 0x63, 0xd8, 0x80, 0x85, 0xed, - 0x66, 0x13, 0x93, 0x37, 0xdb, 0x84, 0x9d, 0x5e, 0xe4, 0x30, 0x60, 0x1b, 0x9a, 0x60, 0x66, 0xc0, - 0x0c, 0x08, 0x36, 0xf9, 0xa2, 0x37, 0x61, 0xb4, 0xe5, 0x24, 0x91, 0xb7, 0x2f, 0x8e, 0x2c, 0x8e, - 0xa8, 0x7a, 0xaf, 0x31, 0x5a, 0x9a, 0x39, 0xdb, 0xa9, 0x79, 0x21, 0x16, 0x8c, 0x50, 0x0b, 0x4a, - 0x2d, 0x12, 0x35, 0xc8, 0x4c, 0x39, 0x8f, 0xe3, 0xd9, 0x35, 0x4a, 0x4a, 0x33, 0xac, 0x50, 0x45, - 0x85, 0x95, 0x61, 0xce, 0x05, 0xbd, 0x01, 0xe5, 0x98, 0x34, 0x89, 0x4b, 0x55, 0x8d, 0x0a, 0xe3, - 0xf8, 0xb1, 0x01, 0xd5, 0x2e, 0x67, 0x9b, 0x34, 0x37, 0x45, 0x55, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, - 0x48, 0xda, 0xff, 0xd9, 0x02, 0x94, 0x96, 0x30, 0x0f, 0x40, 0xd9, 0x7b, 0x33, 0xad, 0xec, 0xad, - 0xe6, 0xa9, 0x02, 0xf4, 0xd1, 0xf7, 0xde, 0x2b, 0x43, 0x46, 0x36, 0x5f, 0x23, 0x71, 0x42, 0x6a, - 0x1f, 0xc8, 0xd3, 0x0f, 0xe4, 0xe9, 0x07, 0xf2, 0x54, 0xc9, 0xd3, 0xed, 0x8c, 0x3c, 0x7d, 0xc5, - 0x58, 0xf5, 0xfa, 0xb2, 0xf1, 0xb3, 0xea, 0x36, 0xd2, 0x6c, 0x81, 0x81, 0x40, 0x25, 0xc1, 0x95, - 0xcd, 0xf5, 0x6b, 0x3d, 0x05, 0xe8, 0x67, 0xd3, 0x02, 0xf4, 0xa8, 0x2c, 0x1e, 0xb8, 0xc8, 0xfc, - 0x1b, 0x05, 0x78, 0x22, 0x2d, 0x4a, 0x70, 0xd0, 0x6c, 0x06, 0xed, 0x84, 0x6a, 0xc9, 0xe8, 0xd7, - 0x2d, 0x38, 0xd9, 0x4a, 0x5b, 0x93, 0xb1, 0x38, 0xb4, 0xfb, 0x54, 0x6e, 0x72, 0x2e, 0x63, 0xae, - 0x56, 0x67, 0x84, 0xcc, 0x3b, 0x99, 0x01, 0xc4, 0xb8, 0xab, 0x2d, 0xe8, 0x0d, 0xa8, 0xb4, 0x9c, - 0xfd, 0xeb, 0x61, 0xcd, 0x49, 0xa4, 0x81, 0xd2, 0xdf, 0xae, 0x6c, 0x27, 0x5e, 0x73, 0x8e, 0x5f, - 0xc5, 0xce, 0xad, 0xf8, 0xc9, 0x7a, 0xb4, 0x99, 0x44, 0x9e, 0xdf, 0xe0, 0x47, 0x35, 0x6b, 0x92, - 0x0c, 0xd6, 0x14, 0xed, 0xbf, 0x65, 0x65, 0x05, 0xad, 0x1a, 0x9d, 0xc8, 0x49, 0x48, 0xa3, 0x83, - 0x3e, 0x0f, 0x25, 0x6a, 0x49, 0xc8, 0x51, 0xb9, 0x99, 0xa7, 0xf4, 0x37, 0xbe, 0x84, 0xde, 0x08, - 0xe8, 0xbf, 0x18, 0x73, 0xa6, 0xf6, 0x9d, 0x91, 0xec, 0x86, 0xc7, 0x2e, 0xe6, 0x2e, 0x00, 0x34, - 0x82, 0x2d, 0xd2, 0x0a, 0x9b, 0x74, 0x58, 0x2c, 0x76, 0xba, 0xab, 0x8c, 0xe7, 0x65, 0x05, 0xc1, - 0x06, 0x16, 0xfa, 0x2b, 0x16, 0x40, 0x43, 0x2e, 0x2c, 0xb9, 0x99, 0x5d, 0xcf, 0xb3, 0x3b, 0x7a, - 0xd9, 0xea, 0xb6, 0x28, 0x86, 0xd8, 0x60, 0x8e, 0xbe, 0x6c, 0x41, 0x39, 0x91, 0xcd, 0xe7, 0xe2, - 0x7d, 0x2b, 0xcf, 0x96, 0xc8, 0x4e, 0xeb, 0x7d, 0x5d, 0x0d, 0x89, 0xe2, 0x8b, 0x7e, 0xd9, 0x02, - 0x88, 0x3b, 0xbe, 0xbb, 0x11, 0x34, 0x3d, 0xb7, 0x23, 0xa4, 0xfe, 0x8d, 0x5c, 0x0d, 0x7c, 0x45, - 0xbd, 0x3a, 0x45, 0x47, 0x43, 0xff, 0xc7, 0x06, 0x67, 0xf4, 0x05, 0x28, 0xc7, 0x62, 0xba, 0x09, - 0x39, 0xbf, 0x95, 0xef, 0x31, 0x03, 0xa7, 0x2d, 0x44, 0x84, 0xf8, 0x87, 0x15, 0x4f, 0xfb, 0x7b, - 0x85, 0xd4, 0x79, 0xa5, 0x3a, 0x99, 0x60, 0x53, 0xc6, 0x95, 0x46, 0xa1, 0x5c, 0x01, 0xb9, 0x4e, - 0x19, 0x65, 0x72, 0xea, 0x29, 0xa3, 0x8a, 0x62, 0x6c, 0x30, 0xa7, 0x9b, 0xe3, 0xb4, 0x93, 0x3d, - 0xff, 0x10, 0xb3, 0xf8, 0x8d, 0x3c, 0x9b, 0xd4, 0x7d, 0xba, 0xfc, 0x84, 0x68, 0xda, 0x74, 0x17, - 0x08, 0x77, 0x37, 0xc9, 0xfe, 0x5e, 0xfa, 0x8c, 0xd4, 0xf8, 0x00, 0x03, 0x9c, 0xff, 0x7e, 0xcb, - 0x82, 0xf1, 0x28, 0x68, 0x36, 0x3d, 0xbf, 0x41, 0x27, 0x8b, 0x90, 0x78, 0xaf, 0x1f, 0x8b, 0xd0, - 0x11, 0xb3, 0x82, 0x6d, 0xb1, 0x58, 0xf3, 0xc4, 0x66, 0x03, 0xec, 0x2f, 0x59, 0x30, 0xd3, 0x6f, - 0x52, 0x23, 0x02, 0x1f, 0xa6, 0x92, 0x9a, 0x6e, 0x7c, 0xea, 0xf6, 0x73, 0xdd, 0x5f, 0x22, 0x4d, - 0xa2, 0x4e, 0xa3, 0xca, 0xd5, 0xa7, 0x45, 0x37, 0x3f, 0xbc, 0xd1, 0x1f, 0x15, 0xdf, 0x8b, 0x8e, - 0xfd, 0x5b, 0x85, 0xec, 0x88, 0x2a, 0xa1, 0xf6, 0x1d, 0xab, 0x4b, 0xf5, 0xff, 0xd4, 0x71, 0x08, - 0x12, 0x66, 0x24, 0xa8, 0x4b, 0xd0, 0xfe, 0x38, 0x0f, 0xf1, 0x96, 0xc5, 0xfe, 0x37, 0x23, 0x70, - 0x8f, 0x96, 0xa9, 0x73, 0x74, 0xab, 0xdf, 0x39, 0xfa, 0xf0, 0x47, 0xf3, 0xdf, 0xb0, 0x60, 0xb4, - 0x49, 0xb5, 0x10, 0x7e, 0x56, 0x3c, 0x7e, 0xa1, 0x76, 0x5c, 0x63, 0xcf, 0x95, 0x9d, 0x98, 0xdf, - 0xf4, 0xa9, 0xf3, 0x27, 0x5e, 0x88, 0x45, 0x1b, 0xd0, 0x77, 0x2d, 0x18, 0x77, 0x7c, 0x3f, 0x48, - 0x84, 0xeb, 0x09, 0x77, 0xdd, 0xf0, 0x8e, 0xad, 0x4d, 0x0b, 0x9a, 0x17, 0x6f, 0x98, 0x3e, 0x78, - 0xd5, 0x10, 0x6c, 0x36, 0x09, 0xcd, 0x01, 0xd4, 0x3d, 0xdf, 0x69, 0x7a, 0x6f, 0x51, 0x6b, 0xaa, - 0xc4, 0x0e, 0xd8, 0xd9, 0xd6, 0x70, 0x49, 0x95, 0x62, 0x03, 0xe3, 0xec, 0x5f, 0x86, 0x71, 0xa3, - 0xe7, 0x3d, 0x2e, 0x28, 0x4f, 0x9b, 0x17, 0x94, 0x15, 0xe3, 0x5e, 0xf1, 0xec, 0x2b, 0x70, 0x32, - 0xdb, 0xc0, 0x61, 0xea, 0xdb, 0xbf, 0x3d, 0x9a, 0x3d, 0x7e, 0xde, 0x22, 0x51, 0x8b, 0x36, 0xed, - 0x03, 0x2b, 0xf4, 0x03, 0x2b, 0xf4, 0x03, 0x2b, 0x54, 0xfe, 0xb1, 0xef, 0x94, 0x20, 0xa5, 0x19, - 0xf0, 0xd6, 0x7d, 0x04, 0xc6, 0x22, 0x12, 0x06, 0xd7, 0xf1, 0xaa, 0x90, 0xb8, 0xda, 0x65, 0x93, - 0x17, 0x63, 0x09, 0xa7, 0x92, 0x39, 0x74, 0x92, 0x1d, 0x21, 0x72, 0x95, 0x64, 0xde, 0x70, 0x92, - 0x1d, 0xcc, 0x20, 0xe8, 0x15, 0x98, 0x4a, 0x9c, 0xa8, 0x41, 0x12, 0x4c, 0xf6, 0xd8, 0x20, 0x88, - 0x23, 0xfd, 0xc7, 0x04, 0xee, 0xd4, 0x56, 0x0a, 0x8a, 0x33, 0xd8, 0xe8, 0x4d, 0x18, 0xd9, 0x21, - 0xcd, 0x96, 0x30, 0x93, 0x37, 0xf3, 0x93, 0x88, 0xac, 0xaf, 0x97, 0x49, 0xb3, 0xc5, 0xd7, 0x2b, - 0xfd, 0x85, 0x19, 0x2b, 0xfa, 0x75, 0x2a, 0xbb, 0xed, 0x38, 0x09, 0x5a, 0xde, 0x5b, 0xd2, 0x78, - 0xfe, 0x54, 0xce, 0x8c, 0xaf, 0x4a, 0xfa, 0xdc, 0xc2, 0x53, 0x7f, 0xb1, 0xe6, 0xcc, 0xda, 0x51, - 0xf3, 0x22, 0x66, 0x0c, 0x77, 0x66, 0xe0, 0x58, 0xda, 0xb1, 0x24, 0xe9, 0xf3, 0x76, 0xa8, 0xbf, - 0x58, 0x73, 0x46, 0x1d, 0x18, 0x0d, 0x9b, 0xed, 0x86, 0xe7, 0xcf, 0x8c, 0xb3, 0x36, 0x5c, 0xcf, - 0xb9, 0x0d, 0x1b, 0x8c, 0x38, 0x3f, 0xc2, 0xe0, 0xbf, 0xb1, 0x60, 0x88, 0x9e, 0x86, 0x92, 0xbb, - 0xe3, 0x44, 0xc9, 0xcc, 0x04, 0x9b, 0x34, 0xca, 0xd2, 0x5c, 0xa4, 0x85, 0x98, 0xc3, 0xd0, 0x53, - 0x50, 0x8c, 0x48, 0x9d, 0x79, 0x0a, 0x19, 0x77, 0xc8, 0x98, 0xd4, 0x31, 0x2d, 0xb7, 0xff, 0x4e, - 0x21, 0xad, 0x5c, 0xa4, 0xfb, 0xcd, 0x67, 0xbb, 0xdb, 0x8e, 0x62, 0x69, 0x8d, 0x1a, 0xb3, 0x9d, - 0x15, 0x63, 0x09, 0x47, 0x5f, 0xb2, 0x60, 0xec, 0x56, 0x1c, 0xf8, 0x3e, 0x49, 0x84, 0x20, 0xbf, - 0x91, 0xf3, 0x50, 0x5c, 0xe1, 0xd4, 0x75, 0x1b, 0x44, 0x01, 0x96, 0x7c, 0x69, 0x73, 0xc9, 0xbe, - 0xdb, 0x6c, 0xd7, 0xba, 0xee, 0x22, 0x2f, 0xf2, 0x62, 0x2c, 0xe1, 0x14, 0xd5, 0xf3, 0x39, 0xea, - 0x48, 0x1a, 0x75, 0xc5, 0x17, 0xa8, 0x02, 0x6e, 0xff, 0x6e, 0x09, 0xce, 0xf4, 0x5c, 0x1c, 0x74, - 0xdb, 0x67, 0x1b, 0xeb, 0x25, 0xaf, 0x49, 0xa4, 0x1f, 0x2d, 0xdb, 0xf6, 0x6f, 0xa8, 0x52, 0x6c, - 0x60, 0xa0, 0x5f, 0x04, 0x08, 0x9d, 0xc8, 0x69, 0x11, 0xb1, 0xdd, 0x15, 0x8f, 0xbe, 0xbb, 0xd2, - 0x76, 0x6c, 0x48, 0x9a, 0xda, 0xda, 0x52, 0x45, 0x31, 0x36, 0x58, 0xa2, 0x8f, 0xc3, 0x78, 0x44, - 0x9a, 0xc4, 0x89, 0x99, 0xa3, 0x59, 0xd6, 0x6b, 0x16, 0x6b, 0x10, 0x36, 0xf1, 0xd0, 0x33, 0xca, - 0x77, 0x20, 0x73, 0x71, 0x9b, 0xf6, 0x1f, 0x40, 0x6f, 0x5b, 0x30, 0x55, 0xf7, 0x9a, 0x44, 0x73, - 0x17, 0x3e, 0xae, 0xeb, 0x47, 0xef, 0xe4, 0x25, 0x93, 0xae, 0x96, 0x90, 0xa9, 0xe2, 0x18, 0x67, - 0xd8, 0xd3, 0xcf, 0xbc, 0x47, 0x22, 0x26, 0x5a, 0x47, 0xd3, 0x9f, 0xf9, 0x06, 0x2f, 0xc6, 0x12, - 0x8e, 0x16, 0xe0, 0x44, 0xe8, 0xc4, 0xf1, 0x62, 0x44, 0x6a, 0xc4, 0x4f, 0x3c, 0xa7, 0xc9, 0x3d, - 0x50, 0xcb, 0xda, 0x03, 0x6d, 0x23, 0x0d, 0xc6, 0x59, 0x7c, 0xf4, 0x69, 0x78, 0xdc, 0x6b, 0xf8, - 0x41, 0x44, 0xd6, 0xbc, 0x38, 0xf6, 0xfc, 0x86, 0x9e, 0x06, 0x4c, 0x52, 0x96, 0xab, 0xb3, 0x82, - 0xd4, 0xe3, 0x2b, 0xbd, 0xd1, 0x70, 0xbf, 0xfa, 0xe8, 0x39, 0x28, 0xc7, 0xbb, 0x5e, 0xb8, 0x18, - 0xd5, 0x62, 0x76, 0x9c, 0x58, 0xd6, 0x67, 0x20, 0x9b, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0xd7, 0x0a, - 0x69, 0xf3, 0xce, 0x5c, 0x3f, 0x28, 0xa6, 0xab, 0x24, 0xb9, 0xe1, 0x44, 0xd2, 0xf4, 0x3f, 0xa2, - 0x0f, 0xab, 0xa0, 0x7b, 0xc3, 0x89, 0xcc, 0xf5, 0xc6, 0x18, 0x60, 0xc9, 0x09, 0xdd, 0x82, 0x91, - 0xa4, 0xe9, 0xe4, 0xe4, 0xf4, 0x6e, 0x70, 0xd4, 0xd6, 0xf6, 0xea, 0x42, 0x8c, 0x19, 0x0f, 0xf4, - 0x24, 0x55, 0x5f, 0xb7, 0xa5, 0xa3, 0x8b, 0xd0, 0x38, 0xb7, 0x63, 0xcc, 0x4a, 0xed, 0xff, 0x31, - 0xda, 0x43, 0xe4, 0xa9, 0x3d, 0x06, 0x5d, 0x00, 0xa0, 0x96, 0xd0, 0x46, 0x44, 0xea, 0xde, 0xbe, - 0xd8, 0xe3, 0xd5, 0xb2, 0xba, 0xa6, 0x20, 0xd8, 0xc0, 0x92, 0x75, 0x36, 0xdb, 0x75, 0x5a, 0xa7, - 0xd0, 0x5d, 0x87, 0x43, 0xb0, 0x81, 0x85, 0x5e, 0x84, 0x51, 0xaf, 0xe5, 0x34, 0x94, 0x3f, 0xce, - 0x93, 0x74, 0x3d, 0xad, 0xb0, 0x92, 0xbb, 0x07, 0xb3, 0x53, 0xaa, 0x41, 0xac, 0x08, 0x0b, 0x5c, - 0xf4, 0x5b, 0x16, 0x4c, 0xb8, 0x41, 0xab, 0x15, 0xf8, 0xdc, 0x7e, 0x10, 0xc6, 0xd0, 0xad, 0xe3, - 0xda, 0x81, 0xe7, 0x16, 0x0d, 0x66, 0xdc, 0x1a, 0x52, 0xde, 0xf9, 0x26, 0x08, 0xa7, 0x5a, 0x65, - 0x2e, 0xbb, 0xd2, 0x21, 0xcb, 0xee, 0x9f, 0x58, 0x30, 0xcd, 0xeb, 0x1a, 0x66, 0x8d, 0x70, 0x44, - 0x0f, 0x8e, 0xb9, 0x5b, 0x5d, 0x96, 0x9e, 0x3a, 0x12, 0xea, 0x82, 0xe3, 0xee, 0x46, 0xa2, 0x65, - 0x98, 0xae, 0x07, 0x91, 0x4b, 0xcc, 0x81, 0x10, 0x32, 0x43, 0x11, 0xba, 0x94, 0x45, 0xc0, 0xdd, - 0x75, 0xd0, 0x0d, 0x78, 0xcc, 0x28, 0x34, 0xc7, 0x81, 0x8b, 0x8d, 0x73, 0x82, 0xda, 0x63, 0x97, - 0x7a, 0x62, 0xe1, 0x3e, 0xb5, 0xcf, 0x7e, 0x12, 0xa6, 0xbb, 0xbe, 0xdf, 0x50, 0xc6, 0xe6, 0x12, - 0x3c, 0xd6, 0x7b, 0xa4, 0x86, 0x32, 0x39, 0xff, 0x51, 0xc6, 0x5b, 0xc7, 0x50, 0x6c, 0x06, 0x38, - 0xbe, 0x70, 0xa0, 0x48, 0xfc, 0x3d, 0x21, 0x38, 0x2e, 0x1d, 0x6d, 0x46, 0x5c, 0xf4, 0xf7, 0xf8, - 0x87, 0x66, 0x36, 0xda, 0x45, 0x7f, 0x0f, 0x53, 0xda, 0xe8, 0x1d, 0x2b, 0xb5, 0x31, 0xf3, 0x43, - 0x8f, 0xcf, 0x1c, 0x8b, 0x26, 0x37, 0xf0, 0x5e, 0x6d, 0x7f, 0xaf, 0x00, 0xe7, 0x0f, 0x23, 0x32, - 0xc0, 0xf0, 0x3d, 0x0d, 0xa3, 0x31, 0xbb, 0x2e, 0x11, 0x2b, 0x71, 0x9c, 0xae, 0x42, 0x7e, 0x81, - 0xf2, 0x59, 0x2c, 0x40, 0xe8, 0x97, 0x2d, 0x28, 0xb6, 0x9c, 0x50, 0xf4, 0xbc, 0x71, 0xbc, 0x3d, - 0x9f, 0x5b, 0x73, 0x42, 0xfe, 0x15, 0x94, 0x3e, 0xba, 0xe6, 0x84, 0x98, 0x36, 0x00, 0xcd, 0x42, - 0xc9, 0x89, 0x22, 0xa7, 0xc3, 0xe4, 0x5a, 0x85, 0x5f, 0xab, 0x2d, 0xd0, 0x02, 0xcc, 0xcb, 0xcf, - 0x7e, 0x02, 0xca, 0xb2, 0xfa, 0x50, 0x73, 0xf0, 0x1b, 0x63, 0x29, 0x67, 0x52, 0x76, 0xdd, 0x12, - 0xc3, 0xa8, 0x30, 0x80, 0xad, 0xbc, 0xfd, 0x97, 0x79, 0x34, 0x00, 0xd3, 0xda, 0x45, 0x4c, 0x95, - 0x60, 0x85, 0xbe, 0x6e, 0xb1, 0xc8, 0x25, 0xe9, 0x60, 0x2b, 0x74, 0xe5, 0xe3, 0x09, 0xa4, 0x32, - 0xe3, 0xa1, 0x64, 0x21, 0x36, 0xb9, 0x53, 0x41, 0x1d, 0x72, 0x1f, 0xfc, 0xac, 0xc6, 0x2c, 0x63, - 0x9b, 0x24, 0x1c, 0xed, 0xf7, 0xb8, 0x56, 0xc9, 0x21, 0xfa, 0x65, 0x80, 0x8b, 0x94, 0xef, 0x5a, - 0x30, 0xcd, 0xf5, 0xa2, 0x25, 0xaf, 0x5e, 0x27, 0x11, 0xf1, 0x5d, 0x22, 0x35, 0xcb, 0x23, 0x5e, - 0xdc, 0xc9, 0x53, 0x87, 0x95, 0x2c, 0x79, 0x2d, 0xc1, 0xbb, 0x40, 0xb8, 0xbb, 0x31, 0xa8, 0x06, - 0x23, 0x9e, 0x5f, 0x0f, 0xc4, 0xbe, 0x55, 0x3d, 0x5a, 0xa3, 0x56, 0xfc, 0x7a, 0xa0, 0xd7, 0x32, - 0xfd, 0x87, 0x19, 0x75, 0xb4, 0x0a, 0xa7, 0x23, 0x61, 0xfb, 0x5f, 0xf6, 0x62, 0x6a, 0xa1, 0xad, - 0x7a, 0x2d, 0x2f, 0x61, 0x7b, 0x4e, 0xb1, 0x3a, 0x73, 0xe7, 0x60, 0xf6, 0x34, 0xee, 0x01, 0xc7, - 0x3d, 0x6b, 0xa1, 0xb7, 0x60, 0x4c, 0x86, 0x5a, 0x95, 0xf3, 0xd0, 0xd2, 0xbb, 0xe7, 0xbf, 0x9a, - 0x4c, 0x9b, 0x22, 0xaa, 0x4a, 0x32, 0xb4, 0xff, 0x25, 0x40, 0xf7, 0xb5, 0x0b, 0xfa, 0x05, 0xa8, - 0x44, 0x2a, 0xfc, 0xcb, 0xca, 0xc3, 0x2d, 0x47, 0x7e, 0x5f, 0x71, 0xe5, 0xa3, 0xce, 0xbd, 0x75, - 0xa0, 0x97, 0xe6, 0x48, 0x75, 0xd4, 0x58, 0xdf, 0xce, 0xe4, 0x30, 0xb7, 0x05, 0x57, 0x7d, 0xaa, - 0xdf, 0xf1, 0x5d, 0xcc, 0x78, 0xa0, 0x08, 0x46, 0x77, 0x88, 0xd3, 0x4c, 0x76, 0xf2, 0x39, 0x80, - 0xbc, 0xcc, 0x68, 0x65, 0x3d, 0x8f, 0x79, 0x29, 0x16, 0x9c, 0xd0, 0x3e, 0x8c, 0xed, 0xf0, 0x09, - 0x20, 0xd4, 0xc6, 0xb5, 0xa3, 0x0e, 0x6e, 0x6a, 0x56, 0xe9, 0xcf, 0x2d, 0x0a, 0xb0, 0x64, 0xc7, - 0xee, 0x64, 0x8d, 0x1b, 0x47, 0xbe, 0x74, 0xf3, 0x73, 0xba, 0x1e, 0xfc, 0xba, 0xf1, 0x73, 0x30, - 0x11, 0x11, 0x37, 0xf0, 0x5d, 0xaf, 0x49, 0x6a, 0x0b, 0xf2, 0x70, 0x71, 0x18, 0x57, 0xdd, 0x93, - 0x54, 0xf5, 0xc5, 0x06, 0x0d, 0x9c, 0xa2, 0x88, 0xbe, 0x66, 0xc1, 0x94, 0x8a, 0x19, 0xa1, 0x1f, - 0x84, 0x88, 0xe3, 0xb9, 0xd5, 0x9c, 0x22, 0x54, 0x18, 0xcd, 0x2a, 0xa2, 0xc6, 0x6f, 0xba, 0x0c, - 0x67, 0xf8, 0xa2, 0xd7, 0x00, 0x82, 0x6d, 0x76, 0xfd, 0x46, 0xbb, 0x5a, 0x1e, 0xba, 0xab, 0x53, - 0xdc, 0x67, 0x5f, 0x52, 0xc0, 0x06, 0x35, 0x74, 0x15, 0x80, 0x2f, 0x9b, 0xad, 0x4e, 0x48, 0x98, - 0x45, 0xaa, 0x7d, 0xad, 0x61, 0x53, 0x41, 0xee, 0x1e, 0xcc, 0x76, 0x9f, 0x9d, 0xb0, 0x8b, 0x51, - 0xa3, 0x3a, 0xfa, 0x79, 0x18, 0x8b, 0xdb, 0xad, 0x96, 0xa3, 0x4e, 0xf2, 0x72, 0x8c, 0x02, 0xe0, - 0x74, 0x0d, 0x51, 0xc4, 0x0b, 0xb0, 0xe4, 0x88, 0x6e, 0x51, 0xa1, 0x1a, 0x8b, 0x43, 0x1d, 0xb6, - 0x8a, 0xb8, 0x4e, 0x30, 0xce, 0xfa, 0xf4, 0x09, 0x51, 0xef, 0x34, 0xee, 0x81, 0x73, 0xf7, 0x60, - 0xf6, 0xb1, 0x74, 0xf9, 0x6a, 0x20, 0xfc, 0xf2, 0x7b, 0xd2, 0x44, 0x57, 0x64, 0xe4, 0x35, 0xed, - 0xb6, 0x0c, 0x08, 0x7c, 0x56, 0x47, 0x5e, 0xb3, 0xe2, 0xfe, 0x63, 0x66, 0x56, 0xb6, 0xfd, 0xb4, - 0x0b, 0x89, 0xe8, 0xcd, 0x8b, 0x30, 0x41, 0xf6, 0x13, 0x12, 0xf9, 0x4e, 0xf3, 0x3a, 0x5e, 0x95, - 0x87, 0x52, 0x6c, 0xd2, 0x5e, 0x34, 0xca, 0x71, 0x0a, 0x0b, 0xd9, 0xca, 0x18, 0x2d, 0xe8, 0xe0, - 0x10, 0x6e, 0x8c, 0x4a, 0xd3, 0xd3, 0xfe, 0xbf, 0x85, 0x94, 0x06, 0xb5, 0x15, 0x11, 0x82, 0x02, - 0x28, 0xf9, 0x41, 0x4d, 0x09, 0xeb, 0x2b, 0xf9, 0x08, 0xeb, 0x6b, 0x41, 0xcd, 0x88, 0xa7, 0xa6, - 0xff, 0x62, 0xcc, 0xf9, 0xb0, 0x80, 0x53, 0x19, 0x99, 0xcb, 0x00, 0xc2, 0x2e, 0xc8, 0x93, 0xb3, - 0x0a, 0x38, 0x5d, 0x37, 0x19, 0xe1, 0x34, 0x5f, 0xb4, 0x0b, 0xa5, 0x9d, 0x20, 0x4e, 0xa4, 0xb5, - 0x70, 0x44, 0xc3, 0xe4, 0x72, 0x10, 0x27, 0x6c, 0xdb, 0x57, 0xdd, 0xa6, 0x25, 0x31, 0xe6, 0x3c, - 0xec, 0xff, 0x62, 0xa5, 0x8e, 0x20, 0x6f, 0x32, 0x77, 0xaa, 0x3d, 0xe2, 0xd3, 0x75, 0x68, 0xfa, - 0x1e, 0xfc, 0xa5, 0x4c, 0xb4, 0xc3, 0x4f, 0xf6, 0xcb, 0x6e, 0x71, 0x9b, 0x52, 0x98, 0x63, 0x24, - 0x0c, 0x37, 0x85, 0x2f, 0x5a, 0xe9, 0xb8, 0x13, 0xbe, 0x11, 0xe6, 0x18, 0x06, 0x75, 0x68, 0x08, - 0x8b, 0xfd, 0x8e, 0x05, 0x63, 0x55, 0xc7, 0xdd, 0x0d, 0xea, 0x75, 0xf4, 0x1c, 0x94, 0x6b, 0xed, - 0xc8, 0x0c, 0x81, 0x51, 0x67, 0x5e, 0x4b, 0xa2, 0x1c, 0x2b, 0x0c, 0x3a, 0x87, 0xeb, 0x8e, 0x2b, - 0x83, 0xa1, 0x8a, 0x7c, 0x0e, 0x5f, 0x62, 0x25, 0x58, 0x40, 0xd0, 0xc7, 0x61, 0xbc, 0xe5, 0xec, - 0xcb, 0xca, 0xd9, 0xf3, 0xcf, 0x35, 0x0d, 0xc2, 0x26, 0x9e, 0xfd, 0xaf, 0x2c, 0x98, 0xa9, 0x3a, - 0xb1, 0xe7, 0x2e, 0xb4, 0x93, 0x9d, 0xaa, 0x97, 0x6c, 0xb7, 0xdd, 0x5d, 0x92, 0xf0, 0x08, 0x38, - 0xda, 0xca, 0x76, 0x4c, 0x97, 0x92, 0x32, 0xc3, 0x54, 0x2b, 0xaf, 0x8b, 0x72, 0xac, 0x30, 0xd0, - 0x5b, 0x30, 0x1e, 0x3a, 0x71, 0x7c, 0x3b, 0x88, 0x6a, 0x98, 0xd4, 0xf3, 0x89, 0x3f, 0xdd, 0x24, - 0x6e, 0x44, 0x12, 0x4c, 0xea, 0xe2, 0x46, 0x4b, 0xd3, 0xc7, 0x26, 0x33, 0xfb, 0xf7, 0x2a, 0x30, - 0x26, 0xae, 0xe3, 0x06, 0x8e, 0xeb, 0x93, 0x06, 0x66, 0xa1, 0xaf, 0x81, 0x19, 0xc3, 0xa8, 0xcb, - 0xb2, 0xa0, 0x08, 0x4d, 0xe6, 0x6a, 0x2e, 0xf7, 0xb7, 0x3c, 0xb1, 0x8a, 0x6e, 0x16, 0xff, 0x8f, - 0x05, 0x2b, 0xf4, 0x6d, 0x0b, 0x4e, 0xb8, 0x81, 0xef, 0x13, 0x57, 0x6f, 0xb3, 0x23, 0x79, 0x78, - 0x64, 0x2c, 0xa6, 0x89, 0xea, 0xc3, 0xdf, 0x0c, 0x00, 0x67, 0xd9, 0xa3, 0x97, 0x61, 0x92, 0x8f, - 0xd9, 0x8d, 0xd4, 0xc9, 0x97, 0x0e, 0x5f, 0x37, 0x81, 0x38, 0x8d, 0x8b, 0xe6, 0xf8, 0x09, 0xa2, - 0x08, 0x14, 0x1f, 0xd5, 0x37, 0x09, 0x46, 0x88, 0xb8, 0x81, 0x81, 0x22, 0x40, 0x11, 0xa9, 0x47, - 0x24, 0xde, 0x11, 0xd7, 0x95, 0x6c, 0x8b, 0x1f, 0xbb, 0xbf, 0xc0, 0x23, 0xdc, 0x45, 0x09, 0xf7, - 0xa0, 0x8e, 0x76, 0x85, 0x8d, 0x53, 0xce, 0x43, 0x2a, 0x88, 0xcf, 0xdc, 0xd7, 0xd4, 0x99, 0x85, - 0x52, 0xbc, 0xe3, 0x44, 0x35, 0xa6, 0x5a, 0x14, 0xf9, 0x41, 0xc0, 0x26, 0x2d, 0xc0, 0xbc, 0x1c, - 0x2d, 0xc1, 0xc9, 0x4c, 0xf0, 0x7d, 0xcc, 0x94, 0x87, 0xb2, 0xf6, 0x43, 0xcd, 0x84, 0xed, 0xc7, - 0xb8, 0xab, 0x86, 0x69, 0xff, 0x8e, 0x1f, 0x62, 0xff, 0x76, 0x94, 0x53, 0xcc, 0x04, 0x93, 0xf8, - 0xaf, 0xe6, 0x32, 0x00, 0x03, 0x79, 0xc0, 0x7c, 0x33, 0xe3, 0x01, 0x33, 0xc9, 0x1a, 0x70, 0x23, - 0x9f, 0x06, 0x0c, 0xef, 0xee, 0xf2, 0x30, 0xdd, 0x57, 0xfe, 0x8f, 0x05, 0xf2, 0xbb, 0x2e, 0x3a, - 0xee, 0x0e, 0xa1, 0x53, 0x06, 0xbd, 0x02, 0x53, 0xca, 0x8a, 0x5b, 0x0c, 0xda, 0x3e, 0xf7, 0x5c, - 0x29, 0xea, 0x5b, 0x22, 0x9c, 0x82, 0xe2, 0x0c, 0x36, 0x9a, 0x87, 0x0a, 0x1d, 0x27, 0x5e, 0x95, - 0xef, 0x1e, 0xca, 0x52, 0x5c, 0xd8, 0x58, 0x11, 0xb5, 0x34, 0x0e, 0x0a, 0x60, 0xba, 0xe9, 0xc4, - 0x09, 0x6b, 0x01, 0x35, 0xea, 0xee, 0x33, 0xec, 0x8f, 0xe5, 0x1e, 0x59, 0xcd, 0x12, 0xc2, 0xdd, - 0xb4, 0xed, 0x1f, 0x8c, 0xc0, 0x64, 0x4a, 0x32, 0x0e, 0xb9, 0xed, 0x3c, 0x07, 0x65, 0xb9, 0x13, - 0x64, 0x63, 0x85, 0xd5, 0x76, 0xa1, 0x30, 0xe8, 0x36, 0xb9, 0x4d, 0x9c, 0x88, 0x44, 0x2c, 0xad, - 0x41, 0x76, 0x9b, 0xac, 0x6a, 0x10, 0x36, 0xf1, 0x98, 0x50, 0x4e, 0x9a, 0xf1, 0x62, 0xd3, 0x23, - 0x7e, 0xc2, 0x9b, 0x99, 0x8f, 0x50, 0xde, 0x5a, 0xdd, 0x34, 0x89, 0x6a, 0xa1, 0x9c, 0x01, 0xe0, - 0x2c, 0x7b, 0xf4, 0x15, 0x0b, 0x26, 0x9d, 0xdb, 0xb1, 0x4e, 0xd5, 0x25, 0x7c, 0x5d, 0x8e, 0xb8, - 0x49, 0xa5, 0xb2, 0x7f, 0x55, 0xa7, 0xa9, 0x78, 0x4f, 0x15, 0xe1, 0x34, 0x53, 0xf4, 0x1d, 0x0b, - 0x10, 0xd9, 0x27, 0xae, 0xf4, 0xc6, 0x11, 0x6d, 0x19, 0xcd, 0xc3, 0xd8, 0xb9, 0xd8, 0x45, 0x97, - 0x4b, 0xf5, 0xee, 0x72, 0xdc, 0xa3, 0x0d, 0xf6, 0x3f, 0x2b, 0xaa, 0x05, 0xa5, 0x1d, 0xc0, 0x1c, - 0x23, 0x78, 0xc1, 0xba, 0xff, 0xe0, 0x05, 0x7d, 0x45, 0xd9, 0x15, 0xc0, 0x90, 0xf6, 0x15, 0x2f, - 0x3c, 0x24, 0x5f, 0xf1, 0x2f, 0x5b, 0xa9, 0xa8, 0xf8, 0xf1, 0x0b, 0xaf, 0xe5, 0xeb, 0x7c, 0x36, - 0xc7, 0x2f, 0xc8, 0x33, 0xd2, 0x3d, 0x7d, 0x6b, 0x4e, 0xa5, 0xa9, 0x81, 0x36, 0x94, 0x34, 0xfc, - 0x0f, 0x45, 0x18, 0x37, 0x76, 0xd2, 0x9e, 0x6a, 0x91, 0xf5, 0x88, 0xa9, 0x45, 0x85, 0x21, 0xd4, - 0xa2, 0x5f, 0x84, 0x8a, 0x2b, 0xa5, 0x7c, 0x3e, 0x79, 0xe1, 0xb2, 0x7b, 0x87, 0x16, 0xf4, 0xaa, - 0x08, 0x6b, 0x9e, 0x68, 0x39, 0xe5, 0x9d, 0x2e, 0x76, 0x88, 0x11, 0xb6, 0x43, 0xf4, 0x72, 0x1f, - 0x17, 0x3b, 0x45, 0x77, 0x1d, 0xf4, 0x02, 0xb5, 0xac, 0x3c, 0xd1, 0x2f, 0xe9, 0x22, 0xca, 0xd4, - 0xf5, 0x85, 0x8d, 0x15, 0x59, 0x8c, 0x4d, 0x1c, 0xfb, 0x07, 0x96, 0xfa, 0xb8, 0x0f, 0x20, 0x1c, - 0xf2, 0x56, 0x3a, 0x1c, 0xf2, 0x62, 0x2e, 0xc3, 0xdc, 0x27, 0x0e, 0xf2, 0x1a, 0x8c, 0x2d, 0x06, - 0xad, 0x96, 0xe3, 0xd7, 0xd0, 0x4f, 0xc0, 0x98, 0xcb, 0x7f, 0x8a, 0xa3, 0x0a, 0x76, 0x3f, 0x25, - 0xa0, 0x58, 0xc2, 0xd0, 0x93, 0x30, 0xe2, 0x44, 0x0d, 0x79, 0x3c, 0xc1, 0xae, 0xf4, 0x17, 0xa2, - 0x46, 0x8c, 0x59, 0xa9, 0xfd, 0x76, 0x11, 0x60, 0x31, 0x68, 0x85, 0x4e, 0x44, 0x6a, 0x5b, 0x01, - 0xcb, 0x4b, 0x73, 0xac, 0xf7, 0x3a, 0xda, 0x58, 0x7a, 0x94, 0xef, 0x76, 0x8c, 0xf3, 0xfd, 0xe2, - 0x83, 0x3e, 0xdf, 0xff, 0x86, 0x05, 0x88, 0x7e, 0x91, 0xc0, 0x27, 0x7e, 0xa2, 0xaf, 0x2b, 0xe7, - 0xa1, 0xe2, 0xca, 0x52, 0xa1, 0xb5, 0xe8, 0xf5, 0x27, 0x01, 0x58, 0xe3, 0x0c, 0x60, 0x7e, 0x3e, - 0x2d, 0x85, 0x63, 0x31, 0xed, 0x05, 0xc7, 0x44, 0xaa, 0x90, 0x95, 0xf6, 0xef, 0x17, 0xe0, 0x31, - 0xbe, 0xdf, 0xad, 0x39, 0xbe, 0xd3, 0x20, 0x2d, 0xda, 0xaa, 0x41, 0x2f, 0xa0, 0x5d, 0x6a, 0xf7, - 0x78, 0xd2, 0xab, 0xed, 0xa8, 0x0b, 0x83, 0x4f, 0x68, 0x3e, 0x85, 0x57, 0x7c, 0x2f, 0xc1, 0x8c, - 0x38, 0x8a, 0xa1, 0x2c, 0xb3, 0x8c, 0x0a, 0x41, 0x97, 0x13, 0x23, 0xb5, 0xe6, 0xc5, 0xa6, 0x44, - 0xb0, 0x62, 0x44, 0xb5, 0xc2, 0x66, 0xe0, 0xee, 0x62, 0x12, 0x06, 0x4c, 0xa8, 0x19, 0x4e, 0x45, - 0xab, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0xf7, 0x2d, 0xc8, 0x8a, 0x7b, 0x23, 0xa5, 0x87, 0x75, 0xcf, - 0x94, 0x1e, 0x43, 0xe4, 0xd4, 0xf8, 0x39, 0x18, 0x77, 0x12, 0xba, 0x43, 0x73, 0x9b, 0xb6, 0x78, - 0x7f, 0xc7, 0xd6, 0x6b, 0x41, 0xcd, 0xab, 0x7b, 0xcc, 0x96, 0x35, 0xc9, 0xd9, 0xff, 0x6b, 0x04, - 0xa6, 0xbb, 0x3c, 0x95, 0xd1, 0x4b, 0x30, 0xe1, 0x8a, 0xe9, 0x11, 0x62, 0x52, 0x17, 0x9d, 0x31, - 0x3c, 0x5d, 0x34, 0x0c, 0xa7, 0x30, 0x07, 0x98, 0xa0, 0x2b, 0x70, 0x2a, 0xa2, 0x56, 0x74, 0x9b, - 0x2c, 0xd4, 0x13, 0x12, 0x6d, 0x12, 0x37, 0xf0, 0x6b, 0x3c, 0xf1, 0x4c, 0xb1, 0xfa, 0xf8, 0x9d, - 0x83, 0xd9, 0x53, 0xb8, 0x1b, 0x8c, 0x7b, 0xd5, 0x41, 0x21, 0x4c, 0x36, 0x4d, 0x05, 0x4b, 0x68, - 0xd7, 0xf7, 0xa5, 0x9b, 0xa9, 0x0d, 0x38, 0x55, 0x8c, 0xd3, 0x0c, 0xd2, 0x5a, 0x5a, 0xe9, 0x21, - 0x69, 0x69, 0xbf, 0xa4, 0xb5, 0x34, 0x7e, 0xbf, 0xfa, 0x7a, 0xce, 0x9e, 0xea, 0xc7, 0xad, 0xa6, - 0xbd, 0x0a, 0x65, 0xe9, 0x79, 0x32, 0x90, 0xc7, 0x86, 0x49, 0xa7, 0x8f, 0x44, 0xbb, 0x5b, 0x80, - 0x1e, 0x1a, 0x3e, 0x5d, 0x67, 0x7a, 0x3b, 0x4d, 0xad, 0xb3, 0xe1, 0xb6, 0x54, 0xb4, 0xcf, 0xbd, - 0x6e, 0xf8, 0xc6, 0xf1, 0xe9, 0xbc, 0x2d, 0x14, 0xed, 0x88, 0xa3, 0x5c, 0x40, 0x94, 0x33, 0xce, - 0x05, 0x00, 0xad, 0x05, 0x09, 0x87, 0x53, 0x75, 0xad, 0xa7, 0x95, 0x25, 0x6c, 0x60, 0x51, 0x83, - 0xd5, 0xf3, 0xe3, 0xc4, 0x69, 0x36, 0x2f, 0x7b, 0x7e, 0x22, 0x4e, 0xde, 0xd4, 0x0e, 0xb9, 0xa2, - 0x41, 0xd8, 0xc4, 0x3b, 0xfb, 0x09, 0xe3, 0xbb, 0x0c, 0xf3, 0x3d, 0x77, 0xe0, 0x89, 0x65, 0x2f, - 0x51, 0x6e, 0xd2, 0x6a, 0x1e, 0x51, 0x25, 0x47, 0xb9, 0xfd, 0x5b, 0x7d, 0xdd, 0xfe, 0x0d, 0x37, - 0xe5, 0x42, 0xda, 0xab, 0x3a, 0xeb, 0xa6, 0x6c, 0xbf, 0x04, 0xa7, 0x97, 0xbd, 0xe4, 0x92, 0xd7, - 0x24, 0x43, 0x32, 0xb1, 0xbf, 0x52, 0x82, 0x09, 0x33, 0x2c, 0x65, 0x98, 0xc8, 0x85, 0x6f, 0x51, - 0x3d, 0x46, 0xf4, 0xce, 0x53, 0x77, 0x2c, 0x37, 0x8f, 0x1c, 0x23, 0xd3, 0x7b, 0xc4, 0x0c, 0x55, - 0x46, 0xf3, 0xc4, 0x66, 0x03, 0xd0, 0x6d, 0x28, 0xd5, 0x99, 0x1b, 0x6d, 0x31, 0x8f, 0x9b, 0xe3, - 0x5e, 0x23, 0xaa, 0x97, 0x19, 0x77, 0xc4, 0xe5, 0xfc, 0xe8, 0x0e, 0x19, 0xa5, 0x63, 0x33, 0x94, - 0xa0, 0x52, 0x51, 0x19, 0x0a, 0xa3, 0x9f, 0xa8, 0x2f, 0xdd, 0x87, 0xa8, 0x4f, 0x09, 0xde, 0xd1, - 0x87, 0x24, 0x78, 0x99, 0x4b, 0x74, 0xb2, 0xc3, 0xf4, 0x37, 0xe1, 0x10, 0x3b, 0xc6, 0x06, 0xc1, - 0x70, 0x89, 0x4e, 0x81, 0x71, 0x16, 0xdf, 0xfe, 0x46, 0x01, 0xa6, 0x96, 0xfd, 0xf6, 0xc6, 0xf2, - 0x46, 0x7b, 0xbb, 0xe9, 0xb9, 0x57, 0x49, 0x87, 0xca, 0xb7, 0x5d, 0xd2, 0x59, 0x59, 0x12, 0xd3, - 0x50, 0x0d, 0xfc, 0x55, 0x5a, 0x88, 0x39, 0x8c, 0xae, 0xe8, 0xba, 0xe7, 0x37, 0x48, 0x14, 0x46, - 0x9e, 0x38, 0x94, 0x33, 0x56, 0xf4, 0x25, 0x0d, 0xc2, 0x26, 0x1e, 0xa5, 0x1d, 0xdc, 0xf6, 0x49, - 0x94, 0xd5, 0x06, 0xd7, 0x69, 0x21, 0xe6, 0x30, 0x8a, 0x94, 0x44, 0xed, 0x38, 0x11, 0x5f, 0x54, - 0x21, 0x6d, 0xd1, 0x42, 0xcc, 0x61, 0x74, 0xb9, 0xc4, 0xed, 0x6d, 0x76, 0xbb, 0x9d, 0x71, 0x61, - 0xdd, 0xe4, 0xc5, 0x58, 0xc2, 0x29, 0xea, 0x2e, 0xe9, 0x2c, 0x51, 0xbb, 0x2c, 0xe3, 0x64, 0x7e, - 0x95, 0x17, 0x63, 0x09, 0x67, 0x99, 0x6e, 0xd2, 0xc3, 0xf1, 0x23, 0x97, 0xe9, 0x26, 0xdd, 0xfc, - 0x3e, 0x16, 0xde, 0x6f, 0x58, 0x30, 0x61, 0xfa, 0xa4, 0xa0, 0x46, 0x46, 0x51, 0x5c, 0xef, 0xca, - 0x5a, 0xf6, 0x33, 0xbd, 0x5e, 0x54, 0x68, 0x78, 0x49, 0x10, 0xc6, 0xcf, 0x13, 0xbf, 0xe1, 0xf9, - 0x84, 0xdd, 0x5c, 0x72, 0x5f, 0x96, 0x94, 0xc3, 0xcb, 0x62, 0x50, 0x23, 0xf7, 0xa1, 0x69, 0xda, - 0x37, 0x61, 0xba, 0x2b, 0xb2, 0x60, 0x80, 0xfd, 0xf9, 0xd0, 0xb8, 0x2e, 0x1b, 0xc3, 0x38, 0x25, - 0xbc, 0x1e, 0x72, 0xa7, 0x93, 0x45, 0x98, 0xe6, 0x3a, 0x04, 0xe5, 0xb4, 0xe9, 0xee, 0x90, 0x96, - 0x8a, 0x16, 0x61, 0x27, 0xc0, 0x37, 0xb2, 0x40, 0xdc, 0x8d, 0x6f, 0x7f, 0xd3, 0x82, 0xc9, 0x54, - 0xb0, 0x47, 0x4e, 0x9a, 0x04, 0x5b, 0x69, 0x01, 0x73, 0x91, 0x62, 0x5e, 0xa2, 0x45, 0xb6, 0x23, - 0xe9, 0x95, 0xa6, 0x41, 0xd8, 0xc4, 0xb3, 0xdf, 0x29, 0x40, 0x59, 0xde, 0x5a, 0x0f, 0xd0, 0x94, - 0xaf, 0x5b, 0x30, 0xa9, 0x4e, 0xdd, 0xd9, 0x71, 0x0e, 0x9f, 0x8c, 0xd7, 0x8e, 0x7e, 0x6f, 0xae, - 0x7c, 0xf8, 0xfc, 0x7a, 0xa0, 0xd5, 0x5a, 0x6c, 0x32, 0xc3, 0x69, 0xde, 0xe8, 0x06, 0x40, 0xdc, - 0x89, 0x13, 0xd2, 0x32, 0x0e, 0x96, 0x6c, 0x63, 0xc5, 0xcd, 0xb9, 0x41, 0x44, 0xe8, 0xfa, 0xba, - 0x16, 0xd4, 0xc8, 0xa6, 0xc2, 0xd4, 0x7a, 0x88, 0x2e, 0xc3, 0x06, 0x25, 0xfb, 0x1f, 0x14, 0xe0, - 0x64, 0xb6, 0x49, 0xe8, 0x75, 0x98, 0x90, 0xdc, 0x8d, 0xd7, 0x21, 0xe4, 0x55, 0xfd, 0x04, 0x36, - 0x60, 0x77, 0x0f, 0x66, 0x67, 0xbb, 0x5f, 0xe7, 0x98, 0x33, 0x51, 0x70, 0x8a, 0x18, 0xbf, 0xfa, - 0x10, 0x77, 0x74, 0xd5, 0xce, 0x42, 0x18, 0x8a, 0xfb, 0x0b, 0xe3, 0xea, 0xc3, 0x84, 0xe2, 0x0c, - 0x36, 0xda, 0x80, 0xd3, 0x46, 0xc9, 0x35, 0xe2, 0x35, 0x76, 0xb6, 0x83, 0x48, 0x9a, 0x27, 0x4f, - 0x6a, 0xef, 0x97, 0x6e, 0x1c, 0xdc, 0xb3, 0x26, 0xdd, 0x32, 0x5d, 0x27, 0x74, 0x5c, 0x2f, 0xe9, - 0x88, 0x93, 0x32, 0x25, 0x9b, 0x16, 0x45, 0x39, 0x56, 0x18, 0xf6, 0x1a, 0x8c, 0x0c, 0x38, 0x83, - 0x06, 0x52, 0x8b, 0x5f, 0x85, 0x32, 0x25, 0x27, 0x75, 0xa4, 0x3c, 0x48, 0x06, 0x50, 0x96, 0x09, - 0x9e, 0x91, 0x0d, 0x45, 0xcf, 0x91, 0xb7, 0x4b, 0xaa, 0x5b, 0x2b, 0x71, 0xdc, 0x66, 0x96, 0x26, - 0x05, 0xa2, 0xa7, 0xa1, 0x48, 0xf6, 0xc3, 0xec, 0x35, 0xd2, 0xc5, 0xfd, 0xd0, 0x8b, 0x48, 0x4c, - 0x91, 0xc8, 0x7e, 0x88, 0xce, 0x42, 0xc1, 0xab, 0x89, 0x4d, 0x0a, 0x04, 0x4e, 0x61, 0x65, 0x09, - 0x17, 0xbc, 0x9a, 0xbd, 0x0f, 0x15, 0x95, 0x51, 0x1a, 0xed, 0x4a, 0xd9, 0x6d, 0xe5, 0xe1, 0x66, - 0x22, 0xe9, 0xf6, 0x91, 0xda, 0x6d, 0x00, 0x1d, 0x5a, 0x93, 0x97, 0x7c, 0x39, 0x0f, 0x23, 0x6e, - 0x20, 0x22, 0xf2, 0xca, 0x9a, 0x0c, 0x13, 0xda, 0x0c, 0x62, 0xdf, 0x84, 0xa9, 0xab, 0x7e, 0x70, - 0x9b, 0xe5, 0xe0, 0xbc, 0xe4, 0x91, 0x66, 0x8d, 0x12, 0xae, 0xd3, 0x1f, 0x59, 0x15, 0x81, 0x41, - 0x31, 0x87, 0xa9, 0xb4, 0x1b, 0x85, 0x7e, 0x69, 0x37, 0xec, 0x2f, 0x5a, 0x70, 0x52, 0xc5, 0x7c, - 0x48, 0x69, 0xfc, 0x12, 0x4c, 0x6c, 0xb7, 0xbd, 0x66, 0x4d, 0xfc, 0xcf, 0xda, 0xfa, 0x55, 0x03, - 0x86, 0x53, 0x98, 0xd4, 0x32, 0xd9, 0xf6, 0x7c, 0x27, 0xea, 0x6c, 0x68, 0xf1, 0xaf, 0x24, 0x42, - 0x55, 0x41, 0xb0, 0x81, 0x65, 0x7f, 0xb9, 0x00, 0x93, 0xa9, 0x08, 0x78, 0xd4, 0x84, 0x32, 0x69, - 0xb2, 0x13, 0x28, 0xf9, 0x51, 0x8f, 0x9a, 0x7c, 0x4a, 0x4d, 0xc4, 0x8b, 0x82, 0x2e, 0x56, 0x1c, - 0x1e, 0x89, 0x6b, 0x16, 0xfb, 0x0f, 0x8a, 0x30, 0xc3, 0x0f, 0xde, 0x6a, 0xca, 0x9f, 0x61, 0x4d, - 0x6a, 0x27, 0x7f, 0x55, 0x67, 0x9b, 0xe0, 0xc3, 0xb1, 0x7d, 0xd4, 0xf4, 0x89, 0xbd, 0x19, 0x0d, - 0x74, 0xd3, 0xfe, 0xeb, 0x99, 0x9b, 0xf6, 0x42, 0x1e, 0x01, 0x11, 0x7d, 0x5b, 0xf4, 0xa3, 0x75, - 0xf5, 0xfe, 0x77, 0x0b, 0x70, 0x22, 0x93, 0x9b, 0x12, 0xbd, 0x9d, 0xce, 0x3e, 0x65, 0xe5, 0x71, - 0x3c, 0x73, 0xcf, 0x0c, 0x89, 0xc3, 0xe5, 0xa0, 0x7a, 0x58, 0x13, 0xfe, 0x0f, 0x0b, 0x30, 0x95, - 0x4e, 0xaa, 0xf9, 0x08, 0x8e, 0xd4, 0x47, 0xa1, 0xc2, 0x52, 0xd5, 0xb1, 0x77, 0x3b, 0xf8, 0x29, - 0x10, 0xcf, 0xa8, 0x26, 0x0b, 0xb1, 0x86, 0x3f, 0x12, 0xa9, 0xbd, 0xec, 0xbf, 0x67, 0xc1, 0x19, - 0xde, 0xcb, 0xec, 0x3c, 0xfc, 0x6b, 0xbd, 0x46, 0xf7, 0x8d, 0x7c, 0x1b, 0x98, 0xc9, 0x92, 0x72, - 0xd8, 0xf8, 0xb2, 0xf7, 0x02, 0x44, 0x6b, 0xd3, 0x53, 0xe1, 0x11, 0x6c, 0xec, 0x50, 0x93, 0xc1, - 0xfe, 0xc3, 0x22, 0xe8, 0x27, 0x12, 0x90, 0x27, 0xc2, 0x26, 0x72, 0xc9, 0x16, 0xb3, 0xd9, 0xf1, - 0x5d, 0xfd, 0x18, 0x43, 0x39, 0x13, 0x35, 0xf1, 0x2b, 0x16, 0x8c, 0x7b, 0xbe, 0x97, 0x78, 0x0e, - 0x53, 0x3a, 0xf3, 0xc9, 0x19, 0xaf, 0xd8, 0xad, 0x70, 0xca, 0x41, 0x64, 0x1e, 0x1d, 0x2a, 0x66, - 0xd8, 0xe4, 0x8c, 0x3e, 0x27, 0x9c, 0xe1, 0x8a, 0xb9, 0x05, 0xfc, 0x94, 0x33, 0x1e, 0x70, 0x21, - 0x94, 0x22, 0x92, 0x44, 0x32, 0xd4, 0xea, 0xea, 0x51, 0x3d, 0x9c, 0x93, 0xa8, 0xa3, 0x92, 0x83, - 0xe9, 0xc7, 0xaa, 0x68, 0x31, 0xe6, 0x8c, 0xec, 0x18, 0x50, 0xf7, 0x58, 0x0c, 0xe9, 0x68, 0x34, - 0x0f, 0x15, 0xa7, 0x9d, 0x04, 0x2d, 0x3a, 0x4c, 0xe2, 0x74, 0x53, 0xbb, 0x52, 0x49, 0x00, 0xd6, - 0x38, 0xf6, 0xdb, 0x25, 0xc8, 0xc4, 0x31, 0xa0, 0x7d, 0xf3, 0x79, 0x0f, 0x2b, 0xdf, 0xe7, 0x3d, - 0x54, 0x63, 0x7a, 0x3d, 0xf1, 0x81, 0x1a, 0x50, 0x0a, 0x77, 0x9c, 0x58, 0xea, 0x94, 0xaf, 0xca, - 0x61, 0xda, 0xa0, 0x85, 0x77, 0x0f, 0x66, 0x7f, 0x76, 0xb0, 0x33, 0x0a, 0x3a, 0x57, 0xe7, 0x79, - 0xbc, 0xb0, 0x66, 0xcd, 0x68, 0x60, 0x4e, 0x7f, 0x98, 0xac, 0xf9, 0x5f, 0x12, 0xf9, 0x0c, 0x31, - 0x89, 0xdb, 0xcd, 0x44, 0xcc, 0x86, 0x57, 0x73, 0x5c, 0x65, 0x9c, 0xb0, 0x8e, 0xc0, 0xe3, 0xff, - 0xb1, 0xc1, 0x14, 0xbd, 0x0e, 0x95, 0x38, 0x71, 0xa2, 0xe4, 0x3e, 0x63, 0x66, 0xd4, 0xa0, 0x6f, - 0x4a, 0x22, 0x58, 0xd3, 0x43, 0xaf, 0xb1, 0xe4, 0x59, 0x5e, 0xbc, 0x73, 0x9f, 0x3e, 0xac, 0x32, - 0xd1, 0x96, 0xa0, 0x80, 0x0d, 0x6a, 0x54, 0x65, 0x67, 0x73, 0x9b, 0x3b, 0x6e, 0x94, 0x99, 0x4d, - 0xa6, 0x44, 0x21, 0x56, 0x10, 0x6c, 0x60, 0xd9, 0x5f, 0x80, 0x53, 0xd9, 0xf7, 0xc0, 0xc4, 0xb1, - 0x65, 0x23, 0x0a, 0xda, 0x61, 0xd6, 0x26, 0x61, 0xef, 0x45, 0x61, 0x0e, 0xa3, 0x36, 0xc9, 0xae, - 0xe7, 0xd7, 0xb2, 0x36, 0xc9, 0x55, 0xcf, 0xaf, 0x61, 0x06, 0x19, 0xe0, 0xdd, 0x93, 0x7f, 0x6e, - 0xc1, 0xf9, 0xc3, 0x9e, 0x2d, 0x43, 0x4f, 0xc2, 0xc8, 0x6d, 0x27, 0x92, 0xc9, 0xf8, 0x98, 0xec, - 0xb8, 0xe9, 0x44, 0x3e, 0x66, 0xa5, 0xa8, 0x03, 0xa3, 0x3c, 0x46, 0x51, 0x28, 0xb0, 0xaf, 0xe6, - 0xfb, 0x88, 0xda, 0x55, 0x62, 0x68, 0xd0, 0x3c, 0x3e, 0x12, 0x0b, 0x86, 0xf6, 0xfb, 0x16, 0xa0, - 0xf5, 0x3d, 0x12, 0x45, 0x5e, 0xcd, 0x88, 0xaa, 0x44, 0x2f, 0xc2, 0xc4, 0xad, 0xcd, 0xf5, 0x6b, - 0x1b, 0x81, 0xe7, 0xb3, 0x18, 0x6b, 0x23, 0x2e, 0xe5, 0x8a, 0x51, 0x8e, 0x53, 0x58, 0x68, 0x11, - 0xa6, 0x6f, 0xbd, 0x49, 0xed, 0x28, 0x33, 0x8f, 0x6d, 0x41, 0x9f, 0x9c, 0x5d, 0x79, 0x35, 0x03, - 0xc4, 0xdd, 0xf8, 0x68, 0x1d, 0xce, 0xb4, 0xb8, 0x06, 0xce, 0xcc, 0xc7, 0x98, 0xab, 0xe3, 0x91, - 0x4c, 0xbc, 0xf0, 0xc4, 0x9d, 0x83, 0xd9, 0x33, 0x6b, 0xbd, 0x10, 0x70, 0xef, 0x7a, 0xf6, 0xbb, - 0x05, 0x18, 0x37, 0x9e, 0xfe, 0x1b, 0xc0, 0x50, 0xce, 0xbc, 0x56, 0x58, 0x18, 0xf0, 0xb5, 0xc2, - 0x67, 0xa1, 0x1c, 0x06, 0x4d, 0xcf, 0xf5, 0x54, 0x96, 0x08, 0x96, 0xcc, 0x6c, 0x43, 0x94, 0x61, - 0x05, 0x45, 0xb7, 0xa1, 0xa2, 0x9e, 0xc3, 0x12, 0xc1, 0x7d, 0x79, 0x1d, 0x15, 0xa8, 0xc5, 0xab, - 0x9f, 0xb9, 0xd2, 0xbc, 0x90, 0x0d, 0xa3, 0x6c, 0xe6, 0x4b, 0x97, 0x26, 0x16, 0x75, 0xc1, 0x96, - 0x44, 0x8c, 0x05, 0xc4, 0xfe, 0xea, 0x18, 0x9c, 0xee, 0x95, 0x80, 0x0b, 0x7d, 0x1e, 0x46, 0x79, - 0x1b, 0xf3, 0xc9, 0xf1, 0xd8, 0x8b, 0xc7, 0x32, 0x23, 0x28, 0x9a, 0xc5, 0x7e, 0x63, 0xc1, 0x53, - 0x70, 0x6f, 0x3a, 0xdb, 0x42, 0x8d, 0x38, 0x1e, 0xee, 0xab, 0x8e, 0xe6, 0xbe, 0xea, 0x70, 0xee, - 0x4d, 0x67, 0x1b, 0xed, 0x43, 0xa9, 0xe1, 0x25, 0xc4, 0x11, 0xca, 0xf4, 0xcd, 0x63, 0x61, 0x4e, - 0x1c, 0xee, 0x39, 0xcf, 0x7e, 0x62, 0xce, 0x10, 0x7d, 0xd7, 0x82, 0x13, 0xdb, 0xe9, 0x20, 0x16, - 0xb1, 0xab, 0x38, 0xc7, 0x90, 0x64, 0x2d, 0xcd, 0xa8, 0x7a, 0xea, 0xce, 0xc1, 0xec, 0x89, 0x4c, - 0x21, 0xce, 0x36, 0x07, 0xfd, 0x92, 0x05, 0x63, 0x75, 0xaf, 0x69, 0x64, 0x10, 0x3a, 0x86, 0x8f, - 0x73, 0x89, 0x31, 0xd0, 0x3b, 0x2f, 0xff, 0x1f, 0x63, 0xc9, 0xb9, 0xdf, 0x75, 0xde, 0xe8, 0x51, - 0xaf, 0xf3, 0xc6, 0x1e, 0x92, 0xf9, 0xf4, 0xd7, 0x0b, 0xf0, 0xf4, 0x00, 0xdf, 0xc8, 0x0c, 0x8a, - 0xb0, 0x0e, 0x09, 0x8a, 0x38, 0x0f, 0x23, 0x11, 0x09, 0x83, 0xec, 0x7e, 0xc7, 0x3c, 0x87, 0x18, - 0x04, 0x3d, 0x05, 0x45, 0x27, 0xf4, 0xc4, 0x76, 0xa7, 0x6e, 0xfb, 0x17, 0x36, 0x56, 0x30, 0x2d, - 0xa7, 0x5f, 0xba, 0xb2, 0x2d, 0x43, 0xab, 0xf2, 0x49, 0xd6, 0xdc, 0x2f, 0x52, 0x8b, 0x1b, 0x34, - 0x0a, 0x8a, 0x35, 0x5f, 0x7b, 0x1d, 0xce, 0xf6, 0x9f, 0x21, 0xe8, 0x05, 0x18, 0xdf, 0x8e, 0x1c, - 0xdf, 0xdd, 0x61, 0x89, 0xcd, 0xe5, 0x98, 0x30, 0x57, 0x78, 0x5d, 0x8c, 0x4d, 0x1c, 0xfb, 0x0f, - 0x0a, 0xbd, 0x29, 0x72, 0x21, 0x30, 0xcc, 0x08, 0x8b, 0xf1, 0x2b, 0xf4, 0x19, 0xbf, 0x37, 0xa1, - 0x9c, 0x30, 0x4f, 0x7c, 0x52, 0x17, 0x92, 0x24, 0xb7, 0x60, 0x32, 0xb6, 0xd7, 0x6c, 0x09, 0xe2, - 0x58, 0xb1, 0xa1, 0x22, 0xbf, 0xa9, 0x93, 0x0f, 0x09, 0x91, 0x9f, 0x39, 0x47, 0x5b, 0x82, 0x93, - 0x46, 0x2e, 0x45, 0xee, 0x88, 0xcc, 0xaf, 0x51, 0x55, 0x74, 0xce, 0x46, 0x06, 0x8e, 0xbb, 0x6a, - 0xd8, 0xbf, 0x51, 0x80, 0x27, 0xfa, 0x4a, 0x36, 0x7d, 0xd7, 0x6b, 0xdd, 0xe3, 0xae, 0xf7, 0xc8, - 0x13, 0xd4, 0x1c, 0xe0, 0x91, 0x07, 0x33, 0xc0, 0xcf, 0x41, 0xd9, 0xf3, 0x63, 0xe2, 0xb6, 0x23, - 0x3e, 0x68, 0x86, 0x5b, 0xde, 0x8a, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0xa3, 0xfe, 0x53, 0x8d, 0xee, - 0x72, 0x3f, 0xb6, 0xa3, 0xf4, 0x32, 0x4c, 0x3a, 0x61, 0xc8, 0xf1, 0xd8, 0xbd, 0x5a, 0x26, 0xde, - 0x6e, 0xc1, 0x04, 0xe2, 0x34, 0xae, 0x31, 0x87, 0x47, 0xfb, 0xcd, 0x61, 0xfb, 0x4f, 0x2d, 0xa8, - 0x60, 0x52, 0xe7, 0x39, 0x38, 0xd1, 0x2d, 0x31, 0x44, 0x56, 0x1e, 0xc9, 0x21, 0xd8, 0xa3, 0xda, - 0x1e, 0x4b, 0x9a, 0xd0, 0x6b, 0xb0, 0xbb, 0xf3, 0x82, 0x16, 0x86, 0xca, 0x0b, 0xaa, 0x32, 0x43, - 0x16, 0xfb, 0x67, 0x86, 0xb4, 0xdf, 0x1d, 0xa3, 0xdd, 0x0b, 0x83, 0xc5, 0x88, 0xd4, 0x62, 0xfa, - 0x7d, 0xdb, 0x51, 0x33, 0xfb, 0xd6, 0xe0, 0x75, 0xbc, 0x8a, 0x69, 0x79, 0xea, 0x10, 0xa0, 0x30, - 0x54, 0xb4, 0x51, 0xf1, 0xd0, 0x68, 0xa3, 0x97, 0x61, 0x32, 0x8e, 0x77, 0x36, 0x22, 0x6f, 0xcf, - 0x49, 0xa8, 0x69, 0x21, 0xdc, 0x32, 0x74, 0x84, 0xc0, 0xe6, 0x65, 0x0d, 0xc4, 0x69, 0x5c, 0xb4, - 0x0c, 0xd3, 0x3a, 0xe6, 0x87, 0x44, 0x09, 0xf3, 0xc2, 0xe0, 0x33, 0x41, 0x39, 0xe8, 0xeb, 0x28, - 0x21, 0x81, 0x80, 0xbb, 0xeb, 0x50, 0x89, 0x95, 0x2a, 0xa4, 0x0d, 0x19, 0x4d, 0x4b, 0xac, 0x14, - 0x1d, 0xda, 0x96, 0xae, 0x1a, 0x68, 0x0d, 0x4e, 0xf1, 0x89, 0xc1, 0x1e, 0xb7, 0x55, 0x3d, 0xe2, - 0x5e, 0x33, 0x1f, 0x16, 0x84, 0x4e, 0x2d, 0x77, 0xa3, 0xe0, 0x5e, 0xf5, 0xa8, 0xdd, 0xa0, 0x8a, - 0x57, 0x96, 0x84, 0xfd, 0xaa, 0xec, 0x06, 0x45, 0x66, 0xa5, 0x86, 0x4d, 0x3c, 0xf4, 0x69, 0x78, - 0x5c, 0xff, 0xe5, 0xfe, 0x6e, 0xfc, 0x50, 0x67, 0x49, 0x84, 0x53, 0xaa, 0x3c, 0x84, 0xcb, 0x3d, - 0xd1, 0x6a, 0xb8, 0x5f, 0x7d, 0xb4, 0x0d, 0x67, 0x15, 0xe8, 0x22, 0x35, 0xd2, 0xc2, 0xc8, 0x8b, - 0x49, 0xd5, 0x89, 0xc9, 0xf5, 0xa8, 0xc9, 0x02, 0x30, 0x2b, 0x3a, 0xa1, 0xfa, 0xb2, 0x97, 0x5c, - 0xee, 0x85, 0x89, 0x57, 0xf1, 0x3d, 0xa8, 0xa0, 0x79, 0xa8, 0x10, 0xdf, 0xd9, 0x6e, 0x92, 0xf5, - 0xc5, 0x15, 0x16, 0x96, 0x69, 0x9c, 0x21, 0x5d, 0x94, 0x00, 0xac, 0x71, 0xd4, 0x4d, 0xe0, 0x44, - 0xdf, 0x04, 0xfc, 0x1b, 0x70, 0xba, 0xe1, 0x86, 0x54, 0x0f, 0xf0, 0x5c, 0xb2, 0xe0, 0xba, 0xd4, - 0xd0, 0xa7, 0x1f, 0x86, 0xe7, 0x45, 0x55, 0xd7, 0xdc, 0xcb, 0x8b, 0x1b, 0x5d, 0x38, 0xb8, 0x67, - 0x4d, 0xba, 0xc6, 0xc2, 0x28, 0xd8, 0xef, 0xcc, 0x9c, 0x4a, 0xaf, 0xb1, 0x0d, 0x5a, 0x88, 0x39, - 0x0c, 0x5d, 0x01, 0xc4, 0x7c, 0x26, 0x2e, 0x27, 0x49, 0xa8, 0x14, 0x8f, 0x99, 0xd3, 0xac, 0x4b, - 0x67, 0x45, 0x0d, 0x74, 0xa9, 0x0b, 0x03, 0xf7, 0xa8, 0x65, 0xff, 0x89, 0x05, 0x93, 0x6a, 0xbd, - 0x3e, 0x00, 0xaf, 0xa1, 0x66, 0xda, 0x6b, 0x68, 0xf9, 0xe8, 0x12, 0x8f, 0xb5, 0xbc, 0xcf, 0xd5, - 0xf3, 0x57, 0xc7, 0x01, 0xb4, 0x54, 0x54, 0x1b, 0x92, 0xd5, 0x77, 0x43, 0x7a, 0x64, 0x25, 0x52, - 0xaf, 0x18, 0xac, 0xd2, 0xc3, 0x8d, 0xc1, 0xda, 0x84, 0x33, 0x52, 0x5d, 0xe0, 0x47, 0x32, 0x97, - 0x83, 0x58, 0x09, 0xb8, 0x72, 0xf5, 0x29, 0x41, 0xe8, 0xcc, 0x4a, 0x2f, 0x24, 0xdc, 0xbb, 0x6e, - 0x4a, 0x4b, 0x19, 0x3b, 0x4c, 0x4b, 0xd1, 0x6b, 0x7a, 0xb5, 0x2e, 0xb3, 0x1a, 0x66, 0xd6, 0xf4, - 0xea, 0xa5, 0x4d, 0xac, 0x71, 0x7a, 0x0b, 0xf6, 0x4a, 0x4e, 0x82, 0x1d, 0x86, 0x16, 0xec, 0x52, - 0xc4, 0x8c, 0xf7, 0x15, 0x31, 0xf2, 0x14, 0x68, 0xa2, 0xef, 0x29, 0xd0, 0x2b, 0x30, 0xe5, 0xf9, - 0x3b, 0x24, 0xf2, 0x12, 0x52, 0x63, 0x6b, 0x41, 0x3c, 0xe0, 0xae, 0xb6, 0xf5, 0x95, 0x14, 0x14, - 0x67, 0xb0, 0xd3, 0x72, 0x71, 0x6a, 0x00, 0xb9, 0xd8, 0x67, 0x37, 0x3a, 0x91, 0xcf, 0x6e, 0x74, - 0xf2, 0xe8, 0xbb, 0xd1, 0xf4, 0xb1, 0xee, 0x46, 0x28, 0x97, 0xdd, 0x68, 0x20, 0x41, 0x6f, 0x18, - 0x74, 0xa7, 0x0f, 0x31, 0xe8, 0xfa, 0x6d, 0x45, 0x67, 0xee, 0x7b, 0x2b, 0xea, 0xbd, 0xcb, 0x3c, - 0x76, 0x5f, 0xbb, 0xcc, 0xd7, 0x0a, 0x70, 0x46, 0xcb, 0x61, 0x3a, 0xfb, 0xbd, 0x3a, 0x95, 0x44, - 0x2c, 0x31, 0x2e, 0x77, 0x47, 0x31, 0x9c, 0xd8, 0xb4, 0x3f, 0x9c, 0x82, 0x60, 0x03, 0x8b, 0xf9, - 0x82, 0x91, 0x88, 0xa5, 0x98, 0xc9, 0x0a, 0xe9, 0x45, 0x51, 0x8e, 0x15, 0x06, 0x9d, 0x5f, 0xf4, - 0xb7, 0xf0, 0xaf, 0xcd, 0x86, 0x9d, 0x2f, 0x6a, 0x10, 0x36, 0xf1, 0xd0, 0xb3, 0x9c, 0x09, 0x13, - 0x10, 0x54, 0x50, 0x4f, 0x88, 0x27, 0x1f, 0xa4, 0x4c, 0x50, 0x50, 0xd9, 0x1c, 0xe6, 0xf4, 0x57, - 0xea, 0x6e, 0x0e, 0xbb, 0x7c, 0x53, 0x18, 0xf6, 0xff, 0xb6, 0xe0, 0x89, 0x9e, 0x43, 0xf1, 0x00, - 0x36, 0xdf, 0xfd, 0xf4, 0xe6, 0xbb, 0x99, 0x97, 0xb9, 0x61, 0xf4, 0xa2, 0xcf, 0x46, 0xfc, 0xef, - 0x2d, 0x98, 0xd2, 0xf8, 0x0f, 0xa0, 0xab, 0x5e, 0xba, 0xab, 0xf9, 0x59, 0x56, 0x95, 0xae, 0xbe, - 0xfd, 0x09, 0xeb, 0x1b, 0xbf, 0xc3, 0x58, 0x70, 0xe5, 0xdb, 0xfd, 0x87, 0x9c, 0xdd, 0x77, 0x60, - 0x94, 0x65, 0x65, 0x8d, 0xf3, 0xb9, 0x4b, 0x49, 0xf3, 0x67, 0xde, 0xbc, 0xfa, 0x2e, 0x85, 0xfd, - 0x8d, 0xb1, 0x60, 0xc8, 0x12, 0x20, 0x79, 0x31, 0x95, 0xe6, 0x35, 0xe1, 0x3e, 0xa7, 0x13, 0x20, - 0x89, 0x72, 0xac, 0x30, 0xec, 0x16, 0xcc, 0xa4, 0x89, 0x2f, 0x91, 0x3a, 0xbb, 0xb2, 0x1e, 0xa8, - 0x9b, 0xf3, 0x50, 0x71, 0x58, 0xad, 0xd5, 0xb6, 0x93, 0x7d, 0x25, 0x68, 0x41, 0x02, 0xb0, 0xc6, - 0xb1, 0x7f, 0xc7, 0x82, 0x53, 0x3d, 0x3a, 0x93, 0xa3, 0xdb, 0x60, 0xa2, 0xa5, 0x40, 0xaf, 0x0d, - 0xf7, 0x23, 0x30, 0x56, 0x23, 0x75, 0x47, 0x5e, 0x8a, 0x1a, 0x32, 0x77, 0x89, 0x17, 0x63, 0x09, - 0xb7, 0xff, 0xbb, 0x05, 0x27, 0xd2, 0x6d, 0x8d, 0xa9, 0xd4, 0xe4, 0x9d, 0x59, 0xf2, 0x62, 0x37, - 0xd8, 0x23, 0x51, 0x87, 0xf6, 0x9c, 0xb7, 0x5a, 0x49, 0xcd, 0x85, 0x2e, 0x0c, 0xdc, 0xa3, 0x16, - 0x4b, 0xd0, 0x52, 0x53, 0xa3, 0x2d, 0x67, 0xca, 0x8d, 0x3c, 0x67, 0x8a, 0xfe, 0x98, 0xe6, 0xc5, - 0x91, 0x62, 0x89, 0x4d, 0xfe, 0xf6, 0xfb, 0x23, 0xa0, 0xfc, 0x8a, 0xd9, 0xf5, 0x5b, 0x4e, 0x97, - 0x97, 0xa9, 0xa7, 0xa4, 0x8a, 0x03, 0x3c, 0x25, 0x25, 0x27, 0xc3, 0xc8, 0xbd, 0xae, 0xc6, 0xf8, - 0xe9, 0x85, 0x79, 0x48, 0xa8, 0x7a, 0xb8, 0xa5, 0x41, 0xd8, 0xc4, 0xa3, 0x2d, 0x69, 0x7a, 0x7b, - 0x84, 0x57, 0x1a, 0x4d, 0xb7, 0x64, 0x55, 0x02, 0xb0, 0xc6, 0xa1, 0x2d, 0xa9, 0x79, 0xf5, 0xba, - 0x30, 0xc5, 0x55, 0x4b, 0xe8, 0xe8, 0x60, 0x06, 0xa1, 0x18, 0x3b, 0x41, 0xb0, 0x2b, 0xb4, 0x53, - 0x85, 0x71, 0x39, 0x08, 0x76, 0x31, 0x83, 0x50, 0x7d, 0xca, 0x0f, 0xa2, 0x16, 0x7b, 0xc5, 0xa9, - 0xa6, 0xb8, 0x08, 0xad, 0x54, 0xe9, 0x53, 0xd7, 0xba, 0x51, 0x70, 0xaf, 0x7a, 0x74, 0x06, 0x86, - 0x11, 0xa9, 0x79, 0x6e, 0x62, 0x52, 0x83, 0xf4, 0x0c, 0xdc, 0xe8, 0xc2, 0xc0, 0x3d, 0x6a, 0xa1, - 0x05, 0x38, 0x21, 0xfd, 0xc2, 0x65, 0xe8, 0xdc, 0x78, 0x3a, 0x54, 0x07, 0xa7, 0xc1, 0x38, 0x8b, - 0x4f, 0xa5, 0x4d, 0x4b, 0x44, 0xcd, 0x32, 0x25, 0xd6, 0x90, 0x36, 0x32, 0x9a, 0x16, 0x2b, 0x0c, - 0xfb, 0x4b, 0x45, 0xba, 0x3b, 0xf6, 0xc9, 0x9e, 0xfb, 0xc0, 0x2e, 0xcb, 0xd3, 0x33, 0x72, 0x64, - 0x80, 0x19, 0xf9, 0x22, 0x4c, 0xdc, 0x8a, 0x03, 0x5f, 0x5d, 0x44, 0x97, 0xfa, 0x5e, 0x44, 0x1b, - 0x58, 0xbd, 0x2f, 0xa2, 0x47, 0xf3, 0xba, 0x88, 0x1e, 0xbb, 0xcf, 0x8b, 0xe8, 0xef, 0x95, 0x40, - 0xe5, 0x9f, 0xbc, 0x46, 0x92, 0xdb, 0x41, 0xb4, 0xeb, 0xf9, 0x0d, 0xe6, 0x4f, 0xff, 0x5d, 0x0b, - 0x26, 0xf8, 0x7a, 0x59, 0x35, 0x7d, 0x6b, 0xeb, 0x39, 0xe5, 0x49, 0x4c, 0x31, 0x9b, 0xdb, 0x32, - 0x18, 0x65, 0x1e, 0x09, 0x30, 0x41, 0x38, 0xd5, 0x22, 0xf4, 0x0b, 0x00, 0xf2, 0xdc, 0xb2, 0x2e, - 0x45, 0xe6, 0x4a, 0x3e, 0xed, 0xc3, 0xa4, 0xae, 0x75, 0xd3, 0x2d, 0xc5, 0x04, 0x1b, 0x0c, 0xd1, - 0xd7, 0xb2, 0xaf, 0xdc, 0x7d, 0xee, 0x58, 0xc6, 0x66, 0x10, 0xaf, 0x63, 0x0c, 0x63, 0x9e, 0xdf, - 0xa0, 0xf3, 0x44, 0xdc, 0xdd, 0xff, 0x64, 0xaf, 0x58, 0x94, 0xd5, 0xc0, 0xa9, 0x55, 0x9d, 0xa6, - 0xe3, 0xbb, 0x24, 0x5a, 0xe1, 0xe8, 0xe6, 0xab, 0x35, 0xac, 0x00, 0x4b, 0x42, 0x5d, 0x89, 0x40, - 0x4b, 0x83, 0x24, 0x02, 0x3d, 0xfb, 0x49, 0x98, 0xee, 0xfa, 0x98, 0x43, 0x39, 0x19, 0xdf, 0xbf, - 0x7f, 0xb2, 0xfd, 0x2f, 0x46, 0xf5, 0xa6, 0x75, 0x2d, 0xa8, 0xf1, 0x74, 0x94, 0x91, 0xfe, 0xa2, - 0x42, 0xf7, 0xcc, 0x71, 0x8a, 0x18, 0x2f, 0xdf, 0xa8, 0x42, 0x6c, 0xb2, 0xa4, 0x73, 0x34, 0x74, - 0x22, 0xe2, 0x1f, 0xf7, 0x1c, 0xdd, 0x50, 0x4c, 0xb0, 0xc1, 0x10, 0xed, 0xa4, 0xbc, 0x0c, 0x2f, - 0x1d, 0xdd, 0xcb, 0x90, 0x85, 0xba, 0xf6, 0xca, 0xb7, 0xf7, 0x6d, 0x0b, 0xa6, 0xfc, 0xd4, 0xcc, - 0x15, 0xf7, 0x38, 0x5b, 0xc7, 0xb1, 0x2a, 0x78, 0xfa, 0xe2, 0x74, 0x19, 0xce, 0xf0, 0xef, 0xb5, - 0xa5, 0x95, 0x86, 0xdc, 0xd2, 0x74, 0x5e, 0xdb, 0xd1, 0x7e, 0x79, 0x6d, 0x91, 0xaf, 0x32, 0x71, - 0x8f, 0xe5, 0x9e, 0x89, 0x1b, 0x7a, 0x64, 0xe1, 0xbe, 0x09, 0x15, 0x37, 0x22, 0x4e, 0x72, 0x9f, - 0x49, 0x99, 0xd9, 0x25, 0xf6, 0xa2, 0x24, 0x80, 0x35, 0x2d, 0xfb, 0xdf, 0x15, 0xe1, 0xa4, 0x1c, - 0x11, 0xe9, 0x81, 0x45, 0xf7, 0x47, 0xce, 0x57, 0x2b, 0xb7, 0x6a, 0x7f, 0xbc, 0x2c, 0x01, 0x58, - 0xe3, 0x50, 0x7d, 0xac, 0x1d, 0x93, 0xf5, 0x90, 0xf8, 0xab, 0xde, 0x76, 0x2c, 0xee, 0x1f, 0xd5, - 0x42, 0xb9, 0xae, 0x41, 0xd8, 0xc4, 0xa3, 0xca, 0x38, 0xd7, 0x8b, 0xe3, 0xac, 0x43, 0xa3, 0xd0, - 0xb7, 0xb1, 0x84, 0xa3, 0x5f, 0xeb, 0x99, 0xce, 0x3f, 0x1f, 0x57, 0xde, 0x2e, 0xc7, 0xb3, 0x21, - 0xf3, 0xf8, 0xbf, 0x6d, 0xc1, 0x89, 0xdd, 0x54, 0x2c, 0x92, 0x14, 0xc9, 0x47, 0x8c, 0x9a, 0x4d, - 0x07, 0x38, 0xe9, 0x29, 0x9c, 0x2e, 0x8f, 0x71, 0x96, 0xbb, 0xfd, 0x3f, 0x2d, 0x30, 0xc5, 0xd3, - 0x60, 0x9a, 0x95, 0xf1, 0xfe, 0x4e, 0xe1, 0x90, 0xf7, 0x77, 0xa4, 0x12, 0x56, 0x1c, 0x4c, 0xe9, - 0x1f, 0x19, 0x42, 0xe9, 0x2f, 0xf5, 0xd5, 0xda, 0x9e, 0x82, 0x62, 0xdb, 0xab, 0x09, 0xbd, 0x5d, - 0xdf, 0x36, 0xae, 0x2c, 0x61, 0x5a, 0x6e, 0xff, 0xd3, 0x92, 0xb6, 0xd3, 0x85, 0x07, 0xea, 0x8f, - 0x45, 0xb7, 0xeb, 0x2a, 0x08, 0x9a, 0xf7, 0xfc, 0x5a, 0x57, 0x10, 0xf4, 0x4f, 0x0f, 0xef, 0x60, - 0xcc, 0x07, 0xa8, 0x5f, 0x0c, 0xf4, 0xd8, 0x21, 0xde, 0xc5, 0xb7, 0xa0, 0x4c, 0x4d, 0x1b, 0x76, - 0xe0, 0x56, 0x4e, 0x35, 0xaa, 0x7c, 0x59, 0x94, 0xdf, 0x3d, 0x98, 0xfd, 0xa9, 0xe1, 0x9b, 0x25, - 0x6b, 0x63, 0x45, 0x1f, 0xc5, 0x50, 0xa1, 0xbf, 0x99, 0x23, 0xb4, 0x30, 0x9a, 0xae, 0x2b, 0x59, - 0x24, 0x01, 0xb9, 0x78, 0x59, 0x6b, 0x3e, 0xc8, 0x87, 0x0a, 0x7b, 0x4a, 0x84, 0x31, 0xe5, 0xb6, - 0xd5, 0x86, 0x72, 0x47, 0x96, 0x80, 0xbb, 0x07, 0xb3, 0x2f, 0x0f, 0xcf, 0x54, 0x55, 0xc7, 0x9a, - 0x85, 0xfd, 0xce, 0x88, 0x9e, 0xbb, 0x22, 0xf6, 0xfd, 0xc7, 0x62, 0xee, 0xbe, 0x94, 0x99, 0xbb, - 0xe7, 0xbb, 0xe6, 0xee, 0x94, 0x7e, 0xf2, 0x22, 0x35, 0x1b, 0x1f, 0xf4, 0x06, 0x7b, 0xb8, 0x1d, - 0xcf, 0x34, 0x8b, 0x37, 0xdb, 0x5e, 0x44, 0xe2, 0x8d, 0xa8, 0xed, 0x7b, 0x7e, 0x43, 0xbc, 0xa9, - 0x67, 0x68, 0x16, 0x29, 0x30, 0xce, 0xe2, 0xb3, 0xf7, 0xf8, 0x3a, 0xbe, 0x7b, 0xd3, 0xd9, 0xe3, - 0xb3, 0xca, 0x08, 0x07, 0xde, 0x14, 0xe5, 0x58, 0x61, 0xd8, 0xef, 0xb2, 0xbb, 0x5b, 0x23, 0x02, - 0x83, 0xce, 0x89, 0x26, 0x7b, 0xbb, 0x85, 0xc7, 0x12, 0xab, 0x39, 0xc1, 0x1f, 0x6c, 0xe1, 0x30, - 0x74, 0x1b, 0xc6, 0xb6, 0x79, 0x2e, 0xf4, 0x7c, 0x92, 0x8f, 0x89, 0xc4, 0xea, 0x2c, 0x3f, 0xa8, - 0xcc, 0xb2, 0x7e, 0x57, 0xff, 0xc4, 0x92, 0x9b, 0xfd, 0xde, 0x08, 0x9c, 0xc8, 0xbc, 0xee, 0x91, - 0x4a, 0x85, 0x52, 0x38, 0x34, 0x15, 0xca, 0x67, 0x00, 0x6a, 0x24, 0x6c, 0x06, 0x1d, 0xa6, 0xe6, - 0x8c, 0x0c, 0xad, 0xe6, 0x28, 0xcd, 0x78, 0x49, 0x51, 0xc1, 0x06, 0x45, 0x11, 0x40, 0xcd, 0x33, - 0xab, 0x64, 0x02, 0xa8, 0x8d, 0xfc, 0x7f, 0xa3, 0x0f, 0x36, 0xff, 0x9f, 0x07, 0x27, 0x78, 0x13, - 0x55, 0x9c, 0xc3, 0x7d, 0x84, 0x33, 0x30, 0x0f, 0xd9, 0xa5, 0x34, 0x19, 0x9c, 0xa5, 0xfb, 0x30, - 0x1f, 0xef, 0x41, 0x1f, 0x85, 0x8a, 0xfc, 0xce, 0xf1, 0x4c, 0x45, 0xc7, 0x8a, 0xc9, 0x69, 0xc0, - 0x1e, 0xd5, 0x11, 0x3f, 0xed, 0x6f, 0x15, 0xa8, 0x56, 0xca, 0xff, 0xa9, 0x98, 0xdf, 0x67, 0x60, - 0xd4, 0x69, 0x27, 0x3b, 0x41, 0x57, 0xf6, 0xf9, 0x05, 0x56, 0x8a, 0x05, 0x14, 0xad, 0xc2, 0x48, - 0x4d, 0xc7, 0x71, 0x0e, 0x33, 0x8a, 0xfa, 0x80, 0xcf, 0x49, 0x08, 0x66, 0x54, 0xd0, 0x93, 0x30, - 0x92, 0x38, 0x8d, 0xd4, 0xbb, 0x90, 0x5b, 0x4e, 0x23, 0xc6, 0xac, 0xd4, 0xdc, 0x34, 0x47, 0x0e, - 0xd9, 0x34, 0x5f, 0x86, 0xc9, 0xd8, 0x6b, 0xf8, 0x4e, 0xd2, 0x8e, 0x88, 0x71, 0x99, 0xa4, 0xfd, - 0x03, 0x4c, 0x20, 0x4e, 0xe3, 0xda, 0xef, 0x57, 0xe0, 0x74, 0xaf, 0xf7, 0xbb, 0xf3, 0xf6, 0x86, - 0xef, 0xc5, 0xe3, 0xc1, 0x79, 0xc3, 0xf7, 0xe1, 0xde, 0x34, 0xbc, 0xe1, 0x9b, 0x86, 0x37, 0xfc, - 0xd7, 0x2c, 0xa8, 0x28, 0x27, 0x70, 0xe1, 0xc8, 0xfa, 0xfa, 0x31, 0xbc, 0x91, 0x2e, 0x59, 0x08, - 0x5f, 0x60, 0xf9, 0x17, 0x6b, 0xe6, 0xc7, 0xe7, 0x1e, 0x7f, 0xcf, 0x06, 0x0d, 0xe5, 0x1e, 0xaf, - 0x62, 0x07, 0x4a, 0x79, 0xc4, 0x0e, 0xf4, 0xf9, 0x54, 0x3d, 0x63, 0x07, 0xbe, 0x6d, 0xc1, 0xb8, - 0xf3, 0x56, 0x3b, 0x22, 0x4b, 0x64, 0x6f, 0x3d, 0x8c, 0x85, 0x80, 0x7d, 0x23, 0xff, 0x06, 0x2c, - 0x68, 0x26, 0x22, 0x4d, 0xae, 0x2e, 0xc0, 0x66, 0x13, 0x52, 0xb1, 0x02, 0x63, 0x79, 0xc4, 0x0a, - 0xf4, 0x6a, 0xce, 0xa1, 0xb1, 0x02, 0x2f, 0xc3, 0xa4, 0xdb, 0x0c, 0x7c, 0xb2, 0x11, 0x05, 0x49, - 0xe0, 0x06, 0x4d, 0xa1, 0x4c, 0x2b, 0x91, 0xb0, 0x68, 0x02, 0x71, 0x1a, 0xb7, 0x5f, 0xa0, 0x41, - 0xe5, 0xa8, 0x81, 0x06, 0xf0, 0x90, 0x02, 0x0d, 0xfe, 0xbc, 0x00, 0xb3, 0x87, 0x7c, 0x54, 0xf4, - 0x12, 0x4c, 0x04, 0x51, 0xc3, 0xf1, 0xbd, 0xb7, 0x78, 0x9c, 0x67, 0x29, 0x9d, 0x86, 0x63, 0xdd, - 0x80, 0xe1, 0x14, 0xa6, 0x74, 0x45, 0x1e, 0xed, 0xe3, 0x8a, 0xfc, 0x71, 0x18, 0x4f, 0x88, 0xd3, - 0x12, 0x7e, 0x17, 0xc2, 0x00, 0xd2, 0x17, 0x4a, 0x1a, 0x84, 0x4d, 0x3c, 0x3a, 0x8d, 0xa6, 0x1c, - 0xd7, 0x25, 0x71, 0x2c, 0x7d, 0x8d, 0xc5, 0xe1, 0x4c, 0x6e, 0x8e, 0xcc, 0xec, 0xcc, 0x6b, 0x21, - 0xc5, 0x02, 0x67, 0x58, 0xd2, 0xc6, 0x3b, 0xcd, 0x26, 0x0f, 0x2b, 0x20, 0xf2, 0xa5, 0x67, 0x9d, - 0x15, 0x42, 0x83, 0xb0, 0x89, 0x67, 0xff, 0x66, 0x01, 0x9e, 0xba, 0xa7, 0x78, 0x19, 0xd8, 0x0d, - 0xbc, 0x1d, 0x93, 0x28, 0x7b, 0x21, 0x73, 0x3d, 0x26, 0x11, 0x66, 0x10, 0x3e, 0x4a, 0x61, 0x68, - 0x3c, 0x31, 0x93, 0x77, 0xd4, 0x01, 0x1f, 0xa5, 0x14, 0x0b, 0x9c, 0x61, 0x99, 0x1d, 0xa5, 0x91, - 0x01, 0x47, 0xe9, 0xef, 0x17, 0xe0, 0xe9, 0x01, 0x84, 0x70, 0x8e, 0xd1, 0x19, 0xe9, 0xe8, 0x96, - 0xe2, 0xc3, 0x89, 0x6e, 0xb9, 0xdf, 0xe1, 0x7a, 0xb7, 0x00, 0x67, 0xfb, 0xcb, 0x42, 0xf4, 0x33, - 0xd4, 0x88, 0x92, 0xce, 0x16, 0x66, 0x64, 0xcc, 0x29, 0x6e, 0x40, 0xa5, 0x40, 0x38, 0x8b, 0x8b, - 0xe6, 0x00, 0x42, 0x27, 0xd9, 0x89, 0x2f, 0xee, 0x7b, 0x71, 0x22, 0x62, 0x3a, 0xa7, 0xf8, 0x51, - 0xb8, 0x2c, 0xc5, 0x06, 0x06, 0x65, 0xc7, 0xfe, 0x2d, 0x05, 0xd7, 0x82, 0x84, 0x57, 0xe2, 0x7a, - 0xdc, 0x29, 0x99, 0x87, 0xd0, 0x00, 0xe1, 0x2c, 0x2e, 0x65, 0xc7, 0x2e, 0x5b, 0x78, 0x43, 0xc5, - 0x33, 0xf6, 0x94, 0xdd, 0xaa, 0x2a, 0xc5, 0x06, 0x46, 0x36, 0xe6, 0xa7, 0x34, 0x40, 0xcc, 0xcf, - 0x3f, 0x2e, 0xc0, 0x13, 0x7d, 0xf7, 0xd2, 0xc1, 0x16, 0xe0, 0xa3, 0x17, 0xec, 0x73, 0x7f, 0x73, - 0x67, 0xc8, 0x10, 0x96, 0x3f, 0xed, 0x33, 0xd3, 0x44, 0x08, 0x4b, 0x76, 0xab, 0xb0, 0x86, 0xdd, - 0x2a, 0x1e, 0xa1, 0xf1, 0xec, 0x8a, 0x5a, 0x19, 0x19, 0x22, 0x6a, 0x25, 0xf3, 0x31, 0x4a, 0x03, - 0x2e, 0xe4, 0xef, 0xf7, 0x1f, 0x5e, 0xaa, 0x7b, 0x0f, 0x74, 0x3c, 0xb5, 0x04, 0x27, 0x3d, 0x9f, - 0xe5, 0xa4, 0xdd, 0x6c, 0x6f, 0x8b, 0x88, 0xdf, 0x42, 0xfa, 0xb9, 0xa5, 0x95, 0x0c, 0x1c, 0x77, - 0xd5, 0x78, 0x04, 0xa3, 0x88, 0xee, 0x73, 0x48, 0x3f, 0x03, 0x15, 0x45, 0x9b, 0x7b, 0x46, 0xaa, - 0x0f, 0xda, 0xe5, 0x19, 0xa9, 0xbe, 0xa6, 0x81, 0x45, 0x47, 0x62, 0x97, 0x74, 0xb2, 0x33, 0xf3, - 0x2a, 0xe9, 0xb0, 0x5b, 0x52, 0xfb, 0x63, 0x30, 0xa1, 0x8c, 0xc8, 0x41, 0x73, 0xa6, 0xda, 0xef, - 0x8c, 0xc2, 0x64, 0x2a, 0xb3, 0x43, 0xea, 0xcc, 0xc6, 0x3a, 0xf4, 0xcc, 0x86, 0x79, 0xba, 0xb6, - 0x7d, 0x99, 0x95, 0xd8, 0xf0, 0x74, 0x6d, 0xfb, 0x04, 0x73, 0x18, 0x35, 0xdd, 0x6b, 0x51, 0x07, - 0xb7, 0x7d, 0xe1, 0x91, 0xa6, 0x4c, 0xf7, 0x25, 0x56, 0x8a, 0x05, 0x14, 0x7d, 0xd1, 0x82, 0x89, - 0x98, 0x1d, 0x08, 0xf2, 0x13, 0x2f, 0xf1, 0x41, 0xaf, 0xe4, 0xf1, 0xaa, 0xae, 0xc8, 0x62, 0xc2, - 0x2e, 0xb3, 0xcd, 0x12, 0x9c, 0xe2, 0x88, 0xbe, 0x62, 0x99, 0xef, 0x09, 0x8f, 0xe6, 0xe1, 0x49, - 0x99, 0x4d, 0x9c, 0xc1, 0x8f, 0x4a, 0xee, 0xfd, 0xac, 0xb0, 0x7e, 0x66, 0x7c, 0xec, 0xc1, 0x3d, - 0x33, 0xfe, 0x51, 0xa8, 0xb4, 0x1c, 0xdf, 0xab, 0x93, 0x38, 0xe1, 0x27, 0x44, 0x32, 0x9f, 0x8f, - 0x2c, 0xc4, 0x1a, 0x4e, 0x37, 0xbb, 0x98, 0x75, 0x2c, 0x31, 0x8e, 0x74, 0xd8, 0x66, 0xb7, 0xa9, - 0x8b, 0xb1, 0x89, 0x63, 0x9e, 0x3f, 0xc1, 0x43, 0x3d, 0x7f, 0x1a, 0x3f, 0xe4, 0xfc, 0xe9, 0x1f, - 0x5a, 0x70, 0xa6, 0xe7, 0x57, 0x7b, 0x74, 0x7d, 0x94, 0xec, 0xf7, 0x8b, 0x70, 0xaa, 0x47, 0x8a, - 0x16, 0xd4, 0x39, 0xb6, 0xf7, 0xb1, 0x45, 0x0e, 0x98, 0xc9, 0xbe, 0x93, 0x78, 0xb8, 0xd3, 0x5f, - 0x7d, 0x02, 0x5b, 0x7c, 0xb0, 0x27, 0xb0, 0xc6, 0xb4, 0x1c, 0x79, 0xa8, 0xd3, 0xb2, 0x74, 0xc8, - 0xb4, 0x7c, 0xbf, 0x08, 0xc6, 0x73, 0xf7, 0xe8, 0x0b, 0x66, 0xda, 0x24, 0x2b, 0xaf, 0x14, 0x3f, - 0x9c, 0xb8, 0x4a, 0xbb, 0xc4, 0x9b, 0xd3, 0x2b, 0x0b, 0x53, 0x56, 0x02, 0x14, 0x06, 0x90, 0x00, - 0x4d, 0x99, 0x9f, 0xaa, 0x98, 0x7f, 0x7e, 0xaa, 0x4a, 0x36, 0x37, 0x15, 0xfa, 0x5d, 0x0b, 0x66, - 0x5a, 0x7d, 0xf2, 0x28, 0xe6, 0x93, 0x36, 0xa0, 0x5f, 0x96, 0xc6, 0xea, 0x93, 0x77, 0x0e, 0x66, - 0xfb, 0xa6, 0xaf, 0xc4, 0x7d, 0x5b, 0x65, 0xff, 0x4d, 0x8b, 0xaf, 0xe2, 0xcc, 0x57, 0xd0, 0xdb, - 0xac, 0x75, 0x8f, 0x6d, 0xf6, 0x39, 0xf6, 0x02, 0x5b, 0xfd, 0x32, 0x71, 0x9a, 0x62, 0x3b, 0x36, - 0x1f, 0x53, 0x63, 0xe5, 0x58, 0x61, 0xb0, 0x37, 0x13, 0x9a, 0xcd, 0xe0, 0xf6, 0xc5, 0x56, 0x98, - 0x74, 0xc4, 0xc6, 0xac, 0xdf, 0x4c, 0x50, 0x10, 0x6c, 0x60, 0xd9, 0x7f, 0xbb, 0xc0, 0x67, 0xa0, - 0xb8, 0xa4, 0x7c, 0x29, 0x93, 0xa0, 0x7b, 0xf0, 0xfb, 0xbd, 0xcf, 0x03, 0xb8, 0xea, 0xf1, 0xa5, - 0x7c, 0x1e, 0xcf, 0xd7, 0x8f, 0x39, 0x99, 0x2f, 0xba, 0xcb, 0x32, 0x6c, 0xf0, 0x4b, 0x09, 0xa6, - 0xe2, 0xa1, 0x82, 0x29, 0xb5, 0x46, 0x47, 0x0e, 0x59, 0xa3, 0x7f, 0x6e, 0x41, 0x4a, 0xbd, 0x40, - 0x21, 0x94, 0x68, 0x73, 0x3b, 0xf9, 0xbc, 0x2b, 0x65, 0x92, 0xa6, 0x72, 0x46, 0x4c, 0x7b, 0xf6, - 0x13, 0x73, 0x46, 0xa8, 0x29, 0xee, 0x32, 0x0b, 0x79, 0xbc, 0x7d, 0x66, 0x32, 0xbc, 0x1c, 0x04, - 0xbb, 0xfc, 0x0a, 0x44, 0xdf, 0x8b, 0xda, 0x2f, 0xc1, 0x74, 0x57, 0xa3, 0x58, 0x2e, 0xde, 0x40, - 0x3e, 0xa6, 0x65, 0x4c, 0x57, 0x16, 0x50, 0x84, 0x39, 0xcc, 0x7e, 0xd7, 0x82, 0x93, 0x59, 0xf2, - 0xe8, 0x3b, 0x16, 0x4c, 0xc7, 0x59, 0x7a, 0xc7, 0x35, 0x76, 0xca, 0xcf, 0xa7, 0x0b, 0x84, 0xbb, - 0x1b, 0x61, 0xff, 0x3f, 0x31, 0xf9, 0x6f, 0x7a, 0x7e, 0x2d, 0xb8, 0xad, 0x76, 0x79, 0xab, 0xef, - 0x2e, 0x4f, 0xd7, 0xa3, 0xbb, 0x43, 0x6a, 0xed, 0x66, 0x57, 0x24, 0xd3, 0xa6, 0x28, 0xc7, 0x0a, - 0x23, 0xf5, 0x72, 0x75, 0xf1, 0xd0, 0x97, 0xab, 0x5f, 0x84, 0x09, 0xf3, 0xc1, 0x38, 0x31, 0x2f, - 0x99, 0x76, 0x6b, 0xbe, 0x2d, 0x87, 0x53, 0x58, 0x99, 0x27, 0x83, 0x4b, 0x87, 0x3e, 0x19, 0xfc, - 0x2c, 0x94, 0xc5, 0xf3, 0xb7, 0xd2, 0x1b, 0x8e, 0x87, 0x49, 0x89, 0x32, 0xac, 0xa0, 0x54, 0x9a, - 0xb4, 0x1c, 0xbf, 0xed, 0x34, 0xe9, 0x08, 0x89, 0xd8, 0x4e, 0xb5, 0x0c, 0xd7, 0x14, 0x04, 0x1b, - 0x58, 0xb4, 0xc7, 0x89, 0xd7, 0x22, 0xaf, 0x05, 0xbe, 0xf4, 0x23, 0xd1, 0x07, 0xc4, 0xa2, 0x1c, - 0x2b, 0x0c, 0xfb, 0xbf, 0x5a, 0x90, 0x7d, 0xbb, 0x33, 0x75, 0x64, 0x60, 0x1d, 0x1a, 0x4f, 0x9a, - 0x8e, 0x46, 0x2b, 0x0c, 0x14, 0x8d, 0x66, 0x06, 0x8a, 0x15, 0xef, 0x19, 0x28, 0xf6, 0x13, 0xfa, - 0x45, 0x07, 0x1e, 0x51, 0x36, 0xde, 0xeb, 0x35, 0x07, 0x64, 0xc3, 0xa8, 0xeb, 0xa8, 0x8c, 0x03, - 0x13, 0x5c, 0x11, 0x5f, 0x5c, 0x60, 0x48, 0x02, 0x52, 0xdd, 0x7e, 0xef, 0x87, 0xe7, 0x3e, 0xf4, - 0xfd, 0x1f, 0x9e, 0xfb, 0xd0, 0x1f, 0xff, 0xf0, 0xdc, 0x87, 0xbe, 0x78, 0xe7, 0x9c, 0xf5, 0xde, - 0x9d, 0x73, 0xd6, 0xf7, 0xef, 0x9c, 0xb3, 0xfe, 0xf8, 0xce, 0x39, 0xeb, 0xfd, 0x3b, 0xe7, 0xac, - 0x6f, 0xff, 0xa7, 0x73, 0x1f, 0x7a, 0xad, 0xa7, 0xdf, 0x0f, 0xfd, 0xf1, 0xbc, 0x5b, 0x9b, 0xdf, - 0xbb, 0xc0, 0x5c, 0x4f, 0xe8, 0x6a, 0x98, 0x37, 0xa6, 0xc0, 0xbc, 0x5c, 0x0d, 0xff, 0x3f, 0x00, - 0x00, 0xff, 0xff, 0x1e, 0x5d, 0x63, 0x46, 0x8d, 0xc2, 0x00, 0x00, + 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0xdc, 0xa1, 0xef, 0x83, 0xe0, 0x91, 0x3c, 0x5c, + 0x0d, 0xcb, 0x14, 0x15, 0x91, 0x40, 0x78, 0xa2, 0x14, 0xc6, 0xb4, 0x29, 0x63, 0x81, 0x3b, 0x1c, + 0xee, 0x80, 0x03, 0xd8, 0xc0, 0xdd, 0x49, 0xa4, 0x29, 0x69, 0x30, 0xdb, 0xbb, 0x98, 0xc3, 0xee, + 0xcc, 0x70, 0x66, 0x16, 0x87, 0xa5, 0x65, 0x59, 0x92, 0x25, 0x5b, 0x89, 0x3e, 0xa8, 0xd0, 0x3f, + 0x22, 0x57, 0x12, 0x47, 0xb1, 0x5d, 0xae, 0xb8, 0x12, 0x56, 0x9c, 0xca, 0x8f, 0x7c, 0x55, 0xaa, + 0x62, 0x3b, 0x3f, 0x98, 0x52, 0xaa, 0xa2, 0xaa, 0xb8, 0x2c, 0x27, 0xb6, 0x61, 0xea, 0x52, 0xa9, + 0xa4, 0x52, 0x15, 0xa7, 0xf2, 0xf1, 0x27, 0x57, 0xf9, 0xe1, 0xea, 0xef, 0x9e, 0xd9, 0xdd, 0xc3, + 0x02, 0x18, 0xdc, 0x9d, 0x54, 0xfc, 0xb7, 0xdb, 0xef, 0xf5, 0x7b, 0xdd, 0x3d, 0xdd, 0xaf, 0xdf, + 0xeb, 0x7e, 0xef, 0x35, 0x2c, 0x37, 0xbc, 0x64, 0xab, 0xbd, 0x39, 0xe3, 0x06, 0xad, 0x59, 0x27, + 0x6a, 0x04, 0x61, 0x14, 0xdc, 0x66, 0x3f, 0x9e, 0x77, 0x6b, 0xb3, 0x3b, 0x17, 0x67, 0xc3, 0xed, + 0xc6, 0xac, 0x13, 0x7a, 0xf1, 0xac, 0x13, 0x86, 0x4d, 0xcf, 0x75, 0x12, 0x2f, 0xf0, 0x67, 0x77, + 0x5e, 0x70, 0x9a, 0xe1, 0x96, 0xf3, 0xc2, 0x6c, 0x83, 0xf8, 0x24, 0x72, 0x12, 0x52, 0x9b, 0x09, + 0xa3, 0x20, 0x09, 0xd0, 0x4f, 0x69, 0x6a, 0x33, 0x92, 0x1a, 0xfb, 0xf1, 0x59, 0xb7, 0x36, 0xb3, + 0x73, 0x71, 0x26, 0xdc, 0x6e, 0xcc, 0x50, 0x6a, 0x33, 0x06, 0xb5, 0x19, 0x49, 0xed, 0xdc, 0xf3, + 0x46, 0x5b, 0x1a, 0x41, 0x23, 0x98, 0x65, 0x44, 0x37, 0xdb, 0x75, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, + 0x38, 0xb3, 0x73, 0xf6, 0xf6, 0x4b, 0xf1, 0x8c, 0x17, 0xd0, 0xe6, 0xcd, 0xba, 0x41, 0x44, 0x66, + 0x77, 0xba, 0x1a, 0x74, 0xee, 0x8a, 0xc6, 0x21, 0xbb, 0x09, 0xf1, 0x63, 0x2f, 0xf0, 0xe3, 0xe7, + 0x69, 0x13, 0x48, 0xb4, 0x43, 0x22, 0xb3, 0x7b, 0x06, 0x42, 0x2f, 0x4a, 0x2f, 0x6a, 0x4a, 0x2d, + 0xc7, 0xdd, 0xf2, 0x7c, 0x12, 0x75, 0x74, 0xf5, 0x16, 0x49, 0x9c, 0x5e, 0xb5, 0x66, 0xfb, 0xd5, + 0x8a, 0xda, 0x7e, 0xe2, 0xb5, 0x48, 0x57, 0x85, 0x4f, 0xec, 0x57, 0x21, 0x76, 0xb7, 0x48, 0xcb, + 0xe9, 0xaa, 0xf7, 0xb1, 0x7e, 0xf5, 0xda, 0x89, 0xd7, 0x9c, 0xf5, 0xfc, 0x24, 0x4e, 0xa2, 0x6c, + 0x25, 0xfb, 0x4d, 0x18, 0x9f, 0xbb, 0xb5, 0x3e, 0xd7, 0x4e, 0xb6, 0xe6, 0x03, 0xbf, 0xee, 0x35, + 0xd0, 0xc7, 0x61, 0xd4, 0x6d, 0xb6, 0xe3, 0x84, 0x44, 0xd7, 0x9d, 0x16, 0x99, 0xb2, 0x2e, 0x58, + 0xcf, 0x56, 0xaa, 0xa7, 0xde, 0xdb, 0x9b, 0xfe, 0xd0, 0xdd, 0xbd, 0xe9, 0xd1, 0x79, 0x0d, 0xc2, + 0x26, 0x1e, 0xfa, 0x08, 0x8c, 0x44, 0x41, 0x93, 0xcc, 0xe1, 0xeb, 0x53, 0x05, 0x56, 0xe5, 0x84, + 0xa8, 0x32, 0x82, 0x79, 0x31, 0x96, 0x70, 0xfb, 0x0f, 0x0b, 0x00, 0x73, 0x61, 0xb8, 0x16, 0x05, + 0xb7, 0x89, 0x9b, 0xa0, 0xcf, 0x41, 0x99, 0x0e, 0x5d, 0xcd, 0x49, 0x1c, 0xc6, 0x6d, 0xf4, 0xe2, + 0x5f, 0x9e, 0xe1, 0x3d, 0x99, 0x31, 0x7b, 0xa2, 0x27, 0x0e, 0xc5, 0x9e, 0xd9, 0x79, 0x61, 0x66, + 0x75, 0x93, 0xd6, 0x5f, 0x21, 0x89, 0x53, 0x45, 0x82, 0x19, 0xe8, 0x32, 0xac, 0xa8, 0x22, 0x1f, + 0x86, 0xe2, 0x90, 0xb8, 0xac, 0x61, 0xa3, 0x17, 0x97, 0x67, 0x8e, 0x32, 0x43, 0x67, 0x74, 0xcb, + 0xd7, 0x43, 0xe2, 0x56, 0xc7, 0x04, 0xe7, 0x21, 0xfa, 0x0f, 0x33, 0x3e, 0x68, 0x07, 0x86, 0xe3, + 0xc4, 0x49, 0xda, 0xf1, 0x54, 0x91, 0x71, 0xbc, 0x9e, 0x1b, 0x47, 0x46, 0xb5, 0x3a, 0x21, 0x78, + 0x0e, 0xf3, 0xff, 0x58, 0x70, 0xb3, 0xff, 0xd4, 0x82, 0x09, 0x8d, 0xbc, 0xec, 0xc5, 0x09, 0xfa, + 0xd9, 0xae, 0xc1, 0x9d, 0x19, 0x6c, 0x70, 0x69, 0x6d, 0x36, 0xb4, 0x27, 0x05, 0xb3, 0xb2, 0x2c, + 0x31, 0x06, 0xb6, 0x05, 0x25, 0x2f, 0x21, 0xad, 0x78, 0xaa, 0x70, 0xa1, 0xf8, 0xec, 0xe8, 0xc5, + 0x2b, 0x79, 0xf5, 0xb3, 0x3a, 0x2e, 0x98, 0x96, 0x96, 0x28, 0x79, 0xcc, 0xb9, 0xd8, 0xbf, 0x3d, + 0x66, 0xf6, 0x8f, 0x0e, 0x38, 0x7a, 0x01, 0x46, 0xe3, 0xa0, 0x1d, 0xb9, 0x04, 0x93, 0x30, 0x88, + 0xa7, 0xac, 0x0b, 0x45, 0x3a, 0xf5, 0xe8, 0x4c, 0x5d, 0xd7, 0xc5, 0xd8, 0xc4, 0x41, 0xdf, 0xb2, + 0x60, 0xac, 0x46, 0xe2, 0xc4, 0xf3, 0x19, 0x7f, 0xd9, 0xf8, 0x8d, 0x23, 0x37, 0x5e, 0x16, 0x2e, + 0x68, 0xe2, 0xd5, 0xd3, 0xa2, 0x23, 0x63, 0x46, 0x61, 0x8c, 0x53, 0xfc, 0xe9, 0x8a, 0xab, 0x91, + 0xd8, 0x8d, 0xbc, 0x90, 0xfe, 0x67, 0x73, 0xc6, 0x58, 0x71, 0x0b, 0x1a, 0x84, 0x4d, 0x3c, 0xe4, + 0x43, 0x89, 0xae, 0xa8, 0x78, 0x6a, 0x88, 0xb5, 0x7f, 0xe9, 0x68, 0xed, 0x17, 0x83, 0x4a, 0x17, + 0xab, 0x1e, 0x7d, 0xfa, 0x2f, 0xc6, 0x9c, 0x0d, 0xfa, 0xa6, 0x05, 0x53, 0x62, 0xc5, 0x63, 0xc2, + 0x07, 0xf4, 0xd6, 0x96, 0x97, 0x90, 0xa6, 0x17, 0x27, 0x53, 0x25, 0xd6, 0x86, 0xd9, 0xc1, 0xe6, + 0xd6, 0x62, 0x14, 0xb4, 0xc3, 0x6b, 0x9e, 0x5f, 0xab, 0x5e, 0x10, 0x9c, 0xa6, 0xe6, 0xfb, 0x10, + 0xc6, 0x7d, 0x59, 0xa2, 0x5f, 0xb1, 0xe0, 0x9c, 0xef, 0xb4, 0x48, 0x1c, 0x3a, 0xf4, 0xd3, 0x72, + 0x70, 0xb5, 0xe9, 0xb8, 0xdb, 0xac, 0x45, 0xc3, 0x87, 0x6b, 0x91, 0x2d, 0x5a, 0x74, 0xee, 0x7a, + 0x5f, 0xd2, 0xf8, 0x3e, 0x6c, 0xd1, 0x6f, 0x58, 0x30, 0x19, 0x44, 0xe1, 0x96, 0xe3, 0x93, 0x9a, + 0x84, 0xc6, 0x53, 0x23, 0x6c, 0xe9, 0x7d, 0xe6, 0x68, 0x9f, 0x68, 0x35, 0x4b, 0x76, 0x25, 0xf0, + 0xbd, 0x24, 0x88, 0xd6, 0x49, 0x92, 0x78, 0x7e, 0x23, 0xae, 0x9e, 0xb9, 0xbb, 0x37, 0x3d, 0xd9, + 0x85, 0x85, 0xbb, 0xdb, 0x83, 0x7e, 0x0e, 0x46, 0xe3, 0x8e, 0xef, 0xde, 0xf2, 0xfc, 0x5a, 0x70, + 0x27, 0x9e, 0x2a, 0xe7, 0xb1, 0x7c, 0xd7, 0x15, 0x41, 0xb1, 0x00, 0x35, 0x03, 0x6c, 0x72, 0xeb, + 0xfd, 0xe1, 0xf4, 0x54, 0xaa, 0xe4, 0xfd, 0xe1, 0xf4, 0x64, 0xba, 0x0f, 0x5b, 0xf4, 0xcb, 0x16, + 0x8c, 0xc7, 0x5e, 0xc3, 0x77, 0x92, 0x76, 0x44, 0xae, 0x91, 0x4e, 0x3c, 0x05, 0xac, 0x21, 0x57, + 0x8f, 0x38, 0x2a, 0x06, 0xc9, 0xea, 0x19, 0xd1, 0xc6, 0x71, 0xb3, 0x34, 0xc6, 0x69, 0xbe, 0xbd, + 0x16, 0x9a, 0x9e, 0xd6, 0xa3, 0xf9, 0x2e, 0x34, 0x3d, 0xa9, 0xfb, 0xb2, 0x44, 0x3f, 0x03, 0x27, + 0x79, 0x91, 0x1a, 0xd9, 0x78, 0x6a, 0x8c, 0x09, 0xda, 0xd3, 0x77, 0xf7, 0xa6, 0x4f, 0xae, 0x67, + 0x60, 0xb8, 0x0b, 0x1b, 0xbd, 0x09, 0xd3, 0x21, 0x89, 0x5a, 0x5e, 0xb2, 0xea, 0x37, 0x3b, 0x52, + 0x7c, 0xbb, 0x41, 0x48, 0x6a, 0xa2, 0x39, 0xf1, 0xd4, 0xf8, 0x05, 0xeb, 0xd9, 0x72, 0xf5, 0xc3, + 0xa2, 0x99, 0xd3, 0x6b, 0xf7, 0x47, 0xc7, 0xfb, 0xd1, 0xb3, 0xff, 0x6d, 0x01, 0x4e, 0x66, 0x37, + 0x4e, 0xf4, 0x5b, 0x16, 0x9c, 0xb8, 0x7d, 0x27, 0xd9, 0x08, 0xb6, 0x89, 0x1f, 0x57, 0x3b, 0x54, + 0xbc, 0xb1, 0x2d, 0x63, 0xf4, 0xa2, 0x9b, 0xef, 0x16, 0x3d, 0x73, 0x35, 0xcd, 0xe5, 0x92, 0x9f, + 0x44, 0x9d, 0xea, 0x63, 0xa2, 0x77, 0x27, 0xae, 0xde, 0xda, 0x30, 0xa1, 0x38, 0xdb, 0xa8, 0x73, + 0x5f, 0xb7, 0xe0, 0x74, 0x2f, 0x12, 0xe8, 0x24, 0x14, 0xb7, 0x49, 0x87, 0x6b, 0x65, 0x98, 0xfe, + 0x44, 0x6f, 0x40, 0x69, 0xc7, 0x69, 0xb6, 0x89, 0xd0, 0x6e, 0x16, 0x8f, 0xd6, 0x11, 0xd5, 0x32, + 0xcc, 0xa9, 0xfe, 0x64, 0xe1, 0x25, 0xcb, 0xfe, 0xf7, 0x45, 0x18, 0x35, 0xf6, 0xb7, 0x07, 0xa0, + 0xb1, 0x05, 0x29, 0x8d, 0x6d, 0x25, 0xb7, 0xad, 0xb9, 0xaf, 0xca, 0x76, 0x27, 0xa3, 0xb2, 0xad, + 0xe6, 0xc7, 0xf2, 0xbe, 0x3a, 0x1b, 0x4a, 0xa0, 0x12, 0x84, 0x54, 0x23, 0xa7, 0x5b, 0xff, 0x50, + 0x1e, 0x9f, 0x70, 0x55, 0x92, 0xab, 0x8e, 0xdf, 0xdd, 0x9b, 0xae, 0xa8, 0xbf, 0x58, 0x33, 0xb2, + 0x7f, 0x60, 0xc1, 0x69, 0xa3, 0x8d, 0xf3, 0x81, 0x5f, 0xf3, 0xd8, 0xa7, 0xbd, 0x00, 0x43, 0x49, + 0x27, 0x94, 0x6a, 0xbf, 0x1a, 0xa9, 0x8d, 0x4e, 0x48, 0x30, 0x83, 0x50, 0x45, 0xbf, 0x45, 0xe2, + 0xd8, 0x69, 0x90, 0xac, 0xa2, 0xbf, 0xc2, 0x8b, 0xb1, 0x84, 0xa3, 0x08, 0x50, 0xd3, 0x89, 0x93, + 0x8d, 0xc8, 0xf1, 0x63, 0x46, 0x7e, 0xc3, 0x6b, 0x11, 0x31, 0xc0, 0x7f, 0x69, 0xb0, 0x19, 0x43, + 0x6b, 0x54, 0xcf, 0xde, 0xdd, 0x9b, 0x46, 0xcb, 0x5d, 0x94, 0x70, 0x0f, 0xea, 0xf6, 0xaf, 0x58, + 0x70, 0xb6, 0xb7, 0x2e, 0x86, 0x9e, 0x81, 0x61, 0x6e, 0xf2, 0x89, 0xde, 0xe9, 0x4f, 0xc2, 0x4a, + 0xb1, 0x80, 0xa2, 0x59, 0xa8, 0xa8, 0x7d, 0x42, 0xf4, 0x71, 0x52, 0xa0, 0x56, 0xf4, 0xe6, 0xa2, + 0x71, 0xe8, 0xa0, 0xd1, 0x3f, 0x42, 0x73, 0x53, 0x83, 0xc6, 0x8c, 0x24, 0x06, 0xb1, 0xff, 0xcc, + 0x82, 0x13, 0x46, 0xab, 0x1e, 0x80, 0x6a, 0xee, 0xa7, 0x55, 0xf3, 0xa5, 0xdc, 0xe6, 0x73, 0x1f, + 0xdd, 0xfc, 0x9b, 0x16, 0x9c, 0x33, 0xb0, 0x56, 0x9c, 0xc4, 0xdd, 0xba, 0xb4, 0x1b, 0x46, 0x24, + 0xa6, 0xe6, 0x34, 0x7a, 0xca, 0x90, 0x5b, 0xd5, 0x51, 0x41, 0xa1, 0x78, 0x8d, 0x74, 0xb8, 0x10, + 0x7b, 0x0e, 0xca, 0x7c, 0x72, 0x06, 0x91, 0x18, 0x71, 0xd5, 0xb7, 0x55, 0x51, 0x8e, 0x15, 0x06, + 0xb2, 0x61, 0x98, 0x09, 0x27, 0xba, 0x58, 0xe9, 0x36, 0x04, 0xf4, 0x23, 0xde, 0x64, 0x25, 0x58, + 0x40, 0xec, 0xbb, 0x05, 0x66, 0x2b, 0xa8, 0x55, 0x48, 0x1e, 0x84, 0xa1, 0x19, 0xa5, 0xc4, 0xd6, + 0x5a, 0x7e, 0x32, 0x84, 0xf4, 0x37, 0x36, 0xdf, 0xca, 0x48, 0x2e, 0x9c, 0x2b, 0xd7, 0xfb, 0x1b, + 0x9c, 0xbf, 0x5b, 0x80, 0xe9, 0x74, 0x85, 0x2e, 0xc1, 0x47, 0xad, 0x1b, 0x83, 0x51, 0xf6, 0x3c, + 0xc1, 0xc0, 0xc7, 0x26, 0x5e, 0x1f, 0xd9, 0x51, 0x38, 0x4e, 0xd9, 0x61, 0x8a, 0xb6, 0xe2, 0x3e, + 0xa2, 0xed, 0x19, 0x35, 0xea, 0x43, 0x19, 0x59, 0x92, 0x16, 0xef, 0x17, 0x60, 0x28, 0x4e, 0x48, + 0x38, 0x55, 0x4a, 0x8b, 0x86, 0xf5, 0x84, 0x84, 0x98, 0x41, 0xec, 0xff, 0x5e, 0x80, 0xc7, 0xd2, + 0x63, 0xa8, 0xa5, 0xf1, 0x27, 0x53, 0xd2, 0xf8, 0xa3, 0xa6, 0x34, 0xbe, 0xb7, 0x37, 0xfd, 0x44, + 0x9f, 0x6a, 0x3f, 0x32, 0xc2, 0x1a, 0x2d, 0x66, 0x46, 0x71, 0x36, 0x3d, 0x8a, 0xf7, 0xf6, 0xa6, + 0x9f, 0xea, 0xd3, 0xc7, 0xcc, 0x30, 0x3f, 0x03, 0xc3, 0x11, 0x71, 0xe2, 0xc0, 0x17, 0x03, 0xad, + 0x3e, 0x07, 0x66, 0xa5, 0x58, 0x40, 0xed, 0x3f, 0x2b, 0x67, 0x07, 0x7b, 0x91, 0x9f, 0x87, 0x05, + 0x11, 0xf2, 0x60, 0x88, 0x69, 0xd8, 0x5c, 0x34, 0x5c, 0x3b, 0xda, 0x32, 0xa2, 0x12, 0x59, 0x91, + 0xae, 0x96, 0xe9, 0x57, 0xa3, 0x45, 0x98, 0xb1, 0x40, 0xbb, 0x50, 0x76, 0xa5, 0xe2, 0x5b, 0xc8, + 0xe3, 0x88, 0x48, 0xa8, 0xbd, 0x9a, 0xe3, 0x18, 0x15, 0x9d, 0x4a, 0x5b, 0x56, 0xdc, 0x10, 0x81, + 0x62, 0xc3, 0x4b, 0xc4, 0x67, 0x3d, 0xa2, 0x69, 0xb3, 0xe8, 0x19, 0x5d, 0x1c, 0xa1, 0xf2, 0x7c, + 0xd1, 0x4b, 0x30, 0xa5, 0x8f, 0xbe, 0x6a, 0xc1, 0x68, 0xec, 0xb6, 0xd6, 0xa2, 0x60, 0xc7, 0xab, + 0x91, 0x48, 0x28, 0x36, 0x47, 0x14, 0x4d, 0xeb, 0xf3, 0x2b, 0x92, 0xa0, 0xe6, 0xcb, 0x4d, 0x4d, + 0x0d, 0xc1, 0x26, 0x5f, 0xaa, 0xf0, 0x3f, 0x26, 0xfa, 0xbe, 0x40, 0x5c, 0x8f, 0x6e, 0x45, 0xd2, + 0xbe, 0x61, 0x33, 0xe5, 0xc8, 0x8a, 0xde, 0x42, 0xdb, 0xdd, 0xa6, 0xeb, 0x4d, 0x37, 0xe8, 0x89, + 0xbb, 0x7b, 0xd3, 0x8f, 0xcd, 0xf7, 0xe6, 0x89, 0xfb, 0x35, 0x86, 0x0d, 0x58, 0xd8, 0x6e, 0x36, + 0x31, 0x79, 0xb3, 0x4d, 0xd8, 0xe9, 0x45, 0x0e, 0x03, 0xb6, 0xa6, 0x09, 0x66, 0x06, 0xcc, 0x80, + 0x60, 0x93, 0x2f, 0x7a, 0x13, 0x86, 0x5b, 0x4e, 0x12, 0x79, 0xbb, 0xe2, 0xc8, 0xe2, 0x88, 0xaa, + 0xf7, 0x0a, 0xa3, 0xa5, 0x99, 0xb3, 0x9d, 0x9a, 0x17, 0x62, 0xc1, 0x08, 0xb5, 0xa0, 0xd4, 0x22, + 0x51, 0x83, 0x4c, 0x95, 0xf3, 0x38, 0x9e, 0x5d, 0xa1, 0xa4, 0x34, 0xc3, 0x0a, 0x55, 0x54, 0x58, + 0x19, 0xe6, 0x5c, 0xd0, 0x1b, 0x50, 0x8e, 0x49, 0x93, 0xb8, 0x54, 0xd5, 0xa8, 0x30, 0x8e, 0x1f, + 0x1b, 0x50, 0xed, 0x72, 0x36, 0x49, 0x73, 0x5d, 0x54, 0xe5, 0x0b, 0x4c, 0xfe, 0xc3, 0x8a, 0xa4, + 0xfd, 0x5f, 0x2c, 0x40, 0x69, 0x09, 0xf3, 0x00, 0x94, 0xbd, 0x37, 0xd3, 0xca, 0xde, 0x72, 0x9e, + 0x2a, 0x40, 0x1f, 0x7d, 0xef, 0xbd, 0x32, 0x64, 0x64, 0xf3, 0x75, 0x12, 0x27, 0xa4, 0xf6, 0x81, + 0x3c, 0xfd, 0x40, 0x9e, 0x7e, 0x20, 0x4f, 0x95, 0x3c, 0xdd, 0xcc, 0xc8, 0xd3, 0x57, 0x8c, 0x55, + 0xaf, 0x2f, 0x1b, 0x3f, 0xab, 0x6e, 0x23, 0xcd, 0x16, 0x18, 0x08, 0x54, 0x12, 0x5c, 0x5d, 0x5f, + 0xbd, 0xde, 0x53, 0x80, 0x7e, 0x36, 0x2d, 0x40, 0x8f, 0xca, 0xe2, 0x81, 0x8b, 0xcc, 0xbf, 0x55, + 0x80, 0xc7, 0xd3, 0xa2, 0x04, 0x07, 0xcd, 0x66, 0xd0, 0x4e, 0xa8, 0x96, 0x8c, 0x7e, 0xcd, 0x82, + 0x93, 0xad, 0xb4, 0x35, 0x19, 0x8b, 0x43, 0xbb, 0x4f, 0xe5, 0x26, 0xe7, 0x32, 0xe6, 0x6a, 0x75, + 0x4a, 0xc8, 0xbc, 0x93, 0x19, 0x40, 0x8c, 0xbb, 0xda, 0x82, 0xde, 0x80, 0x4a, 0xcb, 0xd9, 0xbd, + 0x11, 0xd6, 0x9c, 0x44, 0x1a, 0x28, 0xfd, 0xed, 0xca, 0x76, 0xe2, 0x35, 0x67, 0xf8, 0x55, 0xec, + 0xcc, 0x92, 0x9f, 0xac, 0x46, 0xeb, 0x49, 0xe4, 0xf9, 0x0d, 0x7e, 0x54, 0xb3, 0x22, 0xc9, 0x60, + 0x4d, 0xd1, 0xfe, 0x3b, 0x56, 0x56, 0xd0, 0xaa, 0xd1, 0x89, 0x9c, 0x84, 0x34, 0x3a, 0xe8, 0xf3, + 0x50, 0xa2, 0x96, 0x84, 0x1c, 0x95, 0x5b, 0x79, 0x4a, 0x7f, 0xe3, 0x4b, 0xe8, 0x8d, 0x80, 0xfe, + 0x8b, 0x31, 0x67, 0x6a, 0xdf, 0x1d, 0xca, 0x6e, 0x78, 0xec, 0x62, 0xee, 0x22, 0x40, 0x23, 0xd8, + 0x20, 0xad, 0xb0, 0x49, 0x87, 0xc5, 0x62, 0xa7, 0xbb, 0xca, 0x78, 0x5e, 0x54, 0x10, 0x6c, 0x60, + 0xa1, 0xbf, 0x66, 0x01, 0x34, 0xe4, 0xc2, 0x92, 0x9b, 0xd9, 0x8d, 0x3c, 0xbb, 0xa3, 0x97, 0xad, + 0x6e, 0x8b, 0x62, 0x88, 0x0d, 0xe6, 0xe8, 0xcb, 0x16, 0x94, 0x13, 0xd9, 0x7c, 0x2e, 0xde, 0x37, + 0xf2, 0x6c, 0x89, 0xec, 0xb4, 0xde, 0xd7, 0xd5, 0x90, 0x28, 0xbe, 0xe8, 0x97, 0x2c, 0x80, 0xb8, + 0xe3, 0xbb, 0x6b, 0x41, 0xd3, 0x73, 0x3b, 0x42, 0xea, 0xdf, 0xcc, 0xd5, 0xc0, 0x57, 0xd4, 0xab, + 0x13, 0x74, 0x34, 0xf4, 0x7f, 0x6c, 0x70, 0x46, 0x5f, 0x80, 0x72, 0x2c, 0xa6, 0x9b, 0x90, 0xf3, + 0x1b, 0xf9, 0x1e, 0x33, 0x70, 0xda, 0x42, 0x44, 0x88, 0x7f, 0x58, 0xf1, 0xb4, 0xbf, 0x57, 0x48, + 0x9d, 0x57, 0xaa, 0x93, 0x09, 0x36, 0x65, 0x5c, 0x69, 0x14, 0xca, 0x15, 0x90, 0xeb, 0x94, 0x51, + 0x26, 0xa7, 0x9e, 0x32, 0xaa, 0x28, 0xc6, 0x06, 0x73, 0xba, 0x39, 0x4e, 0x3a, 0xd9, 0xf3, 0x0f, + 0x31, 0x8b, 0xdf, 0xc8, 0xb3, 0x49, 0xdd, 0xa7, 0xcb, 0x8f, 0x8b, 0xa6, 0x4d, 0x76, 0x81, 0x70, + 0x77, 0x93, 0xec, 0xef, 0xa5, 0xcf, 0x48, 0x8d, 0x0f, 0x30, 0xc0, 0xf9, 0xef, 0xb7, 0x2c, 0x18, + 0x8d, 0x82, 0x66, 0xd3, 0xf3, 0x1b, 0x74, 0xb2, 0x08, 0x89, 0xf7, 0xfa, 0xb1, 0x08, 0x1d, 0x31, + 0x2b, 0xd8, 0x16, 0x8b, 0x35, 0x4f, 0x6c, 0x36, 0xc0, 0xfe, 0x53, 0x0b, 0xa6, 0xfa, 0x4d, 0x6a, + 0x44, 0xe0, 0x09, 0x2a, 0xa9, 0xe9, 0xc6, 0xa7, 0x6e, 0x3f, 0x57, 0xfd, 0x05, 0xd2, 0x24, 0xea, + 0x34, 0xaa, 0x5c, 0x7d, 0x5a, 0x74, 0xf3, 0x89, 0xb5, 0xfe, 0xa8, 0xf8, 0x7e, 0x74, 0xd0, 0x6b, + 0x70, 0xd2, 0xe8, 0x57, 0xac, 0x06, 0xa6, 0x52, 0x9d, 0xa1, 0xbb, 0xc8, 0x5c, 0x06, 0x76, 0x6f, + 0x6f, 0xfa, 0x6c, 0xb6, 0x4c, 0xac, 0xba, 0x2e, 0x3a, 0xf6, 0x6f, 0x16, 0xb2, 0x5f, 0x4b, 0x09, + 0xcc, 0xef, 0x58, 0x5d, 0x66, 0xc5, 0xa7, 0x8e, 0x43, 0x48, 0x31, 0x03, 0x44, 0x5d, 0xb0, 0xf6, + 0xc7, 0x79, 0x88, 0x37, 0x38, 0xf6, 0xbf, 0x1b, 0x82, 0xfb, 0xb4, 0x4c, 0x9d, 0xd1, 0x5b, 0xfd, + 0xce, 0xe8, 0x0f, 0x7e, 0xec, 0xff, 0x0d, 0x0b, 0x86, 0x9b, 0x54, 0xc3, 0xe1, 0xe7, 0xd0, 0xa3, + 0x17, 0x6b, 0xc7, 0x35, 0xf6, 0x5c, 0x91, 0x8a, 0xf9, 0x2d, 0xa2, 0x3a, 0xdb, 0xe2, 0x85, 0x58, + 0xb4, 0x01, 0x7d, 0xd7, 0x82, 0x51, 0xc7, 0xf7, 0x83, 0x44, 0xb8, 0xb5, 0x70, 0xb7, 0x10, 0xef, + 0xd8, 0xda, 0x34, 0xa7, 0x79, 0xf1, 0x86, 0xe9, 0x43, 0x5d, 0x0d, 0xc1, 0x66, 0x93, 0xd0, 0x0c, + 0x40, 0xdd, 0xf3, 0x9d, 0xa6, 0xf7, 0x16, 0xb5, 0xd4, 0x4a, 0xec, 0xf0, 0x9e, 0x6d, 0x3b, 0x97, + 0x55, 0x29, 0x36, 0x30, 0xce, 0xfd, 0x55, 0x18, 0x35, 0x7a, 0xde, 0xe3, 0xf2, 0xf3, 0xb4, 0x79, + 0xf9, 0x59, 0x31, 0xee, 0x2c, 0xcf, 0xbd, 0x02, 0x27, 0xb3, 0x0d, 0x3c, 0x48, 0x7d, 0xfb, 0xb7, + 0x86, 0xb3, 0x47, 0xdb, 0x1b, 0x24, 0x6a, 0xd1, 0xa6, 0x7d, 0x60, 0xe1, 0x7e, 0x60, 0xe1, 0x7e, + 0x60, 0xe1, 0xca, 0x3f, 0xf6, 0xdd, 0x12, 0xa4, 0xb4, 0x0e, 0xde, 0xba, 0x8f, 0xc0, 0x48, 0x44, + 0xc2, 0xe0, 0x06, 0x5e, 0x16, 0x12, 0x57, 0xbb, 0x83, 0xf2, 0x62, 0x2c, 0xe1, 0x54, 0x32, 0x87, + 0x4e, 0xb2, 0x25, 0x44, 0xae, 0x92, 0xcc, 0x6b, 0x4e, 0xb2, 0x85, 0x19, 0x04, 0xbd, 0x02, 0x13, + 0x89, 0x13, 0x35, 0x48, 0x82, 0xc9, 0x0e, 0x1b, 0x04, 0x71, 0x5d, 0x70, 0x56, 0xe0, 0x4e, 0x6c, + 0xa4, 0xa0, 0x38, 0x83, 0x8d, 0xde, 0x84, 0xa1, 0x2d, 0xd2, 0x6c, 0x09, 0x13, 0x7c, 0x3d, 0x3f, + 0x89, 0xc8, 0xfa, 0x7a, 0x85, 0x34, 0x5b, 0x7c, 0xbd, 0xd2, 0x5f, 0x98, 0xb1, 0xa2, 0x5f, 0xa7, + 0xb2, 0xdd, 0x8e, 0x93, 0xa0, 0xe5, 0xbd, 0x25, 0x0d, 0xf3, 0x4f, 0xe5, 0xcc, 0xf8, 0x9a, 0xa4, + 0xcf, 0xad, 0x47, 0xf5, 0x17, 0x6b, 0xce, 0xac, 0x1d, 0x35, 0x2f, 0x62, 0x86, 0x76, 0x67, 0x0a, + 0x8e, 0xa5, 0x1d, 0x0b, 0x92, 0x3e, 0x6f, 0x87, 0xfa, 0x8b, 0x35, 0x67, 0xd4, 0x81, 0xe1, 0xb0, + 0xd9, 0x6e, 0x78, 0xfe, 0xd4, 0x28, 0x6b, 0xc3, 0x8d, 0x9c, 0xdb, 0xb0, 0xc6, 0x88, 0xf3, 0xe3, + 0x11, 0xfe, 0x1b, 0x0b, 0x86, 0xe8, 0x69, 0x28, 0xb9, 0x5b, 0x4e, 0x94, 0x4c, 0x8d, 0xb1, 0x49, + 0xa3, 0xac, 0xd8, 0x79, 0x5a, 0x88, 0x39, 0x0c, 0x3d, 0x05, 0xc5, 0x88, 0xd4, 0x99, 0x17, 0x92, + 0x71, 0x3f, 0x8d, 0x49, 0x1d, 0xd3, 0x72, 0xfb, 0xef, 0x15, 0xd2, 0xca, 0x45, 0xba, 0xdf, 0x7c, + 0xb6, 0xbb, 0xed, 0x28, 0x96, 0x96, 0xae, 0x31, 0xdb, 0x59, 0x31, 0x96, 0x70, 0xf4, 0x25, 0x0b, + 0x46, 0x6e, 0xc7, 0x81, 0xef, 0x93, 0x44, 0x08, 0xf2, 0x9b, 0x39, 0x0f, 0xc5, 0x55, 0x4e, 0x5d, + 0xb7, 0x41, 0x14, 0x60, 0xc9, 0x97, 0x36, 0x97, 0xec, 0xba, 0xcd, 0x76, 0xad, 0xeb, 0x9e, 0xf3, + 0x12, 0x2f, 0xc6, 0x12, 0x4e, 0x51, 0x3d, 0x9f, 0xa3, 0x0e, 0xa5, 0x51, 0x97, 0x7c, 0x81, 0x2a, + 0xe0, 0xf6, 0xef, 0x94, 0xe0, 0x4c, 0xcf, 0xc5, 0x41, 0xb7, 0x7d, 0xb6, 0xb1, 0x5e, 0xf6, 0x9a, + 0x44, 0xfa, 0xe8, 0xb2, 0x6d, 0xff, 0xa6, 0x2a, 0xc5, 0x06, 0x06, 0xfa, 0x05, 0x80, 0xd0, 0x89, + 0x9c, 0x16, 0x11, 0xdb, 0x5d, 0xf1, 0xe8, 0xbb, 0x2b, 0x6d, 0xc7, 0x9a, 0xa4, 0xa9, 0x2d, 0x39, + 0x55, 0x14, 0x63, 0x83, 0x25, 0xfa, 0x38, 0x8c, 0x46, 0xa4, 0x49, 0x9c, 0x98, 0x39, 0xb1, 0x65, + 0x3d, 0x72, 0xb1, 0x06, 0x61, 0x13, 0x0f, 0x3d, 0xa3, 0xfc, 0x12, 0x32, 0x97, 0xc2, 0x69, 0xdf, + 0x04, 0xf4, 0xb6, 0x05, 0x13, 0x75, 0xaf, 0x49, 0x34, 0x77, 0xe1, 0x3f, 0xbb, 0x7a, 0xf4, 0x4e, + 0x5e, 0x36, 0xe9, 0x6a, 0x09, 0x99, 0x2a, 0x8e, 0x71, 0x86, 0x3d, 0xfd, 0xcc, 0x3b, 0x24, 0x62, + 0xa2, 0x75, 0x38, 0xfd, 0x99, 0x6f, 0xf2, 0x62, 0x2c, 0xe1, 0x68, 0x0e, 0x4e, 0x84, 0x4e, 0x1c, + 0xcf, 0x47, 0xa4, 0x46, 0xfc, 0xc4, 0x73, 0x9a, 0xdc, 0xbb, 0xb5, 0xac, 0xbd, 0xdb, 0xd6, 0xd2, + 0x60, 0x9c, 0xc5, 0x47, 0x9f, 0x86, 0xc7, 0xbc, 0x86, 0x1f, 0x44, 0x64, 0xc5, 0x8b, 0x63, 0xcf, + 0x6f, 0xe8, 0x69, 0xc0, 0x24, 0x65, 0xb9, 0x3a, 0x2d, 0x48, 0x3d, 0xb6, 0xd4, 0x1b, 0x0d, 0xf7, + 0xab, 0x8f, 0x9e, 0x83, 0x72, 0xbc, 0xed, 0x85, 0xf3, 0x51, 0x2d, 0x66, 0x47, 0x95, 0x65, 0x7d, + 0xbe, 0xb2, 0x2e, 0xca, 0xb1, 0xc2, 0xb0, 0x7f, 0xb5, 0x90, 0x36, 0x1d, 0xcd, 0xf5, 0x83, 0x62, + 0xba, 0x4a, 0x92, 0x9b, 0x4e, 0x24, 0x8f, 0x15, 0x8e, 0xe8, 0x1f, 0x2b, 0xe8, 0xde, 0x74, 0x22, + 0x73, 0xbd, 0x31, 0x06, 0x58, 0x72, 0x42, 0xb7, 0x61, 0x28, 0x69, 0x3a, 0x39, 0x39, 0xd4, 0x1b, + 0x1c, 0xb5, 0x25, 0xbf, 0x3c, 0x17, 0x63, 0xc6, 0x03, 0x3d, 0x49, 0xd5, 0xd7, 0x4d, 0xe9, 0x44, + 0x23, 0x34, 0xce, 0xcd, 0x18, 0xb3, 0x52, 0xfb, 0x7f, 0x0e, 0xf7, 0x10, 0x79, 0x6a, 0x8f, 0x41, + 0x17, 0x01, 0xa8, 0x25, 0xb4, 0x16, 0x91, 0xba, 0xb7, 0x2b, 0xf6, 0x78, 0xb5, 0xac, 0xae, 0x2b, + 0x08, 0x36, 0xb0, 0x64, 0x9d, 0xf5, 0x76, 0x9d, 0xd6, 0x29, 0x74, 0xd7, 0xe1, 0x10, 0x6c, 0x60, + 0xa1, 0x17, 0x61, 0xd8, 0x6b, 0x39, 0x0d, 0xe5, 0xeb, 0xf3, 0x24, 0x5d, 0x4f, 0x4b, 0xac, 0xe4, + 0xde, 0xde, 0xf4, 0x84, 0x6a, 0x10, 0x2b, 0xc2, 0x02, 0x17, 0xfd, 0xa6, 0x05, 0x63, 0x6e, 0xd0, + 0x6a, 0x05, 0x3e, 0xb7, 0x1f, 0x84, 0x31, 0x74, 0xfb, 0xb8, 0x76, 0xe0, 0x99, 0x79, 0x83, 0x19, + 0xb7, 0x86, 0x94, 0xe7, 0xbf, 0x09, 0xc2, 0xa9, 0x56, 0x99, 0xcb, 0xae, 0xb4, 0xcf, 0xb2, 0xfb, + 0x67, 0x16, 0x4c, 0xf2, 0xba, 0x86, 0x59, 0x23, 0x9c, 0xdc, 0x83, 0x63, 0xee, 0x56, 0x97, 0xa5, + 0xa7, 0x8e, 0x9b, 0xba, 0xe0, 0xb8, 0xbb, 0x91, 0x68, 0x11, 0x26, 0xeb, 0x41, 0xe4, 0x12, 0x73, + 0x20, 0x84, 0xcc, 0x50, 0x84, 0x2e, 0x67, 0x11, 0x70, 0x77, 0x1d, 0x74, 0x13, 0xce, 0x1a, 0x85, + 0xe6, 0x38, 0x70, 0xb1, 0x71, 0x5e, 0x50, 0x3b, 0x7b, 0xb9, 0x27, 0x16, 0xee, 0x53, 0xfb, 0xdc, + 0x27, 0x61, 0xb2, 0xeb, 0xfb, 0x1d, 0xc8, 0xd8, 0x5c, 0x80, 0xb3, 0xbd, 0x47, 0xea, 0x40, 0x26, + 0xe7, 0x3f, 0xc9, 0x78, 0x02, 0x19, 0x8a, 0xcd, 0x00, 0xc7, 0x17, 0x0e, 0x14, 0x89, 0xbf, 0x23, + 0x04, 0xc7, 0xe5, 0xa3, 0xcd, 0x88, 0x4b, 0xfe, 0x0e, 0xff, 0xd0, 0xcc, 0x46, 0xbb, 0xe4, 0xef, + 0x60, 0x4a, 0x1b, 0xbd, 0x63, 0xa5, 0x36, 0x66, 0x7e, 0xe8, 0xf1, 0x99, 0x63, 0xd1, 0xe4, 0x06, + 0xde, 0xab, 0xed, 0xef, 0x15, 0xe0, 0xc2, 0x7e, 0x44, 0x06, 0x18, 0xbe, 0xa7, 0x61, 0x38, 0x66, + 0x57, 0x31, 0x62, 0x25, 0x8e, 0xd2, 0x55, 0xc8, 0x2f, 0x67, 0x3e, 0x8b, 0x05, 0x08, 0xfd, 0x92, + 0x05, 0xc5, 0x96, 0x13, 0x8a, 0x9e, 0x37, 0x8e, 0xb7, 0xe7, 0x33, 0x2b, 0x4e, 0xc8, 0xbf, 0x82, + 0xd2, 0x47, 0x57, 0x9c, 0x10, 0xd3, 0x06, 0xa0, 0x69, 0x28, 0x39, 0x51, 0xe4, 0x74, 0x98, 0x5c, + 0xab, 0xf0, 0x2b, 0xbb, 0x39, 0x5a, 0x80, 0x79, 0xf9, 0xb9, 0x4f, 0x40, 0x59, 0x56, 0x3f, 0xd0, + 0x1c, 0xfc, 0xc6, 0x48, 0xca, 0x51, 0x95, 0x5d, 0xe5, 0xc4, 0x30, 0x2c, 0x0c, 0x60, 0x2b, 0x6f, + 0xdf, 0x68, 0x1e, 0x69, 0xc0, 0xb4, 0x76, 0x11, 0xaf, 0x25, 0x58, 0xa1, 0xaf, 0x5b, 0x2c, 0x2a, + 0x4a, 0x3a, 0xef, 0x0a, 0x5d, 0xf9, 0x78, 0x82, 0xb4, 0xcc, 0x58, 0x2b, 0x59, 0x88, 0x4d, 0xee, + 0x54, 0x50, 0x87, 0xdc, 0xbf, 0x3f, 0xab, 0x31, 0xcb, 0xb8, 0x29, 0x09, 0x47, 0xbb, 0x3d, 0xae, + 0x6c, 0x72, 0x88, 0xac, 0x19, 0xe0, 0x92, 0xe6, 0xbb, 0x16, 0x4c, 0x72, 0xbd, 0x68, 0xc1, 0xab, + 0xd7, 0x49, 0x44, 0x7c, 0x97, 0x48, 0xcd, 0xf2, 0x88, 0x97, 0x82, 0xf2, 0xd4, 0x61, 0x29, 0x4b, + 0x5e, 0x4b, 0xf0, 0x2e, 0x10, 0xee, 0x6e, 0x0c, 0xaa, 0xc1, 0x90, 0xe7, 0xd7, 0x03, 0xb1, 0x6f, + 0x55, 0x8f, 0xd6, 0xa8, 0x25, 0xbf, 0x1e, 0xe8, 0xb5, 0x4c, 0xff, 0x61, 0x46, 0x1d, 0x2d, 0xc3, + 0xe9, 0x48, 0xd8, 0xfe, 0x57, 0xbc, 0x98, 0x5a, 0x68, 0xcb, 0x5e, 0xcb, 0x4b, 0xd8, 0x9e, 0x53, + 0xac, 0x4e, 0xdd, 0xdd, 0x9b, 0x3e, 0x8d, 0x7b, 0xc0, 0x71, 0xcf, 0x5a, 0xe8, 0x2d, 0x18, 0x91, + 0x61, 0x5c, 0xe5, 0x3c, 0xb4, 0xf4, 0xee, 0xf9, 0xaf, 0x26, 0xd3, 0xba, 0x88, 0xd8, 0x92, 0x0c, + 0xed, 0x7f, 0x0d, 0xd0, 0x7d, 0xa5, 0x83, 0x7e, 0x1e, 0x2a, 0x91, 0x0a, 0x2d, 0xb3, 0xf2, 0x70, + 0xf9, 0x91, 0xdf, 0x57, 0x5c, 0x27, 0xa9, 0x73, 0x6f, 0x1d, 0x44, 0xa6, 0x39, 0x52, 0x1d, 0x35, + 0xd6, 0x37, 0x3f, 0x39, 0xcc, 0x6d, 0xc1, 0x55, 0x9f, 0xea, 0x77, 0x7c, 0x17, 0x33, 0x1e, 0x28, + 0x82, 0xe1, 0x2d, 0xe2, 0x34, 0x93, 0xad, 0x7c, 0x0e, 0x20, 0xaf, 0x30, 0x5a, 0x59, 0xaf, 0x66, + 0x5e, 0x8a, 0x05, 0x27, 0xb4, 0x0b, 0x23, 0x5b, 0x7c, 0x02, 0x08, 0xb5, 0x71, 0xe5, 0xa8, 0x83, + 0x9b, 0x9a, 0x55, 0xfa, 0x73, 0x8b, 0x02, 0x2c, 0xd9, 0xb1, 0xfb, 0x5e, 0xe3, 0x36, 0x93, 0x2f, + 0xdd, 0xfc, 0x1c, 0xba, 0x07, 0xbf, 0xca, 0xfc, 0x1c, 0x8c, 0x45, 0xc4, 0x0d, 0x7c, 0xd7, 0x6b, + 0x92, 0xda, 0x9c, 0x3c, 0x5c, 0x3c, 0x88, 0x1b, 0xf0, 0x49, 0xaa, 0xfa, 0x62, 0x83, 0x06, 0x4e, + 0x51, 0x44, 0x5f, 0xb3, 0x60, 0x42, 0xc5, 0xa3, 0xd0, 0x0f, 0x42, 0xc4, 0xf1, 0xdc, 0x72, 0x4e, + 0xd1, 0x2f, 0x8c, 0x66, 0x15, 0x51, 0xe3, 0x37, 0x5d, 0x86, 0x33, 0x7c, 0xd1, 0x6b, 0x00, 0xc1, + 0x26, 0xbb, 0xda, 0xa3, 0x5d, 0x2d, 0x1f, 0xb8, 0xab, 0x13, 0x3c, 0x1e, 0x40, 0x52, 0xc0, 0x06, + 0x35, 0x74, 0x0d, 0x80, 0x2f, 0x9b, 0x8d, 0x4e, 0x48, 0x98, 0x45, 0xaa, 0xfd, 0xb8, 0x61, 0x5d, + 0x41, 0xee, 0xed, 0x4d, 0x77, 0x9f, 0x9d, 0xb0, 0x4b, 0x57, 0xa3, 0x3a, 0xfa, 0x39, 0x18, 0x89, + 0xdb, 0xad, 0x96, 0xa3, 0x4e, 0xf2, 0x72, 0x8c, 0x30, 0xe0, 0x74, 0x0d, 0x51, 0xc4, 0x0b, 0xb0, + 0xe4, 0x88, 0x6e, 0x53, 0xa1, 0x1a, 0x8b, 0x43, 0x1d, 0xb6, 0x8a, 0xb8, 0x4e, 0x30, 0xca, 0xfa, + 0xf4, 0x09, 0x51, 0xef, 0x34, 0xee, 0x81, 0x73, 0x6f, 0x6f, 0xfa, 0x6c, 0xba, 0x7c, 0x39, 0x10, + 0x3e, 0xff, 0x3d, 0x69, 0xa2, 0xab, 0x32, 0xaa, 0x9b, 0x76, 0x5b, 0x06, 0x1b, 0x3e, 0xab, 0xa3, + 0xba, 0x59, 0x71, 0xff, 0x31, 0x33, 0x2b, 0xdb, 0x7e, 0xda, 0x3d, 0x45, 0xf4, 0xe6, 0x45, 0x18, + 0x23, 0xbb, 0x09, 0x89, 0x7c, 0xa7, 0x79, 0x03, 0x2f, 0xcb, 0x43, 0x29, 0x36, 0x69, 0x2f, 0x19, + 0xe5, 0x38, 0x85, 0x85, 0x6c, 0x65, 0x8c, 0x16, 0x74, 0xe0, 0x09, 0x37, 0x46, 0xa5, 0xe9, 0x69, + 0xff, 0xbf, 0x42, 0x4a, 0x83, 0xda, 0x88, 0x08, 0x41, 0x01, 0x94, 0xfc, 0xa0, 0xa6, 0x84, 0xf5, + 0xd5, 0x7c, 0x84, 0xf5, 0xf5, 0xa0, 0x66, 0xc4, 0x6a, 0xd3, 0x7f, 0x31, 0xe6, 0x7c, 0x58, 0x30, + 0xab, 0x8c, 0xfa, 0x65, 0x00, 0x61, 0x17, 0xe4, 0xc9, 0x59, 0x05, 0xb3, 0xae, 0x9a, 0x8c, 0x70, + 0x9a, 0x2f, 0xda, 0x86, 0xd2, 0x56, 0x10, 0x27, 0xd2, 0x5a, 0x38, 0xa2, 0x61, 0x72, 0x25, 0x88, + 0x13, 0xb6, 0xed, 0xab, 0x6e, 0xd3, 0x92, 0x18, 0x73, 0x1e, 0xf6, 0x7f, 0xb5, 0x52, 0x47, 0x90, + 0xb7, 0x98, 0xab, 0xd6, 0x0e, 0xf1, 0xe9, 0x3a, 0x34, 0xfd, 0x1a, 0xfe, 0x4a, 0x26, 0x92, 0xe2, + 0xc3, 0xfd, 0x32, 0x67, 0xdc, 0xa1, 0x14, 0x66, 0x18, 0x09, 0xc3, 0x05, 0xe2, 0x8b, 0x56, 0x3a, + 0xa6, 0x85, 0x6f, 0x84, 0x39, 0x86, 0x58, 0xed, 0x1b, 0x1e, 0x63, 0xbf, 0x63, 0xc1, 0x48, 0xd5, + 0x71, 0xb7, 0x83, 0x7a, 0x1d, 0x3d, 0x07, 0xe5, 0x5a, 0x3b, 0x32, 0xc3, 0x6b, 0xd4, 0x99, 0xd7, + 0x82, 0x28, 0xc7, 0x0a, 0x83, 0xce, 0xe1, 0xba, 0xe3, 0xca, 0x40, 0xab, 0x22, 0x9f, 0xc3, 0x97, + 0x59, 0x09, 0x16, 0x10, 0xf4, 0x71, 0x18, 0x6d, 0x39, 0xbb, 0xb2, 0x72, 0xf6, 0xfc, 0x73, 0x45, + 0x83, 0xb0, 0x89, 0x67, 0xff, 0x1b, 0x0b, 0xa6, 0xaa, 0x4e, 0xec, 0xb9, 0x73, 0xed, 0x64, 0xab, + 0xea, 0x25, 0x9b, 0x6d, 0x77, 0x9b, 0x24, 0x3c, 0xba, 0x8e, 0xb6, 0xb2, 0x1d, 0xd3, 0xa5, 0xa4, + 0xcc, 0x30, 0xd5, 0xca, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x16, 0x8c, 0x86, 0x4e, 0x1c, 0xdf, + 0x09, 0xa2, 0x1a, 0x26, 0xf5, 0x7c, 0x62, 0x5b, 0xd7, 0x89, 0x1b, 0x91, 0x04, 0x93, 0xba, 0xb8, + 0xd1, 0xd2, 0xf4, 0xb1, 0xc9, 0xcc, 0xfe, 0xdd, 0x0a, 0x8c, 0x88, 0xeb, 0xb8, 0x81, 0x63, 0x06, + 0xa5, 0x81, 0x59, 0xe8, 0x6b, 0x60, 0xc6, 0x30, 0xec, 0xb2, 0x0c, 0x2b, 0x42, 0x93, 0xb9, 0x96, + 0xcb, 0xfd, 0x2d, 0x4f, 0xda, 0xa2, 0x9b, 0xc5, 0xff, 0x63, 0xc1, 0x0a, 0x7d, 0xdb, 0x82, 0x13, + 0x6e, 0xe0, 0xfb, 0xc4, 0xd5, 0xdb, 0xec, 0x50, 0x1e, 0x1e, 0x19, 0xf3, 0x69, 0xa2, 0xfa, 0xf0, + 0x37, 0x03, 0xc0, 0x59, 0xf6, 0xe8, 0x65, 0x18, 0xe7, 0x63, 0x76, 0x33, 0x75, 0xf2, 0xa5, 0x43, + 0xe3, 0x4d, 0x20, 0x4e, 0xe3, 0xa2, 0x19, 0x7e, 0x82, 0x28, 0x82, 0xd0, 0x87, 0xf5, 0x4d, 0x82, + 0x11, 0x7e, 0x6e, 0x60, 0xa0, 0x08, 0x50, 0x44, 0xea, 0x11, 0x89, 0xb7, 0xc4, 0x75, 0x25, 0xdb, + 0xe2, 0x47, 0x0e, 0x17, 0xd4, 0x84, 0xbb, 0x28, 0xe1, 0x1e, 0xd4, 0xd1, 0xb6, 0xb0, 0x71, 0xca, + 0x79, 0x48, 0x05, 0xf1, 0x99, 0xfb, 0x9a, 0x3a, 0xd3, 0x50, 0x8a, 0xb7, 0x9c, 0xa8, 0xc6, 0x54, + 0x8b, 0x22, 0x3f, 0x08, 0x58, 0xa7, 0x05, 0x98, 0x97, 0xa3, 0x05, 0x38, 0x99, 0x09, 0xec, 0x8f, + 0x99, 0xf2, 0x50, 0xd6, 0x3e, 0xae, 0x99, 0x94, 0x00, 0x31, 0xee, 0xaa, 0x61, 0xda, 0xbf, 0xa3, + 0xfb, 0xd8, 0xbf, 0x1d, 0xe5, 0x14, 0x33, 0xc6, 0x24, 0xfe, 0xab, 0xb9, 0x0c, 0xc0, 0x40, 0x1e, + 0x30, 0xdf, 0xcc, 0x78, 0xc0, 0x8c, 0xb3, 0x06, 0xdc, 0xcc, 0xa7, 0x01, 0x07, 0x77, 0x77, 0x79, + 0x98, 0xee, 0x2b, 0xff, 0xd7, 0x02, 0xf9, 0x5d, 0xe7, 0x1d, 0x77, 0x8b, 0xd0, 0x29, 0x83, 0x5e, + 0x81, 0x09, 0x65, 0xc5, 0xcd, 0x07, 0x6d, 0x9f, 0x7b, 0xae, 0x14, 0xf5, 0x2d, 0x11, 0x4e, 0x41, + 0x71, 0x06, 0x1b, 0xcd, 0x42, 0x85, 0x8e, 0x13, 0xaf, 0xca, 0x77, 0x0f, 0x65, 0x29, 0xce, 0xad, + 0x2d, 0x89, 0x5a, 0x1a, 0x07, 0x05, 0x30, 0xd9, 0x74, 0xe2, 0x84, 0xb5, 0x80, 0x1a, 0x75, 0x87, + 0x0c, 0x29, 0x64, 0x79, 0x4d, 0x96, 0xb3, 0x84, 0x70, 0x37, 0x6d, 0xfb, 0x07, 0x43, 0x30, 0x9e, + 0x92, 0x8c, 0x07, 0xdc, 0x76, 0x9e, 0x83, 0xb2, 0xdc, 0x09, 0xb2, 0x71, 0xc8, 0x6a, 0xbb, 0x50, + 0x18, 0x74, 0x9b, 0xdc, 0x24, 0x4e, 0x44, 0x22, 0x96, 0x32, 0x21, 0xbb, 0x4d, 0x56, 0x35, 0x08, + 0x9b, 0x78, 0x4c, 0x28, 0x27, 0xcd, 0x78, 0xbe, 0xe9, 0x11, 0x3f, 0xe1, 0xcd, 0xcc, 0x47, 0x28, + 0x6f, 0x2c, 0xaf, 0x9b, 0x44, 0xb5, 0x50, 0xce, 0x00, 0x70, 0x96, 0x3d, 0xfa, 0x8a, 0x05, 0xe3, + 0xce, 0x9d, 0x58, 0xa7, 0x01, 0x13, 0xbe, 0x2e, 0x47, 0xdc, 0xa4, 0x52, 0x99, 0xc5, 0xaa, 0x93, + 0x54, 0xbc, 0xa7, 0x8a, 0x70, 0x9a, 0x29, 0xfa, 0x8e, 0x05, 0x88, 0xec, 0x12, 0x57, 0x7a, 0xe3, + 0x88, 0xb6, 0x0c, 0xe7, 0x61, 0xec, 0x5c, 0xea, 0xa2, 0xcb, 0xa5, 0x7a, 0x77, 0x39, 0xee, 0xd1, + 0x06, 0xfb, 0x5f, 0x14, 0xd5, 0x82, 0xd2, 0x0e, 0x60, 0x8e, 0x11, 0x18, 0x61, 0x1d, 0x3e, 0x30, + 0x42, 0x5f, 0x51, 0x76, 0x05, 0x47, 0xa4, 0xfd, 0xd0, 0x0b, 0x0f, 0xc9, 0x0f, 0xfd, 0xcb, 0x56, + 0x2a, 0xe2, 0x7e, 0xf4, 0xe2, 0x6b, 0xf9, 0x3a, 0x9f, 0xcd, 0xf0, 0x0b, 0xf2, 0x8c, 0x74, 0x4f, + 0xdf, 0x9a, 0x53, 0x69, 0x6a, 0xa0, 0x1d, 0x48, 0x1a, 0xfe, 0xa7, 0x22, 0x8c, 0x1a, 0x3b, 0x69, + 0x4f, 0xb5, 0xc8, 0x7a, 0xc4, 0xd4, 0xa2, 0xc2, 0x01, 0xd4, 0xa2, 0x5f, 0x80, 0x8a, 0x2b, 0xa5, + 0x7c, 0x3e, 0x39, 0xe7, 0xb2, 0x7b, 0x87, 0x16, 0xf4, 0xaa, 0x08, 0x6b, 0x9e, 0x68, 0x31, 0xe5, + 0xf9, 0x2e, 0x76, 0x88, 0x21, 0xb6, 0x43, 0xf4, 0x72, 0x4d, 0x17, 0x3b, 0x45, 0x77, 0x1d, 0xf4, + 0x02, 0xb5, 0xac, 0x3c, 0xd1, 0x2f, 0xe9, 0x22, 0xca, 0xd4, 0xf5, 0xb9, 0xb5, 0x25, 0x59, 0x8c, + 0x4d, 0x1c, 0xfb, 0x07, 0x96, 0xfa, 0xb8, 0x0f, 0x20, 0xd4, 0xf2, 0x76, 0x3a, 0xd4, 0xf2, 0x52, + 0x2e, 0xc3, 0xdc, 0x27, 0xc6, 0xf2, 0x3a, 0x8c, 0xcc, 0x07, 0xad, 0x96, 0xe3, 0xd7, 0xd0, 0x4f, + 0xc0, 0x88, 0xcb, 0x7f, 0x8a, 0xa3, 0x0a, 0x76, 0x3f, 0x25, 0xa0, 0x58, 0xc2, 0xd0, 0x93, 0x30, + 0xe4, 0x44, 0x0d, 0x79, 0x3c, 0xc1, 0xae, 0xf4, 0xe7, 0xa2, 0x46, 0x8c, 0x59, 0xa9, 0xfd, 0x76, + 0x11, 0x60, 0x3e, 0x68, 0x85, 0x4e, 0x44, 0x6a, 0x1b, 0x01, 0xcb, 0x79, 0x73, 0xac, 0xf7, 0x3a, + 0xda, 0x58, 0x7a, 0x94, 0xef, 0x76, 0x8c, 0xf3, 0xfd, 0xe2, 0x83, 0x3e, 0xdf, 0xff, 0x86, 0x05, + 0x88, 0x7e, 0x91, 0xc0, 0x27, 0x7e, 0xa2, 0xaf, 0x2b, 0x67, 0xa1, 0xe2, 0xca, 0x52, 0xa1, 0xb5, + 0xe8, 0xf5, 0x27, 0x01, 0x58, 0xe3, 0x0c, 0x60, 0x7e, 0x3e, 0x2d, 0x85, 0x63, 0x31, 0xed, 0x05, + 0xc7, 0x44, 0xaa, 0x90, 0x95, 0xf6, 0xef, 0x15, 0xe0, 0x2c, 0xdf, 0xef, 0x56, 0x1c, 0xdf, 0x69, + 0x90, 0x16, 0x6d, 0xd5, 0xa0, 0x17, 0xd0, 0x2e, 0xb5, 0x7b, 0x3c, 0xe9, 0xd5, 0x76, 0xd4, 0x85, + 0xc1, 0x27, 0x34, 0x9f, 0xc2, 0x4b, 0xbe, 0x97, 0x60, 0x46, 0x1c, 0xc5, 0x50, 0x96, 0x19, 0x4c, + 0x85, 0xa0, 0xcb, 0x89, 0x91, 0x5a, 0xf3, 0x62, 0x53, 0x22, 0x58, 0x31, 0xa2, 0x5a, 0x61, 0x33, + 0x70, 0xb7, 0x31, 0x09, 0x03, 0x26, 0xd4, 0x0c, 0xa7, 0xa2, 0x65, 0x51, 0x8e, 0x15, 0x86, 0xfd, + 0x7b, 0x16, 0x64, 0xc5, 0xbd, 0x91, 0x2e, 0xc4, 0xba, 0x6f, 0xba, 0x90, 0x03, 0xe4, 0xeb, 0xf8, + 0x59, 0x18, 0x75, 0x12, 0xba, 0x43, 0x73, 0x9b, 0xb6, 0x78, 0xb8, 0x63, 0xeb, 0x95, 0xa0, 0xe6, + 0xd5, 0x3d, 0x66, 0xcb, 0x9a, 0xe4, 0xec, 0xff, 0x3d, 0x04, 0x93, 0x5d, 0x9e, 0xca, 0xe8, 0x25, + 0x18, 0x73, 0xc5, 0xf4, 0x08, 0x31, 0xa9, 0x8b, 0xce, 0x18, 0x9e, 0x2e, 0x1a, 0x86, 0x53, 0x98, + 0x03, 0x4c, 0xd0, 0x25, 0x38, 0x15, 0x51, 0x2b, 0xba, 0x4d, 0xe6, 0xea, 0x09, 0x89, 0xd6, 0x89, + 0x1b, 0xf8, 0x35, 0x9e, 0xd4, 0xa6, 0x58, 0x7d, 0xec, 0xee, 0xde, 0xf4, 0x29, 0xdc, 0x0d, 0xc6, + 0xbd, 0xea, 0xa0, 0x10, 0xc6, 0x9b, 0xa6, 0x82, 0x25, 0xb4, 0xeb, 0x43, 0xe9, 0x66, 0x6a, 0x03, + 0x4e, 0x15, 0xe3, 0x34, 0x83, 0xb4, 0x96, 0x56, 0x7a, 0x48, 0x5a, 0xda, 0x2f, 0x6a, 0x2d, 0x8d, + 0xdf, 0xaf, 0xbe, 0x9e, 0xb3, 0xa7, 0xfa, 0x71, 0xab, 0x69, 0xaf, 0x42, 0x59, 0x7a, 0x9e, 0x0c, + 0xe4, 0xb1, 0x61, 0xd2, 0xe9, 0x23, 0xd1, 0xee, 0x15, 0xa0, 0x87, 0x86, 0x4f, 0xd7, 0x99, 0xde, + 0x4e, 0x53, 0xeb, 0xec, 0x60, 0x5b, 0x2a, 0xda, 0xe5, 0x5e, 0x37, 0x7c, 0xe3, 0xf8, 0x74, 0xde, + 0x16, 0x8a, 0x76, 0xc4, 0x51, 0x2e, 0x20, 0xca, 0x19, 0xe7, 0x22, 0x80, 0xd6, 0x82, 0x84, 0xc3, + 0xa9, 0xba, 0xd6, 0xd3, 0xca, 0x12, 0x36, 0xb0, 0xa8, 0xc1, 0xea, 0xf9, 0x71, 0xe2, 0x34, 0x9b, + 0x57, 0x3c, 0x3f, 0x11, 0x27, 0x6f, 0x6a, 0x87, 0x5c, 0xd2, 0x20, 0x6c, 0xe2, 0x9d, 0xfb, 0x84, + 0xf1, 0x5d, 0x0e, 0xf2, 0x3d, 0xb7, 0xe0, 0xf1, 0x45, 0x2f, 0x51, 0x6e, 0xd2, 0x6a, 0x1e, 0x51, + 0x25, 0x47, 0xb9, 0xfd, 0x5b, 0x7d, 0xdd, 0xfe, 0x0d, 0x37, 0xe5, 0x42, 0xda, 0xab, 0x3a, 0xeb, + 0xa6, 0x6c, 0xbf, 0x04, 0xa7, 0x17, 0xbd, 0xe4, 0xb2, 0xd7, 0x24, 0x07, 0x64, 0x62, 0x7f, 0xa5, + 0x04, 0x63, 0x66, 0x58, 0xca, 0x41, 0x22, 0x17, 0xbe, 0x45, 0xf5, 0x18, 0xd1, 0x3b, 0x4f, 0xdd, + 0xb1, 0xdc, 0x3a, 0x72, 0x8c, 0x4c, 0xef, 0x11, 0x33, 0x54, 0x19, 0xcd, 0x13, 0x9b, 0x0d, 0x40, + 0x77, 0xa0, 0x54, 0x67, 0x6e, 0xb4, 0xc5, 0x3c, 0x6e, 0x8e, 0x7b, 0x8d, 0xa8, 0x5e, 0x66, 0xdc, + 0x11, 0x97, 0xf3, 0xa3, 0x3b, 0x64, 0x94, 0x8e, 0xcd, 0x50, 0x82, 0x4a, 0x45, 0x65, 0x28, 0x8c, + 0x7e, 0xa2, 0xbe, 0x74, 0x08, 0x51, 0x9f, 0x12, 0xbc, 0xc3, 0x0f, 0x49, 0xf0, 0x32, 0x97, 0xe8, + 0x64, 0x8b, 0xe9, 0x6f, 0xc2, 0x21, 0x76, 0x84, 0x0d, 0x82, 0xe1, 0x12, 0x9d, 0x02, 0xe3, 0x2c, + 0xbe, 0xfd, 0x8d, 0x02, 0x4c, 0x2c, 0xfa, 0xed, 0xb5, 0xc5, 0xb5, 0xf6, 0x66, 0xd3, 0x73, 0xaf, + 0x91, 0x0e, 0x95, 0x6f, 0xdb, 0xa4, 0xb3, 0xb4, 0x20, 0xa6, 0xa1, 0x1a, 0xf8, 0x6b, 0xb4, 0x10, + 0x73, 0x18, 0x5d, 0xd1, 0x75, 0xcf, 0x6f, 0x90, 0x28, 0x8c, 0x3c, 0x71, 0x28, 0x67, 0xac, 0xe8, + 0xcb, 0x1a, 0x84, 0x4d, 0x3c, 0x4a, 0x3b, 0xb8, 0xe3, 0x93, 0x28, 0xab, 0x0d, 0xae, 0xd2, 0x42, + 0xcc, 0x61, 0x14, 0x29, 0x89, 0xda, 0x71, 0x22, 0xbe, 0xa8, 0x42, 0xda, 0xa0, 0x85, 0x98, 0xc3, + 0xe8, 0x72, 0x89, 0xdb, 0x9b, 0xec, 0x76, 0x3b, 0xe3, 0xc2, 0xba, 0xce, 0x8b, 0xb1, 0x84, 0x53, + 0xd4, 0x6d, 0xd2, 0x59, 0xa0, 0x76, 0x59, 0xc6, 0xc9, 0xfc, 0x1a, 0x2f, 0xc6, 0x12, 0xce, 0xb2, + 0xe8, 0xa4, 0x87, 0xe3, 0x47, 0x2e, 0x8b, 0x4e, 0xba, 0xf9, 0x7d, 0x2c, 0xbc, 0x5f, 0xb7, 0x60, + 0xcc, 0xf4, 0x49, 0x41, 0x8d, 0x8c, 0xa2, 0xb8, 0xda, 0x95, 0x11, 0xed, 0xa7, 0x7b, 0xbd, 0xd6, + 0xd0, 0xf0, 0x92, 0x20, 0x8c, 0x9f, 0x27, 0x7e, 0xc3, 0xf3, 0x09, 0xbb, 0xb9, 0xe4, 0xbe, 0x2c, + 0x29, 0x87, 0x97, 0xf9, 0xa0, 0x46, 0x0e, 0xa1, 0x69, 0xda, 0xb7, 0x60, 0xb2, 0x2b, 0xb2, 0x60, + 0x80, 0xfd, 0x79, 0xdf, 0xb8, 0x2e, 0x1b, 0xc3, 0x28, 0x25, 0xbc, 0x1a, 0x72, 0xa7, 0x93, 0x79, + 0x98, 0xe4, 0x3a, 0x04, 0xe5, 0xb4, 0xee, 0x6e, 0x91, 0x96, 0x8a, 0x16, 0x61, 0x27, 0xc0, 0x37, + 0xb3, 0x40, 0xdc, 0x8d, 0x6f, 0x7f, 0xd3, 0x82, 0xf1, 0x54, 0xb0, 0x47, 0x4e, 0x9a, 0x04, 0x5b, + 0x69, 0x01, 0x73, 0x91, 0x62, 0x5e, 0xa2, 0x45, 0xb6, 0x23, 0xe9, 0x95, 0xa6, 0x41, 0xd8, 0xc4, + 0xb3, 0xdf, 0x29, 0x40, 0x59, 0xde, 0x5a, 0x0f, 0xd0, 0x94, 0xaf, 0x5b, 0x30, 0xae, 0x4e, 0xdd, + 0xd9, 0x71, 0x0e, 0x9f, 0x8c, 0xd7, 0x8f, 0x7e, 0x6f, 0xae, 0x7c, 0xf8, 0xfc, 0x7a, 0xa0, 0xd5, + 0x5a, 0x6c, 0x32, 0xc3, 0x69, 0xde, 0xe8, 0x26, 0x40, 0xdc, 0x89, 0x13, 0xd2, 0x32, 0x0e, 0x96, + 0x6c, 0x63, 0xc5, 0xcd, 0xb8, 0x41, 0x44, 0xe8, 0xfa, 0xba, 0x1e, 0xd4, 0xc8, 0xba, 0xc2, 0xd4, + 0x7a, 0x88, 0x2e, 0xc3, 0x06, 0x25, 0xfb, 0x1f, 0x15, 0xe0, 0x64, 0xb6, 0x49, 0xe8, 0x75, 0x18, + 0x93, 0xdc, 0x8d, 0x97, 0x27, 0xe4, 0x55, 0xfd, 0x18, 0x36, 0x60, 0xf7, 0xf6, 0xa6, 0xa7, 0xbb, + 0x5f, 0xfe, 0x98, 0x31, 0x51, 0x70, 0x8a, 0x18, 0xbf, 0xfa, 0x10, 0x77, 0x74, 0xd5, 0xce, 0x5c, + 0x18, 0x8a, 0xfb, 0x0b, 0xe3, 0xea, 0xc3, 0x84, 0xe2, 0x0c, 0x36, 0x5a, 0x83, 0xd3, 0x46, 0xc9, + 0x75, 0xe2, 0x35, 0xb6, 0x36, 0x83, 0x48, 0x9a, 0x27, 0x4f, 0x6a, 0xef, 0x97, 0x6e, 0x1c, 0xdc, + 0xb3, 0x26, 0xdd, 0x32, 0x5d, 0x27, 0x74, 0x5c, 0x2f, 0xe9, 0x88, 0x93, 0x32, 0x25, 0x9b, 0xe6, + 0x45, 0x39, 0x56, 0x18, 0xf6, 0x0a, 0x0c, 0x0d, 0x38, 0x83, 0x06, 0x52, 0x8b, 0x5f, 0x85, 0x32, + 0x25, 0x27, 0x75, 0xa4, 0x3c, 0x48, 0x06, 0x50, 0x96, 0xc9, 0xa3, 0x91, 0x0d, 0x45, 0xcf, 0x91, + 0xb7, 0x4b, 0xaa, 0x5b, 0x4b, 0x71, 0xdc, 0x66, 0x96, 0x26, 0x05, 0xa2, 0xa7, 0xa1, 0x48, 0x76, + 0xc3, 0xec, 0x35, 0xd2, 0xa5, 0xdd, 0xd0, 0x8b, 0x48, 0x4c, 0x91, 0xc8, 0x6e, 0x88, 0xce, 0x41, + 0xc1, 0xab, 0x89, 0x4d, 0x0a, 0x04, 0x4e, 0x61, 0x69, 0x01, 0x17, 0xbc, 0x9a, 0xbd, 0x0b, 0x15, + 0x95, 0xad, 0x1a, 0x6d, 0x4b, 0xd9, 0x6d, 0xe5, 0xe1, 0x66, 0x22, 0xe9, 0xf6, 0x91, 0xda, 0x6d, + 0x00, 0x1d, 0x5a, 0x93, 0x97, 0x7c, 0xb9, 0x00, 0x43, 0x6e, 0x20, 0x22, 0xf2, 0xca, 0x9a, 0x0c, + 0x13, 0xda, 0x0c, 0x62, 0xdf, 0x82, 0x89, 0x6b, 0x7e, 0x70, 0x87, 0xe5, 0xf7, 0xbc, 0xec, 0x91, + 0x66, 0x8d, 0x12, 0xae, 0xd3, 0x1f, 0x59, 0x15, 0x81, 0x41, 0x31, 0x87, 0xa9, 0x94, 0x1e, 0x85, + 0x7e, 0x29, 0x3d, 0xec, 0x2f, 0x5a, 0x70, 0x52, 0xc5, 0x7c, 0x48, 0x69, 0xfc, 0x12, 0x8c, 0x6d, + 0xb6, 0xbd, 0x66, 0x4d, 0xfc, 0xcf, 0xda, 0xfa, 0x55, 0x03, 0x86, 0x53, 0x98, 0xd4, 0x32, 0xd9, + 0xf4, 0x7c, 0x27, 0xea, 0xac, 0x69, 0xf1, 0xaf, 0x24, 0x42, 0x55, 0x41, 0xb0, 0x81, 0x65, 0x7f, + 0xb9, 0x00, 0xe3, 0xa9, 0x08, 0x78, 0xd4, 0x84, 0x32, 0x69, 0xb2, 0x13, 0x28, 0xf9, 0x51, 0x8f, + 0x9a, 0xd8, 0x4a, 0x4d, 0xc4, 0x4b, 0x82, 0x2e, 0x56, 0x1c, 0x1e, 0x89, 0x6b, 0x16, 0xfb, 0xf7, + 0x8b, 0x30, 0xc5, 0x0f, 0xde, 0x6a, 0xca, 0x9f, 0x61, 0x45, 0x6a, 0x27, 0x7f, 0x5d, 0x67, 0x9b, + 0xe0, 0xc3, 0xb1, 0x79, 0xd4, 0xd4, 0x8c, 0xbd, 0x19, 0x0d, 0x74, 0xd3, 0xfe, 0x6b, 0x99, 0x9b, + 0xf6, 0x42, 0x1e, 0x01, 0x11, 0x7d, 0x5b, 0xf4, 0xa3, 0x75, 0xf5, 0xfe, 0xf7, 0x0b, 0x70, 0x22, + 0x93, 0xf7, 0x12, 0xbd, 0x9d, 0xce, 0x6c, 0x65, 0xe5, 0x71, 0x3c, 0x73, 0xdf, 0xec, 0x8b, 0x07, + 0xcb, 0x6f, 0xf5, 0xb0, 0x26, 0xfc, 0x1f, 0x14, 0x60, 0x22, 0x9d, 0xb0, 0xf3, 0x11, 0x1c, 0xa9, + 0x8f, 0x42, 0x85, 0xa5, 0xc1, 0x63, 0x6f, 0x82, 0xf0, 0x53, 0x20, 0x9e, 0xad, 0x4d, 0x16, 0x62, + 0x0d, 0x7f, 0x24, 0xd2, 0x86, 0xd9, 0xff, 0xc0, 0x82, 0x33, 0xbc, 0x97, 0xd9, 0x79, 0xf8, 0x37, + 0x7a, 0x8d, 0xee, 0x1b, 0xf9, 0x36, 0x30, 0x93, 0x25, 0x65, 0xbf, 0xf1, 0x65, 0x6f, 0x11, 0x88, + 0xd6, 0xa6, 0xa7, 0xc2, 0x23, 0xd8, 0xd8, 0x03, 0x4d, 0x06, 0xfb, 0x0f, 0x8a, 0xa0, 0x9f, 0x5f, + 0x40, 0x9e, 0x08, 0x9b, 0xc8, 0x25, 0x5b, 0xcc, 0x7a, 0xc7, 0x77, 0xf5, 0x43, 0x0f, 0xe5, 0x4c, + 0xd4, 0xc4, 0x2f, 0x5b, 0x30, 0xea, 0xf9, 0x5e, 0xe2, 0x39, 0x4c, 0xe9, 0xcc, 0x27, 0x1f, 0xbd, + 0x62, 0xb7, 0xc4, 0x29, 0x07, 0x91, 0x79, 0x74, 0xa8, 0x98, 0x61, 0x93, 0x33, 0xfa, 0x9c, 0x70, + 0x86, 0x2b, 0xe6, 0x16, 0xf0, 0x53, 0xce, 0x78, 0xc0, 0x85, 0x50, 0x8a, 0x48, 0x12, 0xc9, 0x50, + 0xab, 0x6b, 0x47, 0xf5, 0x70, 0x4e, 0xa2, 0x8e, 0x4a, 0x3c, 0xa6, 0x1f, 0xc2, 0xa2, 0xc5, 0x98, + 0x33, 0xb2, 0x63, 0x40, 0xdd, 0x63, 0x71, 0x40, 0x47, 0xa3, 0x59, 0xa8, 0x38, 0xed, 0x24, 0x68, + 0xd1, 0x61, 0x12, 0xa7, 0x9b, 0xda, 0x95, 0x4a, 0x02, 0xb0, 0xc6, 0xb1, 0xdf, 0x2e, 0x41, 0x26, + 0x8e, 0x01, 0xed, 0x9a, 0x4f, 0x87, 0x58, 0xf9, 0x3e, 0x1d, 0xa2, 0x1a, 0xd3, 0xeb, 0xf9, 0x10, + 0xd4, 0x80, 0x52, 0xb8, 0xe5, 0xc4, 0x52, 0xa7, 0x7c, 0x55, 0x0e, 0xd3, 0x1a, 0x2d, 0xbc, 0xb7, + 0x37, 0xfd, 0x33, 0x83, 0x9d, 0x51, 0xd0, 0xb9, 0x3a, 0xcb, 0xe3, 0x85, 0x35, 0x6b, 0x46, 0x03, + 0x73, 0xfa, 0x07, 0xc9, 0xc8, 0xff, 0x25, 0x91, 0x2b, 0x11, 0x93, 0xb8, 0xdd, 0x4c, 0xc4, 0x6c, + 0x78, 0x35, 0xc7, 0x55, 0xc6, 0x09, 0xeb, 0x08, 0x3c, 0xfe, 0x1f, 0x1b, 0x4c, 0xd1, 0xeb, 0x50, + 0x89, 0x13, 0x27, 0x4a, 0x0e, 0x19, 0x33, 0xa3, 0x06, 0x7d, 0x5d, 0x12, 0xc1, 0x9a, 0x1e, 0x7a, + 0x8d, 0x25, 0xcf, 0xf2, 0xe2, 0xad, 0x43, 0xfa, 0xb0, 0xca, 0x44, 0x5b, 0x82, 0x02, 0x36, 0xa8, + 0x51, 0x95, 0x9d, 0xcd, 0x6d, 0xee, 0xb8, 0x51, 0x66, 0x36, 0x99, 0x12, 0x85, 0x58, 0x41, 0xb0, + 0x81, 0x65, 0x7f, 0x01, 0x4e, 0x65, 0xdf, 0x1a, 0x13, 0xc7, 0x96, 0x8d, 0x28, 0x68, 0x87, 0x59, + 0x9b, 0x84, 0xbd, 0x45, 0x85, 0x39, 0x8c, 0xda, 0x24, 0xdb, 0x9e, 0x5f, 0xcb, 0xda, 0x24, 0xd7, + 0x3c, 0xbf, 0x86, 0x19, 0x64, 0x80, 0x37, 0x55, 0xfe, 0xa5, 0x05, 0x17, 0xf6, 0x7b, 0x12, 0x0d, + 0x3d, 0x09, 0x43, 0x77, 0x9c, 0x48, 0x26, 0xfa, 0x63, 0xb2, 0xe3, 0x96, 0x13, 0xf9, 0x98, 0x95, + 0xa2, 0x0e, 0x0c, 0xf3, 0x18, 0x45, 0xa1, 0xc0, 0xbe, 0x9a, 0xef, 0x03, 0x6d, 0xd7, 0x88, 0xa1, + 0x41, 0xf3, 0xf8, 0x48, 0x2c, 0x18, 0xda, 0xef, 0x5b, 0x80, 0x56, 0x77, 0x48, 0x14, 0x79, 0x35, + 0x23, 0xaa, 0x12, 0xbd, 0x08, 0x63, 0xb7, 0xd7, 0x57, 0xaf, 0xaf, 0x05, 0x9e, 0xcf, 0x62, 0xac, + 0x8d, 0xb8, 0x94, 0xab, 0x46, 0x39, 0x4e, 0x61, 0xa1, 0x79, 0x98, 0xbc, 0xfd, 0x26, 0xb5, 0xa3, + 0xcc, 0x1c, 0xb9, 0x05, 0x7d, 0x72, 0x76, 0xf5, 0xd5, 0x0c, 0x10, 0x77, 0xe3, 0xa3, 0x55, 0x38, + 0xd3, 0xe2, 0x1a, 0x38, 0x33, 0x1f, 0x63, 0xae, 0x8e, 0x47, 0x32, 0xf1, 0xc2, 0xe3, 0x77, 0xf7, + 0xa6, 0xcf, 0xac, 0xf4, 0x42, 0xc0, 0xbd, 0xeb, 0xd9, 0xef, 0x16, 0x60, 0xd4, 0x78, 0x56, 0x70, + 0x00, 0x43, 0x39, 0xf3, 0x12, 0x62, 0x61, 0xc0, 0x97, 0x10, 0x9f, 0x85, 0x72, 0x18, 0x34, 0x3d, + 0xd7, 0x53, 0x59, 0x22, 0x58, 0x32, 0xb3, 0x35, 0x51, 0x86, 0x15, 0x14, 0xdd, 0x81, 0x8a, 0x7a, + 0x6a, 0x4b, 0x04, 0xf7, 0xe5, 0x75, 0x54, 0xa0, 0x16, 0xaf, 0x7e, 0x42, 0x4b, 0xf3, 0x42, 0x36, + 0x0c, 0xb3, 0x99, 0x2f, 0x5d, 0x9a, 0x58, 0xd4, 0x05, 0x5b, 0x12, 0x31, 0x16, 0x10, 0xfb, 0xab, + 0x23, 0x70, 0xba, 0x57, 0x02, 0x2e, 0xf4, 0x79, 0x18, 0xe6, 0x6d, 0xcc, 0x27, 0xc7, 0x63, 0x2f, + 0x1e, 0x8b, 0x8c, 0xa0, 0x68, 0x16, 0xfb, 0x8d, 0x05, 0x4f, 0xc1, 0xbd, 0xe9, 0x6c, 0x0a, 0x35, + 0xe2, 0x78, 0xb8, 0x2f, 0x3b, 0x9a, 0xfb, 0xb2, 0xc3, 0xb9, 0x37, 0x9d, 0x4d, 0xb4, 0x0b, 0xa5, + 0x86, 0x97, 0x10, 0x47, 0x28, 0xd3, 0xb7, 0x8e, 0x85, 0x39, 0x71, 0xb8, 0xe7, 0x3c, 0xfb, 0x89, + 0x39, 0x43, 0xf4, 0x5d, 0x0b, 0x4e, 0x6c, 0xa6, 0x83, 0x58, 0xc4, 0xae, 0xe2, 0x1c, 0x43, 0x92, + 0xb5, 0x34, 0xa3, 0xea, 0xa9, 0xbb, 0x7b, 0xd3, 0x27, 0x32, 0x85, 0x38, 0xdb, 0x1c, 0xf4, 0x8b, + 0x16, 0x8c, 0xd4, 0xbd, 0xa6, 0x91, 0x41, 0xe8, 0x18, 0x3e, 0xce, 0x65, 0xc6, 0x40, 0xef, 0xbc, + 0xfc, 0x7f, 0x8c, 0x25, 0xe7, 0x7e, 0xd7, 0x79, 0xc3, 0x47, 0xbd, 0xce, 0x1b, 0x79, 0x48, 0xe6, + 0xd3, 0xdf, 0x2c, 0xc0, 0xd3, 0x03, 0x7c, 0x23, 0x33, 0x28, 0xc2, 0xda, 0x27, 0x28, 0xe2, 0x02, + 0x0c, 0x45, 0x24, 0x0c, 0xb2, 0xfb, 0x1d, 0xf3, 0x1c, 0x62, 0x10, 0xf4, 0x14, 0x14, 0x9d, 0xd0, + 0x13, 0xdb, 0x9d, 0xba, 0xed, 0x9f, 0x5b, 0x5b, 0xc2, 0xb4, 0x9c, 0x7e, 0xe9, 0xca, 0xa6, 0x0c, + 0xad, 0xca, 0x27, 0x11, 0x74, 0xbf, 0x48, 0x2d, 0x6e, 0xd0, 0x28, 0x28, 0xd6, 0x7c, 0xed, 0x55, + 0x38, 0xd7, 0x7f, 0x86, 0xa0, 0x17, 0x60, 0x74, 0x33, 0x72, 0x7c, 0x77, 0x8b, 0x25, 0x4d, 0x97, + 0x63, 0xc2, 0x5c, 0xe1, 0x75, 0x31, 0x36, 0x71, 0xec, 0xdf, 0x2f, 0xf4, 0xa6, 0xc8, 0x85, 0xc0, + 0x41, 0x46, 0x58, 0x8c, 0x5f, 0xa1, 0xcf, 0xf8, 0xbd, 0x09, 0xe5, 0x84, 0x79, 0xe2, 0x93, 0xba, + 0x90, 0x24, 0xb9, 0x05, 0x93, 0xb1, 0xbd, 0x66, 0x43, 0x10, 0xc7, 0x8a, 0x0d, 0x15, 0xf9, 0x4d, + 0x9d, 0x7c, 0x48, 0x88, 0xfc, 0xcc, 0x39, 0xda, 0x02, 0x9c, 0x34, 0x72, 0x29, 0x72, 0x47, 0x64, + 0x7e, 0x8d, 0xaa, 0xa2, 0x73, 0xd6, 0x32, 0x70, 0xdc, 0x55, 0xc3, 0xfe, 0xf5, 0x02, 0x3c, 0xde, + 0x57, 0xb2, 0xe9, 0xbb, 0x5e, 0xeb, 0x3e, 0x77, 0xbd, 0x47, 0x9e, 0xa0, 0xe6, 0x00, 0x0f, 0x3d, + 0x98, 0x01, 0x7e, 0x0e, 0xca, 0x9e, 0x1f, 0x13, 0xb7, 0x1d, 0xf1, 0x41, 0x33, 0xdc, 0xf2, 0x96, + 0x44, 0x39, 0x56, 0x18, 0xf6, 0x1f, 0xf6, 0x9f, 0x6a, 0x74, 0x97, 0xfb, 0xb1, 0x1d, 0xa5, 0x97, + 0x61, 0xdc, 0x09, 0x43, 0x8e, 0xc7, 0xee, 0xd5, 0x32, 0xf1, 0x76, 0x73, 0x26, 0x10, 0xa7, 0x71, + 0x8d, 0x39, 0x3c, 0xdc, 0x6f, 0x0e, 0xdb, 0x7f, 0x62, 0x41, 0x05, 0x93, 0x3a, 0xcf, 0xc1, 0x89, + 0x6e, 0x8b, 0x21, 0xb2, 0xf2, 0x48, 0x0e, 0xc1, 0x1e, 0xec, 0xf6, 0x58, 0xd2, 0x84, 0x5e, 0x83, + 0xdd, 0x9d, 0x17, 0xb4, 0x70, 0xa0, 0xbc, 0xa0, 0x2a, 0x33, 0x64, 0xb1, 0x7f, 0x66, 0x48, 0xfb, + 0xdd, 0x11, 0xda, 0xbd, 0x30, 0x98, 0x8f, 0x48, 0x2d, 0xa6, 0xdf, 0xb7, 0x1d, 0x35, 0xb3, 0xef, + 0x18, 0xde, 0xc0, 0xcb, 0x98, 0x96, 0xa7, 0x0e, 0x01, 0x0a, 0x07, 0x8a, 0x36, 0x2a, 0xee, 0x1b, + 0x6d, 0xf4, 0x32, 0x8c, 0xc7, 0xf1, 0xd6, 0x5a, 0xe4, 0xed, 0x38, 0x09, 0x35, 0x2d, 0x84, 0x5b, + 0x86, 0x8e, 0x10, 0x58, 0xbf, 0xa2, 0x81, 0x38, 0x8d, 0x8b, 0x16, 0x61, 0x52, 0xc7, 0xfc, 0x90, + 0x28, 0x61, 0x5e, 0x18, 0x7c, 0x26, 0x28, 0x07, 0x7d, 0x1d, 0x25, 0x24, 0x10, 0x70, 0x77, 0x1d, + 0x2a, 0xb1, 0x52, 0x85, 0xb4, 0x21, 0xc3, 0x69, 0x89, 0x95, 0xa2, 0x43, 0xdb, 0xd2, 0x55, 0x03, + 0xad, 0xc0, 0x29, 0x3e, 0x31, 0xd8, 0xc3, 0xb9, 0xaa, 0x47, 0xdc, 0x6b, 0xe6, 0x09, 0x41, 0xe8, + 0xd4, 0x62, 0x37, 0x0a, 0xee, 0x55, 0x8f, 0xda, 0x0d, 0xaa, 0x78, 0x69, 0x41, 0xd8, 0xaf, 0xca, + 0x6e, 0x50, 0x64, 0x96, 0x6a, 0xd8, 0xc4, 0x43, 0x9f, 0x86, 0xc7, 0xf4, 0x5f, 0xee, 0xef, 0xc6, + 0x0f, 0x75, 0x16, 0x44, 0x38, 0xa5, 0xca, 0x43, 0xb8, 0xd8, 0x13, 0xad, 0x86, 0xfb, 0xd5, 0x47, + 0x9b, 0x70, 0x4e, 0x81, 0x2e, 0x51, 0x23, 0x2d, 0x8c, 0xbc, 0x98, 0x54, 0x9d, 0x98, 0xdc, 0x88, + 0x9a, 0x2c, 0x00, 0xb3, 0xa2, 0x13, 0xaa, 0x2f, 0x7a, 0xc9, 0x95, 0x5e, 0x98, 0x78, 0x19, 0xdf, + 0x87, 0x0a, 0x9a, 0x85, 0x0a, 0xf1, 0x9d, 0xcd, 0x26, 0x59, 0x9d, 0x5f, 0x62, 0x61, 0x99, 0xc6, + 0x19, 0xd2, 0x25, 0x09, 0xc0, 0x1a, 0x47, 0xdd, 0x04, 0x8e, 0xf5, 0x4d, 0xee, 0xbf, 0x06, 0xa7, + 0x1b, 0x6e, 0x48, 0xf5, 0x00, 0xcf, 0x25, 0x73, 0xae, 0x4b, 0x0d, 0x7d, 0xfa, 0x61, 0x78, 0x5e, + 0x54, 0x75, 0xcd, 0xbd, 0x38, 0xbf, 0xd6, 0x85, 0x83, 0x7b, 0xd6, 0xa4, 0x6b, 0x2c, 0x8c, 0x82, + 0xdd, 0xce, 0xd4, 0xa9, 0xf4, 0x1a, 0x5b, 0xa3, 0x85, 0x98, 0xc3, 0xd0, 0x55, 0x40, 0xcc, 0x67, + 0xe2, 0x4a, 0x92, 0x84, 0x4a, 0xf1, 0x98, 0x3a, 0xcd, 0xba, 0x74, 0x4e, 0xd4, 0x40, 0x97, 0xbb, + 0x30, 0x70, 0x8f, 0x5a, 0xf6, 0x1f, 0x5b, 0x30, 0xae, 0xd6, 0xeb, 0x03, 0xf0, 0x1a, 0x6a, 0xa6, + 0xbd, 0x86, 0x16, 0x8f, 0x2e, 0xf1, 0x58, 0xcb, 0xfb, 0x5c, 0x3d, 0x7f, 0x75, 0x14, 0x40, 0x4b, + 0x45, 0xb5, 0x21, 0x59, 0x7d, 0x37, 0xa4, 0x47, 0x56, 0x22, 0xf5, 0x8a, 0xc1, 0x2a, 0x3d, 0xdc, + 0x18, 0xac, 0x75, 0x38, 0x23, 0xd5, 0x05, 0x7e, 0x24, 0x73, 0x25, 0x88, 0x95, 0x80, 0x2b, 0x57, + 0x9f, 0x12, 0x84, 0xce, 0x2c, 0xf5, 0x42, 0xc2, 0xbd, 0xeb, 0xa6, 0xb4, 0x94, 0x91, 0xfd, 0xb4, + 0x14, 0xbd, 0xa6, 0x97, 0xeb, 0x32, 0xab, 0x61, 0x66, 0x4d, 0x2f, 0x5f, 0x5e, 0xc7, 0x1a, 0xa7, + 0xb7, 0x60, 0xaf, 0xe4, 0x24, 0xd8, 0xe1, 0xc0, 0x82, 0x5d, 0x8a, 0x98, 0xd1, 0xbe, 0x22, 0x46, + 0x9e, 0x02, 0x8d, 0xf5, 0x3d, 0x05, 0x7a, 0x05, 0x26, 0x3c, 0x7f, 0x8b, 0x44, 0x5e, 0x42, 0x6a, + 0x6c, 0x2d, 0x88, 0xc7, 0xe1, 0xd5, 0xb6, 0xbe, 0x94, 0x82, 0xe2, 0x0c, 0x76, 0x5a, 0x2e, 0x4e, + 0x0c, 0x20, 0x17, 0xfb, 0xec, 0x46, 0x27, 0xf2, 0xd9, 0x8d, 0x4e, 0x1e, 0x7d, 0x37, 0x9a, 0x3c, + 0xd6, 0xdd, 0x08, 0xe5, 0xb2, 0x1b, 0x0d, 0x24, 0xe8, 0x0d, 0x83, 0xee, 0xf4, 0x3e, 0x06, 0x5d, + 0xbf, 0xad, 0xe8, 0xcc, 0xa1, 0xb7, 0xa2, 0xde, 0xbb, 0xcc, 0xd9, 0x43, 0xed, 0x32, 0x5f, 0x2b, + 0xc0, 0x19, 0x2d, 0x87, 0xe9, 0xec, 0xf7, 0xea, 0x54, 0x12, 0xb1, 0xc4, 0xb8, 0xdc, 0x1d, 0xc5, + 0x70, 0x62, 0xd3, 0xfe, 0x70, 0x0a, 0x82, 0x0d, 0x2c, 0xe6, 0x0b, 0x46, 0x22, 0x96, 0x62, 0x26, + 0x2b, 0xa4, 0xe7, 0x45, 0x39, 0x56, 0x18, 0x74, 0x7e, 0xd1, 0xdf, 0xc2, 0xbf, 0x36, 0x1b, 0x76, + 0x3e, 0xaf, 0x41, 0xd8, 0xc4, 0x43, 0xcf, 0x72, 0x26, 0x4c, 0x40, 0x50, 0x41, 0x3d, 0x26, 0x9e, + 0x7c, 0x90, 0x32, 0x41, 0x41, 0x65, 0x73, 0x98, 0xd3, 0x5f, 0xa9, 0xbb, 0x39, 0xec, 0xf2, 0x4d, + 0x61, 0xd8, 0xff, 0xc7, 0x82, 0xc7, 0x7b, 0x0e, 0xc5, 0x03, 0xd8, 0x7c, 0x77, 0xd3, 0x9b, 0xef, + 0x7a, 0x5e, 0xe6, 0x86, 0xd1, 0x8b, 0x3e, 0x1b, 0xf1, 0x7f, 0xb4, 0x60, 0x42, 0xe3, 0x3f, 0x80, + 0xae, 0x7a, 0xe9, 0xae, 0xe6, 0x67, 0x59, 0x55, 0xba, 0xfa, 0xf6, 0xc7, 0xac, 0x6f, 0xfc, 0x0e, + 0x63, 0x8e, 0xed, 0x8f, 0x03, 0x9c, 0xdd, 0x77, 0x60, 0x98, 0x65, 0x65, 0x8d, 0xf3, 0xb9, 0x4b, + 0x49, 0xf3, 0x67, 0xde, 0xbc, 0xfa, 0x2e, 0x85, 0xfd, 0x8d, 0xb1, 0x60, 0xc8, 0x12, 0x20, 0x79, + 0x31, 0x95, 0xe6, 0x35, 0xe1, 0x3e, 0xa7, 0x13, 0x20, 0x89, 0x72, 0xac, 0x30, 0xec, 0x16, 0x4c, + 0xa5, 0x89, 0x2f, 0x90, 0x3a, 0xbb, 0xb2, 0x1e, 0xa8, 0x9b, 0xb3, 0x50, 0x71, 0x58, 0xad, 0xe5, + 0xb6, 0x93, 0x7d, 0x25, 0x68, 0x4e, 0x02, 0xb0, 0xc6, 0xb1, 0x7f, 0xdb, 0x82, 0x53, 0x3d, 0x3a, + 0x93, 0xa3, 0xdb, 0x60, 0xa2, 0xa5, 0x40, 0xaf, 0x0d, 0xf7, 0x23, 0x30, 0x52, 0x23, 0x75, 0x47, + 0x5e, 0x8a, 0x1a, 0x32, 0x77, 0x81, 0x17, 0x63, 0x09, 0xb7, 0xff, 0x87, 0x05, 0x27, 0xd2, 0x6d, + 0x8d, 0xa9, 0xd4, 0xe4, 0x9d, 0x59, 0xf0, 0x62, 0x37, 0xd8, 0x21, 0x51, 0x87, 0xf6, 0x9c, 0xb7, + 0x5a, 0x49, 0xcd, 0xb9, 0x2e, 0x0c, 0xdc, 0xa3, 0x16, 0x4b, 0xd0, 0x52, 0x53, 0xa3, 0x2d, 0x67, + 0xca, 0xcd, 0x3c, 0x67, 0x8a, 0xfe, 0x98, 0xe6, 0xc5, 0x91, 0x62, 0x89, 0x4d, 0xfe, 0xf6, 0xfb, + 0x43, 0xa0, 0xfc, 0x8a, 0xd9, 0xf5, 0x5b, 0x4e, 0x97, 0x97, 0xa9, 0xa7, 0xa4, 0x8a, 0x03, 0x3c, + 0x25, 0x25, 0x27, 0xc3, 0xd0, 0xfd, 0xae, 0xc6, 0xf8, 0xe9, 0x85, 0x79, 0x48, 0xa8, 0x7a, 0xb8, + 0xa1, 0x41, 0xd8, 0xc4, 0xa3, 0x2d, 0x69, 0x7a, 0x3b, 0x84, 0x57, 0x1a, 0x4e, 0xb7, 0x64, 0x59, + 0x02, 0xb0, 0xc6, 0xa1, 0x2d, 0xa9, 0x79, 0xf5, 0xba, 0x30, 0xc5, 0x55, 0x4b, 0xe8, 0xe8, 0x60, + 0x06, 0xa1, 0x18, 0x5b, 0x41, 0xb0, 0x2d, 0xb4, 0x53, 0x85, 0x71, 0x25, 0x08, 0xb6, 0x31, 0x83, + 0x50, 0x7d, 0xca, 0x0f, 0xa2, 0x16, 0x7b, 0xc5, 0xa9, 0xa6, 0xb8, 0x08, 0xad, 0x54, 0xe9, 0x53, + 0xd7, 0xbb, 0x51, 0x70, 0xaf, 0x7a, 0x74, 0x06, 0x86, 0x11, 0xa9, 0x79, 0x6e, 0x62, 0x52, 0x83, + 0xf4, 0x0c, 0x5c, 0xeb, 0xc2, 0xc0, 0x3d, 0x6a, 0xa1, 0x39, 0x38, 0x21, 0xfd, 0xc2, 0x65, 0xe8, + 0xdc, 0x68, 0x3a, 0x54, 0x07, 0xa7, 0xc1, 0x38, 0x8b, 0x4f, 0xa5, 0x4d, 0x4b, 0x44, 0xcd, 0x32, + 0x25, 0xd6, 0x90, 0x36, 0x32, 0x9a, 0x16, 0x2b, 0x0c, 0xfb, 0x4b, 0x45, 0xba, 0x3b, 0xf6, 0xc9, + 0x9e, 0xfb, 0xc0, 0x2e, 0xcb, 0xd3, 0x33, 0x72, 0x68, 0x80, 0x19, 0xf9, 0x22, 0x8c, 0xdd, 0x8e, + 0x03, 0x5f, 0x5d, 0x44, 0x97, 0xfa, 0x5e, 0x44, 0x1b, 0x58, 0xbd, 0x2f, 0xa2, 0x87, 0xf3, 0xba, + 0x88, 0x1e, 0x39, 0xe4, 0x45, 0xf4, 0xf7, 0x4a, 0xa0, 0xf2, 0x4f, 0x5e, 0x27, 0xc9, 0x9d, 0x20, + 0xda, 0xf6, 0xfc, 0x06, 0xf3, 0xa7, 0xff, 0xae, 0x05, 0x63, 0x7c, 0xbd, 0x2c, 0x9b, 0xbe, 0xb5, + 0xf5, 0x9c, 0xf2, 0x24, 0xa6, 0x98, 0xcd, 0x6c, 0x18, 0x8c, 0x32, 0x8f, 0x04, 0x98, 0x20, 0x9c, + 0x6a, 0x11, 0xfa, 0x79, 0x00, 0x79, 0x6e, 0x59, 0x97, 0x22, 0x73, 0x29, 0x9f, 0xf6, 0x61, 0x52, + 0xd7, 0xba, 0xe9, 0x86, 0x62, 0x82, 0x0d, 0x86, 0xe8, 0x6b, 0xd9, 0x57, 0xee, 0x3e, 0x77, 0x2c, + 0x63, 0x33, 0x88, 0xd7, 0x31, 0x86, 0x11, 0xcf, 0x6f, 0xd0, 0x79, 0x22, 0xee, 0xee, 0x3f, 0xdc, + 0x2b, 0x16, 0x65, 0x39, 0x70, 0x6a, 0x55, 0xa7, 0xe9, 0xf8, 0x2e, 0x89, 0x96, 0x38, 0xba, 0xf9, + 0x6a, 0x0d, 0x2b, 0xc0, 0x92, 0x50, 0x57, 0x22, 0xd0, 0xd2, 0x20, 0x89, 0x40, 0xcf, 0x7d, 0x12, + 0x26, 0xbb, 0x3e, 0xe6, 0x81, 0x9c, 0x8c, 0x0f, 0xef, 0x9f, 0x6c, 0xff, 0xab, 0x61, 0xbd, 0x69, + 0x5d, 0x0f, 0x6a, 0x3c, 0x1d, 0x65, 0xa4, 0xbf, 0xa8, 0xd0, 0x3d, 0x73, 0x9c, 0x22, 0xc6, 0xcb, + 0x37, 0xaa, 0x10, 0x9b, 0x2c, 0xe9, 0x1c, 0x0d, 0x9d, 0x88, 0xf8, 0xc7, 0x3d, 0x47, 0xd7, 0x14, + 0x13, 0x6c, 0x30, 0x44, 0x5b, 0x29, 0x2f, 0xc3, 0xcb, 0x47, 0xf7, 0x32, 0x64, 0xa1, 0xae, 0xbd, + 0xf2, 0xed, 0x7d, 0xdb, 0x82, 0x09, 0x3f, 0x35, 0x73, 0xc5, 0x3d, 0xce, 0xc6, 0x71, 0xac, 0x0a, + 0x9e, 0xbe, 0x38, 0x5d, 0x86, 0x33, 0xfc, 0x7b, 0x6d, 0x69, 0xa5, 0x03, 0x6e, 0x69, 0x3a, 0xaf, + 0xed, 0x70, 0xbf, 0xbc, 0xb6, 0xc8, 0x57, 0x99, 0xb8, 0x47, 0x72, 0xcf, 0xc4, 0x0d, 0x3d, 0xb2, + 0x70, 0xdf, 0x82, 0x8a, 0x1b, 0x11, 0x27, 0x39, 0x64, 0x52, 0x66, 0x76, 0x89, 0x3d, 0x2f, 0x09, + 0x60, 0x4d, 0xcb, 0xfe, 0x0f, 0x45, 0x38, 0x29, 0x47, 0x44, 0x7a, 0x60, 0xd1, 0xfd, 0x91, 0xf3, + 0xd5, 0xca, 0xad, 0xda, 0x1f, 0xaf, 0x48, 0x00, 0xd6, 0x38, 0x54, 0x1f, 0x6b, 0xc7, 0x64, 0x35, + 0x24, 0xfe, 0xb2, 0xb7, 0x19, 0x8b, 0xfb, 0x47, 0xb5, 0x50, 0x6e, 0x68, 0x10, 0x36, 0xf1, 0xa8, + 0x32, 0xce, 0xf5, 0xe2, 0x38, 0xeb, 0xd0, 0x28, 0xf4, 0x6d, 0x2c, 0xe1, 0xe8, 0x57, 0x7b, 0xa6, + 0xf3, 0xcf, 0xc7, 0x95, 0xb7, 0xcb, 0xf1, 0xec, 0x80, 0x79, 0xfc, 0xdf, 0xb6, 0xe0, 0xc4, 0x76, + 0x2a, 0x16, 0x49, 0x8a, 0xe4, 0x23, 0x46, 0xcd, 0xa6, 0x03, 0x9c, 0xf4, 0x14, 0x4e, 0x97, 0xc7, + 0x38, 0xcb, 0xdd, 0xfe, 0x5f, 0x16, 0x98, 0xe2, 0x69, 0x30, 0xcd, 0xca, 0x78, 0x7f, 0xa7, 0xb0, + 0xcf, 0xfb, 0x3b, 0x52, 0x09, 0x2b, 0x0e, 0xa6, 0xf4, 0x0f, 0x1d, 0x40, 0xe9, 0x2f, 0xf5, 0xd5, + 0xda, 0x9e, 0x82, 0x62, 0xdb, 0xab, 0x09, 0xbd, 0x5d, 0xdf, 0x36, 0x2e, 0x2d, 0x60, 0x5a, 0x6e, + 0xff, 0xf3, 0x92, 0xb6, 0xd3, 0x85, 0x07, 0xea, 0x8f, 0x45, 0xb7, 0xeb, 0x2a, 0x08, 0x9a, 0xf7, + 0xfc, 0x7a, 0x57, 0x10, 0xf4, 0x4f, 0x1d, 0xdc, 0xc1, 0x98, 0x0f, 0x50, 0xbf, 0x18, 0xe8, 0x91, + 0x7d, 0xbc, 0x8b, 0x6f, 0x43, 0x99, 0x9a, 0x36, 0xec, 0xc0, 0xad, 0x9c, 0x6a, 0x54, 0xf9, 0x8a, + 0x28, 0xbf, 0xb7, 0x37, 0xfd, 0x93, 0x07, 0x6f, 0x96, 0xac, 0x8d, 0x15, 0x7d, 0x14, 0x43, 0x85, + 0xfe, 0x66, 0x8e, 0xd0, 0xc2, 0x68, 0xba, 0xa1, 0x64, 0x91, 0x04, 0xe4, 0xe2, 0x65, 0xad, 0xf9, + 0x20, 0x1f, 0x2a, 0xec, 0x29, 0x11, 0xc6, 0x94, 0xdb, 0x56, 0x6b, 0xca, 0x1d, 0x59, 0x02, 0xee, + 0xed, 0x4d, 0xbf, 0x7c, 0x70, 0xa6, 0xaa, 0x3a, 0xd6, 0x2c, 0xec, 0x77, 0x86, 0xf4, 0xdc, 0x15, + 0xb1, 0xef, 0x3f, 0x16, 0x73, 0xf7, 0xa5, 0xcc, 0xdc, 0xbd, 0xd0, 0x35, 0x77, 0x27, 0xf4, 0x93, + 0x17, 0xa9, 0xd9, 0xf8, 0xa0, 0x37, 0xd8, 0xfd, 0xed, 0x78, 0xa6, 0x59, 0xbc, 0xd9, 0xf6, 0x22, + 0x12, 0xaf, 0x45, 0x6d, 0xdf, 0xf3, 0x1b, 0xe2, 0x4d, 0x3d, 0x43, 0xb3, 0x48, 0x81, 0x71, 0x16, + 0x9f, 0xbd, 0xc7, 0xd7, 0xf1, 0xdd, 0x5b, 0xce, 0x0e, 0x9f, 0x55, 0x46, 0x38, 0xf0, 0xba, 0x28, + 0xc7, 0x0a, 0xc3, 0x7e, 0x97, 0xdd, 0xdd, 0x1a, 0x11, 0x18, 0x74, 0x4e, 0x34, 0xd9, 0xdb, 0x2d, + 0x3c, 0x96, 0x58, 0xcd, 0x09, 0xfe, 0x60, 0x0b, 0x87, 0xa1, 0x3b, 0x30, 0xb2, 0xc9, 0x73, 0xa1, + 0xe7, 0x93, 0x7c, 0x4c, 0x24, 0x56, 0x67, 0xf9, 0x41, 0x65, 0x96, 0xf5, 0x7b, 0xfa, 0x27, 0x96, + 0xdc, 0xec, 0xf7, 0x86, 0xe0, 0x44, 0xe6, 0x75, 0x8f, 0x54, 0x2a, 0x94, 0xc2, 0xbe, 0xa9, 0x50, + 0x3e, 0x03, 0x50, 0x23, 0x61, 0x33, 0xe8, 0x30, 0x35, 0x67, 0xe8, 0xc0, 0x6a, 0x8e, 0xd2, 0x8c, + 0x17, 0x14, 0x15, 0x6c, 0x50, 0x14, 0x01, 0xd4, 0x3c, 0xb3, 0x4a, 0x26, 0x80, 0xda, 0xc8, 0xff, + 0x37, 0xfc, 0x60, 0xf3, 0xff, 0x79, 0x70, 0x82, 0x37, 0x51, 0xc5, 0x39, 0x1c, 0x22, 0x9c, 0x81, + 0x79, 0xc8, 0x2e, 0xa4, 0xc9, 0xe0, 0x2c, 0xdd, 0x87, 0xf9, 0x78, 0x0f, 0xfa, 0x28, 0x54, 0xe4, + 0x77, 0x8e, 0xa7, 0x2a, 0x3a, 0x56, 0x4c, 0x4e, 0x03, 0xf6, 0xa8, 0x8e, 0xf8, 0x69, 0x7f, 0xab, + 0x40, 0xb5, 0x52, 0xfe, 0x4f, 0xc5, 0xfc, 0x3e, 0x03, 0xc3, 0x4e, 0x3b, 0xd9, 0x0a, 0xba, 0xb2, + 0xcf, 0xcf, 0xb1, 0x52, 0x2c, 0xa0, 0x68, 0x19, 0x86, 0x6a, 0x3a, 0x8e, 0xf3, 0x20, 0xa3, 0xa8, + 0x0f, 0xf8, 0x9c, 0x84, 0x60, 0x46, 0x05, 0x3d, 0x09, 0x43, 0x89, 0xd3, 0x48, 0xbd, 0x0b, 0xb9, + 0xe1, 0x34, 0x62, 0xcc, 0x4a, 0xcd, 0x4d, 0x73, 0x68, 0x9f, 0x4d, 0xf3, 0x65, 0x18, 0x8f, 0xbd, + 0x86, 0xef, 0x24, 0xed, 0x88, 0x18, 0x97, 0x49, 0xda, 0x3f, 0xc0, 0x04, 0xe2, 0x34, 0xae, 0xfd, + 0x7e, 0x05, 0x4e, 0xf7, 0x7a, 0xbf, 0x3b, 0x6f, 0x6f, 0xf8, 0x5e, 0x3c, 0x1e, 0x9c, 0x37, 0x7c, + 0x1f, 0xee, 0x4d, 0xc3, 0x1b, 0xbe, 0x69, 0x78, 0xc3, 0x7f, 0xcd, 0x82, 0x8a, 0x72, 0x02, 0x17, + 0x8e, 0xac, 0xaf, 0x1f, 0xc3, 0x1b, 0xe9, 0x92, 0x85, 0xf0, 0x05, 0x96, 0x7f, 0xb1, 0x66, 0x7e, + 0x7c, 0xee, 0xf1, 0xf7, 0x6d, 0xd0, 0x81, 0xdc, 0xe3, 0x55, 0xec, 0x40, 0x29, 0x8f, 0xd8, 0x81, + 0x3e, 0x9f, 0xaa, 0x67, 0xec, 0xc0, 0xb7, 0x2d, 0x18, 0x75, 0xde, 0x6a, 0x47, 0x64, 0x81, 0xec, + 0xac, 0x86, 0xb1, 0x10, 0xb0, 0x6f, 0xe4, 0xdf, 0x80, 0x39, 0xcd, 0x44, 0xa4, 0xc9, 0xd5, 0x05, + 0xd8, 0x6c, 0x42, 0x2a, 0x56, 0x60, 0x24, 0x8f, 0x58, 0x81, 0x5e, 0xcd, 0xd9, 0x37, 0x56, 0xe0, + 0x65, 0x18, 0x77, 0x9b, 0x81, 0x4f, 0xd6, 0xa2, 0x20, 0x09, 0xdc, 0xa0, 0x29, 0x94, 0x69, 0x25, + 0x12, 0xe6, 0x4d, 0x20, 0x4e, 0xe3, 0xf6, 0x0b, 0x34, 0xa8, 0x1c, 0x35, 0xd0, 0x00, 0x1e, 0x52, + 0xa0, 0xc1, 0x9f, 0x17, 0x60, 0x7a, 0x9f, 0x8f, 0x8a, 0x5e, 0x82, 0xb1, 0x20, 0x6a, 0x38, 0xbe, + 0xf7, 0x16, 0x8f, 0xf3, 0x2c, 0xa5, 0xd3, 0x70, 0xac, 0x1a, 0x30, 0x9c, 0xc2, 0x94, 0xae, 0xc8, + 0xc3, 0x7d, 0x5c, 0x91, 0x3f, 0x0e, 0xa3, 0x09, 0x71, 0x5a, 0xc2, 0xef, 0x42, 0x18, 0x40, 0xfa, + 0x42, 0x49, 0x83, 0xb0, 0x89, 0x47, 0xa7, 0xd1, 0x84, 0xe3, 0xba, 0x24, 0x8e, 0xa5, 0xaf, 0xb1, + 0x38, 0x9c, 0xc9, 0xcd, 0x91, 0x99, 0x9d, 0x79, 0xcd, 0xa5, 0x58, 0xe0, 0x0c, 0x4b, 0xda, 0x78, + 0xa7, 0xd9, 0xe4, 0x61, 0x05, 0x44, 0xbe, 0xf4, 0xac, 0xb3, 0x42, 0x68, 0x10, 0x36, 0xf1, 0xec, + 0xdf, 0x28, 0xc0, 0x53, 0xf7, 0x15, 0x2f, 0x03, 0xbb, 0x81, 0xb7, 0x63, 0x12, 0x65, 0x2f, 0x64, + 0x6e, 0xc4, 0x24, 0xc2, 0x0c, 0xc2, 0x47, 0x29, 0x0c, 0x8d, 0x27, 0x66, 0xf2, 0x8e, 0x3a, 0xe0, + 0xa3, 0x94, 0x62, 0x81, 0x33, 0x2c, 0xb3, 0xa3, 0x34, 0x34, 0xe0, 0x28, 0xfd, 0xc3, 0x02, 0x3c, + 0x3d, 0x80, 0x10, 0xce, 0x31, 0x3a, 0x23, 0x1d, 0xdd, 0x52, 0x7c, 0x38, 0xd1, 0x2d, 0x87, 0x1d, + 0xae, 0x77, 0x0b, 0x70, 0xae, 0xbf, 0x2c, 0x44, 0x3f, 0x4d, 0x8d, 0x28, 0xe9, 0x6c, 0x61, 0x46, + 0xc6, 0x9c, 0xe2, 0x06, 0x54, 0x0a, 0x84, 0xb3, 0xb8, 0x68, 0x06, 0x20, 0x74, 0x92, 0xad, 0xf8, + 0xd2, 0xae, 0x17, 0x27, 0x22, 0xa6, 0x73, 0x82, 0x1f, 0x85, 0xcb, 0x52, 0x6c, 0x60, 0x50, 0x76, + 0xec, 0xdf, 0x42, 0x70, 0x3d, 0x48, 0x78, 0x25, 0xae, 0xc7, 0x9d, 0x92, 0x79, 0x08, 0x0d, 0x10, + 0xce, 0xe2, 0x52, 0x76, 0xec, 0xb2, 0x85, 0x37, 0x54, 0x3c, 0x63, 0x4f, 0xd9, 0x2d, 0xab, 0x52, + 0x6c, 0x60, 0x64, 0x63, 0x7e, 0x4a, 0x03, 0xc4, 0xfc, 0xfc, 0xd3, 0x02, 0x3c, 0xde, 0x77, 0x2f, + 0x1d, 0x6c, 0x01, 0x3e, 0x7a, 0xc1, 0x3e, 0x87, 0x9b, 0x3b, 0x07, 0x0c, 0x61, 0xf9, 0x93, 0x3e, + 0x33, 0x4d, 0x84, 0xb0, 0x64, 0xb7, 0x0a, 0xeb, 0xa0, 0x5b, 0xc5, 0x23, 0x34, 0x9e, 0x5d, 0x51, + 0x2b, 0x43, 0x07, 0x88, 0x5a, 0xc9, 0x7c, 0x8c, 0xd2, 0x80, 0x0b, 0xf9, 0xfb, 0xfd, 0x87, 0x97, + 0xea, 0xde, 0x03, 0x1d, 0x4f, 0x2d, 0xc0, 0x49, 0xcf, 0x67, 0x39, 0x69, 0xd7, 0xdb, 0x9b, 0x22, + 0xe2, 0xb7, 0x90, 0x7e, 0x6e, 0x69, 0x29, 0x03, 0xc7, 0x5d, 0x35, 0x1e, 0xc1, 0x28, 0xa2, 0x43, + 0x0e, 0xe9, 0x67, 0xa0, 0xa2, 0x68, 0x73, 0xcf, 0x48, 0xf5, 0x41, 0xbb, 0x3c, 0x23, 0xd5, 0xd7, + 0x34, 0xb0, 0xe8, 0x48, 0x6c, 0x93, 0x4e, 0x76, 0x66, 0x5e, 0x23, 0x1d, 0x76, 0x4b, 0x6a, 0x7f, + 0x0c, 0xc6, 0x94, 0x11, 0x39, 0x68, 0xce, 0x54, 0xfb, 0x9d, 0x61, 0x18, 0x4f, 0x65, 0x76, 0x48, + 0x9d, 0xd9, 0x58, 0xfb, 0x9e, 0xd9, 0x30, 0x4f, 0xd7, 0xb6, 0x2f, 0xb3, 0x12, 0x1b, 0x9e, 0xae, + 0x6d, 0x9f, 0x60, 0x0e, 0xa3, 0xa6, 0x7b, 0x2d, 0xea, 0xe0, 0xb6, 0x2f, 0x3c, 0xd2, 0x94, 0xe9, + 0xbe, 0xc0, 0x4a, 0xb1, 0x80, 0xa2, 0x2f, 0x5a, 0x30, 0x16, 0xb3, 0x03, 0x41, 0x7e, 0xe2, 0x25, + 0x3e, 0xe8, 0xd5, 0x3c, 0x5e, 0xd5, 0x15, 0x59, 0x4c, 0xd8, 0x65, 0xb6, 0x59, 0x82, 0x53, 0x1c, + 0xd1, 0x57, 0x2c, 0xf3, 0x3d, 0xe1, 0xe1, 0x3c, 0x3c, 0x29, 0xb3, 0x89, 0x33, 0xf8, 0x51, 0xc9, + 0xfd, 0x9f, 0x15, 0xd6, 0xcf, 0x8c, 0x8f, 0x3c, 0xb8, 0x67, 0xc6, 0x3f, 0x0a, 0x95, 0x96, 0xe3, + 0x7b, 0x75, 0x12, 0x27, 0xfc, 0x84, 0x48, 0xe6, 0xf3, 0x91, 0x85, 0x58, 0xc3, 0xe9, 0x66, 0x17, + 0xb3, 0x8e, 0x25, 0xc6, 0x91, 0x0e, 0xdb, 0xec, 0xd6, 0x75, 0x31, 0x36, 0x71, 0xcc, 0xf3, 0x27, + 0x78, 0xa8, 0xe7, 0x4f, 0xa3, 0xfb, 0x9c, 0x3f, 0xfd, 0x63, 0x0b, 0xce, 0xf4, 0xfc, 0x6a, 0x8f, + 0xae, 0x8f, 0x92, 0xfd, 0x7e, 0x11, 0x4e, 0xf5, 0x48, 0xd1, 0x82, 0x3a, 0xc7, 0xf6, 0x3e, 0xb6, + 0xc8, 0x01, 0x33, 0xde, 0x77, 0x12, 0x1f, 0xec, 0xf4, 0x57, 0x9f, 0xc0, 0x16, 0x1f, 0xec, 0x09, + 0xac, 0x31, 0x2d, 0x87, 0x1e, 0xea, 0xb4, 0x2c, 0xed, 0x33, 0x2d, 0xdf, 0x2f, 0x82, 0xf1, 0xdc, + 0x3d, 0xfa, 0x82, 0x99, 0x36, 0xc9, 0xca, 0x2b, 0xc5, 0x0f, 0x27, 0xae, 0xd2, 0x2e, 0xf1, 0xe6, + 0xf4, 0xca, 0xc2, 0x94, 0x95, 0x00, 0x85, 0x01, 0x24, 0x40, 0x53, 0xe6, 0xa7, 0x2a, 0xe6, 0x9f, + 0x9f, 0xaa, 0x92, 0xcd, 0x4d, 0x85, 0x7e, 0xc7, 0x82, 0xa9, 0x56, 0x9f, 0x3c, 0x8a, 0xf9, 0xa4, + 0x0d, 0xe8, 0x97, 0xa5, 0xb1, 0xfa, 0xe4, 0xdd, 0xbd, 0xe9, 0xbe, 0xe9, 0x2b, 0x71, 0xdf, 0x56, + 0xd9, 0x7f, 0xdb, 0xe2, 0xab, 0x38, 0xf3, 0x15, 0xf4, 0x36, 0x6b, 0xdd, 0x67, 0x9b, 0x7d, 0x8e, + 0xbd, 0xc0, 0x56, 0xbf, 0x42, 0x9c, 0xa6, 0xd8, 0x8e, 0xcd, 0xc7, 0xd4, 0x58, 0x39, 0x56, 0x18, + 0xec, 0xcd, 0x84, 0x66, 0x33, 0xb8, 0x73, 0xa9, 0x15, 0x26, 0x1d, 0xb1, 0x31, 0xeb, 0x37, 0x13, + 0x14, 0x04, 0x1b, 0x58, 0xf6, 0xdf, 0x2d, 0xf0, 0x19, 0x28, 0x2e, 0x29, 0x5f, 0xca, 0x24, 0xe8, + 0x1e, 0xfc, 0x7e, 0xef, 0xf3, 0x00, 0xae, 0x7a, 0x7c, 0x29, 0x9f, 0xc7, 0xf3, 0xf5, 0x63, 0x4e, + 0xe6, 0x8b, 0xee, 0xb2, 0x0c, 0x1b, 0xfc, 0x52, 0x82, 0xa9, 0xb8, 0xaf, 0x60, 0x4a, 0xad, 0xd1, + 0xa1, 0x7d, 0xd6, 0xe8, 0x9f, 0x5b, 0x90, 0x52, 0x2f, 0x50, 0x08, 0x25, 0xda, 0xdc, 0x4e, 0x3e, + 0xef, 0x4a, 0x99, 0xa4, 0xa9, 0x9c, 0x11, 0xd3, 0x9e, 0xfd, 0xc4, 0x9c, 0x11, 0x6a, 0x8a, 0xbb, + 0xcc, 0x42, 0x1e, 0x6f, 0x9f, 0x99, 0x0c, 0xaf, 0x04, 0xc1, 0x36, 0xbf, 0x02, 0xd1, 0xf7, 0xa2, + 0xf6, 0x4b, 0x30, 0xd9, 0xd5, 0x28, 0x96, 0x8b, 0x37, 0x90, 0x8f, 0x69, 0x19, 0xd3, 0x95, 0x05, + 0x14, 0x61, 0x0e, 0xb3, 0xdf, 0xb5, 0xe0, 0x64, 0x96, 0x3c, 0xfa, 0x8e, 0x05, 0x93, 0x71, 0x96, + 0xde, 0x71, 0x8d, 0x9d, 0xf2, 0xf3, 0xe9, 0x02, 0xe1, 0xee, 0x46, 0xd8, 0xff, 0x5f, 0x4c, 0xfe, + 0x5b, 0x9e, 0x5f, 0x0b, 0xee, 0xa8, 0x5d, 0xde, 0xea, 0xbb, 0xcb, 0xd3, 0xf5, 0xe8, 0x6e, 0x91, + 0x5a, 0xbb, 0xd9, 0x15, 0xc9, 0xb4, 0x2e, 0xca, 0xb1, 0xc2, 0x48, 0xbd, 0x5c, 0x5d, 0xdc, 0xf7, + 0xe5, 0xea, 0x17, 0x61, 0xcc, 0x7c, 0x30, 0x4e, 0xcc, 0x4b, 0xa6, 0xdd, 0x9a, 0x6f, 0xcb, 0xe1, + 0x14, 0x56, 0xe6, 0xc9, 0xe0, 0xd2, 0xbe, 0x4f, 0x06, 0x3f, 0x0b, 0x65, 0xf1, 0xfc, 0xad, 0xf4, + 0x86, 0xe3, 0x61, 0x52, 0xa2, 0x0c, 0x2b, 0x28, 0x95, 0x26, 0x2d, 0xc7, 0x6f, 0x3b, 0x4d, 0x3a, + 0x42, 0x22, 0xb6, 0x53, 0x2d, 0xc3, 0x15, 0x05, 0xc1, 0x06, 0x16, 0xed, 0x71, 0xe2, 0xb5, 0xc8, + 0x6b, 0x81, 0x2f, 0xfd, 0x48, 0xf4, 0x01, 0xb1, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x6f, 0x16, 0x64, + 0xdf, 0xee, 0x4c, 0x1d, 0x19, 0x58, 0xfb, 0xc6, 0x93, 0xa6, 0xa3, 0xd1, 0x0a, 0x03, 0x45, 0xa3, + 0x99, 0x81, 0x62, 0xc5, 0xfb, 0x06, 0x8a, 0xfd, 0x84, 0x7e, 0xd1, 0x81, 0x47, 0x94, 0x8d, 0xf6, + 0x7a, 0xcd, 0x01, 0xd9, 0x30, 0xec, 0x3a, 0x2a, 0xe3, 0xc0, 0x18, 0x57, 0xc4, 0xe7, 0xe7, 0x18, + 0x92, 0x80, 0x54, 0x37, 0xdf, 0xfb, 0xe1, 0xf9, 0x0f, 0x7d, 0xff, 0x87, 0xe7, 0x3f, 0xf4, 0x47, + 0x3f, 0x3c, 0xff, 0xa1, 0x2f, 0xde, 0x3d, 0x6f, 0xbd, 0x77, 0xf7, 0xbc, 0xf5, 0xfd, 0xbb, 0xe7, + 0xad, 0x3f, 0xba, 0x7b, 0xde, 0x7a, 0xff, 0xee, 0x79, 0xeb, 0xdb, 0xff, 0xf9, 0xfc, 0x87, 0x5e, + 0xeb, 0xe9, 0xf7, 0x43, 0x7f, 0x3c, 0xef, 0xd6, 0x66, 0x77, 0x2e, 0x32, 0xd7, 0x13, 0xba, 0x1a, + 0x66, 0x8d, 0x29, 0x30, 0x2b, 0x57, 0xc3, 0x5f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x77, 0x62, 0x09, + 0x88, 0xe9, 0xc2, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -5873,6 +5875,13 @@ func (m *ApplicationSetSyncPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.ApplicationsSync != nil { + i -= len(*m.ApplicationsSync) + copy(dAtA[i:], *m.ApplicationsSync) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ApplicationsSync))) + i-- + dAtA[i] = 0x12 + } i-- if m.PreserveResourcesOnDeletion { dAtA[i] = 1 @@ -13028,6 +13037,10 @@ func (m *ApplicationSetSyncPolicy) Size() (n int) { var l int _ = l n += 2 + if m.ApplicationsSync != nil { + l = len(*m.ApplicationsSync) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -15903,6 +15916,7 @@ func (this *ApplicationSetSyncPolicy) String() string { } s := strings.Join([]string{`&ApplicationSetSyncPolicy{`, `PreserveResourcesOnDeletion:` + fmt.Sprintf("%v", this.PreserveResourcesOnDeletion) + `,`, + `ApplicationsSync:` + valueToStringGenerated(this.ApplicationsSync) + `,`, `}`, }, "") return s @@ -21697,6 +21711,39 @@ func (m *ApplicationSetSyncPolicy) Unmarshal(dAtA []byte) error { } } m.PreserveResourcesOnDeletion = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ApplicationsSync", 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 + } + s := ApplicationsSyncPolicy(dAtA[iNdEx:postIndex]) + m.ApplicationsSync = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index 729f684b2d101..6e7e1d5104fa4 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -307,6 +307,11 @@ message ApplicationSetStrategy { message ApplicationSetSyncPolicy { // PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted. optional bool preserveResourcesOnDeletion = 1; + + // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Enum=create-only;create-update;create-delete;sync + optional string applicationsSync = 2; } // ApplicationSetTemplate represents argocd ApplicationSpec diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index e9c422a9fdfee..ba0487ba58469 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -1215,6 +1215,13 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetSyncPolicy(ref common.Re Format: "", }, }, + "applicationsSync": { + SchemaProps: spec.SchemaProps{ + Description: "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index 15cc07f3c19f3..c5fe7cb52256e 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -625,7 +625,7 @@ func (in *ApplicationSetSpec) DeepCopyInto(out *ApplicationSetSpec) { if in.SyncPolicy != nil { in, out := &in.SyncPolicy, &out.SyncPolicy *out = new(ApplicationSetSyncPolicy) - **out = **in + (*in).DeepCopyInto(*out) } if in.Strategy != nil { in, out := &in.Strategy, &out.Strategy @@ -699,6 +699,11 @@ func (in *ApplicationSetStrategy) DeepCopy() *ApplicationSetStrategy { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ApplicationSetSyncPolicy) DeepCopyInto(out *ApplicationSetSyncPolicy) { *out = *in + if in.ApplicationsSync != nil { + in, out := &in.ApplicationsSync, &out.ApplicationsSync + *out = new(ApplicationsSyncPolicy) + **out = **in + } return } diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 913eb73079de1..5fa31c7b7609a 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -228,6 +228,312 @@ func TestSimpleListGeneratorGoTemplate(t *testing.T) { } +func TestSyncPolicyCreateUpdate(t *testing.T) { + + expectedApp := argov1alpha1.Application{ + TypeMeta: metav1.TypeMeta{ + Kind: "Application", + APIVersion: "argoproj.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "my-cluster-guestbook-sync-policy-create-update", + Namespace: utils.ArgoCDNamespace, + Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + }, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "https://kubernetes.default.svc", + Namespace: "guestbook", + }, + }, + } + var expectedAppNewNamespace *argov1alpha1.Application + var expectedAppNewMetadata *argov1alpha1.Application + + Given(t). + // Create a ListGenerator-based ApplicationSet + When().Create(v1alpha1.ApplicationSet{ObjectMeta: metav1.ObjectMeta{ + Name: "sync-policy-create-update", + }, + Spec: v1alpha1.ApplicationSetSpec{ + GoTemplate: true, + Template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster}}-guestbook-sync-policy-create-update"}, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "{{.url}}", + Namespace: "guestbook", + }, + }, + }, + Generators: []v1alpha1.ApplicationSetGenerator{ + { + List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }, + }, + }, + }, + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{expectedApp})). + + // Update the ApplicationSet template namespace, and verify it updates the Applications + When(). + And(func() { + expectedAppNewNamespace = expectedApp.DeepCopy() + expectedAppNewNamespace.Spec.Destination.Namespace = "guestbook2" + }). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Spec.Destination.Namespace = "guestbook2" + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // Update the metadata fields in the appset template + // Update as well the policy + // As policy is create-update, updates must reflected + When(). + And(func() { + expectedAppNewMetadata = expectedAppNewNamespace.DeepCopy() + expectedAppNewMetadata.ObjectMeta.Annotations = map[string]string{"annotation-key": "annotation-value"} + expectedAppNewMetadata.ObjectMeta.Labels = map[string]string{"label-key": "label-value"} + }). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} + appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ + ApplicationsSync: &applicationsSyncPolicy, + } + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewMetadata})). + + // Update the list and remove element + // As policy is create-update, app deletion must not be reflected + When(). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Generators = []v1alpha1.ApplicationSetGenerator{} + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewMetadata})). + + // verify the ApplicationSet status conditions were set correctly + Expect(ApplicationSetHasConditions("sync-policy-create-update", ExpectedConditions)). + + // Delete the ApplicationSet, and verify it deletes the Applications + When(). + Delete().Then().Expect(ApplicationsDoNotExist([]argov1alpha1.Application{*expectedAppNewMetadata})) + +} + +func TestSyncPolicyCreateDelete(t *testing.T) { + + expectedApp := argov1alpha1.Application{ + TypeMeta: metav1.TypeMeta{ + Kind: "Application", + APIVersion: "argoproj.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "my-cluster-guestbook-sync-policy-create-delete", + Namespace: utils.ArgoCDNamespace, + Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + }, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "https://kubernetes.default.svc", + Namespace: "guestbook", + }, + }, + } + var expectedAppNewNamespace *argov1alpha1.Application + + Given(t). + // Create a ListGenerator-based ApplicationSet + When().Create(v1alpha1.ApplicationSet{ObjectMeta: metav1.ObjectMeta{ + Name: "sync-policy-create-delete", + }, + Spec: v1alpha1.ApplicationSetSpec{ + GoTemplate: true, + Template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster}}-guestbook-sync-policy-create-delete"}, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "{{.url}}", + Namespace: "guestbook", + }, + }, + }, + Generators: []v1alpha1.ApplicationSetGenerator{ + { + List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }, + }, + }, + }, + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{expectedApp})). + + // Update the ApplicationSet template namespace, and verify it updates the Applications + When(). + And(func() { + expectedAppNewNamespace = expectedApp.DeepCopy() + expectedAppNewNamespace.Spec.Destination.Namespace = "guestbook2" + }). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Spec.Destination.Namespace = "guestbook2" + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // Update the metadata fields in the appset template + // Update as well the policy + // As policy is create-delete, updates must not be reflected + When(). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} + appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ + ApplicationsSync: &applicationsSyncPolicy, + } + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // Update the list and remove element + // As policy is create-delete, app deletion must be reflected + When(). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Generators = []v1alpha1.ApplicationSetGenerator{} + }).Then().Expect(ApplicationsDoNotExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // verify the ApplicationSet status conditions were set correctly + Expect(ApplicationSetHasConditions("sync-policy-create-delete", ExpectedConditions)). + + // Delete the ApplicationSet + When(). + Delete().Then().Expect(ApplicationsDoNotExist([]argov1alpha1.Application{*expectedAppNewNamespace})) + +} + +func TestSyncPolicyCreateOnly(t *testing.T) { + + expectedApp := argov1alpha1.Application{ + TypeMeta: metav1.TypeMeta{ + Kind: "Application", + APIVersion: "argoproj.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "my-cluster-guestbook-sync-policy-create-only", + Namespace: utils.ArgoCDNamespace, + Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + }, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "https://kubernetes.default.svc", + Namespace: "guestbook", + }, + }, + } + var expectedAppNewNamespace *argov1alpha1.Application + + Given(t). + // Create a ListGenerator-based ApplicationSet + When().Create(v1alpha1.ApplicationSet{ObjectMeta: metav1.ObjectMeta{ + Name: "sync-policy-create-only", + }, + Spec: v1alpha1.ApplicationSetSpec{ + GoTemplate: true, + Template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{Name: "{{.cluster}}-guestbook-sync-policy-create-only"}, + Spec: argov1alpha1.ApplicationSpec{ + Project: "default", + Source: &argov1alpha1.ApplicationSource{ + RepoURL: "https://github.com/argoproj/argocd-example-apps.git", + TargetRevision: "HEAD", + Path: "guestbook", + }, + Destination: argov1alpha1.ApplicationDestination{ + Server: "{{.url}}", + Namespace: "guestbook", + }, + }, + }, + Generators: []v1alpha1.ApplicationSetGenerator{ + { + List: &v1alpha1.ListGenerator{ + Elements: []apiextensionsv1.JSON{{ + Raw: []byte(`{"cluster": "my-cluster","url": "https://kubernetes.default.svc"}`), + }}, + }, + }, + }, + }, + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{expectedApp})). + + // Update the ApplicationSet template namespace, and verify it updates the Applications + When(). + And(func() { + expectedAppNewNamespace = expectedApp.DeepCopy() + expectedAppNewNamespace.Spec.Destination.Namespace = "guestbook2" + }). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Spec.Destination.Namespace = "guestbook2" + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // Update the metadata fields in the appset template + // Update as well the policy + // As policy is create-only, updates must not be reflected + When(). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} + appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ + ApplicationsSync: &applicationsSyncPolicy, + } + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // Update the list and remove element + // As policy is create-only, app deletion must not be reflected + When(). + Update(func(appset *v1alpha1.ApplicationSet) { + appset.Spec.Generators = []v1alpha1.ApplicationSetGenerator{} + }).Then().Expect(ApplicationsExist([]argov1alpha1.Application{*expectedAppNewNamespace})). + + // verify the ApplicationSet status conditions were set correctly + Expect(ApplicationSetHasConditions("sync-policy-create-only", ExpectedConditions)). + + // Delete the ApplicationSet, and verify it deletes the Applications + When(). + Delete().Then().Expect(ApplicationsDoNotExist([]argov1alpha1.Application{*expectedAppNewNamespace})) + +} + func TestSimpleGitDirectoryGenerator(t *testing.T) { generateExpectedApp := func(name string) argov1alpha1.Application { return argov1alpha1.Application{ From 954779ba948f63b257ecde71fa600554567319e5 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Mon, 17 Apr 2023 08:33:22 -0400 Subject: [PATCH 02/18] 11073: Fix Lint 2 Signed-off-by: gmuselli --- .../applicationset_controller_test.go | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index f6b610fbc5467..04d8b6c4a2718 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -1915,7 +1915,7 @@ func TestReconcilerValidationErrorBehaviour(t *testing.T) { ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, } req := ctrl.Request{ @@ -1998,45 +1998,45 @@ func TestSetApplicationSetStatusCondition(t *testing.T) { assert.Len(t, appSet.Status.Conditions, 3) } -func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) argov1alpha1.Application { +func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.Application { scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) + err := v1alpha1.AddToScheme(scheme) assert.Nil(t, err) - err = argov1alpha1.AddToScheme(scheme) + err = v1alpha1.AddToScheme(scheme) assert.Nil(t, err) - defaultProject := argov1alpha1.AppProject{ + defaultProject := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, - Spec: argov1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []argov1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, + Spec: v1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []v1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, } - appSet := argov1alpha1.ApplicationSet{ + appSet := v1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ Name: "name", Namespace: "argocd", }, - Spec: argov1alpha1.ApplicationSetSpec{ - Generators: []argov1alpha1.ApplicationSetGenerator{ + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{ { - List: &argov1alpha1.ListGenerator{ + List: &v1alpha1.ListGenerator{ Elements: []apiextensionsv1.JSON{{ Raw: []byte(`{"cluster": "good-cluster","url": "https://good-cluster"}`), }}, }, }, }, - SyncPolicy: &argov1alpha1.ApplicationSetSyncPolicy{ + SyncPolicy: &v1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, }, - Template: argov1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ + Template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ Name: "{{cluster}}", Namespace: "argocd", }, - Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, + Spec: v1alpha1.ApplicationSpec{ + Source: &v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, Project: "default", - Destination: argov1alpha1.ApplicationDestination{Server: "{{url}}"}, + Destination: v1alpha1.ApplicationDestination{Server: "{{url}}"}, }, }, }, @@ -2047,9 +2047,9 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov argoObjs := []runtime.Object{&defaultProject} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() - goodCluster := argov1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} + goodCluster := v1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} argoDBMock.On("GetCluster", mock.Anything, "https://good-cluster").Return(&goodCluster, nil) - argoDBMock.On("ListClusters", mock.Anything).Return(&argov1alpha1.ClusterList{Items: []argov1alpha1.Cluster{ + argoDBMock.On("ListClusters", mock.Anything).Return(&v1alpha1.ClusterList{Items: []v1alpha1.Cluster{ goodCluster, }}, nil) @@ -2064,7 +2064,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, AllowPolicyOverride: allowPolicyOverride, } @@ -2080,7 +2080,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov assert.Nil(t, err) assert.True(t, resCreate.RequeueAfter == 0) - var app argov1alpha1.Application + var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) @@ -2088,14 +2088,14 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov assert.Equal(t, app.Name, "good-cluster") // Update resource - var retrievedApplicationSet argov1alpha1.ApplicationSet + var retrievedApplicationSet v1alpha1.ApplicationSet err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) assert.Nil(t, err) retrievedApplicationSet.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} retrievedApplicationSet.Spec.Template.Labels = map[string]string{"label-key": "label-value"} - retrievedApplicationSet.Spec.Template.Spec.Source.Helm = &argov1alpha1.ApplicationSourceHelm{ + retrievedApplicationSet.Spec.Template.Spec.Source.Helm = &v1alpha1.ApplicationSourceHelm{ Values: "global.test: test", } @@ -2115,7 +2115,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2126,7 +2126,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateDelete app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2137,7 +2137,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2148,7 +2148,7 @@ func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicySync + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicySync app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2159,7 +2159,7 @@ func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, false) @@ -2168,45 +2168,45 @@ func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *t assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) } -func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) argov1alpha1.ApplicationList { +func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.ApplicationList { scheme := runtime.NewScheme() - err := argov1alpha1.AddToScheme(scheme) + err := v1alpha1.AddToScheme(scheme) assert.Nil(t, err) - err = argov1alpha1.AddToScheme(scheme) + err = v1alpha1.AddToScheme(scheme) assert.Nil(t, err) - defaultProject := argov1alpha1.AppProject{ + defaultProject := v1alpha1.AppProject{ ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "argocd"}, - Spec: argov1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []argov1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, + Spec: v1alpha1.AppProjectSpec{SourceRepos: []string{"*"}, Destinations: []v1alpha1.ApplicationDestination{{Namespace: "*", Server: "https://good-cluster"}}}, } - appSet := argov1alpha1.ApplicationSet{ + appSet := v1alpha1.ApplicationSet{ ObjectMeta: metav1.ObjectMeta{ Name: "name", Namespace: "argocd", }, - Spec: argov1alpha1.ApplicationSetSpec{ - Generators: []argov1alpha1.ApplicationSetGenerator{ + Spec: v1alpha1.ApplicationSetSpec{ + Generators: []v1alpha1.ApplicationSetGenerator{ { - List: &argov1alpha1.ListGenerator{ + List: &v1alpha1.ListGenerator{ Elements: []apiextensionsv1.JSON{{ Raw: []byte(`{"cluster": "good-cluster","url": "https://good-cluster"}`), }}, }, }, }, - SyncPolicy: &argov1alpha1.ApplicationSetSyncPolicy{ + SyncPolicy: &v1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, }, - Template: argov1alpha1.ApplicationSetTemplate{ - ApplicationSetTemplateMeta: argov1alpha1.ApplicationSetTemplateMeta{ + Template: v1alpha1.ApplicationSetTemplate{ + ApplicationSetTemplateMeta: v1alpha1.ApplicationSetTemplateMeta{ Name: "{{cluster}}", Namespace: "argocd", }, - Spec: argov1alpha1.ApplicationSpec{ - Source: &argov1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, + Spec: v1alpha1.ApplicationSpec{ + Source: &v1alpha1.ApplicationSource{RepoURL: "https://github.com/argoproj/argocd-example-apps", Path: "guestbook"}, Project: "default", - Destination: argov1alpha1.ApplicationDestination{Server: "{{url}}"}, + Destination: v1alpha1.ApplicationDestination{Server: "{{url}}"}, }, }, }, @@ -2217,9 +2217,9 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov argoObjs := []runtime.Object{&defaultProject} client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(&appSet).Build() - goodCluster := argov1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} + goodCluster := v1alpha1.Cluster{Server: "https://good-cluster", Name: "good-cluster"} argoDBMock.On("GetCluster", mock.Anything, "https://good-cluster").Return(&goodCluster, nil) - argoDBMock.On("ListClusters", mock.Anything).Return(&argov1alpha1.ClusterList{Items: []argov1alpha1.Cluster{ + argoDBMock.On("ListClusters", mock.Anything).Return(&v1alpha1.ClusterList{Items: []v1alpha1.Cluster{ goodCluster, }}, nil) @@ -2234,7 +2234,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: argov1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, AllowPolicyOverride: allowPolicyOverride, } @@ -2250,7 +2250,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov assert.Nil(t, err) assert.True(t, resCreate.RequeueAfter == 0) - var app argov1alpha1.Application + var app v1alpha1.Application // make sure good app got created err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "good-cluster"}, &app) @@ -2258,12 +2258,12 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov assert.Equal(t, app.Name, "good-cluster") // Update resource - var retrievedApplicationSet argov1alpha1.ApplicationSet + var retrievedApplicationSet v1alpha1.ApplicationSet err = r.Client.Get(context.TODO(), crtclient.ObjectKey{Namespace: "argocd", Name: "name"}, &retrievedApplicationSet) assert.Nil(t, err) - retrievedApplicationSet.Spec.Generators = []argov1alpha1.ApplicationSetGenerator{ + retrievedApplicationSet.Spec.Generators = []v1alpha1.ApplicationSetGenerator{ { - List: &argov1alpha1.ListGenerator{ + List: &v1alpha1.ListGenerator{ Elements: []apiextensionsv1.JSON{}, }, }, @@ -2275,7 +2275,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov resUpdate, err := r.Reconcile(context.Background(), req) assert.Nil(t, err) - var apps argov1alpha1.ApplicationList + var apps v1alpha1.ApplicationList err = r.Client.List(context.TODO(), &apps) assert.Nil(t, err) @@ -2286,7 +2286,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy argov func TestDeleteNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2295,7 +2295,7 @@ func TestDeleteNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { func TestDeleteNotPerformedWithSyncPolicyCreateUpdate(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2304,7 +2304,7 @@ func TestDeleteNotPerformedWithSyncPolicyCreateUpdate(t *testing.T) { func TestDeletePerformedWithSyncPolicyCreateDelete(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateDelete apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) @@ -2313,7 +2313,7 @@ func TestDeletePerformedWithSyncPolicyCreateDelete(t *testing.T) { func TestDeletePerformedWithSyncPolicySync(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicySync + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicySync apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) @@ -2322,7 +2322,7 @@ func TestDeletePerformedWithSyncPolicySync(t *testing.T) { func TestDeletePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, false) From 6aad6fb0e1f961f26b6ac0ea60e04153bbab647b Mon Sep 17 00:00:00 2001 From: gmuselli Date: Mon, 1 May 2023 12:06:47 -0400 Subject: [PATCH 03/18] 11073: Empty Signed-off-by: gmuselli From b67e242955c3386800dcea8daf9d989556afb9a9 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Tue, 2 May 2023 18:19:07 -0400 Subject: [PATCH 04/18] 11073: Empty Signed-off-by: gmuselli From e05858bed7436f1d7f15edb63daad273bb0023ac Mon Sep 17 00:00:00 2001 From: gmuselli Date: Wed, 3 May 2023 07:40:39 -0400 Subject: [PATCH 05/18] 11073: Empty Signed-off-by: gmuselli From 3a209a3c985b5575f998160ed25d6baaad2ca232 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Wed, 3 May 2023 13:59:42 -0400 Subject: [PATCH 06/18] 11073: Empty Signed-off-by: gmuselli From bf7aa4ddb25d9496d39b0a970b9c59129e4d7690 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Wed, 3 May 2023 17:45:01 -0400 Subject: [PATCH 07/18] 11073: Empty Signed-off-by: gmuselli From 2f6a4a22c89c00b21b6a89a2316b6dfc2cf0d466 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Wed, 3 May 2023 18:42:49 -0400 Subject: [PATCH 08/18] 11073: Empty Signed-off-by: gmuselli From f0a23adbeaa6b08a0cbfc1f837ec6c6561cf54f1 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Thu, 4 May 2023 17:37:23 -0400 Subject: [PATCH 09/18] 11073: Empty Signed-off-by: gmuselli From d873bbac1bc474684b3268bfc5f28e0a80bd5c16 Mon Sep 17 00:00:00 2001 From: Geoffrey Muselli Date: Thu, 11 May 2023 08:40:16 -0400 Subject: [PATCH 10/18] 11073: Fix after review Signed-off-by: Geoffrey Muselli --- .../controllers/applicationset_controller.go | 4 +-- .../applicationset_controller_test.go | 26 +++++++++---------- applicationset/utils/policy.go | 14 +++++----- .../v1alpha1/applicationset_types.go | 16 ++++++------ .../v1alpha1/applicationset_types_test.go | 12 ++++----- test/e2e/applicationset_test.go | 6 ++--- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index 81ffce65345f2..980eb19cb652e 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -214,7 +214,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).Update() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).AllowUpdate() { err = r.createOrUpdateInCluster(ctx, applicationSetInfo, validApps) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, @@ -244,7 +244,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).Delete() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).AllowDelete() { err = r.deleteInCluster(ctx, applicationSetInfo, desiredApplications) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index 04d8b6c4a2718..b4b315445673a 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -1915,7 +1915,7 @@ func TestReconcilerValidationErrorBehaviour(t *testing.T) { ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicySync, } req := ctrl.Request{ @@ -2064,7 +2064,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicySync, AllowPolicyOverride: allowPolicyOverride, } @@ -2115,7 +2115,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateOnly app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2126,7 +2126,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateDelete app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2137,7 +2137,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateUpdate app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2148,7 +2148,7 @@ func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicySync + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicySync app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2159,7 +2159,7 @@ func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateOnly app := applicationsUpdateSyncPolicyTest(t, applicationsSyncPolicy, 2, false) @@ -2234,7 +2234,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp ArgoDB: &argoDBMock, ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), KubeClientset: kubeclientset, - Policy: v1alpha1.ApplicationsSyncPolicyPolicySync, + Policy: v1alpha1.ApplicationsSyncPolicySync, AllowPolicyOverride: allowPolicyOverride, } @@ -2286,7 +2286,7 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp func TestDeleteNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateOnly apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 1, true) @@ -2295,7 +2295,7 @@ func TestDeleteNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { func TestDeleteNotPerformedWithSyncPolicyCreateUpdate(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateUpdate apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 2, true) @@ -2304,7 +2304,7 @@ func TestDeleteNotPerformedWithSyncPolicyCreateUpdate(t *testing.T) { func TestDeletePerformedWithSyncPolicyCreateDelete(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateDelete apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) @@ -2313,7 +2313,7 @@ func TestDeletePerformedWithSyncPolicyCreateDelete(t *testing.T) { func TestDeletePerformedWithSyncPolicySync(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicySync + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicySync apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, true) @@ -2322,7 +2322,7 @@ func TestDeletePerformedWithSyncPolicySync(t *testing.T) { func TestDeletePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { - applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := v1alpha1.ApplicationsSyncPolicyCreateOnly apps := applicationsDeleteSyncPolicyTest(t, applicationsSyncPolicy, 3, false) diff --git a/applicationset/utils/policy.go b/applicationset/utils/policy.go index df5f0284b4519..1f9c4d2fecf6e 100644 --- a/applicationset/utils/policy.go +++ b/applicationset/utils/policy.go @@ -6,17 +6,17 @@ import ( // Policies is a registry of available policies. var Policies = map[string]argov1alpha1.ApplicationsSyncPolicy{ - "create-only": argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly, - "create-update": argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate, - "create-delete": argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete, - "sync": argov1alpha1.ApplicationsSyncPolicyPolicySync, + "create-only": argov1alpha1.ApplicationsSyncPolicyCreateOnly, + "create-update": argov1alpha1.ApplicationsSyncPolicyCreateUpdate, + "create-delete": argov1alpha1.ApplicationsSyncPolicyCreateDelete, + "sync": argov1alpha1.ApplicationsSyncPolicySync, // Default is "sync" - "": argov1alpha1.ApplicationsSyncPolicyPolicySync, + "": argov1alpha1.ApplicationsSyncPolicySync, } -func DefaultPolicy(appSetSyncPolicy *argov1alpha1.ApplicationSetSyncPolicy, defaultPolicy argov1alpha1.ApplicationsSyncPolicy, allowPolicyOverride bool) argov1alpha1.ApplicationsSyncPolicy { +func DefaultPolicy(appSetSyncPolicy *argov1alpha1.ApplicationSetSyncPolicy, controllerPolicy argov1alpha1.ApplicationsSyncPolicy, allowPolicyOverride bool) argov1alpha1.ApplicationsSyncPolicy { if appSetSyncPolicy == nil || appSetSyncPolicy.ApplicationsSync == nil || !allowPolicyOverride { - return defaultPolicy + return controllerPolicy } return *appSetSyncPolicy.ApplicationsSync } diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index 9bc64a1cd5293..c3f340bae2036 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -96,18 +96,18 @@ type ApplicationsSyncPolicy string // sync / create-only / create-update / create-delete const ( - ApplicationsSyncPolicyPolicyCreateOnly ApplicationsSyncPolicy = "create-only" - ApplicationsSyncPolicyPolicyCreateUpdate ApplicationsSyncPolicy = "create-update" - ApplicationsSyncPolicyPolicyCreateDelete ApplicationsSyncPolicy = "create-delete" - ApplicationsSyncPolicyPolicySync ApplicationsSyncPolicy = "sync" + ApplicationsSyncPolicyCreateOnly ApplicationsSyncPolicy = "create-only" + ApplicationsSyncPolicyCreateUpdate ApplicationsSyncPolicy = "create-update" + ApplicationsSyncPolicyCreateDelete ApplicationsSyncPolicy = "create-delete" + ApplicationsSyncPolicySync ApplicationsSyncPolicy = "sync" ) -func (s ApplicationsSyncPolicy) Update() bool { - return s == ApplicationsSyncPolicyPolicyCreateUpdate || s == ApplicationsSyncPolicyPolicySync +func (s ApplicationsSyncPolicy) AllowUpdate() bool { + return s == ApplicationsSyncPolicyCreateUpdate || s == ApplicationsSyncPolicySync } -func (s ApplicationsSyncPolicy) Delete() bool { - return s == ApplicationsSyncPolicyPolicySync || s == ApplicationsSyncPolicyPolicyCreateDelete +func (s ApplicationsSyncPolicy) AllowDelete() bool { + return s == ApplicationsSyncPolicySync || s == ApplicationsSyncPolicyCreateDelete } // ApplicationSetSyncPolicy configures how generated Applications will relate to their diff --git a/pkg/apis/application/v1alpha1/applicationset_types_test.go b/pkg/apis/application/v1alpha1/applicationset_types_test.go index bed1631b9aa26..338598791f9b0 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types_test.go +++ b/pkg/apis/application/v1alpha1/applicationset_types_test.go @@ -39,14 +39,14 @@ func newTestAppSet(name, namespace, repo string) *ApplicationSet { } func TestApplicationsSyncPolicy(t *testing.T) { - assert.False(t, ApplicationsSyncPolicyPolicyCreateOnly.Delete()) - assert.False(t, ApplicationsSyncPolicyPolicyCreateOnly.Update()) + assert.False(t, ApplicationsSyncPolicyCreateOnly.AllowDelete()) + assert.False(t, ApplicationsSyncPolicyCreateOnly.AllowUpdate()) - assert.False(t, ApplicationsSyncPolicyPolicyCreateUpdate.Delete()) - assert.True(t, ApplicationsSyncPolicyPolicyCreateUpdate.Update()) + assert.False(t, ApplicationsSyncPolicyCreateUpdate.AllowDelete()) + assert.True(t, ApplicationsSyncPolicyCreateUpdate.AllowUpdate()) - assert.True(t, ApplicationsSyncPolicyPolicySync.Delete()) - assert.True(t, ApplicationsSyncPolicyPolicySync.Update()) + assert.True(t, ApplicationsSyncPolicySync.AllowDelete()) + assert.True(t, ApplicationsSyncPolicySync.AllowUpdate()) } func TestApplicationSetSetConditions(t *testing.T) { diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 6874ccd6802bd..28ce406fb6ada 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -314,7 +314,7 @@ func TestSyncPolicyCreateUpdate(t *testing.T) { Update(func(appset *v1alpha1.ApplicationSet) { appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateUpdate + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyCreateUpdate appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, } @@ -414,7 +414,7 @@ func TestSyncPolicyCreateDelete(t *testing.T) { Update(func(appset *v1alpha1.ApplicationSet) { appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateDelete + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyCreateDelete appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, } @@ -514,7 +514,7 @@ func TestSyncPolicyCreateOnly(t *testing.T) { Update(func(appset *v1alpha1.ApplicationSet) { appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} - applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyPolicyCreateOnly + applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyCreateOnly appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, } From 61de56e2ba3cc1be952d709f50d66f2097dd68c3 Mon Sep 17 00:00:00 2001 From: Geoffrey Muselli Date: Fri, 12 May 2023 13:34:03 -0400 Subject: [PATCH 11/18] 11073: Empty Signed-off-by: Geoffrey Muselli From fa333355a0bc0ef330f0296ab1fdaa62a947182a Mon Sep 17 00:00:00 2001 From: Geoffrey Muselli Date: Wed, 17 May 2023 13:58:01 -0400 Subject: [PATCH 12/18] 11073: Fix after review Signed-off-by: Geoffrey Muselli --- .../commands/applicationset_controller.go | 6 +++--- pkg/apis/application/v1alpha1/applicationset_types.go | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index dd3fc6f4e1aa5..2fa5eed2ba677 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -55,7 +55,7 @@ func NewCommand() *cobra.Command { namespace string argocdRepoServer string policy string - allowPolicyOverride bool + allowPolicyOverride bool debugLog bool dryRun bool enableProgressiveSyncs bool @@ -93,7 +93,7 @@ func NewCommand() *cobra.Command { policyObj, exists := utils.Policies[policy] if !exists { - log.Info("Policy value can be: sync, create-only, create-update, create-delete, '' (sync)") + log.Info("Policy value can be: sync, create-only, create-update, create-delete, default value: sync") os.Exit(1) } @@ -192,7 +192,7 @@ func NewCommand() *cobra.Command { Recorder: mgr.GetEventRecorderFor("applicationset-controller"), Renderer: &utils.Render{}, Policy: policyObj, - AllowPolicyOverride: allowPolicyOverride, + AllowPolicyOverride: allowPolicyOverride, ArgoAppClientset: appSetConfig, KubeClientset: k8sClient, ArgoDB: argoCDDB, diff --git a/pkg/apis/application/v1alpha1/applicationset_types.go b/pkg/apis/application/v1alpha1/applicationset_types.go index c3f340bae2036..fccadaa0b27db 100644 --- a/pkg/apis/application/v1alpha1/applicationset_types.go +++ b/pkg/apis/application/v1alpha1/applicationset_types.go @@ -92,6 +92,7 @@ type ApplicationMatchExpression struct { // "create-update" means applications are only created/Updated. If the generator's result contains update, applications will be updated, but not deleted // "create-delete" means applications are only created/deleted. If the generator's result contains update, applications won't be updated, if it results in deleted applications, the applications will be deleted // "sync" means create/update/deleted. If the generator's result contains update, applications will be updated, if it results in deleted applications, the applications will be deleted +// If no ApplicationsSyncPolicy is defined, it defaults it to sync type ApplicationsSyncPolicy string // sync / create-only / create-update / create-delete @@ -115,7 +116,7 @@ func (s ApplicationsSyncPolicy) AllowDelete() bool { type ApplicationSetSyncPolicy struct { // PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted. PreserveResourcesOnDeletion bool `json:"preserveResourcesOnDeletion,omitempty" protobuf:"bytes,1,name=syncPolicy"` - // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync + // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, create-delete, sync // +kubebuilder:validation:Optional // +kubebuilder:validation:Enum=create-only;create-update;create-delete;sync ApplicationsSync *ApplicationsSyncPolicy `json:"applicationsSync,omitempty" protobuf:"bytes,2,opt,name=applicationsSync,casttype=ApplicationsSyncPolicy"` From 47371458ec559358cdeb5037a34d816727c56940 Mon Sep 17 00:00:00 2001 From: Geoffrey Muselli Date: Wed, 17 May 2023 14:33:19 -0400 Subject: [PATCH 13/18] 11073: Fix doc Signed-off-by: Geoffrey Muselli --- .../applicationset/Controlling-Resource-Modification.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md index d1a7b140388ac..8e1a7302e756e 100644 --- a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md +++ b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md @@ -35,6 +35,7 @@ spec: - Policy `create-only`: Prevents ApplicationSet controller from modifying or deleting Applications. - Policy `create-update`: Prevents ApplicationSet controller from deleting Applications. Update is allowed. - Policy `create-delete`: Prevents ApplicationSet controller from modifying Applications. Delete is allowed. +- Policy `sync`: Update and Delete are allowed. If the controller parameter `--policy` is set, it takes precedence on the field `applicationsSync`. It is possible to allow per ApplicationSet sync policy by setting controller parameter `--allow-policy-override` (default to `false`). From 8811d127a1d4d27cf3005ba1fba6a3e5cc508da1 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Wed, 17 May 2023 17:04:21 -0400 Subject: [PATCH 14/18] 11073: Fix doc Signed-off-by: gmuselli --- assets/swagger.json | 2 +- pkg/apis/application/v1alpha1/generated.proto | 2 +- pkg/apis/application/v1alpha1/openapi_generated.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/swagger.json b/assets/swagger.json index 4dce1ddaed59e..47ddcdd1eedf3 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -5996,7 +5996,7 @@ "properties": { "applicationsSync": { "type": "string", - "title": "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync\n+kubebuilder:validation:Optional\n+kubebuilder:validation:Enum=create-only;create-update;create-delete;sync" + "title": "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, create-delete, sync\n+kubebuilder:validation:Optional\n+kubebuilder:validation:Enum=create-only;create-update;create-delete;sync" }, "preserveResourcesOnDeletion": { "description": "PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted.", diff --git a/pkg/apis/application/v1alpha1/generated.proto b/pkg/apis/application/v1alpha1/generated.proto index d429cfc9e5701..7a895cd086ff0 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -314,7 +314,7 @@ message ApplicationSetSyncPolicy { // PreserveResourcesOnDeletion will preserve resources on deletion. If PreserveResourcesOnDeletion is set to true, these Applications will not be deleted. optional bool preserveResourcesOnDeletion = 1; - // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync + // ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, create-delete, sync // +kubebuilder:validation:Optional // +kubebuilder:validation:Enum=create-only;create-update;create-delete;sync optional string applicationsSync = 2; diff --git a/pkg/apis/application/v1alpha1/openapi_generated.go b/pkg/apis/application/v1alpha1/openapi_generated.go index 3a64b58ced2ec..f67779e1dfc2c 100644 --- a/pkg/apis/application/v1alpha1/openapi_generated.go +++ b/pkg/apis/application/v1alpha1/openapi_generated.go @@ -1253,7 +1253,7 @@ func schema_pkg_apis_application_v1alpha1_ApplicationSetSyncPolicy(ref common.Re }, "applicationsSync": { SchemaProps: spec.SchemaProps{ - Description: "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, sync", + Description: "ApplicationsSync represents the policy applied on the generated applications. Possible values are create-only, create-update, create-delete, sync", Type: []string{"string"}, Format: "", }, From 64d00395512dc36984a61e233c2c2b2d77240d3c Mon Sep 17 00:00:00 2001 From: gmuselli Date: Tue, 13 Jun 2023 08:41:58 -0400 Subject: [PATCH 15/18] 11073: Use enable policy override Signed-off-by: gmuselli --- .../controllers/applicationset_controller.go | 20 +++++++++---------- .../applicationset_controller_test.go | 20 +++++++++---------- applicationset/utils/policy.go | 4 ++-- .../commands/applicationset_controller.go | 6 +++--- ...-applicationset-controller-deployment.yaml | 5 +++++ manifests/core-install.yaml | 5 +++++ manifests/ha/install.yaml | 5 +++++ manifests/ha/namespace-install.yaml | 5 +++++ manifests/install.yaml | 5 +++++ manifests/namespace-install.yaml | 5 +++++ 10 files changed, 55 insertions(+), 25 deletions(-) diff --git a/applicationset/controllers/applicationset_controller.go b/applicationset/controllers/applicationset_controller.go index d004e48f56cd8..0922eb50af96d 100644 --- a/applicationset/controllers/applicationset_controller.go +++ b/applicationset/controllers/applicationset_controller.go @@ -73,14 +73,14 @@ var ( // ApplicationSetReconciler reconciles a ApplicationSet object type ApplicationSetReconciler struct { client.Client - Scheme *runtime.Scheme - Recorder record.EventRecorder - Generators map[string]generators.Generator - ArgoDB db.ArgoDB - ArgoAppClientset appclientset.Interface - KubeClientset kubernetes.Interface - Policy argov1alpha1.ApplicationsSyncPolicy - AllowPolicyOverride bool + Scheme *runtime.Scheme + Recorder record.EventRecorder + Generators map[string]generators.Generator + ArgoDB db.ArgoDB + ArgoAppClientset appclientset.Interface + KubeClientset kubernetes.Interface + Policy argov1alpha1.ApplicationsSyncPolicy + EnablePolicyOverride bool utils.Renderer EnableProgressiveSyncs bool @@ -227,7 +227,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).AllowUpdate() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.EnablePolicyOverride).AllowUpdate() { err = r.createOrUpdateInCluster(ctx, applicationSetInfo, validApps) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, @@ -257,7 +257,7 @@ func (r *ApplicationSetReconciler) Reconcile(ctx context.Context, req ctrl.Reque } } - if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.AllowPolicyOverride).AllowDelete() { + if utils.DefaultPolicy(applicationSetInfo.Spec.SyncPolicy, r.Policy, r.EnablePolicyOverride).AllowDelete() { err = r.deleteInCluster(ctx, applicationSetInfo, desiredApplications) if err != nil { _ = r.setApplicationSetStatusCondition(ctx, diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index edc6dec374a04..b11a1b1519a3a 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -2068,11 +2068,11 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp Generators: map[string]generators.Generator{ "List": generators.NewListGenerator(), }, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - Policy: v1alpha1.ApplicationsSyncPolicySync, - AllowPolicyOverride: allowPolicyOverride, + ArgoDB: &argoDBMock, + ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), + KubeClientset: kubeclientset, + Policy: v1alpha1.ApplicationsSyncPolicySync, + EnablePolicyOverride: allowPolicyOverride, } req := ctrl.Request{ @@ -2238,11 +2238,11 @@ func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp Generators: map[string]generators.Generator{ "List": generators.NewListGenerator(), }, - ArgoDB: &argoDBMock, - ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), - KubeClientset: kubeclientset, - Policy: v1alpha1.ApplicationsSyncPolicySync, - AllowPolicyOverride: allowPolicyOverride, + ArgoDB: &argoDBMock, + ArgoAppClientset: appclientset.NewSimpleClientset(argoObjs...), + KubeClientset: kubeclientset, + Policy: v1alpha1.ApplicationsSyncPolicySync, + EnablePolicyOverride: allowPolicyOverride, } req := ctrl.Request{ diff --git a/applicationset/utils/policy.go b/applicationset/utils/policy.go index 1f9c4d2fecf6e..a06509265a540 100644 --- a/applicationset/utils/policy.go +++ b/applicationset/utils/policy.go @@ -14,8 +14,8 @@ var Policies = map[string]argov1alpha1.ApplicationsSyncPolicy{ "": argov1alpha1.ApplicationsSyncPolicySync, } -func DefaultPolicy(appSetSyncPolicy *argov1alpha1.ApplicationSetSyncPolicy, controllerPolicy argov1alpha1.ApplicationsSyncPolicy, allowPolicyOverride bool) argov1alpha1.ApplicationsSyncPolicy { - if appSetSyncPolicy == nil || appSetSyncPolicy.ApplicationsSync == nil || !allowPolicyOverride { +func DefaultPolicy(appSetSyncPolicy *argov1alpha1.ApplicationSetSyncPolicy, controllerPolicy argov1alpha1.ApplicationsSyncPolicy, enablePolicyOverride bool) argov1alpha1.ApplicationsSyncPolicy { + if appSetSyncPolicy == nil || appSetSyncPolicy.ApplicationsSync == nil || !enablePolicyOverride { return controllerPolicy } return *appSetSyncPolicy.ApplicationsSync diff --git a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go index b79485541aa9e..dcbe09ad80c7e 100644 --- a/cmd/argocd-applicationset-controller/commands/applicationset_controller.go +++ b/cmd/argocd-applicationset-controller/commands/applicationset_controller.go @@ -55,7 +55,7 @@ func NewCommand() *cobra.Command { namespace string argocdRepoServer string policy string - allowPolicyOverride bool + enablePolicyOverride bool debugLog bool dryRun bool enableProgressiveSyncs bool @@ -196,7 +196,7 @@ func NewCommand() *cobra.Command { Recorder: mgr.GetEventRecorderFor("applicationset-controller"), Renderer: &utils.Render{}, Policy: policyObj, - AllowPolicyOverride: allowPolicyOverride, + EnablePolicyOverride: enablePolicyOverride, ArgoAppClientset: appSetConfig, KubeClientset: k8sClient, ArgoDB: argoCDDB, @@ -225,7 +225,7 @@ func NewCommand() *cobra.Command { command.Flags().StringVar(&namespace, "namespace", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_NAMESPACE", ""), "Argo CD repo namespace (default: argocd)") command.Flags().StringVar(&argocdRepoServer, "argocd-repo-server", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_REPO_SERVER", common.DefaultRepoServerAddr), "Argo CD repo server address") command.Flags().StringVar(&policy, "policy", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_POLICY", ""), "Modify how application is synced between the generator and the cluster. Default is 'sync' (create & update & delete), options: 'create-only', 'create-update' (no deletion), 'create-delete' (no update)") - command.Flags().BoolVar(&allowPolicyOverride, "allow-policy-override", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ALLOW_POLICY_OVERRIDE", policy == ""), "For security reason if 'policy' is set, it is not possible to override it at applicationSet level. 'allow-policy-override' allows user to define their own policy") + command.Flags().BoolVar(&enablePolicyOverride, "enable-policy-override", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE", policy == ""), "For security reason if 'policy' is set, it is not possible to override it at applicationSet level. 'allow-policy-override' allows user to define their own policy") command.Flags().BoolVar(&debugLog, "debug", env.ParseBoolFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG", false), "Print debug logs. Takes precedence over loglevel") command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ARGOCD_APPLICATIONSET_CONTROLLER_LOGLEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") diff --git a/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml b/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml index 02b2951a91d88..28b40718938ef 100644 --- a/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml +++ b/manifests/base/applicationset-controller/argocd-applicationset-controller-deployment.yaml @@ -54,6 +54,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index cd6bf72fc4b27..e97fd09788bfb 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -18292,6 +18292,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index 9135547d2798c..6e766e9692d86 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -19529,6 +19529,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index b193db90768c5..19b755758cd62 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -1550,6 +1550,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: diff --git a/manifests/install.yaml b/manifests/install.yaml index 6c42945b3951b..0a3e03731aba3 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -18630,6 +18630,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index a12501e6e89ec..7e6623a32c90b 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -651,6 +651,11 @@ spec: configMapKeyRef: key: applicationsetcontroller.policy name: argocd-cmd-params-cm + - name: ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE + valueFrom: + configMapKeyRef: + key: applicationsetcontroller.enable.policy.override + name: argocd-cmd-params-cm optional: true - name: ARGOCD_APPLICATIONSET_CONTROLLER_DEBUG valueFrom: From a6bbd9a599458da8a1ece4359362c88e1ae61d74 Mon Sep 17 00:00:00 2001 From: gmuselli Date: Tue, 13 Jun 2023 08:56:23 -0400 Subject: [PATCH 16/18] 11073: Fix unit test label Signed-off-by: gmuselli --- .../controllers/applicationset_controller_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/applicationset/controllers/applicationset_controller_test.go b/applicationset/controllers/applicationset_controller_test.go index b11a1b1519a3a..5d37e55ae73ee 100644 --- a/applicationset/controllers/applicationset_controller_test.go +++ b/applicationset/controllers/applicationset_controller_test.go @@ -2100,7 +2100,7 @@ func applicationsUpdateSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alp assert.Nil(t, err) retrievedApplicationSet.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} - retrievedApplicationSet.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + retrievedApplicationSet.Spec.Template.Labels = map[string]string{"argocd.argoproj.io/application-set-name": "name", "label-key": "label-value"} retrievedApplicationSet.Spec.Template.Spec.Source.Helm = &v1alpha1.ApplicationSourceHelm{ Values: "global.test: test", @@ -2128,7 +2128,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateOnly(t *testing.T) { assert.Nil(t, app.Spec.Source.Helm) assert.Nil(t, app.ObjectMeta.Annotations) - assert.Nil(t, app.ObjectMeta.Labels) + assert.Equal(t, map[string]string{"argocd.argoproj.io/application-set-name": "name"}, app.ObjectMeta.Labels) } func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { @@ -2139,7 +2139,7 @@ func TestUpdateNotPerformedWithSyncPolicyCreateDelete(t *testing.T) { assert.Nil(t, app.Spec.Source.Helm) assert.Nil(t, app.ObjectMeta.Annotations) - assert.Nil(t, app.ObjectMeta.Labels) + assert.Equal(t, map[string]string{"argocd.argoproj.io/application-set-name": "name"}, app.ObjectMeta.Labels) } func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { @@ -2150,7 +2150,7 @@ func TestUpdatePerformedWithSyncPolicyCreateUpdate(t *testing.T) { assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) - assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) + assert.Equal(t, map[string]string{"argocd.argoproj.io/application-set-name": "name", "label-key": "label-value"}, app.ObjectMeta.Labels) } func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { @@ -2161,7 +2161,7 @@ func TestUpdatePerformedWithSyncPolicySync(t *testing.T) { assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) - assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) + assert.Equal(t, map[string]string{"argocd.argoproj.io/application-set-name": "name", "label-key": "label-value"}, app.ObjectMeta.Labels) } func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *testing.T) { @@ -2172,7 +2172,7 @@ func TestUpdatePerformedWithSyncPolicyCreateOnlyAndAllowPolicyOverrideFalse(t *t assert.Equal(t, "global.test: test", app.Spec.Source.Helm.Values) assert.Equal(t, map[string]string{"annotation-key": "annotation-value"}, app.ObjectMeta.Annotations) - assert.Equal(t, map[string]string{"label-key": "label-value"}, app.ObjectMeta.Labels) + assert.Equal(t, map[string]string{"argocd.argoproj.io/application-set-name": "name", "label-key": "label-value"}, app.ObjectMeta.Labels) } func applicationsDeleteSyncPolicyTest(t *testing.T, applicationsSyncPolicy v1alpha1.ApplicationsSyncPolicy, recordBuffer int, allowPolicyOverride bool) v1alpha1.ApplicationList { From 18877d1a34f016acf975acd7b50ae8e7eb158baa Mon Sep 17 00:00:00 2001 From: gmuselli Date: Tue, 13 Jun 2023 09:02:56 -0400 Subject: [PATCH 17/18] 11073: Update documentation Signed-off-by: gmuselli --- .../applicationset/Controlling-Resource-Modification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md index 8e1a7302e756e..f43a9dbd359ba 100644 --- a/docs/operator-manual/applicationset/Controlling-Resource-Modification.md +++ b/docs/operator-manual/applicationset/Controlling-Resource-Modification.md @@ -37,7 +37,7 @@ spec: - Policy `create-delete`: Prevents ApplicationSet controller from modifying Applications. Delete is allowed. - Policy `sync`: Update and Delete are allowed. -If the controller parameter `--policy` is set, it takes precedence on the field `applicationsSync`. It is possible to allow per ApplicationSet sync policy by setting controller parameter `--allow-policy-override` (default to `false`). +If the controller parameter `--policy` is set, it takes precedence on the field `applicationsSync`. It is possible to allow per ApplicationSet sync policy by setting variable `ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_POLICY_OVERRIDE` to argocd-cmd-params-cm `applicationsetcontroller.enable.policy.override` or directly with controller parameter `--enable-policy-override` (default to `false`). This does not prevent deletion of Applications if the ApplicationSet is deleted From d39e297688299d86506ad5564f411df24584b5fc Mon Sep 17 00:00:00 2001 From: gmuselli Date: Tue, 13 Jun 2023 10:28:39 -0400 Subject: [PATCH 18/18] 11073: Update e2e Signed-off-by: gmuselli --- test/e2e/applicationset_test.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/test/e2e/applicationset_test.go b/test/e2e/applicationset_test.go index 7d5cb9408d5cb..4922a50d29858 100644 --- a/test/e2e/applicationset_test.go +++ b/test/e2e/applicationset_test.go @@ -254,6 +254,9 @@ func TestSyncPolicyCreateUpdate(t *testing.T) { Name: "my-cluster-guestbook-sync-policy-create-update", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + Labels: map[string]string{ + LabelKeyAppSetInstance: "sync-policy-create-update", + }, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", @@ -322,11 +325,17 @@ func TestSyncPolicyCreateUpdate(t *testing.T) { And(func() { expectedAppNewMetadata = expectedAppNewNamespace.DeepCopy() expectedAppNewMetadata.ObjectMeta.Annotations = map[string]string{"annotation-key": "annotation-value"} - expectedAppNewMetadata.ObjectMeta.Labels = map[string]string{"label-key": "label-value"} + expectedAppNewMetadata.ObjectMeta.Labels = map[string]string{ + LabelKeyAppSetInstance: "sync-policy-create-update", + "label-key": "label-value", + } }). Update(func(appset *v1alpha1.ApplicationSet) { appset.Spec.Template.Annotations = map[string]string{"annotation-key": "annotation-value"} - appset.Spec.Template.Labels = map[string]string{"label-key": "label-value"} + appset.Spec.Template.Labels = map[string]string{ + LabelKeyAppSetInstance: "sync-policy-create-update", + "label-key": "label-value", + } applicationsSyncPolicy := argov1alpha1.ApplicationsSyncPolicyCreateUpdate appset.Spec.SyncPolicy = &argov1alpha1.ApplicationSetSyncPolicy{ ApplicationsSync: &applicationsSyncPolicy, @@ -360,6 +369,9 @@ func TestSyncPolicyCreateDelete(t *testing.T) { Name: "my-cluster-guestbook-sync-policy-create-delete", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + Labels: map[string]string{ + LabelKeyAppSetInstance: "sync-policy-create-delete", + }, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default", @@ -460,6 +472,9 @@ func TestSyncPolicyCreateOnly(t *testing.T) { Name: "my-cluster-guestbook-sync-policy-create-only", Namespace: utils.ArgoCDNamespace, Finalizers: []string{"resources-finalizer.argocd.argoproj.io"}, + Labels: map[string]string{ + LabelKeyAppSetInstance: "sync-policy-create-only", + }, }, Spec: argov1alpha1.ApplicationSpec{ Project: "default",