diff --git a/.dockerignore b/.dockerignore index e778fce267438..12e17715871ca 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,6 +17,8 @@ manifests/ hack/ docs/ examples/ +.dockerignore +.git/ .github/ !test/container !test/e2e/testdata diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b306343920656..4ddcc9e3afb64 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -5,7 +5,7 @@ contact_links: url: https://argo-cd.readthedocs.io/ about: Much help can be found in the docs - name: Ask a question - url: https://github.com/argoproj/argo-cd/discussions/new + url: https://github.com/codefresh-io/argo-cd/discussions/new about: Ask a question or start a discussion about Argo CD - name: Chat on Slack url: https://argoproj.github.io/community/join-slack diff --git a/.github/workflows/ci-build.yaml b/.github/workflows/ci-build.yaml index 8f04dd83dd564..c3d588cd73647 100644 --- a/.github/workflows/ci-build.yaml +++ b/.github/workflows/ci-build.yaml @@ -2,14 +2,16 @@ name: Integration tests on: push: branches: - - 'master' - - 'release-*' - - '!release-1.4' - - '!release-1.5' + - 'sync-*' + # - 'master' + # - 'release-*' + # - '!release-1.4' + # - '!release-1.5' pull_request: branches: - - 'master' - - 'release-*' + - 'sync-*' + # - 'master' + # - 'release-*' env: # Golang version to use across CI steps @@ -383,7 +385,7 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - name: Upload test results to Codecov - if: github.ref == 'refs/heads/master' && github.event_name == 'push' && github.repository == 'argoproj/argo-cd' + if: startsWith(github.ref, 'refs/heads/sync-') && github.event_name == 'push' && github.repository == 'codefresh-io/argo-cd' uses: codecov/test-results-action@9739113ad922ea0a9abb4b2c0f8bf6a4aa8ef820 # v1.0.1 with: file: test-results/junit.xml @@ -394,7 +396,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} uses: SonarSource/sonarqube-scan-action@bfd4e558cda28cda6b5defafb9232d191be8c203 # v4.2.1 - if: env.sonar_secret != '' + if: false && env.sonar_secret != '' test-e2e: name: Run end-to-end tests if: ${{ needs.changes.outputs.backend == 'true' }} diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml index 525f52ab25874..233d5f3c63449 100644 --- a/.github/workflows/image.yaml +++ b/.github/workflows/image.yaml @@ -3,10 +3,10 @@ name: Image on: push: branches: - - master + - sync-* pull_request: branches: - - master + - sync-* types: [labeled, unlabeled, opened, synchronize, reopened] concurrency: @@ -19,17 +19,25 @@ jobs: set-vars: permissions: contents: read - if: github.repository == 'argoproj/argo-cd' + if: github.repository == 'codefresh-io/argo-cd' runs-on: ubuntu-22.04 outputs: - image-tag: ${{ steps.image.outputs.tag}} + image-tag: ${{ steps.image-pr.outputs.tag || steps.image-push.outputs.tag }} platforms: ${{ steps.platforms.outputs.platforms }} steps: - uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 - - name: Set image tag for ghcr - run: echo "tag=$(cat ./VERSION)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT - id: image + - name: Set image tag (push to feature branch) + if: ${{ github.repository == 'codefresh-io/argo-cd' && github.event_name == 'pull_request' }} + run: | + CLEAN_REF=$(echo "${{ github.head_ref }}" | sed 's|^refs/[^/]*||; s|/|_|g') + echo "tag=v$(cat ./VERSION)-${CLEAN_REF}-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + id: image-pr + + - name: Set image tag (push to sync-* branch) + if: ${{ github.repository == 'codefresh-io/argo-cd' && github.event_name == 'push' }} + run: echo "tag=v$(cat ./VERSION)-$(date +%Y-%m-%d)-${GITHUB_SHA::8}" >> $GITHUB_OUTPUT + id: image-push - name: Determine image platforms to use id: platforms @@ -48,7 +56,7 @@ jobs: contents: read packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags id-token: write # for creating OIDC tokens for signing. - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name != 'push' }} + if: ${{ false }} uses: ./.github/workflows/image-reuse.yaml with: # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) @@ -63,11 +71,11 @@ jobs: contents: read packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags id-token: write # for creating OIDC tokens for signing. - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ github.repository == 'codefresh-io/argo-cd' }} uses: ./.github/workflows/image-reuse.yaml with: - quay_image_name: quay.io/argoproj/argocd:latest - ghcr_image_name: ghcr.io/argoproj/argo-cd/argocd:${{ needs.set-vars.outputs.image-tag }} + quay_image_name: ${{ github.event_name == 'pull_request' && 'quay.io/codefresh/dev/argocd' || 'quay.io/codefresh/argocd' }}:${{ needs.set-vars.outputs.image-tag }} + # ghcr_image_name: ghcr.io/codefresh-io/argo-cd/argocd:${{ needs.set-vars.outputs.image-tag }} # Note: cannot use env variables to set go-version (https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations) # renovate: datasource=golang-version packageName=golang go-version: 1.24.1 @@ -86,7 +94,7 @@ jobs: actions: read # for detecting the Github Actions environment. id-token: write # for creating OIDC tokens for signing. packages: write # for uploading attestations. (https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#known-issues) - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ false }} # Must be refernced by a tag. https://github.com/slsa-framework/slsa-github-generator/blob/main/internal/builders/container/README.md#referencing-the-slsa-generator uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.0.0 with: @@ -103,7 +111,7 @@ jobs: permissions: contents: write # for git to push upgrade commit if not already deployed packages: write # for pushing packages to GHCR, which is used by cd.apps.argoproj.io to avoid polluting Quay with tags - if: ${{ github.repository == 'argoproj/argo-cd' && github.event_name == 'push' }} + if: ${{ false }} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@8410ad0602e1e429cee44a835ae9f77f654a6694 # v4.0.0 diff --git a/.mockery.yaml b/.mockery.yaml index b92b7770f822e..f3e3ab2daad3d 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -6,6 +6,9 @@ mockname: "{{.InterfaceName}}" with-expecter: false # individual interface config packages: + github.com/argoproj/argo-cd/v3/acr_controller/application: + interfaces: + ApplicationClient: github.com/argoproj/argo-cd/v3/applicationset/generators: interfaces: Generator: diff --git a/Dockerfile b/Dockerfile index 8dc1c0331a71e..a3b9f1df69cfb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,15 +43,18 @@ USER root ENV ARGOCD_USER_ID=999 \ DEBIAN_FRONTEND=noninteractive -RUN groupadd -g $ARGOCD_USER_ID argocd && \ +RUN apt-get update && \ + apt-get install curl -y && \ + curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ + apt-get install git-lfs -y && \ + groupadd -g $ARGOCD_USER_ID argocd && \ useradd -r -u $ARGOCD_USER_ID -g argocd argocd && \ mkdir -p /home/argocd && \ chown argocd:0 /home/argocd && \ chmod g=u /home/argocd && \ - apt-get update && \ apt-get dist-upgrade -y && \ apt-get install -y \ - git git-lfs tini gpg tzdata connect-proxy && \ + git tini gpg tzdata connect-proxy && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* @@ -138,6 +141,7 @@ COPY --from=argocd-build /go/src/github.com/argoproj/argo-cd/dist/argocd* /usr/l USER root RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server && \ + ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-change-revision-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-cmp-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex && \ diff --git a/Dockerfile.dev b/Dockerfile.dev index 978304f80fc44..2147433de9732 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -7,6 +7,7 @@ COPY argocd /usr/local/bin/ USER root RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server && \ + ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-change-revision-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex && \ ln -s /usr/local/bin/argocd /usr/local/bin/argocd-notifications && \ diff --git a/Makefile b/Makefile index 8dec6f04a4143..3d1e76b571c26 100644 --- a/Makefile +++ b/Makefile @@ -125,6 +125,7 @@ define run-in-test-client -e GITHUB_TOKEN \ -e GOCACHE=/tmp/go-build-cache \ -e ARGOCD_LINT_GOGC=$(ARGOCD_LINT_GOGC) \ + -e GOSUMDB=off \ -v ${DOCKER_SRC_MOUNT} \ -v ${GOPATH}/pkg/mod:/go/pkg/mod${VOLUME_MOUNT} \ -v ${GOCACHE}:/tmp/go-build-cache${VOLUME_MOUNT} \ @@ -145,7 +146,7 @@ PATH:=$(PATH):$(PWD)/hack # docker image publishing options DOCKER_PUSH?=false -IMAGE_NAMESPACE?= +IMAGE_NAMESPACE?=quay.io/codefresh # perform static compilation STATIC_BUILD?=true # build development images diff --git a/Merge-upstream.md b/Merge-upstream.md new file mode 100644 index 0000000000000..7c7ea117dc2b8 --- /dev/null +++ b/Merge-upstream.md @@ -0,0 +1,60 @@ +## Process of merging upstream changes + +1. create "sync-3.0.2" branch on top of upstream v3.0.2 tag (git checkout -b sync-3.0.2 v3.0.2), push to codefresh-io/argocd +2. create branch "make-cf-changes" on current release (sync-2.14.9 HEAD) +3. rebase onto sync-3.0.2 ("git rebase --onto sync-3.0.2 v2.14.9 make-cf-changes) +4. make a pr from "make-cf-changes" into "sync-3.0.2". + 1. the pr will trigger dev image builds, e2e runs, etc (quay.io/codefresh/dev/argocd) +5. fix conflicts, test, fixes, whatever (by instuction in following section) +6. merge pr + 1. merge will create official image of fork (quay.io/codefresh/argocd) + 2. manually create tag "v3.0.2-YYYY-MM-DD-SHA" + 3. THERE IS NOT GITHUB RELEASE + +## Resolving conflicts during upstream changes merge + +This docs include info about places where codefresh made it's customizations: + +#### General notes: +1. All files that're deleted in our branches - we can keep deleted (accept ours). +2. all `xxx.pb.go` - apply theirs and after resolving conflicts re-generate. + +#### Paths and actions on them +1. `.github/workflows` - accept ours (yours). +2. `applicationset` - accept theirs +3. `assets / swagger` - accept ours. Later run codegen and commit new version +4. `cmd / argocd` - accept ours if files deleted. +5. `cmd / argocd-application-controller` - no custom thing from our side, so just resolve conflicts. +6. `cmd / notifications` - no custom thing from our side, so just accept theirs. +7. `cmd / argocd-repo-server` - includes our changes with codefresh related parameters. +8. `cmd / common` - includes our changes with codefresh related constants (event-reporter) +9. `cmd / controller / application.go` - includes our changes to resource node (to return labels and annotations getResourceTree method) +10. `cmd / controller / state.go` - includes our changes (GetRepoObjs method) +11. `cmd / controller / state_test.go - includes our changes. Replace manifest values with our struct `apiclient.Manifest` +12. `docs` - apply theirs +13. `examples` - apply theirs +14. `hack` - apply theirs +15. `manifests` - accept theirs +16. `notification_controller` - apply theirs +17. `pkg/apis/application/v1alpha` - generatedXXX - apply theirs (than re-generate). types.go - merge (includes our changes with ForceNamespace). +18. `server / application.go` - merge (includes our v1 event-reporter.) +19. `ui` - accept theirs. +20. `util / kustomize` - merge, as it includes ours changes. +21. `mkdocs.yaml` - apply theirs. +22. `go.mod` - merge direct dependencies. go.sum accept theirs. Run go mod tidy. Check `replace` section, perform cleanup if needed. +23. `reposerver / sepository.go` - merge, includes: cf appVersion logic; type manifest struct (with path to file, rawManifest); + + +#### Post actions: +1. run `go mod tidy` +2. run `go mod download` +3. run `go mod vendor` +4. run `make install-tools-local` +5. run `make lint-local` +6. run `make protogen-fast` - because sometimes gogen won't work if types from protogen used +7. run `make codegen` +8. run `make test-local` + +### Thoughts + +1. Revert cherry picks before merges - as they cause issues later if in upstream decided to slightly move some parts of such changes. In this case no conflicts will occur during merge as they on different lines but then you need cleanup them manually. \ No newline at end of file diff --git a/acr_controller/application/client.go b/acr_controller/application/client.go new file mode 100644 index 0000000000000..bd2a23cda7ede --- /dev/null +++ b/acr_controller/application/client.go @@ -0,0 +1,96 @@ +package application_change_revision_controller + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" + + "google.golang.org/grpc" + + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" +) + +type ApplicationClient interface { + GetChangeRevision(ctx context.Context, in *appclient.ChangeRevisionRequest, opts ...grpc.CallOption) (*appclient.ChangeRevisionResponse, error) +} + +type httpApplicationClient struct { + httpClient *http.Client + baseURL string + token string + rootpath string +} + +func NewHTTPApplicationClient(token string, address string, rootpath string) ApplicationClient { + if rootpath != "" && !strings.HasPrefix(rootpath, "/") { + rootpath = "/" + rootpath + } + + if !strings.Contains(address, "http") { + address = "http://" + address + } + + if rootpath != "" { + address = address + rootpath + } + + return &httpApplicationClient{ + httpClient: &http.Client{ + Timeout: 30 * time.Second, + Transport: &http.Transport{ + // Support for insecure connections + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + }, + baseURL: address, + token: token, + rootpath: rootpath, + } +} + +func (c *httpApplicationClient) execute(ctx context.Context, url string, result any) error { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+c.token) + + res, err := c.httpClient.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + + b, _ := io.ReadAll(res.Body) + + isStatusOK := res.StatusCode >= 200 && res.StatusCode < 300 + if !isStatusOK { + return fmt.Errorf("argocd server respond with code %d, msg is: %s", res.StatusCode, string(b)) + } + + err = json.Unmarshal(b, &result) + if err != nil { + return err + } + return nil +} + +func (c *httpApplicationClient) GetChangeRevision(ctx context.Context, in *appclient.ChangeRevisionRequest, _ ...grpc.CallOption) (*appclient.ChangeRevisionResponse, error) { + params := fmt.Sprintf("?appName=%s&namespace=%s¤tRevision=%s&previousRevision=%s", in.GetAppName(), in.GetNamespace(), in.GetCurrentRevision(), in.GetPreviousRevision()) + + url := fmt.Sprintf("%s/api/v1/application/changeRevision%s", c.baseURL, params) + + changeRevisionResponse := &appclient.ChangeRevisionResponse{} + err := c.execute(ctx, url, changeRevisionResponse) + if err != nil { + return nil, err + } + return changeRevisionResponse, nil +} diff --git a/acr_controller/application/mocks/ApplicationClient.go b/acr_controller/application/mocks/ApplicationClient.go new file mode 100644 index 0000000000000..919547dcc023d --- /dev/null +++ b/acr_controller/application/mocks/ApplicationClient.go @@ -0,0 +1,69 @@ +// Code generated by mockery v2.52.4. DO NOT EDIT. + +package mocks + +import ( + application "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + + context "context" + + grpc "google.golang.org/grpc" + + mock "github.com/stretchr/testify/mock" +) + +// ApplicationClient is an autogenerated mock type for the ApplicationClient type +type ApplicationClient struct { + mock.Mock +} + +// GetChangeRevision provides a mock function with given fields: ctx, in, opts +func (_m *ApplicationClient) GetChangeRevision(ctx context.Context, in *application.ChangeRevisionRequest, opts ...grpc.CallOption) (*application.ChangeRevisionResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetChangeRevision") + } + + var r0 *application.ChangeRevisionResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) (*application.ChangeRevisionResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) *application.ChangeRevisionResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*application.ChangeRevisionResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *application.ChangeRevisionRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewApplicationClient creates a new instance of ApplicationClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewApplicationClient(t interface { + mock.TestingT + Cleanup(func()) +}) *ApplicationClient { + mock := &ApplicationClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/acr_controller/controller/broadcaster.go b/acr_controller/controller/broadcaster.go new file mode 100644 index 0000000000000..fa80d0620b756 --- /dev/null +++ b/acr_controller/controller/broadcaster.go @@ -0,0 +1,107 @@ +package application_change_revision_controller + +import ( + "sync" + + log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/watch" + + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" +) + +type subscriber struct { + ch chan *appv1.ApplicationWatchEvent + filters []func(*appv1.ApplicationWatchEvent) bool +} + +func (s *subscriber) matches(event *appv1.ApplicationWatchEvent) bool { + for i := range s.filters { + if !s.filters[i](event) { + return false + } + } + return true +} + +// Broadcaster is an interface for broadcasting application informer watch events to multiple subscribers. +type Broadcaster interface { + Subscribe(ch chan *appv1.ApplicationWatchEvent, filters ...func(event *appv1.ApplicationWatchEvent) bool) func() + OnAdd(any, bool) + OnUpdate(any, any) + OnDelete(any) +} + +type broadcasterHandler struct { + lock sync.Mutex + subscribers []*subscriber +} + +func NewBroadcaster() Broadcaster { + return &broadcasterHandler{} +} + +func (b *broadcasterHandler) notify(event *appv1.ApplicationWatchEvent) { + val, ok := event.Application.Annotations[appv1.AnnotationKeyManifestGeneratePaths] + if !ok || val == "" { + return + } + + // Make a local copy of b.subscribers, then send channel events outside the lock, + // to avoid data race on b.subscribers changes + subscribers := []*subscriber{} + b.lock.Lock() + subscribers = append(subscribers, b.subscribers...) + b.lock.Unlock() + + for _, s := range subscribers { + if s.matches(event) { + select { + case s.ch <- event: + { + // log.Infof("adding application '%s' to channel", event.Application.Name) + } + default: + // drop event if cannot send right away + log.WithField("application", event.Application.Name).Warn("unable to send event notification") + } + } + } +} + +// Subscribe forward application informer watch events to the provided channel. +// The watch events are dropped if no receives are reading events from the channel so the channel must have +// buffer if dropping events is not acceptable. +func (b *broadcasterHandler) Subscribe(ch chan *appv1.ApplicationWatchEvent, filters ...func(event *appv1.ApplicationWatchEvent) bool) func() { + b.lock.Lock() + defer b.lock.Unlock() + subscriber := &subscriber{ch, filters} + b.subscribers = append(b.subscribers, subscriber) + return func() { + b.lock.Lock() + defer b.lock.Unlock() + for i := range b.subscribers { + if b.subscribers[i] == subscriber { + b.subscribers = append(b.subscribers[:i], b.subscribers[i+1:]...) + break + } + } + } +} + +func (b *broadcasterHandler) OnAdd(obj any, _ bool) { + if app, ok := obj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Added}) + } +} + +func (b *broadcasterHandler) OnUpdate(_, newObj any) { + if app, ok := newObj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Modified}) + } +} + +func (b *broadcasterHandler) OnDelete(obj any) { + if app, ok := obj.(*appv1.Application); ok { + b.notify(&appv1.ApplicationWatchEvent{Application: *app, Type: watch.Deleted}) + } +} diff --git a/acr_controller/controller/controller.go b/acr_controller/controller/controller.go new file mode 100644 index 0000000000000..8215665f39912 --- /dev/null +++ b/acr_controller/controller/controller.go @@ -0,0 +1,81 @@ +package application_change_revision_controller + +import ( + "context" + "time" + + log "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + "github.com/argoproj/argo-cd/v3/acr_controller/service" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + servercache "github.com/argoproj/argo-cd/v3/server/cache" +) + +var watchAPIBufferSize = 1000 + +type ACRController interface { + Run(ctx context.Context) +} + +type applicationChangeRevisionController struct { + appBroadcaster Broadcaster + cache *servercache.Cache + appLister applisters.ApplicationLister + applicationServiceClient appclient.ApplicationClient + acrService service.ACRService + applicationClientset appclientset.Interface +} + +func NewApplicationChangeRevisionController(appInformer cache.SharedIndexInformer, cache *servercache.Cache, applicationServiceClient appclient.ApplicationClient, appLister applisters.ApplicationLister, applicationClientset appclientset.Interface) ACRController { + appBroadcaster := NewBroadcaster() + _, err := appInformer.AddEventHandler(appBroadcaster) + if err != nil { + log.Error(err) + } + return &applicationChangeRevisionController{ + appBroadcaster: appBroadcaster, + cache: cache, + applicationServiceClient: applicationServiceClient, + appLister: appLister, + applicationClientset: applicationClientset, + acrService: service.NewACRService(applicationClientset, applicationServiceClient), + } +} + +func (c *applicationChangeRevisionController) Run(ctx context.Context) { + var logCtx log.FieldLogger = log.StandardLogger() + + calculateIfPermitted := func(ctx context.Context, a appv1.Application, eventType watch.EventType) error { //nolint:golint,unparam + if eventType == watch.Bookmark || eventType == watch.Deleted { + return nil // ignore this event + } + + return c.acrService.ChangeRevision(ctx, &a) + } + + // TODO: move to abstraction + eventsChannel := make(chan *appv1.ApplicationWatchEvent, watchAPIBufferSize) + unsubscribe := c.appBroadcaster.Subscribe(eventsChannel) + defer unsubscribe() + for { + select { + case <-ctx.Done(): + return + case event := <-eventsChannel: + // logCtx.Infof("channel size is %d", len(eventsChannel)) + + ctx, cancel := context.WithTimeout(ctx, 2*time.Minute) + err := calculateIfPermitted(ctx, event.Application, event.Type) + if err != nil { + logCtx.WithError(err).Error("failed to calculate change revision") + } + cancel() + } + } +} diff --git a/acr_controller/server.go b/acr_controller/server.go new file mode 100644 index 0000000000000..eb9f7f0150cfb --- /dev/null +++ b/acr_controller/server.go @@ -0,0 +1,206 @@ +package acr_controller + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "time" + + "github.com/redis/go-redis/v9" + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/cache" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + acr_controller "github.com/argoproj/argo-cd/v3/acr_controller/controller" + + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + appinformer "github.com/argoproj/argo-cd/v3/pkg/client/informers/externalversions" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + servercache "github.com/argoproj/argo-cd/v3/server/cache" + "github.com/argoproj/argo-cd/v3/util/healthz" + settings_util "github.com/argoproj/argo-cd/v3/util/settings" +) + +var backoff = wait.Backoff{ + Steps: 5, + Duration: 500 * time.Millisecond, + Factor: 1.0, + Jitter: 0.1, +} + +type ACRServer struct { + ACRServerOpts + + settings *settings_util.ArgoCDSettings + log *log.Entry + appInformer cache.SharedIndexInformer + appLister applisters.ApplicationLister + applicationClientset appclientset.Interface + + // stopCh is the channel which when closed, will shutdown the Event Reporter server + stopCh chan struct{} + serviceSet *ACRServerSet +} + +type ACRServerSet struct{} + +type ACRServerOpts struct { + ListenPort int + ListenHost string + Namespace string + KubeClientset kubernetes.Interface + AppClientset appclientset.Interface + ApplicationServiceClient appclient.ApplicationClient + Cache *servercache.Cache + RedisClient *redis.Client + ApplicationNamespaces []string + BaseHRef string + RootPath string +} + +type handlerSwitcher struct { + handler http.Handler + urlToHandler map[string]http.Handler + contentTypeToHandler map[string]http.Handler +} + +type Listeners struct { + Main net.Listener +} + +func (l *Listeners) Close() error { + if l.Main != nil { + if err := l.Main.Close(); err != nil { + return err + } + l.Main = nil + } + return nil +} + +func (s *handlerSwitcher) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if urlHandler, ok := s.urlToHandler[r.URL.Path]; ok { + urlHandler.ServeHTTP(w, r) + } else if contentHandler, ok := s.contentTypeToHandler[r.Header.Get("content-type")]; ok { + contentHandler.ServeHTTP(w, r) + } else { + s.handler.ServeHTTP(w, r) + } +} + +func (a *ACRServer) healthCheck(_ *http.Request) error { + return nil +} + +// Init starts informers used by the API server +func (a *ACRServer) Init(ctx context.Context) { + go a.appInformer.Run(ctx.Done()) + svcSet := newApplicationChangeRevisionServiceSet() + a.serviceSet = svcSet +} + +func (a *ACRServer) RunController(ctx context.Context) { + controller := acr_controller.NewApplicationChangeRevisionController(a.appInformer, a.Cache, a.ApplicationServiceClient, a.appLister, a.applicationClientset) + go controller.Run(ctx) +} + +// newHTTPServer returns the HTTP server to serve HTTP/HTTPS requests. This is implemented +// using grpc-gateway as a proxy to the gRPC server. +func (a *ACRServer) newHTTPServer(_ context.Context, port int) *http.Server { //nolint:golint,unparam + endpoint := fmt.Sprintf("localhost:%d", port) + mux := http.NewServeMux() + httpS := http.Server{ + Addr: endpoint, + Handler: &handlerSwitcher{ + handler: mux, + }, + } + + healthz.ServeHealthCheck(mux, a.healthCheck) + return &httpS +} + +func (a *ACRServer) checkServeErr(name string, err error) { + if err != nil { + if a.stopCh != nil { + log.Fatalf("%s: %v", name, err) + } + // a nil stopCh indicates a graceful shutdown + log.Infof("graceful shutdown %s: %v", name, err) + } else { + log.Infof("graceful shutdown %s", name) + } +} + +func startListener(host string, port int) (net.Listener, error) { + var conn net.Listener + var realErr error + _ = wait.ExponentialBackoff(backoff, func() (bool, error) { + conn, realErr = net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) + if realErr != nil { + return false, nil + } + return true, nil + }) + return conn, realErr +} + +func (a *ACRServer) Listen() (*Listeners, error) { + mainLn, err := startListener(a.ListenHost, a.ListenPort) + if err != nil { + return nil, err + } + return &Listeners{Main: mainLn}, nil +} + +// Run runs the API Server +// We use k8s.io/code-generator/cmd/go-to-protobuf to generate the .proto files from the API types. +// k8s.io/ go-to-protobuf uses protoc-gen-gogo, which comes from gogo/protobuf (a fork of +// golang/protobuf). +func (a *ACRServer) Run(ctx context.Context, lns *Listeners) { + httpS := a.newHTTPServer(ctx, a.ListenPort) + tlsConfig := tls.Config{} + tlsConfig.GetCertificate = func(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { + return a.settings.Certificate, nil + } + go func() { a.checkServeErr("httpS", httpS.Serve(lns.Main)) }() + go a.RunController(ctx) + + if !cache.WaitForCacheSync(ctx.Done(), a.appInformer.HasSynced) { + log.Fatal("Timed out waiting for project cache to sync") + } + + a.stopCh = make(chan struct{}) + <-a.stopCh +} + +// NewServer returns a new instance of the Event Reporter server +func NewApplicationChangeRevisionServer(_ context.Context, opts ACRServerOpts) *ACRServer { + appInformerNs := opts.Namespace + if len(opts.ApplicationNamespaces) > 0 { + appInformerNs = "" + } + appFactory := appinformer.NewSharedInformerFactoryWithOptions(opts.AppClientset, 0, appinformer.WithNamespace(appInformerNs), appinformer.WithTweakListOptions(func(_ *metav1.ListOptions) {})) + + appInformer := appFactory.Argoproj().V1alpha1().Applications().Informer() + appLister := appFactory.Argoproj().V1alpha1().Applications().Lister() + + server := &ACRServer{ + ACRServerOpts: opts, + log: log.NewEntry(log.StandardLogger()), + appInformer: appInformer, + appLister: appLister, + applicationClientset: opts.AppClientset, + } + + return server +} + +func newApplicationChangeRevisionServiceSet() *ACRServerSet { + return &ACRServerSet{} +} diff --git a/acr_controller/service/acr_service.go b/acr_controller/service/acr_service.go new file mode 100644 index 0000000000000..bd4c7b60997f1 --- /dev/null +++ b/acr_controller/service/acr_service.go @@ -0,0 +1,202 @@ +package service + +import ( + "context" + "encoding/json" + "sync" + + log "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" + + argoclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + application "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" +) + +type ACRService interface { + ChangeRevision(ctx context.Context, application *application.Application) error +} + +type acrService struct { + applicationClientset appclientset.Interface + applicationServiceClient argoclient.ApplicationClient + lock sync.Mutex + logger *log.Logger +} + +func NewACRService(applicationClientset appclientset.Interface, applicationServiceClient argoclient.ApplicationClient) ACRService { + return &acrService{ + applicationClientset: applicationClientset, + applicationServiceClient: applicationServiceClient, + logger: log.New(), + } +} + +func getChangeRevisionFromRevisions(revisions []string) string { + if len(revisions) > 0 { + return revisions[0] + } + return "" +} + +func getChangeRevision(app *application.Application) string { + if app.Status.OperationState != nil && app.Status.OperationState.Operation.Sync != nil { + changeRevision := app.Status.OperationState.Operation.Sync.ChangeRevision + if changeRevision != "" { + return changeRevision + } + if changeRevision = getChangeRevisionFromRevisions(app.Status.OperationState.Operation.Sync.ChangeRevisions); changeRevision != "" { + return changeRevision + } + } + return "" +} + +func (c *acrService) ChangeRevision(ctx context.Context, a *application.Application) error { + c.lock.Lock() + defer c.lock.Unlock() + + app, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Get(ctx, a.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + if app.Operation == nil || app.Operation.Sync == nil { + return nil + } + + if getChangeRevision(app) != "" { + c.logger.Infof("Change revision already calculated for application %s", app.Name) + return nil + } + + revision, err := c.calculateRevision(ctx, app) + if err != nil { + return err + } + + if revision == nil || *revision == "" { + c.logger.Infof("Revision for application %s is empty", app.Name) + return nil + } + + c.logger.Infof("Change revision for application %s is %s", app.Name, *revision) + + app, err = c.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(ctx, app.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + revisions := []string{*revision} + + if app.Status.OperationState != nil && app.Status.OperationState.Operation.Sync != nil { + c.logger.Infof("Patch operation status for application %s", app.Name) + return c.patchOperationSyncResultWithChangeRevision(ctx, app, revisions) + } + + c.logger.Infof("Patch operation for application %s", app.Name) + return c.patchOperationWithChangeRevision(ctx, app, revisions) +} + +func (c *acrService) calculateRevision(ctx context.Context, a *application.Application) (*string, error) { + currentRevision, previousRevision := c.getRevisions(ctx, a) + c.logger.Infof("Calculate revision for application '%s', current revision '%s', previous revision '%s'", a.Name, currentRevision, previousRevision) + changeRevisionResult, err := c.applicationServiceClient.GetChangeRevision(ctx, &appclient.ChangeRevisionRequest{ + AppName: ptr.To(a.GetName()), + Namespace: ptr.To(a.GetNamespace()), + CurrentRevision: ptr.To(currentRevision), + PreviousRevision: ptr.To(previousRevision), + }) + if err != nil { + return nil, err + } + return changeRevisionResult.Revision, nil +} + +func (c *acrService) patchOperationWithChangeRevision(ctx context.Context, a *application.Application, revisions []string) error { + if len(revisions) == 1 { + patch, _ := json.Marshal(map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevision": revisions[0], + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err + } + + patch, _ := json.Marshal(map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevisions": revisions, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err +} + +func (c *acrService) patchOperationSyncResultWithChangeRevision(ctx context.Context, a *application.Application, revisions []string) error { + if len(revisions) == 1 { + patch, _ := json.Marshal(map[string]any{ + "status": map[string]any{ + "operationState": map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevision": revisions[0], + }, + }, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err + } + + patch, _ := json.Marshal(map[string]any{ + "status": map[string]any{ + "operationState": map[string]any{ + "operation": map[string]any{ + "sync": map[string]any{ + "changeRevisions": revisions, + }, + }, + }, + }, + }) + _, err := c.applicationClientset.ArgoprojV1alpha1().Applications(a.Namespace).Patch(ctx, a.Name, types.MergePatchType, patch, metav1.PatchOptions{}) + return err +} + +func getCurrentRevisionFromOperation(a *application.Application) string { + if a.Operation != nil && a.Operation.Sync != nil { + return a.Operation.Sync.Revision + } + return "" +} + +func (c *acrService) getRevisions(_ context.Context, a *application.Application) (string, string) { + if len(a.Status.History) == 0 { + // it is first sync operation, and we have only current revision + return getCurrentRevisionFromOperation(a), "" + } + + // in case if sync is already done, we need to use revision from sync result and previous revision from history + if a.Status.Sync.Status == "Synced" && a.Status.OperationState != nil && a.Status.OperationState.SyncResult != nil { + currentRevision := a.Status.OperationState.SyncResult.Revision + // in case if we have only one history record, we need to return empty previous revision, because it is first sync result + if len(a.Status.History) == 1 { + return currentRevision, "" + } + return currentRevision, a.Status.History[len(a.Status.History)-2].Revision + } + + // in case if sync is in progress, we need to use revision from operation and revision from latest history record + currentRevision := getCurrentRevisionFromOperation(a) + previousRevision := a.Status.History[len(a.Status.History)-1].Revision + return currentRevision, previousRevision +} diff --git a/acr_controller/service/acr_service_test.go b/acr_controller/service/acr_service_test.go new file mode 100644 index 0000000000000..4ca8dbc60ff2f --- /dev/null +++ b/acr_controller/service/acr_service_test.go @@ -0,0 +1,318 @@ +package service + +import ( + "testing" + + "github.com/sirupsen/logrus" + test2 "github.com/sirupsen/logrus/hooks/test" + + "github.com/argoproj/argo-cd/v3/acr_controller/application/mocks" + appclient "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appsv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + apps "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned/fake" + "github.com/argoproj/argo-cd/v3/test" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + "sigs.k8s.io/yaml" +) + +const fakeApp = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: default +spec: + source: + path: some/path + repoURL: https://github.com/argoproj/argocd-example-apps.git + targetRevision: HEAD + ksonnet: + environment: default + destination: + namespace: ` + test.FakeDestNamespace + ` + server: https://cluster-api.example.com +` + +const fakeAppWithOperation = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +` + +const syncedAppWithSingleHistory = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +status: + history: + - deployStartedAt: "2024-06-20T19:35:36Z" + deployedAt: "2024-06-20T19:35:44Z" + id: 3 + initiatedBy: {} + revision: 792822850fd2f6db63597533e16dfa27e6757dc5 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + operationState: + operation: + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646506 + syncOptions: + - CreateNamespace=true + phase: Running + startedAt: "2024-06-20T19:47:34Z" + syncResult: + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + sync: + revision: 00d423763fbf56d2ea452de7b26a0ab20590f521 + status: Synced +` + +const syncedAppWithHistory = ` +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + annotations: + argocd.argoproj.io/manifest-generate-paths: . + finalizers: + - resources-finalizer.argocd.argoproj.io + labels: + app.kubernetes.io/instance: guestbook + name: guestbook + namespace: codefresh +operation: + initiatedBy: + automated: true + retry: + limit: 5 + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + syncOptions: + - CreateNamespace=true +spec: + destination: + namespace: guestbook + server: https://kubernetes.default.svc + project: default + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD +status: + history: + - deployStartedAt: "2024-06-20T19:35:36Z" + deployedAt: "2024-06-20T19:35:44Z" + id: 3 + initiatedBy: {} + revision: 792822850fd2f6db63597533e16dfa27e6757dc5 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + - deployStartedAt: "2024-06-20T19:36:34Z" + deployedAt: "2024-06-20T19:36:42Z" + id: 4 + initiatedBy: {} + revision: ee5373eb9814e247ec6944e8b8897a8ec2f8528e + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + operationState: + operation: + sync: + prune: true + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646506 + syncOptions: + - CreateNamespace=true + phase: Running + startedAt: "2024-06-20T19:47:34Z" + syncResult: + revision: c732f4d2ef24c7eeb900e9211ff98f90bb646505 + source: + path: apps/guestbook + repoURL: https://github.com/pasha-codefresh/precisely-gitsource.git + targetRevision: HEAD + sync: + revision: 00d423763fbf56d2ea452de7b26a0ab20590f521 + status: Synced +` + +func newTestACRService(client *mocks.ApplicationClient) *acrService { + fakeAppsClientset := apps.NewSimpleClientset(createTestApp(syncedAppWithHistory)) + return &acrService{ + applicationClientset: fakeAppsClientset, + applicationServiceClient: client, + logger: logrus.New(), + } +} + +func createTestApp(testApp string, opts ...func(app *appsv1.Application)) *appsv1.Application { + var app appsv1.Application + err := yaml.Unmarshal([]byte(testApp), &app) + if err != nil { + panic(err) + } + for i := range opts { + opts[i](&app) + } + return &app +} + +func Test_getRevisions(r *testing.T) { + r.Run("history list is empty", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeApp)) + assert.Equal(t, "", current) + assert.Equal(t, "", previous) + }) + + r.Run("history list is empty, but operation happens right now", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(fakeAppWithOperation)) + assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) + assert.Equal(t, "", previous) + }) + + r.Run("history list contains only one element, also sync result is here", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + current, previous := acrService.getRevisions(r.Context(), createTestApp(syncedAppWithSingleHistory)) + assert.Equal(t, "c732f4d2ef24c7eeb900e9211ff98f90bb646505", current) + assert.Equal(t, "", previous) + }) + + r.Run("application is synced", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + app := createTestApp(syncedAppWithHistory) + current, previous := acrService.getRevisions(r.Context(), app) + assert.Equal(t, app.Status.OperationState.SyncResult.Revision, current) + assert.Equal(t, app.Status.History[len(app.Status.History)-2].Revision, previous) + }) + + r.Run("application sync is in progress", func(t *testing.T) { + acrService := newTestACRService(&mocks.ApplicationClient{}) + app := createTestApp(syncedAppWithHistory) + app.Status.Sync.Status = "Syncing" + current, previous := acrService.getRevisions(r.Context(), app) + assert.Equal(t, app.Operation.Sync.Revision, current) + assert.Equal(t, app.Status.History[len(app.Status.History)-1].Revision, previous) + }) +} + +func Test_ChangeRevision(r *testing.T) { + r.Run("Change revision", func(t *testing.T) { + client := &mocks.ApplicationClient{} + client.On("GetChangeRevision", mock.Anything, mock.Anything).Return(&appclient.ChangeRevisionResponse{ + Revision: ptr.To("new-revision"), + }, nil) + acrService := newTestACRService(client) + app := createTestApp(syncedAppWithHistory) + + err := acrService.ChangeRevision(r.Context(), app) + require.NoError(t, err) + + app, err = acrService.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(r.Context(), app.Name, metav1.GetOptions{}) + require.NoError(t, err) + + assert.Equal(t, "new-revision", app.Status.OperationState.Operation.Sync.ChangeRevision) + }) + + r.Run("Change revision already exists", func(t *testing.T) { + client := &mocks.ApplicationClient{} + client.On("GetChangeRevision", mock.Anything, mock.Anything).Return(&appclient.ChangeRevisionResponse{ + Revision: ptr.To("new-revision"), + }, nil) + + logger, logHook := test2.NewNullLogger() + + acrService := newTestACRService(client) + acrService.logger = logger + + app := createTestApp(syncedAppWithHistory) + + err := acrService.ChangeRevision(r.Context(), app) + require.NoError(t, err) + + app, err = acrService.applicationClientset.ArgoprojV1alpha1().Applications(app.Namespace).Get(r.Context(), app.Name, metav1.GetOptions{}) + require.NoError(t, err) + + assert.Equal(t, "new-revision", app.Status.OperationState.Operation.Sync.ChangeRevision) + + err = acrService.ChangeRevision(r.Context(), app) + + require.NoError(t, err) + + lastLogEntry := logHook.LastEntry() + if lastLogEntry == nil { + t.Fatal("No log entry") + } + + require.Equal(t, "Change revision already calculated for application guestbook", lastLogEntry.Message) + }) +} 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 index 8a0975e363539..d0591f08313b3 100644 --- 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 @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 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 index 8a0975e363539..d0591f08313b3 100644 --- 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 @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/applicationset/examples/git-generator-directory/excludes/cluster-addons/exclude-helm-guestbook/values.yaml b/applicationset/examples/git-generator-directory/excludes/cluster-addons/exclude-helm-guestbook/values.yaml index 3666712aec29b..d0f2bf589b63a 100644 --- a/applicationset/examples/git-generator-directory/excludes/cluster-addons/exclude-helm-guestbook/values.yaml +++ b/applicationset/examples/git-generator-directory/excludes/cluster-addons/exclude-helm-guestbook/values.yaml @@ -5,7 +5,7 @@ replicaCount: 1 image: - repository: gcr.io/heptio-images/ks-guestbook-demo + repository: quay.io/argoprojlabs/argocd-e2e-container tag: 0.1 pullPolicy: IfNotPresent diff --git a/applicationset/examples/git-generator-files-discovery/apps/guestbook/guestbook-ui-deployment.yaml b/applicationset/examples/git-generator-files-discovery/apps/guestbook/guestbook-ui-deployment.yaml index 8a0975e363539..d0591f08313b3 100644 --- a/applicationset/examples/git-generator-files-discovery/apps/guestbook/guestbook-ui-deployment.yaml +++ b/applicationset/examples/git-generator-files-discovery/apps/guestbook/guestbook-ui-deployment.yaml @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/applicationset/examples/list-generator/guestbook/engineering-dev/guestbook-ui-deployment.yaml b/applicationset/examples/list-generator/guestbook/engineering-dev/guestbook-ui-deployment.yaml index 8a0975e363539..d0591f08313b3 100644 --- a/applicationset/examples/list-generator/guestbook/engineering-dev/guestbook-ui-deployment.yaml +++ b/applicationset/examples/list-generator/guestbook/engineering-dev/guestbook-ui-deployment.yaml @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/applicationset/examples/list-generator/guestbook/engineering-prod/guestbook-ui-deployment.yaml b/applicationset/examples/list-generator/guestbook/engineering-prod/guestbook-ui-deployment.yaml index 8a0975e363539..d0591f08313b3 100644 --- a/applicationset/examples/list-generator/guestbook/engineering-prod/guestbook-ui-deployment.yaml +++ b/applicationset/examples/list-generator/guestbook/engineering-prod/guestbook-ui-deployment.yaml @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/applicationset/examples/template-override/default/guestbook-ui-deployment.yaml b/applicationset/examples/template-override/default/guestbook-ui-deployment.yaml index 8a0975e363539..d0591f08313b3 100644 --- a/applicationset/examples/template-override/default/guestbook-ui-deployment.yaml +++ b/applicationset/examples/template-override/default/guestbook-ui-deployment.yaml @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/applicationset/examples/template-override/engineering-dev-override/guestbook-ui-deployment.yaml b/applicationset/examples/template-override/engineering-dev-override/guestbook-ui-deployment.yaml index 8a0975e363539..d0591f08313b3 100644 --- a/applicationset/examples/template-override/engineering-dev-override/guestbook-ui-deployment.yaml +++ b/applicationset/examples/template-override/engineering-dev-override/guestbook-ui-deployment.yaml @@ -14,7 +14,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-ui ports: - containerPort: 80 diff --git a/argocd-cosign.pub b/argocd-cosign.pub new file mode 100644 index 0000000000000..bd14342b9c1b4 --- /dev/null +++ b/argocd-cosign.pub @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEesHEB7vX5Y2RxXypjMy1nI1z7iRG +JI9/gt/sYqzpsa65aaNP4npM43DDxoIy/MQBo9s/mxGxmA+8UXeDpVC9vw== +-----END PUBLIC KEY----- diff --git a/assets/swagger.json b/assets/swagger.json index 0713a867876d3..ffd9a1fc28154 100644 --- a/assets/swagger.json +++ b/assets/swagger.json @@ -218,6 +218,83 @@ } } }, + "/api/v1/application-validate": { + "post": { + "tags": [ + "ApplicationService" + ], + "summary": "Create creates an application", + "operationId": "ApplicationService_ValidateSrcAndDst", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v1alpha1Application" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationApplicationValidateResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, + "/api/v1/application/changeRevision": { + "get": { + "tags": [ + "ApplicationService" + ], + "operationId": "ApplicationService_GetChangeRevision", + "parameters": [ + { + "type": "string", + "name": "appName", + "in": "query" + }, + { + "type": "string", + "name": "namespace", + "in": "query" + }, + { + "type": "string", + "name": "currentRevision", + "in": "query" + }, + { + "type": "string", + "name": "previousRevision", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationChangeRevisionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/applications": { "get": { "tags": [ @@ -1778,6 +1855,45 @@ } } }, + "/api/v1/applications/{name}/rollout-rollback": { + "post": { + "tags": [ + "ApplicationService" + ], + "summary": "Rollback application rollout", + "operationId": "ApplicationService_RollbackApplicationRollout", + "parameters": [ + { + "type": "string", + "name": "name", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/applicationApplicationRolloutRollbackRequest" + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/applicationApplicationRolloutRollbackResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + } + } + }, "/api/v1/applications/{name}/spec": { "put": { "tags": [ @@ -4860,6 +4976,39 @@ } } }, + "applicationApplicationRolloutRollbackRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "rolloutName": { + "type": "string" + }, + "rolloutNamespace": { + "type": "string" + }, + "rolloutRevision": { + "type": "integer", + "format": "int64" + } + } + }, + "applicationApplicationRolloutRollbackResponse": { + "type": "object", + "properties": { + "newRevision": { + "type": "integer", + "format": "int64" + }, + "rollout": { + "type": "string" + } + } + }, "applicationApplicationSyncRequest": { "type": "object", "title": "ApplicationSyncRequest is a request to apply the config state to live state", @@ -4961,6 +5110,25 @@ } } }, + "applicationApplicationValidateResponse": { + "type": "object", + "properties": { + "entity": { + "type": "string" + }, + "error": { + "type": "string" + } + } + }, + "applicationChangeRevisionResponse": { + "type": "object", + "properties": { + "revision": { + "type": "string" + } + } + }, "applicationFileChunk": { "type": "object", "properties": { @@ -8361,6 +8529,9 @@ "buildOptions": { "type": "string", "title": "BuildOptions is a string of build parameters to use when calling `kustomize build`" + }, + "setNamespace": { + "type": "boolean" } } }, diff --git a/cmd/application-change-revision-controller/commands/application_change_revision_controller.go b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go new file mode 100644 index 0000000000000..df084a9a2fc35 --- /dev/null +++ b/cmd/application-change-revision-controller/commands/application_change_revision_controller.go @@ -0,0 +1,158 @@ +package commands + +import ( + "context" + "fmt" + "time" + + acr "github.com/argoproj/argo-cd/v3/acr_controller" + cacheutil "github.com/argoproj/argo-cd/v3/util/cache" + + "github.com/argoproj/pkg/stats" + "github.com/redis/go-redis/v9" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + + appclient "github.com/argoproj/argo-cd/v3/acr_controller/application" + + cmdutil "github.com/argoproj/argo-cd/v3/cmd/util" + "github.com/argoproj/argo-cd/v3/common" + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + appclientset "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned" + servercache "github.com/argoproj/argo-cd/v3/server/cache" + "github.com/argoproj/argo-cd/v3/util/cli" + "github.com/argoproj/argo-cd/v3/util/env" + "github.com/argoproj/argo-cd/v3/util/errors" + "github.com/argoproj/argo-cd/v3/util/kube" +) + +const ( + failureRetryCountEnv = "EVENT_REPORTER_K8S_RETRY_COUNT" + failureRetryPeriodMilliSecondsEnv = "EVENT_REPORTE_K8S_RETRY_DURATION_MILLISECONDS" +) + +var ( + failureRetryCount = 0 + failureRetryPeriodMilliSeconds = 100 +) + +func init() { + failureRetryCount = env.ParseNumFromEnv(failureRetryCountEnv, failureRetryCount, 0, 10) + failureRetryPeriodMilliSeconds = env.ParseNumFromEnv(failureRetryPeriodMilliSecondsEnv, failureRetryPeriodMilliSeconds, 0, 1000) +} + +func getApplicationClient(address, token string, path string) appclient.ApplicationClient { + return appclient.NewHTTPApplicationClient(token, address, path) +} + +// NewCommand returns a new instance of an application change revision command +func NewCommand() *cobra.Command { + var ( + redisClient *redis.Client + listenHost string + listenPort int + glogLevel int + clientConfig clientcmd.ClientConfig + applicationServerAddress string + cacheSrc func() (*servercache.Cache, error) + contentSecurityPolicy string + applicationNamespaces []string + argocdToken string + rootpath string + ) + command := &cobra.Command{ + Use: cliName, + Short: "Run the Change Revision Controller server", + Long: "The Change Revision Controller is a service that listens for application events and updates the application's revision in the application CRD", + DisableAutoGenTag: true, + Run: func(c *cobra.Command, _ []string) { + ctx := c.Context() + + vers := common.GetVersion() + namespace, _, err := clientConfig.Namespace() + errors.CheckError(err) + vers.LogStartupInfo( + "Application Change Revision Controller", + map[string]any{ + "namespace": namespace, + "port": listenPort, + }, + ) + + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) + cli.SetGLogLevel(glogLevel) + + config, err := clientConfig.ClientConfig() + errors.CheckError(err) + errors.CheckError(v1alpha1.SetK8SConfigDefaults(config)) + + cache, err := cacheSrc() + errors.CheckError(err) + + kubeclientset := kubernetes.NewForConfigOrDie(config) + + appclientsetConfig, err := clientConfig.ClientConfig() + errors.CheckError(err) + errors.CheckError(v1alpha1.SetK8SConfigDefaults(appclientsetConfig)) + config.UserAgent = fmt.Sprintf("argocd-server/%s (%s)", vers.Version, vers.Platform) + + if failureRetryCount > 0 { + appclientsetConfig = kube.AddFailureRetryWrapper(appclientsetConfig, failureRetryCount, failureRetryPeriodMilliSeconds) + } + appClientSet := appclientset.NewForConfigOrDie(appclientsetConfig) + + changeRevisionServerOpts := acr.ACRServerOpts{ + ListenPort: listenPort, + ListenHost: listenHost, + Namespace: namespace, + KubeClientset: kubeclientset, + AppClientset: appClientSet, + Cache: cache, + RedisClient: redisClient, + ApplicationNamespaces: applicationNamespaces, + ApplicationServiceClient: getApplicationClient(applicationServerAddress, argocdToken, rootpath), + } + + log.Info("Starting change revision controller server") + + stats.RegisterStackDumper() + stats.StartStatsTicker(10 * time.Minute) + stats.RegisterHeapDumper("memprofile") + changeRevisionServer := acr.NewApplicationChangeRevisionServer(ctx, changeRevisionServerOpts) + changeRevisionServer.Init(ctx) + lns, err := changeRevisionServer.Listen() + errors.CheckError(err) + for { + var closer func() + ctx, cancel := context.WithCancel(ctx) + changeRevisionServer.Run(ctx, lns) + cancel() + if closer != nil { + closer() + } + } + }, + } + + clientConfig = cli.AddKubectlFlagsToCmd(command) + command.Flags().StringVar(&rootpath, "argocd-server-path", env.StringFromEnv("ARGOCD_SERVER_ROOTPATH", ""), "Used if Argo CD is running behind reverse proxy under subpath different from /") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", env.StringFromEnv("ACR_CONTROLLER_LOGFORMAT", "text"), "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", env.StringFromEnv("ACR_CONTROLLER_LOG_LEVEL", "info"), "Set the logging level. One of: debug|info|warn|error") + command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level") + command.Flags().StringVar(&applicationServerAddress, "application-server", env.StringFromEnv("ARGOCD_SERVER", common.DefaultApplicationServerAddr), "Application server address") + command.Flags().StringVar(&argocdToken, "argocd-token", env.StringFromEnv("ARGOCD_TOKEN", ""), "ArgoCD server JWT token") + command.AddCommand(cli.NewVersionCmd(cliName)) + command.Flags().StringVar(&listenHost, "address", env.StringFromEnv("ACR_CONTROLLER_LISTEN_ADDRESS", common.DefaultAddressACRController), "Listen on given address") + command.Flags().IntVar(&listenPort, "port", common.DefaultPortACRServer, "Listen on given port") + command.Flags().StringVar(&contentSecurityPolicy, "content-security-policy", env.StringFromEnv("ACR_CONTROLLER_CONTENT_SECURITY_POLICY", "frame-ancestors 'self';"), "Set Content-Security-Policy header in HTTP responses to `value`. To disable, set to \"\".") + command.Flags().StringSliceVar(&applicationNamespaces, "application-namespaces", env.StringsFromEnv("ARGOCD_APPLICATION_NAMESPACES", []string{}, ","), "List of additional namespaces where application resources can be managed in") + cacheSrc = servercache.AddCacheFlagsToCmd(command, cacheutil.Options{ + OnClientCreated: func(client *redis.Client) { + redisClient = client + }, + }) + return command +} diff --git a/cmd/application-change-revision-controller/commands/common.go b/cmd/application-change-revision-controller/commands/common.go new file mode 100644 index 0000000000000..c1ca08e656615 --- /dev/null +++ b/cmd/application-change-revision-controller/commands/common.go @@ -0,0 +1,6 @@ +package commands + +const ( + // cliName is the name of the CLI + cliName = "application-change-revision-controller" +) diff --git a/cmd/argocd/commands/admin/app.go b/cmd/argocd/commands/admin/app.go index bffb68a383a71..2e23274190d9d 100644 --- a/cmd/argocd/commands/admin/app.go +++ b/cmd/argocd/commands/admin/app.go @@ -99,7 +99,7 @@ func NewGenAppSpecCommand() *cobra.Command { argocd admin app generate-spec nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc # Generate declarative config for a Kustomize app - argocd admin app generate-spec kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1 + argocd admin app generate-spec kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image quay.io/argoprojlabs/argocd-e2e-container:0.1 # Generate declarative config for a app using a custom tool: argocd admin app generate-spec kasane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane diff --git a/cmd/argocd/commands/app.go b/cmd/argocd/commands/app.go index 4ed7b4b477b75..7530ef90c08ad 100644 --- a/cmd/argocd/commands/app.go +++ b/cmd/argocd/commands/app.go @@ -143,7 +143,7 @@ func NewApplicationCreateCommand(clientOpts *argocdclient.ClientOptions) *cobra. argocd app create nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc # Create a Kustomize app - argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1 + argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image quay.io/argoprojlabs/argocd-e2e-container:0.1 # Create a MultiSource app while yaml file contains an application with multiple sources argocd app create guestbook --file diff --git a/cmd/argocd/commands/app_test.go b/cmd/argocd/commands/app_test.go index 9bac10bb7c226..bc51b2a02f942 100644 --- a/cmd/argocd/commands/app_test.go +++ b/cmd/argocd/commands/app_test.go @@ -2163,6 +2163,18 @@ func (c *fakeAppServiceClient) RunResourceAction(_ context.Context, _ *applicati return nil, nil } +func (c *fakeAppServiceClient) RollbackApplicationRollout(_ context.Context, _ *applicationpkg.ApplicationRolloutRollbackRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationRolloutRollbackResponse, error) { + return nil, nil +} + +func (c *fakeAppServiceClient) ValidateSrcAndDst(_ context.Context, _ *applicationpkg.ApplicationValidationRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationValidateResponse, error) { + return nil, nil +} + +func (c *fakeAppServiceClient) GetChangeRevision(_ context.Context, _ *applicationpkg.ChangeRevisionRequest, _ ...grpc.CallOption) (*applicationpkg.ChangeRevisionResponse, error) { + return nil, nil +} + func (c *fakeAppServiceClient) DeleteResource(_ context.Context, _ *applicationpkg.ApplicationResourceDeleteRequest, _ ...grpc.CallOption) (*applicationpkg.ApplicationResponse, error) { return nil, nil } diff --git a/cmd/main.go b/cmd/main.go index 182bf116a42e6..2e87893b6ff53 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "k8s.io/klog/v2" + changerevisioncontroller "github.com/argoproj/argo-cd/v3/cmd/application-change-revision-controller/commands" appcontroller "github.com/argoproj/argo-cd/v3/cmd/argocd-application-controller/commands" applicationset "github.com/argoproj/argo-cd/v3/cmd/argocd-applicationset-controller/commands" cmpserver "github.com/argoproj/argo-cd/v3/cmd/argocd-cmp-server/commands" @@ -46,6 +47,8 @@ func main() { isCLI = true case "argocd-server": command = apiserver.NewCommand() + case "argocd-application-change-revision-controller": + command = changerevisioncontroller.NewCommand() case "argocd-application-controller": command = appcontroller.NewCommand() case "argocd-repo-server": diff --git a/common/cf_common.go b/common/cf_common.go new file mode 100644 index 0000000000000..2a5a6c260bd2f --- /dev/null +++ b/common/cf_common.go @@ -0,0 +1,44 @@ +package common + +// Default service addresses and URLS of Argo CD internal services +const ( + // DefaultApplicationServerAddr is the HTTP address of the Argo CD server + DefaultApplicationServerAddr = "argo-cd-server:80" + // DefaultRedisHaProxyAddr is the default HTTP address of the sources server + DefaultSourcesServerAddr = "sources-server:8090" +) + +// Default listener ports for ArgoCD components +const ( + DefaultPortEventReporterServerMetrics = 8087 + DefaultPortEventReporterServer = 8088 + + DefaultPortACRServer = 8090 +) + +// DefaultAddressAPIServer for ArgoCD components +const ( + DefaultAddressEventReporterServer = "0.0.0.0" + DefaultAddressACRController = "0.0.0.0" + DefaultAddressEventReporterServerMetrics = "0.0.0.0" +) + +// Environment variables for tuning and debugging Argo CD +const ( + // EnvApplicationEventCacheDuration controls the expiration of application events cache + EnvApplicationEventCacheDuration = "ARGOCD_APP_EVENTS_CACHE_DURATION" + // EnvResourceEventCacheDuration controls the expiration of resource events cache + EnvResourceEventCacheDuration = "ARGOCD_RESOURCE_EVENTS_CACHE_DURATION" + // EnvEventReporterShardingAlgorithm is the distribution sharding algorithm to be used: legacy + EnvEventReporterShardingAlgorithm = "EVENT_REPORTER_SHARDING_ALGORITHM" + // EnvEventReporterReplicas is the number of EventReporter replicas + EnvEventReporterReplicas = "EVENT_REPORTER_REPLICAS" + // EnvEventReporterShard is the shard number that should be handled by reporter + EnvEventReporterShard = "EVENT_REPORTER_SHARD" +) + +// CF Event reporter constants +const ( + EventReporterLegacyShardingAlgorithm = "legacy" + DefaultEventReporterShardingAlgorithm = EventReporterLegacyShardingAlgorithm +) diff --git a/controller/state.go b/controller/state.go index a5a00e2eb8424..915e0245c7407 100644 --- a/controller/state.go +++ b/controller/state.go @@ -218,7 +218,7 @@ func (m *appStateManager) GetRepoObjs(app *v1alpha1.Application, sources []v1alp if err != nil { return nil, nil, false, fmt.Errorf("failed to get repo %q: %w", source.RepoURL, err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, m.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return nil, nil, false, fmt.Errorf("failed to get Kustomize options for source %d of %d: %w", i+1, len(sources), err) } diff --git a/controller/sync.go b/controller/sync.go index c17503a7ff930..5b9157dd4d4aa 100644 --- a/controller/sync.go +++ b/controller/sync.go @@ -102,6 +102,8 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha var sources []v1alpha1.ApplicationSource revisions := make([]string, 0) + logCtx := log.WithField("application", app.Name) + if state.Operation.Sync == nil { state.Phase = common.OperationFailed state.Message = "Invalid operation request: no operation specified" @@ -145,6 +147,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha syncRes = state.SyncResult revision = state.SyncResult.Revision revisions = append(revisions, state.SyncResult.Revisions...) + logCtx.Infof("Resuming sync operation to revision %s", revision) } else { syncRes = &v1alpha1.SyncOperationResult{} // status.operationState.syncResult.source. must be set properly since auto-sync relies @@ -167,6 +170,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha } } else { if revision == "" { + logCtx.Infof("No previous sync state found, revision is empty. Take revision from operation \"%s\"", syncOp.Revision) revision = syncOp.Revision } } @@ -404,6 +408,7 @@ func (m *appStateManager) SyncAppState(app *v1alpha1.Application, state *v1alpha if state.Phase == common.OperationTerminating { syncCtx.Terminate() } else { + logEntry.Infof("Starting sync operation for revision \"%s\"", compareResult.syncStatus.Revision) syncCtx.Sync() } var resState []common.ResourceSyncResult diff --git a/controller/testdata/live-deployment-env-vars.yaml b/controller/testdata/live-deployment-env-vars.yaml index c4d917b64073c..b72cfad3f8753 100644 --- a/controller/testdata/live-deployment-env-vars.yaml +++ b/controller/testdata/live-deployment-env-vars.yaml @@ -6,7 +6,7 @@ metadata: deployment.kubernetes.io/revision: '9' iksm-version: '2.0' kubectl.kubernetes.io/last-applied-configuration: > - {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"argocd.argoproj.io/tracking-id":"guestbook:apps/Deployment:default/kustomize-guestbook-ui","iksm-version":"2.0"},"name":"kustomize-guestbook-ui","namespace":"default"},"spec":{"replicas":4,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook-ui"}},"template":{"metadata":{"labels":{"app":"guestbook-ui"}},"spec":{"containers":[{"env":[{"name":"SOME_ENV_VAR","value":"some_value"}],"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-ui","ports":[{"containerPort":80}],"resources":{"requests":{"cpu":"50m","memory":"100Mi"}}}]}}}} + {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"argocd.argoproj.io/tracking-id":"guestbook:apps/Deployment:default/kustomize-guestbook-ui","iksm-version":"2.0"},"name":"kustomize-guestbook-ui","namespace":"default"},"spec":{"replicas":4,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook-ui"}},"template":{"metadata":{"labels":{"app":"guestbook-ui"}},"spec":{"containers":[{"env":[{"name":"SOME_ENV_VAR","value":"some_value"}],"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-ui","ports":[{"containerPort":80}],"resources":{"requests":{"cpu":"50m","memory":"100Mi"}}}]}}}} creationTimestamp: '2022-01-05T15:45:21Z' generation: 119 managedFields: @@ -137,7 +137,7 @@ spec: - env: - name: SOME_ENV_VAR value: some_value - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' imagePullPolicy: IfNotPresent name: guestbook-ui ports: diff --git a/controller/testdata/live-deployment.yaml b/controller/testdata/live-deployment.yaml index 731b5b720714c..898dbfaade57d 100644 --- a/controller/testdata/live-deployment.yaml +++ b/controller/testdata/live-deployment.yaml @@ -6,7 +6,7 @@ metadata: deployment.kubernetes.io/revision: '9' iksm-version: '2.0' kubectl.kubernetes.io/last-applied-configuration: > - {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"argocd.argoproj.io/tracking-id":"guestbook:apps/Deployment:default/kustomize-guestbook-ui","iksm-version":"2.0"},"name":"kustomize-guestbook-ui","namespace":"default"},"spec":{"replicas":4,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook-ui"}},"template":{"metadata":{"labels":{"app":"guestbook-ui"}},"spec":{"containers":[{"env":[{"name":"SOME_ENV_VAR","value":"some_value"}],"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-ui","ports":[{"containerPort":80}],"resources":{"requests":{"cpu":"50m","memory":"100Mi"}}}]}}}} + {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"argocd.argoproj.io/tracking-id":"guestbook:apps/Deployment:default/kustomize-guestbook-ui","iksm-version":"2.0"},"name":"kustomize-guestbook-ui","namespace":"default"},"spec":{"replicas":4,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook-ui"}},"template":{"metadata":{"labels":{"app":"guestbook-ui"}},"spec":{"containers":[{"env":[{"name":"SOME_ENV_VAR","value":"some_value"}],"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-ui","ports":[{"containerPort":80}],"resources":{"requests":{"cpu":"50m","memory":"100Mi"}}}]}}}} creationTimestamp: '2022-01-05T15:45:21Z' generation: 119 managedFields: @@ -137,7 +137,7 @@ spec: - env: - name: SOME_ENV_VAR value: some_value - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' imagePullPolicy: IfNotPresent name: guestbook-ui ports: diff --git a/controller/testdata/target-deployment-env-vars.yaml b/controller/testdata/target-deployment-env-vars.yaml index d4b55561adbe7..b01a4ac77e477 100644 --- a/controller/testdata/target-deployment-env-vars.yaml +++ b/controller/testdata/target-deployment-env-vars.yaml @@ -25,7 +25,7 @@ spec: value: yet_another_value - name: SOME_ENV_VAR value: different_value! - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-ui ports: - containerPort: 80 diff --git a/controller/testdata/target-deployment-new-entries.yaml b/controller/testdata/target-deployment-new-entries.yaml index b09ca1c9fbac8..8cda879efe6ad 100644 --- a/controller/testdata/target-deployment-new-entries.yaml +++ b/controller/testdata/target-deployment-new-entries.yaml @@ -19,7 +19,7 @@ spec: spec: containers: - name: guestbook-ui - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' env: - name: SOME_ENV_VAR value: some_value diff --git a/controller/testdata/target-deployment.yaml b/controller/testdata/target-deployment.yaml index 111647f9ac2fd..9e66f17cc712a 100644 --- a/controller/testdata/target-deployment.yaml +++ b/controller/testdata/target-deployment.yaml @@ -21,7 +21,7 @@ spec: - env: - name: SOME_ENV_VAR value: some_value - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-ui ports: - containerPort: 80 diff --git a/docs/operator-manual/application.yaml b/docs/operator-manual/application.yaml index 3ff67f929fd37..a53df8267ac67 100644 --- a/docs/operator-manual/application.yaml +++ b/docs/operator-manual/application.yaml @@ -127,7 +127,7 @@ spec: forceCommonLabels: false forceCommonAnnotations: false images: - - gcr.io/heptio-images/ks-guestbook-demo:0.2 + - quay.io/argoprojlabs/argocd-e2e-container:0.2 - my-app=gcr.io/my-repo/my-app:0.1 namespace: custom-namespace replicas: diff --git a/docs/proposals/manifest-hydrator.md b/docs/proposals/manifest-hydrator.md index 313c92adb78de..2cac775fb5636 100644 --- a/docs/proposals/manifest-hydrator.md +++ b/docs/proposals/manifest-hydrator.md @@ -164,7 +164,7 @@ Argo CD will then group those sources by the configured `syncSource` targetBranc ```go package hydrator -import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" +import "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" type DrySource struct { repoURL string diff --git a/docs/user-guide/commands/argocd_admin_app_generate-spec.md b/docs/user-guide/commands/argocd_admin_app_generate-spec.md index bbb6b71d33036..7d8cc7e32fac4 100644 --- a/docs/user-guide/commands/argocd_admin_app_generate-spec.md +++ b/docs/user-guide/commands/argocd_admin_app_generate-spec.md @@ -25,7 +25,7 @@ argocd admin app generate-spec APPNAME [flags] argocd admin app generate-spec nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc # Generate declarative config for a Kustomize app - argocd admin app generate-spec kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1 + argocd admin app generate-spec kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image quay.io/argoprojlabs/argocd-e2e-container:0.1 # Generate declarative config for a app using a custom tool: argocd admin app generate-spec kasane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane diff --git a/docs/user-guide/commands/argocd_app_create.md b/docs/user-guide/commands/argocd_app_create.md index 017f478f62cac..5529650f86455 100644 --- a/docs/user-guide/commands/argocd_app_create.md +++ b/docs/user-guide/commands/argocd_app_create.md @@ -24,7 +24,7 @@ argocd app create APPNAME [flags] argocd app create nginx-ingress --repo https://charts.helm.sh/stable --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc # Create a Kustomize app - argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1 + argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image quay.io/argoprojlabs/argocd-e2e-container:0.1 # Create a MultiSource app while yaml file contains an application with multiple sources argocd app create guestbook --file diff --git a/docs/user-guide/parameters.md b/docs/user-guide/parameters.md index 3b892782b83c7..5cd2ee6a6b251 100644 --- a/docs/user-guide/parameters.md +++ b/docs/user-guide/parameters.md @@ -65,7 +65,7 @@ Example: ```yaml kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.2 + - quay.io/argoprojlabs/argocd-e2e-container:0.2 ``` The `.argocd-source` is trying to solve two following main use cases: diff --git a/go.mod b/go.mod index 1317394be7c5e..b4bd158cce1a7 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/dlclark/regexp2 v1.11.5 github.com/dustin/go-humanize v1.0.1 github.com/evanphx/json-patch v5.9.11+incompatible - github.com/expr-lang/expr v1.16.9 + github.com/expr-lang/expr v1.17.0 github.com/felixge/httpsnoop v1.0.4 github.com/fsnotify/fsnotify v1.8.0 github.com/gfleury/go-bitbucket-v1 v0.0.0-20240917142304-df385efaac68 @@ -317,6 +317,7 @@ replace ( k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.32.2 k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.32.2 k8s.io/endpointslice => k8s.io/endpointslice v0.32.2 + k8s.io/externaljwt => k8s.io/externaljwt v0.32.2 k8s.io/kms => k8s.io/kms v0.32.2 k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.32.2 k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.32.2 diff --git a/go.sum b/go.sum index 814cd39f710e7..c9098a49e5417 100644 --- a/go.sum +++ b/go.sum @@ -243,8 +243,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= -github.com/expr-lang/expr v1.16.9 h1:WUAzmR0JNI9JCiF0/ewwHB1gmcGw5wW7nWt8gc6PpCI= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/expr-lang/expr v1.17.0 h1:+vpszOyzKLQXC9VF+wA8cVA0tlA984/Wabc/1hF9Whg= +github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= diff --git a/hack/goreman-start.sh b/hack/goreman-start.sh index b5886084c7dff..e753150e31ad3 100644 --- a/hack/goreman-start.sh +++ b/hack/goreman-start.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -declare -a services=("controller" "api-server" "redis" "repo-server" "ui") +declare -a services=("controller" "api-server" "redis" "repo-server" "ui" "applicationset-controller") EXCLUDE=$exclude diff --git a/hack/update-manifests.sh b/hack/update-manifests.sh index 815efbd1c49fd..a80edf0311e95 100755 --- a/hack/update-manifests.sh +++ b/hack/update-manifests.sh @@ -12,16 +12,17 @@ KUSTOMIZE=kustomize cd ${SRCROOT}/manifests/ha/base/redis-ha && ./generate.sh -IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-quay.io/argoproj}" +IMAGE_NAMESPACE="${IMAGE_NAMESPACE:-quay.io/codefresh}" IMAGE_TAG="${IMAGE_TAG:-}" # if the tag has not been declared, and we are on a release branch, use the VERSION file. +# CODEFRESH: we always want to generate the manifests with the version from the VERSION file, so we will always set IMAGE_TAG to the version in the VERSION file. if [ "$IMAGE_TAG" = "" ]; then - branch=$(git rev-parse --abbrev-ref HEAD) - if [[ $branch = release-* ]]; then + # branch=$(git rev-parse --abbrev-ref HEAD) + # if [[ $branch = sync-* ]]; then pwd IMAGE_TAG=v$(cat $SRCROOT/VERSION) - fi + # fi fi # otherwise, use latest if [ "$IMAGE_TAG" = "" ]; then diff --git a/manifests/base/acr-controller/acr-controller-deployment.yaml b/manifests/base/acr-controller/acr-controller-deployment.yaml new file mode 100644 index 0000000000000..d75ab9f05b55f --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-deployment.yaml @@ -0,0 +1,88 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: acr-controller + template: + metadata: + labels: + app.kubernetes.io/name: acr-controller + spec: + serviceAccountName: acr-controller + containers: + - name: acr-controller + image: quay.io/argoproj/argocd:latest + imagePullPolicy: Always + args: + - /usr/local/bin/argocd-application-change-revision-controller + env: + - name: ARGOCD_SERVER + value: "http://argocd-server:80" + - name: ARGOCD_TOKEN + valueFrom: + secretKeyRef: + key: token + name: argocd-token + - name: ARGOCD_SERVER_ROOTPATH + valueFrom: + configMapKeyRef: + key: server.rootpath + name: argocd-cmd-params-cm + optional: true + - name: ARGOCD_APPLICATION_NAMESPACES + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: application.namespaces + optional: true + - name: ACR_CONTROLLER_LOGFORMAT + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.log.format + optional: true + - name: ACR_CONTROLLER_LOG_LEVEL + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.log.level + optional: true + - name: ACR_CONTROLLER_LISTEN_ADDRESS + valueFrom: + configMapKeyRef: + name: argocd-cmd-params-cm + key: acr.listen.address + optional: true + ports: + - containerPort: 8090 + name: health + livenessProbe: + httpGet: + path: /healthz?full=true + port: health + initialDelaySeconds: 3 + periodSeconds: 30 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /healthz + port: health + initialDelaySeconds: 3 + periodSeconds: 30 + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + runAsNonRoot: true + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault diff --git a/manifests/base/acr-controller/acr-controller-role.yaml b/manifests/base/acr-controller/acr-controller-role.yaml new file mode 100644 index 0000000000000..3a1e1991680e7 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-role.yaml @@ -0,0 +1,43 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +rules: +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - create + - get + - list + - watch + - update + - patch + - delete +- apiGroups: + - argoproj.io + resources: + - applications + - appprojects + - applicationsets + verbs: + - create + - get + - list + - watch + - update + - delete + - patch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - list diff --git a/manifests/base/acr-controller/acr-controller-rolebinding.yaml b/manifests/base/acr-controller/acr-controller-rolebinding.yaml new file mode 100644 index 0000000000000..e70280a6bc3f9 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-rolebinding.yaml @@ -0,0 +1,15 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: acr-controller +subjects: +- kind: ServiceAccount + name: acr-controller diff --git a/manifests/base/acr-controller/acr-controller-sa.yaml b/manifests/base/acr-controller/acr-controller-sa.yaml new file mode 100644 index 0000000000000..0042922267f34 --- /dev/null +++ b/manifests/base/acr-controller/acr-controller-sa.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: acr-controller + app.kubernetes.io/part-of: argocd + app.kubernetes.io/component: acr-controller + name: acr-controller diff --git a/manifests/base/acr-controller/kustomization.yaml b/manifests/base/acr-controller/kustomization.yaml new file mode 100644 index 0000000000000..93d7ff439875f --- /dev/null +++ b/manifests/base/acr-controller/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- acr-controller-deployment.yaml +- acr-controller-role.yaml +- acr-controller-rolebinding.yaml +- acr-controller-sa.yaml diff --git a/manifests/base/kustomization.yaml b/manifests/base/kustomization.yaml index 3e43dc3a4ec36..42c7436a490b7 100644 --- a/manifests/base/kustomization.yaml +++ b/manifests/base/kustomization.yaml @@ -4,7 +4,7 @@ kind: Kustomization images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.0.2 resources: - ./application-controller diff --git a/manifests/core-install-with-hydrator.yaml b/manifests/core-install-with-hydrator.yaml index b95be27d33470..32192b482a6a2 100644 --- a/manifests/core-install-with-hydrator.yaml +++ b/manifests/core-install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -24609,7 +24621,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -24885,7 +24897,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25158,7 +25170,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25210,7 +25222,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -25540,7 +25552,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/core-install.yaml b/manifests/core-install.yaml index a2e807371eccf..2149c51ccddab 100644 --- a/manifests/core-install.yaml +++ b/manifests/core-install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -24577,7 +24589,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -24697,7 +24709,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -24970,7 +24982,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25022,7 +25034,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -25352,7 +25364,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/core-install/kustomization.yaml b/manifests/core-install/kustomization.yaml index df0bab1792c41..f24d898ae0b17 100644 --- a/manifests/core-install/kustomization.yaml +++ b/manifests/core-install/kustomization.yaml @@ -11,5 +11,5 @@ resources: - ../base/redis images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.0.2 diff --git a/manifests/crds/application-crd.yaml b/manifests/crds/application-crd.yaml index 348c6a7ebf95d..8ee5b79460f80 100644 --- a/manifests/crds/application-crd.yaml +++ b/manifests/crds/application-crd.yaml @@ -119,6 +119,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2909,6 +2915,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync diff --git a/manifests/ha/base/kustomization.yaml b/manifests/ha/base/kustomization.yaml index b81096893272d..6369c4e3b27d9 100644 --- a/manifests/ha/base/kustomization.yaml +++ b/manifests/ha/base/kustomization.yaml @@ -11,7 +11,7 @@ patches: images: - name: quay.io/argoproj/argocd - newName: quay.io/argoproj/argocd + newName: quay.io/codefresh/argocd newTag: v3.0.2 resources: - ../../base/application-controller diff --git a/manifests/ha/install-with-hydrator.yaml b/manifests/ha/install-with-hydrator.yaml index d8fbad7c590d0..25c68bd05bf64 100644 --- a/manifests/ha/install-with-hydrator.yaml +++ b/manifests/ha/install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25975,7 +25987,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -26274,7 +26286,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -26370,7 +26382,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -26494,7 +26506,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -26793,7 +26805,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -26845,7 +26857,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -27219,7 +27231,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -27585,7 +27597,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index ac94a5b413bde..5ad171a0aa068 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25945,7 +25957,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -26088,7 +26100,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -26184,7 +26196,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -26308,7 +26320,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -26607,7 +26619,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -26659,7 +26671,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -27033,7 +27045,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -27399,7 +27411,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/namespace-install-with-hydrator.yaml b/manifests/ha/namespace-install-with-hydrator.yaml index f24ab3eec1907..9b328e6fa4702 100644 --- a/manifests/ha/namespace-install-with-hydrator.yaml +++ b/manifests/ha/namespace-install-with-hydrator.yaml @@ -1862,7 +1862,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -2161,7 +2161,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -2257,7 +2257,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -2381,7 +2381,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -2680,7 +2680,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2732,7 +2732,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -3106,7 +3106,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -3472,7 +3472,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index 387c7995d5a27..c110d2bfbedcb 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -1832,7 +1832,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1975,7 +1975,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -2071,7 +2071,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -2195,7 +2195,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -2494,7 +2494,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -2546,7 +2546,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -2920,7 +2920,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -3286,7 +3286,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/install-with-hydrator.yaml b/manifests/install-with-hydrator.yaml index e4b60a860836e..1927a687a211d 100644 --- a/manifests/install-with-hydrator.yaml +++ b/manifests/install-with-hydrator.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25069,7 +25081,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -25368,7 +25380,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -25464,7 +25476,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -25566,7 +25578,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25839,7 +25851,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25891,7 +25903,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -26263,7 +26275,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -26629,7 +26641,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/install.yaml b/manifests/install.yaml index 23b76730a803d..6dccf2e896d57 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -120,6 +120,12 @@ spec: attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -2910,6 +2916,12 @@ spec: of auto-heal attempts format: int64 type: integer + changeRevision: + type: string + changeRevisions: + items: + type: string + type: array dryRun: description: DryRun specifies to perform a `kubectl apply --dry-run` without actually performing the sync @@ -25037,7 +25049,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -25180,7 +25192,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -25276,7 +25288,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -25378,7 +25390,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -25651,7 +25663,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -25703,7 +25715,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -26075,7 +26087,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -26441,7 +26453,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/namespace-install-with-hydrator.yaml b/manifests/namespace-install-with-hydrator.yaml index f6bf244e0e9ca..bd2a7546ddee3 100644 --- a/manifests/namespace-install-with-hydrator.yaml +++ b/manifests/namespace-install-with-hydrator.yaml @@ -956,7 +956,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1255,7 +1255,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -1351,7 +1351,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -1453,7 +1453,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -1726,7 +1726,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1778,7 +1778,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -2150,7 +2150,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -2516,7 +2516,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index e4f250301568a..29fef45a93d11 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -924,7 +924,7 @@ spec: key: applicationsetcontroller.requeue.after name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-applicationset-controller ports: @@ -1067,7 +1067,7 @@ spec: - -n - /usr/local/bin/argocd - /shared/argocd-dex - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: copyutil securityContext: @@ -1163,7 +1163,7 @@ spec: key: notificationscontroller.repo.server.plaintext name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: tcpSocket: @@ -1265,7 +1265,7 @@ spec: - argocd - admin - redis-initial-password - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: IfNotPresent name: secret-init securityContext: @@ -1538,7 +1538,7 @@ spec: value: /helm-working-dir - name: HELM_DATA_HOME value: /helm-working-dir - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 @@ -1590,7 +1590,7 @@ spec: - -n - /usr/local/bin/argocd - /var/run/argocd/argocd-cmp-server - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 name: copyutil securityContext: allowPrivilegeEscalation: false @@ -1962,7 +1962,7 @@ spec: key: server.sync.replace.allowed name: argocd-cmd-params-cm optional: true - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always livenessProbe: httpGet: @@ -2328,7 +2328,7 @@ spec: optional: true - name: KUBECACHEDIR value: /tmp/kubecache - image: quay.io/argoproj/argocd:v3.0.2 + image: quay.io/codefresh/argocd:v3.0.2 imagePullPolicy: Always name: argocd-application-controller ports: diff --git a/pkg/apiclient/application/application.pb.go b/pkg/apiclient/application/application.pb.go index ad02b2b6b9b2a..44d2890c74f8e 100644 --- a/pkg/apiclient/application/application.pb.go +++ b/pkg/apiclient/application/application.pb.go @@ -594,6 +594,116 @@ func (m *ApplicationManifestQueryWithFiles) GetProject() string { return "" } +type ApplicationValidateResponse struct { + Error *string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` + Entity *string `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationValidateResponse) Reset() { *m = ApplicationValidateResponse{} } +func (m *ApplicationValidateResponse) String() string { return proto.CompactTextString(m) } +func (*ApplicationValidateResponse) ProtoMessage() {} +func (*ApplicationValidateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{7} +} +func (m *ApplicationValidateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationValidateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationValidateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationValidateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationValidateResponse.Merge(m, src) +} +func (m *ApplicationValidateResponse) XXX_Size() int { + return m.Size() +} +func (m *ApplicationValidateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationValidateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationValidateResponse proto.InternalMessageInfo + +func (m *ApplicationValidateResponse) GetError() string { + if m != nil && m.Error != nil { + return *m.Error + } + return "" +} + +func (m *ApplicationValidateResponse) GetEntity() string { + if m != nil && m.Entity != nil { + return *m.Entity + } + return "" +} + +type ApplicationRolloutRollbackResponse struct { + Rollout *string `protobuf:"bytes,1,req,name=rollout" json:"rollout,omitempty"` + NewRevision *int64 `protobuf:"varint,2,req,name=newRevision" json:"newRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationRolloutRollbackResponse) Reset() { *m = ApplicationRolloutRollbackResponse{} } +func (m *ApplicationRolloutRollbackResponse) String() string { return proto.CompactTextString(m) } +func (*ApplicationRolloutRollbackResponse) ProtoMessage() {} +func (*ApplicationRolloutRollbackResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{8} +} +func (m *ApplicationRolloutRollbackResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationRolloutRollbackResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationRolloutRollbackResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationRolloutRollbackResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationRolloutRollbackResponse.Merge(m, src) +} +func (m *ApplicationRolloutRollbackResponse) XXX_Size() int { + return m.Size() +} +func (m *ApplicationRolloutRollbackResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationRolloutRollbackResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationRolloutRollbackResponse proto.InternalMessageInfo + +func (m *ApplicationRolloutRollbackResponse) GetRollout() string { + if m != nil && m.Rollout != nil { + return *m.Rollout + } + return "" +} + +func (m *ApplicationRolloutRollbackResponse) GetNewRevision() int64 { + if m != nil && m.NewRevision != nil { + return *m.NewRevision + } + return 0 +} + type ApplicationManifestQueryWithFilesWrapper struct { // Types that are valid to be assigned to Part: // *ApplicationManifestQueryWithFilesWrapper_Query @@ -610,7 +720,7 @@ func (m *ApplicationManifestQueryWithFilesWrapper) Reset() { func (m *ApplicationManifestQueryWithFilesWrapper) String() string { return proto.CompactTextString(m) } func (*ApplicationManifestQueryWithFilesWrapper) ProtoMessage() {} func (*ApplicationManifestQueryWithFilesWrapper) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{7} + return fileDescriptor_df6e82b174b5eaec, []int{9} } func (m *ApplicationManifestQueryWithFilesWrapper) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -696,7 +806,7 @@ func (m *ApplicationResponse) Reset() { *m = ApplicationResponse{} } func (m *ApplicationResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationResponse) ProtoMessage() {} func (*ApplicationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{8} + return fileDescriptor_df6e82b174b5eaec, []int{10} } func (m *ApplicationResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -738,7 +848,7 @@ func (m *ApplicationCreateRequest) Reset() { *m = ApplicationCreateReque func (m *ApplicationCreateRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationCreateRequest) ProtoMessage() {} func (*ApplicationCreateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{9} + return fileDescriptor_df6e82b174b5eaec, []int{11} } func (m *ApplicationCreateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -801,7 +911,7 @@ func (m *ApplicationUpdateRequest) Reset() { *m = ApplicationUpdateReque func (m *ApplicationUpdateRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationUpdateRequest) ProtoMessage() {} func (*ApplicationUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{10} + return fileDescriptor_df6e82b174b5eaec, []int{12} } func (m *ApplicationUpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -866,7 +976,7 @@ func (m *ApplicationDeleteRequest) Reset() { *m = ApplicationDeleteReque func (m *ApplicationDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationDeleteRequest) ProtoMessage() {} func (*ApplicationDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{11} + return fileDescriptor_df6e82b174b5eaec, []int{13} } func (m *ApplicationDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -941,7 +1051,7 @@ func (m *SyncOptions) Reset() { *m = SyncOptions{} } func (m *SyncOptions) String() string { return proto.CompactTextString(m) } func (*SyncOptions) ProtoMessage() {} func (*SyncOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{12} + return fileDescriptor_df6e82b174b5eaec, []int{14} } func (m *SyncOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1002,7 +1112,7 @@ func (m *ApplicationSyncRequest) Reset() { *m = ApplicationSyncRequest{} func (m *ApplicationSyncRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncRequest) ProtoMessage() {} func (*ApplicationSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{13} + return fileDescriptor_df6e82b174b5eaec, []int{15} } func (m *ApplicationSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1129,6 +1239,132 @@ func (m *ApplicationSyncRequest) GetRevisions() []string { return nil } +type ApplicationValidationRequest struct { + Application *v1alpha1.Application `protobuf:"bytes,1,req,name=application" json:"application,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationValidationRequest) Reset() { *m = ApplicationValidationRequest{} } +func (m *ApplicationValidationRequest) String() string { return proto.CompactTextString(m) } +func (*ApplicationValidationRequest) ProtoMessage() {} +func (*ApplicationValidationRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{16} +} +func (m *ApplicationValidationRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationValidationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationValidationRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationValidationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationValidationRequest.Merge(m, src) +} +func (m *ApplicationValidationRequest) XXX_Size() int { + return m.Size() +} +func (m *ApplicationValidationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationValidationRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationValidationRequest proto.InternalMessageInfo + +func (m *ApplicationValidationRequest) GetApplication() *v1alpha1.Application { + if m != nil { + return m.Application + } + return nil +} + +type ApplicationRolloutRollbackRequest struct { + Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` + Namespace *string `protobuf:"bytes,2,req,name=namespace" json:"namespace,omitempty"` + RolloutName *string `protobuf:"bytes,3,req,name=rolloutName" json:"rolloutName,omitempty"` + RolloutNamespace *string `protobuf:"bytes,4,req,name=rolloutNamespace" json:"rolloutNamespace,omitempty"` + RolloutRevision *int64 `protobuf:"varint,5,req,name=rolloutRevision" json:"rolloutRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ApplicationRolloutRollbackRequest) Reset() { *m = ApplicationRolloutRollbackRequest{} } +func (m *ApplicationRolloutRollbackRequest) String() string { return proto.CompactTextString(m) } +func (*ApplicationRolloutRollbackRequest) ProtoMessage() {} +func (*ApplicationRolloutRollbackRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{17} +} +func (m *ApplicationRolloutRollbackRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ApplicationRolloutRollbackRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ApplicationRolloutRollbackRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ApplicationRolloutRollbackRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplicationRolloutRollbackRequest.Merge(m, src) +} +func (m *ApplicationRolloutRollbackRequest) XXX_Size() int { + return m.Size() +} +func (m *ApplicationRolloutRollbackRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ApplicationRolloutRollbackRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplicationRolloutRollbackRequest proto.InternalMessageInfo + +func (m *ApplicationRolloutRollbackRequest) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutName() string { + if m != nil && m.RolloutName != nil { + return *m.RolloutName + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutNamespace() string { + if m != nil && m.RolloutNamespace != nil { + return *m.RolloutNamespace + } + return "" +} + +func (m *ApplicationRolloutRollbackRequest) GetRolloutRevision() int64 { + if m != nil && m.RolloutRevision != nil { + return *m.RolloutRevision + } + return 0 +} + // ApplicationUpdateSpecRequest is a request to update application spec type ApplicationUpdateSpecRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` @@ -1145,7 +1381,7 @@ func (m *ApplicationUpdateSpecRequest) Reset() { *m = ApplicationUpdateS func (m *ApplicationUpdateSpecRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationUpdateSpecRequest) ProtoMessage() {} func (*ApplicationUpdateSpecRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{14} + return fileDescriptor_df6e82b174b5eaec, []int{18} } func (m *ApplicationUpdateSpecRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1225,7 +1461,7 @@ func (m *ApplicationPatchRequest) Reset() { *m = ApplicationPatchRequest func (m *ApplicationPatchRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationPatchRequest) ProtoMessage() {} func (*ApplicationPatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{15} + return fileDescriptor_df6e82b174b5eaec, []int{19} } func (m *ApplicationPatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1305,7 +1541,7 @@ func (m *ApplicationRollbackRequest) Reset() { *m = ApplicationRollbackR func (m *ApplicationRollbackRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationRollbackRequest) ProtoMessage() {} func (*ApplicationRollbackRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{16} + return fileDescriptor_df6e82b174b5eaec, []int{20} } func (m *ApplicationRollbackRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1394,7 +1630,7 @@ func (m *ApplicationResourceRequest) Reset() { *m = ApplicationResourceR func (m *ApplicationResourceRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceRequest) ProtoMessage() {} func (*ApplicationResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{17} + return fileDescriptor_df6e82b174b5eaec, []int{21} } func (m *ApplicationResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1479,6 +1715,124 @@ func (m *ApplicationResourceRequest) GetProject() string { return "" } +type ChangeRevisionRequest struct { + AppName *string `protobuf:"bytes,1,req,name=appName" json:"appName,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` + CurrentRevision *string `protobuf:"bytes,3,opt,name=currentRevision" json:"currentRevision,omitempty"` + PreviousRevision *string `protobuf:"bytes,4,opt,name=previousRevision" json:"previousRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionRequest) Reset() { *m = ChangeRevisionRequest{} } +func (m *ChangeRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionRequest) ProtoMessage() {} +func (*ChangeRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{22} +} +func (m *ChangeRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionRequest.Merge(m, src) +} +func (m *ChangeRevisionRequest) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionRequest proto.InternalMessageInfo + +func (m *ChangeRevisionRequest) GetAppName() string { + if m != nil && m.AppName != nil { + return *m.AppName + } + return "" +} + +func (m *ChangeRevisionRequest) GetNamespace() string { + if m != nil && m.Namespace != nil { + return *m.Namespace + } + return "" +} + +func (m *ChangeRevisionRequest) GetCurrentRevision() string { + if m != nil && m.CurrentRevision != nil { + return *m.CurrentRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPreviousRevision() string { + if m != nil && m.PreviousRevision != nil { + return *m.PreviousRevision + } + return "" +} + +type ChangeRevisionResponse struct { + Revision *string `protobuf:"bytes,1,req,name=revision" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionResponse) Reset() { *m = ChangeRevisionResponse{} } +func (m *ChangeRevisionResponse) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionResponse) ProtoMessage() {} +func (*ChangeRevisionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_df6e82b174b5eaec, []int{23} +} +func (m *ChangeRevisionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionResponse.Merge(m, src) +} +func (m *ChangeRevisionResponse) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionResponse proto.InternalMessageInfo + +func (m *ChangeRevisionResponse) GetRevision() string { + if m != nil && m.Revision != nil { + return *m.Revision + } + return "" +} + type ApplicationResourcePatchRequest struct { Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` Namespace *string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` @@ -1499,7 +1853,7 @@ func (m *ApplicationResourcePatchRequest) Reset() { *m = ApplicationReso func (m *ApplicationResourcePatchRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourcePatchRequest) ProtoMessage() {} func (*ApplicationResourcePatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{18} + return fileDescriptor_df6e82b174b5eaec, []int{24} } func (m *ApplicationResourcePatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1618,7 +1972,7 @@ func (m *ApplicationResourceDeleteRequest) Reset() { *m = ApplicationRes func (m *ApplicationResourceDeleteRequest) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceDeleteRequest) ProtoMessage() {} func (*ApplicationResourceDeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{19} + return fileDescriptor_df6e82b174b5eaec, []int{25} } func (m *ApplicationResourceDeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1736,7 +2090,7 @@ func (m *ResourceActionRunRequest) Reset() { *m = ResourceActionRunReque func (m *ResourceActionRunRequest) String() string { return proto.CompactTextString(m) } func (*ResourceActionRunRequest) ProtoMessage() {} func (*ResourceActionRunRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{20} + return fileDescriptor_df6e82b174b5eaec, []int{26} } func (m *ResourceActionRunRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1839,7 +2193,7 @@ func (m *ResourceActionsListResponse) Reset() { *m = ResourceActionsList func (m *ResourceActionsListResponse) String() string { return proto.CompactTextString(m) } func (*ResourceActionsListResponse) ProtoMessage() {} func (*ResourceActionsListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{21} + return fileDescriptor_df6e82b174b5eaec, []int{27} } func (m *ResourceActionsListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1886,7 +2240,7 @@ func (m *ApplicationResourceResponse) Reset() { *m = ApplicationResource func (m *ApplicationResourceResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationResourceResponse) ProtoMessage() {} func (*ApplicationResourceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{22} + return fileDescriptor_df6e82b174b5eaec, []int{28} } func (m *ApplicationResourceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1949,7 +2303,7 @@ func (m *ApplicationPodLogsQuery) Reset() { *m = ApplicationPodLogsQuery func (m *ApplicationPodLogsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationPodLogsQuery) ProtoMessage() {} func (*ApplicationPodLogsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{23} + return fileDescriptor_df6e82b174b5eaec, []int{29} } func (m *ApplicationPodLogsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2113,7 +2467,7 @@ func (m *LogEntry) Reset() { *m = LogEntry{} } func (m *LogEntry) String() string { return proto.CompactTextString(m) } func (*LogEntry) ProtoMessage() {} func (*LogEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{24} + return fileDescriptor_df6e82b174b5eaec, []int{30} } func (m *LogEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2190,7 +2544,7 @@ func (m *OperationTerminateRequest) Reset() { *m = OperationTerminateReq func (m *OperationTerminateRequest) String() string { return proto.CompactTextString(m) } func (*OperationTerminateRequest) ProtoMessage() {} func (*OperationTerminateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{25} + return fileDescriptor_df6e82b174b5eaec, []int{31} } func (m *OperationTerminateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2253,7 +2607,7 @@ func (m *ApplicationSyncWindowsQuery) Reset() { *m = ApplicationSyncWind func (m *ApplicationSyncWindowsQuery) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsQuery) ProtoMessage() {} func (*ApplicationSyncWindowsQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{26} + return fileDescriptor_df6e82b174b5eaec, []int{32} } func (m *ApplicationSyncWindowsQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2316,7 +2670,7 @@ func (m *ApplicationSyncWindowsResponse) Reset() { *m = ApplicationSyncW func (m *ApplicationSyncWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindowsResponse) ProtoMessage() {} func (*ApplicationSyncWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{27} + return fileDescriptor_df6e82b174b5eaec, []int{33} } func (m *ApplicationSyncWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2380,7 +2734,7 @@ func (m *ApplicationSyncWindow) Reset() { *m = ApplicationSyncWindow{} } func (m *ApplicationSyncWindow) String() string { return proto.CompactTextString(m) } func (*ApplicationSyncWindow) ProtoMessage() {} func (*ApplicationSyncWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{28} + return fileDescriptor_df6e82b174b5eaec, []int{34} } func (m *ApplicationSyncWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2447,7 +2801,7 @@ func (m *OperationTerminateResponse) Reset() { *m = OperationTerminateRe func (m *OperationTerminateResponse) String() string { return proto.CompactTextString(m) } func (*OperationTerminateResponse) ProtoMessage() {} func (*OperationTerminateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{29} + return fileDescriptor_df6e82b174b5eaec, []int{35} } func (m *OperationTerminateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2494,7 +2848,7 @@ func (m *ResourcesQuery) Reset() { *m = ResourcesQuery{} } func (m *ResourcesQuery) String() string { return proto.CompactTextString(m) } func (*ResourcesQuery) ProtoMessage() {} func (*ResourcesQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{30} + return fileDescriptor_df6e82b174b5eaec, []int{36} } func (m *ResourcesQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2590,7 +2944,7 @@ func (m *ManagedResourcesResponse) Reset() { *m = ManagedResourcesRespon func (m *ManagedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ManagedResourcesResponse) ProtoMessage() {} func (*ManagedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{31} + return fileDescriptor_df6e82b174b5eaec, []int{37} } func (m *ManagedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2640,7 +2994,7 @@ func (m *LinkInfo) Reset() { *m = LinkInfo{} } func (m *LinkInfo) String() string { return proto.CompactTextString(m) } func (*LinkInfo) ProtoMessage() {} func (*LinkInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{32} + return fileDescriptor_df6e82b174b5eaec, []int{38} } func (m *LinkInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2708,7 +3062,7 @@ func (m *LinksResponse) Reset() { *m = LinksResponse{} } func (m *LinksResponse) String() string { return proto.CompactTextString(m) } func (*LinksResponse) ProtoMessage() {} func (*LinksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{33} + return fileDescriptor_df6e82b174b5eaec, []int{39} } func (m *LinksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2757,7 +3111,7 @@ func (m *ListAppLinksRequest) Reset() { *m = ListAppLinksRequest{} } func (m *ListAppLinksRequest) String() string { return proto.CompactTextString(m) } func (*ListAppLinksRequest) ProtoMessage() {} func (*ListAppLinksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_df6e82b174b5eaec, []int{34} + return fileDescriptor_df6e82b174b5eaec, []int{40} } func (m *ListAppLinksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2815,6 +3169,8 @@ func init() { proto.RegisterType((*ApplicationManifestQuery)(nil), "application.ApplicationManifestQuery") proto.RegisterType((*FileChunk)(nil), "application.FileChunk") proto.RegisterType((*ApplicationManifestQueryWithFiles)(nil), "application.ApplicationManifestQueryWithFiles") + proto.RegisterType((*ApplicationValidateResponse)(nil), "application.ApplicationValidateResponse") + proto.RegisterType((*ApplicationRolloutRollbackResponse)(nil), "application.ApplicationRolloutRollbackResponse") proto.RegisterType((*ApplicationManifestQueryWithFilesWrapper)(nil), "application.ApplicationManifestQueryWithFilesWrapper") proto.RegisterType((*ApplicationResponse)(nil), "application.ApplicationResponse") proto.RegisterType((*ApplicationCreateRequest)(nil), "application.ApplicationCreateRequest") @@ -2822,10 +3178,14 @@ func init() { proto.RegisterType((*ApplicationDeleteRequest)(nil), "application.ApplicationDeleteRequest") proto.RegisterType((*SyncOptions)(nil), "application.SyncOptions") proto.RegisterType((*ApplicationSyncRequest)(nil), "application.ApplicationSyncRequest") + proto.RegisterType((*ApplicationValidationRequest)(nil), "application.ApplicationValidationRequest") + proto.RegisterType((*ApplicationRolloutRollbackRequest)(nil), "application.ApplicationRolloutRollbackRequest") proto.RegisterType((*ApplicationUpdateSpecRequest)(nil), "application.ApplicationUpdateSpecRequest") proto.RegisterType((*ApplicationPatchRequest)(nil), "application.ApplicationPatchRequest") proto.RegisterType((*ApplicationRollbackRequest)(nil), "application.ApplicationRollbackRequest") proto.RegisterType((*ApplicationResourceRequest)(nil), "application.ApplicationResourceRequest") + proto.RegisterType((*ChangeRevisionRequest)(nil), "application.ChangeRevisionRequest") + proto.RegisterType((*ChangeRevisionResponse)(nil), "application.ChangeRevisionResponse") proto.RegisterType((*ApplicationResourcePatchRequest)(nil), "application.ApplicationResourcePatchRequest") proto.RegisterType((*ApplicationResourceDeleteRequest)(nil), "application.ApplicationResourceDeleteRequest") proto.RegisterType((*ResourceActionRunRequest)(nil), "application.ResourceActionRunRequest") @@ -2850,180 +3210,198 @@ func init() { } var fileDescriptor_df6e82b174b5eaec = []byte{ - // 2759 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4d, 0x8c, 0x1b, 0x49, - 0xf5, 0xff, 0x97, 0x3d, 0x9e, 0xf1, 0x3c, 0xcf, 0x64, 0x92, 0xda, 0x64, 0xfe, 0xbd, 0xce, 0x6c, - 0xf0, 0x76, 0x92, 0x8d, 0x77, 0x92, 0xb1, 0x93, 0x49, 0x40, 0xd9, 0xd9, 0x5d, 0x41, 0x32, 0xf9, - 0x84, 0x49, 0x36, 0xf4, 0x24, 0x04, 0x2d, 0x07, 0xa8, 0xed, 0xae, 0xb1, 0x9b, 0xb1, 0xbb, 0x3b, - 0xdd, 0x6d, 0x87, 0x51, 0xc8, 0x65, 0x11, 0x17, 0xb4, 0x02, 0x01, 0x7b, 0x40, 0x08, 0x01, 0xda, - 0xd5, 0x4a, 0x08, 0x81, 0xb8, 0x20, 0x84, 0x84, 0x90, 0xe0, 0x00, 0x82, 0x03, 0xd2, 0x0a, 0x8e, - 0x5c, 0x50, 0x84, 0x38, 0xc2, 0x65, 0xcf, 0x08, 0x55, 0x75, 0x55, 0x77, 0xb5, 0x3f, 0xda, 0x1e, - 0x6c, 0xb4, 0xb9, 0xf5, 0x2b, 0x57, 0xbd, 0xf7, 0x7b, 0xaf, 0x5e, 0xbd, 0xf7, 0xea, 0x95, 0xe1, - 0x44, 0x40, 0xfd, 0x2e, 0xf5, 0xeb, 0xc4, 0xf3, 0x5a, 0xb6, 0x49, 0x42, 0xdb, 0x75, 0xd4, 0xef, - 0x9a, 0xe7, 0xbb, 0xa1, 0x8b, 0x4b, 0xca, 0x50, 0x79, 0xa5, 0xe1, 0xba, 0x8d, 0x16, 0xad, 0x13, - 0xcf, 0xae, 0x13, 0xc7, 0x71, 0x43, 0x3e, 0x1c, 0x44, 0x53, 0xcb, 0xfa, 0xee, 0xc5, 0xa0, 0x66, - 0xbb, 0xfc, 0x57, 0xd3, 0xf5, 0x69, 0xbd, 0x7b, 0xae, 0xde, 0xa0, 0x0e, 0xf5, 0x49, 0x48, 0x2d, - 0x31, 0xe7, 0x42, 0x32, 0xa7, 0x4d, 0xcc, 0xa6, 0xed, 0x50, 0x7f, 0xaf, 0xee, 0xed, 0x36, 0xd8, - 0x40, 0x50, 0x6f, 0xd3, 0x90, 0x0c, 0x5a, 0xb5, 0xd5, 0xb0, 0xc3, 0x66, 0xe7, 0x8d, 0x9a, 0xe9, - 0xb6, 0xeb, 0xc4, 0x6f, 0xb8, 0x9e, 0xef, 0x7e, 0x91, 0x7f, 0xac, 0x99, 0x56, 0xbd, 0x7b, 0x3e, - 0x61, 0xa0, 0xea, 0xd2, 0x3d, 0x47, 0x5a, 0x5e, 0x93, 0xf4, 0x73, 0xbb, 0x3a, 0x82, 0x9b, 0x4f, - 0x3d, 0x57, 0xd8, 0x86, 0x7f, 0xda, 0xa1, 0xeb, 0xef, 0x29, 0x9f, 0x11, 0x1b, 0xfd, 0x03, 0x04, - 0x07, 0x2f, 0x25, 0xf2, 0x3e, 0xdd, 0xa1, 0xfe, 0x1e, 0xc6, 0x30, 0xe3, 0x90, 0x36, 0xd5, 0x50, - 0x05, 0x55, 0xe7, 0x0d, 0xfe, 0x8d, 0x35, 0x98, 0xf3, 0xe9, 0x8e, 0x4f, 0x83, 0xa6, 0x96, 0xe3, - 0xc3, 0x92, 0xc4, 0x65, 0x28, 0x32, 0xe1, 0xd4, 0x0c, 0x03, 0x2d, 0x5f, 0xc9, 0x57, 0xe7, 0x8d, - 0x98, 0xc6, 0x55, 0x58, 0xf2, 0x69, 0xe0, 0x76, 0x7c, 0x93, 0x7e, 0x86, 0xfa, 0x81, 0xed, 0x3a, - 0xda, 0x0c, 0x5f, 0xdd, 0x3b, 0xcc, 0xb8, 0x04, 0xb4, 0x45, 0xcd, 0xd0, 0xf5, 0xb5, 0x02, 0x9f, - 0x12, 0xd3, 0x0c, 0x0f, 0x03, 0xae, 0xcd, 0x46, 0x78, 0xd8, 0x37, 0xd6, 0x61, 0x81, 0x78, 0xde, - 0x6d, 0xd2, 0xa6, 0x81, 0x47, 0x4c, 0xaa, 0xcd, 0xf1, 0xdf, 0x52, 0x63, 0x0c, 0xb3, 0x40, 0xa2, - 0x15, 0x39, 0x30, 0x49, 0xea, 0x9b, 0x30, 0x7f, 0xdb, 0xb5, 0xe8, 0x70, 0x75, 0x7b, 0xd9, 0xe7, - 0xfa, 0xd9, 0xeb, 0xbf, 0x43, 0x70, 0xc4, 0xa0, 0x5d, 0x9b, 0xe1, 0xbf, 0x45, 0x43, 0x62, 0x91, - 0x90, 0xf4, 0x72, 0xcc, 0xc5, 0x1c, 0xcb, 0x50, 0xf4, 0xc5, 0x64, 0x2d, 0xc7, 0xc7, 0x63, 0xba, - 0x4f, 0x5a, 0x3e, 0x5b, 0x99, 0xc8, 0x84, 0x92, 0xc4, 0x15, 0x28, 0x45, 0xb6, 0xbc, 0xe9, 0x58, - 0xf4, 0x4b, 0xdc, 0x7a, 0x05, 0x43, 0x1d, 0xc2, 0x2b, 0x30, 0xdf, 0x8d, 0xec, 0x7c, 0xd3, 0xe2, - 0x56, 0x2c, 0x18, 0xc9, 0x80, 0xfe, 0x0f, 0x04, 0xc7, 0x14, 0x1f, 0x30, 0xc4, 0xce, 0x5c, 0xed, - 0x52, 0x27, 0x0c, 0x86, 0x2b, 0x74, 0x06, 0x0e, 0xc9, 0x4d, 0xec, 0xb5, 0x53, 0xff, 0x0f, 0x4c, - 0x45, 0x75, 0x50, 0xaa, 0xa8, 0x8e, 0x31, 0x45, 0x24, 0x7d, 0xef, 0xe6, 0x15, 0xa1, 0xa6, 0x3a, - 0xd4, 0x67, 0xa8, 0x42, 0xb6, 0xa1, 0x66, 0x53, 0x86, 0xd2, 0xdf, 0x47, 0xa0, 0x29, 0x8a, 0xde, - 0x22, 0x8e, 0xbd, 0x43, 0x83, 0x70, 0xdc, 0x3d, 0x43, 0x53, 0xdc, 0xb3, 0x2a, 0x2c, 0x45, 0x5a, - 0xdd, 0x61, 0xe7, 0x91, 0xc5, 0x1f, 0xad, 0x50, 0xc9, 0x57, 0xf3, 0x46, 0xef, 0x30, 0xdb, 0x3b, - 0x29, 0x33, 0xd0, 0x66, 0xb9, 0x1b, 0x27, 0x03, 0xfa, 0xf3, 0x30, 0x7f, 0xcd, 0x6e, 0xd1, 0xcd, - 0x66, 0xc7, 0xd9, 0xc5, 0x87, 0xa1, 0x60, 0xb2, 0x0f, 0xae, 0xc3, 0x82, 0x11, 0x11, 0xfa, 0x37, - 0x11, 0x3c, 0x3f, 0x4c, 0xeb, 0xfb, 0x76, 0xd8, 0x64, 0xeb, 0x83, 0x61, 0xea, 0x9b, 0x4d, 0x6a, - 0xee, 0x06, 0x9d, 0xb6, 0x74, 0x59, 0x49, 0x4f, 0xa6, 0xbe, 0xfe, 0x63, 0x04, 0xd5, 0x91, 0x98, - 0xee, 0xfb, 0xc4, 0xf3, 0xa8, 0x8f, 0xaf, 0x41, 0xe1, 0x01, 0xfb, 0x81, 0x1f, 0xd0, 0xd2, 0x7a, - 0xad, 0xa6, 0x06, 0xf8, 0x91, 0x5c, 0x6e, 0xfc, 0x9f, 0x11, 0x2d, 0xc7, 0x35, 0x69, 0x9e, 0x1c, - 0xe7, 0xb3, 0x9c, 0xe2, 0x13, 0x5b, 0x91, 0xcd, 0xe7, 0xd3, 0x2e, 0xcf, 0xc2, 0x8c, 0x47, 0xfc, - 0x50, 0x3f, 0x02, 0xcf, 0xa4, 0x8f, 0x87, 0xe7, 0x3a, 0x01, 0xd5, 0x7f, 0x95, 0xf6, 0xa6, 0x4d, - 0x9f, 0x92, 0x90, 0x1a, 0xf4, 0x41, 0x87, 0x06, 0x21, 0xde, 0x05, 0x35, 0xe7, 0x70, 0xab, 0x96, - 0xd6, 0x6f, 0xd6, 0x92, 0xa0, 0x5d, 0x93, 0x41, 0x9b, 0x7f, 0x7c, 0xde, 0xb4, 0x6a, 0xdd, 0xf3, - 0x35, 0x6f, 0xb7, 0x51, 0x63, 0x29, 0x20, 0x85, 0x4c, 0xa6, 0x00, 0x55, 0x55, 0x43, 0xe5, 0x8e, - 0x97, 0x61, 0xb6, 0xe3, 0x05, 0xd4, 0x0f, 0xb9, 0x66, 0x45, 0x43, 0x50, 0x6c, 0xff, 0xba, 0xa4, - 0x65, 0x5b, 0x24, 0x8c, 0xf6, 0xa7, 0x68, 0xc4, 0xb4, 0xfe, 0xeb, 0x34, 0xfa, 0x7b, 0x9e, 0xf5, - 0x61, 0xa1, 0x57, 0x51, 0xe6, 0xd2, 0x28, 0x55, 0x0f, 0xca, 0xa7, 0x3d, 0xe8, 0xe7, 0x69, 0xfc, - 0x57, 0x68, 0x8b, 0x26, 0xf8, 0x07, 0x39, 0xb3, 0x06, 0x73, 0x26, 0x09, 0x4c, 0x62, 0x49, 0x29, - 0x92, 0x64, 0x81, 0xcc, 0xf3, 0x5d, 0x8f, 0x34, 0x38, 0xa7, 0x3b, 0x6e, 0xcb, 0x36, 0xf7, 0x84, - 0xb8, 0xfe, 0x1f, 0xfa, 0x1c, 0x7f, 0x26, 0xdb, 0xf1, 0x0b, 0x69, 0xd8, 0xc7, 0xa1, 0xb4, 0xbd, - 0xe7, 0x98, 0xaf, 0x79, 0xd1, 0xe1, 0x3e, 0x0c, 0x05, 0x3b, 0xa4, 0xed, 0x40, 0x43, 0xfc, 0x60, - 0x47, 0x84, 0xfe, 0xef, 0x02, 0x2c, 0x2b, 0xba, 0xb1, 0x05, 0x59, 0x9a, 0x65, 0x45, 0xa9, 0x65, - 0x98, 0xb5, 0xfc, 0x3d, 0xa3, 0xe3, 0x08, 0x07, 0x10, 0x14, 0x13, 0xec, 0xf9, 0x1d, 0x27, 0x82, - 0x5f, 0x34, 0x22, 0x02, 0xef, 0x40, 0x31, 0x08, 0x59, 0x95, 0xd1, 0xd8, 0xe3, 0xc0, 0x4b, 0xeb, - 0x9f, 0x9c, 0x6c, 0xd3, 0x19, 0xf4, 0x6d, 0xc1, 0xd1, 0x88, 0x79, 0xe3, 0x07, 0x2c, 0xa6, 0x45, - 0x81, 0x2e, 0xd0, 0xe6, 0x2a, 0xf9, 0x6a, 0x69, 0x7d, 0x7b, 0x72, 0x41, 0xaf, 0x79, 0xac, 0x42, - 0x52, 0x32, 0x98, 0x91, 0x48, 0x61, 0x61, 0xb4, 0x2d, 0xe2, 0x43, 0x20, 0xaa, 0x81, 0x64, 0x00, - 0x7f, 0x16, 0x0a, 0xb6, 0xb3, 0xe3, 0x06, 0xda, 0x3c, 0x07, 0x73, 0x79, 0x32, 0x30, 0x37, 0x9d, - 0x1d, 0xd7, 0x88, 0x18, 0xe2, 0x07, 0xb0, 0xe8, 0xd3, 0xd0, 0xdf, 0x93, 0x56, 0xd0, 0x80, 0xdb, - 0xf5, 0x53, 0x93, 0x49, 0x30, 0x54, 0x96, 0x46, 0x5a, 0x02, 0xde, 0x80, 0x52, 0x90, 0xf8, 0x98, - 0x56, 0xe2, 0x02, 0xb5, 0x14, 0x23, 0xc5, 0x07, 0x0d, 0x75, 0x72, 0x9f, 0x77, 0x2f, 0x64, 0x7b, - 0xf7, 0xe2, 0xc8, 0xac, 0x76, 0x60, 0x8c, 0xac, 0xb6, 0xd4, 0x9b, 0xd5, 0xfe, 0x85, 0x60, 0xa5, - 0x2f, 0x38, 0x6d, 0x7b, 0x34, 0xf3, 0x18, 0x10, 0x98, 0x09, 0x3c, 0x6a, 0xf2, 0x4c, 0x55, 0x5a, - 0xbf, 0x35, 0xb5, 0x68, 0xc5, 0xe5, 0x72, 0xd6, 0x59, 0x01, 0x75, 0xc2, 0xb8, 0xf0, 0x03, 0x04, - 0xff, 0xaf, 0xc8, 0xbc, 0x43, 0x42, 0xb3, 0x99, 0xa5, 0x2c, 0x3b, 0xbf, 0x6c, 0x8e, 0xc8, 0xcb, - 0x11, 0xc1, 0xac, 0xca, 0x3f, 0xee, 0xee, 0x79, 0x0c, 0x20, 0xfb, 0x25, 0x19, 0x98, 0xb0, 0x78, - 0xfa, 0x09, 0x82, 0xb2, 0x1a, 0xc3, 0xdd, 0x56, 0xeb, 0x0d, 0x62, 0xee, 0x66, 0x81, 0x3c, 0x00, - 0x39, 0xdb, 0xe2, 0x08, 0xf3, 0x46, 0xce, 0xb6, 0xf6, 0x19, 0x8c, 0x7a, 0xe1, 0xce, 0x66, 0xc3, - 0x9d, 0x4b, 0xc3, 0xfd, 0xa0, 0x07, 0xae, 0x0c, 0x09, 0x19, 0x70, 0x57, 0x60, 0xde, 0xe9, 0x29, - 0x64, 0x93, 0x81, 0x01, 0x05, 0x6c, 0xae, 0xaf, 0x80, 0xd5, 0x60, 0xae, 0x1b, 0x5f, 0x73, 0xd8, - 0xcf, 0x92, 0x64, 0x2a, 0x36, 0x7c, 0xb7, 0xe3, 0x09, 0xa3, 0x47, 0x04, 0x43, 0xb1, 0x6b, 0x3b, - 0xac, 0x24, 0xe7, 0x28, 0xd8, 0xf7, 0xfe, 0x2f, 0x36, 0x29, 0xb5, 0x7f, 0x9a, 0x83, 0x8f, 0x0c, - 0x50, 0x7b, 0xa4, 0x3f, 0x3d, 0x1d, 0xba, 0xc7, 0x5e, 0x3d, 0x37, 0xd4, 0xab, 0x8b, 0xa3, 0xbc, - 0x7a, 0x3e, 0xdb, 0x5e, 0x90, 0xb6, 0xd7, 0x8f, 0x72, 0x50, 0x19, 0x60, 0xaf, 0xd1, 0xe5, 0xc4, - 0x53, 0x63, 0xb0, 0x1d, 0xd7, 0x17, 0x5e, 0x52, 0x34, 0x22, 0x82, 0x9d, 0x33, 0xd7, 0xf7, 0x9a, - 0xc4, 0xe1, 0xde, 0x51, 0x34, 0x04, 0x35, 0xa1, 0xa9, 0xbe, 0x96, 0x03, 0x4d, 0xda, 0xe7, 0x92, - 0xc9, 0xad, 0xd5, 0x71, 0x9e, 0x7e, 0x13, 0x2d, 0xc3, 0x2c, 0xe1, 0x68, 0x85, 0x53, 0x09, 0xaa, - 0xcf, 0x18, 0xc5, 0x6c, 0x63, 0xcc, 0xa7, 0x8d, 0xf1, 0x55, 0x04, 0x47, 0xd3, 0xc6, 0x08, 0xb6, - 0xec, 0x20, 0x94, 0x97, 0x03, 0xbc, 0x03, 0x73, 0x91, 0x9c, 0xa8, 0xb4, 0x2b, 0xad, 0x6f, 0x4d, - 0x9a, 0xf0, 0x53, 0x86, 0x97, 0xcc, 0xf5, 0x97, 0xe0, 0xe8, 0xc0, 0x28, 0x27, 0x60, 0x94, 0xa1, - 0x28, 0x8b, 0x1c, 0xb1, 0x35, 0x31, 0xad, 0xbf, 0x3b, 0x93, 0x4e, 0x39, 0xae, 0xb5, 0xe5, 0x36, - 0x32, 0xee, 0xfb, 0xd9, 0xdb, 0xc9, 0x4c, 0xe5, 0x5a, 0xca, 0xd5, 0x5e, 0x92, 0x6c, 0x9d, 0xe9, - 0x3a, 0x21, 0xb1, 0x1d, 0xea, 0x8b, 0xac, 0x98, 0x0c, 0xb0, 0x6d, 0x08, 0x6c, 0xc7, 0xa4, 0xdb, - 0xd4, 0x74, 0x1d, 0x2b, 0xe0, 0xfb, 0x99, 0x37, 0x52, 0x63, 0xf8, 0x06, 0xcc, 0x73, 0xfa, 0xae, - 0xdd, 0x8e, 0xd2, 0x40, 0x69, 0x7d, 0xb5, 0x16, 0xf5, 0xe0, 0x6a, 0x6a, 0x0f, 0x2e, 0xb1, 0x61, - 0x9b, 0x86, 0xa4, 0xd6, 0x3d, 0x57, 0x63, 0x2b, 0x8c, 0x64, 0x31, 0xc3, 0x12, 0x12, 0xbb, 0xb5, - 0x65, 0x3b, 0xbc, 0xf0, 0x64, 0xa2, 0x92, 0x01, 0xe6, 0x2a, 0x3b, 0x6e, 0xab, 0xe5, 0x3e, 0x94, - 0xe7, 0x26, 0xa2, 0xd8, 0xaa, 0x8e, 0x13, 0xda, 0x2d, 0x2e, 0x3f, 0x72, 0x84, 0x64, 0x80, 0xaf, - 0xb2, 0x5b, 0x21, 0xf5, 0xc5, 0x81, 0x11, 0x54, 0xec, 0x8c, 0xa5, 0xa8, 0xad, 0x24, 0xcf, 0x6b, - 0xe4, 0xb6, 0x0b, 0xaa, 0xdb, 0xf6, 0x1e, 0x85, 0xc5, 0x01, 0xbd, 0x11, 0xde, 0x65, 0xa3, 0x5d, - 0xdb, 0xed, 0xb0, 0x9a, 0x8a, 0x97, 0x1e, 0x92, 0xee, 0x73, 0xe5, 0xa5, 0x6c, 0x57, 0x3e, 0x98, - 0x2e, 0xda, 0x78, 0x65, 0x1c, 0x9a, 0xcd, 0x4d, 0x12, 0x50, 0xed, 0x10, 0x67, 0x9d, 0x0c, 0xe8, - 0xbf, 0x41, 0x50, 0xdc, 0x72, 0x1b, 0x57, 0x9d, 0xd0, 0xdf, 0xe3, 0x77, 0x28, 0xd7, 0x09, 0xa9, - 0x23, 0xbd, 0x49, 0x92, 0x6c, 0x8b, 0x42, 0xbb, 0x4d, 0xb7, 0x43, 0xd2, 0xf6, 0x44, 0x05, 0xb6, - 0xaf, 0x2d, 0x8a, 0x17, 0x33, 0xb3, 0xb5, 0x48, 0x10, 0xf2, 0x78, 0x50, 0x34, 0xf8, 0x37, 0x53, - 0x30, 0x9e, 0xb0, 0x1d, 0xfa, 0x22, 0x18, 0xa4, 0xc6, 0x54, 0x07, 0x2c, 0x44, 0xd8, 0x04, 0xa9, - 0xb7, 0xe1, 0xd9, 0xf8, 0x6a, 0x70, 0x97, 0xfa, 0x6d, 0xdb, 0x21, 0xd9, 0xb1, 0x7d, 0x8c, 0xe6, - 0x5f, 0xc6, 0xcd, 0xd4, 0x4d, 0x1d, 0x49, 0x56, 0x69, 0xdf, 0xb7, 0x1d, 0xcb, 0x7d, 0x98, 0x71, - 0xb4, 0x26, 0x13, 0xf8, 0xe7, 0x74, 0xff, 0x4e, 0x91, 0x18, 0xc7, 0x81, 0x1b, 0xb0, 0xc8, 0x22, - 0x46, 0x97, 0x8a, 0x1f, 0x44, 0x50, 0xd2, 0x87, 0xb5, 0x52, 0x12, 0x1e, 0x46, 0x7a, 0x21, 0xde, - 0x82, 0x25, 0x12, 0x04, 0x76, 0xc3, 0xa1, 0x96, 0xe4, 0x95, 0x1b, 0x9b, 0x57, 0xef, 0xd2, 0xe8, - 0x52, 0xce, 0x67, 0x88, 0xfd, 0x96, 0xa4, 0xfe, 0x15, 0x04, 0x47, 0x06, 0x32, 0x89, 0xcf, 0x15, - 0x52, 0x82, 0x7c, 0x19, 0x8a, 0x81, 0xd9, 0xa4, 0x56, 0xa7, 0x45, 0x65, 0xa7, 0x4a, 0xd2, 0xec, - 0x37, 0xab, 0x13, 0xed, 0xbe, 0x48, 0x32, 0x31, 0x8d, 0x8f, 0x01, 0xb4, 0x89, 0xd3, 0x21, 0x2d, - 0x0e, 0x61, 0x86, 0x43, 0x50, 0x46, 0xf4, 0x15, 0x28, 0x0f, 0x72, 0x1d, 0xd1, 0x01, 0xfa, 0x27, - 0x82, 0x03, 0x32, 0xe4, 0x8a, 0xdd, 0xad, 0xc2, 0x92, 0x62, 0x86, 0xdb, 0xc9, 0x46, 0xf7, 0x0e, - 0x8f, 0x08, 0xa7, 0xd2, 0x4b, 0xf2, 0xe9, 0x16, 0x7c, 0x37, 0xd5, 0x44, 0x1f, 0x3b, 0x1b, 0xa2, - 0x29, 0x55, 0x97, 0x5f, 0x06, 0xed, 0x16, 0x71, 0x48, 0x83, 0x5a, 0xb1, 0xda, 0xb1, 0x8b, 0x7d, - 0x41, 0x6d, 0x65, 0x4c, 0xdc, 0x38, 0x88, 0x0b, 0x31, 0x7b, 0x67, 0x47, 0xb6, 0x45, 0x7c, 0x28, - 0x6e, 0xd9, 0xce, 0x2e, 0xbb, 0x5d, 0x33, 0x8d, 0x43, 0x3b, 0x6c, 0x49, 0xeb, 0x46, 0x04, 0x3e, - 0x08, 0xf9, 0x8e, 0xdf, 0x12, 0x1e, 0xc0, 0x3e, 0x71, 0x05, 0x4a, 0x16, 0x0d, 0x4c, 0xdf, 0xf6, - 0xc4, 0xfe, 0xf3, 0x96, 0xb2, 0x32, 0xc4, 0xf6, 0xc1, 0x36, 0x5d, 0x67, 0xb3, 0x45, 0x82, 0x40, - 0xa6, 0xa7, 0x78, 0x40, 0x7f, 0x05, 0x16, 0x99, 0xcc, 0x44, 0xcd, 0xd3, 0x69, 0x35, 0x8f, 0xa4, - 0xe0, 0x4b, 0x78, 0x12, 0x31, 0x81, 0x67, 0x58, 0x55, 0x70, 0xc9, 0xf3, 0x04, 0x93, 0x31, 0x8b, - 0xa5, 0xfc, 0xa0, 0xec, 0x3a, 0xb0, 0x93, 0xba, 0xfe, 0xd7, 0xe3, 0x80, 0xd5, 0x73, 0x42, 0xfd, - 0xae, 0x6d, 0x52, 0xfc, 0x2d, 0x04, 0x33, 0x4c, 0x34, 0x7e, 0x6e, 0xd8, 0xb1, 0xe4, 0xfe, 0x5a, - 0x9e, 0xde, 0x35, 0x99, 0x49, 0xd3, 0x57, 0xde, 0xfc, 0xcb, 0xdf, 0xbf, 0x9d, 0x5b, 0xc6, 0x87, - 0xf9, 0xfb, 0x59, 0xf7, 0x9c, 0xfa, 0x96, 0x15, 0xe0, 0xb7, 0x10, 0x60, 0x51, 0x25, 0x29, 0x2f, - 0x0c, 0xf8, 0xf4, 0x30, 0x88, 0x03, 0x5e, 0x22, 0xca, 0xcf, 0x29, 0x59, 0xa5, 0x66, 0xba, 0x3e, - 0x65, 0x39, 0x84, 0x4f, 0xe0, 0x00, 0x56, 0x39, 0x80, 0x13, 0x58, 0x1f, 0x04, 0xa0, 0xfe, 0x88, - 0x59, 0xf4, 0x71, 0x9d, 0x46, 0x72, 0xdf, 0x41, 0x50, 0xb8, 0xcf, 0x6f, 0x18, 0x23, 0x8c, 0xb4, - 0x3d, 0x35, 0x23, 0x71, 0x71, 0x1c, 0xad, 0x7e, 0x9c, 0x23, 0x7d, 0x0e, 0x1f, 0x95, 0x48, 0x83, - 0xd0, 0xa7, 0xa4, 0x9d, 0x02, 0x7c, 0x16, 0xe1, 0xf7, 0x10, 0xcc, 0x46, 0xad, 0x65, 0x7c, 0x72, - 0x18, 0xca, 0x54, 0xeb, 0xb9, 0x3c, 0xbd, 0x3e, 0xad, 0xfe, 0x22, 0xc7, 0x78, 0x5c, 0x1f, 0xb8, - 0x9d, 0x1b, 0xa9, 0x2e, 0xee, 0xdb, 0x08, 0xf2, 0xd7, 0xe9, 0x48, 0x7f, 0x9b, 0x22, 0xb8, 0x3e, - 0x03, 0x0e, 0xd8, 0x6a, 0xfc, 0x2e, 0x82, 0x67, 0xaf, 0xd3, 0x70, 0x70, 0x7a, 0xc4, 0xd5, 0xd1, - 0x39, 0x4b, 0xb8, 0xdd, 0xe9, 0x31, 0x66, 0xc6, 0x79, 0xa1, 0xce, 0x91, 0xbd, 0x88, 0x4f, 0x65, - 0x39, 0x61, 0xb0, 0xe7, 0x98, 0x0f, 0x05, 0x8e, 0x3f, 0x22, 0x38, 0xd8, 0xfb, 0x92, 0x88, 0xd3, - 0x09, 0x75, 0xe0, 0x43, 0x63, 0xf9, 0xf6, 0xa4, 0x51, 0x36, 0xcd, 0x54, 0xbf, 0xc4, 0x91, 0xbf, - 0x8c, 0x5f, 0xca, 0x42, 0x1e, 0xf7, 0xe9, 0xea, 0x8f, 0xe4, 0xe7, 0x63, 0xfe, 0xea, 0xcd, 0x61, - 0xff, 0x09, 0xc1, 0x61, 0xc9, 0x77, 0xb3, 0x49, 0xfc, 0xf0, 0x0a, 0x65, 0x15, 0x76, 0x30, 0x96, - 0x3e, 0x13, 0x66, 0x0d, 0x55, 0x9e, 0x7e, 0x95, 0xeb, 0xf2, 0x71, 0xfc, 0xea, 0xbe, 0x75, 0x31, - 0x19, 0x1b, 0x4b, 0xc0, 0x7e, 0x13, 0xc1, 0xc2, 0x75, 0x1a, 0xde, 0x8a, 0x7b, 0xc5, 0x27, 0xc7, - 0x7a, 0x7f, 0x2a, 0xaf, 0xd4, 0x94, 0xc7, 0x76, 0xf9, 0x53, 0xec, 0x22, 0x6b, 0x1c, 0xdc, 0x29, - 0x7c, 0x32, 0x0b, 0x5c, 0xd2, 0x9f, 0x7e, 0x07, 0xc1, 0x11, 0x15, 0x44, 0xf2, 0x6e, 0xf7, 0xd1, - 0xfd, 0xbd, 0x86, 0x89, 0x37, 0xb5, 0x11, 0xe8, 0xd6, 0x39, 0xba, 0x33, 0xfa, 0x60, 0x07, 0x6e, - 0xf7, 0xa1, 0xd8, 0x40, 0xab, 0x55, 0x84, 0x7f, 0x8b, 0x60, 0x36, 0x6a, 0xd5, 0x0e, 0xb7, 0x51, - 0xea, 0x9d, 0x69, 0x9a, 0xd1, 0x40, 0xec, 0x76, 0xf9, 0xec, 0x60, 0x83, 0xaa, 0xeb, 0xa5, 0xab, - 0xd6, 0xb8, 0x95, 0xd3, 0x61, 0xec, 0x17, 0x08, 0x20, 0x69, 0x37, 0xe3, 0x17, 0xb3, 0xf5, 0x50, - 0x5a, 0xd2, 0xe5, 0xe9, 0x36, 0x9c, 0xf5, 0x1a, 0xd7, 0xa7, 0x5a, 0xae, 0x64, 0xc6, 0x10, 0x8f, - 0x9a, 0x1b, 0x51, 0x6b, 0xfa, 0x87, 0x08, 0x0a, 0xbc, 0xcb, 0x87, 0x4f, 0x0c, 0xc3, 0xac, 0x36, - 0x01, 0xa7, 0x69, 0xfa, 0x17, 0x38, 0xd4, 0xca, 0x7a, 0x56, 0x20, 0xde, 0x40, 0xab, 0xb8, 0x0b, - 0xb3, 0x51, 0x5f, 0x6d, 0xb8, 0x7b, 0xa4, 0xfa, 0x6e, 0xe5, 0x4a, 0x46, 0x61, 0x10, 0x39, 0xaa, - 0xc8, 0x01, 0xab, 0xa3, 0x72, 0xc0, 0x0c, 0x0b, 0xd3, 0xf8, 0x78, 0x56, 0x10, 0xff, 0x1f, 0x18, - 0xe6, 0x34, 0x47, 0x77, 0x52, 0xaf, 0x8c, 0xca, 0x03, 0xcc, 0x3a, 0xdf, 0x41, 0x70, 0xb0, 0xb7, - 0xb8, 0xc6, 0x47, 0x7b, 0x62, 0xa6, 0x7a, 0xd7, 0x28, 0xa7, 0xad, 0x38, 0xac, 0x30, 0xd7, 0x3f, - 0xc1, 0x51, 0x6c, 0xe0, 0x8b, 0x23, 0x4f, 0xc6, 0x6d, 0x19, 0x75, 0x18, 0xa3, 0xb5, 0xe4, 0xed, - 0xec, 0x97, 0x08, 0x16, 0x24, 0xdf, 0xbb, 0x3e, 0xa5, 0xd9, 0xb0, 0xa6, 0x77, 0x10, 0x98, 0x2c, - 0xfd, 0x15, 0x0e, 0xff, 0x63, 0xf8, 0xc2, 0x98, 0xf0, 0x25, 0xec, 0xb5, 0x90, 0x21, 0xfd, 0x3d, - 0x82, 0x43, 0xf7, 0x23, 0xbf, 0xff, 0x90, 0xf0, 0x6f, 0x72, 0xfc, 0xaf, 0xe2, 0x97, 0x33, 0xea, - 0xbc, 0x51, 0x6a, 0x9c, 0x45, 0xf8, 0x67, 0x08, 0x8a, 0xf2, 0xcd, 0x05, 0x9f, 0x1a, 0x7a, 0x30, - 0xd2, 0xaf, 0x32, 0xd3, 0x74, 0x66, 0x51, 0xd4, 0xe8, 0x27, 0x32, 0xd3, 0xa9, 0x90, 0xcf, 0x1c, - 0xfa, 0x6d, 0x04, 0x38, 0xbe, 0x33, 0xc7, 0xb7, 0x68, 0xfc, 0x42, 0x4a, 0xd4, 0xd0, 0xc6, 0x4c, - 0xf9, 0xd4, 0xc8, 0x79, 0xe9, 0x54, 0xba, 0x9a, 0x99, 0x4a, 0xdd, 0x58, 0xfe, 0xd7, 0x11, 0x94, - 0xae, 0xd3, 0xf8, 0x0e, 0x92, 0x61, 0xcb, 0xf4, 0x93, 0x51, 0xb9, 0x3a, 0x7a, 0xa2, 0x40, 0x74, - 0x86, 0x23, 0x7a, 0x01, 0x67, 0x9b, 0x4a, 0x02, 0xf8, 0x1e, 0x82, 0xc5, 0x3b, 0xaa, 0x8b, 0xe2, - 0x33, 0xa3, 0x24, 0xa5, 0x22, 0xf9, 0xf8, 0xb8, 0xce, 0x73, 0x5c, 0x6b, 0xfa, 0x58, 0xb8, 0x36, - 0xc4, 0xeb, 0xcb, 0xf7, 0x51, 0x74, 0x89, 0xed, 0xe9, 0x76, 0xff, 0xb7, 0x76, 0xcb, 0x68, 0x9a, - 0xeb, 0x17, 0x38, 0xbe, 0x1a, 0x3e, 0x33, 0x0e, 0xbe, 0xba, 0x68, 0x81, 0xe3, 0xef, 0x22, 0x38, - 0xc4, 0x5f, 0x22, 0x54, 0xc6, 0x3d, 0x29, 0x66, 0xd8, 0xbb, 0xc5, 0x18, 0x29, 0x46, 0xc4, 0x1f, - 0x7d, 0x5f, 0xa0, 0x36, 0xe4, 0x2b, 0xc3, 0x37, 0x10, 0x1c, 0x90, 0x49, 0x4d, 0xec, 0xee, 0xda, - 0x28, 0xc3, 0xed, 0x37, 0x09, 0x0a, 0x77, 0x5b, 0x1d, 0xcf, 0xdd, 0xde, 0x43, 0x30, 0x27, 0x7a, - 0xfd, 0x19, 0xa5, 0x82, 0xf2, 0x18, 0x50, 0xee, 0xe9, 0x71, 0x88, 0x66, 0xb0, 0xfe, 0x39, 0x2e, - 0xf6, 0x1e, 0xae, 0x67, 0x89, 0xf5, 0x5c, 0x2b, 0xa8, 0x3f, 0x12, 0x9d, 0xd8, 0xc7, 0xf5, 0x96, - 0xdb, 0x08, 0x5e, 0xd7, 0x71, 0x66, 0x42, 0x64, 0x73, 0xce, 0x22, 0x1c, 0xc2, 0x3c, 0x73, 0x0e, - 0xde, 0x38, 0xc1, 0x95, 0x9e, 0x36, 0x4b, 0x5f, 0x4f, 0xa5, 0x5c, 0xee, 0x6b, 0xc4, 0x24, 0x19, - 0x50, 0x5c, 0x63, 0xf1, 0xf3, 0x99, 0x62, 0xb9, 0xa0, 0xb7, 0x10, 0x1c, 0x52, 0xbd, 0x3d, 0x12, - 0x3f, 0xb6, 0xaf, 0x67, 0xa1, 0x10, 0x45, 0x35, 0x5e, 0x1d, 0xcb, 0x91, 0x38, 0x9c, 0xcb, 0xd7, - 0xfe, 0xf0, 0xe4, 0x18, 0x7a, 0xff, 0xc9, 0x31, 0xf4, 0xb7, 0x27, 0xc7, 0xd0, 0xeb, 0x17, 0xc7, - 0xfb, 0x07, 0xb1, 0xd9, 0xb2, 0xa9, 0x13, 0xaa, 0xec, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x88, - 0xb6, 0x78, 0x6a, 0x27, 0x2d, 0x00, 0x00, + // 3054 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5b, 0xdd, 0x8f, 0x1c, 0x47, + 0xb5, 0xbf, 0x35, 0xb3, 0xb3, 0x3b, 0x7b, 0xc6, 0xf6, 0x7a, 0x2b, 0xf6, 0xde, 0xce, 0x78, 0xe3, + 0xbb, 0x69, 0xdb, 0xf1, 0x64, 0xed, 0x9d, 0xb1, 0x37, 0xbe, 0xf7, 0x26, 0x9b, 0x44, 0xe0, 0xac, + 0x1d, 0xc7, 0x64, 0xed, 0x98, 0x5e, 0x27, 0x46, 0xe1, 0x81, 0x74, 0xba, 0x6b, 0x67, 0x9a, 0x9d, + 0xe9, 0x6e, 0x77, 0xd7, 0x8c, 0x59, 0x85, 0xbc, 0x04, 0x21, 0x21, 0x88, 0x40, 0x40, 0x1e, 0x10, + 0x20, 0x40, 0x89, 0x22, 0x21, 0x04, 0xe2, 0x05, 0x45, 0x48, 0x28, 0x12, 0x3c, 0x80, 0xe0, 0x21, + 0x52, 0x04, 0xff, 0x00, 0x8a, 0x10, 0x8f, 0xf0, 0x92, 0x67, 0x84, 0xaa, 0xba, 0xaa, 0xbb, 0x6a, + 0x3e, 0x7a, 0x66, 0x99, 0x85, 0xe4, 0x69, 0xfb, 0x54, 0x57, 0x9f, 0xfa, 0x9d, 0x53, 0xe7, 0xab, + 0x4e, 0xcd, 0xc2, 0xe9, 0x98, 0x44, 0x3d, 0x12, 0x35, 0xec, 0x30, 0x6c, 0x7b, 0x8e, 0x4d, 0xbd, + 0xc0, 0x57, 0x9f, 0xeb, 0x61, 0x14, 0xd0, 0x00, 0x57, 0x94, 0xa1, 0xea, 0x72, 0x33, 0x08, 0x9a, + 0x6d, 0xd2, 0xb0, 0x43, 0xaf, 0x61, 0xfb, 0x7e, 0x40, 0xf9, 0x70, 0x9c, 0x4c, 0xad, 0x9a, 0xbb, + 0x8f, 0xc6, 0x75, 0x2f, 0xe0, 0x6f, 0x9d, 0x20, 0x22, 0x8d, 0xde, 0xc5, 0x46, 0x93, 0xf8, 0x24, + 0xb2, 0x29, 0x71, 0xc5, 0x9c, 0x4b, 0xd9, 0x9c, 0x8e, 0xed, 0xb4, 0x3c, 0x9f, 0x44, 0x7b, 0x8d, + 0x70, 0xb7, 0xc9, 0x06, 0xe2, 0x46, 0x87, 0x50, 0x7b, 0xd8, 0x57, 0x5b, 0x4d, 0x8f, 0xb6, 0xba, + 0x2f, 0xd7, 0x9d, 0xa0, 0xd3, 0xb0, 0xa3, 0x66, 0x10, 0x46, 0xc1, 0xe7, 0xf9, 0xc3, 0x9a, 0xe3, + 0x36, 0x7a, 0x8f, 0x64, 0x0c, 0x54, 0x59, 0x7a, 0x17, 0xed, 0x76, 0xd8, 0xb2, 0x07, 0xb9, 0x5d, + 0x1d, 0xc3, 0x2d, 0x22, 0x61, 0x20, 0x74, 0xc3, 0x1f, 0x3d, 0x1a, 0x44, 0x7b, 0xca, 0x63, 0xc2, + 0xc6, 0xfc, 0x10, 0xc1, 0xd1, 0xcb, 0xd9, 0x7a, 0x9f, 0xee, 0x92, 0x68, 0x0f, 0x63, 0x98, 0xf1, + 0xed, 0x0e, 0x31, 0xd0, 0x0a, 0xaa, 0xcd, 0x5b, 0xfc, 0x19, 0x1b, 0x30, 0x17, 0x91, 0x9d, 0x88, + 0xc4, 0x2d, 0xa3, 0xc0, 0x87, 0x25, 0x89, 0xab, 0x50, 0x66, 0x8b, 0x13, 0x87, 0xc6, 0x46, 0x71, + 0xa5, 0x58, 0x9b, 0xb7, 0x52, 0x1a, 0xd7, 0x60, 0x21, 0x22, 0x71, 0xd0, 0x8d, 0x1c, 0xf2, 0x02, + 0x89, 0x62, 0x2f, 0xf0, 0x8d, 0x19, 0xfe, 0x75, 0xff, 0x30, 0xe3, 0x12, 0x93, 0x36, 0x71, 0x68, + 0x10, 0x19, 0x25, 0x3e, 0x25, 0xa5, 0x19, 0x1e, 0x06, 0xdc, 0x98, 0x4d, 0xf0, 0xb0, 0x67, 0x6c, + 0xc2, 0x21, 0x3b, 0x0c, 0x6f, 0xda, 0x1d, 0x12, 0x87, 0xb6, 0x43, 0x8c, 0x39, 0xfe, 0x4e, 0x1b, + 0x63, 0x98, 0x05, 0x12, 0xa3, 0xcc, 0x81, 0x49, 0xd2, 0xdc, 0x84, 0xf9, 0x9b, 0x81, 0x4b, 0x46, + 0x8b, 0xdb, 0xcf, 0xbe, 0x30, 0xc8, 0xde, 0xfc, 0x2d, 0x82, 0xe3, 0x16, 0xe9, 0x79, 0x0c, 0xff, + 0x0d, 0x42, 0x6d, 0xd7, 0xa6, 0x76, 0x3f, 0xc7, 0x42, 0xca, 0xb1, 0x0a, 0xe5, 0x48, 0x4c, 0x36, + 0x0a, 0x7c, 0x3c, 0xa5, 0x07, 0x56, 0x2b, 0xe6, 0x0b, 0x93, 0xa8, 0x50, 0x92, 0x78, 0x05, 0x2a, + 0x89, 0x2e, 0xaf, 0xfb, 0x2e, 0xf9, 0x02, 0xd7, 0x5e, 0xc9, 0x52, 0x87, 0xf0, 0x32, 0xcc, 0xf7, + 0x12, 0x3d, 0x5f, 0x77, 0xb9, 0x16, 0x4b, 0x56, 0x36, 0x60, 0xfe, 0x15, 0xc1, 0x49, 0xc5, 0x06, + 0x2c, 0xb1, 0x33, 0x57, 0x7b, 0xc4, 0xa7, 0xf1, 0x68, 0x81, 0xce, 0xc3, 0xa2, 0xdc, 0xc4, 0x7e, + 0x3d, 0x0d, 0xbe, 0x60, 0x22, 0xaa, 0x83, 0x52, 0x44, 0x75, 0x8c, 0x09, 0x22, 0xe9, 0xe7, 0xaf, + 0x5f, 0x11, 0x62, 0xaa, 0x43, 0x03, 0x8a, 0x2a, 0xe5, 0x2b, 0x6a, 0x56, 0x53, 0x94, 0xf9, 0x3e, + 0x02, 0x43, 0x11, 0xf4, 0x86, 0xed, 0x7b, 0x3b, 0x24, 0xa6, 0x93, 0xee, 0x19, 0x3a, 0xc0, 0x3d, + 0xab, 0xc1, 0x42, 0x22, 0xd5, 0x2d, 0xe6, 0x8f, 0x2c, 0xfe, 0x18, 0xa5, 0x95, 0x62, 0xad, 0x68, + 0xf5, 0x0f, 0xb3, 0xbd, 0x93, 0x6b, 0xc6, 0xc6, 0x2c, 0x37, 0xe3, 0x6c, 0xc0, 0x7c, 0x10, 0xe6, + 0x9f, 0xf6, 0xda, 0x64, 0xb3, 0xd5, 0xf5, 0x77, 0xf1, 0x31, 0x28, 0x39, 0xec, 0x81, 0xcb, 0x70, + 0xc8, 0x4a, 0x08, 0xf3, 0x9b, 0x08, 0x1e, 0x1c, 0x25, 0xf5, 0x1d, 0x8f, 0xb6, 0xd8, 0xf7, 0xf1, + 0x28, 0xf1, 0x9d, 0x16, 0x71, 0x76, 0xe3, 0x6e, 0x47, 0x9a, 0xac, 0xa4, 0xa7, 0x13, 0xdf, 0x7c, + 0x16, 0x4e, 0x28, 0x90, 0x5e, 0xb0, 0xdb, 0x9e, 0x6b, 0x53, 0x62, 0x91, 0x38, 0x0c, 0xfc, 0x98, + 0x30, 0x41, 0x48, 0x14, 0x05, 0x91, 0x70, 0xc9, 0x84, 0xc0, 0x4b, 0x30, 0x4b, 0x7c, 0xea, 0xd1, + 0x3d, 0xb1, 0x17, 0x82, 0x32, 0x5f, 0x02, 0x53, 0x35, 0xdf, 0xa0, 0xdd, 0x0e, 0xba, 0x94, 0xfd, + 0x79, 0xd9, 0x76, 0x76, 0x53, 0x9e, 0x2c, 0x80, 0x25, 0xaf, 0x84, 0x8c, 0x92, 0x64, 0x66, 0xe7, + 0x93, 0x7b, 0x96, 0xea, 0x9c, 0x45, 0x4b, 0x1d, 0x32, 0x7f, 0x82, 0xa0, 0x36, 0x56, 0x85, 0x77, + 0x22, 0x3b, 0x0c, 0x49, 0x84, 0x9f, 0x86, 0xd2, 0x5d, 0xf6, 0x82, 0x83, 0xaf, 0xac, 0xd7, 0xeb, + 0x6a, 0x3e, 0x1a, 0xcb, 0xe5, 0x99, 0xff, 0xb2, 0x92, 0xcf, 0x71, 0x5d, 0xee, 0x66, 0x81, 0xf3, + 0x59, 0xd2, 0xf8, 0xa4, 0x9b, 0xce, 0xe6, 0xf3, 0x69, 0x4f, 0xcd, 0xc2, 0x4c, 0x68, 0x47, 0xd4, + 0x3c, 0x0e, 0xf7, 0xe9, 0xde, 0xcc, 0xe5, 0x37, 0x7f, 0xa5, 0x1b, 0xff, 0x66, 0x44, 0xb8, 0xc6, + 0xef, 0x76, 0x49, 0x4c, 0xf1, 0x2e, 0xa8, 0x29, 0x92, 0x2b, 0xa8, 0xb2, 0x7e, 0xbd, 0x9e, 0xe5, + 0x98, 0xba, 0xcc, 0x31, 0xfc, 0xe1, 0x73, 0x8e, 0x5b, 0xef, 0x3d, 0x52, 0x0f, 0x77, 0x9b, 0x75, + 0x96, 0xb1, 0x34, 0x64, 0x32, 0x63, 0xa9, 0xa2, 0x5a, 0x2a, 0x77, 0xb6, 0x8f, 0xdd, 0x30, 0x26, + 0x11, 0xe5, 0x92, 0x95, 0x2d, 0x41, 0x31, 0x73, 0xeb, 0x09, 0x4b, 0xe0, 0xe6, 0x54, 0xb6, 0x52, + 0xda, 0x7c, 0x57, 0x47, 0xff, 0x7c, 0xe8, 0x7e, 0x54, 0xe8, 0x55, 0x94, 0x05, 0x1d, 0xa5, 0x6a, + 0xf0, 0x45, 0xdd, 0xe0, 0x7f, 0xa1, 0xe3, 0xbf, 0x42, 0xda, 0x24, 0xc3, 0x3f, 0xcc, 0xf7, 0x0c, + 0x98, 0x73, 0xec, 0xd8, 0xb1, 0x5d, 0xb9, 0x8a, 0x24, 0x59, 0xdc, 0x0d, 0xa3, 0x20, 0xb4, 0x9b, + 0x9c, 0xd3, 0xad, 0xa0, 0xed, 0x39, 0x7b, 0x62, 0xb9, 0xc1, 0x17, 0x03, 0x7e, 0x3a, 0x93, 0xef, + 0xa7, 0x25, 0x1d, 0xf6, 0x29, 0xa8, 0x6c, 0xef, 0xf9, 0xce, 0x73, 0x61, 0x12, 0x8b, 0x8e, 0x41, + 0xc9, 0xa3, 0xa4, 0x13, 0x1b, 0x88, 0xc7, 0xa1, 0x84, 0x30, 0xff, 0x51, 0x82, 0x25, 0x45, 0x36, + 0xf6, 0x41, 0x9e, 0x64, 0x79, 0x41, 0x75, 0x09, 0x66, 0xdd, 0x68, 0xcf, 0xea, 0xfa, 0xc2, 0x00, + 0x04, 0xc5, 0x16, 0x0e, 0xa3, 0xae, 0x9f, 0xc0, 0x2f, 0x5b, 0x09, 0x81, 0x77, 0xa0, 0x1c, 0x53, + 0x56, 0x14, 0x35, 0xf7, 0x38, 0xf0, 0xca, 0xfa, 0xa7, 0xa6, 0xdb, 0x74, 0x06, 0x7d, 0x5b, 0x70, + 0xb4, 0x52, 0xde, 0xf8, 0x2e, 0x0b, 0xc1, 0x49, 0x5c, 0x8e, 0x8d, 0xb9, 0x95, 0x62, 0xad, 0xb2, + 0xbe, 0x3d, 0xfd, 0x42, 0xcf, 0x85, 0xac, 0xa0, 0x53, 0x12, 0xae, 0x95, 0xad, 0xc2, 0xa2, 0x7e, + 0x47, 0xc4, 0x87, 0x58, 0x14, 0x2f, 0xd9, 0x00, 0xfe, 0x0c, 0x94, 0x3c, 0x7f, 0x27, 0x88, 0x8d, + 0x79, 0x0e, 0xe6, 0xa9, 0xe9, 0xc0, 0x5c, 0xf7, 0x77, 0x02, 0x2b, 0x61, 0x88, 0xef, 0xc2, 0xe1, + 0x88, 0xd0, 0x68, 0x4f, 0x6a, 0xc1, 0x00, 0xae, 0xd7, 0x67, 0xa7, 0x5b, 0xc1, 0x52, 0x59, 0x5a, + 0xfa, 0x0a, 0x78, 0x03, 0x2a, 0x71, 0x66, 0x63, 0x46, 0x85, 0x2f, 0x68, 0x68, 0x8c, 0x14, 0x1b, + 0xb4, 0xd4, 0xc9, 0x03, 0xd6, 0x7d, 0x28, 0xdf, 0xba, 0x0f, 0x8f, 0x4d, 0xc2, 0x47, 0x26, 0x48, + 0xc2, 0x0b, 0xfd, 0x49, 0xf8, 0x6b, 0x08, 0x96, 0x07, 0xd3, 0x19, 0xdf, 0xd9, 0xff, 0x7c, 0x80, + 0x32, 0xdf, 0xd3, 0xf3, 0xfd, 0x40, 0x3e, 0x1c, 0xed, 0x99, 0xcb, 0x30, 0xef, 0x2b, 0x95, 0x1c, + 0x7b, 0x91, 0x0d, 0xf0, 0xea, 0x2c, 0xe1, 0x25, 0x0a, 0xb8, 0x02, 0xaf, 0xce, 0xb2, 0x21, 0xbc, + 0x0a, 0x47, 0x15, 0x52, 0xc6, 0x1b, 0x36, 0x6d, 0x60, 0x9c, 0x9f, 0x0c, 0x04, 0x32, 0x19, 0x0c, + 0x4a, 0x3c, 0xf1, 0xf6, 0x0f, 0x9b, 0x7f, 0xd7, 0xb5, 0x9b, 0x84, 0xfe, 0xed, 0x90, 0xe4, 0x06, + 0x19, 0x1b, 0x66, 0xe2, 0x90, 0x38, 0x5c, 0x8a, 0xca, 0xfa, 0x8d, 0x03, 0x53, 0x35, 0x5f, 0x97, + 0xb3, 0xce, 0x4b, 0x57, 0x53, 0x46, 0xdd, 0x1f, 0x22, 0xf8, 0x6f, 0x65, 0xcd, 0x5b, 0x36, 0x75, + 0x5a, 0x79, 0xc2, 0xb2, 0xe8, 0xc8, 0xe6, 0x88, 0x3d, 0x4b, 0x08, 0xb6, 0x9b, 0xfc, 0xe1, 0xf6, + 0x5e, 0x28, 0x77, 0x2b, 0x1b, 0x98, 0xb2, 0x92, 0xfe, 0x29, 0x82, 0x6a, 0x9f, 0x8d, 0x8d, 0x33, + 0xae, 0x23, 0x50, 0xf0, 0x5c, 0x51, 0x5c, 0x15, 0x3c, 0x77, 0x9f, 0xa1, 0xbe, 0x1f, 0xee, 0x6c, + 0x3e, 0xdc, 0x39, 0x1d, 0xee, 0x87, 0x7d, 0x70, 0x65, 0xc0, 0x9d, 0xdc, 0x17, 0x90, 0xee, 0x0b, + 0x83, 0xa7, 0x99, 0xc2, 0xc0, 0x69, 0xc6, 0x80, 0xb9, 0x5e, 0x7a, 0xe6, 0xe5, 0x05, 0xa7, 0x20, + 0x99, 0x88, 0xcd, 0x28, 0xe8, 0x86, 0x42, 0xe9, 0x09, 0xc1, 0x50, 0xec, 0x7a, 0x3e, 0x3b, 0x9f, + 0x71, 0x14, 0xec, 0x79, 0xff, 0xa7, 0x5c, 0x4d, 0xec, 0xb7, 0x11, 0x1c, 0xdf, 0x6c, 0xd9, 0x7e, + 0x93, 0x48, 0x67, 0x92, 0x12, 0x1b, 0x30, 0x27, 0x78, 0xc8, 0x62, 0x58, 0x90, 0x63, 0xe4, 0xae, + 0xc1, 0x82, 0xd3, 0x8d, 0x22, 0xe2, 0x67, 0x5e, 0x9b, 0x54, 0x1e, 0xfd, 0xc3, 0x2c, 0x16, 0x84, + 0x2c, 0x42, 0x06, 0xdd, 0x38, 0x9d, 0x9a, 0x78, 0xc1, 0xc0, 0xb8, 0x79, 0x09, 0x96, 0xfa, 0x61, + 0x8a, 0xa2, 0x5d, 0xad, 0x15, 0x90, 0x7e, 0x68, 0x36, 0x7f, 0x56, 0x80, 0xff, 0x19, 0xb2, 0xa9, + 0x63, 0xbd, 0xe5, 0xe3, 0xb1, 0xb3, 0xa9, 0xcf, 0xce, 0x8d, 0xf4, 0xd9, 0xf2, 0x38, 0x9f, 0x9d, + 0xcf, 0xb7, 0x06, 0xd0, 0xad, 0xe1, 0xc7, 0x05, 0x58, 0x19, 0xa2, 0xaf, 0xf1, 0xa5, 0xe8, 0xc7, + 0x46, 0x61, 0x3b, 0x41, 0x24, 0x7c, 0xa0, 0x6c, 0x25, 0x04, 0x8b, 0x22, 0x41, 0x14, 0xb6, 0x6c, + 0x9f, 0xdb, 0x7e, 0xd9, 0x12, 0xd4, 0x94, 0xaa, 0xfa, 0x6a, 0x01, 0x0c, 0xa9, 0x9f, 0xcb, 0x0e, + 0xd7, 0x56, 0xd7, 0xff, 0xf8, 0xab, 0x68, 0x09, 0x66, 0x6d, 0x8e, 0x56, 0x18, 0x95, 0xa0, 0x06, + 0x94, 0x51, 0xce, 0x57, 0xc6, 0xbc, 0xae, 0x8c, 0x2f, 0x23, 0x38, 0xa1, 0x2b, 0x23, 0xde, 0xf2, + 0x62, 0x9a, 0xfa, 0xe8, 0x0e, 0xcc, 0x25, 0xeb, 0x24, 0xc7, 0x82, 0xca, 0xfa, 0xd6, 0xb4, 0xc5, + 0xa2, 0xa6, 0x78, 0xc9, 0xdc, 0x7c, 0x4c, 0xeb, 0x19, 0x64, 0x31, 0x3c, 0x0b, 0x15, 0xb2, 0x40, + 0x96, 0xa1, 0x42, 0xd2, 0xe6, 0x5b, 0x33, 0x7a, 0x42, 0x0d, 0xdc, 0xad, 0xa0, 0x99, 0xd3, 0xda, + 0xca, 0xdf, 0x4e, 0xa6, 0xaa, 0xc0, 0x55, 0xba, 0x58, 0x92, 0x64, 0xdf, 0x39, 0x81, 0x4f, 0x6d, + 0xcf, 0x27, 0x91, 0x88, 0x76, 0xd9, 0x00, 0xdb, 0x86, 0xd8, 0xf3, 0x1d, 0xb2, 0x4d, 0x9c, 0xc0, + 0x77, 0x63, 0xbe, 0x9f, 0x45, 0x4b, 0x1b, 0xc3, 0xcf, 0xc0, 0x3c, 0xa7, 0x6f, 0x7b, 0x9d, 0x24, + 0xc9, 0x55, 0xd6, 0x57, 0xeb, 0x49, 0xbb, 0xb9, 0xae, 0xb6, 0x9b, 0x33, 0x1d, 0x76, 0x08, 0xb5, + 0xeb, 0xbd, 0x8b, 0x75, 0xf6, 0x85, 0x95, 0x7d, 0xcc, 0xb0, 0x50, 0xdb, 0x6b, 0x6f, 0x79, 0x3e, + 0x3f, 0xb4, 0xb0, 0xa5, 0xb2, 0x01, 0x66, 0x2a, 0x3b, 0xac, 0xce, 0xba, 0x27, 0xfd, 0x26, 0xa1, + 0xd8, 0x57, 0x5d, 0x9f, 0x7a, 0x6d, 0xbe, 0x7e, 0x62, 0x08, 0xd9, 0x00, 0xff, 0xca, 0x6b, 0x53, + 0x12, 0x09, 0x87, 0x11, 0x54, 0x6a, 0x8c, 0x95, 0xa4, 0x83, 0x2a, 0xfd, 0x35, 0x31, 0xdb, 0x43, + 0xaa, 0xd9, 0xf6, 0xbb, 0xc2, 0xe1, 0x21, 0x6d, 0x40, 0xde, 0x50, 0x4e, 0x52, 0x84, 0x71, 0x24, + 0x29, 0xac, 0x24, 0x3d, 0x60, 0xca, 0x0b, 0xf9, 0xa6, 0x7c, 0x54, 0x2f, 0xf8, 0xf9, 0xa9, 0x8a, + 0x3a, 0xad, 0x4d, 0x3b, 0x26, 0xc6, 0x22, 0x67, 0x9d, 0x0d, 0x98, 0xbf, 0x46, 0x50, 0xde, 0x0a, + 0x9a, 0x57, 0x7d, 0x1a, 0xed, 0xf1, 0xf3, 0x77, 0xe0, 0x53, 0xe2, 0xa7, 0xed, 0x22, 0x41, 0xb2, + 0x2d, 0xa2, 0x5e, 0x87, 0x6c, 0x53, 0xbb, 0x13, 0x8a, 0xfa, 0x72, 0x5f, 0x5b, 0x94, 0x7e, 0xcc, + 0xd4, 0xd6, 0xb6, 0x63, 0xca, 0xe3, 0x41, 0xd9, 0xe2, 0xcf, 0x4c, 0xc0, 0x74, 0xc2, 0x36, 0x8d, + 0x44, 0x30, 0xd0, 0xc6, 0x54, 0x03, 0x2c, 0x25, 0xd8, 0x04, 0x69, 0x76, 0xe0, 0xfe, 0xf4, 0x58, + 0x79, 0x9b, 0x44, 0x1d, 0xcf, 0xb7, 0xf3, 0x63, 0xfb, 0x04, 0x7d, 0xee, 0x9c, 0xae, 0x46, 0xa0, + 0xb9, 0x24, 0x3b, 0xa5, 0xdd, 0xf1, 0x7c, 0x37, 0xb8, 0x97, 0xe3, 0x5a, 0xd3, 0x2d, 0xf8, 0x47, + 0xbd, 0x55, 0xad, 0xac, 0x98, 0xc6, 0x81, 0x67, 0xe0, 0x30, 0x8b, 0x18, 0x3d, 0x22, 0x5e, 0x88, + 0xa0, 0x64, 0x8e, 0x6a, 0xc3, 0x65, 0x3c, 0x2c, 0xfd, 0x43, 0xbc, 0x05, 0x0b, 0x76, 0x1c, 0x7b, + 0x4d, 0x9f, 0xb8, 0x92, 0x57, 0x61, 0x62, 0x5e, 0xfd, 0x9f, 0x26, 0x0d, 0x1d, 0x3e, 0x43, 0xec, + 0xb7, 0x24, 0xcd, 0x2f, 0x21, 0x38, 0x3e, 0x94, 0x49, 0xea, 0x57, 0x48, 0x09, 0xf2, 0x55, 0x28, + 0xc7, 0x4e, 0x8b, 0xb8, 0xdd, 0xb6, 0x3c, 0xa3, 0xa5, 0x34, 0x7b, 0xe7, 0x76, 0x93, 0xdd, 0x17, + 0x49, 0x26, 0xa5, 0xf1, 0x49, 0x80, 0x8e, 0xed, 0x77, 0xed, 0x36, 0x87, 0x30, 0xc3, 0x21, 0x28, + 0x23, 0xe6, 0x32, 0x54, 0x87, 0x99, 0x8e, 0xe8, 0x1e, 0xfe, 0x0d, 0xc1, 0x11, 0x19, 0x72, 0xc5, + 0xee, 0xd6, 0x60, 0x41, 0x51, 0x83, 0x52, 0x4b, 0xf6, 0x0f, 0x8f, 0x09, 0xa7, 0xd2, 0x4a, 0x8a, + 0xfa, 0x6d, 0x53, 0x4f, 0xbb, 0x2f, 0x9a, 0x38, 0x1b, 0xa2, 0x03, 0xaa, 0x9d, 0xbf, 0x08, 0xc6, + 0x0d, 0xdb, 0xb7, 0x9b, 0xc4, 0x4d, 0xc5, 0x4e, 0x4d, 0xec, 0x25, 0xb5, 0x0d, 0x36, 0x75, 0xd3, + 0x29, 0x2d, 0xc4, 0xbc, 0x9d, 0x1d, 0xd9, 0x52, 0x8b, 0xa0, 0xbc, 0xe5, 0xf9, 0xbb, 0xd7, 0xfd, + 0x9d, 0x80, 0x49, 0x4c, 0x3d, 0xda, 0x96, 0xda, 0x4d, 0x08, 0x7c, 0x14, 0x8a, 0xdd, 0xa8, 0x2d, + 0x2c, 0x80, 0x3d, 0xb2, 0xf3, 0xb9, 0x4b, 0x62, 0x27, 0xf2, 0x42, 0x9a, 0xd5, 0xe5, 0xea, 0x10, + 0xdb, 0x07, 0xcf, 0x09, 0xfc, 0xcd, 0xb6, 0x1d, 0xc7, 0x32, 0x3d, 0xa5, 0x03, 0xe6, 0x13, 0x70, + 0x98, 0xad, 0x99, 0x89, 0x79, 0x4e, 0x17, 0xf3, 0xb8, 0x06, 0x5f, 0xc2, 0x93, 0x88, 0x6d, 0xb8, + 0x8f, 0x55, 0x05, 0x97, 0xc3, 0x50, 0x30, 0x99, 0xb0, 0x58, 0x2a, 0x0e, 0xcb, 0xae, 0x43, 0x2f, + 0x0d, 0xd6, 0xdf, 0x3d, 0x0b, 0x58, 0xf5, 0x13, 0x12, 0xf5, 0x3c, 0x87, 0xe0, 0x6f, 0x21, 0x98, + 0x61, 0x4b, 0xe3, 0x07, 0x46, 0xb9, 0x25, 0xb7, 0xd7, 0xea, 0xc1, 0x35, 0x01, 0xd8, 0x6a, 0xe6, + 0xf2, 0x6b, 0x7f, 0xfa, 0xcb, 0xb7, 0x0b, 0x4b, 0xf8, 0x18, 0xbf, 0x2a, 0xee, 0x5d, 0x54, 0xaf, + 0x6d, 0x63, 0xfc, 0x3a, 0x02, 0x2c, 0xaa, 0x24, 0xe5, 0x32, 0x0d, 0x9f, 0x1b, 0x05, 0x71, 0xc8, + 0xa5, 0x5b, 0xf5, 0x01, 0x25, 0xab, 0xd4, 0x9d, 0x20, 0x22, 0x2c, 0x87, 0xf0, 0x09, 0x1c, 0xc0, + 0x2a, 0x07, 0x70, 0x1a, 0x9b, 0xc3, 0x00, 0x34, 0x5e, 0x61, 0x1a, 0x7d, 0xb5, 0x41, 0x92, 0x75, + 0xdf, 0x44, 0x50, 0xba, 0xc3, 0x4f, 0x18, 0x63, 0x94, 0xb4, 0x7d, 0x60, 0x4a, 0xe2, 0xcb, 0x71, + 0xb4, 0xe6, 0x29, 0x8e, 0xf4, 0x01, 0x7c, 0x42, 0x22, 0x8d, 0x69, 0x44, 0xec, 0x8e, 0x06, 0xf8, + 0x02, 0xc2, 0x6f, 0x23, 0x98, 0x4d, 0xae, 0x25, 0xf0, 0x99, 0x51, 0x28, 0xb5, 0x6b, 0x8b, 0xea, + 0xc1, 0xb5, 0xd0, 0xcc, 0x87, 0x39, 0xc6, 0x53, 0xe6, 0xd0, 0xed, 0xdc, 0xd0, 0x6e, 0x00, 0xde, + 0x40, 0x50, 0xbc, 0x46, 0xc6, 0xda, 0xdb, 0x01, 0x82, 0x1b, 0x50, 0xe0, 0x90, 0xad, 0xc6, 0x6f, + 0x21, 0xb8, 0xff, 0x1a, 0xa1, 0xc3, 0xd3, 0x23, 0xae, 0x8d, 0xcf, 0x59, 0xc2, 0xec, 0xce, 0x4d, + 0x30, 0x33, 0xcd, 0x0b, 0x0d, 0x8e, 0xec, 0x61, 0x7c, 0x36, 0xcf, 0x08, 0xe3, 0x3d, 0xdf, 0xb9, + 0x27, 0x70, 0xfc, 0x01, 0xc1, 0xd1, 0xfe, 0x4b, 0x73, 0xac, 0x27, 0xd4, 0xa1, 0x77, 0xea, 0xd5, + 0x9b, 0xd3, 0x46, 0x59, 0x9d, 0xa9, 0x79, 0x99, 0x23, 0x7f, 0x1c, 0x3f, 0x96, 0x87, 0x3c, 0xed, + 0xf1, 0x36, 0x5e, 0x91, 0x8f, 0xaf, 0xf2, 0x1f, 0x78, 0x70, 0xd8, 0xef, 0x21, 0x38, 0x26, 0xf9, + 0x6e, 0xb6, 0xec, 0x88, 0x5e, 0x21, 0xac, 0xc2, 0x8e, 0x27, 0x92, 0x67, 0xca, 0xac, 0xa1, 0xae, + 0x67, 0x5e, 0xe5, 0xb2, 0x7c, 0x02, 0x3f, 0xb9, 0x6f, 0x59, 0x1c, 0xc6, 0xc6, 0x15, 0xb0, 0x5f, + 0x43, 0x70, 0xe8, 0x1a, 0xa1, 0x37, 0xd2, 0x7b, 0x86, 0x33, 0x13, 0xdd, 0x5d, 0x56, 0x97, 0xeb, + 0xca, 0xef, 0x4a, 0xe4, 0xab, 0xd4, 0x44, 0xd6, 0x38, 0xb8, 0xb3, 0xf8, 0x4c, 0x1e, 0xb8, 0xec, + 0x6e, 0xe3, 0x4d, 0x04, 0xc7, 0x55, 0x10, 0xd9, 0x15, 0xf5, 0xff, 0xee, 0xef, 0x26, 0x55, 0xdc, + 0xc7, 0x8e, 0x41, 0xb7, 0xce, 0xd1, 0x9d, 0x37, 0x87, 0x1b, 0x70, 0x67, 0x00, 0xc5, 0x06, 0x5a, + 0xad, 0x21, 0xfc, 0x1b, 0x04, 0xb3, 0x49, 0x23, 0x7a, 0xb4, 0x8e, 0xb4, 0x3b, 0xca, 0x83, 0x8c, + 0x06, 0x62, 0xb7, 0xab, 0x17, 0x86, 0x2b, 0x54, 0xfd, 0x5e, 0x9a, 0x6a, 0x9d, 0x6b, 0x59, 0x0f, + 0x63, 0xef, 0x20, 0x80, 0xac, 0x99, 0x8e, 0x1f, 0xce, 0x97, 0x43, 0x69, 0xb8, 0x57, 0x0f, 0xb6, + 0x9d, 0x6e, 0xd6, 0xb9, 0x3c, 0xb5, 0xea, 0x4a, 0x6e, 0x0c, 0x09, 0x89, 0xb3, 0x91, 0x34, 0xde, + 0x7f, 0x84, 0xa0, 0xc4, 0xbb, 0x7c, 0xf8, 0xf4, 0x28, 0xcc, 0x6a, 0x13, 0xf0, 0x20, 0x55, 0xff, + 0x10, 0x87, 0xba, 0xb2, 0x9e, 0x17, 0x88, 0x37, 0xd0, 0x2a, 0xee, 0xc1, 0x6c, 0xd2, 0x57, 0x1b, + 0x6d, 0x1e, 0x5a, 0xdf, 0xad, 0xba, 0x92, 0x53, 0x18, 0x24, 0x86, 0x2a, 0x72, 0xc0, 0xea, 0xb8, + 0x1c, 0x30, 0xc3, 0xc2, 0x34, 0x3e, 0x95, 0x17, 0xc4, 0xff, 0x0d, 0x8a, 0x39, 0xc7, 0xd1, 0x9d, + 0x31, 0x57, 0xc6, 0xe5, 0x01, 0xa6, 0x9d, 0xef, 0x20, 0x38, 0xda, 0x5f, 0x5c, 0xe3, 0x13, 0x7d, + 0x31, 0x53, 0x3d, 0x6b, 0x54, 0x75, 0x2d, 0x8e, 0x2a, 0xcc, 0xcd, 0x4f, 0x72, 0x14, 0x1b, 0xf8, + 0xd1, 0xb1, 0x9e, 0x71, 0x53, 0x46, 0x1d, 0xc6, 0x68, 0x2d, 0xbb, 0x77, 0xfd, 0x25, 0x82, 0x43, + 0x92, 0xef, 0xed, 0x88, 0x90, 0x7c, 0x58, 0x07, 0xe7, 0x08, 0x6c, 0x2d, 0xf3, 0x09, 0x0e, 0xff, + 0xff, 0xf0, 0xa5, 0x09, 0xe1, 0x4b, 0xd8, 0x6b, 0x94, 0x21, 0xfd, 0x1d, 0x82, 0xc5, 0x3b, 0x89, + 0xdd, 0x7f, 0x44, 0xf8, 0x37, 0x39, 0xfe, 0x27, 0xf1, 0xe3, 0x39, 0x75, 0xde, 0x38, 0x31, 0x2e, + 0x20, 0xfc, 0x73, 0x04, 0x65, 0x79, 0xa3, 0x84, 0xcf, 0x8e, 0x74, 0x0c, 0xfd, 0xce, 0xe9, 0x20, + 0x8d, 0x59, 0x14, 0x35, 0xe6, 0xe9, 0xdc, 0x74, 0x2a, 0xd6, 0x67, 0x06, 0xfd, 0x06, 0x02, 0x9c, + 0x9e, 0x99, 0xd3, 0x53, 0x34, 0x7e, 0x48, 0x5b, 0x6a, 0x64, 0x63, 0xa6, 0x7a, 0x76, 0xec, 0x3c, + 0x3d, 0x95, 0xae, 0xe6, 0xa6, 0xd2, 0x20, 0x5d, 0xff, 0xeb, 0x08, 0x2a, 0xd7, 0x48, 0x7a, 0x06, + 0xc9, 0xd1, 0xa5, 0x7e, 0x21, 0x56, 0xad, 0x8d, 0x9f, 0x28, 0x10, 0x9d, 0xe7, 0x88, 0x1e, 0xc2, + 0xf9, 0xaa, 0x92, 0x00, 0xbe, 0x8f, 0xe0, 0xf0, 0x2d, 0xd5, 0x44, 0xf1, 0xf9, 0x71, 0x2b, 0x69, + 0x91, 0x7c, 0x72, 0x5c, 0x8f, 0x70, 0x5c, 0x6b, 0xe6, 0x44, 0xb8, 0x36, 0xc4, 0xed, 0xcb, 0x0f, + 0x50, 0x72, 0x88, 0xed, 0xeb, 0x76, 0xff, 0xab, 0x7a, 0xcb, 0x69, 0x9a, 0x9b, 0x97, 0x38, 0xbe, + 0x3a, 0x3e, 0x3f, 0x09, 0xbe, 0x86, 0x68, 0x81, 0xe3, 0xef, 0x22, 0x58, 0xe4, 0x37, 0x11, 0x2a, + 0xe3, 0xbe, 0x14, 0x33, 0xea, 0xde, 0x62, 0x82, 0x14, 0x23, 0xe2, 0x8f, 0xb9, 0x2f, 0x50, 0x1b, + 0xf2, 0x96, 0xe1, 0x1d, 0x04, 0x55, 0xe9, 0x94, 0x83, 0xbf, 0x3f, 0xc0, 0xf5, 0x3c, 0x47, 0x1e, + 0xfc, 0x81, 0x42, 0xb5, 0x31, 0xf1, 0x7c, 0x81, 0xfe, 0xff, 0x39, 0xfa, 0x8b, 0x63, 0xd0, 0x27, + 0x1f, 0xaf, 0xa9, 0xde, 0xfb, 0x0d, 0x04, 0x47, 0x64, 0x36, 0x16, 0x66, 0xb9, 0x36, 0x6e, 0xc7, + 0xf7, 0x9b, 0xbd, 0x85, 0x9f, 0xac, 0x4e, 0xe6, 0x27, 0xdf, 0x43, 0xb0, 0x28, 0x7f, 0x14, 0xb9, + 0x1d, 0x39, 0x97, 0x7d, 0xf7, 0x4a, 0x4c, 0x47, 0x57, 0x68, 0x03, 0x3f, 0x38, 0x19, 0xed, 0x28, + 0xfd, 0x3f, 0xb5, 0x34, 0x2f, 0x72, 0x60, 0xe7, 0xcc, 0xe5, 0x21, 0xc0, 0xd6, 0xe4, 0xef, 0x19, + 0xf4, 0xc2, 0xf1, 0x6d, 0x04, 0x73, 0xe2, 0x0a, 0x25, 0xa7, 0x02, 0x53, 0xee, 0x58, 0xaa, 0x7d, + 0xad, 0x23, 0xd1, 0x63, 0x37, 0x3f, 0xcb, 0xd7, 0x7e, 0x1e, 0x37, 0xf2, 0x94, 0x12, 0x06, 0x6e, + 0xdc, 0x78, 0x45, 0x34, 0xb8, 0x5f, 0x6d, 0xb4, 0x83, 0x66, 0xfc, 0xa2, 0x89, 0x73, 0xeb, 0x0c, + 0x36, 0xe7, 0x02, 0xc2, 0x14, 0xe6, 0x99, 0xcf, 0xf1, 0x7e, 0x14, 0x5e, 0xe9, 0xeb, 0x5e, 0x0d, + 0xb4, 0xaa, 0xaa, 0xd5, 0x81, 0xfe, 0x56, 0x56, 0x58, 0x88, 0xee, 0x00, 0x7e, 0x30, 0x77, 0x59, + 0xbe, 0xd0, 0xeb, 0x08, 0x16, 0xd5, 0x20, 0x92, 0x2c, 0x3f, 0x71, 0x08, 0xc9, 0x43, 0x21, 0xce, + 0x2a, 0x78, 0x75, 0x22, 0xff, 0x4c, 0xe0, 0x7c, 0x05, 0xc1, 0xe2, 0x35, 0x42, 0xf5, 0xfb, 0xf5, + 0xbe, 0x03, 0xea, 0xd0, 0xdf, 0x08, 0x54, 0x4f, 0xe5, 0xce, 0x11, 0x90, 0xf2, 0x9a, 0x50, 0xec, + 0x70, 0xa9, 0x7c, 0xf3, 0xd4, 0xd3, 0xbf, 0xff, 0xe0, 0x24, 0x7a, 0xff, 0x83, 0x93, 0xe8, 0xcf, + 0x1f, 0x9c, 0x44, 0x2f, 0x3e, 0x3a, 0xd9, 0xbf, 0x43, 0x38, 0x6d, 0x8f, 0xf8, 0x54, 0x65, 0xfb, + 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, 0x3e, 0x2a, 0x68, 0xf4, 0x31, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3086,14 +3464,19 @@ type ApplicationServiceClient interface { ListResourceActions(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*ResourceActionsListResponse, error) // RunResourceAction run resource action RunResourceAction(ctx context.Context, in *ResourceActionRunRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) + // Rollback application rollout + RollbackApplicationRollout(ctx context.Context, in *ApplicationRolloutRollbackRequest, opts ...grpc.CallOption) (*ApplicationRolloutRollbackResponse, error) // DeleteResource deletes a single application resource DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) + // Create creates an application + ValidateSrcAndDst(ctx context.Context, in *ApplicationValidationRequest, opts ...grpc.CallOption) (*ApplicationValidateResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(ctx context.Context, in *ApplicationPodLogsQuery, opts ...grpc.CallOption) (ApplicationService_PodLogsClient, error) // ListLinks returns the list of all application deep links ListLinks(ctx context.Context, in *ListAppLinksRequest, opts ...grpc.CallOption) (*LinksResponse, error) // ListResourceLinks returns the list of all resource deep links ListResourceLinks(ctx context.Context, in *ApplicationResourceRequest, opts ...grpc.CallOption) (*LinksResponse, error) + GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) } type applicationServiceClient struct { @@ -3391,6 +3774,15 @@ func (c *applicationServiceClient) RunResourceAction(ctx context.Context, in *Re return out, nil } +func (c *applicationServiceClient) RollbackApplicationRollout(ctx context.Context, in *ApplicationRolloutRollbackRequest, opts ...grpc.CallOption) (*ApplicationRolloutRollbackResponse, error) { + out := new(ApplicationRolloutRollbackResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/RollbackApplicationRollout", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *applicationServiceClient) DeleteResource(ctx context.Context, in *ApplicationResourceDeleteRequest, opts ...grpc.CallOption) (*ApplicationResponse, error) { out := new(ApplicationResponse) err := c.cc.Invoke(ctx, "/application.ApplicationService/DeleteResource", in, out, opts...) @@ -3400,6 +3792,15 @@ func (c *applicationServiceClient) DeleteResource(ctx context.Context, in *Appli return out, nil } +func (c *applicationServiceClient) ValidateSrcAndDst(ctx context.Context, in *ApplicationValidationRequest, opts ...grpc.CallOption) (*ApplicationValidateResponse, error) { + out := new(ApplicationValidateResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/ValidateSrcAndDst", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *applicationServiceClient) PodLogs(ctx context.Context, in *ApplicationPodLogsQuery, opts ...grpc.CallOption) (ApplicationService_PodLogsClient, error) { stream, err := c.cc.NewStream(ctx, &_ApplicationService_serviceDesc.Streams[3], "/application.ApplicationService/PodLogs", opts...) if err != nil { @@ -3450,6 +3851,15 @@ func (c *applicationServiceClient) ListResourceLinks(ctx context.Context, in *Ap return out, nil } +func (c *applicationServiceClient) GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) { + out := new(ChangeRevisionResponse) + err := c.cc.Invoke(ctx, "/application.ApplicationService/GetChangeRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApplicationServiceServer is the server API for ApplicationService service. type ApplicationServiceServer interface { // List returns list of applications @@ -3500,14 +3910,19 @@ type ApplicationServiceServer interface { ListResourceActions(context.Context, *ApplicationResourceRequest) (*ResourceActionsListResponse, error) // RunResourceAction run resource action RunResourceAction(context.Context, *ResourceActionRunRequest) (*ApplicationResponse, error) + // Rollback application rollout + RollbackApplicationRollout(context.Context, *ApplicationRolloutRollbackRequest) (*ApplicationRolloutRollbackResponse, error) // DeleteResource deletes a single application resource DeleteResource(context.Context, *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) + // Create creates an application + ValidateSrcAndDst(context.Context, *ApplicationValidationRequest) (*ApplicationValidateResponse, error) // PodLogs returns stream of log entries for the specified pod. Pod PodLogs(*ApplicationPodLogsQuery, ApplicationService_PodLogsServer) error // ListLinks returns the list of all application deep links ListLinks(context.Context, *ListAppLinksRequest) (*LinksResponse, error) // ListResourceLinks returns the list of all resource deep links ListResourceLinks(context.Context, *ApplicationResourceRequest) (*LinksResponse, error) + GetChangeRevision(context.Context, *ChangeRevisionRequest) (*ChangeRevisionResponse, error) } // UnimplementedApplicationServiceServer can be embedded to have forward compatible implementations. @@ -3586,9 +4001,15 @@ func (*UnimplementedApplicationServiceServer) ListResourceActions(ctx context.Co func (*UnimplementedApplicationServiceServer) RunResourceAction(ctx context.Context, req *ResourceActionRunRequest) (*ApplicationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RunResourceAction not implemented") } +func (*UnimplementedApplicationServiceServer) RollbackApplicationRollout(ctx context.Context, req *ApplicationRolloutRollbackRequest) (*ApplicationRolloutRollbackResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RollbackApplicationRollout not implemented") +} func (*UnimplementedApplicationServiceServer) DeleteResource(ctx context.Context, req *ApplicationResourceDeleteRequest) (*ApplicationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteResource not implemented") } +func (*UnimplementedApplicationServiceServer) ValidateSrcAndDst(ctx context.Context, req *ApplicationValidationRequest) (*ApplicationValidateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidateSrcAndDst not implemented") +} func (*UnimplementedApplicationServiceServer) PodLogs(req *ApplicationPodLogsQuery, srv ApplicationService_PodLogsServer) error { return status.Errorf(codes.Unimplemented, "method PodLogs not implemented") } @@ -3598,6 +4019,9 @@ func (*UnimplementedApplicationServiceServer) ListLinks(ctx context.Context, req func (*UnimplementedApplicationServiceServer) ListResourceLinks(ctx context.Context, req *ApplicationResourceRequest) (*LinksResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListResourceLinks not implemented") } +func (*UnimplementedApplicationServiceServer) GetChangeRevision(ctx context.Context, req *ChangeRevisionRequest) (*ChangeRevisionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetChangeRevision not implemented") +} func RegisterApplicationServiceServer(s *grpc.Server, srv ApplicationServiceServer) { s.RegisterService(&_ApplicationService_serviceDesc, srv) @@ -4049,6 +4473,24 @@ func _ApplicationService_RunResourceAction_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ApplicationService_RollbackApplicationRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplicationRolloutRollbackRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).RollbackApplicationRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/RollbackApplicationRollout", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).RollbackApplicationRollout(ctx, req.(*ApplicationRolloutRollbackRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ApplicationService_DeleteResource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ApplicationResourceDeleteRequest) if err := dec(in); err != nil { @@ -4067,6 +4509,24 @@ func _ApplicationService_DeleteResource_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _ApplicationService_ValidateSrcAndDst_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ApplicationValidationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).ValidateSrcAndDst(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/ValidateSrcAndDst", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).ValidateSrcAndDst(ctx, req.(*ApplicationValidationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ApplicationService_PodLogs_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(ApplicationPodLogsQuery) if err := stream.RecvMsg(m); err != nil { @@ -4124,6 +4584,24 @@ func _ApplicationService_ListResourceLinks_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ApplicationService_GetChangeRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).GetChangeRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/application.ApplicationService/GetChangeRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).GetChangeRevision(ctx, req.(*ChangeRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _ApplicationService_serviceDesc = grpc.ServiceDesc{ ServiceName: "application.ApplicationService", HandlerType: (*ApplicationServiceServer)(nil), @@ -4212,10 +4690,18 @@ var _ApplicationService_serviceDesc = grpc.ServiceDesc{ MethodName: "RunResourceAction", Handler: _ApplicationService_RunResourceAction_Handler, }, + { + MethodName: "RollbackApplicationRollout", + Handler: _ApplicationService_RollbackApplicationRollout_Handler, + }, { MethodName: "DeleteResource", Handler: _ApplicationService_DeleteResource_Handler, }, + { + MethodName: "ValidateSrcAndDst", + Handler: _ApplicationService_ValidateSrcAndDst_Handler, + }, { MethodName: "ListLinks", Handler: _ApplicationService_ListLinks_Handler, @@ -4224,6 +4710,10 @@ var _ApplicationService_serviceDesc = grpc.ServiceDesc{ MethodName: "ListResourceLinks", Handler: _ApplicationService_ListResourceLinks_Handler, }, + { + MethodName: "GetChangeRevision", + Handler: _ApplicationService_GetChangeRevision_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -4686,6 +5176,90 @@ func (m *ApplicationManifestQueryWithFiles) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *ApplicationValidateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationValidateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationValidateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Entity != nil { + i -= len(*m.Entity) + copy(dAtA[i:], *m.Entity) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Entity))) + i-- + dAtA[i] = 0x12 + } + if m.Error != nil { + i -= len(*m.Error) + copy(dAtA[i:], *m.Error) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Error))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationRolloutRollbackResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationRolloutRollbackResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationRolloutRollbackResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.NewRevision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("newRevision") + } else { + i = encodeVarintApplication(dAtA, i, uint64(*m.NewRevision)) + i-- + dAtA[i] = 0x10 + } + if m.Rollout == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rollout") + } else { + i -= len(*m.Rollout) + copy(dAtA[i:], *m.Rollout) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Rollout))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationManifestQueryWithFilesWrapper) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5179,6 +5753,117 @@ func (m *ApplicationSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ApplicationValidationRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationValidationRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationValidationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Application == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") + } else { + { + size, err := m.Application.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApplication(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationRolloutRollbackRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationRolloutRollbackRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationRolloutRollbackRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.RolloutRevision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutRevision") + } else { + i = encodeVarintApplication(dAtA, i, uint64(*m.RolloutRevision)) + i-- + dAtA[i] = 0x28 + } + if m.RolloutNamespace == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutNamespace") + } else { + i -= len(*m.RolloutNamespace) + copy(dAtA[i:], *m.RolloutNamespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.RolloutNamespace))) + i-- + dAtA[i] = 0x22 + } + if m.RolloutName == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutName") + } else { + i -= len(*m.RolloutName) + copy(dAtA[i:], *m.RolloutName) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.RolloutName))) + i-- + dAtA[i] = 0x1a + } + if m.Namespace == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("namespace") + } else { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.Name == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } else { + i -= len(*m.Name) + copy(dAtA[i:], *m.Name) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ApplicationUpdateSpecRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5489,7 +6174,7 @@ func (m *ApplicationResourceRequest) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *ApplicationResourcePatchRequest) Marshal() (dAtA []byte, err error) { +func (m *ChangeRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5499,12 +6184,12 @@ func (m *ApplicationResourcePatchRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ApplicationResourcePatchRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ChangeRevisionRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ApplicationResourcePatchRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ChangeRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5513,24 +6198,117 @@ func (m *ApplicationResourcePatchRequest) MarshalToSizedBuffer(dAtA []byte) (int i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Project != nil { - i -= len(*m.Project) - copy(dAtA[i:], *m.Project) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.Project))) + if m.PreviousRevision != nil { + i -= len(*m.PreviousRevision) + copy(dAtA[i:], *m.PreviousRevision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.PreviousRevision))) i-- - dAtA[i] = 0x52 + dAtA[i] = 0x22 } - if m.AppNamespace != nil { - i -= len(*m.AppNamespace) - copy(dAtA[i:], *m.AppNamespace) - i = encodeVarintApplication(dAtA, i, uint64(len(*m.AppNamespace))) + if m.CurrentRevision != nil { + i -= len(*m.CurrentRevision) + copy(dAtA[i:], *m.CurrentRevision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.CurrentRevision))) i-- - dAtA[i] = 0x4a + dAtA[i] = 0x1a } - if m.PatchType == nil { - return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") - } else { - i -= len(*m.PatchType) + if m.Namespace != nil { + i -= len(*m.Namespace) + copy(dAtA[i:], *m.Namespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if m.AppName == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("appName") + } else { + i -= len(*m.AppName) + copy(dAtA[i:], *m.AppName) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.AppName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ChangeRevisionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Revision == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("revision") + } else { + i -= len(*m.Revision) + copy(dAtA[i:], *m.Revision) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ApplicationResourcePatchRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ApplicationResourcePatchRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ApplicationResourcePatchRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Project != nil { + i -= len(*m.Project) + copy(dAtA[i:], *m.Project) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.Project))) + i-- + dAtA[i] = 0x52 + } + if m.AppNamespace != nil { + i -= len(*m.AppNamespace) + copy(dAtA[i:], *m.AppNamespace) + i = encodeVarintApplication(dAtA, i, uint64(len(*m.AppNamespace))) + i-- + dAtA[i] = 0x4a + } + if m.PatchType == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + } else { + i -= len(*m.PatchType) copy(dAtA[i:], *m.PatchType) i = encodeVarintApplication(dAtA, i, uint64(len(*m.PatchType))) i-- @@ -6896,6 +7674,45 @@ func (m *ApplicationManifestQueryWithFiles) Size() (n int) { return n } +func (m *ApplicationValidateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = len(*m.Error) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Entity != nil { + l = len(*m.Entity) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationRolloutRollbackResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Rollout != nil { + l = len(*m.Rollout) + n += 1 + l + sovApplication(uint64(l)) + } + if m.NewRevision != nil { + n += 1 + sovApplication(uint64(*m.NewRevision)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ApplicationManifestQueryWithFilesWrapper) Size() (n int) { if m == nil { return 0 @@ -7116,6 +7933,53 @@ func (m *ApplicationSyncRequest) Size() (n int) { return n } +func (m *ApplicationValidationRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Application != nil { + l = m.Application.Size() + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ApplicationRolloutRollbackRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutName != nil { + l = len(*m.RolloutName) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutNamespace != nil { + l = len(*m.RolloutNamespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.RolloutRevision != nil { + n += 1 + sovApplication(uint64(*m.RolloutRevision)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ApplicationUpdateSpecRequest) Size() (n int) { if m == nil { return 0 @@ -7256,6 +8120,50 @@ func (m *ApplicationResourceRequest) Size() (n int) { return n } +func (m *ChangeRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AppName != nil { + l = len(*m.AppName) + n += 1 + l + sovApplication(uint64(l)) + } + if m.Namespace != nil { + l = len(*m.Namespace) + n += 1 + l + sovApplication(uint64(l)) + } + if m.CurrentRevision != nil { + l = len(*m.CurrentRevision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.PreviousRevision != nil { + l = len(*m.PreviousRevision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChangeRevisionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Revision != nil { + l = len(*m.Revision) + n += 1 + l + sovApplication(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ApplicationResourcePatchRequest) Size() (n int) { if m == nil { return 0 @@ -9292,7 +10200,7 @@ func (m *ApplicationManifestQueryWithFiles) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error { +func (m *ApplicationValidateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9315,17 +10223,17 @@ func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationManifestQueryWithFilesWrapper: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationValidateResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationManifestQueryWithFilesWrapper: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationValidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -9335,32 +10243,30 @@ func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - v := &ApplicationManifestQueryWithFiles{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Part = &ApplicationManifestQueryWithFilesWrapper_Query{v} + s := string(dAtA[iNdEx:postIndex]) + m.Error = &s iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Entity", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -9370,26 +10276,24 @@ func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - v := &FileChunk{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Part = &ApplicationManifestQueryWithFilesWrapper_Chunk{v} + s := string(dAtA[iNdEx:postIndex]) + m.Entity = &s iNdEx = postIndex default: iNdEx = preIndex @@ -9413,7 +10317,8 @@ func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error } return nil } -func (m *ApplicationResponse) Unmarshal(dAtA []byte) error { +func (m *ApplicationRolloutRollbackResponse) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9436,22 +10341,255 @@ func (m *ApplicationResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationRolloutRollbackResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationRolloutRollbackResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rollout", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthApplication + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } } - if (iNdEx + skippy) > l { + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Rollout = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NewRevision", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.NewRevision = &v + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rollout") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("newRevision") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationManifestQueryWithFilesWrapper) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationManifestQueryWithFilesWrapper: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationManifestQueryWithFilesWrapper: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ApplicationManifestQueryWithFiles{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Part = &ApplicationManifestQueryWithFilesWrapper_Query{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Chunk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &FileChunk{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Part = &ApplicationManifestQueryWithFilesWrapper_Chunk{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) @@ -10582,7 +11720,7 @@ func (m *ApplicationSyncRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationValidationRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -10606,17 +11744,17 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationUpdateSpecRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationValidationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationUpdateSpecRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationValidationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Application", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10626,155 +11764,34 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthApplication } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthApplication } if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.Name = &s + if m.Application == nil { + m.Application = &v1alpha1.Application{} + } + if err := m.Application.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex hasFields[0] |= uint64(0x00000001) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Spec == nil { - m.Spec = &v1alpha1.ApplicationSpec{} - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Validate = &b - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - 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 ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - 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 ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Project = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipApplication(dAtA[iNdEx:]) - if err != nil { - return err + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err } if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthApplication @@ -10787,10 +11804,7 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } } if hasFields[0]&uint64(0x00000001) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") - } - if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("spec") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("application") } if iNdEx > l { @@ -10798,7 +11812,7 @@ func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationRolloutRollbackRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -10822,10 +11836,10 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationPatchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationRolloutRollbackRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationPatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationRolloutRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10864,7 +11878,7 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { hasFields[0] |= uint64(0x00000001) case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10893,12 +11907,12 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Patch = &s + m.Namespace = &s iNdEx = postIndex hasFields[0] |= uint64(0x00000002) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RolloutName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10927,12 +11941,12 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.PatchType = &s + m.RolloutName = &s iNdEx = postIndex hasFields[0] |= uint64(0x00000004) - case 5: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RolloutNamespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10961,13 +11975,14 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.AppNamespace = &s + m.RolloutNamespace = &s iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + hasFields[0] |= uint64(0x00000008) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RolloutRevision", wireType) } - var stringLen uint64 + var v int64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -10977,25 +11992,13 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthApplication - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthApplication - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Project = &s - iNdEx = postIndex + m.RolloutRevision = &v + hasFields[0] |= uint64(0x00000010) default: iNdEx = preIndex skippy, err := skipApplication(dAtA[iNdEx:]) @@ -11016,10 +12019,16 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("namespace") } if hasFields[0]&uint64(0x00000004) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutName") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutNamespace") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rolloutRevision") } if iNdEx > l { @@ -11027,7 +12036,7 @@ func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationUpdateSpecRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -11051,10 +12060,10 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationRollbackRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationUpdateSpecRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationUpdateSpecRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -11092,10 +12101,10 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex hasFields[0] |= uint64(0x00000001) case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } - var v int64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApplication @@ -11105,16 +12114,32 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - m.Id = &v + if msglen < 0 { + return ErrInvalidLengthApplication + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &v1alpha1.ApplicationSpec{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex hasFields[0] |= uint64(0x00000002) case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Validate", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11132,29 +12157,8 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { } } b := bool(v != 0) - m.DryRun = &b + m.Validate = &b case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApplication - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.Prune = &b - case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } @@ -11187,7 +12191,7 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.AppNamespace = &s iNdEx = postIndex - case 7: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } @@ -11240,7 +12244,7 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("spec") } if iNdEx > l { @@ -11248,7 +12252,7 @@ func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { +func (m *ApplicationPatchRequest) Unmarshal(dAtA []byte) error { var hasFields [1]uint64 l := len(dAtA) iNdEx := 0 @@ -11272,10 +12276,10 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ApplicationResourceRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ApplicationPatchRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ApplicationResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ApplicationPatchRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -11314,7 +12318,7 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { hasFields[0] |= uint64(0x00000001) case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11343,11 +12347,12 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Namespace = &s + m.Patch = &s iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PatchType", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11376,12 +12381,12 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.ResourceName = &s + m.PatchType = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000002) - case 4: + hasFields[0] |= uint64(0x00000004) + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11410,12 +12415,11 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Version = &s + m.AppNamespace = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000004) - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11444,11 +12448,72 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Group = &s + m.Project = &s iNdEx = postIndex - case 6: + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patch") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("patchType") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ApplicationRollbackRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationRollbackRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationRollbackRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11477,10 +12542,73 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } s := string(dAtA[iNdEx:postIndex]) - m.Kind = &s + m.Name = &s iNdEx = postIndex - hasFields[0] |= uint64(0x00000008) - case 7: + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Id = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.DryRun = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Prune", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Prune = &b + case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) } @@ -11513,7 +12641,7 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.AppNamespace = &s iNdEx = postIndex - case 8: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) } @@ -11566,13 +12694,616 @@ func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") } if hasFields[0]&uint64(0x00000002) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") } - if hasFields[0]&uint64(0x00000004) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + + if iNdEx > l { + return io.ErrUnexpectedEOF } - if hasFields[0]&uint64(0x00000008) == 0 { - return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") + return nil +} +func (m *ApplicationResourceRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ApplicationResourceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ApplicationResourceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ResourceName = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Group = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Kind = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppNamespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppNamespace = &s + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Project", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Project = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resourceName") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("kind") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeRevisionRequest) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.AppName = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Namespace = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.CurrentRevision = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreviousRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.PreviousRevision = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("appName") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeRevisionResponse) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApplication + } + 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 ErrInvalidLengthApplication + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApplication + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Revision = &s + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipApplication(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthApplication + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("revision") } if iNdEx > l { diff --git a/pkg/apiclient/application/application.pb.gw.go b/pkg/apiclient/application/application.pb.gw.go index ed6064cadb9a2..1110f199b3bcf 100644 --- a/pkg/apiclient/application/application.pb.gw.go +++ b/pkg/apiclient/application/application.pb.gw.go @@ -1709,6 +1709,76 @@ func local_request_ApplicationService_RunResourceAction_0(ctx context.Context, m } +func request_ApplicationService_RollbackApplicationRollout_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationRolloutRollbackRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := client.RollbackApplicationRollout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_RollbackApplicationRollout_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationRolloutRollbackRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.StringP(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := server.RollbackApplicationRollout(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_ApplicationService_DeleteResource_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -1781,6 +1851,40 @@ func local_request_ApplicationService_DeleteResource_0(ctx context.Context, mars } +func request_ApplicationService_ValidateSrcAndDst_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationValidationRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Application); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ValidateSrcAndDst(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_ValidateSrcAndDst_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ApplicationValidationRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Application); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidateSrcAndDst(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_ApplicationService_PodLogs_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0, "podName": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) @@ -2028,6 +2132,42 @@ func local_request_ApplicationService_ListResourceLinks_0(ctx context.Context, m } +var ( + filter_ApplicationService_GetChangeRevision_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_ApplicationService_GetChangeRevision_0(ctx context.Context, marshaler runtime.Marshaler, client ApplicationServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeRevisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_GetChangeRevision_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetChangeRevision(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ApplicationService_GetChangeRevision_0(ctx context.Context, marshaler runtime.Marshaler, server ApplicationServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangeRevisionRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ApplicationService_GetChangeRevision_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetChangeRevision(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterApplicationServiceHandlerServer registers the http handlers for service ApplicationService to "mux". // UnaryRPC :call ApplicationServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2538,6 +2678,29 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_RollbackApplicationRollout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_RollbackApplicationRollout_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_RollbackApplicationRollout_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_ApplicationService_DeleteResource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2561,6 +2724,29 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_ValidateSrcAndDst_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_ValidateSrcAndDst_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ValidateSrcAndDst_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_ApplicationService_PodLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) @@ -2621,6 +2807,29 @@ func RegisterApplicationServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_ApplicationService_GetChangeRevision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ApplicationService_GetChangeRevision_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_GetChangeRevision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -3142,6 +3351,26 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_RollbackApplicationRollout_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_RollbackApplicationRollout_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_RollbackApplicationRollout_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_ApplicationService_DeleteResource_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3162,6 +3391,26 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("POST", pattern_ApplicationService_ValidateSrcAndDst_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_ValidateSrcAndDst_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_ValidateSrcAndDst_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_ApplicationService_PodLogs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3242,6 +3491,26 @@ func RegisterApplicationServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_ApplicationService_GetChangeRevision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ApplicationService_GetChangeRevision_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ApplicationService_GetChangeRevision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -3294,8 +3563,12 @@ var ( pattern_ApplicationService_RunResourceAction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"api", "v1", "applications", "name", "resource", "actions"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_RollbackApplicationRollout_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "rollout-rollback"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_DeleteResource_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "resource"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_ValidateSrcAndDst_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "application-validate"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_ApplicationService_PodLogs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"api", "v1", "applications", "name", "pods", "podName", "logs"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationService_PodLogs_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "logs"}, "", runtime.AssumeColonVerbOpt(true))) @@ -3303,6 +3576,8 @@ var ( pattern_ApplicationService_ListLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "applications", "name", "links"}, "", runtime.AssumeColonVerbOpt(true))) pattern_ApplicationService_ListResourceLinks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"api", "v1", "applications", "name", "resource", "links"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ApplicationService_GetChangeRevision_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "application", "changeRevision"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -3354,8 +3629,12 @@ var ( forward_ApplicationService_RunResourceAction_0 = runtime.ForwardResponseMessage + forward_ApplicationService_RollbackApplicationRollout_0 = runtime.ForwardResponseMessage + forward_ApplicationService_DeleteResource_0 = runtime.ForwardResponseMessage + forward_ApplicationService_ValidateSrcAndDst_0 = runtime.ForwardResponseMessage + forward_ApplicationService_PodLogs_0 = runtime.ForwardResponseStream forward_ApplicationService_PodLogs_1 = runtime.ForwardResponseStream @@ -3363,4 +3642,6 @@ var ( forward_ApplicationService_ListLinks_0 = runtime.ForwardResponseMessage forward_ApplicationService_ListResourceLinks_0 = runtime.ForwardResponseMessage + + forward_ApplicationService_GetChangeRevision_0 = runtime.ForwardResponseMessage ) diff --git a/pkg/apis/application/v1alpha1/cf_types.go b/pkg/apis/application/v1alpha1/cf_types.go new file mode 100644 index 0000000000000..92c6ea94c55ab --- /dev/null +++ b/pkg/apis/application/v1alpha1/cf_types.go @@ -0,0 +1,46 @@ +package v1alpha1 + +func (n *ResourceNode) GetAllChildNodes(tree *ApplicationTree, kind string) []ResourceNode { + curChildren := []ResourceNode{} + + for _, c := range tree.Nodes { + if (kind == "" || kind == c.Kind) && c.hasInParents(tree, n) { + curChildren = append(curChildren, c) + } + } + + return curChildren +} + +func (n *ResourceNode) hasInParents(tree *ApplicationTree, p *ResourceNode) bool { + if len(n.ParentRefs) == 0 { + return false + } + + for _, curParentRef := range n.ParentRefs { + if curParentRef.IsEqual(p.ResourceRef) { + return true + } + + parentNode := tree.FindNode(curParentRef.Group, curParentRef.Kind, curParentRef.Namespace, curParentRef.Name) + if parentNode == nil { + continue + } + + parentResult := parentNode.hasInParents(tree, p) + if parentResult { + return true + } + } + + return false +} + +func (r ResourceRef) IsEqual(other ResourceRef) bool { + return (r.Group == other.Group && + r.Version == other.Version && + r.Kind == other.Kind && + r.Namespace == other.Namespace && + r.Name == other.Name) || + r.UID == other.UID +} diff --git a/pkg/apis/application/v1alpha1/generated.pb.go b/pkg/apis/application/v1alpha1/generated.pb.go index b3e124227acce..2b225290be0bf 100644 --- a/pkg/apis/application/v1alpha1/generated.pb.go +++ b/pkg/apis/application/v1alpha1/generated.pb.go @@ -4797,709 +4797,710 @@ func init() { } var fileDescriptor_c078c3c476799f44 = []byte{ - // 11980 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x6c, 0x24, 0xc9, - 0x75, 0x18, 0xae, 0x9e, 0xe1, 0x90, 0x33, 0x8f, 0x5f, 0xbb, 0xb5, 0xbb, 0x77, 0xdc, 0xbd, 0x0f, - 0xae, 0xfb, 0xe4, 0xd3, 0xf9, 0xa7, 0x3b, 0xd2, 0xf7, 0x25, 0xef, 0xcf, 0x67, 0x4b, 0xe6, 0xc7, - 0x7e, 0x70, 0x97, 0x5c, 0xf2, 0x6a, 0xb8, 0xbb, 0xd2, 0x49, 0xa7, 0x53, 0x73, 0xa6, 0x38, 0xec, - 0x65, 0x4f, 0xf7, 0x5c, 0x77, 0x0f, 0x97, 0x73, 0x96, 0x64, 0xc9, 0x92, 0x6c, 0xd9, 0xfa, 0x8c, - 0x64, 0xc4, 0xe7, 0xc4, 0x52, 0x64, 0x5b, 0x09, 0x12, 0x04, 0x82, 0x95, 0x18, 0x48, 0x1c, 0xd8, - 0x86, 0x11, 0x3b, 0x31, 0x94, 0x38, 0x81, 0x1d, 0x41, 0xb0, 0x9c, 0xd8, 0x66, 0xa4, 0x4d, 0x02, - 0x19, 0x01, 0x62, 0x20, 0x4e, 0xfe, 0x08, 0x36, 0x41, 0x10, 0xd4, 0x77, 0x75, 0x4f, 0x0f, 0x39, - 0x5c, 0x36, 0xb9, 0x2b, 0xe9, 0xfe, 0x9b, 0xa9, 0xf7, 0xba, 0xde, 0xeb, 0xea, 0xaa, 0xf7, 0x5e, - 0xbd, 0x7a, 0xef, 0x15, 0x2c, 0x36, 0xdc, 0x78, 0xa3, 0xbd, 0x36, 0x55, 0x0b, 0x9a, 0xd3, 0x4e, - 0xd8, 0x08, 0x5a, 0x61, 0x70, 0x93, 0xfd, 0x78, 0xaa, 0x56, 0x9f, 0xde, 0x7a, 0x76, 0xba, 0xb5, - 0xd9, 0x98, 0x76, 0x5a, 0x6e, 0x34, 0xed, 0xb4, 0x5a, 0x9e, 0x5b, 0x73, 0x62, 0x37, 0xf0, 0xa7, - 0xb7, 0x9e, 0x76, 0xbc, 0xd6, 0x86, 0xf3, 0xf4, 0x74, 0x83, 0xf8, 0x24, 0x74, 0x62, 0x52, 0x9f, - 0x6a, 0x85, 0x41, 0x1c, 0xa0, 0x1f, 0xd3, 0xbd, 0x4d, 0xc9, 0xde, 0xd8, 0x8f, 0x57, 0x6a, 0xf5, - 0xa9, 0xad, 0x67, 0xa7, 0x5a, 0x9b, 0x8d, 0x29, 0xda, 0xdb, 0x94, 0xd1, 0xdb, 0x94, 0xec, 0xed, - 0xcc, 0x53, 0x06, 0x2f, 0x8d, 0xa0, 0x11, 0x4c, 0xb3, 0x4e, 0xd7, 0xda, 0xeb, 0xec, 0x1f, 0xfb, - 0xc3, 0x7e, 0x71, 0x62, 0x67, 0xec, 0xcd, 0x73, 0xd1, 0x94, 0x1b, 0x50, 0xf6, 0xa6, 0x6b, 0x41, - 0x48, 0xa6, 0xb7, 0xba, 0x18, 0x3a, 0x73, 0x49, 0xe3, 0x90, 0xed, 0x98, 0xf8, 0x91, 0x1b, 0xf8, - 0xd1, 0x53, 0x94, 0x05, 0x12, 0x6e, 0x91, 0xd0, 0x7c, 0x3d, 0x03, 0x21, 0xab, 0xa7, 0xe7, 0x74, - 0x4f, 0x4d, 0xa7, 0xb6, 0xe1, 0xfa, 0x24, 0xec, 0xe8, 0xc7, 0x9b, 0x24, 0x76, 0xb2, 0x9e, 0x9a, - 0xee, 0xf5, 0x54, 0xd8, 0xf6, 0x63, 0xb7, 0x49, 0xba, 0x1e, 0x78, 0xdb, 0x5e, 0x0f, 0x44, 0xb5, - 0x0d, 0xd2, 0x74, 0xba, 0x9e, 0x7b, 0xb6, 0xd7, 0x73, 0xed, 0xd8, 0xf5, 0xa6, 0x5d, 0x3f, 0x8e, - 0xe2, 0x30, 0xfd, 0x90, 0xfd, 0xcb, 0x16, 0x8c, 0xce, 0xdc, 0xa8, 0xce, 0xb4, 0xe3, 0x8d, 0xb9, - 0xc0, 0x5f, 0x77, 0x1b, 0xe8, 0x79, 0x18, 0xae, 0x79, 0xed, 0x28, 0x26, 0xe1, 0x55, 0xa7, 0x49, - 0x26, 0xac, 0xb3, 0xd6, 0x13, 0x95, 0xd9, 0x13, 0x5f, 0xdb, 0x99, 0x7c, 0xd3, 0xed, 0x9d, 0xc9, - 0xe1, 0x39, 0x0d, 0xc2, 0x26, 0x1e, 0xfa, 0x21, 0x18, 0x0a, 0x03, 0x8f, 0xcc, 0xe0, 0xab, 0x13, - 0x05, 0xf6, 0xc8, 0xb8, 0x78, 0x64, 0x08, 0xf3, 0x66, 0x2c, 0xe1, 0x14, 0xb5, 0x15, 0x06, 0xeb, - 0xae, 0x47, 0x26, 0x8a, 0x49, 0xd4, 0x15, 0xde, 0x8c, 0x25, 0xdc, 0xfe, 0x93, 0x02, 0xc0, 0x4c, - 0xab, 0xb5, 0x12, 0x06, 0x37, 0x49, 0x2d, 0x46, 0xef, 0x83, 0x32, 0x1d, 0xe6, 0xba, 0x13, 0x3b, - 0x8c, 0xb1, 0xe1, 0x67, 0x7e, 0x78, 0x8a, 0xbf, 0xf5, 0x94, 0xf9, 0xd6, 0x7a, 0x92, 0x51, 0xec, - 0xa9, 0xad, 0xa7, 0xa7, 0x96, 0xd7, 0xe8, 0xf3, 0x4b, 0x24, 0x76, 0x66, 0x91, 0x20, 0x06, 0xba, - 0x0d, 0xab, 0x5e, 0x91, 0x0f, 0x03, 0x51, 0x8b, 0xd4, 0xd8, 0x3b, 0x0c, 0x3f, 0xb3, 0x38, 0x75, - 0x90, 0xd9, 0x3c, 0xa5, 0x39, 0xaf, 0xb6, 0x48, 0x6d, 0x76, 0x44, 0x50, 0x1e, 0xa0, 0xff, 0x30, - 0xa3, 0x83, 0xb6, 0x60, 0x30, 0x8a, 0x9d, 0xb8, 0x1d, 0xb1, 0xa1, 0x18, 0x7e, 0xe6, 0x6a, 0x6e, - 0x14, 0x59, 0xaf, 0xb3, 0x63, 0x82, 0xe6, 0x20, 0xff, 0x8f, 0x05, 0x35, 0xfb, 0x2f, 0x2c, 0x18, - 0xd3, 0xc8, 0x8b, 0x6e, 0x14, 0xa3, 0xf7, 0x74, 0x0d, 0xee, 0x54, 0x7f, 0x83, 0x4b, 0x9f, 0x66, - 0x43, 0x7b, 0x4c, 0x10, 0x2b, 0xcb, 0x16, 0x63, 0x60, 0x9b, 0x50, 0x72, 0x63, 0xd2, 0x8c, 0x26, - 0x0a, 0x67, 0x8b, 0x4f, 0x0c, 0x3f, 0x73, 0x29, 0xaf, 0xf7, 0x9c, 0x1d, 0x15, 0x44, 0x4b, 0x0b, - 0xb4, 0x7b, 0xcc, 0xa9, 0xd8, 0x7f, 0x3d, 0x6a, 0xbe, 0x1f, 0x1d, 0x70, 0xf4, 0x34, 0x0c, 0x47, - 0x41, 0x3b, 0xac, 0x11, 0x4c, 0x5a, 0x41, 0x34, 0x61, 0x9d, 0x2d, 0xd2, 0xa9, 0x47, 0x27, 0x75, - 0x55, 0x37, 0x63, 0x13, 0x07, 0x7d, 0xda, 0x82, 0x91, 0x3a, 0x89, 0x62, 0xd7, 0x67, 0xf4, 0x25, - 0xf3, 0xab, 0x07, 0x66, 0x5e, 0x36, 0xce, 0xeb, 0xce, 0x67, 0x4f, 0x8a, 0x17, 0x19, 0x31, 0x1a, - 0x23, 0x9c, 0xa0, 0x4f, 0x17, 0x67, 0x9d, 0x44, 0xb5, 0xd0, 0x6d, 0xd1, 0xff, 0x62, 0xf9, 0xa8, - 0xc5, 0x39, 0xaf, 0x41, 0xd8, 0xc4, 0x43, 0x3e, 0x94, 0xe8, 0xe2, 0x8b, 0x26, 0x06, 0x18, 0xff, - 0x0b, 0x07, 0xe3, 0x5f, 0x0c, 0x2a, 0x5d, 0xd7, 0x7a, 0xf4, 0xe9, 0xbf, 0x08, 0x73, 0x32, 0xe8, - 0x53, 0x16, 0x4c, 0x08, 0xe1, 0x80, 0x09, 0x1f, 0xd0, 0x1b, 0x1b, 0x6e, 0x4c, 0x3c, 0x37, 0x8a, - 0x27, 0x4a, 0x8c, 0x87, 0xe9, 0xfe, 0xe6, 0xd6, 0xc5, 0x30, 0x68, 0xb7, 0xae, 0xb8, 0x7e, 0x7d, - 0xf6, 0xac, 0xa0, 0x34, 0x31, 0xd7, 0xa3, 0x63, 0xdc, 0x93, 0x24, 0xfa, 0xbc, 0x05, 0x67, 0x7c, - 0xa7, 0x49, 0xa2, 0x96, 0x43, 0x3f, 0x2d, 0x07, 0xcf, 0x7a, 0x4e, 0x6d, 0x93, 0x71, 0x34, 0x78, - 0x77, 0x1c, 0xd9, 0x82, 0xa3, 0x33, 0x57, 0x7b, 0x76, 0x8d, 0x77, 0x21, 0x8b, 0x7e, 0xcd, 0x82, - 0xe3, 0x41, 0xd8, 0xda, 0x70, 0x7c, 0x52, 0x97, 0xd0, 0x68, 0x62, 0x88, 0x2d, 0xbd, 0xf7, 0x1e, - 0xec, 0x13, 0x2d, 0xa7, 0xbb, 0x5d, 0x0a, 0x7c, 0x37, 0x0e, 0xc2, 0x2a, 0x89, 0x63, 0xd7, 0x6f, - 0x44, 0xb3, 0xa7, 0x6e, 0xef, 0x4c, 0x1e, 0xef, 0xc2, 0xc2, 0xdd, 0xfc, 0xa0, 0x9f, 0x84, 0xe1, - 0xa8, 0xe3, 0xd7, 0x6e, 0xb8, 0x7e, 0x3d, 0xb8, 0x15, 0x4d, 0x94, 0xf3, 0x58, 0xbe, 0x55, 0xd5, - 0xa1, 0x58, 0x80, 0x9a, 0x00, 0x36, 0xa9, 0x65, 0x7f, 0x38, 0x3d, 0x95, 0x2a, 0x79, 0x7f, 0x38, - 0x3d, 0x99, 0x76, 0x21, 0x8b, 0x7e, 0xd6, 0x82, 0xd1, 0xc8, 0x6d, 0xf8, 0x4e, 0xdc, 0x0e, 0xc9, - 0x15, 0xd2, 0x89, 0x26, 0x80, 0x31, 0x72, 0xf9, 0x80, 0xa3, 0x62, 0x74, 0x39, 0x7b, 0x4a, 0xf0, - 0x38, 0x6a, 0xb6, 0x46, 0x38, 0x49, 0x37, 0x6b, 0xa1, 0xe9, 0x69, 0x3d, 0x9c, 0xef, 0x42, 0xd3, - 0x93, 0xba, 0x27, 0x49, 0xf4, 0x13, 0x70, 0x8c, 0x37, 0xa9, 0x91, 0x8d, 0x26, 0x46, 0x98, 0xa0, - 0x3d, 0x79, 0x7b, 0x67, 0xf2, 0x58, 0x35, 0x05, 0xc3, 0x5d, 0xd8, 0xe8, 0x55, 0x98, 0x6c, 0x91, - 0xb0, 0xe9, 0xc6, 0xcb, 0xbe, 0xd7, 0x91, 0xe2, 0xbb, 0x16, 0xb4, 0x48, 0x5d, 0xb0, 0x13, 0x4d, - 0x8c, 0x9e, 0xb5, 0x9e, 0x28, 0xcf, 0xbe, 0x45, 0xb0, 0x39, 0xb9, 0xb2, 0x3b, 0x3a, 0xde, 0xab, - 0x3f, 0xf4, 0x07, 0x16, 0x9c, 0x31, 0xa4, 0x6c, 0x95, 0x84, 0x5b, 0x6e, 0x8d, 0xcc, 0xd4, 0x6a, - 0x41, 0xdb, 0x8f, 0xa3, 0x89, 0x31, 0x36, 0x8c, 0x6b, 0x87, 0x21, 0xf3, 0x93, 0xa4, 0xf4, 0xbc, - 0xec, 0x89, 0x12, 0xe1, 0x5d, 0x38, 0xb5, 0xff, 0x55, 0x01, 0x8e, 0xa5, 0x2d, 0x00, 0xf4, 0xf7, - 0x2c, 0x18, 0xbf, 0x79, 0x2b, 0x5e, 0x0d, 0x36, 0x89, 0x1f, 0xcd, 0x76, 0xa8, 0x9c, 0x66, 0xba, - 0x6f, 0xf8, 0x99, 0x5a, 0xbe, 0xb6, 0xc6, 0xd4, 0xe5, 0x24, 0x95, 0xf3, 0x7e, 0x1c, 0x76, 0x66, - 0x1f, 0x14, 0xef, 0x34, 0x7e, 0xf9, 0xc6, 0xaa, 0x09, 0xc5, 0x69, 0xa6, 0xce, 0x7c, 0xc2, 0x82, - 0x93, 0x59, 0x5d, 0xa0, 0x63, 0x50, 0xdc, 0x24, 0x1d, 0x6e, 0x89, 0x62, 0xfa, 0x13, 0xbd, 0x0c, - 0xa5, 0x2d, 0xc7, 0x6b, 0x13, 0x61, 0xa6, 0x5d, 0x3c, 0xd8, 0x8b, 0x28, 0xce, 0x30, 0xef, 0xf5, - 0x47, 0x0b, 0xe7, 0x2c, 0xfb, 0x8f, 0x8a, 0x30, 0x6c, 0x7c, 0xb4, 0x23, 0x30, 0x3d, 0x83, 0x84, - 0xe9, 0xb9, 0x94, 0xdb, 0x7c, 0xeb, 0x69, 0x7b, 0xde, 0x4a, 0xd9, 0x9e, 0xcb, 0xf9, 0x91, 0xdc, - 0xd5, 0xf8, 0x44, 0x31, 0x54, 0x82, 0x16, 0xdd, 0x86, 0x50, 0x1b, 0x66, 0x20, 0x8f, 0x4f, 0xb8, - 0x2c, 0xbb, 0x9b, 0x1d, 0xbd, 0xbd, 0x33, 0x59, 0x51, 0x7f, 0xb1, 0x26, 0x64, 0x7f, 0xd3, 0x82, - 0x93, 0x06, 0x8f, 0x73, 0x81, 0x5f, 0x77, 0xd9, 0xa7, 0x3d, 0x0b, 0x03, 0x71, 0xa7, 0x25, 0xb7, - 0x3a, 0x6a, 0xa4, 0x56, 0x3b, 0x2d, 0x82, 0x19, 0x84, 0xee, 0x58, 0x9a, 0x24, 0x8a, 0x9c, 0x06, - 0x49, 0x6f, 0x6e, 0x96, 0x78, 0x33, 0x96, 0x70, 0x14, 0x02, 0xf2, 0x9c, 0x28, 0x5e, 0x0d, 0x1d, - 0x3f, 0x62, 0xdd, 0xaf, 0xba, 0x4d, 0x22, 0x06, 0xf8, 0xff, 0xeb, 0x6f, 0xc6, 0xd0, 0x27, 0x66, - 0x1f, 0xb8, 0xbd, 0x33, 0x89, 0x16, 0xbb, 0x7a, 0xc2, 0x19, 0xbd, 0xdb, 0x9f, 0xb7, 0xe0, 0x81, - 0x6c, 0x01, 0x83, 0x1e, 0x87, 0x41, 0xbe, 0xcf, 0x15, 0x6f, 0xa7, 0x3f, 0x09, 0x6b, 0xc5, 0x02, - 0x8a, 0xa6, 0xa1, 0xa2, 0x14, 0x9e, 0x78, 0xc7, 0xe3, 0x02, 0xb5, 0xa2, 0xb5, 0xa4, 0xc6, 0xa1, - 0x83, 0x46, 0xff, 0x08, 0x13, 0x54, 0x0d, 0x1a, 0xdb, 0x18, 0x32, 0x88, 0xfd, 0x0d, 0x0b, 0xde, - 0xdc, 0x8f, 0xd8, 0x3b, 0x3c, 0x1e, 0xab, 0x70, 0xaa, 0x4e, 0xd6, 0x9d, 0xb6, 0x17, 0x27, 0x29, - 0x0a, 0xa6, 0x1f, 0x11, 0x0f, 0x9f, 0x9a, 0xcf, 0x42, 0xc2, 0xd9, 0xcf, 0xda, 0xff, 0xd1, 0x82, - 0x71, 0xe3, 0xb5, 0x8e, 0x60, 0xeb, 0xe4, 0x27, 0xb7, 0x4e, 0x0b, 0xb9, 0x2d, 0xd3, 0x1e, 0x7b, - 0xa7, 0x4f, 0x59, 0x70, 0xc6, 0xc0, 0x5a, 0x72, 0xe2, 0xda, 0xc6, 0xf9, 0xed, 0x56, 0x48, 0xa2, - 0x88, 0x4e, 0xa9, 0x47, 0x0c, 0x71, 0x3c, 0x3b, 0x2c, 0x7a, 0x28, 0x5e, 0x21, 0x1d, 0x2e, 0x9b, - 0x9f, 0x84, 0x32, 0x5f, 0x73, 0x41, 0x28, 0x3e, 0x92, 0x7a, 0xb7, 0x65, 0xd1, 0x8e, 0x15, 0x06, - 0xb2, 0x61, 0x90, 0xc9, 0x5c, 0x2a, 0x83, 0xa8, 0x99, 0x00, 0xf4, 0xbb, 0x5f, 0x67, 0x2d, 0x58, - 0x40, 0xec, 0x28, 0xc1, 0xce, 0x4a, 0x48, 0xd8, 0x7c, 0xa8, 0x5f, 0x70, 0x89, 0x57, 0x8f, 0xe8, - 0xb6, 0xce, 0xf1, 0xfd, 0x20, 0x16, 0x3b, 0x34, 0x63, 0x5b, 0x37, 0xa3, 0x9b, 0xb1, 0x89, 0x43, - 0x89, 0x7a, 0xce, 0x1a, 0xf1, 0xf8, 0x88, 0x0a, 0xa2, 0x8b, 0xac, 0x05, 0x0b, 0x88, 0x7d, 0xbb, - 0xc0, 0x36, 0x90, 0x4a, 0xa2, 0x91, 0xa3, 0xf0, 0x3e, 0x84, 0x09, 0x15, 0xb0, 0x92, 0x9f, 0x3c, - 0x26, 0xbd, 0x3d, 0x10, 0xaf, 0xa5, 0xb4, 0x00, 0xce, 0x95, 0xea, 0xee, 0x5e, 0x88, 0x0f, 0x15, - 0x61, 0x32, 0xf9, 0x40, 0x97, 0x12, 0xa1, 0x5b, 0x5e, 0x83, 0x50, 0xda, 0x1f, 0x65, 0xe0, 0x63, - 0x13, 0xaf, 0x87, 0x1c, 0x2e, 0x1c, 0xa6, 0x1c, 0x36, 0xd5, 0x44, 0x71, 0x0f, 0x35, 0xf1, 0xb8, - 0x1a, 0xf5, 0x81, 0x94, 0xcc, 0x4b, 0xaa, 0xca, 0xb3, 0x30, 0x10, 0xc5, 0xa4, 0x35, 0x51, 0x4a, - 0x8a, 0xd9, 0x6a, 0x4c, 0x5a, 0x98, 0x41, 0xd0, 0x8f, 0xc3, 0x78, 0xec, 0x84, 0x0d, 0x12, 0x87, - 0x64, 0xcb, 0x65, 0xbe, 0x4b, 0xb6, 0x9f, 0xad, 0xcc, 0x9e, 0xa0, 0x56, 0xd7, 0x2a, 0x03, 0x61, - 0x09, 0xc2, 0x69, 0x5c, 0xfb, 0xbf, 0x16, 0xe0, 0xc1, 0xe4, 0x27, 0xd0, 0x8a, 0xf1, 0x1d, 0x09, - 0xc5, 0xf8, 0x56, 0x53, 0x31, 0xde, 0xd9, 0x99, 0x7c, 0xa8, 0xc7, 0x63, 0xdf, 0x35, 0x7a, 0x13, - 0x5d, 0x4c, 0x7d, 0x84, 0xe9, 0xe4, 0x47, 0xb8, 0xb3, 0x33, 0xf9, 0x48, 0x8f, 0x77, 0x4c, 0x7d, - 0xa5, 0xc7, 0x61, 0x30, 0x24, 0x4e, 0x14, 0xf8, 0xe2, 0x3b, 0xa9, 0xaf, 0x89, 0x59, 0x2b, 0x16, - 0x50, 0xfb, 0xeb, 0x95, 0xf4, 0x60, 0x5f, 0xe4, 0xfe, 0xd8, 0x20, 0x44, 0x2e, 0x0c, 0xb0, 0x5d, - 0x1b, 0x97, 0x2c, 0x57, 0x0e, 0xb6, 0x0a, 0xa9, 0x16, 0x51, 0x5d, 0xcf, 0x96, 0xe9, 0x57, 0xa3, - 0x4d, 0x98, 0x91, 0x40, 0xdb, 0x50, 0xae, 0xc9, 0xcd, 0x54, 0x21, 0x0f, 0xb7, 0xa3, 0xd8, 0x4a, - 0x69, 0x8a, 0x23, 0x54, 0xdc, 0xab, 0x1d, 0x98, 0xa2, 0x86, 0x08, 0x14, 0x1b, 0x6e, 0x2c, 0x3e, - 0xeb, 0x01, 0xb7, 0xcb, 0x17, 0x5d, 0xe3, 0x15, 0x87, 0xa8, 0x0e, 0xba, 0xe8, 0xc6, 0x98, 0xf6, - 0x8f, 0x3e, 0x66, 0xc1, 0x70, 0x54, 0x6b, 0xae, 0x84, 0xc1, 0x96, 0x5b, 0x27, 0xa1, 0xb0, 0x31, - 0x0f, 0x28, 0xd9, 0xaa, 0x73, 0x4b, 0xb2, 0x43, 0x4d, 0x97, 0xbb, 0x2f, 0x34, 0x04, 0x9b, 0x74, - 0xe9, 0xde, 0xeb, 0x41, 0xf1, 0xee, 0xf3, 0xa4, 0xc6, 0x56, 0x9c, 0xdc, 0x33, 0xb3, 0x99, 0x72, - 0x60, 0x9b, 0x7b, 0xbe, 0x5d, 0xdb, 0xa4, 0xeb, 0x4d, 0x33, 0xf4, 0xd0, 0xed, 0x9d, 0xc9, 0x07, - 0xe7, 0xb2, 0x69, 0xe2, 0x5e, 0xcc, 0xb0, 0x01, 0x6b, 0xb5, 0x3d, 0x0f, 0x93, 0x57, 0xdb, 0x84, - 0x79, 0xc4, 0x72, 0x18, 0xb0, 0x15, 0xdd, 0x61, 0x6a, 0xc0, 0x0c, 0x08, 0x36, 0xe9, 0xa2, 0x57, - 0x61, 0xb0, 0xe9, 0xc4, 0xa1, 0xbb, 0x2d, 0xdc, 0x60, 0x07, 0xdc, 0x05, 0x2d, 0xb1, 0xbe, 0x34, - 0x71, 0xa6, 0xe8, 0x79, 0x23, 0x16, 0x84, 0x50, 0x13, 0x4a, 0x4d, 0x12, 0x36, 0xc8, 0x44, 0x39, - 0x0f, 0x97, 0xff, 0x12, 0xed, 0x4a, 0x13, 0xac, 0x50, 0xe3, 0x8a, 0xb5, 0x61, 0x4e, 0x05, 0xbd, - 0x0c, 0xe5, 0x88, 0x78, 0xa4, 0x46, 0xcd, 0xa3, 0x0a, 0xa3, 0xf8, 0x6c, 0x9f, 0xa6, 0x22, 0xb5, - 0x4b, 0xaa, 0xe2, 0x51, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, 0xba, 0xa4, 0x03, 0xd8, 0xf2, 0xda, 0x0d, - 0xd7, 0x9f, 0x80, 0x3c, 0x06, 0x70, 0x85, 0xf5, 0x95, 0x1a, 0x40, 0xde, 0x88, 0x05, 0x21, 0xfb, - 0xbf, 0x58, 0x80, 0x92, 0x42, 0xed, 0x08, 0x6c, 0xe2, 0x57, 0x93, 0x36, 0xf1, 0x62, 0x9e, 0x46, - 0x4b, 0x0f, 0xb3, 0xf8, 0xb7, 0x2a, 0x90, 0x52, 0x07, 0x57, 0x49, 0x14, 0x93, 0xfa, 0x1b, 0x22, - 0xfc, 0x0d, 0x11, 0xfe, 0x86, 0x08, 0x57, 0x22, 0x7c, 0x2d, 0x25, 0xc2, 0xdf, 0x6e, 0xac, 0x7a, - 0x7d, 0xbe, 0xfe, 0x8a, 0x3a, 0x80, 0x37, 0x39, 0x30, 0x10, 0xa8, 0x24, 0xb8, 0x5c, 0x5d, 0xbe, - 0x9a, 0x29, 0xb3, 0x5f, 0x49, 0xca, 0xec, 0x83, 0x92, 0xf8, 0x7e, 0x90, 0xd2, 0x7f, 0x60, 0xc1, - 0x5b, 0x92, 0xd2, 0x4b, 0xce, 0x9c, 0x85, 0x86, 0x1f, 0x84, 0x64, 0xde, 0x5d, 0x5f, 0x27, 0x21, - 0xf1, 0x6b, 0x24, 0x52, 0xbe, 0x1d, 0xab, 0x97, 0x6f, 0x07, 0x3d, 0x07, 0x23, 0x37, 0xa3, 0xc0, - 0x5f, 0x09, 0x5c, 0x5f, 0x88, 0x20, 0xba, 0xe3, 0x38, 0x76, 0x7b, 0x67, 0x72, 0x84, 0x8e, 0xa8, - 0x6c, 0xc7, 0x09, 0x2c, 0x34, 0x07, 0xc7, 0x6f, 0xbe, 0xba, 0xe2, 0xc4, 0x86, 0x37, 0x41, 0xee, - 0xfb, 0xd9, 0x79, 0xd4, 0xe5, 0x17, 0x53, 0x40, 0xdc, 0x8d, 0x6f, 0xff, 0xed, 0x02, 0x9c, 0x4e, - 0xbd, 0x48, 0xe0, 0x79, 0x41, 0x3b, 0xa6, 0x7b, 0x22, 0xf4, 0x45, 0x0b, 0x8e, 0x35, 0x93, 0x0e, - 0x8b, 0x48, 0xb8, 0xbb, 0xdf, 0x99, 0x9b, 0x8e, 0x48, 0x79, 0x44, 0x66, 0x27, 0xc4, 0x08, 0x1d, - 0x4b, 0x01, 0x22, 0xdc, 0xc5, 0x0b, 0x7a, 0x19, 0x2a, 0x4d, 0x67, 0xfb, 0x5a, 0xab, 0xee, 0xc4, - 0x72, 0x3b, 0xda, 0xdb, 0x8b, 0xd0, 0x8e, 0x5d, 0x6f, 0x8a, 0x47, 0x6e, 0x4c, 0x2d, 0xf8, 0xf1, - 0x72, 0x58, 0x8d, 0x43, 0xd7, 0x6f, 0x70, 0x27, 0xe7, 0x92, 0xec, 0x06, 0xeb, 0x1e, 0xed, 0x2f, - 0x58, 0x69, 0x25, 0xa5, 0x46, 0x27, 0x74, 0x62, 0xd2, 0xe8, 0xa0, 0xf7, 0x43, 0x89, 0xee, 0x1b, - 0xe5, 0xa8, 0xdc, 0xc8, 0x53, 0x73, 0x1a, 0x5f, 0x42, 0x2b, 0x51, 0xfa, 0x2f, 0xc2, 0x9c, 0xa8, - 0xfd, 0xc5, 0x4a, 0xda, 0x58, 0x60, 0x67, 0xf3, 0xcf, 0x00, 0x34, 0x82, 0x55, 0xd2, 0x6c, 0x79, - 0x74, 0x58, 0x2c, 0x76, 0xc0, 0xa3, 0x5c, 0x25, 0x17, 0x15, 0x04, 0x1b, 0x58, 0xe8, 0xe7, 0x2c, - 0x80, 0x86, 0x9c, 0xf3, 0xd2, 0x10, 0xb8, 0x96, 0xe7, 0xeb, 0xe8, 0x15, 0xa5, 0x79, 0x51, 0x04, - 0xb1, 0x41, 0x1c, 0xfd, 0xb4, 0x05, 0xe5, 0x58, 0xb2, 0xcf, 0x55, 0xe3, 0x6a, 0x9e, 0x9c, 0xc8, - 0x97, 0xd6, 0x36, 0x91, 0x1a, 0x12, 0x45, 0x17, 0xfd, 0x8c, 0x05, 0x10, 0x75, 0xfc, 0xda, 0x4a, - 0xe0, 0xb9, 0xb5, 0x8e, 0xd0, 0x98, 0xd7, 0x73, 0x75, 0xe7, 0xa8, 0xde, 0x67, 0xc7, 0xe8, 0x68, - 0xe8, 0xff, 0xd8, 0xa0, 0x8c, 0x3e, 0x08, 0xe5, 0x48, 0x4c, 0x37, 0xa1, 0x23, 0x57, 0xf3, 0x75, - 0x2a, 0xf1, 0xbe, 0x85, 0x78, 0x15, 0xff, 0xb0, 0xa2, 0x89, 0x7e, 0xd1, 0x82, 0xf1, 0x56, 0xd2, - 0x4d, 0x28, 0xd4, 0x61, 0x7e, 0x32, 0x20, 0xe5, 0x86, 0xe4, 0xde, 0x96, 0x54, 0x23, 0x4e, 0x73, - 0x41, 0x25, 0xa0, 0x9e, 0xc1, 0xcb, 0x2d, 0xee, 0xb2, 0x1c, 0xd2, 0x12, 0xf0, 0x62, 0x1a, 0x88, - 0xbb, 0xf1, 0xd1, 0x0a, 0x9c, 0xa4, 0xdc, 0x75, 0xb8, 0xf9, 0x29, 0xd5, 0x4b, 0xc4, 0x94, 0x61, - 0x79, 0xf6, 0x61, 0x31, 0x43, 0xd8, 0x59, 0x47, 0x1a, 0x07, 0x67, 0x3e, 0x89, 0xfe, 0xc8, 0x82, - 0x87, 0x5d, 0xa6, 0x06, 0x4c, 0x87, 0xbd, 0xd6, 0x08, 0xe2, 0xa0, 0x9d, 0xe4, 0x2a, 0x2b, 0x7a, - 0xa9, 0x9f, 0xd9, 0x37, 0x8b, 0x37, 0x78, 0x78, 0x61, 0x17, 0x96, 0xf0, 0xae, 0x0c, 0xa3, 0x1f, - 0x81, 0x51, 0xb9, 0x2e, 0x56, 0xa8, 0x08, 0x66, 0x8a, 0xb6, 0x32, 0x7b, 0xfc, 0xf6, 0xce, 0xe4, - 0xe8, 0xaa, 0x09, 0xc0, 0x49, 0x3c, 0xfb, 0x5f, 0x17, 0x13, 0xa7, 0x44, 0xca, 0x87, 0xc9, 0xc4, - 0x4d, 0x4d, 0xfa, 0x7f, 0xa4, 0xf4, 0xcc, 0x55, 0xdc, 0x28, 0xef, 0x92, 0x16, 0x37, 0xaa, 0x29, - 0xc2, 0x06, 0x71, 0x6a, 0x94, 0x1e, 0x77, 0xd2, 0x9e, 0x52, 0x21, 0x01, 0x5f, 0xce, 0x93, 0xa5, - 0xee, 0x33, 0xbd, 0xd3, 0x82, 0xb5, 0xe3, 0x5d, 0x20, 0xdc, 0xcd, 0x12, 0xfa, 0x00, 0x54, 0x42, - 0x15, 0xd9, 0x52, 0xcc, 0x63, 0xab, 0x26, 0xa7, 0x8d, 0x60, 0x47, 0x1d, 0x00, 0xe9, 0x18, 0x16, - 0x4d, 0xd1, 0xfe, 0xc3, 0xe4, 0xc1, 0x98, 0x21, 0x3b, 0xfa, 0x38, 0xf4, 0xfb, 0xb4, 0x05, 0xc3, - 0x61, 0xe0, 0x79, 0xae, 0xdf, 0xa0, 0x72, 0x4e, 0x28, 0xeb, 0x77, 0x1f, 0x8a, 0xbe, 0x14, 0x02, - 0x8d, 0x59, 0xd6, 0x58, 0xd3, 0xc4, 0x26, 0x03, 0xf6, 0x5f, 0x58, 0x30, 0xd1, 0x4b, 0x1e, 0x23, - 0x02, 0x0f, 0x49, 0x61, 0xa3, 0x86, 0x62, 0xd9, 0x9f, 0x27, 0x1e, 0x51, 0x6e, 0xf3, 0xf2, 0xec, - 0x63, 0xe2, 0x35, 0x1f, 0x5a, 0xe9, 0x8d, 0x8a, 0x77, 0xeb, 0x07, 0xbd, 0x04, 0xc7, 0x8c, 0xf7, - 0x8a, 0xd4, 0xc0, 0x54, 0x66, 0xa7, 0xa8, 0x01, 0x34, 0x93, 0x82, 0xdd, 0xd9, 0x99, 0x7c, 0x20, - 0xdd, 0x26, 0x14, 0x46, 0x57, 0x3f, 0xf6, 0x97, 0x0b, 0xe9, 0xaf, 0xa5, 0x74, 0xfd, 0xeb, 0x56, - 0x97, 0x37, 0xe1, 0x9d, 0x87, 0xa1, 0x5f, 0x99, 0xdf, 0x41, 0x85, 0x61, 0xf4, 0xc6, 0xb9, 0x87, - 0xc7, 0xf6, 0xf6, 0xbf, 0x19, 0x80, 0x5d, 0x38, 0xeb, 0xc3, 0x78, 0xdf, 0xf7, 0x39, 0xea, 0x27, - 0x2d, 0x75, 0x60, 0xc6, 0xd7, 0x70, 0xfd, 0xb0, 0xc6, 0x9e, 0xef, 0x9f, 0x22, 0x1e, 0x3a, 0xa2, - 0xbc, 0xe8, 0xc9, 0xa3, 0x39, 0xf4, 0x25, 0x2b, 0x79, 0xe4, 0xc7, 0x83, 0x1a, 0xdd, 0x43, 0xe3, - 0xc9, 0x38, 0x47, 0xe4, 0x8c, 0xe9, 0xd3, 0xa7, 0x5e, 0x27, 0x8c, 0x53, 0x00, 0xeb, 0xae, 0xef, - 0x78, 0xee, 0x6b, 0x74, 0x77, 0x54, 0x62, 0x0a, 0x9e, 0x59, 0x4c, 0x17, 0x54, 0x2b, 0x36, 0x30, - 0xce, 0xfc, 0xff, 0x30, 0x6c, 0xbc, 0x79, 0x46, 0xc4, 0xcb, 0x49, 0x33, 0xe2, 0xa5, 0x62, 0x04, - 0xaa, 0x9c, 0x79, 0x3b, 0x1c, 0x4b, 0x33, 0xb8, 0x9f, 0xe7, 0xed, 0xff, 0x35, 0x94, 0x3e, 0x83, - 0x5b, 0x25, 0x61, 0x93, 0xb2, 0xf6, 0x86, 0x63, 0xeb, 0x0d, 0xc7, 0xd6, 0x1b, 0x8e, 0x2d, 0xf3, - 0x6c, 0x42, 0x38, 0x6d, 0x86, 0x8e, 0xc8, 0x69, 0x93, 0x70, 0x43, 0x95, 0x73, 0x77, 0x43, 0xd9, - 0x1f, 0xeb, 0xf2, 0xdc, 0xaf, 0x86, 0x84, 0xa0, 0x00, 0x4a, 0x7e, 0x50, 0x27, 0xd2, 0xc6, 0xbd, - 0x9c, 0x8f, 0xc1, 0x76, 0x35, 0xa8, 0x1b, 0xe1, 0xe2, 0xf4, 0x5f, 0x84, 0x39, 0x1d, 0xfb, 0xa3, - 0x83, 0x90, 0x30, 0x27, 0xf9, 0x77, 0xff, 0x21, 0x18, 0x0a, 0x49, 0x2b, 0xb8, 0x86, 0x17, 0x85, - 0x2e, 0xd3, 0x19, 0x25, 0xbc, 0x19, 0x4b, 0x38, 0xd5, 0x79, 0x2d, 0x27, 0xde, 0x10, 0xca, 0x4c, - 0xe9, 0xbc, 0x15, 0x27, 0xde, 0xc0, 0x0c, 0x82, 0xde, 0x0e, 0x63, 0x71, 0xe2, 0x28, 0x5c, 0x1c, - 0xf9, 0x3e, 0x20, 0x70, 0xc7, 0x92, 0x07, 0xe5, 0x38, 0x85, 0x8d, 0x5e, 0x85, 0x81, 0x0d, 0xe2, - 0x35, 0xc5, 0xa7, 0xaf, 0xe6, 0xa7, 0x6b, 0xd8, 0xbb, 0x5e, 0x22, 0x5e, 0x93, 0x4b, 0x42, 0xfa, - 0x0b, 0x33, 0x52, 0x74, 0xde, 0x57, 0x36, 0xdb, 0x51, 0x1c, 0x34, 0xdd, 0xd7, 0xa4, 0xa7, 0xf3, - 0x9d, 0x39, 0x13, 0xbe, 0x22, 0xfb, 0xe7, 0x2e, 0x25, 0xf5, 0x17, 0x6b, 0xca, 0x8c, 0x8f, 0xba, - 0x1b, 0xb2, 0x29, 0xd3, 0x11, 0x0e, 0xcb, 0xbc, 0xf9, 0x98, 0x97, 0xfd, 0x73, 0x3e, 0xd4, 0x5f, - 0xac, 0x29, 0xa3, 0x8e, 0x5a, 0x7f, 0xc3, 0x8c, 0x87, 0x6b, 0x39, 0xf3, 0xc0, 0xd7, 0x5e, 0xe6, - 0x3a, 0x7c, 0x0c, 0x4a, 0xb5, 0x0d, 0x27, 0x8c, 0x27, 0x46, 0xd8, 0xa4, 0x51, 0xb3, 0x78, 0x8e, - 0x36, 0x62, 0x0e, 0x43, 0x8f, 0x40, 0x31, 0x24, 0xeb, 0x2c, 0x3a, 0xd9, 0x88, 0x8b, 0xc2, 0x64, - 0x1d, 0xd3, 0x76, 0x65, 0x97, 0x8d, 0xf5, 0x0c, 0x98, 0xfb, 0x95, 0x42, 0xd2, 0xb0, 0x4b, 0x8e, - 0x0c, 0x5f, 0x0f, 0xb5, 0x76, 0x18, 0x49, 0x07, 0x99, 0xb1, 0x1e, 0x58, 0x33, 0x96, 0x70, 0xf4, - 0x61, 0x0b, 0x86, 0x6e, 0x46, 0x81, 0xef, 0x93, 0x58, 0x28, 0xd1, 0xeb, 0x39, 0x0f, 0xd6, 0x65, - 0xde, 0xbb, 0xe6, 0x41, 0x34, 0x60, 0x49, 0x97, 0xb2, 0x4b, 0xb6, 0x6b, 0x5e, 0xbb, 0xde, 0x15, - 0x0c, 0x73, 0x9e, 0x37, 0x63, 0x09, 0xa7, 0xa8, 0xae, 0xcf, 0x51, 0x07, 0x92, 0xa8, 0x0b, 0xbe, - 0x40, 0x15, 0x70, 0xfb, 0x37, 0xca, 0x70, 0x2a, 0x73, 0xf9, 0x50, 0x93, 0x8b, 0x19, 0x35, 0x17, - 0x5c, 0x8f, 0xc8, 0x30, 0x30, 0x66, 0x72, 0x5d, 0x57, 0xad, 0xd8, 0xc0, 0x40, 0x3f, 0x05, 0xd0, - 0x72, 0x42, 0xa7, 0x49, 0x94, 0x03, 0xfb, 0xc0, 0x96, 0x0d, 0xe5, 0x63, 0x45, 0xf6, 0xa9, 0x37, - 0xf1, 0xaa, 0x29, 0xc2, 0x06, 0x49, 0xf4, 0x3c, 0x0c, 0x87, 0xc4, 0x23, 0x4e, 0xc4, 0xc2, 0xdf, - 0xd3, 0xb9, 0x3c, 0x58, 0x83, 0xb0, 0x89, 0x87, 0x1e, 0x57, 0x11, 0x73, 0xa9, 0xc8, 0xa1, 0x64, - 0xd4, 0x1c, 0xfa, 0x8c, 0x05, 0x63, 0xeb, 0xae, 0x47, 0x34, 0x75, 0x91, 0x79, 0xb3, 0x7c, 0xf0, - 0x97, 0xbc, 0x60, 0xf6, 0xab, 0x65, 0x68, 0xa2, 0x39, 0xc2, 0x29, 0xf2, 0xf4, 0x33, 0x6f, 0x91, - 0x90, 0x09, 0xdf, 0xc1, 0xe4, 0x67, 0xbe, 0xce, 0x9b, 0xb1, 0x84, 0xa3, 0x19, 0x18, 0x6f, 0x39, - 0x51, 0x34, 0x17, 0x92, 0x3a, 0xf1, 0x63, 0xd7, 0xf1, 0x78, 0x5e, 0x4c, 0x59, 0x87, 0x93, 0xaf, - 0x24, 0xc1, 0x38, 0x8d, 0x8f, 0xde, 0x05, 0x0f, 0x72, 0x0f, 0xd1, 0x92, 0x1b, 0x45, 0xae, 0xdf, - 0xd0, 0xd3, 0x40, 0x38, 0xca, 0x26, 0x45, 0x57, 0x0f, 0x2e, 0x64, 0xa3, 0xe1, 0x5e, 0xcf, 0xa3, - 0x27, 0xa1, 0x1c, 0x6d, 0xba, 0xad, 0xb9, 0xb0, 0x1e, 0xb1, 0xd3, 0xa1, 0xb2, 0x76, 0xcb, 0x56, - 0x45, 0x3b, 0x56, 0x18, 0xa8, 0x06, 0x23, 0xfc, 0x93, 0xf0, 0x90, 0x3f, 0x21, 0x41, 0x9f, 0xea, - 0xa9, 0xc8, 0x45, 0x9a, 0xe7, 0x14, 0x76, 0x6e, 0x9d, 0x97, 0x67, 0x55, 0xfc, 0x68, 0xe5, 0xba, - 0xd1, 0x0d, 0x4e, 0x74, 0x9a, 0xdc, 0xd3, 0x0d, 0xf7, 0xb1, 0xa7, 0x7b, 0x1e, 0x86, 0x37, 0xdb, - 0x6b, 0x44, 0x8c, 0xbc, 0x10, 0x6c, 0x6a, 0xf6, 0x5d, 0xd1, 0x20, 0x6c, 0xe2, 0xb1, 0x68, 0xcb, - 0x96, 0x2b, 0xfe, 0x45, 0x13, 0xa3, 0x46, 0xb4, 0xe5, 0xca, 0x82, 0x6c, 0xc6, 0x26, 0x0e, 0x65, - 0x8d, 0x8e, 0xc5, 0x2a, 0x89, 0x58, 0x32, 0x05, 0x1d, 0x2e, 0xc5, 0x5a, 0x55, 0x02, 0xb0, 0xc6, - 0x41, 0x2b, 0x70, 0x92, 0xfe, 0xa9, 0xb2, 0x34, 0xd7, 0xeb, 0x8e, 0xe7, 0xd6, 0x79, 0xe8, 0xdf, - 0x78, 0xd2, 0xbf, 0x59, 0xcd, 0xc0, 0xc1, 0x99, 0x4f, 0xda, 0xbf, 0x54, 0x48, 0x7a, 0x4e, 0x4c, - 0x11, 0x86, 0x22, 0x2a, 0xa8, 0xe2, 0xeb, 0x4e, 0x28, 0x0d, 0x9e, 0x03, 0x26, 0x37, 0x89, 0x7e, - 0xaf, 0x3b, 0xa1, 0x29, 0xf2, 0x18, 0x01, 0x2c, 0x29, 0xa1, 0x9b, 0x30, 0x10, 0x7b, 0x4e, 0x4e, - 0xd9, 0x90, 0x06, 0x45, 0xed, 0xc8, 0x5a, 0x9c, 0x89, 0x30, 0xa3, 0x81, 0x1e, 0xa6, 0xbb, 0xb7, - 0x35, 0x79, 0xd2, 0x26, 0x36, 0x5c, 0x6b, 0x11, 0x66, 0xad, 0xf6, 0x2f, 0x8c, 0x66, 0x68, 0x1d, - 0x65, 0x08, 0xa0, 0x67, 0x00, 0xe8, 0xa4, 0x59, 0x09, 0xc9, 0xba, 0xbb, 0x2d, 0x0c, 0x31, 0x25, - 0xd9, 0xae, 0x2a, 0x08, 0x36, 0xb0, 0xe4, 0x33, 0xd5, 0xf6, 0x3a, 0x7d, 0xa6, 0xd0, 0xfd, 0x0c, - 0x87, 0x60, 0x03, 0x0b, 0x3d, 0x07, 0x83, 0x6e, 0xd3, 0x69, 0xa8, 0x40, 0xe0, 0x87, 0xa9, 0x48, - 0x5b, 0x60, 0x2d, 0x77, 0x76, 0x26, 0xc7, 0x14, 0x43, 0xac, 0x09, 0x0b, 0x5c, 0xf4, 0x65, 0x0b, - 0x46, 0x6a, 0x41, 0xb3, 0x19, 0xf8, 0x7c, 0xfb, 0x2c, 0x7c, 0x01, 0x37, 0x0f, 0xcb, 0x4c, 0x9a, - 0x9a, 0x33, 0x88, 0x71, 0x67, 0x80, 0x4a, 0xdb, 0x34, 0x41, 0x38, 0xc1, 0x95, 0x29, 0xf9, 0x4a, - 0x7b, 0x48, 0xbe, 0xdf, 0xb4, 0xe0, 0x38, 0x7f, 0xd6, 0xd8, 0xd5, 0x8b, 0x0c, 0xc5, 0xe0, 0x90, - 0x5f, 0xab, 0xcb, 0xd1, 0xa1, 0x9c, 0xbd, 0x5d, 0x70, 0xdc, 0xcd, 0x24, 0xba, 0x08, 0xc7, 0xd7, - 0x83, 0xb0, 0x46, 0xcc, 0x81, 0x10, 0x62, 0x5b, 0x75, 0x74, 0x21, 0x8d, 0x80, 0xbb, 0x9f, 0x41, - 0xd7, 0xe1, 0x01, 0xa3, 0xd1, 0x1c, 0x07, 0x2e, 0xb9, 0x1f, 0x15, 0xbd, 0x3d, 0x70, 0x21, 0x13, - 0x0b, 0xf7, 0x78, 0x3a, 0x29, 0x24, 0x2b, 0x7d, 0x08, 0xc9, 0x57, 0xe0, 0x74, 0xad, 0x7b, 0x64, - 0xb6, 0xa2, 0xf6, 0x5a, 0xc4, 0xe5, 0x78, 0x79, 0xf6, 0x07, 0x44, 0x07, 0xa7, 0xe7, 0x7a, 0x21, - 0xe2, 0xde, 0x7d, 0xa0, 0xf7, 0x43, 0x39, 0x24, 0xec, 0xab, 0x44, 0x22, 0x5d, 0xef, 0x80, 0xde, - 0x0e, 0x6d, 0xc1, 0xf3, 0x6e, 0xb5, 0x66, 0x12, 0x0d, 0x11, 0x56, 0x14, 0xd1, 0x2d, 0x18, 0x6a, - 0x39, 0x71, 0x6d, 0x43, 0x24, 0xe9, 0x1d, 0xd8, 0x37, 0xaf, 0x88, 0xb3, 0xa3, 0x14, 0x23, 0xad, - 0x9f, 0x13, 0xc1, 0x92, 0x1a, 0xb5, 0xd5, 0x6a, 0x41, 0xb3, 0x15, 0xf8, 0xc4, 0x8f, 0xa5, 0x12, - 0x19, 0xe3, 0xe7, 0x1d, 0xb2, 0x15, 0x1b, 0x18, 0x5d, 0xba, 0x5c, 0xa3, 0x4d, 0x1c, 0xdf, 0x45, - 0x97, 0x1b, 0xbd, 0xf5, 0x7a, 0x9e, 0x2a, 0x1b, 0xe6, 0x56, 0xbc, 0xe1, 0xc6, 0x1b, 0x41, 0x3b, - 0x96, 0xbb, 0x64, 0xa1, 0xa8, 0x94, 0xb2, 0x59, 0xcc, 0xc0, 0xc1, 0x99, 0x4f, 0xa6, 0x35, 0xeb, - 0xf8, 0xdd, 0x69, 0xd6, 0x63, 0x7d, 0x68, 0xd6, 0x2a, 0x9c, 0x62, 0x1c, 0x08, 0x2b, 0x59, 0x3a, - 0x2d, 0xa3, 0x09, 0xc4, 0x98, 0x57, 0xf9, 0x2d, 0x8b, 0x59, 0x48, 0x38, 0xfb, 0xd9, 0x33, 0xef, - 0x80, 0xe3, 0x5d, 0x42, 0x6e, 0x5f, 0x0e, 0xc9, 0x79, 0x78, 0x20, 0x5b, 0x9c, 0xec, 0xcb, 0x2d, - 0xf9, 0x1b, 0xa9, 0xb8, 0x74, 0x63, 0x8b, 0xd6, 0x87, 0x8b, 0xdb, 0x81, 0x22, 0xf1, 0xb7, 0x84, - 0x76, 0xbd, 0x70, 0xb0, 0x59, 0x7d, 0xde, 0xdf, 0xe2, 0xd2, 0x90, 0xf9, 0xf1, 0xce, 0xfb, 0x5b, - 0x98, 0xf6, 0x8d, 0x3e, 0x67, 0x25, 0x36, 0x10, 0xdc, 0x31, 0xfe, 0xde, 0x43, 0xd9, 0x93, 0xf6, - 0xbd, 0xa7, 0xb0, 0xff, 0x6d, 0x01, 0xce, 0xee, 0xd5, 0x49, 0x1f, 0xc3, 0xf7, 0x18, 0x0c, 0x46, - 0x2c, 0xd2, 0x44, 0xa8, 0xab, 0x61, 0xba, 0x8a, 0x79, 0xec, 0xc9, 0x2b, 0x58, 0x80, 0x90, 0x07, - 0xc5, 0xa6, 0xd3, 0x12, 0xfe, 0xd2, 0x85, 0x83, 0xe6, 0xef, 0xd1, 0xff, 0x8e, 0xb7, 0xe4, 0xb4, - 0xf8, 0x9c, 0x37, 0x1a, 0x30, 0x25, 0x83, 0x62, 0x28, 0x39, 0x61, 0xe8, 0xc8, 0xb0, 0x86, 0x2b, - 0xf9, 0xd0, 0x9b, 0xa1, 0x5d, 0xf2, 0x53, 0xe1, 0x44, 0x13, 0xe6, 0xc4, 0xec, 0x5f, 0x2c, 0x27, - 0x92, 0xbd, 0x58, 0xac, 0x4a, 0x04, 0x83, 0xc2, 0x4d, 0x6a, 0xe5, 0x9d, 0x36, 0xc9, 0xb3, 0xa9, - 0x99, 0x07, 0x42, 0xd4, 0xa4, 0x10, 0xa4, 0xd0, 0x27, 0x2c, 0x56, 0xf9, 0x41, 0x66, 0xd0, 0x89, - 0x5d, 0xfd, 0xe1, 0x14, 0xa2, 0x30, 0xeb, 0x49, 0xc8, 0x46, 0x6c, 0x52, 0x17, 0x15, 0x5c, 0xd8, - 0x6e, 0xa6, 0xbb, 0x82, 0x0b, 0xdb, 0x9d, 0x48, 0x38, 0xda, 0xce, 0x88, 0x49, 0xc9, 0xa1, 0x7a, - 0x40, 0x1f, 0x51, 0x28, 0x5f, 0xb2, 0xe0, 0xb8, 0x9b, 0x0e, 0x2e, 0x10, 0x7b, 0xe0, 0x1b, 0xf9, - 0xf8, 0x34, 0xbb, 0x63, 0x17, 0x94, 0xa1, 0xd3, 0x05, 0xc2, 0xdd, 0xcc, 0xa0, 0x3a, 0x0c, 0xb8, - 0xfe, 0x7a, 0x20, 0xcc, 0xbb, 0xd9, 0x83, 0x31, 0xb5, 0xe0, 0xaf, 0x07, 0x7a, 0x35, 0xd3, 0x7f, - 0x98, 0xf5, 0x8e, 0x16, 0xe1, 0xa4, 0xcc, 0xf7, 0xb9, 0xe4, 0x46, 0x71, 0x10, 0x76, 0x16, 0xdd, - 0xa6, 0x1b, 0x33, 0xd3, 0xac, 0x38, 0x3b, 0x41, 0xd5, 0x1b, 0xce, 0x80, 0xe3, 0xcc, 0xa7, 0xd0, - 0x6b, 0x30, 0x24, 0x0f, 0xf4, 0xcb, 0x79, 0xf8, 0x13, 0xba, 0xe7, 0xbf, 0x9a, 0x4c, 0x55, 0x71, - 0xa2, 0x2f, 0x09, 0xa2, 0x8f, 0x5b, 0x30, 0xc6, 0x7f, 0x5f, 0xea, 0xd4, 0x79, 0x8a, 0x61, 0x25, - 0x8f, 0xa8, 0xfd, 0x6a, 0xa2, 0xcf, 0x59, 0x74, 0x7b, 0x67, 0x72, 0x2c, 0xd9, 0x86, 0x53, 0x74, - 0xed, 0x2f, 0x8f, 0x40, 0x77, 0x08, 0x44, 0x32, 0xde, 0xc1, 0x3a, 0xea, 0x78, 0x07, 0xba, 0xab, - 0x8c, 0x74, 0xa8, 0x42, 0x0e, 0xcb, 0x4c, 0x50, 0xd5, 0xc7, 0xd0, 0x1d, 0xbf, 0x86, 0x19, 0x0d, - 0x14, 0xc2, 0xe0, 0x06, 0x71, 0xbc, 0x78, 0x23, 0x9f, 0x13, 0xb3, 0x4b, 0xac, 0xaf, 0x74, 0xbe, - 0x20, 0x6f, 0xc5, 0x82, 0x12, 0xda, 0x86, 0xa1, 0x0d, 0x3e, 0x17, 0xc5, 0x46, 0x6f, 0xe9, 0xa0, - 0x83, 0x9b, 0x98, 0xe0, 0x7a, 0xe6, 0x89, 0x06, 0x2c, 0xc9, 0xb1, 0xd8, 0x3a, 0x23, 0xfa, 0x87, - 0x4b, 0x91, 0xfc, 0x52, 0x25, 0xfb, 0x0f, 0xfd, 0x79, 0x1f, 0x8c, 0x84, 0xa4, 0x16, 0xf8, 0x35, - 0xd7, 0x23, 0xf5, 0x19, 0x79, 0x1a, 0xb6, 0x9f, 0x0c, 0x39, 0xe6, 0x4a, 0xc2, 0x46, 0x1f, 0x38, - 0xd1, 0x23, 0x5b, 0x64, 0x2a, 0x6b, 0x9e, 0x7e, 0x10, 0x22, 0x4e, 0x3d, 0x16, 0x73, 0xca, 0xd1, - 0x67, 0x7d, 0xf2, 0x45, 0x96, 0x6c, 0xc3, 0x29, 0xba, 0xe8, 0x25, 0x80, 0x60, 0x8d, 0x07, 0xd0, - 0xcd, 0xc4, 0xe2, 0x08, 0x64, 0x3f, 0xaf, 0x3a, 0xc6, 0x33, 0x6d, 0x65, 0x0f, 0xd8, 0xe8, 0x0d, - 0x5d, 0x01, 0xe0, 0xcb, 0x66, 0xb5, 0xd3, 0x92, 0xbb, 0x41, 0x99, 0xe2, 0x08, 0x55, 0x05, 0xb9, - 0xb3, 0x33, 0xd9, 0xed, 0x70, 0x66, 0x51, 0x42, 0xc6, 0xe3, 0xe8, 0x27, 0x61, 0x28, 0x6a, 0x37, - 0x9b, 0x8e, 0x3a, 0x20, 0xc9, 0x31, 0x77, 0x97, 0xf7, 0x6b, 0x48, 0x45, 0xde, 0x80, 0x25, 0x45, - 0x74, 0x93, 0xca, 0x77, 0x21, 0x9e, 0xf8, 0x2a, 0xe2, 0xe6, 0x09, 0x77, 0x03, 0xbe, 0x4d, 0x6e, - 0x61, 0x70, 0x06, 0xce, 0x9d, 0x9d, 0xc9, 0x07, 0x92, 0xed, 0x8b, 0x81, 0xc8, 0xa6, 0xcd, 0xec, - 0x13, 0x5d, 0x96, 0x45, 0xb4, 0xe8, 0x6b, 0xcb, 0xda, 0x2e, 0x4f, 0xe8, 0x22, 0x5a, 0xac, 0xb9, - 0xf7, 0x98, 0x99, 0x0f, 0xa3, 0x25, 0x38, 0x51, 0x0b, 0xfc, 0x38, 0x0c, 0x3c, 0x8f, 0x17, 0x91, - 0xe3, 0x1b, 0x73, 0x7e, 0x80, 0xf2, 0x90, 0x60, 0xfb, 0xc4, 0x5c, 0x37, 0x0a, 0xce, 0x7a, 0x8e, - 0x1a, 0xe4, 0x69, 0xe5, 0x30, 0x96, 0xcb, 0xd9, 0x7a, 0xa2, 0x4f, 0x21, 0xa1, 0x94, 0xcf, 0x7b, - 0x0f, 0x35, 0xe1, 0x27, 0x4f, 0x58, 0xc5, 0x17, 0x7b, 0x0e, 0x46, 0xc8, 0x76, 0x4c, 0x42, 0xdf, - 0xf1, 0xae, 0xe1, 0x45, 0x79, 0x5a, 0xc1, 0x16, 0xe6, 0x79, 0xa3, 0x1d, 0x27, 0xb0, 0x90, 0xad, - 0x5c, 0x64, 0x46, 0xda, 0x3a, 0x77, 0x91, 0x49, 0x87, 0x98, 0xfd, 0xd5, 0x62, 0xc2, 0x60, 0xbd, - 0x27, 0xe7, 0xb9, 0xac, 0x3e, 0x92, 0x2c, 0x24, 0xc5, 0x00, 0x62, 0x23, 0x96, 0x27, 0x65, 0x55, - 0x1f, 0x69, 0xd9, 0x24, 0x84, 0x93, 0x74, 0xd1, 0x26, 0x94, 0x36, 0x82, 0x28, 0x96, 0xdb, 0xb3, - 0x03, 0xee, 0x04, 0x2f, 0x05, 0x51, 0xcc, 0xac, 0x2c, 0xf5, 0xda, 0xb4, 0x25, 0xc2, 0x9c, 0x06, - 0xdd, 0xf8, 0x47, 0x1b, 0x4e, 0x58, 0x8f, 0xe6, 0x58, 0x91, 0x89, 0x01, 0x66, 0x5e, 0x29, 0x63, - 0xba, 0xaa, 0x41, 0xd8, 0xc4, 0xb3, 0xbf, 0x63, 0x25, 0x8e, 0xb4, 0x6e, 0xb0, 0x8c, 0x81, 0x2d, - 0xe2, 0x53, 0x11, 0x65, 0xc6, 0x28, 0xfe, 0x48, 0x2a, 0xff, 0xfa, 0x2d, 0xbd, 0xea, 0x3d, 0xde, - 0xa2, 0x3d, 0x4c, 0xb1, 0x2e, 0x8c, 0x70, 0xc6, 0x0f, 0x59, 0xc9, 0x44, 0xfa, 0x42, 0x1e, 0xfb, - 0x36, 0xb3, 0x98, 0xc4, 0x9e, 0x39, 0xf9, 0xf6, 0xe7, 0x2c, 0x18, 0x9a, 0x75, 0x6a, 0x9b, 0xc1, - 0xfa, 0x3a, 0x7a, 0x12, 0xca, 0xf5, 0x76, 0x68, 0xe6, 0xf4, 0x2b, 0x4f, 0xd5, 0xbc, 0x68, 0xc7, - 0x0a, 0x83, 0x4e, 0xfd, 0x75, 0xa7, 0x26, 0x4b, 0x4a, 0x14, 0xf9, 0xd4, 0xbf, 0xc0, 0x5a, 0xb0, - 0x80, 0xd0, 0xe1, 0x6f, 0x3a, 0xdb, 0xf2, 0xe1, 0xf4, 0x79, 0xda, 0x92, 0x06, 0x61, 0x13, 0xcf, - 0xfe, 0x17, 0x16, 0x4c, 0xcc, 0x3a, 0x91, 0x5b, 0x9b, 0x69, 0xc7, 0x1b, 0xb3, 0x6e, 0xbc, 0xd6, - 0xae, 0x6d, 0x92, 0x98, 0x97, 0x1e, 0xa1, 0x5c, 0xb6, 0x23, 0xba, 0x02, 0xd5, 0x76, 0x59, 0x71, - 0x79, 0x4d, 0xb4, 0x63, 0x85, 0x81, 0x5e, 0x83, 0xe1, 0x96, 0x13, 0x45, 0xb7, 0x82, 0xb0, 0x8e, - 0xc9, 0x7a, 0x3e, 0xc5, 0x89, 0xaa, 0xa4, 0x16, 0x92, 0x18, 0x93, 0x75, 0x11, 0x9d, 0xa2, 0xfb, - 0xc7, 0x26, 0x31, 0xfb, 0xe7, 0x2c, 0x38, 0x39, 0x4b, 0x9c, 0x90, 0x84, 0xac, 0x96, 0x91, 0x7a, - 0x11, 0xf4, 0x2a, 0x94, 0x63, 0xda, 0x42, 0x39, 0xb2, 0xf2, 0xe5, 0x88, 0xc5, 0x95, 0xac, 0x8a, - 0xce, 0xb1, 0x22, 0x63, 0x7f, 0xda, 0x82, 0xd3, 0x59, 0xbc, 0xcc, 0x79, 0x41, 0xbb, 0x7e, 0x2f, - 0x18, 0xfa, 0x5b, 0x16, 0x8c, 0xb0, 0xb3, 0xfa, 0x79, 0x12, 0x3b, 0xae, 0xd7, 0x55, 0x47, 0xd1, - 0xea, 0xb3, 0x8e, 0xe2, 0x59, 0x18, 0xd8, 0x08, 0x9a, 0x24, 0x1d, 0x67, 0x72, 0x29, 0x68, 0x12, - 0xcc, 0x20, 0xe8, 0x69, 0x3a, 0x09, 0x5d, 0x3f, 0x76, 0xe8, 0x72, 0x94, 0x67, 0x19, 0xe3, 0x7c, - 0x02, 0xaa, 0x66, 0x6c, 0xe2, 0xd8, 0xff, 0xbc, 0x02, 0x43, 0x22, 0x28, 0xaa, 0xef, 0x52, 0x38, - 0xd2, 0x85, 0x53, 0xe8, 0xe9, 0xc2, 0x89, 0x60, 0xb0, 0xc6, 0x0a, 0xba, 0x0a, 0xf3, 0xfc, 0x4a, - 0x2e, 0x51, 0x74, 0xbc, 0x46, 0xac, 0x66, 0x8b, 0xff, 0xc7, 0x82, 0x14, 0xfa, 0xac, 0x05, 0xe3, - 0xb5, 0xc0, 0xf7, 0x49, 0x4d, 0xdb, 0x8e, 0x03, 0x79, 0x04, 0x4b, 0xcd, 0x25, 0x3b, 0xd5, 0xc7, - 0xc0, 0x29, 0x00, 0x4e, 0x93, 0x47, 0x2f, 0xc0, 0x28, 0x1f, 0xb3, 0xeb, 0x89, 0x03, 0x18, 0x5d, - 0x5e, 0xcf, 0x04, 0xe2, 0x24, 0x2e, 0x9a, 0xe2, 0x07, 0x59, 0xa2, 0x90, 0xdd, 0xa0, 0xf6, 0x53, - 0x1b, 0x25, 0xec, 0x0c, 0x0c, 0x14, 0x02, 0x0a, 0xc9, 0x7a, 0x48, 0xa2, 0x0d, 0x11, 0x34, 0xc6, - 0xec, 0xd6, 0xa1, 0xbb, 0x2b, 0x62, 0x81, 0xbb, 0x7a, 0xc2, 0x19, 0xbd, 0xa3, 0x4d, 0xe1, 0x43, - 0x28, 0xe7, 0x21, 0xcf, 0xc5, 0x67, 0xee, 0xe9, 0x4a, 0x98, 0x84, 0x12, 0x53, 0x5d, 0xcc, 0x5e, - 0x2e, 0xf2, 0xc4, 0x49, 0xa6, 0xd8, 0x30, 0x6f, 0x47, 0xf3, 0x70, 0x2c, 0x55, 0x1c, 0x30, 0x12, - 0x07, 0x25, 0x2a, 0x49, 0x2e, 0x55, 0x56, 0x30, 0xc2, 0x5d, 0x4f, 0x98, 0xfe, 0xa5, 0xe1, 0x3d, - 0xfc, 0x4b, 0x1d, 0x15, 0x9a, 0xcc, 0x8f, 0x30, 0x5e, 0xcc, 0x65, 0x00, 0xfa, 0x8a, 0x43, 0xfe, - 0x54, 0x2a, 0x0e, 0x79, 0x94, 0x31, 0x70, 0x3d, 0x1f, 0x06, 0xf6, 0x1f, 0x74, 0x7c, 0x2f, 0x83, - 0x88, 0xff, 0xa7, 0x05, 0xf2, 0xbb, 0xce, 0x39, 0xb5, 0x0d, 0x42, 0xa7, 0x0c, 0x7a, 0x3b, 0x8c, - 0x29, 0xd7, 0x04, 0x37, 0x89, 0x2c, 0x36, 0x6b, 0x94, 0xed, 0x8c, 0x13, 0x50, 0x9c, 0xc2, 0x46, - 0xd3, 0x50, 0xa1, 0xe3, 0xc4, 0x1f, 0xe5, 0x7a, 0x5f, 0xb9, 0x3f, 0x66, 0x56, 0x16, 0xc4, 0x53, - 0x1a, 0x07, 0x05, 0x70, 0xdc, 0x73, 0xa2, 0x98, 0x71, 0x50, 0xed, 0xf8, 0xb5, 0xbb, 0x2c, 0x21, - 0xc3, 0x32, 0xb1, 0x16, 0xd3, 0x1d, 0xe1, 0xee, 0xbe, 0xed, 0x7f, 0x57, 0x82, 0xd1, 0x84, 0x64, - 0xdc, 0xa7, 0xc1, 0xf0, 0x24, 0x94, 0xa5, 0x0e, 0x4f, 0xd7, 0xca, 0x52, 0x8a, 0x5e, 0x61, 0x50, - 0xa5, 0xb5, 0xa6, 0xb5, 0x6a, 0xda, 0xc0, 0x31, 0x14, 0x2e, 0x36, 0xf1, 0x98, 0x50, 0x8e, 0xbd, - 0x68, 0xce, 0x73, 0x89, 0x1f, 0x73, 0x36, 0xf3, 0x11, 0xca, 0xab, 0x8b, 0x55, 0xb3, 0x53, 0x2d, - 0x94, 0x53, 0x00, 0x9c, 0x26, 0x8f, 0x3e, 0x6a, 0xc1, 0xa8, 0x73, 0x2b, 0xd2, 0x55, 0xc7, 0x45, - 0xc4, 0xf1, 0x01, 0x95, 0x54, 0xa2, 0x90, 0x39, 0xf7, 0xea, 0x27, 0x9a, 0x70, 0x92, 0x28, 0x7a, - 0xdd, 0x02, 0x44, 0xb6, 0x49, 0x4d, 0xc6, 0x44, 0x0b, 0x5e, 0x06, 0xf3, 0xd8, 0xc1, 0x9f, 0xef, - 0xea, 0x97, 0x4b, 0xf5, 0xee, 0x76, 0x9c, 0xc1, 0x03, 0xba, 0x0c, 0xa8, 0xee, 0x46, 0xce, 0x9a, - 0x47, 0xe6, 0x82, 0xa6, 0xcc, 0x1e, 0x16, 0x87, 0xe9, 0x67, 0xc4, 0x38, 0xa3, 0xf9, 0x2e, 0x0c, - 0x9c, 0xf1, 0x14, 0x9b, 0x65, 0x61, 0xb0, 0xdd, 0xb9, 0x16, 0x7a, 0x4c, 0x4b, 0x98, 0xb3, 0x4c, - 0xb4, 0x63, 0x85, 0x61, 0xff, 0x65, 0x51, 0x2d, 0x65, 0x9d, 0x00, 0xe0, 0x18, 0x81, 0xc8, 0xd6, - 0xdd, 0x07, 0x22, 0xeb, 0x30, 0xa9, 0xee, 0x9c, 0xf8, 0x44, 0x0a, 0x6d, 0xe1, 0x1e, 0xa5, 0xd0, - 0xfe, 0xb4, 0x95, 0xa8, 0x47, 0x37, 0xfc, 0xcc, 0x4b, 0xf9, 0x26, 0x1f, 0x4c, 0xf1, 0x10, 0xae, - 0x94, 0x5e, 0x49, 0x45, 0xee, 0x3d, 0x09, 0xe5, 0x75, 0xcf, 0x61, 0x55, 0x54, 0xd8, 0x42, 0x35, - 0xc2, 0xcb, 0x2e, 0x88, 0x76, 0xac, 0x30, 0xa8, 0xd4, 0x37, 0x3a, 0xdd, 0x97, 0xd4, 0xfe, 0x0f, - 0x45, 0x18, 0x36, 0x34, 0x7e, 0xa6, 0xf9, 0x66, 0xdd, 0x67, 0xe6, 0x5b, 0x61, 0x1f, 0xe6, 0xdb, - 0x4f, 0x41, 0xa5, 0x26, 0xb5, 0x51, 0x3e, 0xf5, 0xf5, 0xd3, 0x3a, 0x4e, 0x2b, 0x24, 0xd5, 0x84, - 0x35, 0x4d, 0x74, 0x31, 0x91, 0xa6, 0x99, 0xf0, 0x0b, 0x64, 0xe5, 0x51, 0x0a, 0x8d, 0xd6, 0xfd, - 0x4c, 0x3a, 0x38, 0xa0, 0xb4, 0x77, 0x70, 0x80, 0xfd, 0x4d, 0x4b, 0x7d, 0xdc, 0x23, 0xa8, 0xc7, - 0x73, 0x33, 0x59, 0x8f, 0xe7, 0x7c, 0x2e, 0xc3, 0xdc, 0xa3, 0x10, 0xcf, 0x55, 0x18, 0x9a, 0x0b, - 0x9a, 0x4d, 0xc7, 0xaf, 0xa3, 0x1f, 0x84, 0xa1, 0x1a, 0xff, 0x29, 0x7c, 0x68, 0xec, 0xa4, 0x5a, - 0x40, 0xb1, 0x84, 0xa1, 0x87, 0x61, 0xc0, 0x09, 0x1b, 0xd2, 0x6f, 0xc6, 0x22, 0xe0, 0x66, 0xc2, - 0x46, 0x84, 0x59, 0xab, 0xfd, 0x8f, 0x07, 0x80, 0x05, 0x9e, 0x38, 0x21, 0xa9, 0xaf, 0x06, 0xac, - 0x2c, 0xee, 0xa1, 0x9e, 0xef, 0xea, 0x4d, 0xdd, 0xfd, 0x7c, 0xc6, 0x6b, 0x9c, 0xf3, 0x15, 0x8f, - 0xfa, 0x9c, 0x2f, 0xfb, 0xe8, 0x76, 0xe0, 0x3e, 0x3a, 0xba, 0xb5, 0x3f, 0x69, 0x01, 0x52, 0x61, - 0x44, 0x3a, 0xb6, 0x62, 0x1a, 0x2a, 0x2a, 0x6e, 0x49, 0x18, 0x80, 0x5a, 0x44, 0x48, 0x00, 0xd6, - 0x38, 0x7d, 0xec, 0xe4, 0x1f, 0x93, 0xf2, 0xbb, 0x98, 0x4c, 0x3e, 0x60, 0x52, 0x5f, 0x88, 0x73, - 0xfb, 0xf7, 0x0a, 0xf0, 0x00, 0x37, 0x1d, 0x96, 0x1c, 0xdf, 0x69, 0x90, 0x26, 0xe5, 0xaa, 0xdf, - 0x68, 0x99, 0x1a, 0xdd, 0x42, 0xba, 0x32, 0x55, 0xe0, 0xa0, 0x6b, 0x97, 0xaf, 0x39, 0xbe, 0xca, - 0x16, 0x7c, 0x37, 0xc6, 0xac, 0x73, 0x14, 0x41, 0x59, 0x5e, 0x3e, 0x23, 0x64, 0x71, 0x4e, 0x84, - 0x94, 0x58, 0x12, 0x5a, 0x96, 0x60, 0x45, 0x88, 0xaa, 0x52, 0x2f, 0xa8, 0x6d, 0x62, 0xd2, 0x0a, - 0xd2, 0xaa, 0x74, 0x51, 0xb4, 0x63, 0x85, 0x61, 0x37, 0x61, 0x5c, 0x8e, 0x61, 0xeb, 0x0a, 0xe9, - 0x60, 0xb2, 0x4e, 0xf5, 0x4f, 0x4d, 0x36, 0x19, 0xf7, 0xe1, 0x28, 0xfd, 0x33, 0x67, 0x02, 0x71, - 0x12, 0x57, 0x56, 0xca, 0x2d, 0x64, 0x57, 0xca, 0xb5, 0x7f, 0xcf, 0x82, 0xb4, 0x02, 0x34, 0xea, - 0x82, 0x5a, 0xbb, 0xd6, 0x05, 0xdd, 0x47, 0x65, 0xcd, 0xf7, 0xc0, 0xb0, 0x13, 0x53, 0x0b, 0x87, - 0x7b, 0x23, 0x8a, 0x77, 0x77, 0x8a, 0xb6, 0x14, 0xd4, 0xdd, 0x75, 0x97, 0x79, 0x21, 0xcc, 0xee, - 0xec, 0xd7, 0x2d, 0xa8, 0xcc, 0x87, 0x9d, 0xfd, 0xe7, 0x6c, 0x75, 0x67, 0x64, 0x15, 0xf6, 0x95, - 0x91, 0x25, 0x73, 0xbe, 0x8a, 0xbd, 0x72, 0xbe, 0xec, 0xbf, 0x1e, 0x80, 0xe3, 0x5d, 0x49, 0x88, - 0xe8, 0x1c, 0x8c, 0xa8, 0xaf, 0x24, 0x5d, 0x90, 0x15, 0x33, 0x8a, 0x57, 0xc3, 0x70, 0x02, 0xb3, - 0x8f, 0xa5, 0xba, 0x00, 0x27, 0x42, 0xf2, 0x6a, 0x9b, 0xb4, 0xc9, 0xcc, 0x7a, 0x4c, 0xc2, 0x2a, - 0xa9, 0x05, 0x7e, 0x9d, 0x17, 0xd6, 0x2d, 0xce, 0x3e, 0x78, 0x7b, 0x67, 0xf2, 0x04, 0xee, 0x06, - 0xe3, 0xac, 0x67, 0x50, 0x0b, 0x46, 0x3d, 0xd3, 0x76, 0x16, 0x5b, 0xb6, 0xbb, 0x32, 0xbb, 0xd5, - 0x6c, 0x4d, 0x34, 0xe3, 0x24, 0x81, 0xa4, 0x01, 0x5e, 0xba, 0x47, 0x06, 0xf8, 0x47, 0xb4, 0x01, - 0xce, 0x83, 0x62, 0xde, 0x9d, 0x73, 0x12, 0x6a, 0x3f, 0x16, 0xf8, 0x41, 0x6c, 0xea, 0x17, 0xa1, - 0x2c, 0x03, 0x06, 0xfb, 0x0a, 0xb4, 0x33, 0xfb, 0xe9, 0x21, 0xdb, 0x1f, 0x87, 0x37, 0x9f, 0x0f, - 0x43, 0x63, 0x30, 0xaf, 0x06, 0xf1, 0x8c, 0xe7, 0x05, 0xb7, 0xa8, 0xb9, 0x72, 0x2d, 0x22, 0xc2, - 0x27, 0x66, 0xdf, 0x29, 0x40, 0xc6, 0xf6, 0x92, 0xae, 0x49, 0x6d, 0x23, 0x25, 0xd6, 0xe4, 0xfe, - 0xec, 0x24, 0xb4, 0xcd, 0x83, 0x2a, 0xb9, 0x35, 0xf0, 0xae, 0xbc, 0xb7, 0xc7, 0x3a, 0xce, 0x52, - 0x49, 0x4a, 0x15, 0x6b, 0xf9, 0x0c, 0x80, 0x36, 0x6d, 0x45, 0xde, 0x93, 0x0a, 0x94, 0xd0, 0x16, - 0x30, 0x36, 0xb0, 0xd0, 0xf3, 0x30, 0xec, 0xfa, 0x51, 0xec, 0x78, 0xde, 0x25, 0xd7, 0x8f, 0x85, - 0xdb, 0x57, 0x99, 0x3d, 0x0b, 0x1a, 0x84, 0x4d, 0xbc, 0x33, 0x6f, 0x33, 0xbe, 0xdf, 0x7e, 0xbe, - 0xfb, 0x06, 0x9c, 0xbe, 0xe8, 0xc6, 0x2a, 0x5b, 0x4f, 0xcd, 0x37, 0x6a, 0xb9, 0x2a, 0x59, 0x65, - 0xf5, 0xcc, 0x4f, 0x35, 0xb2, 0xe5, 0x0a, 0xc9, 0xe4, 0xbe, 0x74, 0xb6, 0x9c, 0x7d, 0x0e, 0x4e, - 0x5e, 0x74, 0xe3, 0x0b, 0xae, 0x47, 0xf6, 0x49, 0xc4, 0xfe, 0xdd, 0x41, 0x18, 0x31, 0x33, 0xd3, - 0xf7, 0x23, 0xae, 0x3f, 0x4d, 0x8d, 0x53, 0xf1, 0x76, 0xae, 0x3a, 0xd1, 0xbd, 0x71, 0xe0, 0x34, - 0xf9, 0xec, 0x11, 0x33, 0xec, 0x53, 0x4d, 0x13, 0x9b, 0x0c, 0xa0, 0x5b, 0x50, 0x5a, 0x67, 0xd9, - 0x5c, 0xc5, 0x3c, 0x62, 0x71, 0xb2, 0x46, 0x54, 0x2f, 0x47, 0x9e, 0x0f, 0xc6, 0xe9, 0x51, 0x9b, - 0x22, 0x4c, 0x26, 0x11, 0x1b, 0x31, 0xf6, 0x42, 0x59, 0x29, 0x8c, 0x5e, 0x2a, 0xa1, 0x74, 0x17, - 0x2a, 0x21, 0x21, 0xa0, 0x07, 0xef, 0x91, 0x80, 0x66, 0x99, 0x79, 0xf1, 0x06, 0xb3, 0x78, 0x45, - 0x52, 0xd0, 0x10, 0x1b, 0x04, 0x23, 0x33, 0x2f, 0x01, 0xc6, 0x69, 0x7c, 0xf4, 0x41, 0x25, 0xe2, - 0xcb, 0x79, 0x78, 0xcc, 0xcd, 0x19, 0x7d, 0xd8, 0xd2, 0xfd, 0x93, 0x05, 0x18, 0xbb, 0xe8, 0xb7, - 0x57, 0x2e, 0xae, 0xb4, 0xd7, 0x3c, 0xb7, 0x76, 0x85, 0x74, 0xa8, 0x08, 0xdf, 0x24, 0x9d, 0x85, - 0x79, 0xb1, 0x82, 0xd4, 0x9c, 0xb9, 0x42, 0x1b, 0x31, 0x87, 0x51, 0x61, 0xb4, 0xee, 0xfa, 0x0d, - 0x12, 0xb6, 0x42, 0x57, 0x38, 0xb3, 0x0d, 0x61, 0x74, 0x41, 0x83, 0xb0, 0x89, 0x47, 0xfb, 0x0e, - 0x6e, 0xf9, 0x24, 0x4c, 0x9b, 0xfe, 0xcb, 0xb4, 0x11, 0x73, 0x18, 0x45, 0x8a, 0xc3, 0xb6, 0xf0, - 0x15, 0x19, 0x48, 0xab, 0xb4, 0x11, 0x73, 0x18, 0x5d, 0xe9, 0x51, 0x7b, 0x8d, 0x85, 0x3a, 0xa5, - 0x32, 0x90, 0xaa, 0xbc, 0x19, 0x4b, 0x38, 0x45, 0xdd, 0x24, 0x9d, 0x79, 0x27, 0x76, 0xd2, 0x69, - 0x9a, 0x57, 0x78, 0x33, 0x96, 0x70, 0x56, 0xfa, 0x37, 0x39, 0x1c, 0xdf, 0x75, 0xa5, 0x7f, 0x93, - 0xec, 0xf7, 0xf0, 0x38, 0xfc, 0xcd, 0x02, 0x8c, 0x98, 0x01, 0x8a, 0xa8, 0x91, 0x32, 0xd3, 0x97, - 0xbb, 0x2a, 0xc7, 0xff, 0x78, 0xd6, 0xad, 0xaa, 0x0d, 0x37, 0x0e, 0x5a, 0xd1, 0x53, 0xc4, 0x6f, - 0xb8, 0x3e, 0x61, 0xb1, 0x1a, 0x3c, 0xb0, 0x31, 0x11, 0xfd, 0x38, 0x17, 0xd4, 0xc9, 0xdd, 0xd8, - 0xf9, 0xf7, 0xe2, 0xe6, 0x99, 0x1b, 0x70, 0xbc, 0x2b, 0x1f, 0xb8, 0x0f, 0xb3, 0x67, 0xcf, 0x7a, - 0x0d, 0x36, 0x86, 0x61, 0xda, 0xb1, 0x2c, 0x79, 0x37, 0x07, 0xc7, 0xf9, 0xe2, 0xa5, 0x94, 0x58, - 0x7a, 0xa7, 0xca, 0xf1, 0x66, 0xa7, 0x35, 0xd7, 0xd3, 0x40, 0xdc, 0x8d, 0x6f, 0x7f, 0xca, 0x82, - 0xd1, 0x44, 0x8a, 0x76, 0x4e, 0x06, 0x1a, 0x5b, 0xdd, 0x01, 0x8b, 0xd1, 0x65, 0x39, 0x13, 0x45, - 0xa6, 0xc0, 0xf5, 0xea, 0xd6, 0x20, 0x6c, 0xe2, 0xd9, 0x9f, 0x2b, 0x40, 0x59, 0x86, 0x14, 0xf5, - 0xc1, 0xca, 0x27, 0x2c, 0x18, 0x55, 0x27, 0x64, 0xcc, 0xa5, 0x59, 0xc8, 0x23, 0x63, 0x8c, 0x72, - 0xa0, 0x9c, 0x22, 0xfe, 0x7a, 0xa0, 0x77, 0x0b, 0xd8, 0x24, 0x86, 0x93, 0xb4, 0xd1, 0x75, 0x80, - 0xa8, 0x13, 0xc5, 0xa4, 0x69, 0x38, 0x57, 0x6d, 0x63, 0x96, 0x4d, 0xd5, 0x82, 0x90, 0xd0, 0x39, - 0x75, 0x35, 0xa8, 0x93, 0xaa, 0xc2, 0xd4, 0x66, 0x9b, 0x6e, 0xc3, 0x46, 0x4f, 0xf6, 0xaf, 0x17, - 0xe0, 0x58, 0x9a, 0x25, 0xf4, 0x6e, 0x18, 0x91, 0xd4, 0x8d, 0x4d, 0xb8, 0x0c, 0x88, 0x1a, 0xc1, - 0x06, 0xec, 0xce, 0xce, 0xe4, 0x64, 0xf7, 0xad, 0xc0, 0x53, 0x26, 0x0a, 0x4e, 0x74, 0xc6, 0x8f, - 0x29, 0xc5, 0x79, 0xfa, 0x6c, 0x67, 0xa6, 0xd5, 0x12, 0x67, 0x8d, 0xc6, 0x31, 0xa5, 0x09, 0xc5, - 0x29, 0x6c, 0xb4, 0x02, 0x27, 0x8d, 0x96, 0xab, 0xc4, 0x6d, 0x6c, 0xac, 0x05, 0xa1, 0xdc, 0xf5, - 0x3d, 0xac, 0xc3, 0x2f, 0xbb, 0x71, 0x70, 0xe6, 0x93, 0xd4, 0xc2, 0xa8, 0x39, 0x2d, 0xa7, 0xe6, - 0xc6, 0x1d, 0xe1, 0x2d, 0x56, 0xf2, 0x70, 0x4e, 0xb4, 0x63, 0x85, 0x61, 0xff, 0xea, 0x00, 0x1c, - 0xe3, 0xf1, 0x86, 0x44, 0x85, 0xd3, 0xa2, 0x77, 0x43, 0x25, 0x8a, 0x9d, 0x90, 0x6f, 0xf9, 0xad, - 0x7d, 0xcb, 0x00, 0x9d, 0xa0, 0x2d, 0x3b, 0xc1, 0xba, 0x3f, 0xf4, 0x12, 0xab, 0x6e, 0xe5, 0x46, - 0x1b, 0xac, 0xf7, 0xc2, 0xdd, 0x39, 0x14, 0x2e, 0xa8, 0x1e, 0xb0, 0xd1, 0x1b, 0xfa, 0x31, 0x28, - 0xb5, 0x36, 0x9c, 0x48, 0x7a, 0xbb, 0x1e, 0x97, 0x0b, 0x6e, 0x85, 0x36, 0xde, 0xd9, 0x99, 0x3c, - 0x95, 0x7e, 0x55, 0x06, 0xc0, 0xfc, 0x21, 0x53, 0x5c, 0x0e, 0xec, 0x7d, 0x03, 0x4b, 0x3d, 0xec, - 0x54, 0x2f, 0xcd, 0xa4, 0xef, 0xec, 0x98, 0x67, 0xad, 0x58, 0x40, 0xe9, 0xe2, 0xde, 0xe0, 0x24, - 0xeb, 0x14, 0x79, 0x30, 0xa9, 0xba, 0x2f, 0x69, 0x10, 0x36, 0xf1, 0xd0, 0x27, 0xbb, 0xa3, 0x51, - 0x87, 0x0e, 0x21, 0x55, 0xa1, 0xdf, 0x38, 0xd4, 0xf3, 0x50, 0x11, 0xac, 0xae, 0x06, 0xe8, 0x1c, - 0x8c, 0x70, 0x67, 0xca, 0x6c, 0xe8, 0xf8, 0xb5, 0x8d, 0xb4, 0x0b, 0x64, 0xd5, 0x80, 0xe1, 0x04, - 0xa6, 0xbd, 0x04, 0x03, 0x7d, 0x4a, 0xab, 0xbe, 0x76, 0xb6, 0x2f, 0x42, 0x99, 0x76, 0x27, 0xb7, - 0x2f, 0x79, 0x74, 0x19, 0x40, 0x59, 0xde, 0xe7, 0x87, 0x6c, 0x28, 0xba, 0x8e, 0x8c, 0x3a, 0x50, - 0x4b, 0x68, 0x21, 0x8a, 0xda, 0x6c, 0xda, 0x51, 0x20, 0x7a, 0x0c, 0x8a, 0x64, 0xbb, 0x95, 0x0e, - 0x2f, 0x38, 0xbf, 0xdd, 0x72, 0x43, 0x12, 0x51, 0x24, 0xb2, 0xdd, 0x42, 0x67, 0xa0, 0xe0, 0xd6, - 0xc5, 0x8c, 0x04, 0x81, 0x53, 0x58, 0x98, 0xc7, 0x05, 0xb7, 0x6e, 0x6f, 0x43, 0x45, 0x5d, 0x20, - 0x88, 0x36, 0xa5, 0x6d, 0x62, 0xe5, 0x11, 0x6f, 0x2a, 0xfb, 0xed, 0x61, 0x95, 0xb4, 0x01, 0x74, - 0xe6, 0x7f, 0x5e, 0xba, 0xec, 0x2c, 0x0c, 0xd4, 0x02, 0x51, 0xb3, 0xa5, 0xac, 0xbb, 0x61, 0x46, - 0x09, 0x83, 0xd8, 0x37, 0x60, 0xec, 0x8a, 0x1f, 0xdc, 0x62, 0xf7, 0xfc, 0xb0, 0xb2, 0xb6, 0xb4, - 0xe3, 0x75, 0xfa, 0x23, 0x6d, 0x02, 0x33, 0x28, 0xe6, 0x30, 0x55, 0x70, 0xb3, 0xd0, 0xab, 0xe0, - 0xa6, 0xfd, 0x21, 0x0b, 0x46, 0x54, 0x0a, 0xf1, 0xc5, 0xad, 0x4d, 0xda, 0x6f, 0x23, 0x0c, 0xda, - 0xad, 0x74, 0xbf, 0xec, 0xae, 0x52, 0xcc, 0x61, 0x66, 0x6e, 0x7d, 0x61, 0x8f, 0xdc, 0xfa, 0xb3, - 0x30, 0xb0, 0xe9, 0xfa, 0xf5, 0xb4, 0xcb, 0xf0, 0x8a, 0xeb, 0xd7, 0x31, 0x83, 0x50, 0x16, 0x8e, - 0x29, 0x16, 0xa4, 0xf1, 0x71, 0x0e, 0x46, 0xd6, 0xda, 0xae, 0x57, 0x97, 0xf5, 0x7a, 0x53, 0xcb, - 0x65, 0xd6, 0x80, 0xe1, 0x04, 0x26, 0x7a, 0x06, 0x60, 0xcd, 0xf5, 0x9d, 0xb0, 0xb3, 0xa2, 0xad, - 0x1d, 0xa5, 0x00, 0x67, 0x15, 0x04, 0x1b, 0x58, 0xf6, 0x67, 0x8a, 0x30, 0x96, 0x4c, 0xa4, 0xee, - 0xc3, 0x7d, 0xf0, 0x18, 0x94, 0x58, 0x6e, 0x75, 0xfa, 0xd3, 0xf2, 0x12, 0xb7, 0x1c, 0x86, 0x22, - 0x18, 0xe4, 0x8b, 0x39, 0x9f, 0xfb, 0x1e, 0x15, 0x93, 0xca, 0xcf, 0xc8, 0xa2, 0x72, 0x85, 0xdb, - 0x56, 0x90, 0x42, 0x1f, 0xb5, 0x60, 0x28, 0x68, 0x99, 0x85, 0x1a, 0xdf, 0x95, 0x67, 0x92, 0xb9, - 0xc8, 0xe4, 0x14, 0x3b, 0x3e, 0xf5, 0xe9, 0xe5, 0xe7, 0x90, 0xa4, 0xcf, 0xfc, 0x28, 0x8c, 0x98, - 0x98, 0x7b, 0x6d, 0xfa, 0xca, 0xe6, 0xa6, 0xef, 0x13, 0xe6, 0xa4, 0x10, 0x69, 0xf4, 0x7d, 0x2c, - 0xb7, 0x6b, 0x50, 0xaa, 0xa9, 0xd0, 0xa5, 0xbb, 0xaa, 0xf2, 0xae, 0xca, 0x4c, 0xb1, 0x63, 0x61, - 0xde, 0x9b, 0xfd, 0x4d, 0xcb, 0x98, 0x1f, 0x98, 0x44, 0x0b, 0x75, 0x14, 0x42, 0xb1, 0xb1, 0xb5, - 0x29, 0xd4, 0xfc, 0xe5, 0x9c, 0x86, 0xf7, 0xe2, 0xd6, 0xa6, 0x9e, 0xe3, 0x66, 0x2b, 0xa6, 0xc4, - 0xfa, 0x70, 0x86, 0x27, 0xaa, 0x2d, 0x14, 0xf7, 0xae, 0xb6, 0x60, 0xbf, 0x5e, 0x80, 0xe3, 0x5d, - 0x93, 0x0a, 0xbd, 0x06, 0xa5, 0x90, 0xbe, 0xa5, 0x78, 0xbd, 0xc5, 0xdc, 0xea, 0x23, 0x44, 0x0b, - 0x75, 0xad, 0x3e, 0x93, 0xed, 0x98, 0x93, 0x44, 0x97, 0x01, 0xe9, 0x00, 0x3b, 0xe5, 0x89, 0xe7, - 0xaf, 0xac, 0xa2, 0x70, 0x66, 0xba, 0x30, 0x70, 0xc6, 0x53, 0xe8, 0x85, 0xb4, 0x43, 0xbf, 0x98, - 0x3c, 0x49, 0xda, 0xcd, 0x37, 0x6f, 0xff, 0x76, 0x01, 0x46, 0x13, 0x75, 0x33, 0x91, 0x07, 0x65, - 0xe2, 0xb1, 0x63, 0x3e, 0xa9, 0x6c, 0x0e, 0x7a, 0x0b, 0x86, 0x52, 0x90, 0xe7, 0x45, 0xbf, 0x58, - 0x51, 0xb8, 0x3f, 0x82, 0x73, 0xce, 0xc1, 0x88, 0x64, 0xe8, 0x5d, 0x4e, 0xd3, 0x13, 0x03, 0xa8, - 0xe6, 0xe8, 0x79, 0x03, 0x86, 0x13, 0x98, 0xf6, 0xef, 0x17, 0x61, 0x82, 0x9f, 0x8b, 0xd6, 0xd5, - 0xcc, 0x5b, 0x92, 0xfe, 0x84, 0x9f, 0xd7, 0xd5, 0x6d, 0xad, 0x3c, 0xae, 0x7a, 0xee, 0x45, 0xa8, - 0xaf, 0x98, 0xd2, 0x2f, 0xa6, 0x62, 0x4a, 0xf9, 0x16, 0xaf, 0x71, 0x48, 0x1c, 0x7d, 0x77, 0x05, - 0x99, 0xfe, 0xfd, 0x02, 0x8c, 0xa7, 0x6e, 0xf4, 0x42, 0x9f, 0x49, 0x5e, 0x02, 0x61, 0xe5, 0x71, - 0x66, 0xb4, 0xeb, 0x25, 0x4f, 0xfb, 0xbb, 0x0a, 0xe2, 0x1e, 0x2d, 0x15, 0xfb, 0x1b, 0x05, 0x18, - 0x4b, 0x5e, 0x45, 0x76, 0x1f, 0x8e, 0xd4, 0x5b, 0xa1, 0xc2, 0x6e, 0xdb, 0x61, 0x37, 0xe8, 0xf3, - 0x23, 0x27, 0x7e, 0xb1, 0x89, 0x6c, 0xc4, 0x1a, 0x7e, 0x5f, 0xdc, 0xb0, 0x61, 0xff, 0x43, 0x0b, - 0x4e, 0xf1, 0xb7, 0x4c, 0xcf, 0xc3, 0xbf, 0x91, 0x35, 0xba, 0x2f, 0xe7, 0xcb, 0x60, 0xaa, 0x2a, - 0xf3, 0x5e, 0xe3, 0xcb, 0x2e, 0xbc, 0x16, 0xdc, 0x26, 0xa7, 0xc2, 0x7d, 0xc8, 0xec, 0xbe, 0x26, - 0x83, 0xfd, 0x8d, 0x22, 0xe8, 0x3b, 0xbe, 0x91, 0x2b, 0xb2, 0xde, 0x73, 0xa9, 0x4e, 0x5d, 0xed, - 0xf8, 0x35, 0x7d, 0x9b, 0x78, 0x39, 0x95, 0xf4, 0xfe, 0xb3, 0x16, 0x0c, 0xbb, 0xbe, 0x1b, 0xbb, - 0x0e, 0x73, 0xd9, 0xe4, 0x73, 0x51, 0xaf, 0x22, 0xb7, 0xc0, 0x7b, 0x0e, 0x42, 0xf3, 0x9c, 0x52, - 0x11, 0xc3, 0x26, 0x65, 0xf4, 0x3e, 0x91, 0xf6, 0x51, 0xcc, 0xad, 0x74, 0x44, 0x39, 0x95, 0xeb, - 0xd1, 0xa2, 0x86, 0x57, 0x1c, 0xe6, 0x54, 0x71, 0x05, 0xd3, 0xae, 0xd4, 0x45, 0x07, 0xca, 0xb4, - 0x65, 0xcd, 0x98, 0x13, 0xb2, 0x23, 0x40, 0xdd, 0x63, 0xb1, 0xcf, 0x90, 0xfa, 0x69, 0xa8, 0x38, - 0xed, 0x38, 0x68, 0xd2, 0x61, 0x12, 0x47, 0xa9, 0x3a, 0x69, 0x40, 0x02, 0xb0, 0xc6, 0xb1, 0x3f, - 0x53, 0x82, 0x54, 0x1a, 0x3a, 0xda, 0x36, 0xef, 0xa7, 0xb7, 0xf2, 0xbd, 0x9f, 0x5e, 0x31, 0x93, - 0x75, 0x47, 0x3d, 0x6a, 0x48, 0xef, 0x17, 0xb7, 0x31, 0x5f, 0x4c, 0x7b, 0xbf, 0x7e, 0xa2, 0xbf, - 0x53, 0x05, 0x3a, 0x57, 0xa7, 0x79, 0xd5, 0xb1, 0xa9, 0x3d, 0x1d, 0x65, 0x7b, 0x5d, 0x55, 0xfc, - 0x61, 0x71, 0xad, 0x10, 0x26, 0x51, 0xdb, 0x8b, 0xc5, 0x6c, 0x78, 0x31, 0xc7, 0x55, 0xc6, 0x3b, - 0xd6, 0xb5, 0x5c, 0xf8, 0x7f, 0x6c, 0x10, 0x4d, 0xba, 0x33, 0x07, 0x0f, 0xd5, 0x9d, 0x39, 0x94, - 0xab, 0x3b, 0xf3, 0x19, 0x00, 0x36, 0xb7, 0x79, 0xe8, 0x6f, 0x99, 0x79, 0x99, 0x94, 0x28, 0xc4, - 0x0a, 0x82, 0x0d, 0x2c, 0xfb, 0x87, 0x21, 0x59, 0x8c, 0x08, 0x4d, 0xca, 0xda, 0x47, 0xfc, 0xc4, - 0x83, 0x65, 0x5d, 0x25, 0xca, 0x14, 0xfd, 0xa6, 0x05, 0x66, 0xc5, 0x24, 0xf4, 0x2a, 0x2f, 0xcd, - 0x64, 0xe5, 0x71, 0x32, 0x6e, 0xf4, 0x3b, 0xb5, 0xe4, 0xb4, 0x52, 0x21, 0x1a, 0xb2, 0x3e, 0xd3, - 0x99, 0xb7, 0x41, 0x59, 0x42, 0xf7, 0x65, 0xd4, 0x7d, 0x10, 0x4e, 0xc8, 0x0c, 0x6e, 0xe9, 0xa3, - 0x17, 0xa7, 0xaa, 0x7b, 0xbb, 0x7e, 0xa4, 0x3f, 0xa7, 0xd0, 0xcb, 0x9f, 0xa3, 0x76, 0xa9, 0xc5, - 0x9e, 0x45, 0x97, 0x7f, 0xcb, 0x82, 0xb3, 0x69, 0x06, 0xa2, 0xa5, 0xc0, 0x77, 0xe3, 0x20, 0xac, - 0x92, 0x38, 0x76, 0xfd, 0x06, 0xab, 0xa0, 0x79, 0xcb, 0x09, 0xe5, 0x2d, 0x2a, 0x4c, 0x50, 0xde, - 0x70, 0x42, 0x1f, 0xb3, 0x56, 0xd4, 0x81, 0x41, 0x1e, 0x1f, 0x2a, 0xac, 0xf5, 0x03, 0xae, 0x8d, - 0x8c, 0xe1, 0xd0, 0xdb, 0x05, 0x1e, 0x9b, 0x8a, 0x05, 0x41, 0xfb, 0x5b, 0x16, 0xa0, 0xe5, 0x2d, - 0x12, 0x86, 0x6e, 0xdd, 0x88, 0x68, 0x65, 0xd7, 0xf3, 0x19, 0xd7, 0xf0, 0x99, 0xf5, 0x05, 0x52, - 0xd7, 0xf3, 0x19, 0xff, 0xb2, 0xaf, 0xe7, 0x2b, 0xec, 0xef, 0x7a, 0x3e, 0xb4, 0x0c, 0xa7, 0x9a, - 0x7c, 0xbb, 0xc1, 0xaf, 0xbc, 0xe2, 0x7b, 0x0f, 0x95, 0x0a, 0x7b, 0xfa, 0xf6, 0xce, 0xe4, 0xa9, - 0xa5, 0x2c, 0x04, 0x9c, 0xfd, 0x9c, 0xfd, 0x36, 0x40, 0x3c, 0x90, 0x75, 0x2e, 0x2b, 0x16, 0xaf, - 0xa7, 0xfb, 0xc5, 0xfe, 0x42, 0x09, 0xc6, 0x53, 0x35, 0xf6, 0xe9, 0x56, 0xaf, 0x3b, 0xf8, 0xef, - 0xc0, 0xfa, 0xbb, 0x9b, 0xbd, 0xbe, 0xc2, 0x09, 0x7d, 0x28, 0xb9, 0x7e, 0xab, 0x1d, 0xe7, 0x93, - 0x89, 0xcf, 0x99, 0x58, 0xa0, 0x1d, 0x1a, 0xee, 0x62, 0xfa, 0x17, 0x73, 0x32, 0x79, 0x06, 0x27, - 0x26, 0x8c, 0xf1, 0x81, 0x7b, 0xe4, 0x0e, 0xf8, 0xb0, 0x0e, 0x15, 0x2c, 0xe5, 0xe1, 0x58, 0x4c, - 0x4d, 0x96, 0xc3, 0x0e, 0x25, 0xf9, 0x6a, 0x01, 0x86, 0x8d, 0x8f, 0x86, 0x7e, 0x25, 0x59, 0x4f, - 0xd0, 0xca, 0xef, 0x95, 0x58, 0xff, 0x53, 0xba, 0x62, 0x20, 0x7f, 0xa5, 0xc7, 0xbb, 0x4b, 0x09, - 0xde, 0xd9, 0x99, 0x3c, 0x96, 0x2a, 0x16, 0x98, 0x28, 0x2f, 0x78, 0xe6, 0x03, 0x30, 0x9e, 0xea, - 0x26, 0xe3, 0x95, 0x57, 0xcd, 0x57, 0x3e, 0xb0, 0x5b, 0xca, 0x1c, 0xb2, 0xaf, 0xd0, 0x21, 0x13, - 0x09, 0xc0, 0x81, 0x47, 0xfa, 0xf0, 0xc1, 0xa6, 0xf2, 0xfc, 0x0b, 0x7d, 0xe6, 0xf9, 0x3f, 0x01, - 0xe5, 0x56, 0xe0, 0xb9, 0x35, 0x57, 0x95, 0x23, 0x66, 0x95, 0x05, 0x56, 0x44, 0x1b, 0x56, 0x50, - 0x74, 0x0b, 0x2a, 0x37, 0x6f, 0xc5, 0xfc, 0xf4, 0x47, 0xf8, 0xb7, 0xf3, 0x3a, 0xf4, 0x51, 0x46, - 0x8b, 0x3a, 0x5e, 0xc2, 0x9a, 0x16, 0xb2, 0x61, 0x90, 0x29, 0x41, 0x99, 0x0c, 0xc4, 0x7c, 0xef, - 0x4c, 0x3b, 0x46, 0x58, 0x40, 0xec, 0xef, 0x00, 0x9c, 0xcc, 0xba, 0xe8, 0x04, 0xbd, 0x1f, 0x06, - 0x39, 0x8f, 0xf9, 0xdc, 0xa5, 0x95, 0x45, 0xe3, 0x22, 0xeb, 0x50, 0xb0, 0xc5, 0x7e, 0x63, 0x41, - 0x53, 0x50, 0xf7, 0x9c, 0x35, 0x31, 0x43, 0x0e, 0x87, 0xfa, 0xa2, 0xa3, 0xa9, 0x2f, 0x3a, 0x9c, - 0xba, 0xe7, 0xac, 0xa1, 0x6d, 0x28, 0x35, 0xdc, 0x98, 0x38, 0xc2, 0x89, 0x70, 0xe3, 0x50, 0x88, - 0x13, 0x87, 0x5b, 0x69, 0xec, 0x27, 0xe6, 0x04, 0xd1, 0x97, 0x2c, 0x18, 0x5f, 0x4b, 0x16, 0x18, - 0x11, 0xc2, 0xd3, 0x39, 0x84, 0xcb, 0x6c, 0x92, 0x84, 0xf8, 0xfd, 0x94, 0xa9, 0x46, 0x9c, 0x66, - 0x07, 0x7d, 0xc4, 0x82, 0xa1, 0x75, 0xd7, 0x33, 0x6e, 0x0b, 0x38, 0x84, 0x8f, 0x73, 0x81, 0x11, - 0xd0, 0x3b, 0x0e, 0xfe, 0x3f, 0xc2, 0x92, 0x72, 0x2f, 0x4d, 0x35, 0x78, 0x50, 0x4d, 0x35, 0x74, - 0x8f, 0x34, 0xd5, 0xc7, 0x2d, 0xa8, 0xa8, 0x91, 0x16, 0x85, 0x1a, 0xde, 0x7d, 0x88, 0x9f, 0x9c, - 0x7b, 0x4e, 0xd4, 0x5f, 0xac, 0x89, 0xa3, 0xcf, 0x5a, 0x30, 0xec, 0xbc, 0xd6, 0x0e, 0x49, 0x9d, - 0x6c, 0x05, 0xad, 0x48, 0x94, 0x4f, 0x7c, 0x39, 0x7f, 0x66, 0x66, 0x28, 0x91, 0x79, 0xb2, 0xb5, - 0xdc, 0x8a, 0x44, 0xa2, 0xa2, 0x6e, 0xc0, 0x26, 0x0b, 0xe8, 0x67, 0xb4, 0x1e, 0x87, 0x3c, 0x8a, - 0xe8, 0x66, 0x71, 0x73, 0xd8, 0xca, 0x7c, 0xa7, 0x00, 0x93, 0x7b, 0x8c, 0x02, 0x3a, 0x07, 0x23, - 0x41, 0xd8, 0x70, 0x7c, 0xf7, 0x35, 0xb3, 0xea, 0x91, 0xb2, 0x14, 0x97, 0x0d, 0x18, 0x4e, 0x60, - 0x9a, 0xe5, 0x30, 0x0a, 0x7b, 0x94, 0xc3, 0x38, 0x0b, 0x03, 0x21, 0x69, 0x05, 0xe9, 0x0d, 0x0f, - 0x4b, 0x74, 0x62, 0x10, 0xf4, 0x08, 0x14, 0x9d, 0x96, 0x2b, 0xc2, 0x63, 0xd4, 0x3e, 0x6e, 0x66, - 0x65, 0x01, 0xd3, 0xf6, 0x44, 0x75, 0x9e, 0xd2, 0x91, 0x54, 0xe7, 0xa1, 0xaa, 0x4c, 0x9c, 0xbf, - 0x0c, 0x6a, 0x55, 0x96, 0x3c, 0x17, 0xb1, 0x5f, 0x2f, 0xc2, 0x23, 0xbb, 0xce, 0x79, 0x1d, 0x2b, - 0x6b, 0xed, 0x12, 0x2b, 0x2b, 0x87, 0xa7, 0xb0, 0xd7, 0xf0, 0x14, 0x7b, 0x0c, 0xcf, 0x47, 0xe8, - 0x52, 0x96, 0xd5, 0xa2, 0xf2, 0xb9, 0x62, 0xb9, 0x57, 0xf1, 0x29, 0xb1, 0x8a, 0x25, 0x14, 0x6b, - 0xba, 0x74, 0x1f, 0x93, 0x28, 0x05, 0x51, 0xca, 0x43, 0x95, 0xf5, 0xac, 0xd8, 0xc4, 0xd7, 0x6f, - 0xaf, 0xfa, 0x12, 0xf6, 0xef, 0x0c, 0xc0, 0x63, 0x7d, 0x68, 0x20, 0x73, 0x16, 0x5b, 0x7d, 0xce, - 0xe2, 0xef, 0xf2, 0xcf, 0xf4, 0xb1, 0xcc, 0xcf, 0x84, 0xf3, 0xff, 0x4c, 0xbb, 0x7f, 0x21, 0xf4, - 0x24, 0x94, 0x5d, 0x3f, 0x22, 0xb5, 0x76, 0xc8, 0xf3, 0x06, 0x8c, 0x2c, 0xc8, 0x05, 0xd1, 0x8e, - 0x15, 0x06, 0xdd, 0x97, 0xd6, 0x1c, 0xba, 0xfc, 0x87, 0x72, 0x4a, 0xfd, 0x37, 0x13, 0x2a, 0xb9, - 0x59, 0x34, 0x37, 0x43, 0x25, 0x00, 0x27, 0x63, 0xff, 0x82, 0x05, 0x67, 0x7a, 0x9b, 0x09, 0xe8, - 0x69, 0x18, 0x5e, 0x63, 0xc1, 0x67, 0xec, 0x72, 0x7d, 0x39, 0x75, 0xd8, 0xfb, 0xea, 0x66, 0x6c, - 0xe2, 0xa0, 0x39, 0x38, 0x6e, 0x46, 0xad, 0x2d, 0x19, 0x91, 0x31, 0xcc, 0x91, 0xb1, 0x9a, 0x06, - 0xe2, 0x6e, 0x7c, 0xfb, 0xdb, 0xc5, 0x6c, 0xb6, 0xb8, 0x39, 0xb9, 0x9f, 0xd9, 0x2c, 0xe6, 0x6a, - 0xa1, 0x0f, 0x89, 0x5b, 0x3c, 0x6a, 0x89, 0x3b, 0xd0, 0x4b, 0xe2, 0xa2, 0x79, 0x38, 0x66, 0xdc, - 0x7e, 0xc8, 0x8b, 0x41, 0xf0, 0x48, 0x49, 0x55, 0xc9, 0x69, 0x25, 0x05, 0xc7, 0x5d, 0x4f, 0xdc, - 0xe7, 0x53, 0xef, 0x57, 0x0b, 0x70, 0xba, 0xa7, 0x05, 0x7f, 0x44, 0x1a, 0xc5, 0xfc, 0xfc, 0x03, - 0x47, 0xf3, 0xf9, 0xcd, 0x8f, 0x52, 0xda, 0xeb, 0xa3, 0xd8, 0x7f, 0x52, 0xe8, 0xb9, 0x10, 0xe8, - 0x6e, 0xee, 0x7b, 0x76, 0x94, 0x5e, 0x80, 0x51, 0xa7, 0xd5, 0xe2, 0x78, 0x2c, 0xea, 0x3c, 0x55, - 0x39, 0x6e, 0xc6, 0x04, 0xe2, 0x24, 0x6e, 0x5f, 0x36, 0xcd, 0x9f, 0x5b, 0x50, 0xc1, 0x64, 0x9d, - 0x4b, 0x23, 0x74, 0x53, 0x0c, 0x91, 0x95, 0x47, 0xed, 0x6e, 0x3a, 0xb0, 0x91, 0xcb, 0x6a, 0x5a, - 0x67, 0x0d, 0xf6, 0x41, 0x73, 0xaf, 0xd5, 0x7d, 0x88, 0xc5, 0xde, 0xf7, 0x21, 0xda, 0xff, 0xad, - 0x4c, 0x5f, 0xaf, 0x15, 0xcc, 0x85, 0xa4, 0x1e, 0xd1, 0xef, 0xdb, 0x0e, 0x3d, 0x31, 0x49, 0xd4, - 0xf7, 0xbd, 0x86, 0x17, 0x31, 0x6d, 0x4f, 0x1c, 0xf2, 0x15, 0xf6, 0x55, 0x37, 0xab, 0xb8, 0x67, - 0xdd, 0xac, 0x17, 0x60, 0x34, 0x8a, 0x36, 0x56, 0x42, 0x77, 0xcb, 0x89, 0xc9, 0x15, 0xd2, 0x11, - 0xb6, 0xaf, 0xae, 0x21, 0x53, 0xbd, 0xa4, 0x81, 0x38, 0x89, 0x8b, 0x2e, 0xc2, 0x71, 0x5d, 0xbd, - 0x8a, 0x84, 0x31, 0xcb, 0x8b, 0xe2, 0x33, 0x41, 0x15, 0x8c, 0xd0, 0xf5, 0xae, 0x04, 0x02, 0xee, - 0x7e, 0x86, 0xca, 0xd3, 0x44, 0x23, 0x65, 0x64, 0x30, 0x29, 0x4f, 0x13, 0xfd, 0x50, 0x5e, 0xba, - 0x9e, 0x40, 0x4b, 0x70, 0x82, 0x4f, 0x8c, 0x99, 0x56, 0xcb, 0x78, 0xa3, 0xa1, 0x64, 0xcd, 0xe4, - 0x8b, 0xdd, 0x28, 0x38, 0xeb, 0x39, 0xf4, 0x3c, 0x0c, 0xab, 0xe6, 0x85, 0x79, 0x71, 0x3e, 0xa5, - 0xfc, 0x63, 0xaa, 0x9b, 0x85, 0x3a, 0x36, 0xf1, 0xd0, 0xbb, 0xe0, 0x41, 0xfd, 0x97, 0x27, 0xcf, - 0xf2, 0x43, 0xdb, 0x79, 0x51, 0x18, 0x50, 0xdd, 0xc7, 0x73, 0x31, 0x13, 0xad, 0x8e, 0x7b, 0x3d, - 0x8f, 0xd6, 0xe0, 0x8c, 0x02, 0x9d, 0xf7, 0x63, 0x96, 0x09, 0x17, 0x91, 0x59, 0x27, 0x22, 0xd7, - 0x42, 0x8f, 0x95, 0x12, 0xac, 0xe8, 0x0b, 0xda, 0x2f, 0xba, 0xf1, 0xa5, 0x2c, 0x4c, 0xbc, 0x88, - 0x77, 0xe9, 0x05, 0x4d, 0x43, 0x85, 0xf8, 0xce, 0x9a, 0x47, 0x96, 0xe7, 0x16, 0x58, 0x81, 0x41, - 0xe3, 0x8c, 0xf8, 0xbc, 0x04, 0x60, 0x8d, 0xa3, 0x62, 0x97, 0x47, 0x7a, 0xc5, 0x2e, 0xa3, 0x15, - 0x38, 0xd9, 0xa8, 0xb5, 0xa8, 0x45, 0xe8, 0xd6, 0xc8, 0x4c, 0x8d, 0x85, 0x6a, 0xd2, 0x0f, 0xc3, - 0x8b, 0x59, 0xab, 0x24, 0x90, 0x8b, 0x73, 0x2b, 0x5d, 0x38, 0x38, 0xf3, 0x49, 0x16, 0xd2, 0x1b, - 0x06, 0xdb, 0x9d, 0x89, 0x13, 0xa9, 0x90, 0x5e, 0xda, 0x88, 0x39, 0x0c, 0x5d, 0x06, 0xc4, 0x32, - 0x8a, 0x2e, 0xc5, 0x71, 0x4b, 0x99, 0xa0, 0x13, 0x27, 0x93, 0x65, 0xc2, 0x2e, 0x74, 0x61, 0xe0, - 0x8c, 0xa7, 0xa8, 0x45, 0xe3, 0x07, 0xac, 0xf7, 0x89, 0x07, 0x93, 0x16, 0xcd, 0x55, 0xde, 0x8c, - 0x25, 0x1c, 0xbd, 0x07, 0x26, 0xda, 0x11, 0x61, 0x9b, 0xdb, 0x1b, 0x41, 0xb8, 0xe9, 0x05, 0x4e, - 0x7d, 0x81, 0x5d, 0xbc, 0x18, 0x77, 0x26, 0x26, 0x18, 0xf1, 0xb3, 0xe2, 0xd9, 0x89, 0x6b, 0x3d, - 0xf0, 0x70, 0xcf, 0x1e, 0xd2, 0x75, 0xee, 0x4e, 0xf7, 0x57, 0xe7, 0xce, 0xfe, 0x33, 0x0b, 0x46, - 0x95, 0xbc, 0x39, 0x82, 0x3c, 0x44, 0x2f, 0x99, 0x87, 0x78, 0xf1, 0xe0, 0x12, 0x9b, 0x71, 0xde, - 0x23, 0xd8, 0xff, 0x5f, 0x8e, 0x00, 0x68, 0xa9, 0xae, 0x14, 0xaa, 0xd5, 0x53, 0xa1, 0xde, 0xb7, - 0x12, 0x35, 0xab, 0xca, 0x58, 0xe9, 0xde, 0x56, 0x19, 0xab, 0xc2, 0x29, 0x69, 0xee, 0xf0, 0x53, - 0xd4, 0x4b, 0x41, 0xa4, 0x04, 0xb4, 0x71, 0x91, 0xd6, 0x42, 0x16, 0x12, 0xce, 0x7e, 0x36, 0x61, - 0x65, 0x0d, 0xed, 0x69, 0xfa, 0x2a, 0x99, 0xb4, 0xb8, 0x2e, 0xaf, 0xb9, 0x4b, 0xc9, 0xa4, 0xc5, - 0x0b, 0x55, 0xac, 0x71, 0xb2, 0x15, 0x53, 0x25, 0x27, 0xc5, 0x04, 0xfb, 0x56, 0x4c, 0x52, 0x44, - 0x0e, 0xf7, 0x14, 0x91, 0xf2, 0xb4, 0x66, 0xa4, 0xe7, 0x69, 0xcd, 0xdb, 0x61, 0xcc, 0xf5, 0x37, - 0x48, 0xe8, 0xc6, 0xa4, 0xce, 0xd6, 0x02, 0x13, 0x9f, 0x65, 0x6d, 0x96, 0x2c, 0x24, 0xa0, 0x38, - 0x85, 0x9d, 0x94, 0xeb, 0x63, 0x7d, 0xc8, 0xf5, 0x1e, 0xda, 0x74, 0x3c, 0x1f, 0x6d, 0x7a, 0xec, - 0xe0, 0xda, 0xf4, 0xf8, 0xa1, 0x6a, 0x53, 0x94, 0x8b, 0x36, 0xed, 0x4b, 0x51, 0x19, 0xdb, 0xe5, - 0x93, 0x7b, 0x6c, 0x97, 0x7b, 0xa9, 0xd2, 0x53, 0x77, 0xad, 0x4a, 0xb3, 0xb5, 0xe4, 0x03, 0xdf, - 0x97, 0x5a, 0xf2, 0xe3, 0x05, 0x38, 0xa5, 0xf5, 0x08, 0x5d, 0xbd, 0xee, 0x3a, 0x95, 0xa4, 0xec, - 0xa6, 0x57, 0x7e, 0x22, 0x6b, 0xa4, 0xd8, 0xea, 0x6c, 0x5d, 0x05, 0xc1, 0x06, 0x16, 0xcb, 0x54, - 0x25, 0x21, 0xbb, 0x66, 0x20, 0xad, 0x64, 0xe6, 0x44, 0x3b, 0x56, 0x18, 0x94, 0x65, 0xfa, 0x5b, - 0x54, 0x1c, 0x48, 0x17, 0xb0, 0x9d, 0xd3, 0x20, 0x6c, 0xe2, 0xa1, 0x27, 0x38, 0x11, 0x26, 0xe0, - 0xa8, 0xa2, 0x19, 0xe1, 0x5b, 0x36, 0x25, 0xd3, 0x14, 0x54, 0xb2, 0xc3, 0x52, 0x92, 0x4b, 0xdd, - 0xec, 0xb0, 0xe0, 0x46, 0x85, 0x61, 0xff, 0x0f, 0x0b, 0x4e, 0x67, 0x0e, 0xc5, 0x11, 0x18, 0x0f, - 0xdb, 0x49, 0xe3, 0xa1, 0x9a, 0xd7, 0x76, 0xcf, 0x78, 0x8b, 0x1e, 0x86, 0xc4, 0xbf, 0xb7, 0x60, - 0x4c, 0xe3, 0x1f, 0xc1, 0xab, 0xba, 0xc9, 0x57, 0xcd, 0x6f, 0x67, 0x5b, 0xe9, 0x7a, 0xb7, 0xdf, - 0x2f, 0x80, 0x2a, 0x2a, 0x3d, 0x53, 0x93, 0x25, 0xfb, 0xf7, 0x88, 0x11, 0xe8, 0xc0, 0x20, 0x0b, - 0x71, 0x88, 0xf2, 0x09, 0xdf, 0x4a, 0xd2, 0x67, 0xe1, 0x12, 0xfa, 0xc4, 0x89, 0xfd, 0x8d, 0xb0, - 0x20, 0xc8, 0x2e, 0xc1, 0xe0, 0xf5, 0x7a, 0xeb, 0x22, 0xe1, 0x52, 0x5f, 0x82, 0x21, 0xda, 0xb1, - 0xc2, 0xa0, 0xea, 0xcd, 0xad, 0x05, 0xfe, 0x9c, 0xe7, 0x44, 0xf2, 0xf2, 0x77, 0xa5, 0xde, 0x16, - 0x24, 0x00, 0x6b, 0x1c, 0x16, 0xfd, 0xe0, 0x46, 0x2d, 0xcf, 0xe9, 0x18, 0xfe, 0x0b, 0xa3, 0xb2, - 0x8e, 0x02, 0x61, 0x13, 0xcf, 0x6e, 0xc2, 0x44, 0xf2, 0x25, 0xe6, 0xc9, 0x3a, 0x0b, 0x3d, 0xee, - 0x6b, 0x38, 0xa7, 0xa1, 0xe2, 0xb0, 0xa7, 0x16, 0xdb, 0x8e, 0x90, 0x09, 0x3a, 0x00, 0x57, 0x02, - 0xb0, 0xc6, 0xb1, 0xff, 0x81, 0x05, 0x27, 0x32, 0x06, 0x2d, 0xc7, 0x84, 0xd6, 0x58, 0x4b, 0x9b, - 0x2c, 0xc3, 0xe4, 0x87, 0x60, 0xa8, 0x4e, 0xd6, 0x1d, 0x19, 0xdc, 0x6a, 0x88, 0xf4, 0x79, 0xde, - 0x8c, 0x25, 0xdc, 0xfe, 0xed, 0x02, 0x8c, 0x27, 0x79, 0x8d, 0x58, 0x92, 0x18, 0x1f, 0x26, 0x37, - 0xaa, 0x05, 0x5b, 0x24, 0xec, 0xd0, 0x37, 0xb7, 0x52, 0x49, 0x62, 0x5d, 0x18, 0x38, 0xe3, 0x29, - 0x56, 0x52, 0xbe, 0xae, 0x46, 0x5b, 0xce, 0xc8, 0xeb, 0x79, 0xce, 0x48, 0xfd, 0x31, 0xcd, 0x40, - 0x18, 0x45, 0x12, 0x9b, 0xf4, 0xa9, 0x81, 0xc4, 0xa2, 0xee, 0x67, 0xdb, 0xae, 0x17, 0xbb, 0xbe, - 0x78, 0x65, 0x31, 0x57, 0x95, 0x81, 0xb4, 0xd4, 0x8d, 0x82, 0xb3, 0x9e, 0xb3, 0xbf, 0x35, 0x00, - 0xaa, 0x58, 0x03, 0x0b, 0x54, 0xcc, 0x29, 0xcc, 0x73, 0xbf, 0xa9, 0x86, 0x6a, 0x6e, 0x0d, 0xec, - 0x16, 0x39, 0xc4, 0x9d, 0x5e, 0xa6, 0xe7, 0x5b, 0x0d, 0xd8, 0xaa, 0x06, 0x61, 0x13, 0x8f, 0x72, - 0xe2, 0xb9, 0x5b, 0x84, 0x3f, 0x34, 0x98, 0xe4, 0x64, 0x51, 0x02, 0xb0, 0xc6, 0xa1, 0x9c, 0xd4, - 0xdd, 0xf5, 0x75, 0xe1, 0xc1, 0x51, 0x9c, 0xd0, 0xd1, 0xc1, 0x0c, 0xc2, 0x2f, 0x1d, 0x09, 0x36, - 0xc5, 0xa6, 0xc0, 0xb8, 0x74, 0x24, 0xd8, 0xc4, 0x0c, 0x42, 0xbf, 0x92, 0x1f, 0x84, 0x4d, 0xc7, - 0x73, 0x5f, 0x23, 0x75, 0x45, 0x45, 0x6c, 0x06, 0xd4, 0x57, 0xba, 0xda, 0x8d, 0x82, 0xb3, 0x9e, - 0xa3, 0x13, 0xba, 0x15, 0x92, 0xba, 0x5b, 0x8b, 0xcd, 0xde, 0x20, 0x39, 0xa1, 0x57, 0xba, 0x30, - 0x70, 0xc6, 0x53, 0x68, 0x06, 0xc6, 0x65, 0xb1, 0x0d, 0x59, 0xbe, 0x6d, 0x38, 0x59, 0x2e, 0x0a, - 0x27, 0xc1, 0x38, 0x8d, 0x4f, 0x85, 0x64, 0x53, 0x14, 0x9f, 0x64, 0x7b, 0x07, 0x43, 0x48, 0xca, - 0xa2, 0x94, 0x58, 0x61, 0xd8, 0x1f, 0x2e, 0x52, 0xa5, 0xde, 0xa3, 0xc6, 0xeb, 0x91, 0x85, 0x15, - 0x27, 0x67, 0xe4, 0x40, 0x1f, 0x33, 0xf2, 0x39, 0x18, 0xb9, 0x19, 0x05, 0xbe, 0x0a, 0xd9, 0x2d, - 0xf5, 0x0c, 0xd9, 0x35, 0xb0, 0xb2, 0x43, 0x76, 0x07, 0xf3, 0x0a, 0xd9, 0x1d, 0xba, 0xcb, 0x90, - 0xdd, 0x3f, 0x2c, 0x81, 0xba, 0x55, 0xee, 0x2a, 0x89, 0x6f, 0x05, 0xe1, 0xa6, 0xeb, 0x37, 0x58, - 0xe1, 0x88, 0x2f, 0x59, 0xb2, 0xf6, 0xc4, 0xa2, 0x99, 0x72, 0xb9, 0x9e, 0xd3, 0xcd, 0x60, 0x09, - 0x62, 0x53, 0xab, 0x06, 0xa1, 0xd4, 0x65, 0xfd, 0x26, 0x08, 0x27, 0x38, 0x42, 0x1f, 0x00, 0x90, - 0xee, 0xee, 0x75, 0x29, 0x81, 0x17, 0xf2, 0xe1, 0x0f, 0x93, 0x75, 0x6d, 0x52, 0xaf, 0x2a, 0x22, - 0xd8, 0x20, 0x88, 0x3e, 0xae, 0xd3, 0x51, 0x79, 0x6e, 0xcf, 0xfb, 0x0e, 0x65, 0x6c, 0xfa, 0x49, - 0x46, 0xc5, 0x30, 0xe4, 0xfa, 0x0d, 0x3a, 0x4f, 0x44, 0x68, 0xe3, 0x5b, 0xb2, 0x0a, 0xfc, 0x2c, - 0x06, 0x4e, 0x7d, 0xd6, 0xf1, 0x1c, 0xbf, 0x46, 0xc2, 0x05, 0x8e, 0xae, 0x35, 0xa8, 0x68, 0xc0, - 0xb2, 0xa3, 0xae, 0xab, 0xef, 0x4a, 0xfd, 0x5c, 0x7d, 0x77, 0xe6, 0x1d, 0x70, 0xbc, 0xeb, 0x63, - 0xee, 0x2b, 0xf7, 0xf4, 0xee, 0xd3, 0x56, 0xed, 0xdf, 0x19, 0xd4, 0x4a, 0xeb, 0x6a, 0x50, 0xe7, - 0x37, 0xa9, 0x85, 0xfa, 0x8b, 0x0a, 0x93, 0x39, 0xc7, 0x29, 0xa2, 0xd4, 0x8c, 0xd1, 0x88, 0x4d, + // 11996 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x1c, 0xc9, + 0x75, 0x98, 0x66, 0x17, 0x0b, 0xec, 0x3e, 0x7c, 0x91, 0x4d, 0xf2, 0x0e, 0xe4, 0x7d, 0x80, 0x9e, + 0x93, 0x4f, 0xe7, 0xe8, 0x0e, 0xf0, 0x7d, 0xc9, 0x8c, 0xcf, 0x96, 0x8d, 0x0f, 0x7e, 0x80, 0x04, + 0x08, 0x5c, 0x2f, 0x48, 0x4a, 0x27, 0x9d, 0x4e, 0x83, 0xdd, 0xc6, 0x62, 0x88, 0xd9, 0x99, 0xbd, + 0x99, 0x59, 0x10, 0x7b, 0x96, 0x64, 0xc9, 0x92, 0x6c, 0xd9, 0xfa, 0x8c, 0xe4, 0x8a, 0xcf, 0x89, + 0xa5, 0xc8, 0xb6, 0x92, 0x4a, 0x2a, 0xa5, 0xb2, 0x12, 0x57, 0x25, 0x4e, 0x6c, 0x97, 0x2b, 0x76, + 0xe2, 0x52, 0xe2, 0xa4, 0xec, 0xa8, 0x54, 0x96, 0x13, 0xdb, 0x88, 0xc4, 0x24, 0x25, 0x57, 0xaa, + 0xe2, 0xaa, 0x38, 0xf9, 0x91, 0x62, 0x52, 0xa9, 0x54, 0x7f, 0xf7, 0xcc, 0xce, 0x02, 0x0b, 0x62, + 0x00, 0x52, 0xd2, 0xfd, 0xdb, 0xed, 0xf7, 0xa6, 0xdf, 0x9b, 0x9e, 0xee, 0xf7, 0x5e, 0xbf, 0x7e, + 0xef, 0x35, 0x2c, 0x36, 0xdc, 0x78, 0xa3, 0xbd, 0x36, 0x55, 0x0b, 0x9a, 0xd3, 0x4e, 0xd8, 0x08, + 0x5a, 0x61, 0x70, 0x93, 0xfd, 0x78, 0xaa, 0x56, 0x9f, 0xde, 0x7a, 0x76, 0xba, 0xb5, 0xd9, 0x98, + 0x76, 0x5a, 0x6e, 0x34, 0xed, 0xb4, 0x5a, 0x9e, 0x5b, 0x73, 0x62, 0x37, 0xf0, 0xa7, 0xb7, 0x9e, + 0x76, 0xbc, 0xd6, 0x86, 0xf3, 0xf4, 0x74, 0x83, 0xf8, 0x24, 0x74, 0x62, 0x52, 0x9f, 0x6a, 0x85, + 0x41, 0x1c, 0xa0, 0x1f, 0xd1, 0xbd, 0x4d, 0xc9, 0xde, 0xd8, 0x8f, 0x57, 0x6a, 0xf5, 0xa9, 0xad, + 0x67, 0xa7, 0x5a, 0x9b, 0x8d, 0x29, 0xda, 0xdb, 0x94, 0xd1, 0xdb, 0x94, 0xec, 0xed, 0xcc, 0x53, + 0x06, 0x2f, 0x8d, 0xa0, 0x11, 0x4c, 0xb3, 0x4e, 0xd7, 0xda, 0xeb, 0xec, 0x1f, 0xfb, 0xc3, 0x7e, + 0x71, 0x62, 0x67, 0xec, 0xcd, 0x73, 0xd1, 0x94, 0x1b, 0x50, 0xf6, 0xa6, 0x6b, 0x41, 0x48, 0xa6, + 0xb7, 0xba, 0x18, 0x3a, 0x73, 0x49, 0xe3, 0x90, 0xed, 0x98, 0xf8, 0x91, 0x1b, 0xf8, 0xd1, 0x53, + 0x94, 0x05, 0x12, 0x6e, 0x91, 0xd0, 0x7c, 0x3d, 0x03, 0x21, 0xab, 0xa7, 0xe7, 0x74, 0x4f, 0x4d, + 0xa7, 0xb6, 0xe1, 0xfa, 0x24, 0xec, 0xe8, 0xc7, 0x9b, 0x24, 0x76, 0xb2, 0x9e, 0x9a, 0xee, 0xf5, + 0x54, 0xd8, 0xf6, 0x63, 0xb7, 0x49, 0xba, 0x1e, 0x78, 0xdb, 0x5e, 0x0f, 0x44, 0xb5, 0x0d, 0xd2, + 0x74, 0xba, 0x9e, 0x7b, 0xb6, 0xd7, 0x73, 0xed, 0xd8, 0xf5, 0xa6, 0x5d, 0x3f, 0x8e, 0xe2, 0x30, + 0xfd, 0x90, 0xfd, 0x4b, 0x16, 0x8c, 0xce, 0xdc, 0xa8, 0xce, 0xb4, 0xe3, 0x8d, 0xb9, 0xc0, 0x5f, + 0x77, 0x1b, 0xe8, 0x79, 0x18, 0xae, 0x79, 0xed, 0x28, 0x26, 0xe1, 0x55, 0xa7, 0x49, 0x26, 0xac, + 0xb3, 0xd6, 0x13, 0x95, 0xd9, 0x13, 0x5f, 0xdd, 0x99, 0x7c, 0xd3, 0xed, 0x9d, 0xc9, 0xe1, 0x39, + 0x0d, 0xc2, 0x26, 0x1e, 0xfa, 0x01, 0x18, 0x0a, 0x03, 0x8f, 0xcc, 0xe0, 0xab, 0x13, 0x05, 0xf6, + 0xc8, 0xb8, 0x78, 0x64, 0x08, 0xf3, 0x66, 0x2c, 0xe1, 0x14, 0xb5, 0x15, 0x06, 0xeb, 0xae, 0x47, + 0x26, 0x8a, 0x49, 0xd4, 0x15, 0xde, 0x8c, 0x25, 0xdc, 0xfe, 0xe3, 0x02, 0xc0, 0x4c, 0xab, 0xb5, + 0x12, 0x06, 0x37, 0x49, 0x2d, 0x46, 0xef, 0x85, 0x32, 0x1d, 0xe6, 0xba, 0x13, 0x3b, 0x8c, 0xb1, + 0xe1, 0x67, 0x7e, 0x70, 0x8a, 0xbf, 0xf5, 0x94, 0xf9, 0xd6, 0x7a, 0x92, 0x51, 0xec, 0xa9, 0xad, + 0xa7, 0xa7, 0x96, 0xd7, 0xe8, 0xf3, 0x4b, 0x24, 0x76, 0x66, 0x91, 0x20, 0x06, 0xba, 0x0d, 0xab, + 0x5e, 0x91, 0x0f, 0x03, 0x51, 0x8b, 0xd4, 0xd8, 0x3b, 0x0c, 0x3f, 0xb3, 0x38, 0x75, 0x90, 0xd9, + 0x3c, 0xa5, 0x39, 0xaf, 0xb6, 0x48, 0x6d, 0x76, 0x44, 0x50, 0x1e, 0xa0, 0xff, 0x30, 0xa3, 0x83, + 0xb6, 0x60, 0x30, 0x8a, 0x9d, 0xb8, 0x1d, 0xb1, 0xa1, 0x18, 0x7e, 0xe6, 0x6a, 0x6e, 0x14, 0x59, + 0xaf, 0xb3, 0x63, 0x82, 0xe6, 0x20, 0xff, 0x8f, 0x05, 0x35, 0xfb, 0xcf, 0x2d, 0x18, 0xd3, 0xc8, + 0x8b, 0x6e, 0x14, 0xa3, 0x77, 0x77, 0x0d, 0xee, 0x54, 0x7f, 0x83, 0x4b, 0x9f, 0x66, 0x43, 0x7b, + 0x4c, 0x10, 0x2b, 0xcb, 0x16, 0x63, 0x60, 0x9b, 0x50, 0x72, 0x63, 0xd2, 0x8c, 0x26, 0x0a, 0x67, + 0x8b, 0x4f, 0x0c, 0x3f, 0x73, 0x29, 0xaf, 0xf7, 0x9c, 0x1d, 0x15, 0x44, 0x4b, 0x0b, 0xb4, 0x7b, + 0xcc, 0xa9, 0xd8, 0x7f, 0x35, 0x6a, 0xbe, 0x1f, 0x1d, 0x70, 0xf4, 0x34, 0x0c, 0x47, 0x41, 0x3b, + 0xac, 0x11, 0x4c, 0x5a, 0x41, 0x34, 0x61, 0x9d, 0x2d, 0xd2, 0xa9, 0x47, 0x27, 0x75, 0x55, 0x37, + 0x63, 0x13, 0x07, 0x7d, 0xca, 0x82, 0x91, 0x3a, 0x89, 0x62, 0xd7, 0x67, 0xf4, 0x25, 0xf3, 0xab, + 0x07, 0x66, 0x5e, 0x36, 0xce, 0xeb, 0xce, 0x67, 0x4f, 0x8a, 0x17, 0x19, 0x31, 0x1a, 0x23, 0x9c, + 0xa0, 0x4f, 0x17, 0x67, 0x9d, 0x44, 0xb5, 0xd0, 0x6d, 0xd1, 0xff, 0x62, 0xf9, 0xa8, 0xc5, 0x39, + 0xaf, 0x41, 0xd8, 0xc4, 0x43, 0x3e, 0x94, 0xe8, 0xe2, 0x8b, 0x26, 0x06, 0x18, 0xff, 0x0b, 0x07, + 0xe3, 0x5f, 0x0c, 0x2a, 0x5d, 0xd7, 0x7a, 0xf4, 0xe9, 0xbf, 0x08, 0x73, 0x32, 0xe8, 0x93, 0x16, + 0x4c, 0x08, 0xe1, 0x80, 0x09, 0x1f, 0xd0, 0x1b, 0x1b, 0x6e, 0x4c, 0x3c, 0x37, 0x8a, 0x27, 0x4a, + 0x8c, 0x87, 0xe9, 0xfe, 0xe6, 0xd6, 0xc5, 0x30, 0x68, 0xb7, 0xae, 0xb8, 0x7e, 0x7d, 0xf6, 0xac, + 0xa0, 0x34, 0x31, 0xd7, 0xa3, 0x63, 0xdc, 0x93, 0x24, 0xfa, 0x9c, 0x05, 0x67, 0x7c, 0xa7, 0x49, + 0xa2, 0x96, 0x43, 0x3f, 0x2d, 0x07, 0xcf, 0x7a, 0x4e, 0x6d, 0x93, 0x71, 0x34, 0x78, 0x77, 0x1c, + 0xd9, 0x82, 0xa3, 0x33, 0x57, 0x7b, 0x76, 0x8d, 0x77, 0x21, 0x8b, 0x7e, 0xd5, 0x82, 0xe3, 0x41, + 0xd8, 0xda, 0x70, 0x7c, 0x52, 0x97, 0xd0, 0x68, 0x62, 0x88, 0x2d, 0xbd, 0xf7, 0x1c, 0xec, 0x13, + 0x2d, 0xa7, 0xbb, 0x5d, 0x0a, 0x7c, 0x37, 0x0e, 0xc2, 0x2a, 0x89, 0x63, 0xd7, 0x6f, 0x44, 0xb3, + 0xa7, 0x6e, 0xef, 0x4c, 0x1e, 0xef, 0xc2, 0xc2, 0xdd, 0xfc, 0xa0, 0x9f, 0x80, 0xe1, 0xa8, 0xe3, + 0xd7, 0x6e, 0xb8, 0x7e, 0x3d, 0xb8, 0x15, 0x4d, 0x94, 0xf3, 0x58, 0xbe, 0x55, 0xd5, 0xa1, 0x58, + 0x80, 0x9a, 0x00, 0x36, 0xa9, 0x65, 0x7f, 0x38, 0x3d, 0x95, 0x2a, 0x79, 0x7f, 0x38, 0x3d, 0x99, + 0x76, 0x21, 0x8b, 0x7e, 0xc6, 0x82, 0xd1, 0xc8, 0x6d, 0xf8, 0x4e, 0xdc, 0x0e, 0xc9, 0x15, 0xd2, + 0x89, 0x26, 0x80, 0x31, 0x72, 0xf9, 0x80, 0xa3, 0x62, 0x74, 0x39, 0x7b, 0x4a, 0xf0, 0x38, 0x6a, + 0xb6, 0x46, 0x38, 0x49, 0x37, 0x6b, 0xa1, 0xe9, 0x69, 0x3d, 0x9c, 0xef, 0x42, 0xd3, 0x93, 0xba, + 0x27, 0x49, 0xf4, 0xe3, 0x70, 0x8c, 0x37, 0xa9, 0x91, 0x8d, 0x26, 0x46, 0x98, 0xa0, 0x3d, 0x79, + 0x7b, 0x67, 0xf2, 0x58, 0x35, 0x05, 0xc3, 0x5d, 0xd8, 0xe8, 0x55, 0x98, 0x6c, 0x91, 0xb0, 0xe9, + 0xc6, 0xcb, 0xbe, 0xd7, 0x91, 0xe2, 0xbb, 0x16, 0xb4, 0x48, 0x5d, 0xb0, 0x13, 0x4d, 0x8c, 0x9e, + 0xb5, 0x9e, 0x28, 0xcf, 0xbe, 0x45, 0xb0, 0x39, 0xb9, 0xb2, 0x3b, 0x3a, 0xde, 0xab, 0x3f, 0xf4, + 0xfb, 0x16, 0x9c, 0x31, 0xa4, 0x6c, 0x95, 0x84, 0x5b, 0x6e, 0x8d, 0xcc, 0xd4, 0x6a, 0x41, 0xdb, + 0x8f, 0xa3, 0x89, 0x31, 0x36, 0x8c, 0x6b, 0x87, 0x21, 0xf3, 0x93, 0xa4, 0xf4, 0xbc, 0xec, 0x89, + 0x12, 0xe1, 0x5d, 0x38, 0xb5, 0xff, 0x75, 0x01, 0x8e, 0xa5, 0x2d, 0x00, 0xf4, 0xf7, 0x2c, 0x18, + 0xbf, 0x79, 0x2b, 0x5e, 0x0d, 0x36, 0x89, 0x1f, 0xcd, 0x76, 0xa8, 0x9c, 0x66, 0xba, 0x6f, 0xf8, + 0x99, 0x5a, 0xbe, 0xb6, 0xc6, 0xd4, 0xe5, 0x24, 0x95, 0xf3, 0x7e, 0x1c, 0x76, 0x66, 0x1f, 0x14, + 0xef, 0x34, 0x7e, 0xf9, 0xc6, 0xaa, 0x09, 0xc5, 0x69, 0xa6, 0xce, 0x7c, 0xdc, 0x82, 0x93, 0x59, + 0x5d, 0xa0, 0x63, 0x50, 0xdc, 0x24, 0x1d, 0x6e, 0x89, 0x62, 0xfa, 0x13, 0xbd, 0x0c, 0xa5, 0x2d, + 0xc7, 0x6b, 0x13, 0x61, 0xa6, 0x5d, 0x3c, 0xd8, 0x8b, 0x28, 0xce, 0x30, 0xef, 0xf5, 0x87, 0x0b, + 0xe7, 0x2c, 0xfb, 0x0f, 0x8b, 0x30, 0x6c, 0x7c, 0xb4, 0x23, 0x30, 0x3d, 0x83, 0x84, 0xe9, 0xb9, + 0x94, 0xdb, 0x7c, 0xeb, 0x69, 0x7b, 0xde, 0x4a, 0xd9, 0x9e, 0xcb, 0xf9, 0x91, 0xdc, 0xd5, 0xf8, + 0x44, 0x31, 0x54, 0x82, 0x16, 0xdd, 0x86, 0x50, 0x1b, 0x66, 0x20, 0x8f, 0x4f, 0xb8, 0x2c, 0xbb, + 0x9b, 0x1d, 0xbd, 0xbd, 0x33, 0x59, 0x51, 0x7f, 0xb1, 0x26, 0x64, 0x7f, 0xc3, 0x82, 0x93, 0x06, + 0x8f, 0x73, 0x81, 0x5f, 0x77, 0xd9, 0xa7, 0x3d, 0x0b, 0x03, 0x71, 0xa7, 0x25, 0xb7, 0x3a, 0x6a, + 0xa4, 0x56, 0x3b, 0x2d, 0x82, 0x19, 0x84, 0xee, 0x58, 0x9a, 0x24, 0x8a, 0x9c, 0x06, 0x49, 0x6f, + 0x6e, 0x96, 0x78, 0x33, 0x96, 0x70, 0x14, 0x02, 0xf2, 0x9c, 0x28, 0x5e, 0x0d, 0x1d, 0x3f, 0x62, + 0xdd, 0xaf, 0xba, 0x4d, 0x22, 0x06, 0xf8, 0xaf, 0xf5, 0x37, 0x63, 0xe8, 0x13, 0xb3, 0x0f, 0xdc, + 0xde, 0x99, 0x44, 0x8b, 0x5d, 0x3d, 0xe1, 0x8c, 0xde, 0xed, 0xcf, 0x59, 0xf0, 0x40, 0xb6, 0x80, + 0x41, 0x8f, 0xc3, 0x20, 0xdf, 0xe7, 0x8a, 0xb7, 0xd3, 0x9f, 0x84, 0xb5, 0x62, 0x01, 0x45, 0xd3, + 0x50, 0x51, 0x0a, 0x4f, 0xbc, 0xe3, 0x71, 0x81, 0x5a, 0xd1, 0x5a, 0x52, 0xe3, 0xd0, 0x41, 0xa3, + 0x7f, 0x84, 0x09, 0xaa, 0x06, 0x8d, 0x6d, 0x0c, 0x19, 0xc4, 0xfe, 0xba, 0x05, 0x6f, 0xee, 0x47, + 0xec, 0x1d, 0x1e, 0x8f, 0x55, 0x38, 0x55, 0x27, 0xeb, 0x4e, 0xdb, 0x8b, 0x93, 0x14, 0x05, 0xd3, + 0x8f, 0x88, 0x87, 0x4f, 0xcd, 0x67, 0x21, 0xe1, 0xec, 0x67, 0xed, 0xff, 0x64, 0xc1, 0xb8, 0xf1, + 0x5a, 0x47, 0xb0, 0x75, 0xf2, 0x93, 0x5b, 0xa7, 0x85, 0xdc, 0x96, 0x69, 0x8f, 0xbd, 0xd3, 0x27, + 0x2d, 0x38, 0x63, 0x60, 0x2d, 0x39, 0x71, 0x6d, 0xe3, 0xfc, 0x76, 0x2b, 0x24, 0x51, 0x44, 0xa7, + 0xd4, 0x23, 0x86, 0x38, 0x9e, 0x1d, 0x16, 0x3d, 0x14, 0xaf, 0x90, 0x0e, 0x97, 0xcd, 0x4f, 0x42, + 0x99, 0xaf, 0xb9, 0x20, 0x14, 0x1f, 0x49, 0xbd, 0xdb, 0xb2, 0x68, 0xc7, 0x0a, 0x03, 0xd9, 0x30, + 0xc8, 0x64, 0x2e, 0x95, 0x41, 0xd4, 0x4c, 0x00, 0xfa, 0xdd, 0xaf, 0xb3, 0x16, 0x2c, 0x20, 0x76, + 0x94, 0x60, 0x67, 0x25, 0x24, 0x6c, 0x3e, 0xd4, 0x2f, 0xb8, 0xc4, 0xab, 0x47, 0x74, 0x5b, 0xe7, + 0xf8, 0x7e, 0x10, 0x8b, 0x1d, 0x9a, 0xb1, 0xad, 0x9b, 0xd1, 0xcd, 0xd8, 0xc4, 0xa1, 0x44, 0x3d, + 0x67, 0x8d, 0x78, 0x7c, 0x44, 0x05, 0xd1, 0x45, 0xd6, 0x82, 0x05, 0xc4, 0xbe, 0x5d, 0x60, 0x1b, + 0x48, 0x25, 0xd1, 0xc8, 0x51, 0x78, 0x1f, 0xc2, 0x84, 0x0a, 0x58, 0xc9, 0x4f, 0x1e, 0x93, 0xde, + 0x1e, 0x88, 0xd7, 0x52, 0x5a, 0x00, 0xe7, 0x4a, 0x75, 0x77, 0x2f, 0xc4, 0x07, 0x8b, 0x30, 0x99, + 0x7c, 0xa0, 0x4b, 0x89, 0xd0, 0x2d, 0xaf, 0x41, 0x28, 0xed, 0x8f, 0x32, 0xf0, 0xb1, 0x89, 0xd7, + 0x43, 0x0e, 0x17, 0x0e, 0x53, 0x0e, 0x9b, 0x6a, 0xa2, 0xb8, 0x87, 0x9a, 0x78, 0x5c, 0x8d, 0xfa, + 0x40, 0x4a, 0xe6, 0x25, 0x55, 0xe5, 0x59, 0x18, 0x88, 0x62, 0xd2, 0x9a, 0x28, 0x25, 0xc5, 0x6c, + 0x35, 0x26, 0x2d, 0xcc, 0x20, 0xe8, 0x47, 0x61, 0x3c, 0x76, 0xc2, 0x06, 0x89, 0x43, 0xb2, 0xe5, + 0x32, 0xdf, 0x25, 0xdb, 0xcf, 0x56, 0x66, 0x4f, 0x50, 0xab, 0x6b, 0x95, 0x81, 0xb0, 0x04, 0xe1, + 0x34, 0xae, 0xfd, 0xdf, 0x0a, 0xf0, 0x60, 0xf2, 0x13, 0x68, 0xc5, 0xf8, 0x63, 0x09, 0xc5, 0xf8, + 0x56, 0x53, 0x31, 0xde, 0xd9, 0x99, 0x7c, 0xa8, 0xc7, 0x63, 0xdf, 0x31, 0x7a, 0x13, 0x5d, 0x4c, + 0x7d, 0x84, 0xe9, 0xe4, 0x47, 0xb8, 0xb3, 0x33, 0xf9, 0x48, 0x8f, 0x77, 0x4c, 0x7d, 0xa5, 0xc7, + 0x61, 0x30, 0x24, 0x4e, 0x14, 0xf8, 0xe2, 0x3b, 0xa9, 0xaf, 0x89, 0x59, 0x2b, 0x16, 0x50, 0xfb, + 0x6b, 0x95, 0xf4, 0x60, 0x5f, 0xe4, 0xfe, 0xd8, 0x20, 0x44, 0x2e, 0x0c, 0xb0, 0x5d, 0x1b, 0x97, + 0x2c, 0x57, 0x0e, 0xb6, 0x0a, 0xa9, 0x16, 0x51, 0x5d, 0xcf, 0x96, 0xe9, 0x57, 0xa3, 0x4d, 0x98, + 0x91, 0x40, 0xdb, 0x50, 0xae, 0xc9, 0xcd, 0x54, 0x21, 0x0f, 0xb7, 0xa3, 0xd8, 0x4a, 0x69, 0x8a, + 0x23, 0x54, 0xdc, 0xab, 0x1d, 0x98, 0xa2, 0x86, 0x08, 0x14, 0x1b, 0x6e, 0x2c, 0x3e, 0xeb, 0x01, + 0xb7, 0xcb, 0x17, 0x5d, 0xe3, 0x15, 0x87, 0xa8, 0x0e, 0xba, 0xe8, 0xc6, 0x98, 0xf6, 0x8f, 0x3e, + 0x6a, 0xc1, 0x70, 0x54, 0x6b, 0xae, 0x84, 0xc1, 0x96, 0x5b, 0x27, 0xa1, 0xb0, 0x31, 0x0f, 0x28, + 0xd9, 0xaa, 0x73, 0x4b, 0xb2, 0x43, 0x4d, 0x97, 0xbb, 0x2f, 0x34, 0x04, 0x9b, 0x74, 0xe9, 0xde, + 0xeb, 0x41, 0xf1, 0xee, 0xf3, 0xa4, 0xc6, 0x56, 0x9c, 0xdc, 0x33, 0xb3, 0x99, 0x72, 0x60, 0x9b, + 0x7b, 0xbe, 0x5d, 0xdb, 0xa4, 0xeb, 0x4d, 0x33, 0xf4, 0xd0, 0xed, 0x9d, 0xc9, 0x07, 0xe7, 0xb2, + 0x69, 0xe2, 0x5e, 0xcc, 0xb0, 0x01, 0x6b, 0xb5, 0x3d, 0x0f, 0x93, 0x57, 0xdb, 0x84, 0x79, 0xc4, + 0x72, 0x18, 0xb0, 0x15, 0xdd, 0x61, 0x6a, 0xc0, 0x0c, 0x08, 0x36, 0xe9, 0xa2, 0x57, 0x61, 0xb0, + 0xe9, 0xc4, 0xa1, 0xbb, 0x2d, 0xdc, 0x60, 0x07, 0xdc, 0x05, 0x2d, 0xb1, 0xbe, 0x34, 0x71, 0xa6, + 0xe8, 0x79, 0x23, 0x16, 0x84, 0x50, 0x13, 0x4a, 0x4d, 0x12, 0x36, 0xc8, 0x44, 0x39, 0x0f, 0x97, + 0xff, 0x12, 0xed, 0x4a, 0x13, 0xac, 0x50, 0xe3, 0x8a, 0xb5, 0x61, 0x4e, 0x05, 0xbd, 0x0c, 0xe5, + 0x88, 0x78, 0xa4, 0x46, 0xcd, 0xa3, 0x0a, 0xa3, 0xf8, 0x6c, 0x9f, 0xa6, 0x22, 0xb5, 0x4b, 0xaa, + 0xe2, 0x51, 0xbe, 0xc0, 0xe4, 0x3f, 0xac, 0xba, 0xa4, 0x03, 0xd8, 0xf2, 0xda, 0x0d, 0xd7, 0x9f, + 0x80, 0x3c, 0x06, 0x70, 0x85, 0xf5, 0x95, 0x1a, 0x40, 0xde, 0x88, 0x05, 0x21, 0xfb, 0xbf, 0x5a, + 0x80, 0x92, 0x42, 0xed, 0x08, 0x6c, 0xe2, 0x57, 0x93, 0x36, 0xf1, 0x62, 0x9e, 0x46, 0x4b, 0x0f, + 0xb3, 0xf8, 0x37, 0x2b, 0x90, 0x52, 0x07, 0x57, 0x49, 0x14, 0x93, 0xfa, 0x1b, 0x22, 0xfc, 0x0d, + 0x11, 0xfe, 0x86, 0x08, 0x57, 0x22, 0x7c, 0x2d, 0x25, 0xc2, 0xdf, 0x6e, 0xac, 0x7a, 0x7d, 0xbe, + 0xfe, 0x8a, 0x3a, 0x80, 0x37, 0x39, 0x30, 0x10, 0xa8, 0x24, 0xb8, 0x5c, 0x5d, 0xbe, 0x9a, 0x29, + 0xb3, 0x5f, 0x49, 0xca, 0xec, 0x83, 0x92, 0xf8, 0x5e, 0x90, 0xd2, 0xbf, 0x6f, 0xc1, 0x5b, 0x92, + 0xd2, 0x4b, 0xce, 0x9c, 0x85, 0x86, 0x1f, 0x84, 0x64, 0xde, 0x5d, 0x5f, 0x27, 0x21, 0xf1, 0x6b, + 0x24, 0x52, 0xbe, 0x1d, 0xab, 0x97, 0x6f, 0x07, 0x3d, 0x07, 0x23, 0x37, 0xa3, 0xc0, 0x5f, 0x09, + 0x5c, 0x5f, 0x88, 0x20, 0xba, 0xe3, 0x38, 0x76, 0x7b, 0x67, 0x72, 0x84, 0x8e, 0xa8, 0x6c, 0xc7, + 0x09, 0x2c, 0x34, 0x07, 0xc7, 0x6f, 0xbe, 0xba, 0xe2, 0xc4, 0x86, 0x37, 0x41, 0xee, 0xfb, 0xd9, + 0x79, 0xd4, 0xe5, 0x17, 0x53, 0x40, 0xdc, 0x8d, 0x6f, 0xff, 0xed, 0x02, 0x9c, 0x4e, 0xbd, 0x48, + 0xe0, 0x79, 0x41, 0x3b, 0xa6, 0x7b, 0x22, 0xf4, 0x05, 0x0b, 0x8e, 0x35, 0x93, 0x0e, 0x8b, 0x48, + 0xb8, 0xbb, 0xdf, 0x91, 0x9b, 0x8e, 0x48, 0x79, 0x44, 0x66, 0x27, 0xc4, 0x08, 0x1d, 0x4b, 0x01, + 0x22, 0xdc, 0xc5, 0x0b, 0x7a, 0x19, 0x2a, 0x4d, 0x67, 0xfb, 0x5a, 0xab, 0xee, 0xc4, 0x72, 0x3b, + 0xda, 0xdb, 0x8b, 0xd0, 0x8e, 0x5d, 0x6f, 0x8a, 0x47, 0x6e, 0x4c, 0x2d, 0xf8, 0xf1, 0x72, 0x58, + 0x8d, 0x43, 0xd7, 0x6f, 0x70, 0x27, 0xe7, 0x92, 0xec, 0x06, 0xeb, 0x1e, 0xed, 0xcf, 0x5b, 0x69, + 0x25, 0xa5, 0x46, 0x27, 0x74, 0x62, 0xd2, 0xe8, 0xa0, 0xf7, 0x41, 0x89, 0xee, 0x1b, 0xe5, 0xa8, + 0xdc, 0xc8, 0x53, 0x73, 0x1a, 0x5f, 0x42, 0x2b, 0x51, 0xfa, 0x2f, 0xc2, 0x9c, 0xa8, 0xfd, 0x85, + 0x4a, 0xda, 0x58, 0x60, 0x67, 0xf3, 0xcf, 0x00, 0x34, 0x82, 0x55, 0xd2, 0x6c, 0x79, 0x74, 0x58, + 0x2c, 0x76, 0xc0, 0xa3, 0x5c, 0x25, 0x17, 0x15, 0x04, 0x1b, 0x58, 0xe8, 0x67, 0x2d, 0x80, 0x86, + 0x9c, 0xf3, 0xd2, 0x10, 0xb8, 0x96, 0xe7, 0xeb, 0xe8, 0x15, 0xa5, 0x79, 0x51, 0x04, 0xb1, 0x41, + 0x1c, 0xfd, 0x94, 0x05, 0xe5, 0x58, 0xb2, 0xcf, 0x55, 0xe3, 0x6a, 0x9e, 0x9c, 0xc8, 0x97, 0xd6, + 0x36, 0x91, 0x1a, 0x12, 0x45, 0x17, 0xfd, 0xb4, 0x05, 0x10, 0x75, 0xfc, 0xda, 0x4a, 0xe0, 0xb9, + 0xb5, 0x8e, 0xd0, 0x98, 0xd7, 0x73, 0x75, 0xe7, 0xa8, 0xde, 0x67, 0xc7, 0xe8, 0x68, 0xe8, 0xff, + 0xd8, 0xa0, 0x8c, 0x3e, 0x00, 0xe5, 0x48, 0x4c, 0x37, 0xa1, 0x23, 0x57, 0xf3, 0x75, 0x2a, 0xf1, + 0xbe, 0x85, 0x78, 0x15, 0xff, 0xb0, 0xa2, 0x89, 0x7e, 0xc1, 0x82, 0xf1, 0x56, 0xd2, 0x4d, 0x28, + 0xd4, 0x61, 0x7e, 0x32, 0x20, 0xe5, 0x86, 0xe4, 0xde, 0x96, 0x54, 0x23, 0x4e, 0x73, 0x41, 0x25, + 0xa0, 0x9e, 0xc1, 0xcb, 0x2d, 0xee, 0xb2, 0x1c, 0xd2, 0x12, 0xf0, 0x62, 0x1a, 0x88, 0xbb, 0xf1, + 0xd1, 0x0a, 0x9c, 0xa4, 0xdc, 0x75, 0xb8, 0xf9, 0x29, 0xd5, 0x4b, 0xc4, 0x94, 0x61, 0x79, 0xf6, + 0x61, 0x31, 0x43, 0xd8, 0x59, 0x47, 0x1a, 0x07, 0x67, 0x3e, 0x89, 0xfe, 0xd0, 0x82, 0x87, 0x5d, + 0xa6, 0x06, 0x4c, 0x87, 0xbd, 0xd6, 0x08, 0xe2, 0xa0, 0x9d, 0xe4, 0x2a, 0x2b, 0x7a, 0xa9, 0x9f, + 0xd9, 0x37, 0x8b, 0x37, 0x78, 0x78, 0x61, 0x17, 0x96, 0xf0, 0xae, 0x0c, 0xa3, 0x1f, 0x82, 0x51, + 0xb9, 0x2e, 0x56, 0xa8, 0x08, 0x66, 0x8a, 0xb6, 0x32, 0x7b, 0xfc, 0xf6, 0xce, 0xe4, 0xe8, 0xaa, + 0x09, 0xc0, 0x49, 0x3c, 0xfb, 0xdf, 0x14, 0x13, 0xa7, 0x44, 0xca, 0x87, 0xc9, 0xc4, 0x4d, 0x4d, + 0xfa, 0x7f, 0xa4, 0xf4, 0xcc, 0x55, 0xdc, 0x28, 0xef, 0x92, 0x16, 0x37, 0xaa, 0x29, 0xc2, 0x06, + 0x71, 0x6a, 0x94, 0x1e, 0x77, 0xd2, 0x9e, 0x52, 0x21, 0x01, 0x5f, 0xce, 0x93, 0xa5, 0xee, 0x33, + 0xbd, 0xd3, 0x82, 0xb5, 0xe3, 0x5d, 0x20, 0xdc, 0xcd, 0x12, 0x7a, 0x3f, 0x54, 0x42, 0x15, 0xd9, + 0x52, 0xcc, 0x63, 0xab, 0x26, 0xa7, 0x8d, 0x60, 0x47, 0x1d, 0x00, 0xe9, 0x18, 0x16, 0x4d, 0xd1, + 0xfe, 0x83, 0xe4, 0xc1, 0x98, 0x21, 0x3b, 0xfa, 0x38, 0xf4, 0xfb, 0x94, 0x05, 0xc3, 0x61, 0xe0, + 0x79, 0xae, 0xdf, 0xa0, 0x72, 0x4e, 0x28, 0xeb, 0x77, 0x1d, 0x8a, 0xbe, 0x14, 0x02, 0x8d, 0x59, + 0xd6, 0x58, 0xd3, 0xc4, 0x26, 0x03, 0xf6, 0x9f, 0x5b, 0x30, 0xd1, 0x4b, 0x1e, 0x23, 0x02, 0x0f, + 0x49, 0x61, 0xa3, 0x86, 0x62, 0xd9, 0x9f, 0x27, 0x1e, 0x51, 0x6e, 0xf3, 0xf2, 0xec, 0x63, 0xe2, + 0x35, 0x1f, 0x5a, 0xe9, 0x8d, 0x8a, 0x77, 0xeb, 0x07, 0xbd, 0x04, 0xc7, 0x8c, 0xf7, 0x8a, 0xd4, + 0xc0, 0x54, 0x66, 0xa7, 0xa8, 0x01, 0x34, 0x93, 0x82, 0xdd, 0xd9, 0x99, 0x7c, 0x20, 0xdd, 0x26, + 0x14, 0x46, 0x57, 0x3f, 0xf6, 0x97, 0x0a, 0xe9, 0xaf, 0xa5, 0x74, 0xfd, 0xeb, 0x56, 0x97, 0x37, + 0xe1, 0x1d, 0x87, 0xa1, 0x5f, 0x99, 0xdf, 0x41, 0x85, 0x61, 0xf4, 0xc6, 0xb9, 0x87, 0xc7, 0xf6, + 0xf6, 0xbf, 0x1d, 0x80, 0x5d, 0x38, 0xeb, 0xc3, 0x78, 0xdf, 0xf7, 0x39, 0xea, 0x27, 0x2c, 0x75, + 0x60, 0xc6, 0xd7, 0x70, 0xfd, 0xb0, 0xc6, 0x9e, 0xef, 0x9f, 0x22, 0x1e, 0x3a, 0xa2, 0xbc, 0xe8, + 0xc9, 0xa3, 0x39, 0xf4, 0x45, 0x2b, 0x79, 0xe4, 0xc7, 0x83, 0x1a, 0xdd, 0x43, 0xe3, 0xc9, 0x38, + 0x47, 0xe4, 0x8c, 0xe9, 0xd3, 0xa7, 0x5e, 0x27, 0x8c, 0x53, 0x00, 0xeb, 0xae, 0xef, 0x78, 0xee, + 0x6b, 0x74, 0x77, 0x54, 0x62, 0x0a, 0x9e, 0x59, 0x4c, 0x17, 0x54, 0x2b, 0x36, 0x30, 0xce, 0xfc, + 0x75, 0x18, 0x36, 0xde, 0x3c, 0x23, 0xe2, 0xe5, 0xa4, 0x19, 0xf1, 0x52, 0x31, 0x02, 0x55, 0xce, + 0xbc, 0x1d, 0x8e, 0xa5, 0x19, 0xdc, 0xcf, 0xf3, 0xf6, 0xff, 0x1e, 0x4a, 0x9f, 0xc1, 0xad, 0x92, + 0xb0, 0x49, 0x59, 0x7b, 0xc3, 0xb1, 0xf5, 0x86, 0x63, 0xeb, 0x0d, 0xc7, 0x96, 0x79, 0x36, 0x21, + 0x9c, 0x36, 0x43, 0x47, 0xe4, 0xb4, 0x49, 0xb8, 0xa1, 0xca, 0xb9, 0xbb, 0xa1, 0xec, 0x8f, 0x76, + 0x79, 0xee, 0x57, 0x43, 0x42, 0x50, 0x00, 0x25, 0x3f, 0xa8, 0x13, 0x69, 0xe3, 0x5e, 0xce, 0xc7, + 0x60, 0xbb, 0x1a, 0xd4, 0x8d, 0x70, 0x71, 0xfa, 0x2f, 0xc2, 0x9c, 0x8e, 0xfd, 0x91, 0x41, 0x48, + 0x98, 0x93, 0xfc, 0xbb, 0xff, 0x00, 0x0c, 0x85, 0xa4, 0x15, 0x5c, 0xc3, 0x8b, 0x42, 0x97, 0xe9, + 0x8c, 0x12, 0xde, 0x8c, 0x25, 0x9c, 0xea, 0xbc, 0x96, 0x13, 0x6f, 0x08, 0x65, 0xa6, 0x74, 0xde, + 0x8a, 0x13, 0x6f, 0x60, 0x06, 0x41, 0x6f, 0x87, 0xb1, 0x38, 0x71, 0x14, 0x2e, 0x8e, 0x7c, 0x1f, + 0x10, 0xb8, 0x63, 0xc9, 0x83, 0x72, 0x9c, 0xc2, 0x46, 0xaf, 0xc2, 0xc0, 0x06, 0xf1, 0x9a, 0xe2, + 0xd3, 0x57, 0xf3, 0xd3, 0x35, 0xec, 0x5d, 0x2f, 0x11, 0xaf, 0xc9, 0x25, 0x21, 0xfd, 0x85, 0x19, + 0x29, 0x3a, 0xef, 0x2b, 0x9b, 0xed, 0x28, 0x0e, 0x9a, 0xee, 0x6b, 0xd2, 0xd3, 0xf9, 0x8e, 0x9c, + 0x09, 0x5f, 0x91, 0xfd, 0x73, 0x97, 0x92, 0xfa, 0x8b, 0x35, 0x65, 0xc6, 0x47, 0xdd, 0x0d, 0xd9, + 0x94, 0xe9, 0x08, 0x87, 0x65, 0xde, 0x7c, 0xcc, 0xcb, 0xfe, 0x39, 0x1f, 0xea, 0x2f, 0xd6, 0x94, + 0x51, 0x47, 0xad, 0xbf, 0x61, 0xc6, 0xc3, 0xb5, 0x9c, 0x79, 0xe0, 0x6b, 0x2f, 0x73, 0x1d, 0x3e, + 0x06, 0xa5, 0xda, 0x86, 0x13, 0xc6, 0x13, 0x23, 0x6c, 0xd2, 0xa8, 0x59, 0x3c, 0x47, 0x1b, 0x31, + 0x87, 0xa1, 0x47, 0xa0, 0x18, 0x92, 0x75, 0x16, 0x9d, 0x6c, 0xc4, 0x45, 0x61, 0xb2, 0x8e, 0x69, + 0xbb, 0xb2, 0xcb, 0xc6, 0x7a, 0x06, 0xcc, 0xfd, 0x72, 0x21, 0x69, 0xd8, 0x25, 0x47, 0x86, 0xaf, + 0x87, 0x5a, 0x3b, 0x8c, 0xa4, 0x83, 0xcc, 0x58, 0x0f, 0xac, 0x19, 0x4b, 0x38, 0xfa, 0x90, 0x05, + 0x43, 0x37, 0xa3, 0xc0, 0xf7, 0x49, 0x2c, 0x94, 0xe8, 0xf5, 0x9c, 0x07, 0xeb, 0x32, 0xef, 0x5d, + 0xf3, 0x20, 0x1a, 0xb0, 0xa4, 0x4b, 0xd9, 0x25, 0xdb, 0x35, 0xaf, 0x5d, 0xef, 0x0a, 0x86, 0x39, + 0xcf, 0x9b, 0xb1, 0x84, 0x53, 0x54, 0xd7, 0xe7, 0xa8, 0x03, 0x49, 0xd4, 0x05, 0x5f, 0xa0, 0x0a, + 0xb8, 0xfd, 0xeb, 0x65, 0x38, 0x95, 0xb9, 0x7c, 0xa8, 0xc9, 0xc5, 0x8c, 0x9a, 0x0b, 0xae, 0x47, + 0x64, 0x18, 0x18, 0x33, 0xb9, 0xae, 0xab, 0x56, 0x6c, 0x60, 0xa0, 0x9f, 0x04, 0x68, 0x39, 0xa1, + 0xd3, 0x24, 0xca, 0x81, 0x7d, 0x60, 0xcb, 0x86, 0xf2, 0xb1, 0x22, 0xfb, 0xd4, 0x9b, 0x78, 0xd5, + 0x14, 0x61, 0x83, 0x24, 0x7a, 0x1e, 0x86, 0x43, 0xe2, 0x11, 0x27, 0x62, 0xe1, 0xef, 0xe9, 0x5c, + 0x1e, 0xac, 0x41, 0xd8, 0xc4, 0x43, 0x8f, 0xab, 0x88, 0xb9, 0x54, 0xe4, 0x50, 0x32, 0x6a, 0x0e, + 0x7d, 0xda, 0x82, 0xb1, 0x75, 0xd7, 0x23, 0x9a, 0xba, 0xc8, 0xbc, 0x59, 0x3e, 0xf8, 0x4b, 0x5e, + 0x30, 0xfb, 0xd5, 0x32, 0x34, 0xd1, 0x1c, 0xe1, 0x14, 0x79, 0xfa, 0x99, 0xb7, 0x48, 0xc8, 0x84, + 0xef, 0x60, 0xf2, 0x33, 0x5f, 0xe7, 0xcd, 0x58, 0xc2, 0xd1, 0x0c, 0x8c, 0xb7, 0x9c, 0x28, 0x9a, + 0x0b, 0x49, 0x9d, 0xf8, 0xb1, 0xeb, 0x78, 0x3c, 0x2f, 0xa6, 0xac, 0xc3, 0xc9, 0x57, 0x92, 0x60, + 0x9c, 0xc6, 0x47, 0xef, 0x84, 0x07, 0xb9, 0x87, 0x68, 0xc9, 0x8d, 0x22, 0xd7, 0x6f, 0xe8, 0x69, + 0x20, 0x1c, 0x65, 0x93, 0xa2, 0xab, 0x07, 0x17, 0xb2, 0xd1, 0x70, 0xaf, 0xe7, 0xd1, 0x93, 0x50, + 0x8e, 0x36, 0xdd, 0xd6, 0x5c, 0x58, 0x8f, 0xd8, 0xe9, 0x50, 0x59, 0xbb, 0x65, 0xab, 0xa2, 0x1d, + 0x2b, 0x0c, 0x54, 0x83, 0x11, 0xfe, 0x49, 0x78, 0xc8, 0x9f, 0x90, 0xa0, 0x4f, 0xf5, 0x54, 0xe4, + 0x22, 0xcd, 0x73, 0x0a, 0x3b, 0xb7, 0xce, 0xcb, 0xb3, 0x2a, 0x7e, 0xb4, 0x72, 0xdd, 0xe8, 0x06, + 0x27, 0x3a, 0x4d, 0xee, 0xe9, 0x86, 0xfb, 0xd8, 0xd3, 0x3d, 0x0f, 0xc3, 0x9b, 0xed, 0x35, 0x22, + 0x46, 0x5e, 0x08, 0x36, 0x35, 0xfb, 0xae, 0x68, 0x10, 0x36, 0xf1, 0x58, 0xb4, 0x65, 0xcb, 0x15, + 0xff, 0xa2, 0x89, 0x51, 0x23, 0xda, 0x72, 0x65, 0x41, 0x36, 0x63, 0x13, 0x87, 0xb2, 0x46, 0xc7, + 0x62, 0x95, 0x44, 0x2c, 0x99, 0x82, 0x0e, 0x97, 0x62, 0xad, 0x2a, 0x01, 0x58, 0xe3, 0xa0, 0x15, + 0x38, 0x49, 0xff, 0x54, 0x59, 0x9a, 0xeb, 0x75, 0xc7, 0x73, 0xeb, 0x3c, 0xf4, 0x6f, 0x3c, 0xe9, + 0xdf, 0xac, 0x66, 0xe0, 0xe0, 0xcc, 0x27, 0xed, 0x5f, 0x2c, 0x24, 0x3d, 0x27, 0xa6, 0x08, 0x43, + 0x11, 0x15, 0x54, 0xf1, 0x75, 0x27, 0x94, 0x06, 0xcf, 0x01, 0x93, 0x9b, 0x44, 0xbf, 0xd7, 0x9d, + 0xd0, 0x14, 0x79, 0x8c, 0x00, 0x96, 0x94, 0xd0, 0x4d, 0x18, 0x88, 0x3d, 0x27, 0xa7, 0x6c, 0x48, + 0x83, 0xa2, 0x76, 0x64, 0x2d, 0xce, 0x44, 0x98, 0xd1, 0x40, 0x0f, 0xd3, 0xdd, 0xdb, 0x9a, 0x3c, + 0x69, 0x13, 0x1b, 0xae, 0xb5, 0x08, 0xb3, 0x56, 0xfb, 0xe7, 0x47, 0x33, 0xb4, 0x8e, 0x32, 0x04, + 0xd0, 0x33, 0x00, 0x74, 0xd2, 0xac, 0x84, 0x64, 0xdd, 0xdd, 0x16, 0x86, 0x98, 0x92, 0x6c, 0x57, + 0x15, 0x04, 0x1b, 0x58, 0xf2, 0x99, 0x6a, 0x7b, 0x9d, 0x3e, 0x53, 0xe8, 0x7e, 0x86, 0x43, 0xb0, + 0x81, 0x85, 0x9e, 0x83, 0x41, 0xb7, 0xe9, 0x34, 0x54, 0x20, 0xf0, 0xc3, 0x54, 0xa4, 0x2d, 0xb0, + 0x96, 0x3b, 0x3b, 0x93, 0x63, 0x8a, 0x21, 0xd6, 0x84, 0x05, 0x2e, 0xfa, 0x92, 0x05, 0x23, 0xb5, + 0xa0, 0xd9, 0x0c, 0x7c, 0xbe, 0x7d, 0x16, 0xbe, 0x80, 0x9b, 0x87, 0x65, 0x26, 0x4d, 0xcd, 0x19, + 0xc4, 0xb8, 0x33, 0x40, 0xa5, 0x6d, 0x9a, 0x20, 0x9c, 0xe0, 0xca, 0x94, 0x7c, 0xa5, 0x3d, 0x24, + 0xdf, 0x6f, 0x58, 0x70, 0x9c, 0x3f, 0x6b, 0xec, 0xea, 0x45, 0x86, 0x62, 0x70, 0xc8, 0xaf, 0xd5, + 0xe5, 0xe8, 0x50, 0xce, 0xde, 0x2e, 0x38, 0xee, 0x66, 0x12, 0x5d, 0x84, 0xe3, 0xeb, 0x41, 0x58, + 0x23, 0xe6, 0x40, 0x08, 0xb1, 0xad, 0x3a, 0xba, 0x90, 0x46, 0xc0, 0xdd, 0xcf, 0xa0, 0xeb, 0xf0, + 0x80, 0xd1, 0x68, 0x8e, 0x03, 0x97, 0xdc, 0x8f, 0x8a, 0xde, 0x1e, 0xb8, 0x90, 0x89, 0x85, 0x7b, + 0x3c, 0x9d, 0x14, 0x92, 0x95, 0x3e, 0x84, 0xe4, 0x2b, 0x70, 0xba, 0xd6, 0x3d, 0x32, 0x5b, 0x51, + 0x7b, 0x2d, 0xe2, 0x72, 0xbc, 0x3c, 0xfb, 0x7d, 0xa2, 0x83, 0xd3, 0x73, 0xbd, 0x10, 0x71, 0xef, + 0x3e, 0xd0, 0xfb, 0xa0, 0x1c, 0x12, 0xf6, 0x55, 0x22, 0x91, 0xae, 0x77, 0x40, 0x6f, 0x87, 0xb6, + 0xe0, 0x79, 0xb7, 0x5a, 0x33, 0x89, 0x86, 0x08, 0x2b, 0x8a, 0xe8, 0x16, 0x0c, 0xb5, 0x9c, 0xb8, + 0xb6, 0x21, 0x92, 0xf4, 0x0e, 0xec, 0x9b, 0x57, 0xc4, 0xd9, 0x51, 0x8a, 0x91, 0xd6, 0xcf, 0x89, + 0x60, 0x49, 0x8d, 0xda, 0x6a, 0xb5, 0xa0, 0xd9, 0x0a, 0x7c, 0xe2, 0xc7, 0x52, 0x89, 0x8c, 0xf1, + 0xf3, 0x0e, 0xd9, 0x8a, 0x0d, 0x8c, 0x2e, 0x5d, 0xae, 0xd1, 0x26, 0x8e, 0xef, 0xa2, 0xcb, 0x8d, + 0xde, 0x7a, 0x3d, 0x4f, 0x95, 0x0d, 0x73, 0x2b, 0xde, 0x70, 0xe3, 0x8d, 0xa0, 0x1d, 0xcb, 0x5d, + 0xb2, 0x50, 0x54, 0x4a, 0xd9, 0x2c, 0x66, 0xe0, 0xe0, 0xcc, 0x27, 0xd3, 0x9a, 0x75, 0xfc, 0xee, + 0x34, 0xeb, 0xb1, 0x3e, 0x34, 0x6b, 0x15, 0x4e, 0x31, 0x0e, 0x84, 0x95, 0x2c, 0x9d, 0x96, 0xd1, + 0x04, 0x62, 0xcc, 0xab, 0xfc, 0x96, 0xc5, 0x2c, 0x24, 0x9c, 0xfd, 0xec, 0x99, 0x1f, 0x83, 0xe3, + 0x5d, 0x42, 0x6e, 0x5f, 0x0e, 0xc9, 0x79, 0x78, 0x20, 0x5b, 0x9c, 0xec, 0xcb, 0x2d, 0xf9, 0xeb, + 0xa9, 0xb8, 0x74, 0x63, 0x8b, 0xd6, 0x87, 0x8b, 0xdb, 0x81, 0x22, 0xf1, 0xb7, 0x84, 0x76, 0xbd, + 0x70, 0xb0, 0x59, 0x7d, 0xde, 0xdf, 0xe2, 0xd2, 0x90, 0xf9, 0xf1, 0xce, 0xfb, 0x5b, 0x98, 0xf6, + 0x8d, 0x3e, 0x6b, 0x25, 0x36, 0x10, 0xdc, 0x31, 0xfe, 0x9e, 0x43, 0xd9, 0x93, 0xf6, 0xbd, 0xa7, + 0xb0, 0xff, 0x5d, 0x01, 0xce, 0xee, 0xd5, 0x49, 0x1f, 0xc3, 0xf7, 0x18, 0x0c, 0x46, 0x2c, 0xd2, + 0x44, 0xa8, 0xab, 0x61, 0xba, 0x8a, 0x79, 0xec, 0xc9, 0x2b, 0x58, 0x80, 0x90, 0x07, 0xc5, 0xa6, + 0xd3, 0x12, 0xfe, 0xd2, 0x85, 0x83, 0xe6, 0xef, 0xd1, 0xff, 0x8e, 0xb7, 0xe4, 0xb4, 0xf8, 0x9c, + 0x37, 0x1a, 0x30, 0x25, 0x83, 0x62, 0x28, 0x39, 0x61, 0xe8, 0xc8, 0xb0, 0x86, 0x2b, 0xf9, 0xd0, + 0x9b, 0xa1, 0x5d, 0xf2, 0x53, 0xe1, 0x44, 0x13, 0xe6, 0xc4, 0xec, 0x5f, 0x28, 0x27, 0x92, 0xbd, + 0x58, 0xac, 0x4a, 0x04, 0x83, 0xc2, 0x4d, 0x6a, 0xe5, 0x9d, 0x36, 0xc9, 0xb3, 0xa9, 0x99, 0x07, + 0x42, 0xd4, 0xa4, 0x10, 0xa4, 0xd0, 0xc7, 0x2d, 0x56, 0xf9, 0x41, 0x66, 0xd0, 0x89, 0x5d, 0xfd, + 0xe1, 0x14, 0xa2, 0x30, 0xeb, 0x49, 0xc8, 0x46, 0x6c, 0x52, 0x17, 0x15, 0x5c, 0xd8, 0x6e, 0xa6, + 0xbb, 0x82, 0x0b, 0xdb, 0x9d, 0x48, 0x38, 0xda, 0xce, 0x88, 0x49, 0xc9, 0xa1, 0x7a, 0x40, 0x1f, + 0x51, 0x28, 0x5f, 0xb4, 0xe0, 0xb8, 0x9b, 0x0e, 0x2e, 0x10, 0x7b, 0xe0, 0x1b, 0xf9, 0xf8, 0x34, + 0xbb, 0x63, 0x17, 0x94, 0xa1, 0xd3, 0x05, 0xc2, 0xdd, 0xcc, 0xa0, 0x3a, 0x0c, 0xb8, 0xfe, 0x7a, + 0x20, 0xcc, 0xbb, 0xd9, 0x83, 0x31, 0xb5, 0xe0, 0xaf, 0x07, 0x7a, 0x35, 0xd3, 0x7f, 0x98, 0xf5, + 0x8e, 0x16, 0xe1, 0xa4, 0xcc, 0xf7, 0xb9, 0xe4, 0x46, 0x71, 0x10, 0x76, 0x16, 0xdd, 0xa6, 0x1b, + 0x33, 0xd3, 0xac, 0x38, 0x3b, 0x41, 0xd5, 0x1b, 0xce, 0x80, 0xe3, 0xcc, 0xa7, 0xd0, 0x6b, 0x30, + 0x24, 0x0f, 0xf4, 0xcb, 0x79, 0xf8, 0x13, 0xba, 0xe7, 0xbf, 0x9a, 0x4c, 0x55, 0x71, 0xa2, 0x2f, + 0x09, 0xa2, 0x8f, 0x59, 0x30, 0xc6, 0x7f, 0x5f, 0xea, 0xd4, 0x79, 0x8a, 0x61, 0x25, 0x8f, 0xa8, + 0xfd, 0x6a, 0xa2, 0xcf, 0x59, 0x74, 0x7b, 0x67, 0x72, 0x2c, 0xd9, 0x86, 0x53, 0x74, 0xed, 0x2f, + 0x8d, 0x40, 0x77, 0x08, 0x44, 0x32, 0xde, 0xc1, 0x3a, 0xea, 0x78, 0x07, 0xba, 0xab, 0x8c, 0x74, + 0xa8, 0x42, 0x0e, 0xcb, 0x4c, 0x50, 0xd5, 0xc7, 0xd0, 0x1d, 0xbf, 0x86, 0x19, 0x0d, 0x14, 0xc2, + 0xe0, 0x06, 0x71, 0xbc, 0x78, 0x23, 0x9f, 0x13, 0xb3, 0x4b, 0xac, 0xaf, 0x74, 0xbe, 0x20, 0x6f, + 0xc5, 0x82, 0x12, 0xda, 0x86, 0xa1, 0x0d, 0x3e, 0x17, 0xc5, 0x46, 0x6f, 0xe9, 0xa0, 0x83, 0x9b, + 0x98, 0xe0, 0x7a, 0xe6, 0x89, 0x06, 0x2c, 0xc9, 0xb1, 0xd8, 0x3a, 0x23, 0xfa, 0x87, 0x4b, 0x91, + 0xfc, 0x52, 0x25, 0xfb, 0x0f, 0xfd, 0x79, 0x2f, 0x8c, 0x84, 0xa4, 0x16, 0xf8, 0x35, 0xd7, 0x23, + 0xf5, 0x19, 0x79, 0x1a, 0xb6, 0x9f, 0x0c, 0x39, 0xe6, 0x4a, 0xc2, 0x46, 0x1f, 0x38, 0xd1, 0x23, + 0x5b, 0x64, 0x2a, 0x6b, 0x9e, 0x7e, 0x10, 0x22, 0x4e, 0x3d, 0x16, 0x73, 0xca, 0xd1, 0x67, 0x7d, + 0xf2, 0x45, 0x96, 0x6c, 0xc3, 0x29, 0xba, 0xe8, 0x25, 0x80, 0x60, 0x8d, 0x07, 0xd0, 0xcd, 0xc4, + 0xe2, 0x08, 0x64, 0x3f, 0xaf, 0x3a, 0xc6, 0x33, 0x6d, 0x65, 0x0f, 0xd8, 0xe8, 0x0d, 0x5d, 0x01, + 0xe0, 0xcb, 0x66, 0xb5, 0xd3, 0x92, 0xbb, 0x41, 0x99, 0xe2, 0x08, 0x55, 0x05, 0xb9, 0xb3, 0x33, + 0xd9, 0xed, 0x70, 0x66, 0x51, 0x42, 0xc6, 0xe3, 0xe8, 0x27, 0x60, 0x28, 0x6a, 0x37, 0x9b, 0x8e, + 0x3a, 0x20, 0xc9, 0x31, 0x77, 0x97, 0xf7, 0x6b, 0x48, 0x45, 0xde, 0x80, 0x25, 0x45, 0x74, 0x93, + 0xca, 0x77, 0x21, 0x9e, 0xf8, 0x2a, 0xe2, 0xe6, 0x09, 0x77, 0x03, 0xbe, 0x4d, 0x6e, 0x61, 0x70, + 0x06, 0xce, 0x9d, 0x9d, 0xc9, 0x07, 0x92, 0xed, 0x8b, 0x81, 0xc8, 0xa6, 0xcd, 0xec, 0x13, 0x5d, + 0x96, 0x45, 0xb4, 0xe8, 0x6b, 0xcb, 0xda, 0x2e, 0x4f, 0xe8, 0x22, 0x5a, 0xac, 0xb9, 0xf7, 0x98, + 0x99, 0x0f, 0xa3, 0x25, 0x38, 0x51, 0x0b, 0xfc, 0x38, 0x0c, 0x3c, 0x8f, 0x17, 0x91, 0xe3, 0x1b, + 0x73, 0x7e, 0x80, 0xf2, 0x90, 0x60, 0xfb, 0xc4, 0x5c, 0x37, 0x0a, 0xce, 0x7a, 0x8e, 0x1a, 0xe4, + 0x69, 0xe5, 0x30, 0x96, 0xcb, 0xd9, 0x7a, 0xa2, 0x4f, 0x21, 0xa1, 0x94, 0xcf, 0x7b, 0x0f, 0x35, + 0xe1, 0x27, 0x4f, 0x58, 0xc5, 0x17, 0x7b, 0x0e, 0x46, 0xc8, 0x76, 0x4c, 0x42, 0xdf, 0xf1, 0xae, + 0xe1, 0x45, 0x79, 0x5a, 0xc1, 0x16, 0xe6, 0x79, 0xa3, 0x1d, 0x27, 0xb0, 0x90, 0xad, 0x5c, 0x64, + 0x46, 0xda, 0x3a, 0x77, 0x91, 0x49, 0x87, 0x98, 0xfd, 0x95, 0x62, 0xc2, 0x60, 0xbd, 0x27, 0xe7, + 0xb9, 0xac, 0x3e, 0x92, 0x2c, 0x24, 0xc5, 0x00, 0x62, 0x23, 0x96, 0x27, 0x65, 0x55, 0x1f, 0x69, + 0xd9, 0x24, 0x84, 0x93, 0x74, 0xd1, 0x26, 0x94, 0x36, 0x82, 0x28, 0x96, 0xdb, 0xb3, 0x03, 0xee, + 0x04, 0x2f, 0x05, 0x51, 0xcc, 0xac, 0x2c, 0xf5, 0xda, 0xb4, 0x25, 0xc2, 0x9c, 0x06, 0xdd, 0xf8, + 0x47, 0x1b, 0x4e, 0x58, 0x8f, 0xe6, 0x58, 0x91, 0x89, 0x01, 0x66, 0x5e, 0x29, 0x63, 0xba, 0xaa, + 0x41, 0xd8, 0xc4, 0xb3, 0xbf, 0x6d, 0x25, 0x8e, 0xb4, 0x6e, 0xb0, 0x8c, 0x81, 0x2d, 0xe2, 0x53, + 0x11, 0x65, 0xc6, 0x28, 0xfe, 0x50, 0x2a, 0xff, 0xfa, 0x2d, 0xbd, 0xea, 0x3d, 0xde, 0xa2, 0x3d, + 0x4c, 0xb1, 0x2e, 0x8c, 0x70, 0xc6, 0x0f, 0x5a, 0xc9, 0x44, 0xfa, 0x42, 0x1e, 0xfb, 0x36, 0xb3, + 0x98, 0xc4, 0x9e, 0x39, 0xf9, 0xf6, 0x67, 0x2d, 0x18, 0x9a, 0x75, 0x6a, 0x9b, 0xc1, 0xfa, 0x3a, + 0x7a, 0x12, 0xca, 0xf5, 0x76, 0x68, 0xe6, 0xf4, 0x2b, 0x4f, 0xd5, 0xbc, 0x68, 0xc7, 0x0a, 0x83, + 0x4e, 0xfd, 0x75, 0xa7, 0x26, 0x4b, 0x4a, 0x14, 0xf9, 0xd4, 0xbf, 0xc0, 0x5a, 0xb0, 0x80, 0xd0, + 0xe1, 0x6f, 0x3a, 0xdb, 0xf2, 0xe1, 0xf4, 0x79, 0xda, 0x92, 0x06, 0x61, 0x13, 0xcf, 0xfe, 0x97, + 0x16, 0x4c, 0xcc, 0x3a, 0x91, 0x5b, 0x9b, 0x69, 0xc7, 0x1b, 0xb3, 0x6e, 0xbc, 0xd6, 0xae, 0x6d, + 0x92, 0x98, 0x97, 0x1e, 0xa1, 0x5c, 0xb6, 0x23, 0xba, 0x02, 0xd5, 0x76, 0x59, 0x71, 0x79, 0x4d, + 0xb4, 0x63, 0x85, 0x81, 0x5e, 0x83, 0xe1, 0x96, 0x13, 0x45, 0xb7, 0x82, 0xb0, 0x8e, 0xc9, 0x7a, + 0x3e, 0xc5, 0x89, 0xaa, 0xa4, 0x16, 0x92, 0x18, 0x93, 0x75, 0x11, 0x9d, 0xa2, 0xfb, 0xc7, 0x26, + 0x31, 0xfb, 0x67, 0x2d, 0x38, 0x39, 0x4b, 0x9c, 0x90, 0x84, 0xac, 0x96, 0x91, 0x7a, 0x11, 0xf4, + 0x2a, 0x94, 0x63, 0xda, 0x42, 0x39, 0xb2, 0xf2, 0xe5, 0x88, 0xc5, 0x95, 0xac, 0x8a, 0xce, 0xb1, + 0x22, 0x63, 0x7f, 0xca, 0x82, 0xd3, 0x59, 0xbc, 0xcc, 0x79, 0x41, 0xbb, 0x7e, 0x2f, 0x18, 0xfa, + 0x5b, 0x16, 0x8c, 0xb0, 0xb3, 0xfa, 0x79, 0x12, 0x3b, 0xae, 0xd7, 0x55, 0x47, 0xd1, 0xea, 0xb3, + 0x8e, 0xe2, 0x59, 0x18, 0xd8, 0x08, 0x9a, 0x24, 0x1d, 0x67, 0x72, 0x29, 0x68, 0x12, 0xcc, 0x20, + 0xe8, 0x69, 0x3a, 0x09, 0x5d, 0x3f, 0x76, 0xe8, 0x72, 0x94, 0x67, 0x19, 0xe3, 0x7c, 0x02, 0xaa, + 0x66, 0x6c, 0xe2, 0xd8, 0xff, 0xa2, 0x02, 0x43, 0x22, 0x28, 0xaa, 0xef, 0x52, 0x38, 0xd2, 0x85, + 0x53, 0xe8, 0xe9, 0xc2, 0x89, 0x60, 0xb0, 0xc6, 0x0a, 0xba, 0x0a, 0xf3, 0xfc, 0x4a, 0x2e, 0x51, + 0x74, 0xbc, 0x46, 0xac, 0x66, 0x8b, 0xff, 0xc7, 0x82, 0x14, 0xfa, 0x8c, 0x05, 0xe3, 0xb5, 0xc0, + 0xf7, 0x49, 0x4d, 0xdb, 0x8e, 0x03, 0x79, 0x04, 0x4b, 0xcd, 0x25, 0x3b, 0xd5, 0xc7, 0xc0, 0x29, + 0x00, 0x4e, 0x93, 0x47, 0x2f, 0xc0, 0x28, 0x1f, 0xb3, 0xeb, 0x89, 0x03, 0x18, 0x5d, 0x5e, 0xcf, + 0x04, 0xe2, 0x24, 0x2e, 0x9a, 0xe2, 0x07, 0x59, 0xa2, 0x90, 0xdd, 0xa0, 0xf6, 0x53, 0x1b, 0x25, + 0xec, 0x0c, 0x0c, 0x14, 0x02, 0x0a, 0xc9, 0x7a, 0x48, 0xa2, 0x0d, 0x11, 0x34, 0xc6, 0xec, 0xd6, + 0xa1, 0xbb, 0x2b, 0x62, 0x81, 0xbb, 0x7a, 0xc2, 0x19, 0xbd, 0xa3, 0x4d, 0xe1, 0x43, 0x28, 0xe7, + 0x21, 0xcf, 0xc5, 0x67, 0xee, 0xe9, 0x4a, 0x98, 0x84, 0x12, 0x53, 0x5d, 0xcc, 0x5e, 0x2e, 0xf2, + 0xc4, 0x49, 0xa6, 0xd8, 0x30, 0x6f, 0x47, 0xf3, 0x70, 0x2c, 0x55, 0x1c, 0x30, 0x12, 0x07, 0x25, + 0x2a, 0x49, 0x2e, 0x55, 0x56, 0x30, 0xc2, 0x5d, 0x4f, 0x98, 0xfe, 0xa5, 0xe1, 0x3d, 0xfc, 0x4b, + 0x1d, 0x15, 0x9a, 0xcc, 0x8f, 0x30, 0x5e, 0xcc, 0x65, 0x00, 0xfa, 0x8a, 0x43, 0xfe, 0x64, 0x2a, + 0x0e, 0x79, 0x94, 0x31, 0x70, 0x3d, 0x1f, 0x06, 0xf6, 0x1f, 0x74, 0x7c, 0x2f, 0x83, 0x88, 0xff, + 0x97, 0x05, 0xf2, 0xbb, 0xce, 0x39, 0xb5, 0x0d, 0x42, 0xa7, 0x0c, 0x7a, 0x3b, 0x8c, 0x29, 0xd7, + 0x04, 0x37, 0x89, 0x2c, 0x36, 0x6b, 0x94, 0xed, 0x8c, 0x13, 0x50, 0x9c, 0xc2, 0x46, 0xd3, 0x50, + 0xa1, 0xe3, 0xc4, 0x1f, 0xe5, 0x7a, 0x5f, 0xb9, 0x3f, 0x66, 0x56, 0x16, 0xc4, 0x53, 0x1a, 0x07, + 0x05, 0x70, 0xdc, 0x73, 0xa2, 0x98, 0x71, 0x50, 0xed, 0xf8, 0xb5, 0xbb, 0x2c, 0x21, 0xc3, 0x32, + 0xb1, 0x16, 0xd3, 0x1d, 0xe1, 0xee, 0xbe, 0xed, 0x7f, 0x5f, 0x82, 0xd1, 0x84, 0x64, 0xdc, 0xa7, + 0xc1, 0xf0, 0x24, 0x94, 0xa5, 0x0e, 0x4f, 0xd7, 0xca, 0x52, 0x8a, 0x5e, 0x61, 0x50, 0xa5, 0xb5, + 0xa6, 0xb5, 0x6a, 0xda, 0xc0, 0x31, 0x14, 0x2e, 0x36, 0xf1, 0x98, 0x50, 0x8e, 0xbd, 0x68, 0xce, + 0x73, 0x89, 0x1f, 0x73, 0x36, 0xf3, 0x11, 0xca, 0xab, 0x8b, 0x55, 0xb3, 0x53, 0x2d, 0x94, 0x53, + 0x00, 0x9c, 0x26, 0x8f, 0x3e, 0x62, 0xc1, 0xa8, 0x73, 0x2b, 0xd2, 0x55, 0xc7, 0x45, 0xc4, 0xf1, + 0x01, 0x95, 0x54, 0xa2, 0x90, 0x39, 0xf7, 0xea, 0x27, 0x9a, 0x70, 0x92, 0x28, 0x7a, 0xdd, 0x02, + 0x44, 0xb6, 0x49, 0x4d, 0xc6, 0x44, 0x0b, 0x5e, 0x06, 0xf3, 0xd8, 0xc1, 0x9f, 0xef, 0xea, 0x97, + 0x4b, 0xf5, 0xee, 0x76, 0x9c, 0xc1, 0x03, 0xba, 0x0c, 0xa8, 0xee, 0x46, 0xce, 0x9a, 0x47, 0xe6, + 0x82, 0xa6, 0xcc, 0x1e, 0x16, 0x87, 0xe9, 0x67, 0xc4, 0x38, 0xa3, 0xf9, 0x2e, 0x0c, 0x9c, 0xf1, + 0x14, 0x9b, 0x65, 0x61, 0xb0, 0xdd, 0xb9, 0x16, 0x7a, 0x4c, 0x4b, 0x98, 0xb3, 0x4c, 0xb4, 0x63, + 0x85, 0x61, 0xff, 0x45, 0x51, 0x2d, 0x65, 0x9d, 0x00, 0xe0, 0x18, 0x81, 0xc8, 0xd6, 0xdd, 0x07, + 0x22, 0xeb, 0x30, 0xa9, 0xee, 0x9c, 0xf8, 0x44, 0x0a, 0x6d, 0xe1, 0x1e, 0xa5, 0xd0, 0xfe, 0x94, + 0x95, 0xa8, 0x47, 0x37, 0xfc, 0xcc, 0x4b, 0xf9, 0x26, 0x1f, 0x4c, 0xf1, 0x10, 0xae, 0x94, 0x5e, + 0x49, 0x45, 0xee, 0x3d, 0x09, 0xe5, 0x75, 0xcf, 0x61, 0x55, 0x54, 0xd8, 0x42, 0x35, 0xc2, 0xcb, + 0x2e, 0x88, 0x76, 0xac, 0x30, 0xa8, 0xd4, 0x37, 0x3a, 0xdd, 0x97, 0xd4, 0xfe, 0x8f, 0x45, 0x18, + 0x36, 0x34, 0x7e, 0xa6, 0xf9, 0x66, 0xdd, 0x67, 0xe6, 0x5b, 0x61, 0x1f, 0xe6, 0xdb, 0x4f, 0x42, + 0xa5, 0x26, 0xb5, 0x51, 0x3e, 0xf5, 0xf5, 0xd3, 0x3a, 0x4e, 0x2b, 0x24, 0xd5, 0x84, 0x35, 0x4d, + 0x74, 0x31, 0x91, 0xa6, 0x99, 0xf0, 0x0b, 0x64, 0xe5, 0x51, 0x0a, 0x8d, 0xd6, 0xfd, 0x4c, 0x3a, + 0x38, 0xa0, 0xb4, 0x77, 0x70, 0x80, 0xfd, 0x0d, 0x4b, 0x7d, 0xdc, 0x23, 0xa8, 0xc7, 0x73, 0x33, + 0x59, 0x8f, 0xe7, 0x7c, 0x2e, 0xc3, 0xdc, 0xa3, 0x10, 0xcf, 0x55, 0x18, 0x9a, 0x0b, 0x9a, 0x4d, + 0xc7, 0xaf, 0xa3, 0xef, 0x87, 0xa1, 0x1a, 0xff, 0x29, 0x7c, 0x68, 0xec, 0xa4, 0x5a, 0x40, 0xb1, + 0x84, 0xa1, 0x87, 0x61, 0xc0, 0x09, 0x1b, 0xd2, 0x6f, 0xc6, 0x22, 0xe0, 0x66, 0xc2, 0x46, 0x84, + 0x59, 0xab, 0xfd, 0x8f, 0x07, 0x80, 0x05, 0x9e, 0x38, 0x21, 0xa9, 0xaf, 0x06, 0xac, 0x2c, 0xee, + 0xa1, 0x9e, 0xef, 0xea, 0x4d, 0xdd, 0xfd, 0x7c, 0xc6, 0x6b, 0x9c, 0xf3, 0x15, 0x8f, 0xfa, 0x9c, + 0x2f, 0xfb, 0xe8, 0x76, 0xe0, 0x3e, 0x3a, 0xba, 0xb5, 0x3f, 0x61, 0x01, 0x52, 0x61, 0x44, 0x3a, + 0xb6, 0x62, 0x1a, 0x2a, 0x2a, 0x6e, 0x49, 0x18, 0x80, 0x5a, 0x44, 0x48, 0x00, 0xd6, 0x38, 0x7d, + 0xec, 0xe4, 0x1f, 0x93, 0xf2, 0xbb, 0x98, 0x4c, 0x3e, 0x60, 0x52, 0x5f, 0x88, 0x73, 0xfb, 0x77, + 0x0b, 0xf0, 0x00, 0x37, 0x1d, 0x96, 0x1c, 0xdf, 0x69, 0x90, 0x26, 0xe5, 0xaa, 0xdf, 0x68, 0x99, + 0x1a, 0xdd, 0x42, 0xba, 0x32, 0x55, 0xe0, 0xa0, 0x6b, 0x97, 0xaf, 0x39, 0xbe, 0xca, 0x16, 0x7c, + 0x37, 0xc6, 0xac, 0x73, 0x14, 0x41, 0x59, 0x5e, 0x3e, 0x23, 0x64, 0x71, 0x4e, 0x84, 0x94, 0x58, + 0x12, 0x5a, 0x96, 0x60, 0x45, 0x88, 0xaa, 0x52, 0x2f, 0xa8, 0x6d, 0x62, 0xd2, 0x0a, 0xd2, 0xaa, + 0x74, 0x51, 0xb4, 0x63, 0x85, 0x61, 0x37, 0x61, 0x5c, 0x8e, 0x61, 0xeb, 0x0a, 0xe9, 0x60, 0xb2, + 0x4e, 0xf5, 0x4f, 0x4d, 0x36, 0x19, 0xf7, 0xe1, 0x28, 0xfd, 0x33, 0x67, 0x02, 0x71, 0x12, 0x57, + 0x56, 0xca, 0x2d, 0x64, 0x57, 0xca, 0xb5, 0x7f, 0xd7, 0x82, 0xb4, 0x02, 0x34, 0xea, 0x82, 0x5a, + 0xbb, 0xd6, 0x05, 0xdd, 0x47, 0x65, 0xcd, 0x77, 0xc3, 0xb0, 0x13, 0x53, 0x0b, 0x87, 0x7b, 0x23, + 0x8a, 0x77, 0x77, 0x8a, 0xb6, 0x14, 0xd4, 0xdd, 0x75, 0x97, 0x79, 0x21, 0xcc, 0xee, 0xec, 0xd7, + 0x2d, 0xa8, 0xcc, 0x87, 0x9d, 0xfd, 0xe7, 0x6c, 0x75, 0x67, 0x64, 0x15, 0xf6, 0x95, 0x91, 0x25, + 0x73, 0xbe, 0x8a, 0xbd, 0x72, 0xbe, 0xec, 0xbf, 0x1a, 0x80, 0xe3, 0x5d, 0x49, 0x88, 0xe8, 0x1c, + 0x8c, 0xa8, 0xaf, 0x24, 0x5d, 0x90, 0x15, 0x33, 0x8a, 0x57, 0xc3, 0x70, 0x02, 0xb3, 0x8f, 0xa5, + 0xba, 0x00, 0x27, 0x42, 0xf2, 0x6a, 0x9b, 0xb4, 0xc9, 0xcc, 0x7a, 0x4c, 0xc2, 0x2a, 0xa9, 0x05, + 0x7e, 0x9d, 0x17, 0xd6, 0x2d, 0xce, 0x3e, 0x78, 0x7b, 0x67, 0xf2, 0x04, 0xee, 0x06, 0xe3, 0xac, + 0x67, 0x50, 0x0b, 0x46, 0x3d, 0xd3, 0x76, 0x16, 0x5b, 0xb6, 0xbb, 0x32, 0xbb, 0xd5, 0x6c, 0x4d, + 0x34, 0xe3, 0x24, 0x81, 0xa4, 0x01, 0x5e, 0xba, 0x47, 0x06, 0xf8, 0x87, 0xb5, 0x01, 0xce, 0x83, + 0x62, 0xde, 0x95, 0x73, 0x12, 0x6a, 0x3f, 0x16, 0xf8, 0x41, 0x6c, 0xea, 0x17, 0xa1, 0x2c, 0x03, + 0x06, 0xfb, 0x0a, 0xb4, 0x33, 0xfb, 0xe9, 0x21, 0xdb, 0x1f, 0x87, 0x37, 0x9f, 0x0f, 0x43, 0x63, + 0x30, 0xaf, 0x06, 0xf1, 0x8c, 0xe7, 0x05, 0xb7, 0xa8, 0xb9, 0x72, 0x2d, 0x22, 0xc2, 0x27, 0x66, + 0xdf, 0x29, 0x40, 0xc6, 0xf6, 0x92, 0xae, 0x49, 0x6d, 0x23, 0x25, 0xd6, 0xe4, 0xfe, 0xec, 0x24, + 0xb4, 0xcd, 0x83, 0x2a, 0xb9, 0x35, 0xf0, 0xce, 0xbc, 0xb7, 0xc7, 0x3a, 0xce, 0x52, 0x49, 0x4a, + 0x15, 0x6b, 0xf9, 0x0c, 0x80, 0x36, 0x6d, 0x45, 0xde, 0x93, 0x0a, 0x94, 0xd0, 0x16, 0x30, 0x36, + 0xb0, 0xd0, 0xf3, 0x30, 0xec, 0xfa, 0x51, 0xec, 0x78, 0xde, 0x25, 0xd7, 0x8f, 0x85, 0xdb, 0x57, + 0x99, 0x3d, 0x0b, 0x1a, 0x84, 0x4d, 0xbc, 0x33, 0x6f, 0x33, 0xbe, 0xdf, 0x7e, 0xbe, 0xfb, 0x06, + 0x9c, 0xbe, 0xe8, 0xc6, 0x2a, 0x5b, 0x4f, 0xcd, 0x37, 0x6a, 0xb9, 0x2a, 0x59, 0x65, 0xf5, 0xcc, + 0x4f, 0x35, 0xb2, 0xe5, 0x0a, 0xc9, 0xe4, 0xbe, 0x74, 0xb6, 0x9c, 0x7d, 0x0e, 0x4e, 0x5e, 0x74, + 0xe3, 0x0b, 0xae, 0x47, 0xf6, 0x49, 0xc4, 0xfe, 0x9d, 0x41, 0x18, 0x31, 0x33, 0xd3, 0xf7, 0x23, + 0xae, 0x3f, 0x45, 0x8d, 0x53, 0xf1, 0x76, 0xae, 0x3a, 0xd1, 0xbd, 0x71, 0xe0, 0x34, 0xf9, 0xec, + 0x11, 0x33, 0xec, 0x53, 0x4d, 0x13, 0x9b, 0x0c, 0xa0, 0x5b, 0x50, 0x5a, 0x67, 0xd9, 0x5c, 0xc5, + 0x3c, 0x62, 0x71, 0xb2, 0x46, 0x54, 0x2f, 0x47, 0x9e, 0x0f, 0xc6, 0xe9, 0x51, 0x9b, 0x22, 0x4c, + 0x26, 0x11, 0x1b, 0x31, 0xf6, 0x42, 0x59, 0x29, 0x8c, 0x5e, 0x2a, 0xa1, 0x74, 0x17, 0x2a, 0x21, + 0x21, 0xa0, 0x07, 0xef, 0x91, 0x80, 0x66, 0x99, 0x79, 0xf1, 0x06, 0xb3, 0x78, 0x45, 0x52, 0xd0, + 0x10, 0x1b, 0x04, 0x23, 0x33, 0x2f, 0x01, 0xc6, 0x69, 0x7c, 0xf4, 0x01, 0x25, 0xe2, 0xcb, 0x79, + 0x78, 0xcc, 0xcd, 0x19, 0x7d, 0xd8, 0xd2, 0xfd, 0x13, 0x05, 0x18, 0xbb, 0xe8, 0xb7, 0x57, 0x2e, + 0xae, 0xb4, 0xd7, 0x3c, 0xb7, 0x76, 0x85, 0x74, 0xa8, 0x08, 0xdf, 0x24, 0x9d, 0x85, 0x79, 0xb1, + 0x82, 0xd4, 0x9c, 0xb9, 0x42, 0x1b, 0x31, 0x87, 0x51, 0x61, 0xb4, 0xee, 0xfa, 0x0d, 0x12, 0xb6, + 0x42, 0x57, 0x38, 0xb3, 0x0d, 0x61, 0x74, 0x41, 0x83, 0xb0, 0x89, 0x47, 0xfb, 0x0e, 0x6e, 0xf9, + 0x24, 0x4c, 0x9b, 0xfe, 0xcb, 0xb4, 0x11, 0x73, 0x18, 0x45, 0x8a, 0xc3, 0xb6, 0xf0, 0x15, 0x19, + 0x48, 0xab, 0xb4, 0x11, 0x73, 0x18, 0x5d, 0xe9, 0x51, 0x7b, 0x8d, 0x85, 0x3a, 0xa5, 0x32, 0x90, + 0xaa, 0xbc, 0x19, 0x4b, 0x38, 0x45, 0xdd, 0x24, 0x9d, 0x79, 0x27, 0x76, 0xd2, 0x69, 0x9a, 0x57, + 0x78, 0x33, 0x96, 0x70, 0x56, 0xfa, 0x37, 0x39, 0x1c, 0xdf, 0x71, 0xa5, 0x7f, 0x93, 0xec, 0xf7, + 0xf0, 0x38, 0xfc, 0xcd, 0x02, 0x8c, 0x98, 0x01, 0x8a, 0xa8, 0x91, 0x32, 0xd3, 0x97, 0xbb, 0x2a, + 0xc7, 0xff, 0x68, 0xd6, 0xad, 0xaa, 0x0d, 0x37, 0x0e, 0x5a, 0xd1, 0x53, 0xc4, 0x6f, 0xb8, 0x3e, + 0x61, 0xb1, 0x1a, 0x3c, 0xb0, 0x31, 0x11, 0xfd, 0x38, 0x17, 0xd4, 0xc9, 0xdd, 0xd8, 0xf9, 0xf7, + 0xe2, 0xe6, 0x99, 0x1b, 0x70, 0xbc, 0x2b, 0x1f, 0xb8, 0x0f, 0xb3, 0x67, 0xcf, 0x7a, 0x0d, 0x36, + 0x86, 0x61, 0xda, 0xb1, 0x2c, 0x79, 0x37, 0x07, 0xc7, 0xf9, 0xe2, 0xa5, 0x94, 0x58, 0x7a, 0xa7, + 0xca, 0xf1, 0x66, 0xa7, 0x35, 0xd7, 0xd3, 0x40, 0xdc, 0x8d, 0x6f, 0x7f, 0xd2, 0x82, 0xd1, 0x44, + 0x8a, 0x76, 0x4e, 0x06, 0x1a, 0x5b, 0xdd, 0x01, 0x8b, 0xd1, 0x65, 0x39, 0x13, 0x45, 0xa6, 0xc0, + 0xf5, 0xea, 0xd6, 0x20, 0x6c, 0xe2, 0xd9, 0x9f, 0x2d, 0x40, 0x59, 0x86, 0x14, 0xf5, 0xc1, 0xca, + 0xc7, 0x2d, 0x18, 0x55, 0x27, 0x64, 0xcc, 0xa5, 0x59, 0xc8, 0x23, 0x63, 0x8c, 0x72, 0xa0, 0x9c, + 0x22, 0xfe, 0x7a, 0xa0, 0x77, 0x0b, 0xd8, 0x24, 0x86, 0x93, 0xb4, 0xd1, 0x75, 0x80, 0xa8, 0x13, + 0xc5, 0xa4, 0x69, 0x38, 0x57, 0x6d, 0x63, 0x96, 0x4d, 0xd5, 0x82, 0x90, 0xd0, 0x39, 0x75, 0x35, + 0xa8, 0x93, 0xaa, 0xc2, 0xd4, 0x66, 0x9b, 0x6e, 0xc3, 0x46, 0x4f, 0xf6, 0xaf, 0x15, 0xe0, 0x58, + 0x9a, 0x25, 0xf4, 0x2e, 0x18, 0x91, 0xd4, 0x8d, 0x4d, 0xb8, 0x0c, 0x88, 0x1a, 0xc1, 0x06, 0xec, + 0xce, 0xce, 0xe4, 0x64, 0xf7, 0xad, 0xc0, 0x53, 0x26, 0x0a, 0x4e, 0x74, 0xc6, 0x8f, 0x29, 0xc5, + 0x79, 0xfa, 0x6c, 0x67, 0xa6, 0xd5, 0x12, 0x67, 0x8d, 0xc6, 0x31, 0xa5, 0x09, 0xc5, 0x29, 0x6c, + 0xb4, 0x02, 0x27, 0x8d, 0x96, 0xab, 0xc4, 0x6d, 0x6c, 0xac, 0x05, 0xa1, 0xdc, 0xf5, 0x3d, 0xac, + 0xc3, 0x2f, 0xbb, 0x71, 0x70, 0xe6, 0x93, 0xd4, 0xc2, 0xa8, 0x39, 0x2d, 0xa7, 0xe6, 0xc6, 0x1d, + 0xe1, 0x2d, 0x56, 0xf2, 0x70, 0x4e, 0xb4, 0x63, 0x85, 0x61, 0xff, 0xca, 0x00, 0x1c, 0xe3, 0xf1, + 0x86, 0x44, 0x85, 0xd3, 0xa2, 0x77, 0x41, 0x25, 0x8a, 0x9d, 0x90, 0x6f, 0xf9, 0xad, 0x7d, 0xcb, + 0x00, 0x9d, 0xa0, 0x2d, 0x3b, 0xc1, 0xba, 0x3f, 0xf4, 0x12, 0xab, 0x6e, 0xe5, 0x46, 0x1b, 0xac, + 0xf7, 0xc2, 0xdd, 0x39, 0x14, 0x2e, 0xa8, 0x1e, 0xb0, 0xd1, 0x1b, 0xfa, 0x11, 0x28, 0xb5, 0x36, + 0x9c, 0x48, 0x7a, 0xbb, 0x1e, 0x97, 0x0b, 0x6e, 0x85, 0x36, 0xde, 0xd9, 0x99, 0x3c, 0x95, 0x7e, + 0x55, 0x06, 0xc0, 0xfc, 0x21, 0x53, 0x5c, 0x0e, 0xec, 0x7d, 0x03, 0x4b, 0x3d, 0xec, 0x54, 0x2f, + 0xcd, 0xa4, 0xef, 0xec, 0x98, 0x67, 0xad, 0x58, 0x40, 0xe9, 0xe2, 0xde, 0xe0, 0x24, 0xeb, 0x14, + 0x79, 0x30, 0xa9, 0xba, 0x2f, 0x69, 0x10, 0x36, 0xf1, 0xd0, 0x27, 0xba, 0xa3, 0x51, 0x87, 0x0e, + 0x21, 0x55, 0xa1, 0xdf, 0x38, 0xd4, 0xf3, 0x50, 0x11, 0xac, 0xae, 0x06, 0xe8, 0x1c, 0x8c, 0x70, + 0x67, 0xca, 0x6c, 0xe8, 0xf8, 0xb5, 0x8d, 0xb4, 0x0b, 0x64, 0xd5, 0x80, 0xe1, 0x04, 0xa6, 0xbd, + 0x04, 0x03, 0x7d, 0x4a, 0xab, 0xbe, 0x76, 0xb6, 0x2f, 0x42, 0x99, 0x76, 0x27, 0xb7, 0x2f, 0x79, + 0x74, 0x19, 0x40, 0x59, 0xde, 0xe7, 0x87, 0x6c, 0x28, 0xba, 0x8e, 0x8c, 0x3a, 0x50, 0x4b, 0x68, + 0x21, 0x8a, 0xda, 0x6c, 0xda, 0x51, 0x20, 0x7a, 0x0c, 0x8a, 0x64, 0xbb, 0x95, 0x0e, 0x2f, 0x38, + 0xbf, 0xdd, 0x72, 0x43, 0x12, 0x51, 0x24, 0xb2, 0xdd, 0x42, 0x67, 0xa0, 0xe0, 0xd6, 0xc5, 0x8c, + 0x04, 0x81, 0x53, 0x58, 0x98, 0xc7, 0x05, 0xb7, 0x6e, 0x6f, 0x43, 0x45, 0x5d, 0x20, 0x88, 0x36, + 0xa5, 0x6d, 0x62, 0xe5, 0x11, 0x6f, 0x2a, 0xfb, 0xed, 0x61, 0x95, 0xb4, 0x01, 0x74, 0xe6, 0x7f, + 0x5e, 0xba, 0xec, 0x2c, 0x0c, 0xd4, 0x02, 0x51, 0xb3, 0xa5, 0xac, 0xbb, 0x61, 0x46, 0x09, 0x83, + 0xd8, 0x37, 0x60, 0xec, 0x8a, 0x1f, 0xdc, 0x62, 0xf7, 0xfc, 0xb0, 0xb2, 0xb6, 0xb4, 0xe3, 0x75, + 0xfa, 0x23, 0x6d, 0x02, 0x33, 0x28, 0xe6, 0x30, 0x55, 0x70, 0xb3, 0xd0, 0xab, 0xe0, 0xa6, 0xfd, + 0x41, 0x0b, 0x46, 0x54, 0x0a, 0xf1, 0xc5, 0xad, 0x4d, 0xda, 0x6f, 0x23, 0x0c, 0xda, 0xad, 0x74, + 0xbf, 0xec, 0xae, 0x52, 0xcc, 0x61, 0x66, 0x6e, 0x7d, 0x61, 0x8f, 0xdc, 0xfa, 0xb3, 0x30, 0xb0, + 0xe9, 0xfa, 0xf5, 0xb4, 0xcb, 0xf0, 0x8a, 0xeb, 0xd7, 0x31, 0x83, 0xd8, 0xff, 0xdc, 0x82, 0x63, + 0x8a, 0x05, 0x69, 0x7c, 0x9c, 0x83, 0x91, 0xb5, 0xb6, 0xeb, 0xd5, 0x65, 0xbd, 0xde, 0xd4, 0x72, + 0x99, 0x35, 0x60, 0x38, 0x81, 0x89, 0x9e, 0x01, 0x58, 0x73, 0x7d, 0x27, 0xec, 0xac, 0x68, 0x6b, + 0x47, 0x29, 0xc0, 0x59, 0x05, 0xc1, 0x06, 0x16, 0xa5, 0x16, 0x91, 0x58, 0x87, 0xc3, 0xf3, 0x0f, + 0xa1, 0xa8, 0x55, 0x0d, 0x18, 0x4e, 0x60, 0xda, 0x9f, 0x2e, 0xc2, 0x58, 0x32, 0x05, 0xbb, 0x0f, + 0xc7, 0xc3, 0x63, 0x50, 0x62, 0x59, 0xd9, 0xe9, 0x49, 0xc1, 0x8b, 0xe3, 0x72, 0x18, 0x8a, 0x60, + 0x90, 0x8b, 0x81, 0x7c, 0x6e, 0x8a, 0x54, 0x4c, 0x2a, 0x0f, 0x25, 0x8b, 0xe7, 0x15, 0x0e, 0x5f, + 0x41, 0x0a, 0x7d, 0xc4, 0x82, 0xa1, 0xa0, 0x65, 0x96, 0x78, 0x7c, 0x67, 0x9e, 0xe9, 0xe9, 0x22, + 0x07, 0x54, 0xec, 0x15, 0xd5, 0xa4, 0x91, 0x1f, 0x52, 0x92, 0x3e, 0xf3, 0xc3, 0x30, 0x62, 0x62, + 0xee, 0xb5, 0x5d, 0x2c, 0x9b, 0xdb, 0xc5, 0x8f, 0x9b, 0xd3, 0x49, 0x24, 0xe0, 0xf7, 0xb1, 0x50, + 0xaf, 0x41, 0xa9, 0xa6, 0x82, 0x9e, 0xee, 0xaa, 0x3e, 0xbc, 0x2a, 0x50, 0xc5, 0x0e, 0x94, 0x79, + 0x6f, 0xf6, 0x37, 0x2c, 0x63, 0x7e, 0x60, 0x12, 0x2d, 0xd4, 0x51, 0x08, 0xc5, 0xc6, 0xd6, 0xa6, + 0x30, 0x10, 0x2e, 0xe7, 0x34, 0xbc, 0x17, 0xb7, 0x36, 0xf5, 0x7c, 0x35, 0x5b, 0x31, 0x25, 0xd6, + 0x87, 0x1b, 0x3d, 0x51, 0xa7, 0xa1, 0xb8, 0x77, 0x9d, 0x06, 0xfb, 0xf5, 0x02, 0x1c, 0xef, 0x9a, + 0x54, 0xe8, 0x35, 0x28, 0x85, 0xf4, 0x2d, 0xc5, 0xeb, 0x2d, 0xe6, 0x56, 0x59, 0x21, 0x5a, 0xa8, + 0x6b, 0xc5, 0x9b, 0x6c, 0xc7, 0x9c, 0x24, 0xba, 0x0c, 0x48, 0x87, 0xe6, 0x29, 0x1f, 0x3e, 0x7f, + 0x65, 0x15, 0xbf, 0x33, 0xd3, 0x85, 0x81, 0x33, 0x9e, 0x42, 0x2f, 0xa4, 0x8f, 0x02, 0x8a, 0xc9, + 0x33, 0xa8, 0xdd, 0xbc, 0xfa, 0xf6, 0x6f, 0x15, 0x60, 0x34, 0x51, 0x71, 0x13, 0x79, 0x50, 0x26, + 0x1e, 0x3b, 0x20, 0x94, 0x6a, 0xea, 0xa0, 0xf7, 0x67, 0x28, 0xd5, 0x7a, 0x5e, 0xf4, 0x8b, 0x15, + 0x85, 0xfb, 0x23, 0xac, 0xe7, 0x1c, 0x8c, 0x48, 0x86, 0xde, 0xe9, 0x34, 0x3d, 0x31, 0x80, 0x6a, + 0x8e, 0x9e, 0x37, 0x60, 0x38, 0x81, 0x69, 0xff, 0x5e, 0x11, 0x26, 0xf8, 0x89, 0x6a, 0x5d, 0xcd, + 0xbc, 0x25, 0xe9, 0x89, 0xf8, 0x39, 0x5d, 0x17, 0xd7, 0xca, 0xe3, 0x92, 0xe8, 0x5e, 0x84, 0xfa, + 0x8a, 0x46, 0xfd, 0x42, 0x2a, 0x1a, 0x95, 0x6f, 0x0e, 0x1b, 0x87, 0xc4, 0xd1, 0x77, 0x56, 0x78, + 0xea, 0xdf, 0x2f, 0xc0, 0x78, 0xea, 0x2e, 0x30, 0xf4, 0xe9, 0xe4, 0xf5, 0x11, 0x56, 0x1e, 0xa7, + 0x4d, 0xbb, 0x5e, 0x0f, 0xb5, 0xbf, 0x4b, 0x24, 0xee, 0xd1, 0x52, 0xb1, 0xbf, 0x5e, 0x80, 0xb1, + 0xe4, 0x25, 0x66, 0xf7, 0xe1, 0x48, 0xbd, 0x15, 0x2a, 0xec, 0x9e, 0x1e, 0x76, 0xf7, 0x3e, 0x3f, + 0xac, 0xe2, 0x57, 0xa2, 0xc8, 0x46, 0xac, 0xe1, 0xf7, 0xc5, 0xdd, 0x1c, 0xf6, 0x3f, 0xb4, 0xe0, + 0x14, 0x7f, 0xcb, 0xf4, 0x3c, 0xfc, 0x1b, 0x59, 0xa3, 0xfb, 0x72, 0xbe, 0x0c, 0xa6, 0xea, 0x39, + 0xef, 0x35, 0xbe, 0xec, 0xaa, 0x6c, 0xc1, 0x6d, 0x72, 0x2a, 0xdc, 0x87, 0xcc, 0xee, 0x6b, 0x32, + 0xd8, 0x5f, 0x2f, 0x82, 0xbe, 0x1d, 0x1c, 0xb9, 0x22, 0x5f, 0x3e, 0x97, 0xba, 0xd6, 0xd5, 0x8e, + 0x5f, 0xd3, 0xf7, 0x90, 0x97, 0x53, 0xe9, 0xf2, 0x3f, 0x63, 0xc1, 0xb0, 0xeb, 0xbb, 0xb1, 0xeb, + 0x30, 0x67, 0x4f, 0x3e, 0x57, 0xfc, 0x2a, 0x72, 0x0b, 0xbc, 0xe7, 0x20, 0x34, 0x4f, 0x38, 0x15, + 0x31, 0x6c, 0x52, 0x46, 0xef, 0x15, 0x09, 0x23, 0xc5, 0xdc, 0x8a, 0x4e, 0x94, 0x53, 0x59, 0x22, + 0x2d, 0x6a, 0x78, 0xc5, 0x61, 0x4e, 0xb5, 0x5a, 0x30, 0xed, 0x4a, 0x5d, 0x91, 0xa0, 0x4c, 0x5b, + 0xd6, 0x8c, 0x39, 0x21, 0x3b, 0x02, 0xd4, 0x3d, 0x16, 0xfb, 0x0c, 0xc6, 0x9f, 0x86, 0x8a, 0xd3, + 0x8e, 0x83, 0x26, 0x1d, 0x26, 0x71, 0x08, 0xab, 0xd3, 0x0d, 0x24, 0x00, 0x6b, 0x1c, 0xfb, 0xd3, + 0x25, 0x48, 0x25, 0xb0, 0xa3, 0x6d, 0xf3, 0x66, 0x7b, 0x2b, 0xdf, 0x9b, 0xed, 0x15, 0x33, 0x59, + 0xb7, 0xdb, 0xa3, 0x86, 0xf4, 0x9b, 0x71, 0x1b, 0xf3, 0xc5, 0xb4, 0xdf, 0xec, 0xc7, 0xfb, 0x3b, + 0x8f, 0xa0, 0x73, 0x75, 0x9a, 0xd7, 0x2b, 0x9b, 0xda, 0xd3, 0xc5, 0xb6, 0xd7, 0x25, 0xc7, 0x1f, + 0x12, 0x17, 0x12, 0x61, 0x12, 0xb5, 0xbd, 0x58, 0xcc, 0x86, 0x17, 0x73, 0x5c, 0x65, 0xbc, 0x63, + 0x5d, 0x05, 0x86, 0xff, 0xc7, 0x06, 0xd1, 0xa4, 0x23, 0x74, 0xf0, 0x50, 0x1d, 0xa1, 0x43, 0xb9, + 0x3a, 0x42, 0x9f, 0x01, 0x60, 0x73, 0x9b, 0x07, 0x0d, 0x97, 0x99, 0x7f, 0x4a, 0x89, 0x42, 0xac, + 0x20, 0xd8, 0xc0, 0xb2, 0x7f, 0x10, 0x92, 0x65, 0x8c, 0xd0, 0xa4, 0xac, 0x9a, 0xc4, 0xcf, 0x4a, + 0x58, 0xbe, 0x56, 0xa2, 0xc0, 0xd1, 0x6f, 0x58, 0x60, 0xd6, 0x5a, 0x42, 0xaf, 0xf2, 0xa2, 0x4e, + 0x56, 0x1e, 0x67, 0xea, 0x46, 0xbf, 0x53, 0x4b, 0x4e, 0x2b, 0x15, 0xdc, 0x21, 0x2b, 0x3b, 0x9d, + 0x79, 0x1b, 0x94, 0x25, 0x74, 0x5f, 0x46, 0xdd, 0x07, 0xe0, 0x84, 0xcc, 0xfd, 0x96, 0xde, 0x7d, + 0x71, 0x1e, 0xbb, 0xb7, 0xd3, 0x48, 0x7a, 0x82, 0x0a, 0xbd, 0x3c, 0x41, 0x6a, 0x97, 0x5a, 0xec, + 0x59, 0xae, 0xf9, 0x37, 0x2d, 0x38, 0x9b, 0x66, 0x20, 0x5a, 0x0a, 0x7c, 0x37, 0x0e, 0xc2, 0x2a, + 0x89, 0x63, 0xd7, 0x6f, 0xb0, 0xda, 0x9b, 0xb7, 0x9c, 0x50, 0xde, 0xbf, 0xc2, 0x04, 0xe5, 0x0d, + 0x27, 0xf4, 0x31, 0x6b, 0x45, 0x1d, 0x18, 0xe4, 0x91, 0xa5, 0xc2, 0x5a, 0x3f, 0xe0, 0xda, 0xc8, + 0x18, 0x0e, 0xbd, 0x5d, 0xe0, 0x51, 0xad, 0x58, 0x10, 0xb4, 0xbf, 0x69, 0x01, 0x5a, 0xde, 0x22, + 0x61, 0xe8, 0xd6, 0x8d, 0x58, 0x58, 0x76, 0xb1, 0x9f, 0x71, 0x81, 0x9f, 0x59, 0x99, 0x20, 0x75, + 0xb1, 0x9f, 0xf1, 0x2f, 0xfb, 0x62, 0xbf, 0xc2, 0xfe, 0x2e, 0xf6, 0x43, 0xcb, 0x70, 0xaa, 0xc9, + 0xb7, 0x1b, 0xfc, 0xb2, 0x2c, 0xbe, 0xf7, 0x50, 0x49, 0xb4, 0xa7, 0x6f, 0xef, 0x4c, 0x9e, 0x5a, + 0xca, 0x42, 0xc0, 0xd9, 0xcf, 0xd9, 0x6f, 0x03, 0xc4, 0x43, 0x60, 0xe7, 0xb2, 0xa2, 0xf8, 0x7a, + 0xba, 0x5f, 0xec, 0xcf, 0x97, 0x60, 0x3c, 0x55, 0x9d, 0x9f, 0x6e, 0xf5, 0xba, 0xc3, 0x06, 0x0f, + 0xac, 0xbf, 0xbb, 0xd9, 0xeb, 0x2b, 0x10, 0xd1, 0x87, 0x92, 0xeb, 0xb7, 0xda, 0x71, 0x3e, 0x39, + 0xfc, 0x9c, 0x89, 0x05, 0xda, 0xa1, 0xe1, 0x68, 0xa6, 0x7f, 0x31, 0x27, 0x93, 0x67, 0x58, 0x63, + 0xc2, 0x18, 0x1f, 0xb8, 0x47, 0xee, 0x80, 0x0f, 0xe9, 0x20, 0xc3, 0x52, 0x1e, 0x8e, 0xc5, 0xd4, + 0x64, 0x39, 0xec, 0x20, 0x94, 0xaf, 0x14, 0x60, 0xd8, 0xf8, 0x68, 0xe8, 0x97, 0x93, 0x95, 0x08, + 0xad, 0xfc, 0x5e, 0x89, 0xf5, 0x3f, 0xa5, 0x6b, 0x0d, 0xf2, 0x57, 0x7a, 0xbc, 0xbb, 0x08, 0xe1, + 0x9d, 0x9d, 0xc9, 0x63, 0xa9, 0x32, 0x83, 0x89, 0xc2, 0x84, 0x67, 0xde, 0x0f, 0xe3, 0xa9, 0x6e, + 0x32, 0x5e, 0x79, 0xd5, 0x7c, 0xe5, 0x03, 0xbb, 0xa5, 0xcc, 0x21, 0xfb, 0x32, 0x1d, 0x32, 0x91, + 0x3a, 0x1c, 0x78, 0xa4, 0x0f, 0x1f, 0x6c, 0xaa, 0x42, 0x40, 0xa1, 0xcf, 0x0a, 0x01, 0x4f, 0x40, + 0xb9, 0x15, 0x78, 0x6e, 0xcd, 0x55, 0x85, 0x8c, 0x59, 0x4d, 0x82, 0x15, 0xd1, 0x86, 0x15, 0x14, + 0xdd, 0x82, 0xca, 0xcd, 0x5b, 0x31, 0x3f, 0x37, 0x12, 0xfe, 0xed, 0xbc, 0x8e, 0x8b, 0x94, 0xd1, + 0xa2, 0x0e, 0xa6, 0xb0, 0xa6, 0x85, 0x6c, 0x18, 0x64, 0x4a, 0x50, 0xa6, 0x11, 0x31, 0xdf, 0x3b, + 0xd3, 0x8e, 0x11, 0x16, 0x10, 0xfb, 0xdb, 0x00, 0x27, 0xb3, 0xae, 0x48, 0x41, 0xef, 0x83, 0x41, + 0xce, 0x63, 0x3e, 0xb7, 0x70, 0x65, 0xd1, 0xb8, 0xc8, 0x3a, 0x14, 0x6c, 0xb1, 0xdf, 0x58, 0xd0, + 0x14, 0xd4, 0x3d, 0x67, 0x4d, 0xcc, 0x90, 0xc3, 0xa1, 0xbe, 0xe8, 0x68, 0xea, 0x8b, 0x0e, 0xa7, + 0xee, 0x39, 0x6b, 0x68, 0x1b, 0x4a, 0x0d, 0x37, 0x26, 0x8e, 0x70, 0x22, 0xdc, 0x38, 0x14, 0xe2, + 0xc4, 0xe1, 0x56, 0x1a, 0xfb, 0x89, 0x39, 0x41, 0xf4, 0x45, 0x0b, 0xc6, 0xd7, 0x92, 0xa5, 0x49, + 0x84, 0xf0, 0x74, 0x0e, 0xe1, 0x1a, 0x9c, 0x24, 0x21, 0x7e, 0xb3, 0x65, 0xaa, 0x11, 0xa7, 0xd9, + 0x41, 0x1f, 0xb6, 0x60, 0x68, 0xdd, 0xf5, 0x8c, 0x7b, 0x06, 0x0e, 0xe1, 0xe3, 0x5c, 0x60, 0x04, + 0xf4, 0x8e, 0x83, 0xff, 0x8f, 0xb0, 0xa4, 0xdc, 0x4b, 0x53, 0x0d, 0x1e, 0x54, 0x53, 0x0d, 0xdd, + 0x23, 0x4d, 0xf5, 0x31, 0x0b, 0x2a, 0x6a, 0xa4, 0x45, 0x89, 0x87, 0x77, 0x1d, 0xe2, 0x27, 0xe7, + 0x9e, 0x13, 0xf5, 0x17, 0x6b, 0xe2, 0xe8, 0x33, 0x16, 0x0c, 0x3b, 0xaf, 0xb5, 0x43, 0x52, 0x27, + 0x5b, 0x41, 0x2b, 0x12, 0x85, 0x17, 0x5f, 0xce, 0x9f, 0x99, 0x19, 0x4a, 0x64, 0x9e, 0x6c, 0x2d, + 0xb7, 0x22, 0x91, 0xe2, 0xa8, 0x1b, 0xb0, 0xc9, 0x02, 0xfa, 0x69, 0xad, 0xc7, 0x21, 0x8f, 0xf2, + 0xbb, 0x59, 0xdc, 0x1c, 0xb6, 0x32, 0xdf, 0x29, 0xc0, 0xe4, 0x1e, 0xa3, 0x80, 0xce, 0xc1, 0x48, + 0x10, 0x36, 0x1c, 0xdf, 0x7d, 0xcd, 0xac, 0x97, 0xa4, 0x2c, 0xc5, 0x65, 0x03, 0x86, 0x13, 0x98, + 0x66, 0x21, 0x8d, 0xc2, 0x1e, 0x85, 0x34, 0xce, 0xc2, 0x40, 0x48, 0x5a, 0x41, 0x7a, 0xc3, 0xc3, + 0x52, 0xa4, 0x18, 0x04, 0x3d, 0x02, 0x45, 0xa7, 0xe5, 0x8a, 0xc0, 0x1a, 0xb5, 0x8f, 0x9b, 0x59, + 0x59, 0xc0, 0xb4, 0x3d, 0x51, 0xd7, 0xa7, 0x74, 0x24, 0x75, 0x7d, 0xa8, 0x2a, 0x13, 0xe7, 0x2f, + 0x83, 0x5a, 0x95, 0x25, 0xcf, 0x45, 0xec, 0xd7, 0x8b, 0xf0, 0xc8, 0xae, 0x73, 0x5e, 0x47, 0xd9, + 0x5a, 0xbb, 0x44, 0xd9, 0xca, 0xe1, 0x29, 0xec, 0x35, 0x3c, 0xc5, 0x1e, 0xc3, 0xf3, 0x61, 0xba, + 0x94, 0x65, 0x9d, 0xa9, 0x7c, 0x2e, 0x67, 0xee, 0x55, 0xb6, 0x4a, 0xac, 0x62, 0x09, 0xc5, 0x9a, + 0x2e, 0xdd, 0xc7, 0x24, 0x8a, 0x48, 0x94, 0xf2, 0x50, 0x65, 0x3d, 0x6b, 0x3d, 0xf1, 0xf5, 0xdb, + 0xab, 0x32, 0x85, 0xfd, 0xdb, 0x03, 0xf0, 0x58, 0x1f, 0x1a, 0xc8, 0x9c, 0xc5, 0x56, 0x9f, 0xb3, + 0xf8, 0x3b, 0xfc, 0x33, 0x7d, 0x34, 0xf3, 0x33, 0xe1, 0xfc, 0x3f, 0xd3, 0xee, 0x5f, 0x08, 0x3d, + 0x09, 0x65, 0xd7, 0x8f, 0x48, 0xad, 0x1d, 0xf2, 0x8c, 0x03, 0x23, 0x7f, 0x72, 0x41, 0xb4, 0x63, + 0x85, 0x41, 0xf7, 0xa5, 0x35, 0x87, 0x2e, 0xff, 0xa1, 0x9c, 0x8a, 0x06, 0x98, 0xa9, 0x98, 0xdc, + 0x2c, 0x9a, 0x9b, 0xa1, 0x12, 0x80, 0x93, 0xb1, 0x7f, 0xde, 0x82, 0x33, 0xbd, 0xcd, 0x04, 0xf4, + 0x34, 0x0c, 0xaf, 0xb1, 0xb0, 0x35, 0x76, 0x2d, 0xbf, 0x9c, 0x3a, 0xec, 0x7d, 0x75, 0x33, 0x36, + 0x71, 0xd0, 0x1c, 0x1c, 0x37, 0xe3, 0xdd, 0x96, 0x8c, 0xc8, 0x18, 0xe6, 0xc8, 0x58, 0x4d, 0x03, + 0x71, 0x37, 0xbe, 0xfd, 0xad, 0x62, 0x36, 0x5b, 0xdc, 0x9c, 0xdc, 0xcf, 0x6c, 0x16, 0x73, 0xb5, + 0xd0, 0x87, 0xc4, 0x2d, 0x1e, 0xb5, 0xc4, 0x1d, 0xe8, 0x25, 0x71, 0xd1, 0x3c, 0x1c, 0x33, 0xee, + 0x4d, 0xe4, 0x65, 0x24, 0x78, 0x8c, 0xa5, 0xaa, 0x01, 0xb5, 0x92, 0x82, 0xe3, 0xae, 0x27, 0xee, + 0xf3, 0xa9, 0xf7, 0x2b, 0x05, 0x38, 0xdd, 0xd3, 0x82, 0x3f, 0x22, 0x8d, 0x62, 0x7e, 0xfe, 0x81, + 0xa3, 0xf9, 0xfc, 0xe6, 0x47, 0x29, 0xed, 0xf5, 0x51, 0xec, 0x3f, 0x2e, 0xf4, 0x5c, 0x08, 0x74, + 0x37, 0xf7, 0x5d, 0x3b, 0x4a, 0x2f, 0xc0, 0xa8, 0xd3, 0x6a, 0x71, 0x3c, 0x16, 0xaf, 0x9e, 0xaa, + 0x39, 0x37, 0x63, 0x02, 0x71, 0x12, 0xb7, 0x2f, 0x9b, 0xe6, 0xcf, 0x2c, 0xa8, 0x60, 0xb2, 0xce, + 0xa5, 0x11, 0xba, 0x29, 0x86, 0xc8, 0xca, 0xa3, 0xea, 0x37, 0x1d, 0xd8, 0xc8, 0x65, 0xd5, 0xb0, + 0xb3, 0x06, 0xfb, 0xa0, 0x59, 0xdb, 0xea, 0x26, 0xc5, 0x62, 0xef, 0x9b, 0x14, 0xed, 0xff, 0x5e, + 0xa6, 0xaf, 0xd7, 0x0a, 0xe6, 0x42, 0x52, 0x8f, 0xe8, 0xf7, 0x6d, 0x87, 0x9e, 0x98, 0x24, 0xea, + 0xfb, 0x5e, 0xc3, 0x8b, 0x98, 0xb6, 0x27, 0x0e, 0xf9, 0x0a, 0xfb, 0xaa, 0xb8, 0x55, 0xdc, 0xb3, + 0xe2, 0xd6, 0x0b, 0x30, 0x1a, 0x45, 0x1b, 0x2b, 0xa1, 0xbb, 0xe5, 0xc4, 0xe4, 0x0a, 0xe9, 0x08, + 0xdb, 0x57, 0x57, 0x9f, 0xa9, 0x5e, 0xd2, 0x40, 0x9c, 0xc4, 0x45, 0x17, 0xe1, 0xb8, 0xae, 0x7b, + 0x45, 0xc2, 0x98, 0x65, 0x54, 0xf1, 0x99, 0xa0, 0x4a, 0x4d, 0xe8, 0x4a, 0x59, 0x02, 0x01, 0x77, + 0x3f, 0x43, 0xe5, 0x69, 0xa2, 0x91, 0x32, 0x32, 0x98, 0x94, 0xa7, 0x89, 0x7e, 0x28, 0x2f, 0x5d, + 0x4f, 0xa0, 0x25, 0x38, 0xc1, 0x27, 0xc6, 0x4c, 0xab, 0x65, 0xbc, 0xd1, 0x50, 0xb2, 0xda, 0xf2, + 0xc5, 0x6e, 0x14, 0x9c, 0xf5, 0x1c, 0x7a, 0x1e, 0x86, 0x55, 0xf3, 0xc2, 0xbc, 0x38, 0x9f, 0x52, + 0xfe, 0x31, 0xd5, 0xcd, 0x42, 0x1d, 0x9b, 0x78, 0xe8, 0x9d, 0xf0, 0xa0, 0xfe, 0xcb, 0xd3, 0x6e, + 0xf9, 0xa1, 0xed, 0xbc, 0x28, 0x29, 0xa8, 0x6e, 0xf2, 0xb9, 0x98, 0x89, 0x56, 0xc7, 0xbd, 0x9e, + 0x47, 0x6b, 0x70, 0x46, 0x81, 0xce, 0xfb, 0x31, 0xcb, 0xa1, 0x8b, 0xc8, 0xac, 0x13, 0x91, 0x6b, + 0xa1, 0xc7, 0x8a, 0x10, 0x56, 0xf4, 0xd5, 0xee, 0x17, 0xdd, 0xf8, 0x52, 0x16, 0x26, 0x5e, 0xc4, + 0xbb, 0xf4, 0x82, 0xa6, 0xa1, 0x42, 0x7c, 0x67, 0xcd, 0x23, 0xcb, 0x73, 0x0b, 0xac, 0x34, 0xa1, + 0x71, 0x46, 0x7c, 0x5e, 0x02, 0xb0, 0xc6, 0x51, 0x51, 0xcf, 0x23, 0xbd, 0xa2, 0x9e, 0xd1, 0x0a, + 0x9c, 0x6c, 0xd4, 0x5a, 0xd4, 0x22, 0x74, 0x6b, 0x64, 0xa6, 0xc6, 0x42, 0x35, 0xe9, 0x87, 0xe1, + 0x65, 0xb0, 0x55, 0xfa, 0xc8, 0xc5, 0xb9, 0x95, 0x2e, 0x1c, 0x9c, 0xf9, 0x24, 0x0b, 0xe9, 0x0d, + 0x83, 0xed, 0xce, 0xc4, 0x89, 0x54, 0x48, 0x2f, 0x6d, 0xc4, 0x1c, 0x86, 0x2e, 0x03, 0x62, 0xb9, + 0x48, 0x97, 0xe2, 0xb8, 0xa5, 0x4c, 0xd0, 0x89, 0x93, 0xc9, 0x02, 0x63, 0x17, 0xba, 0x30, 0x70, + 0xc6, 0x53, 0xd4, 0xa2, 0xf1, 0x03, 0xd6, 0xfb, 0xc4, 0x83, 0x49, 0x8b, 0xe6, 0x2a, 0x6f, 0xc6, + 0x12, 0x8e, 0xde, 0x0d, 0x13, 0xed, 0x88, 0xb0, 0xcd, 0xed, 0x8d, 0x20, 0xdc, 0xf4, 0x02, 0xa7, + 0xbe, 0xc0, 0xae, 0x6c, 0x8c, 0x3b, 0x13, 0x13, 0x8c, 0xf8, 0x59, 0xf1, 0xec, 0xc4, 0xb5, 0x1e, + 0x78, 0xb8, 0x67, 0x0f, 0xe9, 0x0a, 0x79, 0xa7, 0xfb, 0xab, 0x90, 0x67, 0xff, 0xa9, 0x05, 0xa3, + 0x4a, 0xde, 0x1c, 0x41, 0x06, 0xa3, 0x97, 0xcc, 0x60, 0xbc, 0x78, 0x70, 0x89, 0xcd, 0x38, 0xef, + 0x91, 0x26, 0xf0, 0xaf, 0x46, 0x00, 0xb4, 0x54, 0x57, 0x0a, 0xd5, 0xea, 0xa9, 0x50, 0xef, 0x5b, + 0x89, 0x9a, 0x55, 0x9f, 0xac, 0x74, 0x6f, 0xeb, 0x93, 0x55, 0xe1, 0x94, 0x34, 0x77, 0xf8, 0x29, + 0xea, 0xa5, 0x20, 0x52, 0x02, 0xda, 0xb8, 0x82, 0x6b, 0x21, 0x0b, 0x09, 0x67, 0x3f, 0x9b, 0xb0, + 0xb2, 0x86, 0xf6, 0x34, 0x7d, 0x95, 0x4c, 0x5a, 0x5c, 0x97, 0x17, 0xe4, 0xa5, 0x64, 0xd2, 0xe2, + 0x85, 0x2a, 0xd6, 0x38, 0xd9, 0x8a, 0xa9, 0x92, 0x93, 0x62, 0x82, 0x7d, 0x2b, 0x26, 0x29, 0x22, + 0x87, 0x7b, 0x8a, 0x48, 0x79, 0x5a, 0x33, 0xd2, 0xf3, 0xb4, 0xe6, 0xed, 0x30, 0xe6, 0xfa, 0x1b, + 0x24, 0x74, 0x63, 0x52, 0x67, 0x6b, 0x81, 0x89, 0xcf, 0xb2, 0x36, 0x4b, 0x16, 0x12, 0x50, 0x9c, + 0xc2, 0x4e, 0xca, 0xf5, 0xb1, 0x3e, 0xe4, 0x7a, 0x0f, 0x6d, 0x3a, 0x9e, 0x8f, 0x36, 0x3d, 0x76, + 0x70, 0x6d, 0x7a, 0xfc, 0x50, 0xb5, 0x29, 0xca, 0x45, 0x9b, 0xf6, 0xa5, 0xa8, 0x8c, 0xed, 0xf2, + 0xc9, 0x3d, 0xb6, 0xcb, 0xbd, 0x54, 0xe9, 0xa9, 0xbb, 0x56, 0xa5, 0xd9, 0x5a, 0xf2, 0x81, 0xef, + 0x49, 0x2d, 0xf9, 0xb1, 0x02, 0x9c, 0xd2, 0x7a, 0x84, 0xae, 0x5e, 0x77, 0x9d, 0x4a, 0x52, 0x76, + 0x47, 0x2c, 0x3f, 0x91, 0x35, 0x92, 0x73, 0x75, 0x9e, 0xaf, 0x82, 0x60, 0x03, 0x8b, 0xe5, 0xb8, + 0x92, 0x90, 0x5d, 0x50, 0x90, 0x56, 0x32, 0x73, 0xa2, 0x1d, 0x2b, 0x0c, 0xca, 0x32, 0xfd, 0x2d, + 0x6a, 0x15, 0xa4, 0x4b, 0xdf, 0xce, 0x69, 0x10, 0x36, 0xf1, 0xd0, 0x13, 0x9c, 0x08, 0x13, 0x70, + 0x54, 0xd1, 0x8c, 0xf0, 0x2d, 0x9b, 0x92, 0x69, 0x0a, 0x2a, 0xd9, 0x61, 0xc9, 0xcc, 0xa5, 0x6e, + 0x76, 0x58, 0x70, 0xa3, 0xc2, 0xb0, 0xff, 0xa7, 0x05, 0xa7, 0x33, 0x87, 0xe2, 0x08, 0x8c, 0x87, + 0xed, 0xa4, 0xf1, 0x50, 0xcd, 0x6b, 0xbb, 0x67, 0xbc, 0x45, 0x0f, 0x43, 0xe2, 0x3f, 0x58, 0x30, + 0xa6, 0xf1, 0x8f, 0xe0, 0x55, 0xdd, 0xe4, 0xab, 0xe6, 0xb7, 0xb3, 0xad, 0x74, 0xbd, 0xdb, 0xef, + 0x15, 0x40, 0x95, 0xa3, 0x9e, 0xa9, 0xc9, 0x62, 0xff, 0x7b, 0xc4, 0x08, 0x74, 0x60, 0x90, 0x85, + 0x38, 0x44, 0xf9, 0x84, 0x6f, 0x25, 0xe9, 0xb3, 0x70, 0x09, 0x7d, 0xe2, 0xc4, 0xfe, 0x46, 0x58, + 0x10, 0x64, 0xd7, 0x67, 0xf0, 0x4a, 0xbf, 0x75, 0x91, 0x21, 0xa8, 0xaf, 0xcf, 0x10, 0xed, 0x58, + 0x61, 0x50, 0xf5, 0xe6, 0xd6, 0x02, 0x7f, 0xce, 0x73, 0x22, 0x79, 0x6d, 0xbc, 0x52, 0x6f, 0x0b, + 0x12, 0x80, 0x35, 0x0e, 0x8b, 0x7e, 0x70, 0xa3, 0x96, 0xe7, 0x74, 0x0c, 0xff, 0x85, 0x51, 0x93, + 0x47, 0x81, 0xb0, 0x89, 0x67, 0x37, 0x61, 0x22, 0xf9, 0x12, 0xf3, 0x64, 0x9d, 0x85, 0x1e, 0xf7, + 0x35, 0x9c, 0xd3, 0x50, 0x71, 0xd8, 0x53, 0x8b, 0x6d, 0x47, 0xc8, 0x04, 0x1d, 0x80, 0x2b, 0x01, + 0x58, 0xe3, 0xd8, 0xff, 0xc0, 0x82, 0x13, 0x19, 0x83, 0x96, 0x63, 0x2a, 0x6c, 0xac, 0xa5, 0x4d, + 0x96, 0x61, 0xf2, 0x03, 0x30, 0x54, 0x27, 0xeb, 0x8e, 0x0c, 0x6e, 0x35, 0x44, 0xfa, 0x3c, 0x6f, + 0xc6, 0x12, 0x6e, 0xff, 0x56, 0x01, 0xc6, 0x93, 0xbc, 0x46, 0x2c, 0x49, 0x8c, 0x0f, 0x93, 0x1b, + 0xd5, 0x82, 0x2d, 0x12, 0x76, 0xe8, 0x9b, 0x5b, 0xa9, 0x24, 0xb1, 0x2e, 0x0c, 0x9c, 0xf1, 0x14, + 0x2b, 0x46, 0x5f, 0x57, 0xa3, 0x2d, 0x67, 0xe4, 0xf5, 0x3c, 0x67, 0xa4, 0xfe, 0x98, 0x66, 0x20, + 0x8c, 0x22, 0x89, 0x4d, 0xfa, 0xd4, 0x40, 0x62, 0x51, 0xf7, 0xb3, 0x6d, 0xd7, 0x8b, 0x5d, 0x5f, + 0xbc, 0xb2, 0x98, 0xab, 0xca, 0x40, 0x5a, 0xea, 0x46, 0xc1, 0x59, 0xcf, 0xd9, 0xdf, 0x1c, 0x00, + 0x55, 0xe6, 0x81, 0x05, 0x2a, 0xe6, 0x14, 0xe6, 0xb9, 0xdf, 0x54, 0x43, 0x35, 0xb7, 0x06, 0x76, + 0x8b, 0x1c, 0xe2, 0x4e, 0x2f, 0xd3, 0xf3, 0xad, 0x06, 0x6c, 0x55, 0x83, 0xb0, 0x89, 0x47, 0x39, + 0xf1, 0xdc, 0x2d, 0xc2, 0x1f, 0x1a, 0x4c, 0x72, 0xb2, 0x28, 0x01, 0x58, 0xe3, 0x50, 0x4e, 0xea, + 0xee, 0xfa, 0xba, 0xf0, 0xe0, 0x28, 0x4e, 0xe8, 0xe8, 0x60, 0x06, 0xe1, 0xd7, 0x95, 0x04, 0x9b, + 0x62, 0x53, 0x60, 0x5c, 0x57, 0x12, 0x6c, 0x62, 0x06, 0xa1, 0x5f, 0xc9, 0x0f, 0xc2, 0xa6, 0xe3, + 0xb9, 0xaf, 0x91, 0xba, 0xa2, 0x22, 0x36, 0x03, 0xea, 0x2b, 0x5d, 0xed, 0x46, 0xc1, 0x59, 0xcf, + 0xd1, 0x09, 0xdd, 0x0a, 0x49, 0xdd, 0xad, 0xc5, 0x66, 0x6f, 0x90, 0x9c, 0xd0, 0x2b, 0x5d, 0x18, + 0x38, 0xe3, 0x29, 0x34, 0x03, 0xe3, 0xb2, 0x4c, 0x87, 0x2c, 0xfc, 0x36, 0x9c, 0x2c, 0x34, 0x85, + 0x93, 0x60, 0x9c, 0xc6, 0xa7, 0x42, 0xb2, 0x29, 0xca, 0x56, 0xb2, 0xbd, 0x83, 0x21, 0x24, 0x65, + 0x39, 0x4b, 0xac, 0x30, 0xec, 0x0f, 0x15, 0xa9, 0x52, 0xef, 0x51, 0x1d, 0xf6, 0xc8, 0xc2, 0x8a, + 0x93, 0x33, 0x72, 0xa0, 0x8f, 0x19, 0xf9, 0x1c, 0x8c, 0xdc, 0x8c, 0x02, 0x5f, 0x85, 0xec, 0x96, + 0x7a, 0x86, 0xec, 0x1a, 0x58, 0xd9, 0x21, 0xbb, 0x83, 0x79, 0x85, 0xec, 0x0e, 0xdd, 0x65, 0xc8, + 0xee, 0x1f, 0x94, 0x40, 0xdd, 0x47, 0x77, 0x95, 0xc4, 0xb7, 0x82, 0x70, 0xd3, 0xf5, 0x1b, 0xac, + 0xe4, 0xc4, 0x17, 0x2d, 0x59, 0xb5, 0x62, 0xd1, 0x4c, 0xb9, 0x5c, 0xcf, 0xe9, 0x4e, 0xb1, 0x04, + 0xb1, 0xa9, 0x55, 0x83, 0x50, 0xea, 0x9a, 0x7f, 0x13, 0x84, 0x13, 0x1c, 0xa1, 0xf7, 0x03, 0x48, + 0x77, 0xf7, 0xba, 0x94, 0xc0, 0x0b, 0xf9, 0xf0, 0x87, 0xc9, 0xba, 0x36, 0xa9, 0x57, 0x15, 0x11, + 0x6c, 0x10, 0x44, 0x1f, 0xd3, 0xe9, 0xa8, 0x3c, 0xb7, 0xe7, 0xbd, 0x87, 0x32, 0x36, 0xfd, 0x24, + 0xa3, 0x62, 0x18, 0x72, 0xfd, 0x06, 0x9d, 0x27, 0x22, 0xb4, 0xf1, 0x2d, 0x59, 0xa5, 0x81, 0x16, + 0x03, 0xa7, 0x3e, 0xeb, 0x78, 0x8e, 0x5f, 0x23, 0xe1, 0x02, 0x47, 0xd7, 0x1a, 0x54, 0x34, 0x60, + 0xd9, 0x51, 0xd7, 0xa5, 0x79, 0xa5, 0x7e, 0x2e, 0xcd, 0x3b, 0xf3, 0x63, 0x70, 0xbc, 0xeb, 0x63, + 0xee, 0x2b, 0xf7, 0xf4, 0xee, 0xd3, 0x56, 0xed, 0xdf, 0x1e, 0xd4, 0x4a, 0xeb, 0x6a, 0x50, 0xe7, + 0x77, 0xb0, 0x85, 0xfa, 0x8b, 0x0a, 0x93, 0x39, 0xc7, 0x29, 0xa2, 0xd4, 0x8c, 0xd1, 0x88, 0x4d, 0x92, 0x74, 0x8e, 0xb6, 0x9c, 0x90, 0xf8, 0x87, 0x3d, 0x47, 0x57, 0x14, 0x11, 0x6c, 0x10, 0x44, - 0x1b, 0x89, 0xe4, 0xb3, 0x0b, 0x07, 0x4f, 0x3e, 0x63, 0xe5, 0x16, 0xb3, 0x2e, 0x1c, 0xfa, 0xac, - 0x05, 0x63, 0x7e, 0x62, 0xe6, 0xe6, 0x13, 0x6f, 0x9e, 0xbd, 0x2a, 0xf8, 0xa5, 0xa4, 0xc9, 0x36, - 0x9c, 0xa2, 0x9f, 0xa5, 0xd2, 0x4a, 0xfb, 0x54, 0x69, 0xfa, 0x26, 0xc7, 0xc1, 0x5e, 0x37, 0x39, - 0x22, 0x5f, 0xdd, 0xaf, 0x3b, 0x94, 0xfb, 0xfd, 0xba, 0x90, 0x71, 0xb7, 0xee, 0x0d, 0xa8, 0xd4, - 0x42, 0xe2, 0xc4, 0x77, 0x79, 0xd5, 0x2a, 0x8b, 0x82, 0x99, 0x93, 0x1d, 0x60, 0xdd, 0x97, 0xfd, - 0xbf, 0x07, 0xe0, 0x98, 0x1c, 0x11, 0x99, 0xab, 0x42, 0xf5, 0x23, 0xa7, 0xab, 0x6d, 0x65, 0xa5, + 0x1b, 0x89, 0xe4, 0xb3, 0x0b, 0x07, 0x4f, 0x3e, 0x63, 0x85, 0x1a, 0xb3, 0xae, 0x2a, 0xfa, 0x8c, + 0x05, 0x63, 0x7e, 0x62, 0xe6, 0xe6, 0x13, 0x6f, 0x9e, 0xbd, 0x2a, 0xf8, 0x75, 0xa6, 0xc9, 0x36, + 0x9c, 0xa2, 0x9f, 0xa5, 0xd2, 0x4a, 0xfb, 0x54, 0x69, 0xfa, 0x0e, 0xc8, 0xc1, 0x5e, 0x77, 0x40, + 0x22, 0x5f, 0xdd, 0xcc, 0x3b, 0x94, 0xfb, 0xcd, 0xbc, 0x90, 0x71, 0x2b, 0xef, 0x0d, 0xa8, 0xd4, + 0x42, 0xe2, 0xc4, 0x77, 0x79, 0x49, 0x2b, 0x8b, 0x82, 0x99, 0x93, 0x1d, 0x60, 0xdd, 0x97, 0xfd, + 0x7f, 0x06, 0xe0, 0x98, 0x1c, 0x11, 0x99, 0xab, 0x42, 0xf5, 0x23, 0xa7, 0xab, 0x6d, 0x65, 0xa5, 0x1f, 0x2f, 0x49, 0x00, 0xd6, 0x38, 0xd4, 0x1e, 0x6b, 0x47, 0x64, 0xb9, 0x45, 0xfc, 0x45, 0x77, 0x2d, 0x12, 0xc7, 0xd6, 0x6a, 0xa1, 0x5c, 0xd3, 0x20, 0x6c, 0xe2, 0x51, 0xdb, 0xde, 0x31, 0x8c, - 0x56, 0xc3, 0xb6, 0x97, 0x86, 0xaa, 0x84, 0xa3, 0x5f, 0xca, 0x2c, 0x3a, 0x9f, 0x4f, 0x86, 0x67, - 0x57, 0x8a, 0xce, 0x3e, 0x2f, 0x0a, 0xff, 0xbb, 0x16, 0x9c, 0xe2, 0xad, 0x72, 0x24, 0xaf, 0xb5, - 0xea, 0x4e, 0x4c, 0xa2, 0x7c, 0x2e, 0xab, 0xc9, 0xe0, 0x4f, 0xfb, 0xbc, 0xb3, 0xc8, 0xe2, 0x6c, - 0x6e, 0xd0, 0x67, 0x2c, 0x18, 0xdf, 0x4c, 0x14, 0x07, 0x92, 0xaa, 0xe3, 0xa0, 0x75, 0x3b, 0x12, - 0x9d, 0xea, 0xa5, 0x96, 0x6c, 0x8f, 0x70, 0x9a, 0xba, 0xfd, 0xdf, 0x2d, 0x30, 0xc5, 0xe8, 0xd1, - 0xd7, 0x14, 0xda, 0xbf, 0x29, 0x28, 0xad, 0xcb, 0x52, 0x4f, 0xeb, 0xf2, 0x11, 0x28, 0xb6, 0xdd, + 0x56, 0xc3, 0xb6, 0x97, 0x86, 0xaa, 0x84, 0xa3, 0x5f, 0xcc, 0x2c, 0x57, 0x9f, 0x4f, 0x86, 0x67, + 0x57, 0x8a, 0xce, 0x3e, 0xaf, 0x18, 0xff, 0xbb, 0x16, 0x9c, 0xe2, 0xad, 0x72, 0x24, 0xaf, 0xb5, + 0xea, 0x4e, 0x4c, 0xa2, 0x7c, 0xae, 0xb9, 0xc9, 0xe0, 0x4f, 0xfb, 0xbc, 0xb3, 0xc8, 0xe2, 0x6c, + 0x6e, 0xd0, 0xa7, 0x2d, 0x18, 0xdf, 0x4c, 0x94, 0x15, 0x92, 0xaa, 0xe3, 0xa0, 0x75, 0x3b, 0x12, + 0x9d, 0xea, 0xa5, 0x96, 0x6c, 0x8f, 0x70, 0x9a, 0xba, 0xfd, 0x3f, 0x2c, 0x30, 0xc5, 0xe8, 0xd1, + 0x57, 0x23, 0xda, 0xbf, 0x29, 0x28, 0xad, 0xcb, 0x52, 0x4f, 0xeb, 0xf2, 0x11, 0x28, 0xb6, 0xdd, 0xba, 0xd8, 0x5f, 0xe8, 0xc3, 0xf4, 0x85, 0x79, 0x4c, 0xdb, 0xed, 0x7f, 0x56, 0xd2, 0x6e, 0x10, - 0x91, 0x40, 0xf9, 0x3d, 0xf1, 0xda, 0xeb, 0xaa, 0xea, 0x26, 0x7f, 0xf3, 0xab, 0x5d, 0x55, 0x37, - 0x7f, 0x6c, 0xff, 0xf9, 0xb1, 0x7c, 0x80, 0x7a, 0x15, 0xdd, 0x1c, 0xda, 0x23, 0x39, 0xf6, 0x26, + 0x91, 0x40, 0xf9, 0x5d, 0xf1, 0xda, 0xeb, 0xaa, 0x5e, 0x27, 0x7f, 0xf3, 0xab, 0x5d, 0xf5, 0x3a, + 0x7f, 0x64, 0xff, 0xf9, 0xb1, 0x7c, 0x80, 0x7a, 0x95, 0xeb, 0x1c, 0xda, 0x23, 0x39, 0xf6, 0x26, 0x94, 0xe9, 0x16, 0x8c, 0xf9, 0x33, 0xcb, 0x09, 0xa6, 0xca, 0x97, 0x44, 0xfb, 0x9d, 0x9d, 0xc9, - 0x1f, 0xdd, 0x3f, 0x5b, 0xf2, 0x69, 0xac, 0xfa, 0x47, 0x11, 0x54, 0xe8, 0x6f, 0x96, 0xc7, 0x2b, + 0x1f, 0xde, 0x3f, 0x5b, 0xf2, 0x69, 0xac, 0xfa, 0x47, 0x11, 0x54, 0xe8, 0x6f, 0x96, 0xc7, 0x2b, 0x36, 0x77, 0xd7, 0x94, 0xcc, 0x94, 0x80, 0x5c, 0x92, 0x84, 0x35, 0x1d, 0xe4, 0x43, 0x85, 0x22, 0x72, 0xa2, 0x7c, 0x0f, 0xb8, 0xa2, 0xb2, 0x69, 0x25, 0xe0, 0xce, 0xce, 0xe4, 0x0b, 0xfb, 0x27, - 0xaa, 0x1e, 0xc7, 0x9a, 0x84, 0xfd, 0x7f, 0x06, 0xf4, 0xdc, 0x15, 0xc5, 0x56, 0xbf, 0x27, 0xe6, - 0xee, 0xb9, 0xd4, 0xdc, 0x3d, 0xdb, 0x35, 0x77, 0xc7, 0xf4, 0x85, 0xfb, 0x89, 0xd9, 0x78, 0xd4, + 0xaa, 0x1e, 0xc7, 0x9a, 0x84, 0xfd, 0x7f, 0x07, 0xf4, 0xdc, 0x15, 0x65, 0x5a, 0xbf, 0x2b, 0xe6, + 0xee, 0xb9, 0xd4, 0xdc, 0x3d, 0xdb, 0x35, 0x77, 0xc7, 0xf4, 0x55, 0xfd, 0x89, 0xd9, 0x78, 0xd4, 0x86, 0xc0, 0xde, 0xfe, 0x06, 0x66, 0x01, 0xbd, 0xda, 0x76, 0x43, 0x12, 0xad, 0x84, 0x6d, 0xdf, 0xf5, 0x1b, 0x6c, 0x3a, 0x96, 0x4d, 0x0b, 0x28, 0x01, 0xc6, 0x69, 0x7c, 0xba, 0xa9, 0xa7, 0xdf, - 0xfc, 0x86, 0xb3, 0xc5, 0x67, 0x95, 0x51, 0x9f, 0xaf, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0x1b, 0xf0, - 0xb0, 0xec, 0x60, 0x9e, 0x78, 0x44, 0xdc, 0x98, 0xbf, 0xee, 0x86, 0x4d, 0x1e, 0x4a, 0xcf, 0x63, - 0x38, 0xde, 0x2c, 0x7a, 0x78, 0x18, 0xef, 0x82, 0x8b, 0x77, 0xed, 0xc9, 0xfe, 0x0a, 0x0b, 0x22, - 0x30, 0x4a, 0x15, 0xd0, 0xd9, 0xe7, 0xb9, 0x4d, 0x57, 0x96, 0x11, 0x54, 0xb3, 0x6f, 0x91, 0x36, - 0x62, 0x0e, 0x43, 0xb7, 0x60, 0x68, 0x8d, 0x5f, 0x6c, 0x9c, 0xcf, 0x25, 0x2a, 0xe2, 0x96, 0x64, - 0x56, 0x8b, 0x57, 0x5e, 0x99, 0x7c, 0x47, 0xff, 0xc4, 0x92, 0x9a, 0xfd, 0xf5, 0x12, 0x8c, 0xcb, - 0xb0, 0xac, 0x4b, 0x6e, 0xc4, 0x62, 0x03, 0xcc, 0x02, 0xe5, 0x85, 0x3d, 0x0b, 0x94, 0xbf, 0x17, + 0xfc, 0x86, 0xb3, 0xc5, 0x67, 0x95, 0x51, 0xd9, 0xaf, 0x2a, 0xda, 0xb1, 0xc2, 0x40, 0x1b, 0xf0, + 0xb0, 0xec, 0x60, 0x9e, 0x78, 0x44, 0xdc, 0xb5, 0xbf, 0xee, 0x86, 0x4d, 0x1e, 0x4a, 0xcf, 0x63, + 0x38, 0xde, 0x2c, 0x7a, 0x78, 0x18, 0xef, 0x82, 0x8b, 0x77, 0xed, 0xc9, 0xfe, 0x32, 0x0b, 0x22, + 0x30, 0x4a, 0x15, 0xd0, 0xd9, 0xe7, 0xb9, 0x4d, 0x57, 0x16, 0x20, 0x54, 0xb3, 0x6f, 0x91, 0x36, + 0x62, 0x0e, 0x43, 0xb7, 0x60, 0x68, 0x8d, 0x5f, 0x89, 0x9c, 0xcf, 0xf5, 0x2b, 0xe2, 0x7e, 0x65, + 0x56, 0xc5, 0x57, 0x5e, 0xb6, 0x7c, 0x47, 0xff, 0xc4, 0x92, 0x9a, 0xfd, 0xb5, 0x12, 0x8c, 0xcb, + 0xb0, 0xac, 0x4b, 0x6e, 0xc4, 0x62, 0x03, 0xcc, 0xd2, 0xe6, 0x85, 0x3d, 0x4b, 0x9b, 0xbf, 0x07, 0xa0, 0x4e, 0x5a, 0x5e, 0xd0, 0x61, 0x86, 0xdf, 0xc0, 0xbe, 0x0d, 0x3f, 0xb5, 0x57, 0x98, 0x57, - 0xbd, 0x60, 0xa3, 0x47, 0x51, 0x3b, 0x91, 0xd7, 0x3b, 0x4f, 0xd5, 0x4e, 0x34, 0xae, 0x5a, 0x1a, - 0x3c, 0xda, 0xab, 0x96, 0x5c, 0x18, 0xe7, 0x2c, 0xaa, 0x82, 0x00, 0x77, 0x91, 0xf7, 0xcf, 0x52, - 0xaa, 0xe6, 0x93, 0xdd, 0xe0, 0x74, 0xbf, 0xe6, 0x3d, 0x4a, 0xe5, 0xa3, 0xbe, 0x47, 0xe9, 0xad, + 0xbd, 0x60, 0xa3, 0x47, 0x51, 0x75, 0x91, 0x57, 0x4a, 0x4f, 0x55, 0x5d, 0x34, 0x2e, 0x69, 0x1a, + 0x3c, 0xda, 0x4b, 0x9a, 0x5c, 0x18, 0xe7, 0x2c, 0xaa, 0x82, 0x00, 0x77, 0x91, 0xf7, 0xcf, 0x52, + 0xaa, 0xe6, 0x93, 0xdd, 0xe0, 0x74, 0xbf, 0xe6, 0x0d, 0x4c, 0xe5, 0xa3, 0xbe, 0x81, 0xe9, 0xad, 0x50, 0x91, 0xdf, 0x39, 0x9a, 0xa8, 0xe8, 0xa2, 0x2a, 0x72, 0x1a, 0x44, 0x58, 0xc3, 0xbb, 0x6a, - 0x9b, 0xc0, 0xbd, 0xaa, 0x6d, 0x62, 0x7f, 0xba, 0x40, 0x77, 0x0c, 0x9c, 0x2f, 0x55, 0xa6, 0xeb, - 0x71, 0x18, 0x74, 0xda, 0xf1, 0x46, 0xd0, 0x75, 0x35, 0xf2, 0x0c, 0x6b, 0xc5, 0x02, 0x8a, 0x16, + 0x9b, 0xc0, 0xbd, 0xaa, 0x6d, 0x62, 0x7f, 0xaa, 0x40, 0x77, 0x0c, 0x9c, 0x2f, 0x55, 0xa6, 0xeb, + 0x71, 0x18, 0x74, 0xda, 0xf1, 0x46, 0xd0, 0x75, 0xa9, 0xf2, 0x0c, 0x6b, 0xc5, 0x02, 0x8a, 0x16, 0x61, 0xa0, 0xae, 0x4b, 0x2f, 0xed, 0xe7, 0x7b, 0x6a, 0xe7, 0xab, 0x13, 0x13, 0xcc, 0x7a, 0x41, 0x0f, 0xc3, 0x40, 0xec, 0x34, 0x64, 0x16, 0x28, 0xcb, 0xfc, 0x5f, 0x75, 0x1a, 0x11, 0x66, 0xad, - 0xfb, 0x29, 0x37, 0xfb, 0x02, 0x8c, 0x46, 0x6e, 0xc3, 0x77, 0xe2, 0x76, 0x48, 0x8c, 0xf3, 0x49, - 0x1d, 0x32, 0x63, 0x02, 0x71, 0x12, 0xd7, 0xfe, 0xdd, 0x11, 0x38, 0x59, 0x9d, 0x5b, 0x92, 0x17, - 0x66, 0x1c, 0x5a, 0x22, 0x67, 0x16, 0x8d, 0xa3, 0x4b, 0xe4, 0xec, 0x41, 0xdd, 0x33, 0x12, 0x39, + 0xfb, 0x29, 0x54, 0xfb, 0x02, 0x8c, 0x46, 0x6e, 0xc3, 0x77, 0xe2, 0x76, 0x48, 0x8c, 0xf3, 0x49, + 0x1d, 0x32, 0x63, 0x02, 0x71, 0x12, 0xd7, 0xfe, 0x9d, 0x11, 0x38, 0x59, 0x9d, 0x5b, 0x92, 0x57, + 0x6d, 0x1c, 0x5a, 0x22, 0x67, 0x16, 0x8d, 0xa3, 0x4b, 0xe4, 0xec, 0x41, 0xdd, 0x33, 0x12, 0x39, 0x3d, 0x23, 0x91, 0x33, 0x99, 0x55, 0x57, 0xcc, 0x23, 0xab, 0x2e, 0x8b, 0x83, 0x7e, 0xb2, 0xea, 0x0e, 0x2d, 0xb3, 0x73, 0x57, 0x86, 0xf6, 0x95, 0xd9, 0xa9, 0xd2, 0x5e, 0x73, 0xc9, 0x15, 0xea, 0xf1, 0xa9, 0x32, 0xd3, 0x5e, 0x55, 0xca, 0x21, 0xcf, 0x83, 0x13, 0xa2, 0xfe, 0xe5, 0xfc, 0x19, 0xe8, 0x23, 0xe5, 0x50, 0xa4, 0xe2, 0x99, 0x69, 0xae, 0x43, 0x79, 0xa4, 0xb9, 0x66, 0xb1, 0xb3, 0x67, 0x9a, 0xeb, 0x0b, 0x30, 0x5a, 0xf3, 0x02, 0x9f, 0xac, 0x84, 0x41, 0x1c, 0xd4, 0x02, 0x79, - 0x39, 0xab, 0xbe, 0x5b, 0xcc, 0x04, 0xe2, 0x24, 0x6e, 0xaf, 0x1c, 0xd9, 0xca, 0x41, 0x73, 0x64, - 0xe1, 0x1e, 0xe5, 0xc8, 0x1a, 0x59, 0xa0, 0xc3, 0x79, 0x64, 0x81, 0x66, 0x7d, 0x91, 0xbe, 0x6e, - 0x5f, 0x7d, 0x9d, 0xdf, 0x4d, 0x4c, 0x4d, 0xf0, 0xb9, 0xa0, 0x49, 0x0d, 0xbf, 0x11, 0x36, 0x24, - 0xaf, 0x1c, 0xc2, 0x84, 0xbd, 0x51, 0xd5, 0x64, 0xd4, 0x7d, 0xc5, 0xba, 0x09, 0x27, 0x19, 0x39, - 0x48, 0x82, 0xea, 0x17, 0x0a, 0xf0, 0x03, 0x7b, 0xb2, 0x80, 0x6e, 0x01, 0xc4, 0x4e, 0x43, 0x4c, + 0xad, 0xab, 0xbe, 0x95, 0xcc, 0x04, 0xe2, 0x24, 0x6e, 0xaf, 0x1c, 0xd9, 0xca, 0x41, 0x73, 0x64, + 0xe1, 0x1e, 0xe5, 0xc8, 0x1a, 0x59, 0xa0, 0xc3, 0x79, 0x64, 0x81, 0x66, 0x7d, 0x91, 0xbe, 0xee, + 0x6d, 0x7d, 0x9d, 0xdf, 0x6a, 0x4c, 0x4d, 0xf0, 0xb9, 0xa0, 0x49, 0x0d, 0xbf, 0x11, 0x36, 0x24, + 0xaf, 0x1c, 0xc2, 0x84, 0xbd, 0x51, 0xd5, 0x64, 0xd4, 0x4d, 0xc7, 0xba, 0x09, 0x27, 0x19, 0x39, + 0x48, 0x82, 0xea, 0xe7, 0x0b, 0xf0, 0x7d, 0x7b, 0xb2, 0x80, 0x6e, 0x01, 0xc4, 0x4e, 0x43, 0x4c, 0x54, 0x71, 0x34, 0x73, 0xc0, 0xb8, 0xd6, 0x55, 0xd9, 0x1f, 0x2f, 0x93, 0xa4, 0xfe, 0xb2, 0x43, 0x0f, 0xf9, 0x9b, 0x85, 0xb3, 0x06, 0x5e, 0x57, 0x35, 0x59, 0x1c, 0x78, 0x04, 0x33, 0x08, 0x55, 0xff, 0x21, 0x69, 0x50, 0x93, 0xb6, 0x98, 0x54, 0xff, 0x98, 0xb5, 0x62, 0x01, 0x45, 0xcf, 0xc3, - 0xb0, 0xe3, 0x79, 0x3c, 0x91, 0x8b, 0x44, 0xe2, 0xd2, 0x3f, 0x5d, 0xd6, 0x52, 0x83, 0xb0, 0x89, - 0x67, 0xff, 0x55, 0x01, 0x26, 0xf7, 0x90, 0x29, 0x5d, 0x09, 0xbc, 0xa5, 0xbe, 0x13, 0x78, 0x45, + 0xb0, 0xe3, 0x79, 0x3c, 0x91, 0x8b, 0x44, 0xe2, 0xba, 0x40, 0x5d, 0xd6, 0x52, 0x83, 0xb0, 0x89, + 0x67, 0xff, 0x65, 0x01, 0x26, 0xf7, 0x90, 0x29, 0x5d, 0x09, 0xbc, 0xa5, 0xbe, 0x13, 0x78, 0x45, 0x72, 0xcb, 0x60, 0x8f, 0xe4, 0x96, 0xe7, 0x61, 0x38, 0x26, 0x4e, 0x53, 0x44, 0xc2, 0x09, 0x9f, 0x83, 0x3e, 0x6b, 0xd6, 0x20, 0x6c, 0xe2, 0x51, 0x29, 0x36, 0xe6, 0xd4, 0x6a, 0x24, 0x8a, 0x64, 0xf6, 0x8a, 0xf0, 0xdb, 0xe6, 0x96, 0x1a, 0xc3, 0xdc, 0xe1, 0x33, 0x09, 0x12, 0x38, 0x45, 0x32, - 0x3d, 0xe0, 0x95, 0x3e, 0x07, 0xfc, 0xd7, 0x0a, 0xf0, 0xc8, 0xae, 0xda, 0xad, 0xef, 0xc4, 0xa2, + 0x3d, 0xe0, 0x95, 0x3e, 0x07, 0xfc, 0x57, 0x0b, 0xf0, 0xc8, 0xae, 0xda, 0xad, 0xef, 0xc4, 0xa2, 0x76, 0x44, 0xc2, 0xf4, 0xc4, 0xb9, 0x16, 0x91, 0x10, 0x33, 0x08, 0x1f, 0xa5, 0x56, 0x4b, 0x45, - 0x31, 0xe7, 0x9f, 0x65, 0xc7, 0x47, 0x29, 0x41, 0x02, 0xa7, 0x48, 0xde, 0xed, 0xb4, 0xfc, 0xfa, + 0x31, 0xe7, 0x9f, 0x65, 0xc7, 0x47, 0x29, 0x41, 0x02, 0xa7, 0x48, 0xde, 0xed, 0xb4, 0xfc, 0xda, 0x00, 0x3c, 0xd6, 0x87, 0x0d, 0x90, 0x63, 0x36, 0x62, 0x32, 0x73, 0xb6, 0x78, 0x8f, 0x32, 0x67, - 0xef, 0x6e, 0xb8, 0xde, 0x48, 0xb8, 0xed, 0x2b, 0xeb, 0xf1, 0x2b, 0x05, 0x38, 0xd3, 0xdb, 0x60, - 0x41, 0x3f, 0x0e, 0xe3, 0xa1, 0x0a, 0xb2, 0x33, 0x93, 0x6e, 0x4f, 0x70, 0xcf, 0x4e, 0x02, 0x84, + 0xef, 0x6e, 0xb8, 0xde, 0x48, 0xb8, 0xed, 0x2b, 0xeb, 0xf1, 0xcb, 0x05, 0x38, 0xd3, 0xdb, 0x60, + 0x41, 0x3f, 0x0a, 0xe3, 0xa1, 0x0a, 0xb2, 0x33, 0x93, 0x6e, 0x4f, 0x70, 0xcf, 0x4e, 0x02, 0x84, 0xd3, 0xb8, 0x68, 0x0a, 0xa0, 0xe5, 0xc4, 0x1b, 0xd1, 0xf9, 0x6d, 0x37, 0x8a, 0x45, 0xf9, 0xb0, 0x31, 0x7e, 0x96, 0x28, 0x5b, 0xb1, 0x81, 0x41, 0xc9, 0xb1, 0x7f, 0xf3, 0xc1, 0xd5, 0x20, 0xe6, - 0x0f, 0xf1, 0xcd, 0xd6, 0x09, 0x79, 0x99, 0x98, 0x01, 0xc2, 0x69, 0x5c, 0x4a, 0x8e, 0x9d, 0x56, + 0x0f, 0xf1, 0xcd, 0xd6, 0x09, 0x79, 0x0d, 0x99, 0x01, 0xc2, 0x69, 0x5c, 0x4a, 0x8e, 0x9d, 0x56, 0x73, 0x46, 0xf9, 0x2e, 0x8c, 0x91, 0x5b, 0x54, 0xad, 0xd8, 0xc0, 0x48, 0xa7, 0x13, 0x97, 0xf6, 0x4e, 0x27, 0xb6, 0xff, 0x69, 0x01, 0x4e, 0xf7, 0x34, 0x78, 0xfb, 0x13, 0x53, 0xf7, 0x5f, 0x0a, - 0xf0, 0x5d, 0xae, 0xb0, 0xfd, 0xa5, 0x8e, 0xfe, 0x79, 0x8f, 0x99, 0x26, 0x52, 0x47, 0xef, 0xbe, + 0xf0, 0x5d, 0xae, 0xb0, 0xfd, 0xa5, 0x8e, 0xfe, 0x59, 0x8f, 0x99, 0x26, 0x52, 0x47, 0xef, 0xbe, 0x22, 0xc6, 0xfd, 0x37, 0x9e, 0x5d, 0xd9, 0xa2, 0x03, 0xfb, 0xc8, 0x16, 0x4d, 0x7d, 0x8c, 0x52, - 0x9f, 0xda, 0xe1, 0x3f, 0x0f, 0xf4, 0x1c, 0x5e, 0xba, 0x41, 0xee, 0xcb, 0x6f, 0x3e, 0x0f, 0xc7, - 0x5c, 0x9f, 0x5d, 0x2c, 0x59, 0x6d, 0xaf, 0x89, 0x8a, 0x52, 0xbc, 0x6c, 0xaa, 0xca, 0xfe, 0x58, + 0x9f, 0xda, 0xe1, 0xbf, 0x0c, 0xf4, 0x1c, 0x5e, 0xba, 0x41, 0xee, 0xcb, 0x6f, 0x3e, 0x0f, 0xc7, + 0x5c, 0x9f, 0x5d, 0x49, 0x59, 0x6d, 0xaf, 0x89, 0x8a, 0x52, 0xbc, 0x6c, 0xaa, 0xca, 0xfe, 0x58, 0x48, 0xc1, 0x71, 0xd7, 0x13, 0xf7, 0x61, 0xf6, 0xee, 0xdd, 0x0d, 0xe9, 0x3e, 0x25, 0xf7, 0x32, 0x9c, 0x92, 0x43, 0xb1, 0xe1, 0x84, 0xa4, 0x2e, 0x94, 0x6d, 0x24, 0xf2, 0x7d, 0x4e, 0xf3, 0x9c, - 0xa1, 0x0c, 0x04, 0x9c, 0xfd, 0x1c, 0xbb, 0xcb, 0x2f, 0x68, 0xb9, 0x35, 0xb1, 0x15, 0xd4, 0x77, - 0xf9, 0xd1, 0x46, 0xcc, 0x61, 0x5a, 0x5f, 0x54, 0x8e, 0x46, 0x5f, 0xbc, 0x17, 0x2a, 0x6a, 0xbc, - 0x79, 0x96, 0x80, 0x9a, 0xe4, 0x5d, 0x59, 0x02, 0x6a, 0x86, 0x1b, 0x58, 0x7b, 0xdd, 0x83, 0xfd, - 0x2c, 0x8c, 0x28, 0xef, 0x57, 0xbf, 0x37, 0x2a, 0xda, 0xff, 0xb7, 0x00, 0xa9, 0x3b, 0x8f, 0xd0, - 0x36, 0x54, 0xea, 0xf2, 0x26, 0xea, 0x7c, 0xca, 0xf6, 0xaa, 0x8b, 0xad, 0xf5, 0xf1, 0x8f, 0x6a, - 0xc2, 0x9a, 0x18, 0x7a, 0x3f, 0xaf, 0x90, 0x2b, 0x48, 0x17, 0xf2, 0xc8, 0xe0, 0xae, 0xaa, 0xfe, - 0xcc, 0x2b, 0xd3, 0x64, 0x1b, 0x36, 0xe8, 0xa1, 0x18, 0x2a, 0x1b, 0xf2, 0x6e, 0xa7, 0x7c, 0xc4, - 0x9d, 0xba, 0x2a, 0x8a, 0x9b, 0x68, 0xea, 0x2f, 0xd6, 0x84, 0xec, 0x3f, 0x2b, 0xc0, 0xc9, 0xe4, - 0x07, 0x10, 0xc7, 0x75, 0xbf, 0x6e, 0xc1, 0x83, 0x9e, 0x13, 0xc5, 0xd5, 0x36, 0xdb, 0x28, 0xac, - 0xb7, 0xbd, 0xe5, 0x54, 0x31, 0xe5, 0x83, 0x3a, 0x5b, 0x54, 0xc7, 0xe9, 0xbb, 0xc0, 0x66, 0x1f, - 0xba, 0xbd, 0x33, 0xf9, 0xe0, 0x62, 0x36, 0x71, 0xdc, 0x8b, 0x2b, 0xf4, 0x59, 0x0b, 0x8e, 0xd5, + 0xa1, 0x0c, 0x04, 0x9c, 0xfd, 0x1c, 0xbb, 0x05, 0x30, 0x68, 0xb9, 0x35, 0xb1, 0x15, 0xd4, 0xb7, + 0x00, 0xd2, 0x46, 0xcc, 0x61, 0x5a, 0x5f, 0x54, 0x8e, 0x46, 0x5f, 0xbc, 0x07, 0x2a, 0x6a, 0xbc, + 0x79, 0x96, 0x80, 0x9a, 0xe4, 0x5d, 0x59, 0x02, 0x6a, 0x86, 0x1b, 0x58, 0x7b, 0xdd, 0xa0, 0xfd, + 0x2c, 0x8c, 0x28, 0xef, 0x57, 0xbf, 0x77, 0x31, 0xda, 0xff, 0xaf, 0x00, 0xa9, 0xdb, 0x92, 0xd0, + 0x36, 0x54, 0xea, 0xf2, 0x0e, 0xeb, 0x7c, 0xca, 0xf6, 0xaa, 0x2b, 0xb1, 0xf5, 0xf1, 0x8f, 0x6a, + 0xc2, 0x9a, 0x18, 0x7a, 0x1f, 0xaf, 0x90, 0x2b, 0x48, 0x17, 0xf2, 0xc8, 0xe0, 0xae, 0xaa, 0xfe, + 0xcc, 0xcb, 0xd6, 0x64, 0x1b, 0x36, 0xe8, 0xa1, 0x18, 0x2a, 0x1b, 0xf2, 0x56, 0xa8, 0x7c, 0xc4, + 0x9d, 0xba, 0x64, 0x8a, 0x9b, 0x68, 0xea, 0x2f, 0xd6, 0x84, 0xec, 0x3f, 0x2d, 0xc0, 0xc9, 0xe4, + 0x07, 0x10, 0xc7, 0x75, 0xbf, 0x66, 0xc1, 0x83, 0x9e, 0x13, 0xc5, 0xd5, 0x36, 0xdb, 0x28, 0xac, + 0xb7, 0xbd, 0xe5, 0x54, 0x31, 0xe5, 0x83, 0x3a, 0x5b, 0x54, 0xc7, 0xe9, 0x5b, 0xc4, 0x66, 0x1f, + 0xba, 0xbd, 0x33, 0xf9, 0xe0, 0x62, 0x36, 0x71, 0xdc, 0x8b, 0x2b, 0xf4, 0x19, 0x0b, 0x8e, 0xd5, 0xda, 0x61, 0x48, 0xfc, 0x58, 0xb3, 0xca, 0xbf, 0xe2, 0xd5, 0x5c, 0x06, 0x52, 0x33, 0x78, 0x92, - 0x0a, 0xd4, 0xb9, 0x14, 0x2d, 0xdc, 0x45, 0xdd, 0xfe, 0x79, 0xaa, 0x39, 0x7b, 0xbe, 0xe7, 0xf7, - 0xd9, 0xe5, 0x65, 0xdf, 0x19, 0x84, 0xd1, 0x44, 0xc5, 0xe8, 0xc4, 0x11, 0x97, 0xb5, 0xe7, 0x11, - 0x17, 0xcb, 0x50, 0x6b, 0xfb, 0xf2, 0x6a, 0x65, 0x23, 0x43, 0xad, 0xed, 0x13, 0xcc, 0x61, 0x62, - 0x48, 0x71, 0xdb, 0x17, 0xd1, 0xed, 0xe6, 0x90, 0xe2, 0xb6, 0x8f, 0x05, 0x14, 0x7d, 0xc8, 0x82, + 0x0a, 0xd4, 0xb9, 0x14, 0x2d, 0xdc, 0x45, 0xdd, 0xfe, 0x39, 0xaa, 0x39, 0x7b, 0xbe, 0xe7, 0xf7, + 0xd8, 0xb5, 0x67, 0xdf, 0x1e, 0x84, 0xd1, 0x44, 0xc5, 0xe8, 0xc4, 0x11, 0x97, 0xb5, 0xe7, 0x11, + 0x17, 0xcb, 0x50, 0x6b, 0xfb, 0xf2, 0x52, 0x66, 0x23, 0x43, 0xad, 0xed, 0x13, 0xcc, 0x61, 0x62, + 0x48, 0x71, 0xdb, 0x17, 0xd1, 0xed, 0xe6, 0x90, 0xe2, 0xb6, 0x8f, 0x05, 0x14, 0x7d, 0xd0, 0x82, 0x11, 0xb6, 0xf8, 0xc4, 0x01, 0xa1, 0x50, 0x68, 0x97, 0x73, 0x58, 0xee, 0xb2, 0x3a, 0x3a, 0x8b, - 0x86, 0x34, 0x5b, 0x70, 0x82, 0x22, 0xfa, 0xa8, 0x05, 0x15, 0x75, 0x1b, 0xa3, 0xb8, 0x27, 0xbd, + 0x86, 0x34, 0x5b, 0x70, 0x82, 0x22, 0xfa, 0x88, 0x05, 0x15, 0x75, 0x8f, 0xa3, 0xb8, 0x61, 0xbd, 0x9a, 0x6f, 0x41, 0xee, 0x94, 0xd4, 0x53, 0x95, 0x91, 0xb1, 0x26, 0x8c, 0x22, 0x75, 0x7a, 0x37, 0x74, 0x38, 0xa7, 0x77, 0x90, 0x71, 0x72, 0xf7, 0x56, 0xa8, 0x34, 0x1d, 0xdf, 0x5d, 0x27, 0x51, 0xcc, 0x0f, 0xd4, 0xe4, 0x3d, 0x01, 0xb2, 0x11, 0x6b, 0x38, 0x35, 0xf6, 0x23, 0xf6, 0x62, 0xb1, @@ -5507,25 +5508,25 @@ var fileDescriptor_c078c3c476799f44 = []byte{ 0x6e, 0x78, 0x8f, 0xe3, 0xba, 0x2a, 0x9c, 0x72, 0xda, 0x71, 0x70, 0x89, 0x38, 0xde, 0x4c, 0x1c, 0x93, 0x66, 0x2b, 0x8e, 0x78, 0x91, 0xf1, 0x11, 0xe6, 0x02, 0x56, 0xf1, 0x5b, 0x55, 0xe2, 0xad, 0x77, 0x21, 0xe1, 0xec, 0x67, 0xed, 0x7f, 0x64, 0xc1, 0xa9, 0xcc, 0xa9, 0x70, 0xff, 0x46, 0xce, - 0xdb, 0x9f, 0x2f, 0xc1, 0x89, 0x8c, 0x7a, 0xf2, 0xa8, 0x63, 0x2e, 0x12, 0x2b, 0x8f, 0x20, 0xb4, + 0xdb, 0x9f, 0x2b, 0xc1, 0x89, 0x8c, 0x7a, 0xf2, 0xa8, 0x63, 0x2e, 0x12, 0x2b, 0x8f, 0x20, 0xb4, 0x64, 0x4c, 0x95, 0xfc, 0x36, 0x19, 0x2b, 0x63, 0x7f, 0x27, 0xf0, 0xfa, 0x14, 0xbc, 0x78, 0xb4, - 0xa7, 0xe0, 0xc6, 0x5c, 0x1f, 0xb8, 0xa7, 0x73, 0xbd, 0xb4, 0xc7, 0x5c, 0xff, 0xaa, 0x05, 0x13, + 0xa7, 0xe0, 0xc6, 0x5c, 0x1f, 0xb8, 0xa7, 0x73, 0xbd, 0xb4, 0xc7, 0x5c, 0xff, 0x8a, 0x05, 0x13, 0xcd, 0x1e, 0x97, 0x18, 0x89, 0xf3, 0xa4, 0xeb, 0x87, 0x73, 0x45, 0xd2, 0xec, 0xc3, 0xb7, 0x77, - 0x26, 0x7b, 0xde, 0x1d, 0x85, 0x7b, 0x72, 0x65, 0x7f, 0xab, 0x08, 0xcc, 0x5e, 0x63, 0x35, 0x83, - 0x3b, 0xe8, 0x83, 0xe6, 0xb5, 0x14, 0x56, 0x5e, 0x57, 0x28, 0xf0, 0xce, 0xd5, 0xb5, 0x16, 0x7c, + 0x26, 0x7b, 0xde, 0x1d, 0x85, 0x7b, 0x72, 0x65, 0x7f, 0xb3, 0x08, 0xcc, 0x5e, 0x63, 0x35, 0x83, + 0x3b, 0xe8, 0x03, 0xe6, 0xb5, 0x14, 0x56, 0x5e, 0x57, 0x28, 0xf0, 0xce, 0xd5, 0xb5, 0x16, 0x7c, 0x04, 0xb3, 0x6e, 0xb9, 0x48, 0x4b, 0xc2, 0x42, 0x1f, 0x92, 0xd0, 0x93, 0xf7, 0x7f, 0x14, 0xf3, - 0xbf, 0xff, 0xa3, 0x92, 0xbe, 0xfb, 0x63, 0xf7, 0x4f, 0x3c, 0x70, 0x5f, 0x7e, 0xe2, 0x5f, 0xb6, + 0xbf, 0xff, 0xa3, 0x92, 0xbe, 0xfb, 0x63, 0xf7, 0x4f, 0x3c, 0x70, 0x5f, 0x7e, 0xe2, 0x5f, 0xb2, 0xb8, 0xe0, 0x49, 0x7d, 0x05, 0x6d, 0x6e, 0x58, 0xbb, 0x98, 0x1b, 0x4f, 0x42, 0x39, 0x12, 0x92, 0x59, 0x98, 0x25, 0x3a, 0x00, 0x4a, 0xb4, 0x63, 0x85, 0x41, 0x77, 0x5d, 0x8e, 0xe7, 0x05, 0xb7, 0xce, 0x37, 0x5b, 0x71, 0x47, 0x18, 0x28, 0x6a, 0x5b, 0x30, 0xa3, 0x20, 0xd8, 0xc0, 0xb2, 0x37, - 0xc0, 0xd8, 0x30, 0xdc, 0xfd, 0x9d, 0xaf, 0x7d, 0x5c, 0xd6, 0xfd, 0x77, 0x0a, 0x82, 0x14, 0xdf, - 0x00, 0x9c, 0x4b, 0x5d, 0x8e, 0xde, 0x7f, 0xa8, 0xdb, 0xfb, 0x01, 0x6a, 0x41, 0xb3, 0x45, 0xb7, + 0xc0, 0xd8, 0x30, 0xdc, 0xfd, 0x6d, 0xb1, 0x7d, 0x5c, 0xf3, 0xfd, 0x77, 0x0a, 0x82, 0x14, 0xdf, + 0x00, 0x9c, 0x4b, 0x5d, 0xab, 0xde, 0x7f, 0xa8, 0xdb, 0xfb, 0x00, 0x6a, 0x41, 0xb3, 0x45, 0xb7, 0xc4, 0xab, 0x41, 0x3e, 0xfb, 0xa8, 0x39, 0xd5, 0x9f, 0x1e, 0x30, 0xdd, 0x86, 0x0d, 0x7a, 0x09, - 0xa9, 0x5d, 0xdc, 0x53, 0x6a, 0x27, 0x04, 0xd8, 0xc0, 0xee, 0x02, 0xcc, 0xfe, 0x2b, 0x0b, 0x12, + 0xa9, 0x5d, 0xdc, 0x53, 0x6a, 0x27, 0x04, 0xd8, 0xc0, 0xee, 0x02, 0xcc, 0xfe, 0x4b, 0x0b, 0x12, 0x06, 0x1d, 0x6a, 0x41, 0x89, 0xb2, 0xdb, 0x11, 0xb2, 0x60, 0x39, 0x3f, 0xeb, 0x91, 0x0a, 0x61, 0xb1, 0xc0, 0xd8, 0x4f, 0xcc, 0x09, 0x21, 0x4f, 0x84, 0xf5, 0xe5, 0xb2, 0xaf, 0x31, 0x09, 0x5e, - 0x0a, 0x82, 0x4d, 0x1e, 0x19, 0xa3, 0x43, 0x04, 0xed, 0x73, 0x70, 0xbc, 0x8b, 0x29, 0x76, 0x4f, - 0x6c, 0x20, 0x37, 0xe7, 0xc6, 0xc2, 0x60, 0xa5, 0x17, 0x30, 0x87, 0xd9, 0x5f, 0xb1, 0xe0, 0x58, + 0x0a, 0x82, 0x4d, 0x1e, 0x19, 0xa3, 0x43, 0x04, 0xed, 0x73, 0x70, 0xbc, 0x8b, 0x29, 0x76, 0xc3, + 0x6c, 0x20, 0x37, 0xe7, 0xc6, 0xc2, 0x60, 0xa5, 0x17, 0x30, 0x87, 0xd9, 0x5f, 0xb6, 0xe0, 0x58, 0xba, 0x7b, 0xf4, 0xba, 0x05, 0xc7, 0xa3, 0x74, 0x7f, 0x87, 0x35, 0x76, 0x2a, 0x34, 0xbf, 0x0b, 0x84, 0xbb, 0x99, 0xb0, 0xff, 0x89, 0x10, 0xf4, 0x37, 0x5c, 0xbf, 0x1e, 0xdc, 0x52, 0x26, 0x90, 0xd5, 0xd3, 0x04, 0xa2, 0x2b, 0xbf, 0xb6, 0x41, 0xea, 0x6d, 0xaf, 0xab, 0x66, 0x42, 0x55, 0xb4, @@ -5536,17 +5537,17 @@ var fileDescriptor_c078c3c476799f44 = []byte{ 0xb9, 0xd5, 0x74, 0xfc, 0xb6, 0xe3, 0xd1, 0x11, 0x12, 0x5e, 0x31, 0xb5, 0x0c, 0x97, 0x14, 0x04, 0x1b, 0x58, 0xf4, 0x8d, 0x63, 0xb7, 0x49, 0x5e, 0x0a, 0x7c, 0x19, 0x52, 0xad, 0xe3, 0x06, 0x44, 0x3b, 0x56, 0x18, 0xe8, 0x1c, 0x0c, 0x3b, 0x7e, 0x9d, 0xdb, 0x7e, 0x41, 0x28, 0x8e, 0x1f, 0xd5, - 0xc6, 0xf2, 0x5a, 0x44, 0x66, 0x34, 0x14, 0x9b, 0xa8, 0xf6, 0x5f, 0x5a, 0x30, 0xae, 0x0b, 0xdb, + 0xc6, 0xf2, 0x5a, 0x44, 0x66, 0x34, 0x14, 0x9b, 0xa8, 0xf6, 0x5f, 0x58, 0x30, 0xae, 0x0b, 0xdb, 0x30, 0x2f, 0x58, 0xc2, 0xfd, 0x67, 0xed, 0xe9, 0xfe, 0x4b, 0x56, 0xcc, 0x28, 0xf4, 0x55, 0x31, - 0xc3, 0x2c, 0x66, 0x51, 0xdc, 0xb5, 0x98, 0xc5, 0x0f, 0xc2, 0xd0, 0x26, 0xe9, 0x18, 0x55, 0x2f, + 0xc3, 0x2c, 0x66, 0x51, 0xdc, 0xb5, 0x98, 0xc5, 0xf7, 0xc3, 0xd0, 0x26, 0xe9, 0x18, 0x55, 0x2f, 0x86, 0xa9, 0x21, 0x75, 0x85, 0x37, 0x61, 0x09, 0x43, 0x36, 0x0c, 0xd6, 0x1c, 0x55, 0x95, 0x6e, 0x84, 0x6f, 0x9a, 0xe6, 0x66, 0x18, 0x92, 0x80, 0xd8, 0xcb, 0x50, 0x51, 0x07, 0xef, 0xd2, 0x1b, - 0x67, 0x65, 0x7b, 0xe3, 0xfa, 0x4a, 0xaa, 0x9f, 0x5d, 0xfb, 0xda, 0xb7, 0x1f, 0x7d, 0xd3, 0x1f, - 0x7f, 0xfb, 0xd1, 0x37, 0xfd, 0xe9, 0xb7, 0x1f, 0x7d, 0xd3, 0x87, 0x6e, 0x3f, 0x6a, 0x7d, 0xed, - 0xf6, 0xa3, 0xd6, 0x1f, 0xdf, 0x7e, 0xd4, 0xfa, 0xd3, 0xdb, 0x8f, 0x5a, 0xdf, 0xba, 0xfd, 0xa8, - 0xf5, 0xd9, 0xff, 0xf4, 0xe8, 0x9b, 0x5e, 0xca, 0x8c, 0xc6, 0xa7, 0x3f, 0x9e, 0xaa, 0xd5, 0xa7, - 0xb7, 0x9e, 0x65, 0x01, 0xe1, 0x74, 0x61, 0x4e, 0x1b, 0xb3, 0x71, 0x5a, 0x2e, 0xcc, 0xff, 0x17, - 0x00, 0x00, 0xff, 0xff, 0x9c, 0x4d, 0xc4, 0xe4, 0x98, 0xf8, 0x00, 0x00, + 0x67, 0x65, 0x7b, 0xe3, 0xfa, 0x4a, 0xaa, 0x9f, 0x5d, 0xfb, 0xea, 0xb7, 0x1e, 0x7d, 0xd3, 0x1f, + 0x7d, 0xeb, 0xd1, 0x37, 0xfd, 0xc9, 0xb7, 0x1e, 0x7d, 0xd3, 0x07, 0x6f, 0x3f, 0x6a, 0x7d, 0xf5, + 0xf6, 0xa3, 0xd6, 0x1f, 0xdd, 0x7e, 0xd4, 0xfa, 0x93, 0xdb, 0x8f, 0x5a, 0xdf, 0xbc, 0xfd, 0xa8, + 0xf5, 0x99, 0xff, 0xfc, 0xe8, 0x9b, 0x5e, 0xca, 0x8c, 0xc6, 0xa7, 0x3f, 0x9e, 0xaa, 0xd5, 0xa7, + 0xb7, 0x9e, 0x65, 0x01, 0xe1, 0x74, 0x61, 0x4e, 0x1b, 0xb3, 0x71, 0x5a, 0x2e, 0xcc, 0xff, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0x47, 0x4b, 0xe9, 0x9c, 0xd2, 0xf8, 0x00, 0x00, } func (m *AWSAuthConfig) Marshal() (dAtA []byte, err error) { @@ -10623,6 +10624,14 @@ func (m *KustomizeOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i-- + if m.SetNamespace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 i -= len(m.BinaryPath) copy(dAtA[i:], m.BinaryPath) i = encodeVarintGenerated(dAtA, i, uint64(len(m.BinaryPath))) @@ -17513,6 +17522,7 @@ func (m *KustomizeOptions) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.BinaryPath) n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -20785,6 +20795,7 @@ func (this *KustomizeOptions) String() string { s := strings.Join([]string{`&KustomizeOptions{`, `BuildOptions:` + fmt.Sprintf("%v", this.BuildOptions) + `,`, `BinaryPath:` + fmt.Sprintf("%v", this.BinaryPath) + `,`, + `SetNamespace:` + fmt.Sprintf("%v", this.SetNamespace) + `,`, `}`, }, "") return s @@ -38345,6 +38356,26 @@ func (m *KustomizeOptions) Unmarshal(dAtA []byte) error { } m.BinaryPath = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SetNamespace", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.SetNamespace = bool(v != 0) 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 1cf012f112185..9508a1eb09274 100644 --- a/pkg/apis/application/v1alpha1/generated.proto +++ b/pkg/apis/application/v1alpha1/generated.proto @@ -1256,6 +1256,8 @@ message KustomizeOptions { // BinaryPath holds optional path to kustomize binary optional string binaryPath = 2; + + optional bool setNamespace = 3; } message KustomizePatch { diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index d49934724dd7d..5230b23f9e37f 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -1355,7 +1355,9 @@ type SyncOperation struct { // If omitted, will use the revision specified in app spec. Revisions []string `json:"revisions,omitempty" protobuf:"bytes,11,opt,name=revisions"` // SelfHealAttemptsCount contains the number of auto-heal attempts - SelfHealAttemptsCount int64 `json:"autoHealAttemptsCount,omitempty" protobuf:"bytes,12,opt,name=autoHealAttemptsCount"` + SelfHealAttemptsCount int64 `json:"autoHealAttemptsCount,omitempty" protobuf:"bytes,12,opt,name=autoHealAttemptsCount"` + ChangeRevisions []string `json:"changeRevisions,omitempty" protobuf:"-"` + ChangeRevision string `json:"changeRevision,omitempty" protobuf:"-"` } // IsApplyStrategy returns true if the sync strategy is "apply" @@ -3088,6 +3090,8 @@ type KustomizeOptions struct { BuildOptions string `protobuf:"bytes,1,opt,name=buildOptions"` // BinaryPath holds optional path to kustomize binary BinaryPath string `protobuf:"bytes,2,opt,name=binaryPath"` + + SetNamespace bool `protobuf:"varint,3,opt,name=setNamespace"` } // ApplicationDestinationServiceAccount holds information about the service account to be impersonated for the application sync operation. diff --git a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go index e0b35aff0ac57..98acd64a4c04e 100644 --- a/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/application/v1alpha1/zz_generated.deepcopy.go @@ -4366,6 +4366,11 @@ func (in *SyncOperation) DeepCopyInto(out *SyncOperation) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ChangeRevisions != nil { + in, out := &in.ChangeRevisions, &out.ChangeRevisions + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/reposerver/apiclient/mocks/RepoServerServiceClient.go b/reposerver/apiclient/mocks/RepoServerServiceClient.go index 1659468ce3652..4b1000c97df4e 100644 --- a/reposerver/apiclient/mocks/RepoServerServiceClient.go +++ b/reposerver/apiclient/mocks/RepoServerServiceClient.go @@ -132,6 +132,43 @@ func (_m *RepoServerServiceClient) GetAppDetails(ctx context.Context, in *apicli return r0, r1 } +// GetChangeRevision provides a mock function with given fields: ctx, in, opts +func (_m *RepoServerServiceClient) GetChangeRevision(ctx context.Context, in *apiclient.ChangeRevisionRequest, opts ...grpc.CallOption) (*apiclient.ChangeRevisionResponse, error) { + _va := make([]interface{}, len(opts)) + for _i := range opts { + _va[_i] = opts[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, in) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for GetChangeRevision") + } + + var r0 *apiclient.ChangeRevisionResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) (*apiclient.ChangeRevisionResponse, error)); ok { + return rf(ctx, in, opts...) + } + if rf, ok := ret.Get(0).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) *apiclient.ChangeRevisionResponse); ok { + r0 = rf(ctx, in, opts...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*apiclient.ChangeRevisionResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *apiclient.ChangeRevisionRequest, ...grpc.CallOption) error); ok { + r1 = rf(ctx, in, opts...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetGitDirectories provides a mock function with given fields: ctx, in, opts func (_m *RepoServerServiceClient) GetGitDirectories(ctx context.Context, in *apiclient.GitDirectoriesRequest, opts ...grpc.CallOption) (*apiclient.GitDirectoriesResponse, error) { _va := make([]interface{}, len(opts)) diff --git a/reposerver/apiclient/repository.pb.go b/reposerver/apiclient/repository.pb.go index 548318db0130e..1f5ac4caa0924 100644 --- a/reposerver/apiclient/repository.pb.go +++ b/reposerver/apiclient/repository.pb.go @@ -13,6 +13,8 @@ import ( status "google.golang.org/grpc/status" emptypb "google.golang.org/protobuf/types/known/emptypb" io "io" + _ "k8s.io/api/core/v1" + _ "k8s.io/apimachinery/pkg/apis/meta/v1" math "math" math_bits "math/bits" ) @@ -2428,6 +2430,140 @@ func (m *UpdateRevisionForPathsResponse) GetRevision() string { return "" } +type ChangeRevisionRequest struct { + AppName string `protobuf:"bytes,1,opt,name=appName,proto3" json:"appName,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + CurrentRevision string `protobuf:"bytes,3,opt,name=currentRevision,proto3" json:"currentRevision,omitempty"` + PreviousRevision string `protobuf:"bytes,4,opt,name=previousRevision,proto3" json:"previousRevision,omitempty"` + Paths []string `protobuf:"bytes,5,rep,name=paths,proto3" json:"paths,omitempty"` + Repo *v1alpha1.Repository `protobuf:"bytes,6,opt,name=repo,proto3" json:"repo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionRequest) Reset() { *m = ChangeRevisionRequest{} } +func (m *ChangeRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionRequest) ProtoMessage() {} +func (*ChangeRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{33} +} +func (m *ChangeRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionRequest.Merge(m, src) +} +func (m *ChangeRevisionRequest) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionRequest proto.InternalMessageInfo + +func (m *ChangeRevisionRequest) GetAppName() string { + if m != nil { + return m.AppName + } + return "" +} + +func (m *ChangeRevisionRequest) GetNamespace() string { + if m != nil { + return m.Namespace + } + return "" +} + +func (m *ChangeRevisionRequest) GetCurrentRevision() string { + if m != nil { + return m.CurrentRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPreviousRevision() string { + if m != nil { + return m.PreviousRevision + } + return "" +} + +func (m *ChangeRevisionRequest) GetPaths() []string { + if m != nil { + return m.Paths + } + return nil +} + +func (m *ChangeRevisionRequest) GetRepo() *v1alpha1.Repository { + if m != nil { + return m.Repo + } + return nil +} + +type ChangeRevisionResponse struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChangeRevisionResponse) Reset() { *m = ChangeRevisionResponse{} } +func (m *ChangeRevisionResponse) String() string { return proto.CompactTextString(m) } +func (*ChangeRevisionResponse) ProtoMessage() {} +func (*ChangeRevisionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dd8723cfcc820480, []int{34} +} +func (m *ChangeRevisionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ChangeRevisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ChangeRevisionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ChangeRevisionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangeRevisionResponse.Merge(m, src) +} +func (m *ChangeRevisionResponse) XXX_Size() int { + return m.Size() +} +func (m *ChangeRevisionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ChangeRevisionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangeRevisionResponse proto.InternalMessageInfo + +func (m *ChangeRevisionResponse) GetRevision() string { + if m != nil { + return m.Revision + } + return "" +} + func init() { proto.RegisterType((*ManifestRequest)(nil), "repository.ManifestRequest") proto.RegisterMapType((map[string]bool)(nil), "repository.ManifestRequest.EnabledSourceTypesEntry") @@ -2471,6 +2607,8 @@ func init() { proto.RegisterType((*UpdateRevisionForPathsRequest)(nil), "repository.UpdateRevisionForPathsRequest") proto.RegisterMapType((map[string]*v1alpha1.RefTarget)(nil), "repository.UpdateRevisionForPathsRequest.RefSourcesEntry") proto.RegisterType((*UpdateRevisionForPathsResponse)(nil), "repository.UpdateRevisionForPathsResponse") + proto.RegisterType((*ChangeRevisionRequest)(nil), "repository.ChangeRevisionRequest") + proto.RegisterType((*ChangeRevisionResponse)(nil), "repository.ChangeRevisionResponse") } func init() { @@ -2478,156 +2616,163 @@ func init() { } var fileDescriptor_dd8723cfcc820480 = []byte{ - // 2377 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x4d, 0x73, 0x1c, 0x47, - 0x55, 0xfb, 0x25, 0xed, 0x3e, 0x59, 0x5f, 0x6d, 0x5b, 0x1e, 0xaf, 0x6d, 0xa1, 0x0c, 0xd8, 0xe5, - 0xd8, 0xc9, 0xaa, 0x6c, 0x57, 0x62, 0x70, 0x42, 0x28, 0x45, 0xb6, 0x25, 0xc7, 0x96, 0x2d, 0xc6, - 0x4e, 0x28, 0x83, 0x81, 0xea, 0x9d, 0x6d, 0xed, 0x76, 0x34, 0x1f, 0xed, 0x99, 0x1e, 0x05, 0xb9, - 0x8a, 0x0b, 0x50, 0x5c, 0xb8, 0x73, 0xe0, 0xca, 0x6f, 0xa0, 0x38, 0x72, 0xa0, 0x28, 0x38, 0x52, - 0x5c, 0xb8, 0x50, 0x05, 0xe5, 0x5f, 0x42, 0xf5, 0xc7, 0x7c, 0xee, 0xec, 0x4a, 0x61, 0x65, 0x05, - 0xb8, 0x48, 0xd3, 0xaf, 0x5f, 0xbf, 0xf7, 0xfa, 0x7d, 0xf5, 0x7b, 0xdd, 0x0b, 0x57, 0x02, 0xc2, - 0xfc, 0x90, 0x04, 0xfb, 0x24, 0x58, 0x93, 0x9f, 0x94, 0xfb, 0xc1, 0x41, 0xe6, 0xb3, 0xc3, 0x02, - 0x9f, 0xfb, 0x08, 0x52, 0x48, 0xfb, 0x51, 0x9f, 0xf2, 0x41, 0xd4, 0xed, 0xd8, 0xbe, 0xbb, 0x86, - 0x83, 0xbe, 0xcf, 0x02, 0xff, 0x73, 0xf9, 0xf1, 0xae, 0xdd, 0x5b, 0xdb, 0xbf, 0xb5, 0xc6, 0xf6, - 0xfa, 0x6b, 0x98, 0xd1, 0x70, 0x0d, 0x33, 0xe6, 0x50, 0x1b, 0x73, 0xea, 0x7b, 0x6b, 0xfb, 0x37, - 0xb0, 0xc3, 0x06, 0xf8, 0xc6, 0x5a, 0x9f, 0x78, 0x24, 0xc0, 0x9c, 0xf4, 0x14, 0xe5, 0xf6, 0x85, - 0xbe, 0xef, 0xf7, 0x1d, 0xb2, 0x26, 0x47, 0xdd, 0x68, 0x77, 0x8d, 0xb8, 0x8c, 0x6b, 0xb6, 0xe6, - 0x3f, 0xe6, 0x60, 0x61, 0x1b, 0x7b, 0x74, 0x97, 0x84, 0xdc, 0x22, 0x2f, 0x23, 0x12, 0x72, 0xf4, - 0x02, 0xea, 0x42, 0x18, 0xa3, 0xb2, 0x5a, 0xb9, 0x3a, 0x7b, 0x73, 0xab, 0x93, 0x4a, 0xd3, 0x89, - 0xa5, 0x91, 0x1f, 0x3f, 0xb6, 0x7b, 0x9d, 0xfd, 0x5b, 0x1d, 0xb6, 0xd7, 0xef, 0x08, 0x69, 0x3a, - 0x19, 0x69, 0x3a, 0xb1, 0x34, 0x1d, 0x2b, 0xd9, 0x96, 0x25, 0xa9, 0xa2, 0x36, 0x34, 0x03, 0xb2, - 0x4f, 0x43, 0xea, 0x7b, 0x46, 0x75, 0xb5, 0x72, 0xb5, 0x65, 0x25, 0x63, 0x64, 0xc0, 0x8c, 0xe7, - 0x6f, 0x60, 0x7b, 0x40, 0x8c, 0xda, 0x6a, 0xe5, 0x6a, 0xd3, 0x8a, 0x87, 0x68, 0x15, 0x66, 0x31, - 0x63, 0x8f, 0x70, 0x97, 0x38, 0x0f, 0xc9, 0x81, 0x51, 0x97, 0x0b, 0xb3, 0x20, 0xb1, 0x16, 0x33, - 0xf6, 0x18, 0xbb, 0xc4, 0x68, 0xc8, 0xd9, 0x78, 0x88, 0x2e, 0x42, 0xcb, 0xc3, 0x2e, 0x09, 0x19, - 0xb6, 0x89, 0xd1, 0x94, 0x73, 0x29, 0x00, 0xfd, 0x14, 0x96, 0x32, 0x82, 0x3f, 0xf5, 0xa3, 0xc0, - 0x26, 0x06, 0xc8, 0xad, 0x3f, 0x99, 0x6c, 0xeb, 0xeb, 0x45, 0xb2, 0xd6, 0x30, 0x27, 0xf4, 0x23, - 0x68, 0x48, 0xcb, 0x1b, 0xb3, 0xab, 0xb5, 0x63, 0xd5, 0xb6, 0x22, 0x8b, 0x3c, 0x98, 0x61, 0x4e, - 0xd4, 0xa7, 0x5e, 0x68, 0x9c, 0x92, 0x1c, 0x9e, 0x4d, 0xc6, 0x61, 0xc3, 0xf7, 0x76, 0x69, 0x7f, - 0x1b, 0x7b, 0xb8, 0x4f, 0x5c, 0xe2, 0xf1, 0x1d, 0x49, 0xdc, 0x8a, 0x99, 0xa0, 0x57, 0xb0, 0xb8, - 0x17, 0x85, 0xdc, 0x77, 0xe9, 0x2b, 0xf2, 0x84, 0x89, 0xb5, 0xa1, 0x31, 0x27, 0xb5, 0xf9, 0x78, - 0x32, 0xc6, 0x0f, 0x0b, 0x54, 0xad, 0x21, 0x3e, 0xc2, 0x49, 0xf6, 0xa2, 0x2e, 0xf9, 0x8c, 0x04, - 0xd2, 0xbb, 0xe6, 0x95, 0x93, 0x64, 0x40, 0xca, 0x8d, 0xa8, 0x1e, 0x85, 0xc6, 0xc2, 0x6a, 0x4d, - 0xb9, 0x51, 0x02, 0x42, 0x57, 0x61, 0x61, 0x9f, 0x04, 0x74, 0xf7, 0xe0, 0x29, 0xed, 0x7b, 0x98, - 0x47, 0x01, 0x31, 0x16, 0xa5, 0x2b, 0x16, 0xc1, 0xc8, 0x85, 0xb9, 0x01, 0x71, 0x5c, 0xa1, 0xf2, - 0x8d, 0x80, 0xf4, 0x42, 0x63, 0x49, 0xea, 0x77, 0x73, 0x72, 0x0b, 0x4a, 0x72, 0x56, 0x9e, 0xba, - 0x10, 0xcc, 0xf3, 0x2d, 0x1d, 0x29, 0x2a, 0x46, 0x90, 0x12, 0xac, 0x00, 0x46, 0x57, 0x60, 0x9e, - 0x07, 0xd8, 0xde, 0xa3, 0x5e, 0x7f, 0x9b, 0xf0, 0x81, 0xdf, 0x33, 0x4e, 0x4b, 0x4d, 0x14, 0xa0, - 0xc8, 0x06, 0x44, 0x3c, 0xdc, 0x75, 0x48, 0x4f, 0xf9, 0xe2, 0xb3, 0x03, 0x46, 0x42, 0xe3, 0x8c, - 0xdc, 0xc5, 0xad, 0x4e, 0x26, 0x43, 0x15, 0x12, 0x44, 0xe7, 0xde, 0xd0, 0xaa, 0x7b, 0x1e, 0x0f, - 0x0e, 0xac, 0x12, 0x72, 0x68, 0x0f, 0x66, 0xc5, 0x3e, 0x62, 0x57, 0x38, 0x2b, 0x5d, 0xe1, 0xc1, - 0x64, 0x3a, 0xda, 0x4a, 0x09, 0x5a, 0x59, 0xea, 0xa8, 0x03, 0x68, 0x80, 0xc3, 0xed, 0xc8, 0xe1, - 0x94, 0x39, 0x44, 0x89, 0x11, 0x1a, 0xcb, 0x52, 0x4d, 0x25, 0x33, 0xe8, 0x21, 0x40, 0x40, 0x76, - 0x63, 0xbc, 0x73, 0x72, 0xe7, 0xd7, 0xc7, 0xed, 0xdc, 0x4a, 0xb0, 0xd5, 0x8e, 0x33, 0xcb, 0x05, - 0x73, 0xb1, 0x0d, 0x62, 0x73, 0x1d, 0xed, 0x32, 0xac, 0x0d, 0xe9, 0x62, 0x25, 0x33, 0xc2, 0x17, - 0x35, 0x54, 0x26, 0xad, 0xf3, 0xca, 0x5b, 0x33, 0x20, 0xb4, 0x05, 0x5f, 0xc3, 0x9e, 0xe7, 0x73, - 0xb9, 0xfd, 0x58, 0x94, 0x4d, 0x9d, 0xde, 0x77, 0x30, 0x1f, 0x84, 0x46, 0x5b, 0xae, 0x3a, 0x0c, - 0x4d, 0xb8, 0x04, 0xf5, 0x42, 0x8e, 0x1d, 0x47, 0x22, 0x3d, 0xb8, 0x6b, 0x5c, 0x50, 0x2e, 0x91, - 0x87, 0xb6, 0xef, 0xc1, 0xb9, 0x11, 0xc6, 0x45, 0x8b, 0x50, 0xdb, 0x23, 0x07, 0xf2, 0x50, 0x68, - 0x59, 0xe2, 0x13, 0x9d, 0x81, 0xc6, 0x3e, 0x76, 0x22, 0x22, 0xd3, 0x78, 0xd3, 0x52, 0x83, 0x3b, - 0xd5, 0x6f, 0x56, 0xda, 0xbf, 0xac, 0xc0, 0x42, 0x41, 0x55, 0x25, 0xeb, 0x7f, 0x98, 0x5d, 0x7f, - 0x0c, 0x81, 0xb3, 0xfb, 0x0c, 0x07, 0x7d, 0xc2, 0x33, 0x82, 0x98, 0x7f, 0xab, 0x80, 0x51, 0xb0, - 0xe1, 0xf7, 0x28, 0x1f, 0xdc, 0xa7, 0x0e, 0x09, 0xd1, 0x6d, 0x98, 0x09, 0x14, 0x4c, 0x1f, 0x75, - 0x17, 0xc6, 0x98, 0x7e, 0x6b, 0xca, 0x8a, 0xb1, 0xd1, 0x47, 0xd0, 0x74, 0x09, 0xc7, 0x3d, 0xcc, - 0xb1, 0x96, 0x7d, 0xb5, 0x6c, 0xa5, 0xe0, 0xb2, 0xad, 0xf1, 0xb6, 0xa6, 0xac, 0x64, 0x0d, 0x7a, - 0x0f, 0x1a, 0xf6, 0x20, 0xf2, 0xf6, 0xe4, 0x21, 0x37, 0x7b, 0xf3, 0xd2, 0xa8, 0xc5, 0x1b, 0x02, - 0x69, 0x6b, 0xca, 0x52, 0xd8, 0x1f, 0x4f, 0x43, 0x9d, 0xe1, 0x80, 0x9b, 0xf7, 0xe1, 0x4c, 0x19, - 0x0b, 0x71, 0xb2, 0xda, 0x03, 0x62, 0xef, 0x85, 0x91, 0xab, 0xd5, 0x9c, 0x8c, 0x11, 0x82, 0x7a, - 0x48, 0x5f, 0x29, 0x55, 0xd7, 0x2c, 0xf9, 0x6d, 0xbe, 0x0d, 0x4b, 0x43, 0xdc, 0x84, 0x51, 0x95, - 0x6c, 0x82, 0xc2, 0x29, 0xcd, 0xda, 0x8c, 0xe0, 0xec, 0x33, 0xa9, 0x8b, 0xe4, 0x78, 0x39, 0x89, - 0x5a, 0xc1, 0xdc, 0x82, 0xe5, 0x22, 0xdb, 0x90, 0xf9, 0x5e, 0x48, 0x44, 0xb0, 0xc9, 0x7c, 0x4c, - 0x49, 0x2f, 0x9d, 0x95, 0x52, 0x34, 0xad, 0x92, 0x19, 0xf3, 0xb7, 0x55, 0x58, 0xb6, 0x48, 0xe8, - 0x3b, 0xfb, 0x24, 0x4e, 0x96, 0x27, 0x53, 0xee, 0xfc, 0x00, 0x6a, 0x98, 0x31, 0xed, 0x26, 0x0f, - 0x8e, 0xad, 0xa0, 0xb0, 0x04, 0x55, 0xf4, 0x0e, 0x2c, 0x61, 0xb7, 0x4b, 0xfb, 0x91, 0x1f, 0x85, - 0xf1, 0xb6, 0xa4, 0x53, 0xb5, 0xac, 0xe1, 0x09, 0x91, 0x70, 0x42, 0x19, 0x91, 0x0f, 0xbc, 0x1e, - 0xf9, 0x89, 0xac, 0xa1, 0x6a, 0x56, 0x16, 0x64, 0xda, 0x70, 0x6e, 0x48, 0x49, 0x5a, 0xe1, 0xd9, - 0xb2, 0xad, 0x52, 0x28, 0xdb, 0x4a, 0xc5, 0xa8, 0x8e, 0x10, 0xc3, 0x7c, 0x5d, 0x81, 0xc5, 0x34, - 0xb8, 0x34, 0xf9, 0x8b, 0xd0, 0x72, 0x35, 0x2c, 0x34, 0x2a, 0x32, 0x67, 0xa6, 0x80, 0x7c, 0x05, - 0x57, 0x2d, 0x56, 0x70, 0xcb, 0x30, 0xad, 0x0a, 0x6c, 0xbd, 0x75, 0x3d, 0xca, 0x89, 0x5c, 0x2f, - 0x88, 0xbc, 0x02, 0x10, 0x26, 0x19, 0xce, 0x98, 0x96, 0xb3, 0x19, 0x08, 0x32, 0xe1, 0x94, 0x3a, - 0xef, 0x2d, 0x12, 0x46, 0x0e, 0x37, 0x66, 0x24, 0x46, 0x0e, 0x26, 0xe3, 0xcd, 0x77, 0x5d, 0xec, - 0xf5, 0x42, 0xa3, 0x29, 0x45, 0x4e, 0xc6, 0xa6, 0x0f, 0x0b, 0x8f, 0xa8, 0xd8, 0xdf, 0x6e, 0x78, - 0x32, 0xa1, 0xf2, 0x3e, 0xd4, 0x05, 0x33, 0x21, 0x54, 0x37, 0xc0, 0x9e, 0x3d, 0x20, 0xb1, 0x1e, - 0x93, 0xb1, 0x48, 0x02, 0x1c, 0xf7, 0x43, 0xa3, 0x2a, 0xe1, 0xf2, 0xdb, 0xfc, 0x7d, 0x55, 0x49, - 0xba, 0xce, 0x58, 0xf8, 0xd5, 0x37, 0x00, 0xe5, 0x25, 0x49, 0x6d, 0xb8, 0x24, 0x29, 0x88, 0xfc, - 0x65, 0x4a, 0x92, 0x63, 0x3a, 0xe4, 0xcc, 0x08, 0x66, 0xd6, 0x19, 0x13, 0x82, 0xa0, 0x1b, 0x50, - 0xc7, 0x8c, 0x29, 0x85, 0x17, 0xf2, 0xb9, 0x46, 0x11, 0xff, 0xb5, 0x48, 0x12, 0xb5, 0x7d, 0x1b, - 0x5a, 0x09, 0xe8, 0x30, 0xb6, 0xad, 0x2c, 0xdb, 0x55, 0x00, 0x55, 0x73, 0x3f, 0xf0, 0x76, 0x7d, - 0x61, 0x52, 0x11, 0x08, 0x7a, 0xa9, 0xfc, 0x36, 0xef, 0xc4, 0x18, 0x52, 0xb6, 0x77, 0xa0, 0x41, - 0x39, 0x71, 0x63, 0xe1, 0x96, 0xb3, 0xc2, 0xa5, 0x84, 0x2c, 0x85, 0x64, 0xfe, 0xb9, 0x09, 0xe7, - 0x85, 0xc5, 0x9e, 0xca, 0x10, 0x5a, 0x67, 0xec, 0x2e, 0xe1, 0x98, 0x3a, 0xe1, 0x77, 0x23, 0x12, - 0x1c, 0xbc, 0x61, 0xc7, 0xe8, 0xc3, 0xb4, 0x8a, 0x40, 0x9d, 0x2d, 0x8f, 0xbd, 0xfd, 0xd2, 0xe4, - 0xd3, 0x9e, 0xab, 0xf6, 0x66, 0x7a, 0xae, 0xb2, 0x1e, 0xa8, 0x7e, 0x42, 0x3d, 0xd0, 0xe8, 0x36, - 0x38, 0xd3, 0x5c, 0x4f, 0xe7, 0x9b, 0xeb, 0x92, 0xd6, 0x62, 0xe6, 0xa8, 0xad, 0x45, 0xb3, 0xb4, - 0xb5, 0x70, 0x4b, 0xe3, 0xb8, 0x25, 0xd5, 0xfd, 0xed, 0xac, 0x07, 0x8e, 0xf4, 0xb5, 0x49, 0x9a, - 0x0c, 0x78, 0xa3, 0x4d, 0xc6, 0xa7, 0xb9, 0xa6, 0x41, 0xb5, 0xed, 0xef, 0x1d, 0x6d, 0x4f, 0x63, - 0xda, 0x87, 0xff, 0xbb, 0xd2, 0xfb, 0x17, 0xb2, 0xe2, 0x62, 0x7e, 0xaa, 0x83, 0xe4, 0xb0, 0x17, - 0xe7, 0x90, 0x38, 0x76, 0x75, 0xd2, 0x12, 0xdf, 0xe8, 0x3a, 0xd4, 0x85, 0x92, 0x75, 0x49, 0x7c, - 0x2e, 0xab, 0x4f, 0x61, 0x89, 0x75, 0xc6, 0x9e, 0x32, 0x62, 0x5b, 0x12, 0x09, 0xdd, 0x81, 0x56, - 0xe2, 0xf8, 0x3a, 0xb2, 0x2e, 0x66, 0x57, 0x24, 0x71, 0x12, 0x2f, 0x4b, 0xd1, 0xc5, 0xda, 0x1e, - 0x0d, 0x88, 0x2d, 0x0b, 0xc6, 0xc6, 0xf0, 0xda, 0xbb, 0xf1, 0x64, 0xb2, 0x36, 0x41, 0x47, 0x37, - 0x60, 0x5a, 0xdd, 0x73, 0xc8, 0x08, 0x9a, 0xbd, 0x79, 0x7e, 0x38, 0x99, 0xc6, 0xab, 0x34, 0xa2, - 0xf9, 0xa7, 0x0a, 0xbc, 0x95, 0x3a, 0x44, 0x1c, 0x4d, 0x71, 0xcd, 0xfe, 0xd5, 0x9f, 0xb8, 0x57, - 0x60, 0x5e, 0x36, 0x09, 0xe9, 0x75, 0x87, 0xba, 0x79, 0x2b, 0x40, 0xcd, 0xdf, 0x55, 0xe0, 0xf2, - 0xf0, 0x3e, 0x36, 0x06, 0x38, 0xe0, 0x89, 0x79, 0x4f, 0x62, 0x2f, 0xf1, 0x81, 0x57, 0x4d, 0x0f, - 0xbc, 0xdc, 0xfe, 0x6a, 0xf9, 0xfd, 0x99, 0x7f, 0xa8, 0xc2, 0x6c, 0xc6, 0x81, 0xca, 0x0e, 0x4c, - 0x51, 0x0c, 0x4a, 0xbf, 0x95, 0x6d, 0xa1, 0x3c, 0x14, 0x5a, 0x56, 0x06, 0x82, 0xf6, 0x00, 0x18, - 0x0e, 0xb0, 0x4b, 0x38, 0x09, 0x44, 0x26, 0x17, 0x11, 0xff, 0x70, 0xf2, 0xec, 0xb2, 0x13, 0xd3, - 0xb4, 0x32, 0xe4, 0x45, 0x35, 0x2b, 0x59, 0x87, 0x3a, 0x7f, 0xeb, 0x11, 0xfa, 0x02, 0xe6, 0x77, - 0xa9, 0x43, 0x76, 0x52, 0x41, 0xa6, 0xa5, 0x20, 0x4f, 0x26, 0x17, 0xe4, 0x7e, 0x96, 0xae, 0x55, - 0x60, 0x63, 0x5e, 0x83, 0xc5, 0x62, 0x3c, 0x09, 0x21, 0xa9, 0x8b, 0xfb, 0x89, 0xb6, 0xf4, 0xc8, - 0x44, 0xb0, 0x58, 0x8c, 0x1f, 0xf3, 0x9f, 0x55, 0x38, 0x9b, 0x90, 0x5b, 0xf7, 0x3c, 0x3f, 0xf2, - 0x6c, 0x79, 0x75, 0x58, 0x6a, 0x8b, 0x33, 0xd0, 0xe0, 0x94, 0x3b, 0x49, 0xe1, 0x23, 0x07, 0xe2, - 0xec, 0xe2, 0xbe, 0xef, 0x70, 0xca, 0xb4, 0x81, 0xe3, 0xa1, 0xb2, 0xfd, 0xcb, 0x88, 0x06, 0xa4, - 0x27, 0x33, 0x41, 0xd3, 0x4a, 0xc6, 0x62, 0x4e, 0x54, 0x35, 0xb2, 0xc4, 0x57, 0xca, 0x4c, 0xc6, - 0xd2, 0xef, 0x7d, 0xc7, 0x21, 0xb6, 0x50, 0x47, 0xa6, 0x09, 0x28, 0x40, 0x65, 0x73, 0xc1, 0x03, - 0xea, 0xf5, 0x75, 0x0b, 0xa0, 0x47, 0x42, 0x4e, 0x1c, 0x04, 0xf8, 0x40, 0x57, 0xfe, 0x6a, 0x80, - 0x3e, 0x84, 0x9a, 0x8b, 0x99, 0x3e, 0xe8, 0xae, 0xe5, 0xb2, 0x43, 0x99, 0x06, 0x3a, 0xdb, 0x98, - 0xa9, 0x93, 0x40, 0x2c, 0x6b, 0xbf, 0x0f, 0xcd, 0x18, 0xf0, 0xa5, 0x4a, 0xc2, 0xcf, 0x61, 0x2e, - 0x97, 0x7c, 0xd0, 0x73, 0x58, 0x4e, 0x3d, 0x2a, 0xcb, 0x50, 0x17, 0x81, 0x6f, 0x1d, 0x2a, 0x99, - 0x35, 0x82, 0x80, 0xf9, 0x12, 0x96, 0x84, 0xcb, 0xc8, 0xc0, 0x3f, 0xa1, 0xd6, 0xe6, 0x03, 0x68, - 0x25, 0x2c, 0x4b, 0x7d, 0xa6, 0x0d, 0xcd, 0xfd, 0xf8, 0x4a, 0x57, 0xf5, 0x36, 0xc9, 0xd8, 0x5c, - 0x07, 0x94, 0x95, 0x57, 0x9f, 0x40, 0xd7, 0xf3, 0x45, 0xf1, 0xd9, 0xe2, 0x71, 0x23, 0xd1, 0xe3, - 0x9a, 0xf8, 0xef, 0x55, 0x58, 0xd8, 0xa4, 0xf2, 0x8e, 0xe4, 0x84, 0x92, 0xdc, 0x35, 0x58, 0x0c, - 0xa3, 0xae, 0xeb, 0xf7, 0x22, 0x87, 0xe8, 0xa2, 0x40, 0x9f, 0xf4, 0x43, 0xf0, 0x71, 0xc9, 0x4f, - 0x28, 0x8b, 0x61, 0x3e, 0xd0, 0xdd, 0xaf, 0xfc, 0x46, 0x1f, 0xc2, 0xf9, 0xc7, 0xe4, 0x0b, 0xbd, - 0x9f, 0x4d, 0xc7, 0xef, 0x76, 0xa9, 0xd7, 0x8f, 0x99, 0x34, 0x24, 0x93, 0xd1, 0x08, 0x65, 0xa5, - 0xe2, 0x74, 0x79, 0xa9, 0x98, 0x74, 0xd0, 0x1b, 0xbe, 0xeb, 0x52, 0xae, 0x2b, 0xca, 0x1c, 0xcc, - 0xfc, 0x79, 0x05, 0x16, 0x53, 0xcd, 0x6a, 0xdb, 0xdc, 0x56, 0x31, 0xa4, 0x2c, 0x73, 0x39, 0x6b, - 0x99, 0x22, 0xea, 0x7f, 0x1e, 0x3e, 0xa7, 0xb2, 0xe1, 0xf3, 0xab, 0x2a, 0x9c, 0xdd, 0xa4, 0x3c, - 0x4e, 0x5c, 0xf4, 0x7f, 0xcd, 0xca, 0x25, 0x36, 0xa9, 0x1f, 0xcd, 0x26, 0x8d, 0x12, 0x9b, 0x74, - 0x60, 0xb9, 0xa8, 0x0c, 0x6d, 0x98, 0x33, 0xd0, 0x60, 0xf2, 0xd2, 0x59, 0xdd, 0x2b, 0xa8, 0x81, - 0xf9, 0xb3, 0x19, 0xb8, 0xf4, 0x29, 0xeb, 0x61, 0x9e, 0xdc, 0x19, 0xdd, 0xf7, 0x03, 0x79, 0xeb, - 0x7c, 0x32, 0x5a, 0x2c, 0xbc, 0x0c, 0x56, 0xc7, 0xbe, 0x0c, 0xd6, 0xc6, 0xbc, 0x0c, 0xd6, 0x8f, - 0xf4, 0x32, 0xd8, 0x38, 0xb1, 0x97, 0xc1, 0xe1, 0x5e, 0x6b, 0xba, 0xb4, 0xd7, 0x7a, 0x9e, 0xeb, - 0x47, 0x66, 0x64, 0xd8, 0x7c, 0x2b, 0x1b, 0x36, 0x63, 0xad, 0x33, 0xf6, 0x49, 0xa3, 0xf0, 0xa0, - 0xd6, 0x3c, 0xf4, 0x41, 0xad, 0x35, 0xfc, 0xa0, 0x56, 0xfe, 0x26, 0x03, 0x23, 0xdf, 0x64, 0xae, - 0xc0, 0x7c, 0x78, 0xe0, 0xd9, 0xa4, 0x97, 0xdc, 0x24, 0xce, 0xaa, 0x6d, 0xe7, 0xa1, 0xb9, 0x88, - 0x38, 0x55, 0x88, 0x88, 0xc4, 0x53, 0xe7, 0x32, 0x9e, 0x5a, 0x16, 0x27, 0xf3, 0x23, 0xdb, 0xdc, - 0xc2, 0x73, 0xc9, 0x42, 0xe9, 0x73, 0xc9, 0x7f, 0x4d, 0xb3, 0xf5, 0x19, 0xac, 0x8c, 0xb2, 0xb2, - 0x0e, 0x5e, 0x03, 0x66, 0xec, 0x01, 0xf6, 0xfa, 0xf2, 0x5a, 0x50, 0x76, 0xff, 0x7a, 0x38, 0xae, - 0x3b, 0xb8, 0xf9, 0x47, 0x80, 0xa5, 0xb4, 0xea, 0x17, 0x7f, 0xa9, 0x4d, 0xd0, 0x13, 0x58, 0x8c, - 0x9f, 0x97, 0xe2, 0x8b, 0x5c, 0x34, 0xee, 0xed, 0xa4, 0x7d, 0xb1, 0x7c, 0x52, 0x89, 0x66, 0x4e, - 0x21, 0x1b, 0xce, 0x17, 0x09, 0xa6, 0xcf, 0x34, 0xdf, 0x18, 0x43, 0x39, 0xc1, 0x3a, 0x8c, 0xc5, - 0xd5, 0x0a, 0x7a, 0x0e, 0xf3, 0xf9, 0xc7, 0x04, 0x94, 0x2b, 0x83, 0x4a, 0xdf, 0x37, 0xda, 0xe6, - 0x38, 0x94, 0x44, 0xfe, 0x17, 0xc2, 0x0d, 0x72, 0xf7, 0xe6, 0xc8, 0xcc, 0xdf, 0x08, 0x94, 0xbd, - 0x3c, 0xb4, 0xbf, 0x3e, 0x16, 0x27, 0xa1, 0xfe, 0x01, 0x34, 0xe3, 0xbb, 0xe4, 0xbc, 0x9a, 0x0b, - 0x37, 0xcc, 0xed, 0xc5, 0x3c, 0xbd, 0xdd, 0xd0, 0x9c, 0x42, 0x1f, 0xa9, 0xc5, 0xeb, 0x8c, 0x95, - 0x2c, 0xce, 0xdc, 0xa0, 0xb6, 0x4f, 0x97, 0xdc, 0x5a, 0x9a, 0x53, 0xe8, 0x3b, 0x30, 0x2b, 0xbe, - 0x76, 0xf4, 0xf3, 0xfe, 0x72, 0x47, 0xfd, 0x9a, 0xa4, 0x13, 0xff, 0x9a, 0xa4, 0x73, 0xcf, 0x65, - 0xfc, 0xa0, 0x5d, 0x72, 0xad, 0xa8, 0x09, 0xbc, 0x80, 0xb9, 0x4d, 0xc2, 0xd3, 0x5b, 0x00, 0x74, - 0xf9, 0x48, 0x77, 0x25, 0x6d, 0xb3, 0x88, 0x36, 0x7c, 0x91, 0x60, 0x4e, 0xa1, 0x5f, 0x57, 0xe0, - 0xf4, 0x26, 0xe1, 0xc5, 0xbe, 0x1a, 0xbd, 0x5b, 0xce, 0x64, 0x44, 0xff, 0xdd, 0x7e, 0x3c, 0x69, - 0x4c, 0xe6, 0xc9, 0x9a, 0x53, 0xe8, 0x37, 0x15, 0x38, 0x97, 0x11, 0x2c, 0xdb, 0x28, 0xa3, 0x1b, - 0xe3, 0x85, 0x2b, 0x69, 0xaa, 0xdb, 0x9f, 0x4c, 0xf8, 0xab, 0x8d, 0x0c, 0x49, 0x73, 0x0a, 0xed, - 0x48, 0x9b, 0xa4, 0x75, 0x31, 0xba, 0x54, 0x5a, 0x00, 0x27, 0xdc, 0x57, 0x46, 0x4d, 0x27, 0x76, - 0xf8, 0x04, 0x66, 0x37, 0x09, 0x8f, 0x0b, 0xb4, 0xbc, 0xa7, 0x15, 0x6a, 0xe7, 0x7c, 0xa8, 0x16, - 0x6b, 0x3a, 0xe9, 0x31, 0x4b, 0x8a, 0x56, 0xa6, 0x08, 0xc9, 0xc7, 0x6a, 0x69, 0xb5, 0x96, 0xf7, - 0x98, 0xf2, 0x1a, 0xc6, 0x9c, 0x42, 0x2f, 0x61, 0xb9, 0x3c, 0x55, 0xa2, 0xb7, 0x8f, 0x7c, 0x68, - 0xb6, 0xaf, 0x1d, 0x05, 0x35, 0x66, 0xf9, 0xf1, 0xfa, 0x5f, 0x5e, 0xaf, 0x54, 0xfe, 0xfa, 0x7a, - 0xa5, 0xf2, 0xaf, 0xd7, 0x2b, 0x95, 0xef, 0xdf, 0x3a, 0xe4, 0xd7, 0x5d, 0x99, 0x1f, 0x8c, 0x61, - 0x46, 0x6d, 0x87, 0x12, 0x8f, 0x77, 0xa7, 0x65, 0xbc, 0xdd, 0xfa, 0x77, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x17, 0x3e, 0x16, 0x5a, 0x4f, 0x26, 0x00, 0x00, + // 2489 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x4d, 0x73, 0x1b, 0x49, + 0xd5, 0x92, 0x2c, 0x59, 0x7a, 0x8a, 0xbf, 0x3a, 0xb1, 0x33, 0x51, 0x12, 0xe3, 0x1d, 0x48, 0xca, + 0x9b, 0xec, 0x4a, 0x95, 0x64, 0x77, 0xb3, 0x64, 0x97, 0xa5, 0xbc, 0x4e, 0x62, 0x67, 0x13, 0x27, + 0x66, 0x92, 0x5d, 0x2a, 0x10, 0xa0, 0x5a, 0xa3, 0xb6, 0x34, 0xab, 0xf9, 0xe8, 0xcc, 0xf4, 0x78, + 0x51, 0xaa, 0xb8, 0x00, 0xc5, 0x85, 0x3b, 0x55, 0x70, 0xa3, 0xf8, 0x0d, 0x14, 0x47, 0x4e, 0x14, + 0x1c, 0x29, 0x2e, 0x5c, 0xa8, 0x82, 0xca, 0x2f, 0xa1, 0xfa, 0x63, 0x3e, 0x35, 0x92, 0xbd, 0x38, + 0xf1, 0x02, 0x17, 0x7b, 0xfa, 0xf5, 0xeb, 0xd7, 0xaf, 0xdf, 0x57, 0xbf, 0xf7, 0x5a, 0x70, 0xd9, + 0x27, 0xd4, 0x0b, 0x88, 0x7f, 0x40, 0xfc, 0x8e, 0xf8, 0xb4, 0x98, 0xe7, 0x8f, 0x52, 0x9f, 0x6d, + 0xea, 0x7b, 0xcc, 0x43, 0x90, 0x40, 0x5a, 0xfa, 0xf0, 0xfd, 0xa0, 0x6d, 0x79, 0x1d, 0x4c, 0xad, + 0x8e, 0xe9, 0xf9, 0xa4, 0x73, 0x70, 0xad, 0xd3, 0x27, 0x2e, 0xf1, 0x31, 0x23, 0x3d, 0x89, 0xdf, + 0x7a, 0x27, 0xc1, 0x71, 0xb0, 0x39, 0xb0, 0x5c, 0xe2, 0x8f, 0x3a, 0x74, 0xd8, 0xe7, 0x80, 0xa0, + 0xe3, 0x10, 0x86, 0x8b, 0x56, 0x3d, 0xe8, 0x5b, 0x6c, 0x10, 0x76, 0xdb, 0xa6, 0xe7, 0x74, 0xb0, + 0xdf, 0xf7, 0xa8, 0xef, 0x7d, 0x2e, 0x3e, 0xde, 0x36, 0x7b, 0x9d, 0x83, 0x1b, 0x09, 0x01, 0x4c, + 0xa9, 0x6d, 0x99, 0x98, 0x59, 0x9e, 0xdb, 0x39, 0xb8, 0x86, 0x6d, 0x3a, 0xc0, 0xe3, 0xd4, 0xce, + 0xf7, 0x3d, 0xaf, 0x6f, 0x93, 0x8e, 0x18, 0x75, 0xc3, 0xfd, 0x0e, 0x71, 0x28, 0x53, 0x07, 0xd2, + 0xff, 0x31, 0x0f, 0x8b, 0xbb, 0xd8, 0xb5, 0xf6, 0x49, 0xc0, 0x0c, 0xf2, 0x3c, 0x24, 0x01, 0x43, + 0xcf, 0x60, 0x96, 0x1f, 0x53, 0x2b, 0xad, 0x97, 0x36, 0x9a, 0xd7, 0x77, 0xda, 0x09, 0x37, 0xed, + 0x88, 0x1b, 0xf1, 0xf1, 0x23, 0xb3, 0xd7, 0x3e, 0xb8, 0xd1, 0xa6, 0xc3, 0x7e, 0x9b, 0x73, 0xd3, + 0x4e, 0x71, 0xd3, 0x8e, 0xb8, 0x69, 0x1b, 0xb1, 0xc0, 0x0c, 0x41, 0x15, 0xb5, 0xa0, 0xee, 0x93, + 0x03, 0x2b, 0xb0, 0x3c, 0x57, 0x2b, 0xaf, 0x97, 0x36, 0x1a, 0x46, 0x3c, 0x46, 0x1a, 0xcc, 0xb9, + 0xde, 0x16, 0x36, 0x07, 0x44, 0xab, 0xac, 0x97, 0x36, 0xea, 0x46, 0x34, 0x44, 0xeb, 0xd0, 0xc4, + 0x94, 0x3e, 0xc0, 0x5d, 0x62, 0xdf, 0x27, 0x23, 0x6d, 0x56, 0x2c, 0x4c, 0x83, 0xf8, 0x5a, 0x4c, + 0xe9, 0x43, 0xec, 0x10, 0xad, 0x2a, 0x66, 0xa3, 0x21, 0xba, 0x00, 0x0d, 0x17, 0x3b, 0x24, 0xa0, + 0xd8, 0x24, 0x5a, 0x5d, 0xcc, 0x25, 0x00, 0xf4, 0x13, 0x58, 0x4e, 0x31, 0xfe, 0xd8, 0x0b, 0x7d, + 0x93, 0x68, 0x20, 0x8e, 0xfe, 0xe8, 0x78, 0x47, 0xdf, 0xcc, 0x93, 0x35, 0xc6, 0x77, 0x42, 0x3f, + 0x84, 0xaa, 0xb0, 0x29, 0xad, 0xb9, 0x5e, 0x79, 0xa5, 0xd2, 0x96, 0x64, 0x91, 0x0b, 0x73, 0xd4, + 0x0e, 0xfb, 0x96, 0x1b, 0x68, 0xa7, 0xc4, 0x0e, 0x4f, 0x8e, 0xb7, 0xc3, 0x96, 0xe7, 0xee, 0x5b, + 0xfd, 0x5d, 0xec, 0xe2, 0x3e, 0x71, 0x88, 0xcb, 0xf6, 0x04, 0x71, 0x23, 0xda, 0x04, 0xbd, 0x80, + 0xa5, 0x61, 0x18, 0x30, 0xcf, 0xb1, 0x5e, 0x90, 0x47, 0x94, 0xaf, 0x0d, 0xb4, 0x79, 0x21, 0xcd, + 0x87, 0xc7, 0xdb, 0xf8, 0x7e, 0x8e, 0xaa, 0x31, 0xb6, 0x0f, 0x37, 0x92, 0x61, 0xd8, 0x25, 0x9f, + 0x11, 0x5f, 0x58, 0xd7, 0x82, 0x34, 0x92, 0x14, 0x48, 0x9a, 0x91, 0xa5, 0x46, 0x81, 0xb6, 0xb8, + 0x5e, 0x91, 0x66, 0x14, 0x83, 0xd0, 0x06, 0x2c, 0x1e, 0x10, 0xdf, 0xda, 0x1f, 0x3d, 0xb6, 0xfa, + 0x2e, 0x66, 0xa1, 0x4f, 0xb4, 0x25, 0x61, 0x8a, 0x79, 0x30, 0x72, 0x60, 0x7e, 0x40, 0x6c, 0x87, + 0x8b, 0x7c, 0xcb, 0x27, 0xbd, 0x40, 0x5b, 0x16, 0xf2, 0xdd, 0x3e, 0xbe, 0x06, 0x05, 0x39, 0x23, + 0x4b, 0x9d, 0x33, 0xe6, 0x7a, 0x86, 0xf2, 0x14, 0xe9, 0x23, 0x48, 0x32, 0x96, 0x03, 0xa3, 0xcb, + 0xb0, 0xc0, 0x7c, 0x6c, 0x0e, 0x2d, 0xb7, 0xbf, 0x4b, 0xd8, 0xc0, 0xeb, 0x69, 0xa7, 0x85, 0x24, + 0x72, 0x50, 0x64, 0x02, 0x22, 0x2e, 0xee, 0xda, 0xa4, 0x27, 0x6d, 0xf1, 0xc9, 0x88, 0x92, 0x40, + 0x3b, 0x23, 0x4e, 0x71, 0xa3, 0x9d, 0x8a, 0x7d, 0xb9, 0x00, 0xd1, 0xbe, 0x33, 0xb6, 0xea, 0x8e, + 0xcb, 0xfc, 0x91, 0x51, 0x40, 0x0e, 0x0d, 0xa1, 0xc9, 0xcf, 0x11, 0x99, 0xc2, 0x8a, 0x30, 0x85, + 0x7b, 0xc7, 0x93, 0xd1, 0x4e, 0x42, 0xd0, 0x48, 0x53, 0x47, 0x6d, 0x40, 0x03, 0x1c, 0xec, 0x86, + 0x36, 0xb3, 0xa8, 0x4d, 0x24, 0x1b, 0x81, 0xb6, 0x2a, 0xc4, 0x54, 0x30, 0x83, 0xee, 0x03, 0xf8, + 0x64, 0x3f, 0xc2, 0x3b, 0x2b, 0x4e, 0x7e, 0x75, 0xda, 0xc9, 0x8d, 0x18, 0x5b, 0x9e, 0x38, 0xb5, + 0x9c, 0x6f, 0xce, 0x8f, 0x41, 0x4c, 0xa6, 0xbc, 0x5d, 0xb8, 0xb5, 0x26, 0x4c, 0xac, 0x60, 0x86, + 0xdb, 0xa2, 0x82, 0x8a, 0xa0, 0x75, 0x4e, 0x5a, 0x6b, 0x0a, 0x84, 0x76, 0xe0, 0x6b, 0xd8, 0x75, + 0x3d, 0x26, 0x8e, 0x1f, 0xb1, 0xb2, 0xad, 0xc2, 0xfb, 0x1e, 0x66, 0x83, 0x40, 0x6b, 0x89, 0x55, + 0x87, 0xa1, 0x71, 0x93, 0xb0, 0xdc, 0x80, 0x61, 0xdb, 0x16, 0x48, 0xf7, 0x6e, 0x6b, 0xe7, 0xa5, + 0x49, 0x64, 0xa1, 0xad, 0x3b, 0x70, 0x76, 0x82, 0x72, 0xd1, 0x12, 0x54, 0x86, 0x64, 0x24, 0x2e, + 0x85, 0x86, 0xc1, 0x3f, 0xd1, 0x19, 0xa8, 0x1e, 0x60, 0x3b, 0x24, 0x22, 0x8c, 0xd7, 0x0d, 0x39, + 0xb8, 0x55, 0x7e, 0xbf, 0xd4, 0xfa, 0x45, 0x09, 0x16, 0x73, 0xa2, 0x2a, 0x58, 0xff, 0x83, 0xf4, + 0xfa, 0x57, 0xe0, 0x38, 0xfb, 0x4f, 0xb0, 0xdf, 0x27, 0x2c, 0xc5, 0x88, 0xfe, 0xb7, 0x12, 0x68, + 0x39, 0x1d, 0x7e, 0xd7, 0x62, 0x83, 0xbb, 0x96, 0x4d, 0x02, 0x74, 0x13, 0xe6, 0x7c, 0x09, 0x53, + 0x57, 0xdd, 0xf9, 0x29, 0xaa, 0xdf, 0x99, 0x31, 0x22, 0x6c, 0xf4, 0x11, 0xd4, 0xf9, 0xd5, 0xdd, + 0xc3, 0x0c, 0x2b, 0xde, 0xd7, 0x8b, 0x56, 0xf2, 0x5d, 0x76, 0x15, 0xde, 0xce, 0x8c, 0x11, 0xaf, + 0x41, 0xef, 0x42, 0xd5, 0x1c, 0x84, 0xee, 0x50, 0x5c, 0x72, 0xcd, 0xeb, 0x17, 0x27, 0x2d, 0xde, + 0xe2, 0x48, 0x3b, 0x33, 0x86, 0xc4, 0xfe, 0xb8, 0x06, 0xb3, 0x14, 0xfb, 0x4c, 0xbf, 0x0b, 0x67, + 0x8a, 0xb6, 0xe0, 0x37, 0xab, 0x39, 0x20, 0xe6, 0x30, 0x08, 0x1d, 0x25, 0xe6, 0x78, 0x8c, 0x10, + 0xcc, 0x06, 0xd6, 0x0b, 0x29, 0xea, 0x8a, 0x21, 0xbe, 0xf5, 0x37, 0x61, 0x79, 0x6c, 0x37, 0xae, + 0x54, 0xc9, 0x1b, 0xa7, 0x70, 0x4a, 0x6d, 0xad, 0x87, 0xb0, 0xf2, 0x44, 0xc8, 0x22, 0xbe, 0x5e, + 0x4e, 0x22, 0x57, 0xd0, 0x77, 0x60, 0x35, 0xbf, 0x6d, 0x40, 0x3d, 0x37, 0x20, 0xdc, 0xd9, 0x44, + 0x3c, 0xb6, 0x48, 0x2f, 0x99, 0x15, 0x5c, 0xd4, 0x8d, 0x82, 0x19, 0xfd, 0x77, 0x65, 0x58, 0x35, + 0x48, 0xe0, 0xd9, 0x07, 0x24, 0x0a, 0x96, 0x27, 0x93, 0xee, 0x7c, 0x1f, 0x2a, 0x98, 0x52, 0x65, + 0x26, 0xf7, 0x5e, 0x59, 0x42, 0x61, 0x70, 0xaa, 0xe8, 0x2d, 0x58, 0xc6, 0x4e, 0xd7, 0xea, 0x87, + 0x5e, 0x18, 0x44, 0xc7, 0x12, 0x46, 0xd5, 0x30, 0xc6, 0x27, 0x78, 0xc0, 0x09, 0x84, 0x47, 0xde, + 0x73, 0x7b, 0xe4, 0xc7, 0x22, 0x87, 0xaa, 0x18, 0x69, 0x90, 0x6e, 0xc2, 0xd9, 0x31, 0x21, 0x29, + 0x81, 0xa7, 0xd3, 0xb6, 0x52, 0x2e, 0x6d, 0x2b, 0x64, 0xa3, 0x3c, 0x81, 0x0d, 0xfd, 0x65, 0x09, + 0x96, 0x12, 0xe7, 0x52, 0xe4, 0x2f, 0x40, 0xc3, 0x51, 0xb0, 0x40, 0x2b, 0x89, 0x98, 0x99, 0x00, + 0xb2, 0x19, 0x5c, 0x39, 0x9f, 0xc1, 0xad, 0x42, 0x4d, 0xa6, 0xee, 0xea, 0xe8, 0x6a, 0x94, 0x61, + 0x79, 0x36, 0xc7, 0xf2, 0x1a, 0x40, 0x10, 0x47, 0x38, 0xad, 0x26, 0x66, 0x53, 0x10, 0xa4, 0xc3, + 0x29, 0x79, 0xdf, 0x1b, 0x24, 0x08, 0x6d, 0xa6, 0xcd, 0x09, 0x8c, 0x0c, 0x4c, 0xf8, 0x9b, 0xe7, + 0x38, 0xd8, 0xed, 0x05, 0x5a, 0x5d, 0xb0, 0x1c, 0x8f, 0x75, 0x0f, 0x16, 0x1f, 0x58, 0xfc, 0x7c, + 0xfb, 0xc1, 0xc9, 0xb8, 0xca, 0x7b, 0x30, 0xcb, 0x37, 0xe3, 0x4c, 0x75, 0x7d, 0xec, 0x9a, 0x03, + 0x12, 0xc9, 0x31, 0x1e, 0xf3, 0x20, 0xc0, 0x70, 0x3f, 0xd0, 0xca, 0x02, 0x2e, 0xbe, 0xf5, 0x3f, + 0x94, 0x25, 0xa7, 0x9b, 0x94, 0x06, 0x5f, 0x7d, 0x01, 0x50, 0x9c, 0x92, 0x54, 0xc6, 0x53, 0x92, + 0x1c, 0xcb, 0x5f, 0x26, 0x25, 0x79, 0x45, 0x97, 0x9c, 0x1e, 0xc2, 0xdc, 0x26, 0xa5, 0x9c, 0x11, + 0x74, 0x0d, 0x66, 0x31, 0xa5, 0x52, 0xe0, 0xb9, 0x78, 0xae, 0x50, 0xf8, 0x7f, 0xc5, 0x92, 0x40, + 0x6d, 0xdd, 0x84, 0x46, 0x0c, 0x3a, 0x6c, 0xdb, 0x46, 0x7a, 0xdb, 0x75, 0x00, 0x99, 0x73, 0xdf, + 0x73, 0xf7, 0x3d, 0xae, 0x52, 0xee, 0x08, 0x6a, 0xa9, 0xf8, 0xd6, 0x6f, 0x45, 0x18, 0x82, 0xb7, + 0xb7, 0xa0, 0x6a, 0x31, 0xe2, 0x44, 0xcc, 0xad, 0xa6, 0x99, 0x4b, 0x08, 0x19, 0x12, 0x49, 0xff, + 0x73, 0x1d, 0xce, 0x71, 0x8d, 0x3d, 0x16, 0x2e, 0xb4, 0x49, 0xe9, 0x6d, 0xc2, 0xb0, 0x65, 0x07, + 0xdf, 0x09, 0x89, 0x3f, 0x7a, 0xcd, 0x86, 0xd1, 0x87, 0x9a, 0xf4, 0x40, 0x15, 0x2d, 0x5f, 0x79, + 0xf9, 0xa5, 0xc8, 0x27, 0x35, 0x57, 0xe5, 0xf5, 0xd4, 0x5c, 0x45, 0x35, 0xd0, 0xec, 0x09, 0xd5, + 0x40, 0x93, 0xcb, 0xe0, 0x54, 0x71, 0x5d, 0xcb, 0x16, 0xd7, 0x05, 0xa5, 0xc5, 0xdc, 0x51, 0x4b, + 0x8b, 0x7a, 0x61, 0x69, 0xe1, 0x14, 0xfa, 0x71, 0x43, 0x88, 0xfb, 0x5b, 0x69, 0x0b, 0x9c, 0x68, + 0x6b, 0xc7, 0x29, 0x32, 0xe0, 0xb5, 0x16, 0x19, 0x9f, 0x66, 0x8a, 0x06, 0x59, 0xb6, 0xbf, 0x7b, + 0xb4, 0x33, 0x4d, 0x29, 0x1f, 0xfe, 0xef, 0x52, 0xef, 0x9f, 0x8b, 0x8c, 0x8b, 0x7a, 0x89, 0x0c, + 0xe2, 0xcb, 0x9e, 0xdf, 0x43, 0xfc, 0xda, 0x55, 0x41, 0x8b, 0x7f, 0xa3, 0xab, 0x30, 0xcb, 0x85, + 0xac, 0x52, 0xe2, 0xb3, 0x69, 0x79, 0x72, 0x4d, 0x6c, 0x52, 0xfa, 0x98, 0x12, 0xd3, 0x10, 0x48, + 0xe8, 0x16, 0x34, 0x62, 0xc3, 0x57, 0x9e, 0x75, 0x21, 0xbd, 0x22, 0xf6, 0x93, 0x68, 0x59, 0x82, + 0xce, 0xd7, 0xf6, 0x2c, 0x9f, 0x98, 0x22, 0x61, 0xac, 0x8e, 0xaf, 0xbd, 0x1d, 0x4d, 0xc6, 0x6b, + 0x63, 0x74, 0x74, 0x0d, 0x6a, 0xb2, 0xcf, 0x21, 0x3c, 0xa8, 0x79, 0xfd, 0xdc, 0x78, 0x30, 0x8d, + 0x56, 0x29, 0x44, 0xfd, 0x4f, 0x25, 0x78, 0x23, 0x31, 0x88, 0xc8, 0x9b, 0xa2, 0x9c, 0xfd, 0xab, + 0xbf, 0x71, 0x2f, 0xc3, 0x82, 0x28, 0x12, 0x92, 0x76, 0x87, 0xec, 0xbc, 0xe5, 0xa0, 0xfa, 0xef, + 0x4b, 0x70, 0x69, 0xfc, 0x1c, 0x5b, 0x03, 0xec, 0xb3, 0x58, 0xbd, 0x27, 0x71, 0x96, 0xe8, 0xc2, + 0x2b, 0x27, 0x17, 0x5e, 0xe6, 0x7c, 0x95, 0xec, 0xf9, 0xf4, 0x3f, 0x96, 0xa1, 0x99, 0x32, 0xa0, + 0xa2, 0x0b, 0x93, 0x27, 0x83, 0xc2, 0x6e, 0x45, 0x59, 0x28, 0x2e, 0x85, 0x86, 0x91, 0x82, 0xa0, + 0x21, 0x00, 0xc5, 0x3e, 0x76, 0x08, 0x23, 0x3e, 0x8f, 0xe4, 0xdc, 0xe3, 0xef, 0x1f, 0x3f, 0xba, + 0xec, 0x45, 0x34, 0x8d, 0x14, 0x79, 0x9e, 0xcd, 0x8a, 0xad, 0x03, 0x15, 0xbf, 0xd5, 0x08, 0x7d, + 0x01, 0x0b, 0xfb, 0x96, 0x4d, 0xf6, 0x12, 0x46, 0x6a, 0x82, 0x91, 0x47, 0xc7, 0x67, 0xe4, 0x6e, + 0x9a, 0xae, 0x91, 0xdb, 0x46, 0xbf, 0x02, 0x4b, 0x79, 0x7f, 0xe2, 0x4c, 0x5a, 0x0e, 0xee, 0xc7, + 0xd2, 0x52, 0x23, 0x1d, 0xc1, 0x52, 0xde, 0x7f, 0xf4, 0x7f, 0x96, 0x61, 0x25, 0x26, 0xb7, 0xe9, + 0xba, 0x5e, 0xe8, 0x9a, 0xa2, 0x75, 0x58, 0xa8, 0x8b, 0x33, 0x50, 0x65, 0x16, 0xb3, 0xe3, 0xc4, + 0x47, 0x0c, 0xf8, 0xdd, 0xc5, 0x3c, 0xcf, 0x66, 0x16, 0x55, 0x0a, 0x8e, 0x86, 0x52, 0xf7, 0xcf, + 0x43, 0xcb, 0x27, 0x3d, 0x11, 0x09, 0xea, 0x46, 0x3c, 0xe6, 0x73, 0x3c, 0xab, 0x11, 0x29, 0xbe, + 0x14, 0x66, 0x3c, 0x16, 0x76, 0xef, 0xd9, 0x36, 0x31, 0xb9, 0x38, 0x52, 0x45, 0x40, 0x0e, 0x2a, + 0x8a, 0x0b, 0xe6, 0x5b, 0x6e, 0x5f, 0x95, 0x00, 0x6a, 0xc4, 0xf9, 0xc4, 0xbe, 0x8f, 0x47, 0x2a, + 0xf3, 0x97, 0x03, 0xf4, 0x21, 0x54, 0x1c, 0x4c, 0xd5, 0x45, 0x77, 0x25, 0x13, 0x1d, 0x8a, 0x24, + 0xd0, 0xde, 0xc5, 0x54, 0xde, 0x04, 0x7c, 0x59, 0xeb, 0x3d, 0xa8, 0x47, 0x80, 0x2f, 0x95, 0x12, + 0x7e, 0x0e, 0xf3, 0x99, 0xe0, 0x83, 0x9e, 0xc2, 0x6a, 0x62, 0x51, 0xe9, 0x0d, 0x55, 0x12, 0xf8, + 0xc6, 0xa1, 0x9c, 0x19, 0x13, 0x08, 0xe8, 0xcf, 0x61, 0x99, 0x9b, 0x8c, 0x70, 0xfc, 0x13, 0x2a, + 0x6d, 0x3e, 0x80, 0x46, 0xbc, 0x65, 0xa1, 0xcd, 0xb4, 0xa0, 0x7e, 0x10, 0xb5, 0x74, 0x65, 0x6d, + 0x13, 0x8f, 0xf5, 0x4d, 0x40, 0x69, 0x7e, 0xd5, 0x0d, 0x74, 0x35, 0x9b, 0x14, 0xaf, 0xe4, 0xaf, + 0x1b, 0x81, 0x1e, 0xe5, 0xc4, 0x7f, 0x2f, 0xc3, 0xe2, 0xb6, 0x25, 0x7a, 0x24, 0x27, 0x14, 0xe4, + 0xae, 0xc0, 0x52, 0x10, 0x76, 0x1d, 0xaf, 0x17, 0xda, 0x44, 0x25, 0x05, 0xea, 0xa6, 0x1f, 0x83, + 0x4f, 0x0b, 0x7e, 0x5c, 0x58, 0x14, 0xb3, 0x81, 0xaa, 0x7e, 0xc5, 0x37, 0xfa, 0x10, 0xce, 0x3d, + 0x24, 0x5f, 0xa8, 0xf3, 0x6c, 0xdb, 0x5e, 0xb7, 0x6b, 0xb9, 0xfd, 0x68, 0x93, 0xaa, 0xd8, 0x64, + 0x32, 0x42, 0x51, 0xaa, 0x58, 0x2b, 0x4e, 0x15, 0xe3, 0x0a, 0x7a, 0xcb, 0x73, 0x1c, 0x8b, 0xa9, + 0x8c, 0x32, 0x03, 0xd3, 0x7f, 0x56, 0x82, 0xa5, 0x44, 0xb2, 0x4a, 0x37, 0x37, 0xa5, 0x0f, 0x49, + 0xcd, 0x5c, 0x4a, 0x6b, 0x26, 0x8f, 0xfa, 0x9f, 0xbb, 0xcf, 0xa9, 0xb4, 0xfb, 0xfc, 0xb2, 0x0c, + 0x2b, 0xdb, 0x16, 0x8b, 0x02, 0x97, 0xf5, 0xbf, 0xa6, 0xe5, 0x02, 0x9d, 0xcc, 0x1e, 0x4d, 0x27, + 0xd5, 0x02, 0x9d, 0xb4, 0x61, 0x35, 0x2f, 0x0c, 0xa5, 0x98, 0x33, 0x50, 0xa5, 0xa2, 0xe9, 0x2c, + 0xfb, 0x0a, 0x72, 0xa0, 0xff, 0x74, 0x0e, 0x2e, 0x7e, 0x4a, 0x7b, 0x98, 0xc5, 0x3d, 0xa3, 0xbb, + 0x9e, 0x2f, 0xba, 0xce, 0x27, 0x23, 0xc5, 0xdc, 0xcb, 0x60, 0x79, 0xea, 0xcb, 0x60, 0x65, 0xca, + 0xcb, 0xe0, 0xec, 0x91, 0x5e, 0x06, 0xab, 0x27, 0xf6, 0x32, 0x38, 0x5e, 0x6b, 0xd5, 0x0a, 0x6b, + 0xad, 0xa7, 0x99, 0x7a, 0x64, 0x4e, 0xb8, 0xcd, 0x37, 0xd3, 0x6e, 0x33, 0x55, 0x3b, 0x53, 0x9f, + 0x34, 0x72, 0x0f, 0x6a, 0xf5, 0x43, 0x1f, 0xd4, 0x1a, 0xe3, 0x0f, 0x6a, 0xc5, 0x6f, 0x32, 0x30, + 0xf1, 0x4d, 0xe6, 0x32, 0x2c, 0x04, 0x23, 0xd7, 0x24, 0xbd, 0xb8, 0x93, 0xd8, 0x94, 0xc7, 0xce, + 0x42, 0x33, 0x1e, 0x71, 0x2a, 0xe7, 0x11, 0xb1, 0xa5, 0xce, 0xa7, 0x2c, 0xb5, 0xc8, 0x4f, 0x16, + 0x26, 0x96, 0xb9, 0xb9, 0xe7, 0x92, 0xc5, 0xc2, 0xe7, 0x92, 0xff, 0x9a, 0x62, 0xeb, 0x33, 0x58, + 0x9b, 0xa4, 0x65, 0xe5, 0xbc, 0x1a, 0xcc, 0x99, 0x03, 0xec, 0xf6, 0x45, 0x5b, 0x50, 0x54, 0xff, + 0x6a, 0x38, 0xad, 0x3a, 0xd0, 0x7f, 0x5d, 0x86, 0x95, 0x2d, 0x81, 0x97, 0xef, 0x9a, 0xa7, 0x9c, + 0xaa, 0x34, 0xc5, 0xa9, 0xc6, 0x9a, 0xb5, 0x1b, 0xb0, 0x68, 0x86, 0xbe, 0xcf, 0x53, 0x8c, 0x6c, + 0x3c, 0xcb, 0x83, 0x79, 0x78, 0xa4, 0x9c, 0x91, 0x74, 0x53, 0x59, 0xfa, 0xe8, 0x18, 0x3c, 0x51, + 0x78, 0x35, 0xad, 0xf0, 0x28, 0xf0, 0xd4, 0x5e, 0x4b, 0x5a, 0xf2, 0x0e, 0xac, 0xe6, 0x45, 0x73, + 0x78, 0xaf, 0xfc, 0xfa, 0x6f, 0x9b, 0xb0, 0x9c, 0xd4, 0x51, 0xfc, 0xaf, 0x65, 0x12, 0xf4, 0x08, + 0x96, 0xa2, 0x07, 0xbb, 0xa8, 0x35, 0x8e, 0xa6, 0xbd, 0x46, 0xb5, 0x2e, 0x14, 0x4f, 0x4a, 0x06, + 0xf4, 0x19, 0x64, 0xc2, 0xb9, 0x3c, 0xc1, 0xe4, 0xe1, 0xeb, 0x1b, 0x53, 0x28, 0xc7, 0x58, 0x87, + 0x6d, 0xb1, 0x51, 0x42, 0x4f, 0x61, 0x21, 0xfb, 0x3c, 0x83, 0x32, 0x89, 0x65, 0xe1, 0x8b, 0x51, + 0x4b, 0x9f, 0x86, 0x12, 0xf3, 0xff, 0x8c, 0x3b, 0x56, 0xe6, 0x25, 0x02, 0xe9, 0xd9, 0x1e, 0x4b, + 0xd1, 0x5b, 0x4e, 0xeb, 0xeb, 0x53, 0x71, 0x62, 0xea, 0x1f, 0x40, 0x3d, 0xea, 0xce, 0x67, 0xc5, + 0x9c, 0xeb, 0xd9, 0xb7, 0x96, 0xb2, 0xf4, 0xf6, 0x03, 0x7d, 0x06, 0x7d, 0x24, 0x17, 0x6f, 0x52, + 0x5a, 0xb0, 0x38, 0xd5, 0x93, 0x6e, 0x9d, 0x2e, 0xe8, 0x03, 0xeb, 0x33, 0xe8, 0xdb, 0xd0, 0xe4, + 0x5f, 0x7b, 0xea, 0x07, 0x13, 0xab, 0x6d, 0xf9, 0xfb, 0x9c, 0x76, 0xf4, 0xfb, 0x9c, 0xf6, 0x1d, + 0x87, 0xb2, 0x51, 0xab, 0xa0, 0x51, 0xab, 0x08, 0x3c, 0x83, 0xf9, 0x6d, 0xc2, 0x92, 0xbe, 0x0a, + 0xba, 0x74, 0xa4, 0xee, 0x53, 0x4b, 0xcf, 0xa3, 0x8d, 0xb7, 0x66, 0xf4, 0x19, 0xf4, 0xab, 0x12, + 0x9c, 0xde, 0x26, 0x2c, 0xdf, 0xa9, 0x40, 0x6f, 0x17, 0x6f, 0x32, 0xa1, 0xa3, 0xd1, 0x7a, 0x78, + 0x5c, 0x6f, 0xcb, 0x92, 0xd5, 0x67, 0xd0, 0x6f, 0x4a, 0x70, 0x36, 0xc5, 0x58, 0xba, 0xf5, 0x80, + 0xae, 0x4d, 0x67, 0xae, 0xa0, 0x4d, 0xd1, 0xfa, 0xe4, 0x98, 0xbf, 0x83, 0x49, 0x91, 0xd4, 0x67, + 0xd0, 0x9e, 0xd0, 0x49, 0x52, 0x69, 0xa0, 0x8b, 0x85, 0x25, 0x45, 0xbc, 0xfb, 0xda, 0xa4, 0xe9, + 0x58, 0x0f, 0x9f, 0x40, 0x73, 0x9b, 0xb0, 0x28, 0xe5, 0xcd, 0x5a, 0x5a, 0xae, 0x1a, 0xc9, 0xba, + 0x6a, 0x3e, 0x4b, 0x16, 0x16, 0xb3, 0x2c, 0x69, 0xa5, 0xd2, 0xba, 0xac, 0xaf, 0x16, 0xe6, 0xbf, + 0x59, 0x8b, 0x29, 0xce, 0x0a, 0xf5, 0x19, 0xf4, 0x1c, 0x56, 0x8b, 0x2f, 0x1f, 0xf4, 0xe6, 0x91, + 0xd3, 0x90, 0xd6, 0x95, 0xa3, 0xa0, 0xe6, 0x0e, 0x94, 0x0d, 0xbf, 0xd9, 0x03, 0x15, 0xde, 0x5a, + 0xd9, 0x03, 0x15, 0x47, 0x6f, 0x7d, 0xe6, 0xe3, 0xcd, 0xbf, 0xbc, 0x5c, 0x2b, 0xfd, 0xf5, 0xe5, + 0x5a, 0xe9, 0x5f, 0x2f, 0xd7, 0x4a, 0xdf, 0xbb, 0x71, 0xc8, 0xaf, 0xf1, 0x52, 0x3f, 0x1d, 0xc4, + 0xd4, 0x32, 0x6d, 0x8b, 0xb8, 0xac, 0x5b, 0x13, 0xde, 0x7c, 0xe3, 0xdf, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xdd, 0xf3, 0x1b, 0xaa, 0x59, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2670,6 +2815,7 @@ type RepoServerServiceClient interface { GetGitDirectories(ctx context.Context, in *GitDirectoriesRequest, opts ...grpc.CallOption) (*GitDirectoriesResponse, error) // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths UpdateRevisionForPaths(ctx context.Context, in *UpdateRevisionForPathsRequest, opts ...grpc.CallOption) (*UpdateRevisionForPathsResponse, error) + GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) } type repoServerServiceClient struct { @@ -2831,6 +2977,15 @@ func (c *repoServerServiceClient) UpdateRevisionForPaths(ctx context.Context, in return out, nil } +func (c *repoServerServiceClient) GetChangeRevision(ctx context.Context, in *ChangeRevisionRequest, opts ...grpc.CallOption) (*ChangeRevisionResponse, error) { + out := new(ChangeRevisionResponse) + err := c.cc.Invoke(ctx, "/repository.RepoServerService/GetChangeRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // RepoServerServiceServer is the server API for RepoServerService service. type RepoServerServiceServer interface { // GenerateManifest generates manifest for application in specified repo name and revision @@ -2861,6 +3016,7 @@ type RepoServerServiceServer interface { GetGitDirectories(context.Context, *GitDirectoriesRequest) (*GitDirectoriesResponse, error) // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths UpdateRevisionForPaths(context.Context, *UpdateRevisionForPathsRequest) (*UpdateRevisionForPathsResponse, error) + GetChangeRevision(context.Context, *ChangeRevisionRequest) (*ChangeRevisionResponse, error) } // UnimplementedRepoServerServiceServer can be embedded to have forward compatible implementations. @@ -2909,6 +3065,9 @@ func (*UnimplementedRepoServerServiceServer) GetGitDirectories(ctx context.Conte func (*UnimplementedRepoServerServiceServer) UpdateRevisionForPaths(ctx context.Context, req *UpdateRevisionForPathsRequest) (*UpdateRevisionForPathsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateRevisionForPaths not implemented") } +func (*UnimplementedRepoServerServiceServer) GetChangeRevision(ctx context.Context, req *ChangeRevisionRequest) (*ChangeRevisionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetChangeRevision not implemented") +} func RegisterRepoServerServiceServer(s *grpc.Server, srv RepoServerServiceServer) { s.RegisterService(&_RepoServerService_serviceDesc, srv) @@ -3174,6 +3333,24 @@ func _RepoServerService_UpdateRevisionForPaths_Handler(srv interface{}, ctx cont return interceptor(ctx, in, info, handler) } +func _RepoServerService_GetChangeRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RepoServerServiceServer).GetChangeRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/repository.RepoServerService/GetChangeRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RepoServerServiceServer).GetChangeRevision(ctx, req.(*ChangeRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _RepoServerService_serviceDesc = grpc.ServiceDesc{ ServiceName: "repository.RepoServerService", HandlerType: (*RepoServerServiceServer)(nil), @@ -3230,6 +3407,10 @@ var _RepoServerService_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateRevisionForPaths", Handler: _RepoServerService_UpdateRevisionForPaths_Handler, }, + { + MethodName: "GetChangeRevision", + Handler: _RepoServerService_GetChangeRevision_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -5498,6 +5679,116 @@ func (m *UpdateRevisionForPathsResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *ChangeRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Repo != nil { + { + size, err := m.Repo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintRepository(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if len(m.Paths) > 0 { + for iNdEx := len(m.Paths) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Paths[iNdEx]) + copy(dAtA[i:], m.Paths[iNdEx]) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Paths[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.PreviousRevision) > 0 { + i -= len(m.PreviousRevision) + copy(dAtA[i:], m.PreviousRevision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.PreviousRevision))) + i-- + dAtA[i] = 0x22 + } + if len(m.CurrentRevision) > 0 { + i -= len(m.CurrentRevision) + copy(dAtA[i:], m.CurrentRevision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.CurrentRevision))) + i-- + dAtA[i] = 0x1a + } + if len(m.Namespace) > 0 { + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0x12 + } + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = encodeVarintRepository(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ChangeRevisionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ChangeRevisionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChangeRevisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintRepository(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintRepository(dAtA []byte, offset int, v uint64) int { offset -= sovRepository(v) base := offset @@ -6518,6 +6809,60 @@ func (m *UpdateRevisionForPathsResponse) Size() (n int) { return n } +func (m *ChangeRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AppName) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.Namespace) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.CurrentRevision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + l = len(m.PreviousRevision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if len(m.Paths) > 0 { + for _, s := range m.Paths { + l = len(s) + n += 1 + l + sovRepository(uint64(l)) + } + } + if m.Repo != nil { + l = m.Repo.Size() + n += 1 + l + sovRepository(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChangeRevisionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovRepository(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovRepository(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -12968,6 +13313,336 @@ func (m *UpdateRevisionForPathsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ChangeRevisionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreviousRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PreviousRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRepository + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Repo == nil { + m.Repo = &v1alpha1.Repository{} + } + if err := m.Repo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ChangeRevisionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ChangeRevisionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ChangeRevisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRepository + } + 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 ErrInvalidLengthRepository + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRepository + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Revision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRepository(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthRepository + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipRepository(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/reposerver/repository/cf_repository.go b/reposerver/repository/cf_repository.go new file mode 100644 index 0000000000000..2e2648ad08006 --- /dev/null +++ b/reposerver/repository/cf_repository.go @@ -0,0 +1,105 @@ +package repository + +import ( + "context" + goio "io" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/reposerver/apiclient" + argopath "github.com/argoproj/argo-cd/v3/util/app/path" + "github.com/argoproj/argo-cd/v3/util/git" + "github.com/argoproj/argo-cd/v3/util/io" + "github.com/argoproj/argo-cd/v3/util/kustomize" + + log "github.com/sirupsen/logrus" +) + +func (s *Service) getCacheKeyWithKustomizeComponents( + revision string, + repo *v1alpha1.Repository, + source *v1alpha1.ApplicationSource, + settings operationSettings, + gitClient git.Client, +) (string, error) { + closer, err := s.repoLock.Lock(gitClient.Root(), revision, settings.allowConcurrent, func() (goio.Closer, error) { + return s.checkoutRevision(gitClient, revision, s.initConstants.SubmoduleEnabled) + }) + if err != nil { + return "", err + } + + defer io.Close(closer) + + appPath, err := argopath.Path(gitClient.Root(), source.Path) + if err != nil { + return "", err + } + + k := kustomize.NewKustomizeApp(gitClient.Root(), appPath, repo.GetGitCreds(s.gitCredsStore), repo.Repo, source.Kustomize.Version, "", "") + + resolveRevisionFunc := func(repoURL, revision string, _ git.Creds) (string, error) { + cloneRepo := *repo + cloneRepo.Repo = repoURL + _, res, err := s.newClientResolveRevision(&cloneRepo, revision) + return res, err + } + + return k.GetCacheKeyWithComponents(revision, source.Kustomize, resolveRevisionFunc) +} + +func (s *Service) GetChangeRevision(_ context.Context, request *apiclient.ChangeRevisionRequest) (*apiclient.ChangeRevisionResponse, error) { + logCtx := log.WithFields(log.Fields{"application": request.AppName, "appNamespace": request.Namespace}) + + repo := request.GetRepo() + currentRevision := request.GetCurrentRevision() + previousRevision := request.GetPreviousRevision() + refreshPaths := request.GetPaths() + + if repo == nil { + return nil, status.Error(codes.InvalidArgument, "must pass a valid repo") + } + + if len(refreshPaths) == 0 { + return nil, status.Error(codes.InvalidArgument, "must pass a refresh path") + } + + gitClientOpts := git.WithCache(s.cache, true) + gitClient, revision, err := s.newClientResolveRevision(repo, currentRevision, gitClientOpts) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to resolve git revision %s: %v", revision, err) + } + + s.metricsServer.IncPendingRepoRequest(repo.Repo) + defer s.metricsServer.DecPendingRepoRequest(repo.Repo) + + closer, err := s.repoLock.Lock(gitClient.Root(), revision, true, func() (goio.Closer, error) { + return s.checkoutRevision(gitClient, revision, false) + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to checkout git repo %s with revision %s: %v", repo.Repo, revision, err) + } + defer io.Close(closer) + revisions, err := gitClient.ListRevisions(previousRevision, revision) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get revisions %s..%s", previousRevision, revision) + } + for _, rev := range revisions { + files, err := gitClient.DiffTree(rev) + if err != nil { + continue + } + changedFiles := argopath.AppFilesHaveChanged(refreshPaths, files) + if changedFiles { + logCtx.Debugf("changes found for application %s in repo %s from revision %s to revision %s", request.AppName, repo.Repo, previousRevision, revision) + return &apiclient.ChangeRevisionResponse{ + Revision: rev, + }, nil + } + } + + logCtx.Debugf("changes not found for application %s in repo %s from revision %s to revision %s", request.AppName, repo.Repo, previousRevision, revision) + return &apiclient.ChangeRevisionResponse{}, nil +} diff --git a/reposerver/repository/repository.go b/reposerver/repository/repository.go index cdde7d3ebd136..1abccf6bcd2dd 100644 --- a/reposerver/repository/repository.go +++ b/reposerver/repository/repository.go @@ -319,8 +319,26 @@ func (s *Service) runRepoOperation( return err } + cacheKey := revision + + if source.Kustomize != nil && len(source.Kustomize.Components) > 0 { + cacheKey, err = s.getCacheKeyWithKustomizeComponents( + revision, + repo, + source, + settings, + gitClient, + ) + if err != nil { + log.WithError(err). + WithField("repo", repo.Repo). + Warn("failed to calculate cache key with components, using only the revision of the base repository") + cacheKey = revision + } + } + if !settings.noCache { - if ok, err := cacheFn(revision, repoRefs, true); ok { + if ok, err := cacheFn(cacheKey, repoRefs, true); ok { return err } } @@ -418,7 +436,7 @@ func (s *Service) runRepoOperation( // Here commitSHA refers to the SHA of the actual commit, whereas revision refers to the branch/tag name etc // We use the commitSHA to generate manifests and store them in cache, and revision to retrieve them from cache - return operation(gitClient.Root(), commitSHA, revision, func() (*operationContext, error) { + return operation(gitClient.Root(), commitSHA, cacheKey, func() (*operationContext, error) { var signature string if verifyCommit { // When the revision is an annotated tag, we need to pass the unresolved revision (i.e. the tag name) @@ -1421,7 +1439,7 @@ func GenerateManifests(ctx context.Context, appPath, repoRoot, revision string, targetObjs, _, commands, err = k.Build(q.ApplicationSource.Kustomize, q.KustomizeOptions, env, &kustomize.BuildOpts{ KubeVersion: text.SemVer(q.ApplicationSource.GetKubeVersionOrDefault(q.KubeVersion)), APIVersions: q.ApplicationSource.GetAPIVersionsOrDefault(q.ApiVersions), - }) + }, q.Namespace) case v1alpha1.ApplicationSourceTypePlugin: pluginName := "" if q.ApplicationSource.Plugin != nil { @@ -2201,7 +2219,7 @@ func populateKustomizeAppDetails(res *apiclient.RepoAppDetailsResponse, q *apicl ApplicationSource: q.Source, } env := newEnv(&fakeManifestRequest, reversion) - _, images, _, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env, nil) + _, images, _, err := k.Build(q.Source.Kustomize, q.KustomizeOptions, env, nil, "") if err != nil { return err } diff --git a/reposerver/repository/repository.proto b/reposerver/repository/repository.proto index 007088e08863f..412400fc32452 100644 --- a/reposerver/repository/repository.proto +++ b/reposerver/repository/repository.proto @@ -3,6 +3,8 @@ option go_package = "github.com/argoproj/argo-cd/v3/reposerver/apiclient"; package repository; +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1/generated.proto"; import "google/protobuf/empty.proto"; @@ -296,6 +298,19 @@ message UpdateRevisionForPathsResponse { string revision = 2; } +message ChangeRevisionRequest { + string appName = 1; + string namespace = 2; + string currentRevision = 3; + string previousRevision = 4; + repeated string paths = 5; + github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Repository repo = 6; +} + +message ChangeRevisionResponse { + string revision = 1; +} + // ManifestService service RepoServerService { @@ -354,4 +369,7 @@ service RepoServerService { // UpdateRevisionForPaths will compare two revisions and update the cache with the new revision if no changes are detected in the provided paths rpc UpdateRevisionForPaths(UpdateRevisionForPathsRequest) returns (UpdateRevisionForPathsResponse) { } + + rpc GetChangeRevision(ChangeRevisionRequest) returns (ChangeRevisionResponse) { + } } diff --git a/reposerver/repository/repository_test.go b/reposerver/repository/repository_test.go index 8457b1f3852bf..e96fc3540a95e 100644 --- a/reposerver/repository/repository_test.go +++ b/reposerver/repository/repository_test.go @@ -1847,7 +1847,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { }, }) require.NoError(t, err) - assert.EqualValues(t, []string{"gcr.io/heptio-images/ks-guestbook-demo:0.2"}, details.Kustomize.Images) + assert.Equal(t, []string{"quay.io/argoprojlabs/argocd-e2e-container:0.2"}, details.Kustomize.Images) }) }) t.Run("No app specific override", func(t *testing.T) { @@ -1862,7 +1862,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { AppName: "testapp", }) require.NoError(t, err) - assert.EqualValues(t, []string{"gcr.io/heptio-images/ks-guestbook-demo:0.2"}, details.Kustomize.Images) + assert.Equal(t, []string{"quay.io/argoprojlabs/argocd-e2e-container:0.2"}, details.Kustomize.Images) }) }) t.Run("Only app specific override", func(t *testing.T) { @@ -1877,7 +1877,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { AppName: "testapp", }) require.NoError(t, err) - assert.EqualValues(t, []string{"gcr.io/heptio-images/ks-guestbook-demo:0.3"}, details.Kustomize.Images) + assert.Equal(t, []string{"quay.io/argoprojlabs/argocd-e2e-container:0.3"}, details.Kustomize.Images) }) }) t.Run("App specific override", func(t *testing.T) { @@ -1892,7 +1892,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { AppName: "testapp", }) require.NoError(t, err) - assert.EqualValues(t, []string{"gcr.io/heptio-images/ks-guestbook-demo:0.3"}, details.Kustomize.Images) + assert.Equal(t, []string{"quay.io/argoprojlabs/argocd-e2e-container:0.3"}, details.Kustomize.Images) }) }) t.Run("App specific overrides containing non-mergeable field", func(t *testing.T) { @@ -1907,7 +1907,7 @@ func TestGetAppDetailsWithAppParameterFile(t *testing.T) { AppName: "unmergeable", }) require.NoError(t, err) - assert.EqualValues(t, []string{"gcr.io/heptio-images/ks-guestbook-demo:0.3"}, details.Kustomize.Images) + assert.Equal(t, []string{"quay.io/argoprojlabs/argocd-e2e-container:0.3"}, details.Kustomize.Images) }) }) t.Run("Broken app-specific overrides", func(t *testing.T) { @@ -1979,7 +1979,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { require.True(t, ok) image, ok, _ := unstructured.NestedString(containers[0].(map[string]any), "image") require.True(t, ok) - assert.Equal(t, "gcr.io/heptio-images/ks-guestbook-demo:0.2", image) + assert.Equal(t, "quay.io/argoprojlabs/argocd-e2e-container:0.2", image) }) }) @@ -2009,7 +2009,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { require.True(t, ok) image, ok, _ := unstructured.NestedString(containers[0].(map[string]any), "image") require.True(t, ok) - assert.Equal(t, "gcr.io/heptio-images/ks-guestbook-demo:0.2", image) + assert.Equal(t, "quay.io/argoprojlabs/argocd-e2e-container:0.2", image) }) }) @@ -2040,7 +2040,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { require.True(t, ok) image, ok, _ := unstructured.NestedString(containers[0].(map[string]any), "image") require.True(t, ok) - assert.Equal(t, "gcr.io/heptio-images/ks-guestbook-demo:0.3", image) + assert.Equal(t, "quay.io/argoprojlabs/argocd-e2e-container:0.3", image) }) }) @@ -2093,7 +2093,7 @@ func TestGenerateManifestsWithAppParameterFile(t *testing.T) { require.True(t, ok) image, ok, _ := unstructured.NestedString(containers[0].(map[string]any), "image") require.True(t, ok) - assert.Equal(t, "gcr.io/heptio-images/ks-guestbook-demo:0.1", image) + assert.Equal(t, "quay.io/argoprojlabs/argocd-e2e-container:0.1", image) }) }) diff --git a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-broken.yaml b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-broken.yaml index a2a93cfc125f2..88aed61dbb297 100644 --- a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-broken.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-broken.yaml @@ -1,4 +1,4 @@ aloi kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.2 + - quay.io/argoprojlabs/argocd-e2e-container:0.2 diff --git a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-testapp.yaml b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-testapp.yaml index 4ae4c973e35b9..d9a3e8970893b 100644 --- a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-testapp.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-testapp.yaml @@ -1,3 +1,3 @@ kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.3 + - quay.io/argoprojlabs/argocd-e2e-container:0.3 diff --git a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-unmergeable.yaml b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-unmergeable.yaml index baae7e746739b..aa5422fafd76c 100644 --- a/reposerver/repository/testdata/app-parameters/multi/.argocd-source-unmergeable.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/.argocd-source-unmergeable.yaml @@ -1,6 +1,6 @@ repo: https://somewhere kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.3 + - quay.io/argoprojlabs/argocd-e2e-container:0.3 invalid: - I don't know diff --git a/reposerver/repository/testdata/app-parameters/multi/.argocd-source.yaml b/reposerver/repository/testdata/app-parameters/multi/.argocd-source.yaml index 592624a909f66..631fd809f58fa 100644 --- a/reposerver/repository/testdata/app-parameters/multi/.argocd-source.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/.argocd-source.yaml @@ -1,3 +1,3 @@ kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.2 \ No newline at end of file + - quay.io/argoprojlabs/argocd-e2e-container:0.2 \ No newline at end of file diff --git a/reposerver/repository/testdata/app-parameters/multi/guestbook.yaml b/reposerver/repository/testdata/app-parameters/multi/guestbook.yaml index 7afcc593a6622..b4ce7a199b73e 100644 --- a/reposerver/repository/testdata/app-parameters/multi/guestbook.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/guestbook.yaml @@ -12,7 +12,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: guestbook-ui ports: - containerPort: 81 diff --git a/reposerver/repository/testdata/app-parameters/multi/kustomization.yaml b/reposerver/repository/testdata/app-parameters/multi/kustomization.yaml index 4b35aa5881430..78655aff5fe5b 100644 --- a/reposerver/repository/testdata/app-parameters/multi/kustomization.yaml +++ b/reposerver/repository/testdata/app-parameters/multi/kustomization.yaml @@ -4,5 +4,5 @@ kind: Kustomization resources: - guestbook.yaml images: -- name: gcr.io/heptio-images/ks-guestbook-demo +- name: quay.io/argoprojlabs/argocd-e2e-container newTag: "0.1" diff --git a/reposerver/repository/testdata/app-parameters/single-app-only/.argocd-source-testapp.yaml b/reposerver/repository/testdata/app-parameters/single-app-only/.argocd-source-testapp.yaml index 4ae4c973e35b9..d9a3e8970893b 100644 --- a/reposerver/repository/testdata/app-parameters/single-app-only/.argocd-source-testapp.yaml +++ b/reposerver/repository/testdata/app-parameters/single-app-only/.argocd-source-testapp.yaml @@ -1,3 +1,3 @@ kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.3 + - quay.io/argoprojlabs/argocd-e2e-container:0.3 diff --git a/reposerver/repository/testdata/app-parameters/single-app-only/guestbook.yaml b/reposerver/repository/testdata/app-parameters/single-app-only/guestbook.yaml index 7afcc593a6622..b4ce7a199b73e 100644 --- a/reposerver/repository/testdata/app-parameters/single-app-only/guestbook.yaml +++ b/reposerver/repository/testdata/app-parameters/single-app-only/guestbook.yaml @@ -12,7 +12,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: guestbook-ui ports: - containerPort: 81 diff --git a/reposerver/repository/testdata/app-parameters/single-app-only/kustomization.yaml b/reposerver/repository/testdata/app-parameters/single-app-only/kustomization.yaml index 4b35aa5881430..78655aff5fe5b 100644 --- a/reposerver/repository/testdata/app-parameters/single-app-only/kustomization.yaml +++ b/reposerver/repository/testdata/app-parameters/single-app-only/kustomization.yaml @@ -4,5 +4,5 @@ kind: Kustomization resources: - guestbook.yaml images: -- name: gcr.io/heptio-images/ks-guestbook-demo +- name: quay.io/argoprojlabs/argocd-e2e-container newTag: "0.1" diff --git a/reposerver/repository/testdata/app-parameters/single-global-helm/templates/deployment.yaml b/reposerver/repository/testdata/app-parameters/single-global-helm/templates/deployment.yaml index 2702a963beb4f..327d45ab5855f 100644 --- a/reposerver/repository/testdata/app-parameters/single-global-helm/templates/deployment.yaml +++ b/reposerver/repository/testdata/app-parameters/single-global-helm/templates/deployment.yaml @@ -12,7 +12,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:{{.Values.image.tag}} + - image: quay.io/argoprojlabs/argocd-e2e-container:{{.Values.image.tag}} name: guestbook-ui ports: - containerPort: 81 diff --git a/reposerver/repository/testdata/app-parameters/single-global/.argocd-source.yaml b/reposerver/repository/testdata/app-parameters/single-global/.argocd-source.yaml index 592624a909f66..631fd809f58fa 100644 --- a/reposerver/repository/testdata/app-parameters/single-global/.argocd-source.yaml +++ b/reposerver/repository/testdata/app-parameters/single-global/.argocd-source.yaml @@ -1,3 +1,3 @@ kustomize: images: - - gcr.io/heptio-images/ks-guestbook-demo:0.2 \ No newline at end of file + - quay.io/argoprojlabs/argocd-e2e-container:0.2 \ No newline at end of file diff --git a/reposerver/repository/testdata/app-parameters/single-global/guestbook.yaml b/reposerver/repository/testdata/app-parameters/single-global/guestbook.yaml index 7afcc593a6622..b4ce7a199b73e 100644 --- a/reposerver/repository/testdata/app-parameters/single-global/guestbook.yaml +++ b/reposerver/repository/testdata/app-parameters/single-global/guestbook.yaml @@ -12,7 +12,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: guestbook-ui ports: - containerPort: 81 diff --git a/reposerver/repository/testdata/app-parameters/single-global/kustomization.yaml b/reposerver/repository/testdata/app-parameters/single-global/kustomization.yaml index 4b35aa5881430..78655aff5fe5b 100644 --- a/reposerver/repository/testdata/app-parameters/single-global/kustomization.yaml +++ b/reposerver/repository/testdata/app-parameters/single-global/kustomization.yaml @@ -4,5 +4,5 @@ kind: Kustomization resources: - guestbook.yaml images: -- name: gcr.io/heptio-images/ks-guestbook-demo +- name: quay.io/argoprojlabs/argocd-e2e-container newTag: "0.1" diff --git a/reposerver/repository/testdata/jsonnet-1/params.libsonnet b/reposerver/repository/testdata/jsonnet-1/params.libsonnet index ef968d6a450bb..d8350ab614a1f 100644 --- a/reposerver/repository/testdata/jsonnet-1/params.libsonnet +++ b/reposerver/repository/testdata/jsonnet-1/params.libsonnet @@ -1,6 +1,6 @@ { containerPort: 80, - image: "gcr.io/heptio-images/ks-guestbook-demo:0.2", + image: "quay.io/argoprojlabs/argocd-e2e-container:0.2", name: "guestbook-ui", replicas: 1, servicePort: 80, diff --git a/reposerver/repository/testdata/jsonnet/params.libsonnet b/reposerver/repository/testdata/jsonnet/params.libsonnet index ef968d6a450bb..d8350ab614a1f 100644 --- a/reposerver/repository/testdata/jsonnet/params.libsonnet +++ b/reposerver/repository/testdata/jsonnet/params.libsonnet @@ -1,6 +1,6 @@ { containerPort: 80, - image: "gcr.io/heptio-images/ks-guestbook-demo:0.2", + image: "quay.io/argoprojlabs/argocd-e2e-container:0.2", name: "guestbook-ui", replicas: 1, servicePort: 80, diff --git a/reposerver/repository/testdata/symlinks/bam b/reposerver/repository/testdata/symlinks/bam new file mode 120000 index 0000000000000..3f95386662513 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/bam @@ -0,0 +1 @@ +baz \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/bar b/reposerver/repository/testdata/symlinks/bar new file mode 120000 index 0000000000000..19102815663d2 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/bar @@ -0,0 +1 @@ +foo \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/baz b/reposerver/repository/testdata/symlinks/baz new file mode 120000 index 0000000000000..ba0e162e1c474 --- /dev/null +++ b/reposerver/repository/testdata/symlinks/baz @@ -0,0 +1 @@ +bar \ No newline at end of file diff --git a/reposerver/repository/testdata/symlinks/foo b/reposerver/repository/testdata/symlinks/foo new file mode 100644 index 0000000000000..ce013625030ba --- /dev/null +++ b/reposerver/repository/testdata/symlinks/foo @@ -0,0 +1 @@ +hello diff --git a/resource_customizations/argoproj.io/Rollout/actions/testdata/one_replica_rollout.yaml b/resource_customizations/argoproj.io/Rollout/actions/testdata/one_replica_rollout.yaml index 949e4eab89d04..c7457f677ca31 100644 --- a/resource_customizations/argoproj.io/Rollout/actions/testdata/one_replica_rollout.yaml +++ b/resource_customizations/argoproj.io/Rollout/actions/testdata/one_replica_rollout.yaml @@ -28,7 +28,7 @@ spec: app: guestbook-bluegreen spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-bluegreen ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_nil_paused_rollout.yaml b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_nil_paused_rollout.yaml index 949e4eab89d04..c7457f677ca31 100644 --- a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_nil_paused_rollout.yaml +++ b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_nil_paused_rollout.yaml @@ -28,7 +28,7 @@ spec: app: guestbook-bluegreen spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-bluegreen ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_not_paused_rollout.yaml b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_not_paused_rollout.yaml index 8e81cffb04cc5..e883249a7f317 100644 --- a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_not_paused_rollout.yaml +++ b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_not_paused_rollout.yaml @@ -28,7 +28,7 @@ spec: app: guestbook-bluegreen spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-bluegreen ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_paused_rollout.yaml b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_paused_rollout.yaml index 0c7062d3b8818..896d1899d108a 100644 --- a/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_paused_rollout.yaml +++ b/resource_customizations/argoproj.io/Rollout/actions/testdata/pre_v0.6_paused_rollout.yaml @@ -29,7 +29,7 @@ spec: app: guestbook-bluegreen spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-bluegreen ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/actions/testdata/three_replica_rollout.yaml b/resource_customizations/argoproj.io/Rollout/actions/testdata/three_replica_rollout.yaml index 2a531f6e2196c..dcedfe4bb37d6 100644 --- a/resource_customizations/argoproj.io/Rollout/actions/testdata/three_replica_rollout.yaml +++ b/resource_customizations/argoproj.io/Rollout/actions/testdata/three_replica_rollout.yaml @@ -28,7 +28,7 @@ spec: app: guestbook-bluegreen spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook-bluegreen ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/healthy_servingActiveService.yaml b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/healthy_servingActiveService.yaml index 45000bc126c07..66f9ed6d30e6e 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/healthy_servingActiveService.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/healthy_servingActiveService.yaml @@ -32,7 +32,7 @@ spec: app: ks-guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: ks-guestbook-ui ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_addingMoreReplicas.yaml b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_addingMoreReplicas.yaml index ae3a8e19fed8f..796ad7df00efe 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_addingMoreReplicas.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_addingMoreReplicas.yaml @@ -31,7 +31,7 @@ spec: app: ks-guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: ks-guestbook-ui ports: - containerPort: 83 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_waitingUntilAvailable.yaml b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_waitingUntilAvailable.yaml index 901ddd5709d99..ca2a94fa3b290 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_waitingUntilAvailable.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/bluegreen/progressing_waitingUntilAvailable.yaml @@ -32,7 +32,7 @@ spec: app: ks-guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: ks-guestbook-ui ports: - containerPort: 83 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml index 7b8efea9f83f4..cc8df9991bb0e 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_emptyStepsList.yaml @@ -32,7 +32,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.2' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.2' name: guestbook-canary ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllSteps.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllSteps.yaml index a4d5485e5d9f6..dce0df276fca8 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllSteps.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllSteps.yaml @@ -3,7 +3,7 @@ kind: Rollout metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: > - {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} rollout.argoproj.io/revision: '1' clusterName: '' creationTimestamp: '2019-05-01T21:55:30Z' @@ -39,7 +39,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-canary ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllStepsPreV0.8.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllStepsPreV0.8.yaml index 52073ff65ebb3..36326cb9f2108 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllStepsPreV0.8.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_executedAllStepsPreV0.8.yaml @@ -3,7 +3,7 @@ kind: Rollout metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: > - {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} rollout.argoproj.io/revision: '1' clusterName: '' creationTimestamp: '2019-05-01T21:55:30Z' @@ -39,7 +39,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-canary ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_noSteps.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_noSteps.yaml index 092d45ca6df0c..35657f3a4db9f 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_noSteps.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/healthy_noSteps.yaml @@ -3,7 +3,7 @@ kind: Rollout metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: > - {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook-canary","ksonnet.io/component":"guestbook-ui"},"name":"guestbook-canary","namespace":"default"},"spec":{"minReadySeconds":10,"replicas":5,"selector":{"matchLabels":{"app":"guestbook-canary"}},"strategy":{"canary":{"maxSurge":1,"maxUnavailable":0,"steps":[{"setWeight":20},{"pause":{"duration":30}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook-canary"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-canary","ports":[{"containerPort":80}]}]}}}} rollout.argoproj.io/revision: '2' clusterName: '' creationTimestamp: '2019-05-01T21:55:30Z' @@ -33,7 +33,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.2' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.2' name: guestbook-canary ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_killingOldReplicas.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_killingOldReplicas.yaml index aab3d8fada33a..aff8e7043f7e1 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_killingOldReplicas.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_killingOldReplicas.yaml @@ -3,7 +3,7 @@ kind: Rollout metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"name":"example-rollout-canary","namespace":"default"},"spec":{"minReadySeconds":30,"replicas":5,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook"}},"strategy":{"canary":{"steps":[{"setWeight":20},{"pause":{"duration":20}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"name":"example-rollout-canary","namespace":"default"},"spec":{"minReadySeconds":30,"replicas":5,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook"}},"strategy":{"canary":{"steps":[{"setWeight":20},{"pause":{"duration":20}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook","ports":[{"containerPort":80}]}]}}}} rollout.argoproj.io/revision: "3" creationTimestamp: "2019-10-20T15:42:26Z" generation: 101 @@ -28,7 +28,7 @@ spec: app: guestbook spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 name: guestbook ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_noSteps.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_noSteps.yaml index 41e7a07313a9c..59afd64bf2df8 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_noSteps.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_noSteps.yaml @@ -31,7 +31,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.2' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.2' name: guestbook-canary ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_setWeightStep.yaml b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_setWeightStep.yaml index a521be9e6addd..a3fad7ef29a44 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_setWeightStep.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/canary/progressing_setWeightStep.yaml @@ -3,7 +3,7 @@ kind: Rollout metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"name":"example-rollout-canary","namespace":"default"},"spec":{"minReadySeconds":30,"replicas":5,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook"}},"strategy":{"canary":{"steps":[{"setWeight":20},{"pause":{"duration":20}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook"}},"spec":{"containers":[{"image":"gcr.io/heptio-images/ks-guestbook-demo:0.1","name":"guestbook","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"argoproj.io/v1alpha1","kind":"Rollout","metadata":{"annotations":{},"name":"example-rollout-canary","namespace":"default"},"spec":{"minReadySeconds":30,"replicas":5,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook"}},"strategy":{"canary":{"steps":[{"setWeight":20},{"pause":{"duration":20}},{"setWeight":40},{"pause":{}}]}},"template":{"metadata":{"labels":{"app":"guestbook"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook","ports":[{"containerPort":80}]}]}}}} rollout.argoproj.io/revision: "2" clusterName: "" creationTimestamp: 2019-04-26T20:17:43Z @@ -35,7 +35,7 @@ spec: app: guestbook spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook ports: - containerPort: 80 diff --git a/resource_customizations/argoproj.io/Rollout/testdata/degraded_rolloutTimeout.yaml b/resource_customizations/argoproj.io/Rollout/testdata/degraded_rolloutTimeout.yaml index bfded3c8deff3..463a39b5ec9ea 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/degraded_rolloutTimeout.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/degraded_rolloutTimeout.yaml @@ -38,7 +38,7 @@ spec: release: guestbook-bluegreen spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.3' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.3' imagePullPolicy: IfNotPresent livenessProbe: httpGet: diff --git a/resource_customizations/argoproj.io/Rollout/testdata/suspended_userPause.yaml b/resource_customizations/argoproj.io/Rollout/testdata/suspended_userPause.yaml index 66c958fa29307..ec99567acfd81 100644 --- a/resource_customizations/argoproj.io/Rollout/testdata/suspended_userPause.yaml +++ b/resource_customizations/argoproj.io/Rollout/testdata/suspended_userPause.yaml @@ -20,7 +20,7 @@ spec: app: guestbook spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.2 name: guestbook status: HPAReplicas: 5 diff --git a/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua b/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua new file mode 100644 index 0000000000000..0cf5253e910ff --- /dev/null +++ b/resource_customizations/route53.aws.crossplane.io/ResourceRecordSet/heatlh.lua @@ -0,0 +1,41 @@ +local hs = {} +if obj.status ~= nil then + if obj.status.conditions ~= nil then + local ready = false + local synced = false + local suspended = false + for i, condition in ipairs(obj.status.conditions) do + + if condition.type == "Ready" then + ready = condition.status == "True" + ready_message = condition.reason + elseif condition.type == "Synced" then + synced = condition.status == "True" + if condition.reason == "ReconcileError" then + synced_message = condition.message + elseif condition.reason == "ReconcilePaused" then + suspended = true + suspended_message = condition.reason + end + end + end + if ready and synced then + hs.status = "Healthy" + hs.message = ready_message + elseif synced == false and suspended == true then + hs.status = "Suspended" + hs.message = suspended_message + elseif ready == false and synced == true and suspended == false then + hs.status = "Progressing" + hs.message = "Waiting for resourcrecordset to be available" + else + hs.status = "Degraded" + hs.message = synced_message + end + return hs + end +end + +hs.status = "Progressing" +hs.message = "Waiting for resourcrecordset to be created" +return hs diff --git a/resource_customizations/spot.io/SpotDeployment/testdata/healthy_spotdeployment.yaml b/resource_customizations/spot.io/SpotDeployment/testdata/healthy_spotdeployment.yaml index 175b698dea277..2296627fbac5b 100644 --- a/resource_customizations/spot.io/SpotDeployment/testdata/healthy_spotdeployment.yaml +++ b/resource_customizations/spot.io/SpotDeployment/testdata/healthy_spotdeployment.yaml @@ -24,7 +24,7 @@ spec: app: guestbook-canary spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-canary ports: - containerPort: 80 @@ -49,6 +49,6 @@ status: selector: app=guestbook-canary liveVersionDate: "2022-07-14T07:56:27.000Z" liveVersionImages: - rollouts-demo: gcr.io/heptio-images/ks-guestbook-demo:0.1 + rollouts-demo: quay.io/argoprojlabs/argocd-e2e-container:0.1 phase: Healthy revision: "9" \ No newline at end of file diff --git a/server/application/application.go b/server/application/application.go index 73cb84c365334..4697928825793 100644 --- a/server/application/application.go +++ b/server/application/application.go @@ -520,7 +520,7 @@ func (s *Server) GetManifests(ctx context.Context, q *application.ApplicationMan return fmt.Errorf("error getting kustomize settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } @@ -653,7 +653,7 @@ func (s *Server) GetManifestsWithFiles(stream application.ApplicationService_Get if err != nil { return fmt.Errorf("error getting kustomize settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource()) + kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource(), s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } @@ -790,7 +790,7 @@ func (s *Server) Get(ctx context.Context, q *application.ApplicationQuery) (*v1a if err != nil { return fmt.Errorf("error getting trackingMethod from settings: %w", err) } - kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource()) + kustomizeOptions, err := kustomizeSettings.GetOptions(a.Spec.GetSource(), s.settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { return fmt.Errorf("error getting kustomize settings options: %w", err) } diff --git a/server/application/application.proto b/server/application/application.proto index 4c3b11df8e4f2..4972872620201 100644 --- a/server/application/application.proto +++ b/server/application/application.proto @@ -88,6 +88,16 @@ message ApplicationManifestQueryWithFiles { optional string project = 4; } +message ApplicationValidateResponse { + optional string error = 1; + optional string entity = 2; +} + +message ApplicationRolloutRollbackResponse { + required string rollout = 1; + required int64 newRevision = 2; +} + message ApplicationManifestQueryWithFilesWrapper { oneof part { ApplicationManifestQueryWithFiles query = 1; @@ -139,6 +149,18 @@ message ApplicationSyncRequest { repeated string revisions = 15; } +message ApplicationValidationRequest { + required github.com.argoproj.argo_cd.v3.pkg.apis.application.v1alpha1.Application application = 1; +} + +message ApplicationRolloutRollbackRequest { + required string name = 1; + required string namespace = 2; + required string rolloutName = 3; + required string rolloutNamespace = 4; + required int64 rolloutRevision = 5; +} + // ApplicationUpdateSpecRequest is a request to update application spec message ApplicationUpdateSpecRequest { required string name = 1; @@ -177,6 +199,17 @@ message ApplicationResourceRequest { optional string project = 8; } +message ChangeRevisionRequest { + required string appName = 1; + optional string namespace = 2; + optional string currentRevision = 3; + optional string previousRevision = 4; +} + +message ChangeRevisionResponse { + required string revision = 1; +} + message ApplicationResourcePatchRequest { required string name = 1; optional string namespace = 2; @@ -467,11 +500,27 @@ service ApplicationService { }; } + // Rollback application rollout + rpc RollbackApplicationRollout(ApplicationRolloutRollbackRequest) returns (ApplicationRolloutRollbackResponse) { + option (google.api.http) = { + post: "/api/v1/applications/{name}/rollout-rollback" + body: "*" + }; + } + // DeleteResource deletes a single application resource rpc DeleteResource(ApplicationResourceDeleteRequest) returns (ApplicationResponse) { option (google.api.http).delete = "/api/v1/applications/{name}/resource"; } + // Create creates an application + rpc ValidateSrcAndDst(ApplicationValidationRequest) returns (ApplicationValidateResponse) { + option (google.api.http) = { + post: "/api/v1/application-validate" + body: "application" + }; + } + // PodLogs returns stream of log entries for the specified pod. Pod rpc PodLogs(ApplicationPodLogsQuery) returns (stream LogEntry) { option (google.api.http) = { @@ -491,4 +540,8 @@ service ApplicationService { rpc ListResourceLinks(ApplicationResourceRequest) returns (LinksResponse) { option (google.api.http).get = "/api/v1/applications/{name}/resource/links"; } + + rpc GetChangeRevision(ChangeRevisionRequest) returns (ChangeRevisionResponse) { + option (google.api.http).get = "/api/v1/application/changeRevision"; + } } diff --git a/server/application/application_rollout_rollback.go b/server/application/application_rollout_rollback.go new file mode 100644 index 0000000000000..be0ffcaba4aa0 --- /dev/null +++ b/server/application/application_rollout_rollback.go @@ -0,0 +1,225 @@ +package application + +import ( + "context" + "encoding/json" + "fmt" + + jsonpatch "github.com/evanphx/json-patch" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/rest" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/util/resource" +) + +func (s *Server) RollbackApplicationRollout(ctx context.Context, q *application.ApplicationRolloutRollbackRequest) (*application.ApplicationRolloutRollbackResponse, error) { + a, err := s.appLister.Applications(*q.Namespace).Get(q.GetName()) + if err != nil { + return nil, fmt.Errorf("error getting application by name: %w", err) + } + + config, err := s.getApplicationClusterConfig(ctx, a) + if err != nil { + return nil, fmt.Errorf("error getting application(%s) cluster config: %w", a.GetName(), err) + } + + liveRolloutObj, err := s.kubectl.GetResource(ctx, config, getRolloutGVK(), q.GetRolloutName(), q.GetRolloutNamespace()) + if err != nil { + return nil, fmt.Errorf("error getting live state of rollout(%s): %w", q.GetRolloutName(), err) + } + + currentRolloutRevision := resource.GetRevision(liveRolloutObj) + targetRolloutRevision := q.GetRolloutRevision() + newRolloutRevision := currentRolloutRevision + 1 + if targetRolloutRevision == currentRolloutRevision { + return nil, fmt.Errorf("revisions are equal, rollback is redundant: %w", err) + } + if targetRolloutRevision > currentRolloutRevision { + return nil, fmt.Errorf("revision greater than latest(%d): %w", currentRolloutRevision, err) + } + + rs, err := s.getReplicaSetForRolloutRollack(ctx, config, q, a) + if err != nil { + return nil, err + } + + newRolloutObj, err := s.getNewRolloutObjForRollbackPatch(liveRolloutObj, rs) + if err != nil { + return nil, err + } + + _, err = s.patchResourceOnCluster(ctx, config, newRolloutObj, liveRolloutObj) + if err != nil { + return nil, err + } + + return &application.ApplicationRolloutRollbackResponse{ + Rollout: q.RolloutName, + NewRevision: &newRolloutRevision, + }, nil +} + +func (s *Server) getRsOfSpecificRevision(ctx context.Context, config *rest.Config, rollout *v1alpha1.ResourceNode, replicasNodes []v1alpha1.ResourceNode, toRevision int64) (*unstructured.Unstructured, error) { + var ( + latestReplicaSet *unstructured.Unstructured + latestRevision = int64(-1) + previousReplicaSet *unstructured.Unstructured + previousRevision = int64(-1) + ) + for _, rsNode := range replicasNodes { + rsliveObj, err := s.kubectl.GetResource(ctx, config, rsNode.GroupKindVersion(), rsNode.Name, rsNode.Namespace) + if err != nil { + return nil, fmt.Errorf("error getting resource: %w", err) + } + + if v := resource.GetRevision(rsliveObj); err == nil { + if toRevision == 0 { + if latestRevision < v { + // newest one we've seen so far + previousRevision = latestRevision + previousReplicaSet = latestReplicaSet + latestRevision = v + latestReplicaSet = rsliveObj + } else if previousRevision < v { + // second newest one we've seen so far + previousRevision = v + previousReplicaSet = rsliveObj + } + } else if toRevision == v { + return rsliveObj, nil + } + } + } + + if toRevision > 0 { + return nil, fmt.Errorf("unable to find specified revision %v in history", toRevision) + } + + if previousReplicaSet == nil { + return nil, fmt.Errorf("no revision found for rollout %q", rollout.Name) + } + + return previousReplicaSet, nil +} + +func (s *Server) getNewRolloutObjForRollbackPatch(liveRolloutObj *unstructured.Unstructured, rs *unstructured.Unstructured) (*unstructured.Unstructured, error) { + rsSpecTemplate, found, err := unstructured.NestedFieldCopy(rs.Object, "spec", "template") + if !found { + return nil, fmt.Errorf("failed to found replicaset %s - spec/template: %w", rs.GetName(), err) + } + if err != nil { + return nil, fmt.Errorf("failed to copy replicaset %s spec/template: %w", rs.GetName(), err) + } + rsSpecTemplateU := unstructured.Unstructured{ + Object: rsSpecTemplate.(map[string]any), + } + unstructured.RemoveNestedField(rsSpecTemplateU.Object, "metadata", "labels", "rollouts-pod-template-hash") + newRolloutObj := liveRolloutObj.DeepCopy() + err = unstructured.SetNestedField(newRolloutObj.Object, rsSpecTemplateU.Object, "spec", "template") + if err != nil { + return nil, fmt.Errorf("failed to set spec/template of rollout %s: %w", liveRolloutObj.GetName(), err) + } + + return newRolloutObj, nil +} + +func (s *Server) getReplicaSetForRolloutRollack(ctx context.Context, config *rest.Config, q *application.ApplicationRolloutRollbackRequest, a *v1alpha1.Application) (*unstructured.Unstructured, error) { + tree, err := s.getAppResources(ctx, a) + if err != nil { + return nil, fmt.Errorf("error getting app resources: %w", err) + } + + rolloutGVK := getRolloutGVK() + + foundRolloutNode := tree.FindNode(rolloutGVK.Group, rolloutGVK.Kind, q.GetRolloutNamespace(), q.GetRolloutName()) + if foundRolloutNode == nil || foundRolloutNode.ResourceRef.UID == "" { + return nil, status.Errorf(codes.InvalidArgument, "%s %s %s not found as part of application %s", rolloutGVK.Kind, rolloutGVK.Group, q.GetRolloutName(), q.GetName()) + } + + childReplicaSets := foundRolloutNode.GetAllChildNodes(tree, "ReplicaSet") + + if len(childReplicaSets) == 0 { + return nil, fmt.Errorf("no related replicasets found for rollout %s: %w", q.GetRolloutName(), err) + } + + rs, err := s.getRsOfSpecificRevision(ctx, config, foundRolloutNode, childReplicaSets, q.GetRolloutRevision()) + if rs == nil { + return nil, fmt.Errorf("no related replicaset of revision %d was found for rollout %s: %w", q.GetRolloutRevision(), q.GetRolloutName(), err) + } + if err != nil { + return nil, err + } + + return rs, nil +} + +func getRolloutGVK() schema.GroupVersionKind { + return schema.GroupVersionKind{ + Group: "argoproj.io", + Version: "v1alpha1", + Kind: "Rollout", + } +} + +// lagic taken from ./application.go - RunResourceAction +func (s *Server) patchResourceOnCluster(ctx context.Context, config *rest.Config, newObj *unstructured.Unstructured, liveObj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + newObjBytes, err := json.Marshal(newObj) + if err != nil { + return nil, fmt.Errorf("error marshaling new object: %w", err) + } + + liveObjBytes, err := json.Marshal(liveObj) + if err != nil { + return nil, fmt.Errorf("error marshaling live object: %w", err) + } + + diffBytes, err := jsonpatch.CreateMergePatch(liveObjBytes, newObjBytes) + if err != nil { + return nil, fmt.Errorf("error calculating merge patch: %w", err) + } + if string(diffBytes) == "{}" { + return nil, nil + } + + // The following logic detects if the resource action makes a modification to status and/or spec. + // If status was modified, we attempt to patch the status using status subresource, in case the + // CRD is configured using the status subresource feature. See: + // https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#status-subresource + // If status subresource is in use, the patch has to be split into two: + // * one to update spec (and other non-status fields) + // * the other to update only status. + nonStatusPatch, statusPatch, err := splitStatusPatch(diffBytes) + if err != nil { + return nil, fmt.Errorf("error splitting status patch: %w", err) + } + if statusPatch != nil { + _, err = s.kubectl.PatchResource(ctx, config, newObj.GroupVersionKind(), newObj.GetName(), newObj.GetNamespace(), types.MergePatchType, diffBytes, "status") + if err != nil { + if !apierrors.IsNotFound(err) { + return nil, fmt.Errorf("error patching resource: %w", err) + } + // K8s API server returns 404 NotFound when the CRD does not support the status subresource + // if we get here, the CRD does not use the status subresource. We will fall back to a normal patch + } else { + // If we get here, the CRD does use the status subresource, so we must patch status and + // spec separately. update the diffBytes to the spec-only patch and fall through. + diffBytes = nonStatusPatch + } + } + if diffBytes != nil { + result, err := s.kubectl.PatchResource(ctx, config, newObj.GroupVersionKind(), newObj.GetName(), newObj.GetNamespace(), types.MergePatchType, diffBytes) + if err != nil { + return nil, fmt.Errorf("error patching resource: %w", err) + } + + return result, nil + } + return nil, nil +} diff --git a/server/application/application_validate_src_and_dest.go b/server/application/application_validate_src_and_dest.go new file mode 100644 index 0000000000000..87fb2ddb137e4 --- /dev/null +++ b/server/application/application_validate_src_and_dest.go @@ -0,0 +1,94 @@ +package application + +import ( + "context" + "errors" + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + apierrors "k8s.io/apimachinery/pkg/api/errors" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/util/argo" + "github.com/argoproj/argo-cd/v3/util/db" +) + +func (s *Server) ValidateSrcAndDst(ctx context.Context, requset *application.ApplicationValidationRequest) (*application.ApplicationValidateResponse, error) { + app := requset.Application + proj, err := argo.GetAppProject(ctx, app, applisters.NewAppProjectLister(s.projInformer.GetIndexer()), s.ns, s.settingsMgr, s.db) + if err != nil { + entity := projectEntity + if apierrors.IsNotFound(err) { + errMsg := fmt.Sprintf("application references project %s which does not exist", app.Spec.Project) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + errMsg := err.Error() + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + + if err := validateDestination(ctx, &app.Spec.Destination, s.db); err != nil { + entity := destinationEntity + errMsg := fmt.Sprintf("application destination spec for %s is invalid: %s", app.ObjectMeta.Name, err.Error()) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + var conditions []appv1.ApplicationCondition + conditions, err = argo.ValidateRepo(ctx, app, s.repoClientset, s.db, s.kubectl, proj, s.settingsMgr) + if err != nil { + entity := sourceEntity + errMsg := err.Error() + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + if len(conditions) > 0 { + entity := sourceEntity + errMsg := fmt.Sprintf("application spec for %s is invalid: %s", app.ObjectMeta.Name, argo.FormatAppConditions(conditions)) + return &application.ApplicationValidateResponse{ + Error: &errMsg, + Entity: &entity, + }, nil + } + return &application.ApplicationValidateResponse{ + Error: nil, + Entity: nil, + }, nil +} + +// validates destination name (argo.ValidateDestination) and server with extra logic +func validateDestination(ctx context.Context, dest *appv1.ApplicationDestination, db db.ArgoDB) error { + if dest == nil { + return errors.New("no destination defined in app spec") + } + _, err := argo.GetDestinationCluster(ctx, *dest, db) + if err != nil { + return err + } + + if dest.Server != "" { + // Ensure the k8s cluster the app is referencing, is configured in Argo CD + _, err := db.GetCluster(ctx, dest.Server) + if err != nil { + if errStatus, ok := status.FromError(err); ok && errStatus.Code() == codes.NotFound { + return fmt.Errorf("cluster '%s' has not been configured", dest.Server) + } + return err + } + } else if dest.Server == "" { + return errors.New("destination server missing from app spec") + } + + return nil +} diff --git a/server/application/cf_application.go b/server/application/cf_application.go new file mode 100644 index 0000000000000..7f6785885539b --- /dev/null +++ b/server/application/cf_application.go @@ -0,0 +1,61 @@ +package application + +import ( + "context" + "fmt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "k8s.io/utils/ptr" + + "github.com/argoproj/argo-cd/v3/pkg/apiclient/application" + appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" + "github.com/argoproj/argo-cd/v3/reposerver/apiclient" + "github.com/argoproj/argo-cd/v3/util/app/path" + ioutil "github.com/argoproj/argo-cd/v3/util/io" +) + +const ( + projectEntity = "project" + sourceEntity = "source" + destinationEntity = "destination" +) + +func (s *Server) GetChangeRevision(ctx context.Context, in *application.ChangeRevisionRequest) (*application.ChangeRevisionResponse, error) { + app, err := s.appLister.Applications(in.GetNamespace()).Get(in.GetAppName()) + if err != nil { + return nil, err + } + + val, ok := app.Annotations[appv1.AnnotationKeyManifestGeneratePaths] + if !ok || val == "" { + return nil, status.Errorf(codes.FailedPrecondition, "manifest generation paths not set") + } + + repo, err := s.db.GetRepository(ctx, app.Spec.GetSource().RepoURL, app.Spec.Project) + if err != nil { + return nil, fmt.Errorf("error getting repository: %w", err) + } + + closer, client, err := s.repoClientset.NewRepoServerClient() + if err != nil { + return nil, fmt.Errorf("error creating repo server client: %w", err) + } + defer ioutil.Close(closer) + + response, err := client.GetChangeRevision(ctx, &apiclient.ChangeRevisionRequest{ + AppName: in.GetAppName(), + Namespace: in.GetNamespace(), + CurrentRevision: in.GetCurrentRevision(), + PreviousRevision: in.GetPreviousRevision(), + Paths: path.GetAppRefreshPaths(app), + Repo: repo, + }) + if err != nil { + return nil, fmt.Errorf("error getting change revision: %w", err) + } + + return &application.ChangeRevisionResponse{ + Revision: ptr.To(response.Revision), + }, nil +} diff --git a/server/repository/repository.go b/server/repository/repository.go index 65e3e2f428dd9..1665bb1a76f03 100644 --- a/server/repository/repository.go +++ b/server/repository/repository.go @@ -362,7 +362,7 @@ func (s *Server) GetAppDetails(ctx context.Context, q *repositorypkg.RepoAppDeta if err != nil { return nil, err } - kustomizeOptions, err := kustomizeSettings.GetOptions(*q.Source) + kustomizeOptions, err := kustomizeSettings.GetOptions(*q.Source, s.settings.GetKustomizeSetNamespaceEnabled()) if err != nil { return nil, err } diff --git a/sonar-project.properties b/sonar-project.properties index 21dad92e68837..642c77ece214c 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,15 +1,15 @@ -sonar.projectKey=argoproj_argo-cd -sonar.organization=argoproj +sonar.projectKey=argo-cd +sonar.organization=codefresh-io # This is the name and version displayed in the SonarCloud UI. sonar.projectName=argo-cd sonar.projectVersion=1.0 - + # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. sonar.sources=. sonar.exclusions=docs/** - + # Encoding of the source code. Default is default system encoding sonar.sourceEncoding=UTF-8 diff --git a/test/e2e/app_management_ns_test.go b/test/e2e/app_management_ns_test.go index 2eb13e62a7764..f16a2193b3666 100644 --- a/test/e2e/app_management_ns_test.go +++ b/test/e2e/app_management_ns_test.go @@ -429,6 +429,7 @@ func TestNamespacedTrackAppStateAndSyncApp(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). @@ -1134,6 +1135,7 @@ func TestNamespacedPermissions(t *testing.T) { }). CreateApp(). Sync(). + Wait(). Then(). // make sure application resource actiions are successful And(func(app *Application) { diff --git a/test/e2e/app_management_test.go b/test/e2e/app_management_test.go index 3b70b5e125bc5..b405dca2d8dde 100644 --- a/test/e2e/app_management_test.go +++ b/test/e2e/app_management_test.go @@ -576,6 +576,7 @@ func TestTrackAppStateAndSyncApp(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). Expect(OperationPhaseIs(OperationSucceeded)). Expect(SyncStatusIs(SyncStatusCodeSynced)). @@ -1175,6 +1176,7 @@ func TestNewStyleResourceActionPermitted(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). And(func(app *Application) { closer, client, err := fixture.ArgoCDClientset.NewApplicationClient() @@ -1287,6 +1289,7 @@ func TestNewStyleResourceActionMixedOk(t *testing.T) { When(). CreateApp(). Sync(). + Wait(). Then(). And(func(app *Application) { closer, client, err := fixture.ArgoCDClientset.NewApplicationClient() diff --git a/test/e2e/fixture/app/expectation.go b/test/e2e/fixture/app/expectation.go index 6f37e25c3fc44..4fd43cd5bcbb2 100644 --- a/test/e2e/fixture/app/expectation.go +++ b/test/e2e/fixture/app/expectation.go @@ -343,7 +343,7 @@ func Success(message string, matchers ...func(string, string) bool) Expectation return failed, "error" } if !match(c.actions.lastOutput, message) { - return failed, fmt.Sprintf("output did not contain '%s'", message) + return failed, fmt.Sprintf("output did not contain '%s', but got: '%s'", message, c.actions.lastOutput) } return succeeded, fmt.Sprintf("no error and output contained '%s'", message) } diff --git a/test/e2e/project_management_test.go b/test/e2e/project_management_test.go index dafd198c8c4f0..42657dc762bb3 100644 --- a/test/e2e/project_management_test.go +++ b/test/e2e/project_management_test.go @@ -533,6 +533,8 @@ func TestGetVirtualProjectNoMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) require.NoError(t, err) + time.Sleep(1 * time.Second) + // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", strconv.Itoa(10)) require.NoError(t, err) @@ -569,6 +571,8 @@ func TestGetVirtualProjectMatch(t *testing.T) { "--path", guestbookPath, "--project", proj.Name, "--dest-server", v1alpha1.KubernetesInternalAPIServerAddr, "--dest-namespace", fixture.DeploymentNamespace()) require.NoError(t, err) + time.Sleep(1 * time.Second) + // App trying to sync a resource which is not blacked listed anywhere _, err = fixture.RunCli("app", "sync", fixture.Name(), "--resource", "apps:Deployment:guestbook-ui", "--timeout", strconv.Itoa(10)) require.ErrorContains(t, err, "blocked by sync window") diff --git a/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml b/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml index f7f144d20e123..fc1982761746c 100644 --- a/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml +++ b/test/e2e/testdata/helm-with-multiple-dependencies/Chart.yaml @@ -1,11 +1,7 @@ apiVersion: v2 -name: helm-with-multiple-dependencies +name: helm-with-dependencies version: v1.0.0 dependencies: - name: helm repository: "https://localhost:9444/argo-e2e/testdata.git/helm-repo/local" version: v1.0.0 - - name: helm - repository: "https://localhost:9444/argo-e2e/testdata.git/helm-repo/local2" - version: v1.0.0 - alias: helm2 \ No newline at end of file diff --git a/test/e2e/testdata/jsonnet-tla/guestbook-template.jsonnet b/test/e2e/testdata/jsonnet-tla/guestbook-template.jsonnet index 7ecdfb2b2b050..2c8048125656c 100644 --- a/test/e2e/testdata/jsonnet-tla/guestbook-template.jsonnet +++ b/test/e2e/testdata/jsonnet-tla/guestbook-template.jsonnet @@ -1,6 +1,6 @@ function ( containerPort=80, - image="gcr.io/heptio-images/ks-guestbook-demo:0.2", + image="quay.io/argoprojlabs/argocd-e2e-container:0.2", name="jsonnet-guestbook-ui", replicas=1, servicePort=80, diff --git a/test/e2e/testdata/ksonnet/components/params.libsonnet b/test/e2e/testdata/ksonnet/components/params.libsonnet index a43a50ab1c789..5d8b017c83dd8 100644 --- a/test/e2e/testdata/ksonnet/components/params.libsonnet +++ b/test/e2e/testdata/ksonnet/components/params.libsonnet @@ -8,7 +8,7 @@ // Each object below should correspond to a component in the components/ directory "guestbook-ui": { containerPort: 80, - image: "gcr.io/heptio-images/ks-guestbook-demo:0.2", + image: "quay.io/argoprojlabs/argocd-e2e-container:0.2", name: "ks-guestbook-ui", replicas: 0, servicePort: 80, diff --git a/util/argo/argo.go b/util/argo/argo.go index 69ba64f4291e3..aa8792357f3f5 100644 --- a/util/argo/argo.go +++ b/util/argo/argo.go @@ -747,7 +747,7 @@ func verifyGenerateManifests( }) continue } - kustomizeOptions, err := kustomizeSettings.GetOptions(source) + kustomizeOptions, err := kustomizeSettings.GetOptions(source, settingsMgr.GetKustomizeSetNamespaceEnabled()) if err != nil { conditions = append(conditions, argoappv1.ApplicationCondition{ Type: argoappv1.ApplicationConditionInvalidSpecError, diff --git a/util/argo/testdata/desired_deployment.yaml b/util/argo/testdata/desired_deployment.yaml index c945ea7bc47ad..657af3344c68c 100644 --- a/util/argo/testdata/desired_deployment.yaml +++ b/util/argo/testdata/desired_deployment.yaml @@ -17,7 +17,7 @@ spec: app: guestbook-ui spec: containers: - - image: 'gcr.io/heptio-images/ks-guestbook-demo:0.1' + - image: 'quay.io/argoprojlabs/argocd-e2e-container:0.1' name: guestbook-ui ports: - containerPort: 80 diff --git a/util/argo/testdata/live_deployment_with_managed_replica.yaml b/util/argo/testdata/live_deployment_with_managed_replica.yaml index 15de5345e2fc7..df4afb2bebf6c 100644 --- a/util/argo/testdata/live_deployment_with_managed_replica.yaml +++ b/util/argo/testdata/live_deployment_with_managed_replica.yaml @@ -4,7 +4,7 @@ metadata: annotations: deployment.kubernetes.io/revision: "1" kubectl.kubernetes.io/last-applied-configuration: | - {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook"},"name":"kustomize-guestbook-ui","namespace":"default"},"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.1","name":"guestbook-ui","ports":[{"containerPort":80}]}]}}}} + {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"guestbook"},"name":"kustomize-guestbook-ui","namespace":"default"},"spec":{"replicas":1,"revisionHistoryLimit":3,"selector":{"matchLabels":{"app":"guestbook-ui"}},"template":{"metadata":{"labels":{"app":"guestbook-ui"}},"spec":{"containers":[{"image":"quay.io/argoprojlabs/argocd-e2e-container:0.1","name":"guestbook-ui","ports":[{"containerPort":80}]}]}}}} creationTimestamp: "2021-12-01T20:36:10Z" generation: 4 labels: @@ -126,7 +126,7 @@ spec: app: guestbook-ui spec: containers: - - image: gcr.io/heptio-images/ks-guestbook-demo:0.1 + - image: quay.io/argoprojlabs/argocd-e2e-container:0.1 imagePullPolicy: IfNotPresent name: guestbook-ui ports: diff --git a/util/git/cf_client.go b/util/git/cf_client.go new file mode 100644 index 0000000000000..41e9c00a45c84 --- /dev/null +++ b/util/git/cf_client.go @@ -0,0 +1,46 @@ +package git + +import ( + "errors" + "fmt" + "strings" +) + +func (m *nativeGitClient) ListRevisions(revision string, targetRevision string) ([]string, error) { + // it happens when app just created and there is no revision yet + if revision == "" { + return []string{targetRevision}, nil + } + + if !IsCommitSHA(revision) || !IsCommitSHA(targetRevision) { + return nil, errors.New("invalid revision provided, must be SHA") + } + + if revision == targetRevision { + return []string{revision}, nil + } + + out, err := m.runCmd("rev-list", "--ancestry-path", fmt.Sprintf("%s..%s", revision, targetRevision)) + if err != nil { + return nil, err + } + ss := strings.Split(out, "\n") + return ss, nil +} + +func (m *nativeGitClient) DiffTree(targetRevision string) ([]string, error) { + if !IsCommitSHA(targetRevision) { + return []string{}, errors.New("invalid revision provided, must be SHA") + } + out, err := m.runCmd("diff-tree", "--no-commit-id", "--name-only", "-r", targetRevision) + if err != nil { + return nil, fmt.Errorf("failed to diff %s: %w", targetRevision, err) + } + + if out == "" { + return []string{}, nil + } + + files := strings.Split(out, "\n") + return files, nil +} diff --git a/util/git/client.go b/util/git/client.go index c0a261b153663..f6ab375e50edf 100644 --- a/util/git/client.go +++ b/util/git/client.go @@ -91,6 +91,8 @@ type Client interface { RemoveContents() (string, error) // CommitAndPush commits and pushes changes to the target branch. CommitAndPush(branch, message string) (string, error) + ListRevisions(revision string, targetRevision string) ([]string, error) + DiffTree(targetRevision string) ([]string, error) } type EventHandlers struct { diff --git a/util/git/mocks/Client.go b/util/git/mocks/Client.go index 0210570e7192c..965cf1f554301 100644 --- a/util/git/mocks/Client.go +++ b/util/git/mocks/Client.go @@ -182,6 +182,36 @@ func (_m *Client) CommitSHA() (string, error) { return r0, r1 } +// DiffTree provides a mock function with given fields: targetRevision +func (_m *Client) DiffTree(targetRevision string) ([]string, error) { + ret := _m.Called(targetRevision) + + if len(ret) == 0 { + panic("no return value specified for DiffTree") + } + + var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(string) ([]string, error)); ok { + return rf(targetRevision) + } + if rf, ok := ret.Get(0).(func(string) []string); ok { + r0 = rf(targetRevision) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(targetRevision) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Fetch provides a mock function with given fields: revision func (_m *Client) Fetch(revision string) error { ret := _m.Called(revision) @@ -254,6 +284,36 @@ func (_m *Client) IsRevisionPresent(revision string) bool { return r0 } +// ListRevisions provides a mock function with given fields: revision, targetRevision +func (_m *Client) ListRevisions(revision string, targetRevision string) ([]string, error) { + ret := _m.Called(revision, targetRevision) + + if len(ret) == 0 { + panic("no return value specified for ListRevisions") + } + + var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(string, string) ([]string, error)); ok { + return rf(revision, targetRevision) + } + if rf, ok := ret.Get(0).(func(string, string) []string); ok { + r0 = rf(revision, targetRevision) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(revision, targetRevision) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // LsFiles provides a mock function with given fields: path, enableNewGitFileGlobbing func (_m *Client) LsFiles(path string, enableNewGitFileGlobbing bool) ([]string, error) { ret := _m.Called(path, enableNewGitFileGlobbing) diff --git a/util/kustomize/cf_kustomize.go b/util/kustomize/cf_kustomize.go new file mode 100644 index 0000000000000..027ca52cfa935 --- /dev/null +++ b/util/kustomize/cf_kustomize.go @@ -0,0 +1,60 @@ +package kustomize + +import ( + "fmt" + "net/url" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/argoproj/argo-cd/v3/util/git" + + "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" +) + +type ResolveRevisionFunc func(repo, revision string, creds git.Creds) (string, error) + +func (k *kustomize) GetCacheKeyWithComponents(revision string, source *v1alpha1.ApplicationSourceKustomize, resolveRevisionFunc ResolveRevisionFunc) (string, error) { + cacheKey := "" + + revisionsToResolve := map[string]string{} + + for _, c := range source.Components { + _, err := url.Parse(c) + if err != nil { + continue // local files are not part of the cache key + } + + _, _, path, ref := parseGitURL(c) + if ref == "" { + ref = "HEAD" + } + + cleanRepoURL := c + if path != "" { + suffixToTrim := c + if searchedValueIndex := strings.Index(c, path); searchedValueIndex != -1 { + suffixToTrim = c[:searchedValueIndex] + } + cleanRepoURL = strings.TrimSuffix(suffixToTrim, "/") + } + + revisionsToResolve[cleanRepoURL] = ref + } + + for component, ref := range revisionsToResolve { + rev, err := resolveRevisionFunc(component, ref, k.creds) + if err != nil { + log.WithError(err). + WithField("url", component). + Warn("failed to resolve revision of component from url, ignoring in cache key") + continue + } + if cacheKey != "" { + cacheKey += "|" + } + cacheKey += fmt.Sprintf("%s|%s", component, rev) + } + + return fmt.Sprintf("%s|%s", revision, cacheKey), nil +} diff --git a/util/kustomize/kustomize.go b/util/kustomize/kustomize.go index 6d289a7fc380a..a507c02d788df 100644 --- a/util/kustomize/kustomize.go +++ b/util/kustomize/kustomize.go @@ -39,7 +39,12 @@ type BuildOpts struct { // Kustomize provides wrapper functionality around the `kustomize` command. type Kustomize interface { // Build returns a list of unstructured objects from a `kustomize build` command and extract supported parameters - Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, []string, error) + Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts, namespace string) ([]*unstructured.Unstructured, []Image, []string, error) + // Codefresh-fix + // GetCacheKeyWithComponents returns a cache key that takes remote components repositories in consideration and + // not just the repository that contains the base Kustomization file. This is required if we want to rebuild the + // manifests everytime one of the component repositories change and not wait for a hard refresh. + GetCacheKeyWithComponents(revision string, source *v1alpha1.ApplicationSourceKustomize, resolveRevisionFunc ResolveRevisionFunc) (string, error) } // NewKustomizeApp create a new wrapper to run commands on the `kustomize` command-line tool. @@ -124,7 +129,7 @@ func mapToEditAddArgs(val map[string]string) []string { return args } -func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts) ([]*unstructured.Unstructured, []Image, []string, error) { +func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOptions *v1alpha1.KustomizeOptions, envVars *v1alpha1.Env, buildOpts *BuildOpts, namespace string) ([]*unstructured.Unstructured, []Image, []string, error) { // commands stores all the commands that were run as part of this build. var commands []string @@ -163,6 +168,15 @@ func (k *kustomize) Build(opts *v1alpha1.ApplicationSourceKustomize, kustomizeOp env = append(env, environ...) + if kustomizeOptions != nil && kustomizeOptions.SetNamespace && namespace != "" { + cmd := exec.Command(k.getBinaryPath(), "edit", "set", "namespace", "--", namespace) + cmd.Dir = k.path + _, err := executil.Run(cmd) + if err != nil { + return nil, nil, nil, err + } + } + if opts != nil { if opts.NamePrefix != "" { cmd := exec.Command(k.getBinaryPath(), "edit", "set", "nameprefix", "--", opts.NamePrefix) diff --git a/util/kustomize/kustomize_test.go b/util/kustomize/kustomize_test.go index dbeb027023b3d..adaa327a46729 100644 --- a/util/kustomize/kustomize_test.go +++ b/util/kustomize/kustomize_test.go @@ -74,7 +74,7 @@ func TestKustomizeBuild(t *testing.T) { } objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, &BuildOpts{ KubeVersion: "1.27", APIVersions: []string{"foo", "bar"}, - }) + }, "") require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) @@ -136,7 +136,7 @@ func TestFailKustomizeBuild(t *testing.T) { }, }, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") assert.EqualError(t, err, "expected integer value for count. Received: garbage") } @@ -231,7 +231,7 @@ func TestKustomizeBuildForceCommonLabels(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: require.Error(t, err) @@ -323,7 +323,7 @@ func TestKustomizeBuildForceCommonAnnotations(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: require.Error(t, err) @@ -429,7 +429,7 @@ func TestKustomizeLabelWithoutSelector(t *testing.T) { appPath, err := testDataDir(t, tc.TestData) require.NoError(t, err) kustomize := NewKustomizeApp(appPath, appPath, git.NopCreds{}, "", "", "", "") - objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil) + objs, _, _, err := kustomize.Build(&tc.KustomizeSource, nil, tc.Env, nil, "") switch tc.ExpectErr { case true: @@ -465,7 +465,7 @@ func TestKustomizeCustomVersion(t *testing.T) { env := &v1alpha1.Env{ &v1alpha1.EnvEntry{Name: "ARGOCD_APP_NAME", Value: "argo-cd-tests"}, } - objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, nil) + objs, images, _, err := kustomize.Build(&kustomizeSource, nil, env, nil, "") require.NoError(t, err) if err != nil { assert.Len(t, objs, 2) @@ -486,14 +486,14 @@ func TestKustomizeBuildComponents(t *testing.T) { Components: []string{"./components", "./missing-components"}, IgnoreMissingComponents: false, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.Error(t, err) kustomizeSource = v1alpha1.ApplicationSourceKustomize{ Components: []string{"./components", "./missing-components"}, IgnoreMissingComponents: true, } - objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) obj := objs[0] assert.Equal(t, "nginx-deployment", obj.GetName()) @@ -526,7 +526,7 @@ func TestKustomizeBuildPatches(t *testing.T) { }, }, } - objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil) + objs, _, _, err := kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.NoError(t, err) obj := objs[0] containers, found, err := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers") @@ -579,6 +579,6 @@ func TestFailKustomizeBuildPatches(t *testing.T) { }, } - _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil) + _, _, _, err = kustomize.Build(&kustomizeSource, nil, nil, nil, "") require.EqualError(t, err, "kustomization file not found in the path") } diff --git a/util/kustomize/repospec.go b/util/kustomize/repospec.go new file mode 100644 index 0000000000000..839483795ee86 --- /dev/null +++ b/util/kustomize/repospec.go @@ -0,0 +1,151 @@ +// The following file was copied from https://github.com/kubernetes-sigs/kustomize/blob/master/api/internal/git/repospec.go +// and modified to expose the ParseGitUrl function +// +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 +package kustomize + +import ( + "net/url" + "strings" +) + +const ( + gitSuffix = ".git" + gitDelimiter = "_git/" +) + +// From strings like git@github.com:someOrg/someRepo.git or +// https://github.com/someOrg/someRepo?ref=someHash, extract +// the parts. +func parseGitURL(n string) ( + host string, orgRepo string, path string, gitRef string, +) { + if strings.Contains(n, gitDelimiter) { + index := strings.Index(n, gitDelimiter) + // Adding _git/ to host + host = normalizeGitHostSpec(n[:index+len(gitDelimiter)]) + orgRepo = strings.Split(strings.Split(n[index+len(gitDelimiter):], "/")[0], "?")[0] + path, gitRef = peelQuery(n[index+len(gitDelimiter)+len(orgRepo):]) + return + } + host, n = parseHostSpec(n) + if strings.Contains(n, gitSuffix) { + index := strings.Index(n, gitSuffix) + orgRepo = n[0:index] + n = n[index+len(gitSuffix):] + if len(n) > 0 && n[0] == '/' { + n = n[1:] + } + path, gitRef = peelQuery(n) + return + } + + i := strings.Index(n, "/") + if i < 1 { + path, gitRef = peelQuery(n) + return + } + j := strings.Index(n[i+1:], "/") + if j >= 0 { + j += i + 1 + orgRepo = n[:j] + path, gitRef = peelQuery(n[j+1:]) + return + } + path = "" + orgRepo, gitRef = peelQuery(n) + return host, orgRepo, path, gitRef +} + +func peelQuery(arg string) (string, string) { + // Parse the given arg into a URL. In the event of a parse failure, return + // our defaults. + parsed, err := url.Parse(arg) + if err != nil { + return arg, "" + } + values := parsed.Query() + + // ref is the desired git ref to target. Can be specified by in a git URL + // with ?ref= or ?version=, although ref takes precedence. + ref := values.Get("version") + if queryValue := values.Get("ref"); queryValue != "" { + ref = queryValue + } + + return parsed.Path, ref +} + +func parseHostSpec(n string) (string, string) { + var host string + // Start accumulating the host part. + for _, p := range []string{ + // Order matters here. + "git::", "gh:", "ssh://", "https://", "http://", + "git@", "github.com:", "github.com/", + } { + if len(p) < len(n) && strings.ToLower(n[:len(p)]) == p { + n = n[len(p):] + host += p + } + } + if host == "git@" { + i := strings.Index(n, "/") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } else { + i = strings.Index(n, ":") + if i > -1 { + host += n[:i+1] + n = n[i+1:] + } + } + return host, n + } + + // If host is a http(s) or ssh URL, grab the domain part. + for _, p := range []string{ + "ssh://", "https://", "http://", + } { + if strings.HasSuffix(host, p) { + i := strings.Index(n, "/") + if i > -1 { + host += n[0 : i+1] + n = n[i+1:] + } + break + } + } + + return normalizeGitHostSpec(host), n +} + +func normalizeGitHostSpec(host string) string { + s := strings.ToLower(host) + if strings.Contains(s, "github.com") { + if strings.Contains(s, "git@") || strings.Contains(s, "ssh:") { + host = "git@github.com:" + } else { + host = "https://github.com/" + } + } + if strings.HasPrefix(s, "git::") { + host = strings.TrimPrefix(s, "git::") + } + return host +} + +// The format of Azure repo URL is documented +// https://docs.microsoft.com/en-us/azure/devops/repos/git/clone?view=vsts&tabs=visual-studio#clone_url +func isAzureHost(host string) bool { + return strings.Contains(host, "dev.azure.com") || + strings.Contains(host, "visualstudio.com") +} + +// The format of AWS repo URL is documented +// https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html +func isAWSHost(host string) bool { + return strings.Contains(host, "amazonaws.com") +} diff --git a/util/kustomize/repospec_test.go b/util/kustomize/repospec_test.go new file mode 100644 index 0000000000000..1a18064071033 --- /dev/null +++ b/util/kustomize/repospec_test.go @@ -0,0 +1,250 @@ +// The following file was copied from https://github.com/kubernetes-sigs/kustomize/blob/master/api/internal/git/repospec.go +// and modified to expose the ParseGitUrl function +// +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package kustomize + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +const ( + refQuery = "?ref=" +) + +var orgRepos = []string{"someOrg/someRepo", "kubernetes/website"} + +var pathNames = []string{"README.md", "foo/krusty.txt", ""} + +var hrefArgs = []string{"someBranch", "master", "v0.1.0", ""} + +var hostNamesRawAndNormalized = [][]string{ + {"gh:", "gh:"}, + {"GH:", "gh:"}, + {"gitHub.com/", "https://github.com/"}, + {"github.com:", "https://github.com/"}, + {"http://github.com/", "https://github.com/"}, + {"https://github.com/", "https://github.com/"}, + {"hTTps://github.com/", "https://github.com/"}, + {"https://git-codecommit.us-east-2.amazonaws.com/", "https://git-codecommit.us-east-2.amazonaws.com/"}, + {"https://fabrikops2.visualstudio.com/", "https://fabrikops2.visualstudio.com/"}, + {"ssh://git.example.com:7999/", "ssh://git.example.com:7999/"}, + {"git::https://gitlab.com/", "https://gitlab.com/"}, + {"git::http://git.example.com/", "http://git.example.com/"}, + {"git::https://git.example.com/", "https://git.example.com/"}, + {"git@github.com:", "git@github.com:"}, + {"git@github.com/", "git@github.com:"}, +} + +func makeURL(hostFmt, orgRepo, path, href string) string { + if len(path) > 0 { + orgRepo = filepath.Join(orgRepo, path) + } + url := hostFmt + orgRepo + if href != "" { + url += refQuery + href + } + return url +} + +func TestNewRepoSpecFromUrl(t *testing.T) { + var bad [][]string + for _, tuple := range hostNamesRawAndNormalized { + hostRaw := tuple[0] + hostSpec := tuple[1] + for _, orgRepo := range orgRepos { + for _, pathName := range pathNames { + for _, hrefArg := range hrefArgs { + uri := makeURL(hostRaw, orgRepo, pathName, hrefArg) + host, org, path, ref := parseGitURL(uri) + if host != hostSpec { + bad = append(bad, []string{"host", uri, host, hostSpec}) + } + if org != orgRepo { + bad = append(bad, []string{"orgRepo", uri, org, orgRepo}) + } + if path != pathName { + bad = append(bad, []string{"path", uri, path, pathName}) + } + if ref != hrefArg { + bad = append(bad, []string{"ref", uri, ref, hrefArg}) + } + } + } + } + } + if len(bad) > 0 { + for _, tuple := range bad { + fmt.Printf("\n"+ + " from uri: %s\n"+ + " actual %4s: %s\n"+ + "expected %4s: %s\n", + tuple[1], tuple[0], tuple[2], tuple[0], tuple[3]) + } + t.Fail() + } +} + +func TestIsAzureHost(t *testing.T) { + testcases := []struct { + input string + expect bool + }{ + { + input: "https://git-codecommit.us-east-2.amazonaws.com", + expect: false, + }, + { + input: "ssh://git-codecommit.us-east-2.amazonaws.com", + expect: false, + }, + { + input: "https://fabrikops2.visualstudio.com/", + expect: true, + }, + { + input: "https://dev.azure.com/myorg/myproject/", + expect: true, + }, + } + for _, testcase := range testcases { + actual := isAzureHost(testcase.input) + if actual != testcase.expect { + t.Errorf("IsAzureHost: expected %v, but got %v on %s", testcase.expect, actual, testcase.input) + } + } +} + +func TestPeelQuery(t *testing.T) { + testcases := map[string]struct { + input string + path string + ref string + }{ + "t1": { + // All empty. + input: "somerepos", + path: "somerepos", + ref: "", + }, + "t2": { + input: "somerepos?ref=v1.0.0", + path: "somerepos", + ref: "v1.0.0", + }, + "t3": { + input: "somerepos?version=master", + path: "somerepos", + ref: "master", + }, + "t4": { + // A ref value takes precedence over a version value. + input: "somerepos?version=master&ref=v1.0.0", + path: "somerepos", + ref: "v1.0.0", + }, + "t5": { + // Empty submodules value uses default. + input: "somerepos?version=master&submodules=", + path: "somerepos", + ref: "master", + }, + "t6": { + // Malformed submodules value uses default. + input: "somerepos?version=master&submodules=maybe", + path: "somerepos", + ref: "master", + }, + "t7": { + input: "somerepos?version=master&submodules=true", + path: "somerepos", + ref: "master", + }, + "t8": { + input: "somerepos?version=master&submodules=false", + path: "somerepos", + ref: "master", + }, + "t9": { + // Empty timeout value uses default. + input: "somerepos?version=master&timeout=", + path: "somerepos", + ref: "master", + }, + "t10": { + // Malformed timeout value uses default. + input: "somerepos?version=master&timeout=jiffy", + path: "somerepos", + ref: "master", + }, + "t11": { + // Zero timeout value uses default. + input: "somerepos?version=master&timeout=0", + path: "somerepos", + ref: "master", + }, + "t12": { + input: "somerepos?version=master&timeout=0s", + path: "somerepos", + ref: "master", + }, + "t13": { + input: "somerepos?version=master&timeout=61", + path: "somerepos", + ref: "master", + }, + "t14": { + input: "somerepos?version=master&timeout=1m1s", + path: "somerepos", + ref: "master", + }, + "t15": { + input: "somerepos?version=master&submodules=false&timeout=1m1s", + path: "somerepos", + ref: "master", + }, + } + for tn, tc := range testcases { + t.Run(tn, func(t *testing.T) { + path, ref := peelQuery(tc.input) + assert.Equal(t, tc.path, path, "path mismatch") + assert.Equal(t, tc.ref, ref, "ref mismatch") + }) + } +} + +func TestIsAWSHost(t *testing.T) { + testcases := []struct { + input string + expect bool + }{ + { + input: "https://git-codecommit.us-east-2.amazonaws.com", + expect: true, + }, + { + input: "ssh://git-codecommit.us-east-2.amazonaws.com", + expect: true, + }, + { + input: "git@github.com:", + expect: false, + }, + { + input: "http://github.com/", + expect: false, + }, + } + for _, testcase := range testcases { + actual := isAWSHost(testcase.input) + if actual != testcase.expect { + t.Errorf("IsAWSHost: expected %v, but got %v on %s", testcase.expect, actual, testcase.input) + } + } +} diff --git a/util/notification/argocd/service.go b/util/notification/argocd/service.go index 81082052602e1..56d6c9ed7555d 100644 --- a/util/notification/argocd/service.go +++ b/util/notification/argocd/service.go @@ -71,7 +71,7 @@ func (svc *argoCDService) getKustomizeOptions(source *v1alpha1.ApplicationSource if err != nil { return nil, err } - return kustomizeSettings.GetOptions(*source) + return kustomizeSettings.GetOptions(*source, svc.settingsMgr.GetKustomizeSetNamespaceEnabled()) } func (svc *argoCDService) GetAppDetails(ctx context.Context, app *v1alpha1.Application) (*shared.AppDetail, error) { diff --git a/util/settings/cf_settings.go b/util/settings/cf_settings.go new file mode 100644 index 0000000000000..b38f767aca4ea --- /dev/null +++ b/util/settings/cf_settings.go @@ -0,0 +1,13 @@ +package settings + +func (mgr *SettingsManager) GetKustomizeSetNamespaceEnabled() bool { + argoCDCM, err := mgr.getConfigMap() + if err != nil { + return false + } + kustomizeSetNamespaceEnabled := argoCDCM.Data[kustomizeSetNamespaceEnabledKey] + if kustomizeSetNamespaceEnabled == "" { + return false + } + return kustomizeSetNamespaceEnabled == "true" +} diff --git a/util/settings/settings.go b/util/settings/settings.go index ca0cfa18f2604..c258d3ec56978 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -128,6 +128,8 @@ type ArgoCDSettings struct { // ImpersonationEnabled indicates whether Application sync privileges can be decoupled from control plane // privileges using impersonation ImpersonationEnabled bool `json:"impersonationEnabled"` + // KustomizeSetNamespaceEnabled enable set namespace for kustomize by default + KustomizeSetNamespaceEnabled bool `json:"kustomizeSetNamespaceEnabled"` } type GoogleAnalytics struct { @@ -289,7 +291,7 @@ var ( } ) -func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource) (*v1alpha1.KustomizeOptions, error) { +func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource, setNamespace bool) (*v1alpha1.KustomizeOptions, error) { binaryPath := "" buildOptions := "" if source.Kustomize != nil && source.Kustomize.Version != "" { @@ -311,6 +313,7 @@ func (ks *KustomizeSettings) GetOptions(source v1alpha1.ApplicationSource) (*v1a return &v1alpha1.KustomizeOptions{ BuildOptions: buildOptions, BinaryPath: binaryPath, + SetNamespace: setNamespace, }, nil } @@ -538,6 +541,8 @@ const ( RespectRBACValueNormal = "normal" // impersonationEnabledKey is the key to configure whether the application sync decoupling through impersonation feature is enabled impersonationEnabledKey = "application.sync.impersonation.enabled" + // kustomizeSetNamespaceEnabledKey is the key to configure if kustomize set namespace should be executed + kustomizeSetNamespaceEnabledKey = "kustomize.setNamespace.enabled" ) const ( diff --git a/util/settings/settings_test.go b/util/settings/settings_test.go index bad954fec1973..3b4e316ca6f61 100644 --- a/util/settings/settings_test.go +++ b/util/settings/settings_test.go @@ -818,12 +818,12 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionDoesNotExist", func(t *testing.T) { _, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v4"}, - }) + }, true) require.Error(t, err) }) t.Run("DefaultBuildOptions", func(t *testing.T) { - ver, err := settings.GetOptions(v1alpha1.ApplicationSource{}) + ver, err := settings.GetOptions(v1alpha1.ApplicationSource{}, true) require.NoError(t, err) assert.Equal(t, "", ver.BinaryPath) assert.Equal(t, "--opt1 val1", ver.BuildOptions) @@ -832,7 +832,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionExists", func(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v2"}, - }) + }, true) require.NoError(t, err) assert.Equal(t, "path_v2", ver.BinaryPath) assert.Equal(t, "", ver.BuildOptions) @@ -841,7 +841,7 @@ func TestKustomizeSettings_GetOptions(t *testing.T) { t.Run("VersionExistsWithBuildOption", func(t *testing.T) { ver, err := settings.GetOptions(v1alpha1.ApplicationSource{ Kustomize: &v1alpha1.ApplicationSourceKustomize{Version: "v3"}, - }) + }, true) require.NoError(t, err) assert.Equal(t, "path_v3", ver.BinaryPath) assert.Equal(t, "--opt2 val2", ver.BuildOptions)